fc3c09d86f178112ce46a384012a0ac1c4ad5117
[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 #ifndef RTE_EXEC_ENV_WINDOWS
7
8 #include <time.h>
9
10 #include <rte_common.h>
11 #include <rte_hexdump.h>
12 #include <rte_mbuf.h>
13 #include <rte_malloc.h>
14 #include <rte_memcpy.h>
15 #include <rte_pause.h>
16 #include <rte_bus_vdev.h>
17 #include <rte_ether.h>
18
19 #include <rte_crypto.h>
20 #include <rte_cryptodev.h>
21 #include <rte_ip.h>
22 #include <rte_string_fns.h>
23 #include <rte_tcp.h>
24 #include <rte_udp.h>
25
26 #ifdef RTE_CRYPTO_SCHEDULER
27 #include <rte_cryptodev_scheduler.h>
28 #include <rte_cryptodev_scheduler_operations.h>
29 #endif
30
31 #include <rte_lcore.h>
32
33 #include "test.h"
34 #include "test_cryptodev.h"
35
36 #include "test_cryptodev_blockcipher.h"
37 #include "test_cryptodev_aes_test_vectors.h"
38 #include "test_cryptodev_des_test_vectors.h"
39 #include "test_cryptodev_hash_test_vectors.h"
40 #include "test_cryptodev_kasumi_test_vectors.h"
41 #include "test_cryptodev_kasumi_hash_test_vectors.h"
42 #include "test_cryptodev_snow3g_test_vectors.h"
43 #include "test_cryptodev_snow3g_hash_test_vectors.h"
44 #include "test_cryptodev_zuc_test_vectors.h"
45 #include "test_cryptodev_aead_test_vectors.h"
46 #include "test_cryptodev_hmac_test_vectors.h"
47 #include "test_cryptodev_mixed_test_vectors.h"
48 #ifdef RTE_LIB_SECURITY
49 #include "test_cryptodev_security_ipsec.h"
50 #include "test_cryptodev_security_ipsec_test_vectors.h"
51 #include "test_cryptodev_security_pdcp_test_vectors.h"
52 #include "test_cryptodev_security_pdcp_sdap_test_vectors.h"
53 #include "test_cryptodev_security_pdcp_test_func.h"
54 #include "test_cryptodev_security_docsis_test_vectors.h"
55
56 #define SDAP_DISABLED   0
57 #define SDAP_ENABLED    1
58 #endif
59
60 #define VDEV_ARGS_SIZE 100
61 #define MAX_NB_SESSIONS 4
62
63 #define MAX_DRV_SERVICE_CTX_SIZE 256
64
65 #define MAX_RAW_DEQUEUE_COUNT   65535
66
67 #define IN_PLACE 0
68 #define OUT_OF_PLACE 1
69
70 static int gbl_driver_id;
71
72 static enum rte_security_session_action_type gbl_action_type =
73         RTE_SECURITY_ACTION_TYPE_NONE;
74
75 enum cryptodev_api_test_type global_api_test_type = CRYPTODEV_API_TEST;
76
77 struct crypto_unittest_params {
78         struct rte_crypto_sym_xform cipher_xform;
79         struct rte_crypto_sym_xform auth_xform;
80         struct rte_crypto_sym_xform aead_xform;
81 #ifdef RTE_LIB_SECURITY
82         struct rte_security_docsis_xform docsis_xform;
83 #endif
84
85         union {
86                 struct rte_cryptodev_sym_session *sess;
87 #ifdef RTE_LIB_SECURITY
88                 struct rte_security_session *sec_session;
89 #endif
90         };
91 #ifdef RTE_LIB_SECURITY
92         enum rte_security_session_action_type type;
93 #endif
94         struct rte_crypto_op *op;
95
96         struct rte_mbuf *obuf, *ibuf;
97
98         uint8_t *digest;
99 };
100
101 #define ALIGN_POW2_ROUNDUP(num, align) \
102         (((num) + (align) - 1) & ~((align) - 1))
103
104 #define ADD_STATIC_TESTSUITE(index, parent_ts, child_ts, num_child_ts)  \
105         for (j = 0; j < num_child_ts; index++, j++)                     \
106                 parent_ts.unit_test_suites[index] = child_ts[j]
107
108 #define ADD_BLOCKCIPHER_TESTSUITE(index, parent_ts, blk_types, num_blk_types)   \
109         for (j = 0; j < num_blk_types; index++, j++)                            \
110                 parent_ts.unit_test_suites[index] =                             \
111                                 build_blockcipher_test_suite(blk_types[j])
112
113 #define FREE_BLOCKCIPHER_TESTSUITE(index, parent_ts, num_blk_types)             \
114         for (j = index; j < index + num_blk_types; j++)                         \
115                 free_blockcipher_test_suite(parent_ts.unit_test_suites[j])
116
117 /*
118  * Forward declarations.
119  */
120 static int
121 test_AES_CBC_HMAC_SHA512_decrypt_create_session_params(
122                 struct crypto_unittest_params *ut_params, uint8_t *cipher_key,
123                 uint8_t *hmac_key);
124
125 static int
126 test_AES_CBC_HMAC_SHA512_decrypt_perform(struct rte_cryptodev_sym_session *sess,
127                 struct crypto_unittest_params *ut_params,
128                 struct crypto_testsuite_params *ts_param,
129                 const uint8_t *cipher,
130                 const uint8_t *digest,
131                 const uint8_t *iv);
132
133 static int
134 security_proto_supported(enum rte_security_session_action_type action,
135         enum rte_security_session_protocol proto);
136
137 static int
138 dev_configure_and_start(uint64_t ff_disable);
139
140 static struct rte_mbuf *
141 setup_test_string(struct rte_mempool *mpool,
142                 const char *string, size_t len, uint8_t blocksize)
143 {
144         struct rte_mbuf *m = rte_pktmbuf_alloc(mpool);
145         size_t t_len = len - (blocksize ? (len % blocksize) : 0);
146
147         if (m) {
148                 char *dst;
149
150                 memset(m->buf_addr, 0, m->buf_len);
151                 dst = rte_pktmbuf_append(m, t_len);
152                 if (!dst) {
153                         rte_pktmbuf_free(m);
154                         return NULL;
155                 }
156                 if (string != NULL)
157                         rte_memcpy(dst, string, t_len);
158                 else
159                         memset(dst, 0, t_len);
160         }
161
162         return m;
163 }
164
165 /* Get number of bytes in X bits (rounding up) */
166 static uint32_t
167 ceil_byte_length(uint32_t num_bits)
168 {
169         if (num_bits % 8)
170                 return ((num_bits >> 3) + 1);
171         else
172                 return (num_bits >> 3);
173 }
174
175 static void
176 post_process_raw_dp_op(void *user_data, uint32_t index __rte_unused,
177                 uint8_t is_op_success)
178 {
179         struct rte_crypto_op *op = user_data;
180         op->status = is_op_success ? RTE_CRYPTO_OP_STATUS_SUCCESS :
181                         RTE_CRYPTO_OP_STATUS_ERROR;
182 }
183
184 static struct crypto_testsuite_params testsuite_params = { NULL };
185 struct crypto_testsuite_params *p_testsuite_params = &testsuite_params;
186 static struct crypto_unittest_params unittest_params;
187
188 void
189 process_sym_raw_dp_op(uint8_t dev_id, uint16_t qp_id,
190                 struct rte_crypto_op *op, uint8_t is_cipher, uint8_t is_auth,
191                 uint8_t len_in_bits, uint8_t cipher_iv_len)
192 {
193         struct rte_crypto_sym_op *sop = op->sym;
194         struct rte_crypto_op *ret_op = NULL;
195         struct rte_crypto_vec data_vec[UINT8_MAX], dest_data_vec[UINT8_MAX];
196         struct rte_crypto_va_iova_ptr cipher_iv, digest, aad_auth_iv;
197         union rte_crypto_sym_ofs ofs;
198         struct rte_crypto_sym_vec vec;
199         struct rte_crypto_sgl sgl, dest_sgl;
200         uint32_t max_len;
201         union rte_cryptodev_session_ctx sess;
202         uint64_t auth_end_iova;
203         uint32_t count = 0;
204         struct rte_crypto_raw_dp_ctx *ctx;
205         uint32_t cipher_offset = 0, cipher_len = 0, auth_offset = 0,
206                         auth_len = 0;
207         int32_t n;
208         uint32_t n_success;
209         int ctx_service_size;
210         int32_t status = 0;
211         int enqueue_status, dequeue_status;
212         struct crypto_unittest_params *ut_params = &unittest_params;
213         int is_sgl = sop->m_src->nb_segs > 1;
214         int is_oop = 0;
215
216         ctx_service_size = rte_cryptodev_get_raw_dp_ctx_size(dev_id);
217         if (ctx_service_size < 0) {
218                 op->status = RTE_CRYPTO_OP_STATUS_ERROR;
219                 return;
220         }
221
222         ctx = malloc(ctx_service_size);
223         if (!ctx) {
224                 op->status = RTE_CRYPTO_OP_STATUS_ERROR;
225                 return;
226         }
227
228         /* Both are enums, setting crypto_sess will suit any session type */
229         sess.crypto_sess = op->sym->session;
230
231         if (rte_cryptodev_configure_raw_dp_ctx(dev_id, qp_id, ctx,
232                         op->sess_type, sess, 0) < 0) {
233                 op->status = RTE_CRYPTO_OP_STATUS_ERROR;
234                 goto exit;
235         }
236
237         cipher_iv.iova = 0;
238         cipher_iv.va = NULL;
239         aad_auth_iv.iova = 0;
240         aad_auth_iv.va = NULL;
241         digest.iova = 0;
242         digest.va = NULL;
243         sgl.vec = data_vec;
244         vec.num = 1;
245         vec.src_sgl = &sgl;
246         vec.iv = &cipher_iv;
247         vec.digest = &digest;
248         vec.aad = &aad_auth_iv;
249         vec.status = &status;
250
251         ofs.raw = 0;
252
253         if ((sop->m_dst != NULL) && (sop->m_dst != sop->m_src))
254                 is_oop = 1;
255
256         if (is_cipher && is_auth) {
257                 cipher_offset = sop->cipher.data.offset;
258                 cipher_len = sop->cipher.data.length;
259                 auth_offset = sop->auth.data.offset;
260                 auth_len = sop->auth.data.length;
261                 max_len = RTE_MAX(cipher_offset + cipher_len,
262                                 auth_offset + auth_len);
263                 if (len_in_bits) {
264                         max_len = max_len >> 3;
265                         cipher_offset = cipher_offset >> 3;
266                         auth_offset = auth_offset >> 3;
267                         cipher_len = cipher_len >> 3;
268                         auth_len = auth_len >> 3;
269                 }
270                 ofs.ofs.cipher.head = cipher_offset;
271                 ofs.ofs.cipher.tail = max_len - cipher_offset - cipher_len;
272                 ofs.ofs.auth.head = auth_offset;
273                 ofs.ofs.auth.tail = max_len - auth_offset - auth_len;
274                 cipher_iv.va = rte_crypto_op_ctod_offset(op, void *, IV_OFFSET);
275                 cipher_iv.iova = rte_crypto_op_ctophys_offset(op, IV_OFFSET);
276                 aad_auth_iv.va = rte_crypto_op_ctod_offset(
277                                 op, void *, IV_OFFSET + cipher_iv_len);
278                 aad_auth_iv.iova = rte_crypto_op_ctophys_offset(op, IV_OFFSET +
279                                 cipher_iv_len);
280                 digest.va = (void *)sop->auth.digest.data;
281                 digest.iova = sop->auth.digest.phys_addr;
282
283                 if (is_sgl) {
284                         uint32_t remaining_off = auth_offset + auth_len;
285                         struct rte_mbuf *sgl_buf = sop->m_src;
286                         if (is_oop)
287                                 sgl_buf = sop->m_dst;
288
289                         while (remaining_off >= rte_pktmbuf_data_len(sgl_buf)
290                                         && sgl_buf->next != NULL) {
291                                 remaining_off -= rte_pktmbuf_data_len(sgl_buf);
292                                 sgl_buf = sgl_buf->next;
293                         }
294
295                         auth_end_iova = (uint64_t)rte_pktmbuf_iova_offset(
296                                 sgl_buf, remaining_off);
297                 } else {
298                         auth_end_iova = rte_pktmbuf_iova(op->sym->m_src) +
299                                                          auth_offset + auth_len;
300                 }
301                 /* Then check if digest-encrypted conditions are met */
302                 if ((auth_offset + auth_len < cipher_offset + cipher_len) &&
303                                 (digest.iova == auth_end_iova) && is_sgl)
304                         max_len = RTE_MAX(max_len,
305                                 auth_offset + auth_len +
306                                 ut_params->auth_xform.auth.digest_length);
307
308         } else if (is_cipher) {
309                 cipher_offset = sop->cipher.data.offset;
310                 cipher_len = sop->cipher.data.length;
311                 max_len = cipher_len + cipher_offset;
312                 if (len_in_bits) {
313                         max_len = max_len >> 3;
314                         cipher_offset = cipher_offset >> 3;
315                         cipher_len = cipher_len >> 3;
316                 }
317                 ofs.ofs.cipher.head = cipher_offset;
318                 ofs.ofs.cipher.tail = max_len - cipher_offset - cipher_len;
319                 cipher_iv.va = rte_crypto_op_ctod_offset(op, void *, IV_OFFSET);
320                 cipher_iv.iova = rte_crypto_op_ctophys_offset(op, IV_OFFSET);
321
322         } else if (is_auth) {
323                 auth_offset = sop->auth.data.offset;
324                 auth_len = sop->auth.data.length;
325                 max_len = auth_len + auth_offset;
326                 if (len_in_bits) {
327                         max_len = max_len >> 3;
328                         auth_offset = auth_offset >> 3;
329                         auth_len = auth_len >> 3;
330                 }
331                 ofs.ofs.auth.head = auth_offset;
332                 ofs.ofs.auth.tail = max_len - auth_offset - auth_len;
333                 aad_auth_iv.va = rte_crypto_op_ctod_offset(
334                                 op, void *, IV_OFFSET + cipher_iv_len);
335                 aad_auth_iv.iova = rte_crypto_op_ctophys_offset(op, IV_OFFSET +
336                                 cipher_iv_len);
337                 digest.va = (void *)sop->auth.digest.data;
338                 digest.iova = sop->auth.digest.phys_addr;
339
340         } else { /* aead */
341                 cipher_offset = sop->aead.data.offset;
342                 cipher_len = sop->aead.data.length;
343                 max_len = cipher_len + cipher_offset;
344                 if (len_in_bits) {
345                         max_len = max_len >> 3;
346                         cipher_offset = cipher_offset >> 3;
347                         cipher_len = cipher_len >> 3;
348                 }
349                 ofs.ofs.cipher.head = cipher_offset;
350                 ofs.ofs.cipher.tail = max_len - cipher_offset - cipher_len;
351                 cipher_iv.va = rte_crypto_op_ctod_offset(op, void *, IV_OFFSET);
352                 cipher_iv.iova = rte_crypto_op_ctophys_offset(op, IV_OFFSET);
353                 aad_auth_iv.va = (void *)sop->aead.aad.data;
354                 aad_auth_iv.iova = sop->aead.aad.phys_addr;
355                 digest.va = (void *)sop->aead.digest.data;
356                 digest.iova = sop->aead.digest.phys_addr;
357         }
358
359         n = rte_crypto_mbuf_to_vec(sop->m_src, 0, max_len,
360                         data_vec, RTE_DIM(data_vec));
361         if (n < 0 || n > sop->m_src->nb_segs) {
362                 op->status = RTE_CRYPTO_OP_STATUS_ERROR;
363                 goto exit;
364         }
365
366         sgl.num = n;
367         /* Out of place */
368         if (is_oop) {
369                 dest_sgl.vec = dest_data_vec;
370                 vec.dest_sgl = &dest_sgl;
371                 n = rte_crypto_mbuf_to_vec(sop->m_dst, 0, max_len,
372                                 dest_data_vec, RTE_DIM(dest_data_vec));
373                 if (n < 0 || n > sop->m_dst->nb_segs) {
374                         op->status = RTE_CRYPTO_OP_STATUS_ERROR;
375                         goto exit;
376                 }
377                 dest_sgl.num = n;
378         } else
379                 vec.dest_sgl = NULL;
380
381         if (rte_cryptodev_raw_enqueue_burst(ctx, &vec, ofs, (void **)&op,
382                         &enqueue_status) < 1) {
383                 op->status = RTE_CRYPTO_OP_STATUS_ERROR;
384                 goto exit;
385         }
386
387         if (enqueue_status == 0) {
388                 status = rte_cryptodev_raw_enqueue_done(ctx, 1);
389                 if (status < 0) {
390                         op->status = RTE_CRYPTO_OP_STATUS_ERROR;
391                         goto exit;
392                 }
393         } else if (enqueue_status < 0) {
394                 op->status = RTE_CRYPTO_OP_STATUS_ERROR;
395                 goto exit;
396         }
397
398         n = n_success = 0;
399         while (count++ < MAX_RAW_DEQUEUE_COUNT && n == 0) {
400                 n = rte_cryptodev_raw_dequeue_burst(ctx,
401                         NULL, 1, post_process_raw_dp_op,
402                                 (void **)&ret_op, 0, &n_success,
403                                 &dequeue_status);
404                 if (dequeue_status < 0) {
405                         op->status = RTE_CRYPTO_OP_STATUS_ERROR;
406                         goto exit;
407                 }
408                 if (n == 0)
409                         rte_pause();
410         }
411
412         if (n == 1 && dequeue_status == 0) {
413                 if (rte_cryptodev_raw_dequeue_done(ctx, 1) < 0) {
414                         op->status = RTE_CRYPTO_OP_STATUS_ERROR;
415                         goto exit;
416                 }
417         }
418
419         op->status = (count == MAX_RAW_DEQUEUE_COUNT + 1 || ret_op != op ||
420                         ret_op->status == RTE_CRYPTO_OP_STATUS_ERROR ||
421                         n_success < 1) ? RTE_CRYPTO_OP_STATUS_ERROR :
422                                         RTE_CRYPTO_OP_STATUS_SUCCESS;
423
424 exit:
425         free(ctx);
426 }
427
428 static void
429 process_cpu_aead_op(uint8_t dev_id, struct rte_crypto_op *op)
430 {
431         int32_t n, st;
432         struct rte_crypto_sym_op *sop;
433         union rte_crypto_sym_ofs ofs;
434         struct rte_crypto_sgl sgl;
435         struct rte_crypto_sym_vec symvec;
436         struct rte_crypto_va_iova_ptr iv_ptr, aad_ptr, digest_ptr;
437         struct rte_crypto_vec vec[UINT8_MAX];
438
439         sop = op->sym;
440
441         n = rte_crypto_mbuf_to_vec(sop->m_src, sop->aead.data.offset,
442                 sop->aead.data.length, vec, RTE_DIM(vec));
443
444         if (n < 0 || n != sop->m_src->nb_segs) {
445                 op->status = RTE_CRYPTO_OP_STATUS_ERROR;
446                 return;
447         }
448
449         sgl.vec = vec;
450         sgl.num = n;
451         symvec.src_sgl = &sgl;
452         symvec.iv = &iv_ptr;
453         symvec.digest = &digest_ptr;
454         symvec.aad = &aad_ptr;
455         symvec.status = &st;
456         symvec.num = 1;
457
458         /* for CPU crypto the IOVA address is not required */
459         iv_ptr.va = rte_crypto_op_ctod_offset(op, void *, IV_OFFSET);
460         digest_ptr.va = (void *)sop->aead.digest.data;
461         aad_ptr.va = (void *)sop->aead.aad.data;
462
463         ofs.raw = 0;
464
465         n = rte_cryptodev_sym_cpu_crypto_process(dev_id, sop->session, ofs,
466                 &symvec);
467
468         if (n != 1)
469                 op->status = RTE_CRYPTO_OP_STATUS_AUTH_FAILED;
470         else
471                 op->status = RTE_CRYPTO_OP_STATUS_SUCCESS;
472 }
473
474 static void
475 process_cpu_crypt_auth_op(uint8_t dev_id, struct rte_crypto_op *op)
476 {
477         int32_t n, st;
478         struct rte_crypto_sym_op *sop;
479         union rte_crypto_sym_ofs ofs;
480         struct rte_crypto_sgl sgl;
481         struct rte_crypto_sym_vec symvec;
482         struct rte_crypto_va_iova_ptr iv_ptr, digest_ptr;
483         struct rte_crypto_vec vec[UINT8_MAX];
484
485         sop = op->sym;
486
487         n = rte_crypto_mbuf_to_vec(sop->m_src, sop->auth.data.offset,
488                 sop->auth.data.length, vec, RTE_DIM(vec));
489
490         if (n < 0 || n != sop->m_src->nb_segs) {
491                 op->status = RTE_CRYPTO_OP_STATUS_ERROR;
492                 return;
493         }
494
495         sgl.vec = vec;
496         sgl.num = n;
497         symvec.src_sgl = &sgl;
498         symvec.iv = &iv_ptr;
499         symvec.digest = &digest_ptr;
500         symvec.status = &st;
501         symvec.num = 1;
502
503         iv_ptr.va = rte_crypto_op_ctod_offset(op, void *, IV_OFFSET);
504         digest_ptr.va = (void *)sop->auth.digest.data;
505
506         ofs.raw = 0;
507         ofs.ofs.cipher.head = sop->cipher.data.offset - sop->auth.data.offset;
508         ofs.ofs.cipher.tail = (sop->auth.data.offset + sop->auth.data.length) -
509                 (sop->cipher.data.offset + sop->cipher.data.length);
510
511         n = rte_cryptodev_sym_cpu_crypto_process(dev_id, sop->session, ofs,
512                 &symvec);
513
514         if (n != 1)
515                 op->status = RTE_CRYPTO_OP_STATUS_AUTH_FAILED;
516         else
517                 op->status = RTE_CRYPTO_OP_STATUS_SUCCESS;
518 }
519
520 static struct rte_crypto_op *
521 process_crypto_request(uint8_t dev_id, struct rte_crypto_op *op)
522 {
523
524         RTE_VERIFY(gbl_action_type != RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO);
525
526         if (rte_cryptodev_enqueue_burst(dev_id, 0, &op, 1) != 1) {
527                 RTE_LOG(ERR, USER1, "Error sending packet for encryption\n");
528                 return NULL;
529         }
530
531         op = NULL;
532
533         while (rte_cryptodev_dequeue_burst(dev_id, 0, &op, 1) == 0)
534                 rte_pause();
535
536         if (op->status != RTE_CRYPTO_OP_STATUS_SUCCESS) {
537                 RTE_LOG(DEBUG, USER1, "Operation status %d\n", op->status);
538                 return NULL;
539         }
540
541         return op;
542 }
543
544 static int
545 testsuite_setup(void)
546 {
547         struct crypto_testsuite_params *ts_params = &testsuite_params;
548         struct rte_cryptodev_info info;
549         uint32_t i = 0, nb_devs, dev_id;
550         uint16_t qp_id;
551
552         memset(ts_params, 0, sizeof(*ts_params));
553
554         ts_params->mbuf_pool = rte_mempool_lookup("CRYPTO_MBUFPOOL");
555         if (ts_params->mbuf_pool == NULL) {
556                 /* Not already created so create */
557                 ts_params->mbuf_pool = rte_pktmbuf_pool_create(
558                                 "CRYPTO_MBUFPOOL",
559                                 NUM_MBUFS, MBUF_CACHE_SIZE, 0, MBUF_SIZE,
560                                 rte_socket_id());
561                 if (ts_params->mbuf_pool == NULL) {
562                         RTE_LOG(ERR, USER1, "Can't create CRYPTO_MBUFPOOL\n");
563                         return TEST_FAILED;
564                 }
565         }
566
567         ts_params->large_mbuf_pool = rte_mempool_lookup(
568                         "CRYPTO_LARGE_MBUFPOOL");
569         if (ts_params->large_mbuf_pool == NULL) {
570                 /* Not already created so create */
571                 ts_params->large_mbuf_pool = rte_pktmbuf_pool_create(
572                                 "CRYPTO_LARGE_MBUFPOOL",
573                                 1, 0, 0, UINT16_MAX,
574                                 rte_socket_id());
575                 if (ts_params->large_mbuf_pool == NULL) {
576                         RTE_LOG(ERR, USER1,
577                                 "Can't create CRYPTO_LARGE_MBUFPOOL\n");
578                         return TEST_FAILED;
579                 }
580         }
581
582         ts_params->op_mpool = rte_crypto_op_pool_create(
583                         "MBUF_CRYPTO_SYM_OP_POOL",
584                         RTE_CRYPTO_OP_TYPE_SYMMETRIC,
585                         NUM_MBUFS, MBUF_CACHE_SIZE,
586                         DEFAULT_NUM_XFORMS *
587                         sizeof(struct rte_crypto_sym_xform) +
588                         MAXIMUM_IV_LENGTH,
589                         rte_socket_id());
590         if (ts_params->op_mpool == NULL) {
591                 RTE_LOG(ERR, USER1, "Can't create CRYPTO_OP_POOL\n");
592                 return TEST_FAILED;
593         }
594
595         nb_devs = rte_cryptodev_count();
596         if (nb_devs < 1) {
597                 RTE_LOG(WARNING, USER1, "No crypto devices found?\n");
598                 return TEST_SKIPPED;
599         }
600
601         if (rte_cryptodev_device_count_by_driver(gbl_driver_id) < 1) {
602                 RTE_LOG(WARNING, USER1, "No %s devices found?\n",
603                                 rte_cryptodev_driver_name_get(gbl_driver_id));
604                 return TEST_SKIPPED;
605         }
606
607         /* Create list of valid crypto devs */
608         for (i = 0; i < nb_devs; i++) {
609                 rte_cryptodev_info_get(i, &info);
610                 if (info.driver_id == gbl_driver_id)
611                         ts_params->valid_devs[ts_params->valid_dev_count++] = i;
612         }
613
614         if (ts_params->valid_dev_count < 1)
615                 return TEST_FAILED;
616
617         /* Set up all the qps on the first of the valid devices found */
618
619         dev_id = ts_params->valid_devs[0];
620
621         rte_cryptodev_info_get(dev_id, &info);
622
623         ts_params->conf.nb_queue_pairs = info.max_nb_queue_pairs;
624         ts_params->conf.socket_id = SOCKET_ID_ANY;
625         ts_params->conf.ff_disable = RTE_CRYPTODEV_FF_SECURITY;
626
627         unsigned int session_size =
628                 rte_cryptodev_sym_get_private_session_size(dev_id);
629
630 #ifdef RTE_LIB_SECURITY
631         unsigned int security_session_size = rte_security_session_get_size(
632                         rte_cryptodev_get_sec_ctx(dev_id));
633
634         if (session_size < security_session_size)
635                 session_size = security_session_size;
636 #endif
637         /*
638          * Create mempool with maximum number of sessions.
639          */
640         if (info.sym.max_nb_sessions != 0 &&
641                         info.sym.max_nb_sessions < MAX_NB_SESSIONS) {
642                 RTE_LOG(ERR, USER1, "Device does not support "
643                                 "at least %u sessions\n",
644                                 MAX_NB_SESSIONS);
645                 return TEST_FAILED;
646         }
647
648         ts_params->session_mpool = rte_cryptodev_sym_session_pool_create(
649                         "test_sess_mp", MAX_NB_SESSIONS, 0, 0, 0,
650                         SOCKET_ID_ANY);
651         TEST_ASSERT_NOT_NULL(ts_params->session_mpool,
652                         "session mempool allocation failed");
653
654         ts_params->session_priv_mpool = rte_mempool_create(
655                         "test_sess_mp_priv",
656                         MAX_NB_SESSIONS,
657                         session_size,
658                         0, 0, NULL, NULL, NULL,
659                         NULL, SOCKET_ID_ANY,
660                         0);
661         TEST_ASSERT_NOT_NULL(ts_params->session_priv_mpool,
662                         "session mempool allocation failed");
663
664
665
666         TEST_ASSERT_SUCCESS(rte_cryptodev_configure(dev_id,
667                         &ts_params->conf),
668                         "Failed to configure cryptodev %u with %u qps",
669                         dev_id, ts_params->conf.nb_queue_pairs);
670
671         ts_params->qp_conf.nb_descriptors = MAX_NUM_OPS_INFLIGHT;
672         ts_params->qp_conf.mp_session = ts_params->session_mpool;
673         ts_params->qp_conf.mp_session_private = ts_params->session_priv_mpool;
674
675         for (qp_id = 0; qp_id < info.max_nb_queue_pairs; qp_id++) {
676                 TEST_ASSERT_SUCCESS(rte_cryptodev_queue_pair_setup(
677                         dev_id, qp_id, &ts_params->qp_conf,
678                         rte_cryptodev_socket_id(dev_id)),
679                         "Failed to setup queue pair %u on cryptodev %u",
680                         qp_id, dev_id);
681         }
682
683         return TEST_SUCCESS;
684 }
685
686 static void
687 testsuite_teardown(void)
688 {
689         struct crypto_testsuite_params *ts_params = &testsuite_params;
690         int res;
691
692         if (ts_params->mbuf_pool != NULL) {
693                 RTE_LOG(DEBUG, USER1, "CRYPTO_MBUFPOOL count %u\n",
694                 rte_mempool_avail_count(ts_params->mbuf_pool));
695         }
696
697         if (ts_params->op_mpool != NULL) {
698                 RTE_LOG(DEBUG, USER1, "CRYPTO_OP_POOL count %u\n",
699                 rte_mempool_avail_count(ts_params->op_mpool));
700         }
701
702         /* Free session mempools */
703         if (ts_params->session_priv_mpool != NULL) {
704                 rte_mempool_free(ts_params->session_priv_mpool);
705                 ts_params->session_priv_mpool = NULL;
706         }
707
708         if (ts_params->session_mpool != NULL) {
709                 rte_mempool_free(ts_params->session_mpool);
710                 ts_params->session_mpool = NULL;
711         }
712
713         res = rte_cryptodev_close(ts_params->valid_devs[0]);
714         if (res)
715                 RTE_LOG(ERR, USER1, "Crypto device close error %d\n", res);
716 }
717
718 static int
719 check_capabilities_supported(enum rte_crypto_sym_xform_type type,
720                 const int *algs, uint16_t num_algs)
721 {
722         uint8_t dev_id = testsuite_params.valid_devs[0];
723         bool some_alg_supported = FALSE;
724         uint16_t i;
725
726         for (i = 0; i < num_algs && !some_alg_supported; i++) {
727                 struct rte_cryptodev_sym_capability_idx alg = {
728                         type, {algs[i]}
729                 };
730                 if (rte_cryptodev_sym_capability_get(dev_id,
731                                 &alg) != NULL)
732                         some_alg_supported = TRUE;
733         }
734         if (!some_alg_supported)
735                 return TEST_SKIPPED;
736
737         return 0;
738 }
739
740 int
741 check_cipher_capabilities_supported(const enum rte_crypto_cipher_algorithm *ciphers,
742                 uint16_t num_ciphers)
743 {
744         return check_capabilities_supported(RTE_CRYPTO_SYM_XFORM_CIPHER,
745                         (const int *) ciphers, num_ciphers);
746 }
747
748 int
749 check_auth_capabilities_supported(const enum rte_crypto_auth_algorithm *auths,
750                 uint16_t num_auths)
751 {
752         return check_capabilities_supported(RTE_CRYPTO_SYM_XFORM_AUTH,
753                         (const int *) auths, num_auths);
754 }
755
756 int
757 check_aead_capabilities_supported(const enum rte_crypto_aead_algorithm *aeads,
758                 uint16_t num_aeads)
759 {
760         return check_capabilities_supported(RTE_CRYPTO_SYM_XFORM_AEAD,
761                         (const int *) aeads, num_aeads);
762 }
763
764 static int
765 null_testsuite_setup(void)
766 {
767         struct crypto_testsuite_params *ts_params = &testsuite_params;
768         uint8_t dev_id = ts_params->valid_devs[0];
769         struct rte_cryptodev_info dev_info;
770         const enum rte_crypto_cipher_algorithm ciphers[] = {
771                 RTE_CRYPTO_CIPHER_NULL
772         };
773         const enum rte_crypto_auth_algorithm auths[] = {
774                 RTE_CRYPTO_AUTH_NULL
775         };
776
777         rte_cryptodev_info_get(dev_id, &dev_info);
778
779         if (!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYMMETRIC_CRYPTO)) {
780                 RTE_LOG(INFO, USER1, "Feature flag requirements for NULL "
781                                 "testsuite not met\n");
782                 return TEST_SKIPPED;
783         }
784
785         if (check_cipher_capabilities_supported(ciphers, RTE_DIM(ciphers)) != 0
786                         && check_auth_capabilities_supported(auths,
787                         RTE_DIM(auths)) != 0) {
788                 RTE_LOG(INFO, USER1, "Capability requirements for NULL "
789                                 "testsuite not met\n");
790                 return TEST_SKIPPED;
791         }
792
793         return 0;
794 }
795
796 static int
797 crypto_gen_testsuite_setup(void)
798 {
799         struct crypto_testsuite_params *ts_params = &testsuite_params;
800         uint8_t dev_id = ts_params->valid_devs[0];
801         struct rte_cryptodev_info dev_info;
802
803         rte_cryptodev_info_get(dev_id, &dev_info);
804
805         if (!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYMMETRIC_CRYPTO)) {
806                 RTE_LOG(INFO, USER1, "Feature flag requirements for Crypto Gen "
807                                 "testsuite not met\n");
808                 return TEST_SKIPPED;
809         }
810
811         return 0;
812 }
813
814 #ifdef RTE_LIB_SECURITY
815 static int
816 ipsec_proto_testsuite_setup(void)
817 {
818         struct crypto_testsuite_params *ts_params = &testsuite_params;
819         struct crypto_unittest_params *ut_params = &unittest_params;
820         struct rte_cryptodev_info dev_info;
821         int ret = 0;
822
823         rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
824
825         if (!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SECURITY)) {
826                 RTE_LOG(INFO, USER1, "Feature flag requirements for IPsec Proto "
827                                 "testsuite not met\n");
828                 return TEST_SKIPPED;
829         }
830
831         /* Reconfigure to enable security */
832         ret = dev_configure_and_start(0);
833         if (ret != TEST_SUCCESS)
834                 return ret;
835
836         /* Set action type */
837         ut_params->type = RTE_SECURITY_ACTION_TYPE_LOOKASIDE_PROTOCOL;
838
839         if (security_proto_supported(
840                         RTE_SECURITY_ACTION_TYPE_LOOKASIDE_PROTOCOL,
841                         RTE_SECURITY_PROTOCOL_IPSEC) < 0) {
842                 RTE_LOG(INFO, USER1, "Capability requirements for IPsec Proto "
843                                 "test not met\n");
844                 ret = TEST_SKIPPED;
845         }
846
847         test_ipsec_alg_list_populate();
848
849         /*
850          * Stop the device. Device would be started again by individual test
851          * case setup routine.
852          */
853         rte_cryptodev_stop(ts_params->valid_devs[0]);
854
855         return ret;
856 }
857
858 static int
859 pdcp_proto_testsuite_setup(void)
860 {
861         struct crypto_testsuite_params *ts_params = &testsuite_params;
862         uint8_t dev_id = ts_params->valid_devs[0];
863         struct rte_cryptodev_info dev_info;
864         const enum rte_crypto_cipher_algorithm ciphers[] = {
865                 RTE_CRYPTO_CIPHER_NULL,
866                 RTE_CRYPTO_CIPHER_AES_CTR,
867                 RTE_CRYPTO_CIPHER_ZUC_EEA3,
868                 RTE_CRYPTO_CIPHER_SNOW3G_UEA2
869         };
870         const enum rte_crypto_auth_algorithm auths[] = {
871                 RTE_CRYPTO_AUTH_NULL,
872                 RTE_CRYPTO_AUTH_SNOW3G_UIA2,
873                 RTE_CRYPTO_AUTH_AES_CMAC,
874                 RTE_CRYPTO_AUTH_ZUC_EIA3
875         };
876
877         rte_cryptodev_info_get(dev_id, &dev_info);
878
879         if (!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYMMETRIC_CRYPTO) ||
880                         !(dev_info.feature_flags &
881                         RTE_CRYPTODEV_FF_SECURITY)) {
882                 RTE_LOG(INFO, USER1, "Feature flag requirements for PDCP Proto "
883                                 "testsuite not met\n");
884                 return TEST_SKIPPED;
885         }
886
887         if (check_cipher_capabilities_supported(ciphers, RTE_DIM(ciphers)) != 0
888                         && check_auth_capabilities_supported(auths,
889                         RTE_DIM(auths)) != 0) {
890                 RTE_LOG(INFO, USER1, "Capability requirements for PDCP Proto "
891                                 "testsuite not met\n");
892                 return TEST_SKIPPED;
893         }
894
895         return 0;
896 }
897
898 static int
899 docsis_proto_testsuite_setup(void)
900 {
901         struct crypto_testsuite_params *ts_params = &testsuite_params;
902         uint8_t dev_id = ts_params->valid_devs[0];
903         struct rte_cryptodev_info dev_info;
904         const enum rte_crypto_cipher_algorithm ciphers[] = {
905                 RTE_CRYPTO_CIPHER_AES_DOCSISBPI
906         };
907
908         rte_cryptodev_info_get(dev_id, &dev_info);
909
910         if (!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYMMETRIC_CRYPTO) ||
911                         !(dev_info.feature_flags &
912                         RTE_CRYPTODEV_FF_SECURITY)) {
913                 RTE_LOG(INFO, USER1, "Feature flag requirements for DOCSIS "
914                                 "Proto testsuite not met\n");
915                 return TEST_SKIPPED;
916         }
917
918         if (check_cipher_capabilities_supported(ciphers, RTE_DIM(ciphers)) != 0) {
919                 RTE_LOG(INFO, USER1, "Capability requirements for DOCSIS Proto "
920                                 "testsuite not met\n");
921                 return TEST_SKIPPED;
922         }
923
924         return 0;
925 }
926 #endif
927
928 static int
929 aes_ccm_auth_testsuite_setup(void)
930 {
931         struct crypto_testsuite_params *ts_params = &testsuite_params;
932         uint8_t dev_id = ts_params->valid_devs[0];
933         struct rte_cryptodev_info dev_info;
934         const enum rte_crypto_aead_algorithm aeads[] = {
935                 RTE_CRYPTO_AEAD_AES_CCM
936         };
937
938         rte_cryptodev_info_get(dev_id, &dev_info);
939
940         if (!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYMMETRIC_CRYPTO) ||
941                         ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
942                         !(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
943                 RTE_LOG(INFO, USER1, "Feature flag requirements for AES CCM "
944                                 "testsuite not met\n");
945                 return TEST_SKIPPED;
946         }
947
948         if (check_aead_capabilities_supported(aeads, RTE_DIM(aeads)) != 0) {
949                 RTE_LOG(INFO, USER1, "Capability requirements for AES CCM "
950                                 "testsuite not met\n");
951                 return TEST_SKIPPED;
952         }
953
954         return 0;
955 }
956
957 static int
958 aes_gcm_auth_testsuite_setup(void)
959 {
960         struct crypto_testsuite_params *ts_params = &testsuite_params;
961         uint8_t dev_id = ts_params->valid_devs[0];
962         struct rte_cryptodev_info dev_info;
963         const enum rte_crypto_aead_algorithm aeads[] = {
964                 RTE_CRYPTO_AEAD_AES_GCM
965         };
966
967         rte_cryptodev_info_get(dev_id, &dev_info);
968
969         if (!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYMMETRIC_CRYPTO)) {
970                 RTE_LOG(INFO, USER1, "Feature flag requirements for AES GCM "
971                                 "testsuite not met\n");
972                 return TEST_SKIPPED;
973         }
974
975         if (check_aead_capabilities_supported(aeads, RTE_DIM(aeads)) != 0) {
976                 RTE_LOG(INFO, USER1, "Capability requirements for AES GCM "
977                                 "testsuite not met\n");
978                 return TEST_SKIPPED;
979         }
980
981         return 0;
982 }
983
984 static int
985 aes_gmac_auth_testsuite_setup(void)
986 {
987         struct crypto_testsuite_params *ts_params = &testsuite_params;
988         uint8_t dev_id = ts_params->valid_devs[0];
989         struct rte_cryptodev_info dev_info;
990         const enum rte_crypto_auth_algorithm auths[] = {
991                 RTE_CRYPTO_AUTH_AES_GMAC
992         };
993
994         rte_cryptodev_info_get(dev_id, &dev_info);
995
996         if (!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYMMETRIC_CRYPTO) ||
997                         ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
998                         !(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
999                 RTE_LOG(INFO, USER1, "Feature flag requirements for AES GMAC "
1000                                 "testsuite not met\n");
1001                 return TEST_SKIPPED;
1002         }
1003
1004         if (check_auth_capabilities_supported(auths, RTE_DIM(auths)) != 0) {
1005                 RTE_LOG(INFO, USER1, "Capability requirements for AES GMAC "
1006                                 "testsuite not met\n");
1007                 return TEST_SKIPPED;
1008         }
1009
1010         return 0;
1011 }
1012
1013 static int
1014 chacha20_poly1305_testsuite_setup(void)
1015 {
1016         struct crypto_testsuite_params *ts_params = &testsuite_params;
1017         uint8_t dev_id = ts_params->valid_devs[0];
1018         struct rte_cryptodev_info dev_info;
1019         const enum rte_crypto_aead_algorithm aeads[] = {
1020                 RTE_CRYPTO_AEAD_CHACHA20_POLY1305
1021         };
1022
1023         rte_cryptodev_info_get(dev_id, &dev_info);
1024
1025         if (!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYMMETRIC_CRYPTO) ||
1026                         ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
1027                         !(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
1028                 RTE_LOG(INFO, USER1, "Feature flag requirements for "
1029                                 "Chacha20-Poly1305 testsuite not met\n");
1030                 return TEST_SKIPPED;
1031         }
1032
1033         if (check_aead_capabilities_supported(aeads, RTE_DIM(aeads)) != 0) {
1034                 RTE_LOG(INFO, USER1, "Capability requirements for "
1035                                 "Chacha20-Poly1305 testsuite not met\n");
1036                 return TEST_SKIPPED;
1037         }
1038
1039         return 0;
1040 }
1041
1042 static int
1043 snow3g_testsuite_setup(void)
1044 {
1045         struct crypto_testsuite_params *ts_params = &testsuite_params;
1046         uint8_t dev_id = ts_params->valid_devs[0];
1047         struct rte_cryptodev_info dev_info;
1048         const enum rte_crypto_cipher_algorithm ciphers[] = {
1049                 RTE_CRYPTO_CIPHER_SNOW3G_UEA2
1050
1051         };
1052         const enum rte_crypto_auth_algorithm auths[] = {
1053                 RTE_CRYPTO_AUTH_SNOW3G_UIA2
1054         };
1055
1056         rte_cryptodev_info_get(dev_id, &dev_info);
1057
1058         if (!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYMMETRIC_CRYPTO)) {
1059                 RTE_LOG(INFO, USER1, "Feature flag requirements for Snow3G "
1060                                 "testsuite not met\n");
1061                 return TEST_SKIPPED;
1062         }
1063
1064         if (check_cipher_capabilities_supported(ciphers, RTE_DIM(ciphers)) != 0
1065                         && check_auth_capabilities_supported(auths,
1066                         RTE_DIM(auths)) != 0) {
1067                 RTE_LOG(INFO, USER1, "Capability requirements for Snow3G "
1068                                 "testsuite not met\n");
1069                 return TEST_SKIPPED;
1070         }
1071
1072         return 0;
1073 }
1074
1075 static int
1076 zuc_testsuite_setup(void)
1077 {
1078         struct crypto_testsuite_params *ts_params = &testsuite_params;
1079         uint8_t dev_id = ts_params->valid_devs[0];
1080         struct rte_cryptodev_info dev_info;
1081         const enum rte_crypto_cipher_algorithm ciphers[] = {
1082                 RTE_CRYPTO_CIPHER_ZUC_EEA3
1083         };
1084         const enum rte_crypto_auth_algorithm auths[] = {
1085                 RTE_CRYPTO_AUTH_ZUC_EIA3
1086         };
1087
1088         rte_cryptodev_info_get(dev_id, &dev_info);
1089
1090         if (!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYMMETRIC_CRYPTO)) {
1091                 RTE_LOG(INFO, USER1, "Feature flag requirements for ZUC "
1092                                 "testsuite not met\n");
1093                 return TEST_SKIPPED;
1094         }
1095
1096         if (check_cipher_capabilities_supported(ciphers, RTE_DIM(ciphers)) != 0
1097                         && check_auth_capabilities_supported(auths,
1098                         RTE_DIM(auths)) != 0) {
1099                 RTE_LOG(INFO, USER1, "Capability requirements for ZUC "
1100                                 "testsuite not met\n");
1101                 return TEST_SKIPPED;
1102         }
1103
1104         return 0;
1105 }
1106
1107 static int
1108 hmac_md5_auth_testsuite_setup(void)
1109 {
1110         struct crypto_testsuite_params *ts_params = &testsuite_params;
1111         uint8_t dev_id = ts_params->valid_devs[0];
1112         struct rte_cryptodev_info dev_info;
1113         const enum rte_crypto_auth_algorithm auths[] = {
1114                 RTE_CRYPTO_AUTH_MD5_HMAC
1115         };
1116
1117         rte_cryptodev_info_get(dev_id, &dev_info);
1118
1119         if (!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYMMETRIC_CRYPTO) ||
1120                         ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
1121                         !(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
1122                 RTE_LOG(INFO, USER1, "Feature flag requirements for HMAC MD5 "
1123                                 "Auth testsuite not met\n");
1124                 return TEST_SKIPPED;
1125         }
1126
1127         if (check_auth_capabilities_supported(auths, RTE_DIM(auths)) != 0) {
1128                 RTE_LOG(INFO, USER1, "Capability requirements for HMAC MD5 "
1129                                 "testsuite not met\n");
1130                 return TEST_SKIPPED;
1131         }
1132
1133         return 0;
1134 }
1135
1136 static int
1137 kasumi_testsuite_setup(void)
1138 {
1139         struct crypto_testsuite_params *ts_params = &testsuite_params;
1140         uint8_t dev_id = ts_params->valid_devs[0];
1141         struct rte_cryptodev_info dev_info;
1142         const enum rte_crypto_cipher_algorithm ciphers[] = {
1143                 RTE_CRYPTO_CIPHER_KASUMI_F8
1144         };
1145         const enum rte_crypto_auth_algorithm auths[] = {
1146                 RTE_CRYPTO_AUTH_KASUMI_F9
1147         };
1148
1149         rte_cryptodev_info_get(dev_id, &dev_info);
1150
1151         if (!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYMMETRIC_CRYPTO) ||
1152                         ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
1153                         !(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
1154                 RTE_LOG(INFO, USER1, "Feature flag requirements for Kasumi "
1155                                 "testsuite not met\n");
1156                 return TEST_SKIPPED;
1157         }
1158
1159         if (check_cipher_capabilities_supported(ciphers, RTE_DIM(ciphers)) != 0
1160                         && check_auth_capabilities_supported(auths,
1161                         RTE_DIM(auths)) != 0) {
1162                 RTE_LOG(INFO, USER1, "Capability requirements for Kasumi "
1163                                 "testsuite not met\n");
1164                 return TEST_SKIPPED;
1165         }
1166
1167         return 0;
1168 }
1169
1170 static int
1171 negative_aes_gcm_testsuite_setup(void)
1172 {
1173         struct crypto_testsuite_params *ts_params = &testsuite_params;
1174         uint8_t dev_id = ts_params->valid_devs[0];
1175         struct rte_cryptodev_info dev_info;
1176         const enum rte_crypto_aead_algorithm aeads[] = {
1177                 RTE_CRYPTO_AEAD_AES_GCM
1178         };
1179
1180         rte_cryptodev_info_get(dev_id, &dev_info);
1181
1182         if (!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYMMETRIC_CRYPTO) ||
1183                         ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
1184                         !(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
1185                 RTE_LOG(INFO, USER1, "Feature flag requirements for Negative "
1186                                 "AES GCM testsuite not met\n");
1187                 return TEST_SKIPPED;
1188         }
1189
1190         if (check_aead_capabilities_supported(aeads, RTE_DIM(aeads)) != 0) {
1191                 RTE_LOG(INFO, USER1, "Capability requirements for Negative "
1192                                 "AES GCM testsuite not met\n");
1193                 return TEST_SKIPPED;
1194         }
1195
1196         return 0;
1197 }
1198
1199 static int
1200 negative_aes_gmac_testsuite_setup(void)
1201 {
1202         struct crypto_testsuite_params *ts_params = &testsuite_params;
1203         uint8_t dev_id = ts_params->valid_devs[0];
1204         struct rte_cryptodev_info dev_info;
1205         const enum rte_crypto_auth_algorithm auths[] = {
1206                 RTE_CRYPTO_AUTH_AES_GMAC
1207         };
1208
1209         rte_cryptodev_info_get(dev_id, &dev_info);
1210
1211         if (!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYMMETRIC_CRYPTO) ||
1212                         ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
1213                         !(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
1214                 RTE_LOG(INFO, USER1, "Feature flag requirements for Negative "
1215                                 "AES GMAC testsuite not met\n");
1216                 return TEST_SKIPPED;
1217         }
1218
1219         if (check_auth_capabilities_supported(auths, RTE_DIM(auths)) != 0) {
1220                 RTE_LOG(INFO, USER1, "Capability requirements for Negative "
1221                                 "AES GMAC testsuite not met\n");
1222                 return TEST_SKIPPED;
1223         }
1224
1225         return 0;
1226 }
1227
1228 static int
1229 mixed_cipher_hash_testsuite_setup(void)
1230 {
1231         struct crypto_testsuite_params *ts_params = &testsuite_params;
1232         uint8_t dev_id = ts_params->valid_devs[0];
1233         struct rte_cryptodev_info dev_info;
1234         uint64_t feat_flags;
1235         const enum rte_crypto_cipher_algorithm ciphers[] = {
1236                 RTE_CRYPTO_CIPHER_NULL,
1237                 RTE_CRYPTO_CIPHER_AES_CTR,
1238                 RTE_CRYPTO_CIPHER_ZUC_EEA3,
1239                 RTE_CRYPTO_CIPHER_SNOW3G_UEA2
1240         };
1241         const enum rte_crypto_auth_algorithm auths[] = {
1242                 RTE_CRYPTO_AUTH_NULL,
1243                 RTE_CRYPTO_AUTH_SNOW3G_UIA2,
1244                 RTE_CRYPTO_AUTH_AES_CMAC,
1245                 RTE_CRYPTO_AUTH_ZUC_EIA3
1246         };
1247
1248         rte_cryptodev_info_get(dev_id, &dev_info);
1249         feat_flags = dev_info.feature_flags;
1250
1251         if (!(feat_flags & RTE_CRYPTODEV_FF_SYMMETRIC_CRYPTO) ||
1252                         (global_api_test_type == CRYPTODEV_RAW_API_TEST)) {
1253                 RTE_LOG(INFO, USER1, "Feature flag requirements for Mixed "
1254                                 "Cipher Hash testsuite not met\n");
1255                 return TEST_SKIPPED;
1256         }
1257
1258         if (check_cipher_capabilities_supported(ciphers, RTE_DIM(ciphers)) != 0
1259                         && check_auth_capabilities_supported(auths,
1260                         RTE_DIM(auths)) != 0) {
1261                 RTE_LOG(INFO, USER1, "Capability requirements for Mixed "
1262                                 "Cipher Hash testsuite not met\n");
1263                 return TEST_SKIPPED;
1264         }
1265
1266         return 0;
1267 }
1268
1269 static int
1270 esn_testsuite_setup(void)
1271 {
1272         struct crypto_testsuite_params *ts_params = &testsuite_params;
1273         uint8_t dev_id = ts_params->valid_devs[0];
1274         struct rte_cryptodev_info dev_info;
1275         const enum rte_crypto_cipher_algorithm ciphers[] = {
1276                 RTE_CRYPTO_CIPHER_AES_CBC
1277         };
1278         const enum rte_crypto_auth_algorithm auths[] = {
1279                 RTE_CRYPTO_AUTH_SHA1_HMAC
1280         };
1281
1282         rte_cryptodev_info_get(dev_id, &dev_info);
1283
1284         if (!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYMMETRIC_CRYPTO) ||
1285                         ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
1286                         !(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
1287                 RTE_LOG(INFO, USER1, "Feature flag requirements for ESN "
1288                                 "testsuite not met\n");
1289                 return TEST_SKIPPED;
1290         }
1291
1292         if (check_cipher_capabilities_supported(ciphers, RTE_DIM(ciphers)) != 0
1293                         && check_auth_capabilities_supported(auths,
1294                         RTE_DIM(auths)) != 0) {
1295                 RTE_LOG(INFO, USER1, "Capability requirements for ESN "
1296                                 "testsuite not met\n");
1297                 return TEST_SKIPPED;
1298         }
1299
1300         return 0;
1301 }
1302
1303 static int
1304 multi_session_testsuite_setup(void)
1305 {
1306         struct crypto_testsuite_params *ts_params = &testsuite_params;
1307         uint8_t dev_id = ts_params->valid_devs[0];
1308         struct rte_cryptodev_info dev_info;
1309         const enum rte_crypto_cipher_algorithm ciphers[] = {
1310                 RTE_CRYPTO_CIPHER_AES_CBC
1311         };
1312         const enum rte_crypto_auth_algorithm auths[] = {
1313                 RTE_CRYPTO_AUTH_SHA512_HMAC
1314         };
1315
1316         rte_cryptodev_info_get(dev_id, &dev_info);
1317
1318         if (!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYMMETRIC_CRYPTO)) {
1319                 RTE_LOG(INFO, USER1, "Feature flag requirements for Multi "
1320                                 "Session testsuite not met\n");
1321                 return TEST_SKIPPED;
1322         }
1323
1324         if (check_cipher_capabilities_supported(ciphers, RTE_DIM(ciphers)) != 0
1325                         && check_auth_capabilities_supported(auths,
1326                         RTE_DIM(auths)) != 0) {
1327                 RTE_LOG(INFO, USER1, "Capability requirements for Multi "
1328                                 "Session testsuite not met\n");
1329                 return TEST_SKIPPED;
1330         }
1331
1332         return 0;
1333 }
1334
1335 static int
1336 negative_hmac_sha1_testsuite_setup(void)
1337 {
1338         struct crypto_testsuite_params *ts_params = &testsuite_params;
1339         uint8_t dev_id = ts_params->valid_devs[0];
1340         struct rte_cryptodev_info dev_info;
1341         const enum rte_crypto_cipher_algorithm ciphers[] = {
1342                 RTE_CRYPTO_CIPHER_AES_CBC
1343         };
1344         const enum rte_crypto_auth_algorithm auths[] = {
1345                 RTE_CRYPTO_AUTH_SHA1_HMAC
1346         };
1347
1348         rte_cryptodev_info_get(dev_id, &dev_info);
1349
1350         if (!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYMMETRIC_CRYPTO) ||
1351                         ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
1352                         !(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
1353                 RTE_LOG(INFO, USER1, "Feature flag requirements for Negative "
1354                                 "HMAC SHA1 testsuite not met\n");
1355                 return TEST_SKIPPED;
1356         }
1357
1358         if (check_cipher_capabilities_supported(ciphers, RTE_DIM(ciphers)) != 0
1359                         && check_auth_capabilities_supported(auths,
1360                         RTE_DIM(auths)) != 0) {
1361                 RTE_LOG(INFO, USER1, "Capability requirements for Negative "
1362                                 "HMAC SHA1 testsuite not met\n");
1363                 return TEST_SKIPPED;
1364         }
1365
1366         return 0;
1367 }
1368
1369 static int
1370 dev_configure_and_start(uint64_t ff_disable)
1371 {
1372         struct crypto_testsuite_params *ts_params = &testsuite_params;
1373         struct crypto_unittest_params *ut_params = &unittest_params;
1374
1375         uint16_t qp_id;
1376
1377         /* Clear unit test parameters before running test */
1378         memset(ut_params, 0, sizeof(*ut_params));
1379
1380         /* Reconfigure device to default parameters */
1381         ts_params->conf.socket_id = SOCKET_ID_ANY;
1382         ts_params->conf.ff_disable = ff_disable;
1383         ts_params->qp_conf.nb_descriptors = MAX_NUM_OPS_INFLIGHT;
1384         ts_params->qp_conf.mp_session = ts_params->session_mpool;
1385         ts_params->qp_conf.mp_session_private = ts_params->session_priv_mpool;
1386
1387         TEST_ASSERT_SUCCESS(rte_cryptodev_configure(ts_params->valid_devs[0],
1388                         &ts_params->conf),
1389                         "Failed to configure cryptodev %u",
1390                         ts_params->valid_devs[0]);
1391
1392         for (qp_id = 0; qp_id < ts_params->conf.nb_queue_pairs ; qp_id++) {
1393                 TEST_ASSERT_SUCCESS(rte_cryptodev_queue_pair_setup(
1394                         ts_params->valid_devs[0], qp_id,
1395                         &ts_params->qp_conf,
1396                         rte_cryptodev_socket_id(ts_params->valid_devs[0])),
1397                         "Failed to setup queue pair %u on cryptodev %u",
1398                         qp_id, ts_params->valid_devs[0]);
1399         }
1400
1401
1402         rte_cryptodev_stats_reset(ts_params->valid_devs[0]);
1403
1404         /* Start the device */
1405         TEST_ASSERT_SUCCESS(rte_cryptodev_start(ts_params->valid_devs[0]),
1406                         "Failed to start cryptodev %u",
1407                         ts_params->valid_devs[0]);
1408
1409         return TEST_SUCCESS;
1410 }
1411
1412 int
1413 ut_setup(void)
1414 {
1415         /* Configure and start the device with security feature disabled */
1416         return dev_configure_and_start(RTE_CRYPTODEV_FF_SECURITY);
1417 }
1418
1419 static int
1420 ut_setup_security(void)
1421 {
1422         /* Configure and start the device with no features disabled */
1423         return dev_configure_and_start(0);
1424 }
1425
1426 void
1427 ut_teardown(void)
1428 {
1429         struct crypto_testsuite_params *ts_params = &testsuite_params;
1430         struct crypto_unittest_params *ut_params = &unittest_params;
1431
1432         /* free crypto session structure */
1433 #ifdef RTE_LIB_SECURITY
1434         if (ut_params->type == RTE_SECURITY_ACTION_TYPE_LOOKASIDE_PROTOCOL) {
1435                 if (ut_params->sec_session) {
1436                         rte_security_session_destroy(rte_cryptodev_get_sec_ctx
1437                                                 (ts_params->valid_devs[0]),
1438                                                 ut_params->sec_session);
1439                         ut_params->sec_session = NULL;
1440                 }
1441         } else
1442 #endif
1443         {
1444                 if (ut_params->sess) {
1445                         rte_cryptodev_sym_session_clear(
1446                                         ts_params->valid_devs[0],
1447                                         ut_params->sess);
1448                         rte_cryptodev_sym_session_free(ut_params->sess);
1449                         ut_params->sess = NULL;
1450                 }
1451         }
1452
1453         /* free crypto operation structure */
1454         if (ut_params->op)
1455                 rte_crypto_op_free(ut_params->op);
1456
1457         /*
1458          * free mbuf - both obuf and ibuf are usually the same,
1459          * so check if they point at the same address is necessary,
1460          * to avoid freeing the mbuf twice.
1461          */
1462         if (ut_params->obuf) {
1463                 rte_pktmbuf_free(ut_params->obuf);
1464                 if (ut_params->ibuf == ut_params->obuf)
1465                         ut_params->ibuf = 0;
1466                 ut_params->obuf = 0;
1467         }
1468         if (ut_params->ibuf) {
1469                 rte_pktmbuf_free(ut_params->ibuf);
1470                 ut_params->ibuf = 0;
1471         }
1472
1473         if (ts_params->mbuf_pool != NULL)
1474                 RTE_LOG(DEBUG, USER1, "CRYPTO_MBUFPOOL count %u\n",
1475                         rte_mempool_avail_count(ts_params->mbuf_pool));
1476
1477         /* Stop the device */
1478         rte_cryptodev_stop(ts_params->valid_devs[0]);
1479 }
1480
1481 static int
1482 test_device_configure_invalid_dev_id(void)
1483 {
1484         struct crypto_testsuite_params *ts_params = &testsuite_params;
1485         uint16_t dev_id, num_devs = 0;
1486
1487         TEST_ASSERT((num_devs = rte_cryptodev_count()) >= 1,
1488                         "Need at least %d devices for test", 1);
1489
1490         /* valid dev_id values */
1491         dev_id = ts_params->valid_devs[0];
1492
1493         /* Stop the device in case it's started so it can be configured */
1494         rte_cryptodev_stop(dev_id);
1495
1496         TEST_ASSERT_SUCCESS(rte_cryptodev_configure(dev_id, &ts_params->conf),
1497                         "Failed test for rte_cryptodev_configure: "
1498                         "invalid dev_num %u", dev_id);
1499
1500         /* invalid dev_id values */
1501         dev_id = num_devs;
1502
1503         TEST_ASSERT_FAIL(rte_cryptodev_configure(dev_id, &ts_params->conf),
1504                         "Failed test for rte_cryptodev_configure: "
1505                         "invalid dev_num %u", dev_id);
1506
1507         dev_id = 0xff;
1508
1509         TEST_ASSERT_FAIL(rte_cryptodev_configure(dev_id, &ts_params->conf),
1510                         "Failed test for rte_cryptodev_configure:"
1511                         "invalid dev_num %u", dev_id);
1512
1513         return TEST_SUCCESS;
1514 }
1515
1516 static int
1517 test_device_configure_invalid_queue_pair_ids(void)
1518 {
1519         struct crypto_testsuite_params *ts_params = &testsuite_params;
1520         uint16_t orig_nb_qps = ts_params->conf.nb_queue_pairs;
1521
1522         /* Stop the device in case it's started so it can be configured */
1523         rte_cryptodev_stop(ts_params->valid_devs[0]);
1524
1525         /* valid - max value queue pairs */
1526         ts_params->conf.nb_queue_pairs = orig_nb_qps;
1527
1528         TEST_ASSERT_SUCCESS(rte_cryptodev_configure(ts_params->valid_devs[0],
1529                         &ts_params->conf),
1530                         "Failed to configure cryptodev: dev_id %u, qp_id %u",
1531                         ts_params->valid_devs[0], ts_params->conf.nb_queue_pairs);
1532
1533         /* valid - one queue pairs */
1534         ts_params->conf.nb_queue_pairs = 1;
1535
1536         TEST_ASSERT_SUCCESS(rte_cryptodev_configure(ts_params->valid_devs[0],
1537                         &ts_params->conf),
1538                         "Failed to configure cryptodev: dev_id %u, qp_id %u",
1539                         ts_params->valid_devs[0],
1540                         ts_params->conf.nb_queue_pairs);
1541
1542
1543         /* invalid - zero queue pairs */
1544         ts_params->conf.nb_queue_pairs = 0;
1545
1546         TEST_ASSERT_FAIL(rte_cryptodev_configure(ts_params->valid_devs[0],
1547                         &ts_params->conf),
1548                         "Failed test for rte_cryptodev_configure, dev_id %u,"
1549                         " invalid qps: %u",
1550                         ts_params->valid_devs[0],
1551                         ts_params->conf.nb_queue_pairs);
1552
1553
1554         /* invalid - max value supported by field queue pairs */
1555         ts_params->conf.nb_queue_pairs = UINT16_MAX;
1556
1557         TEST_ASSERT_FAIL(rte_cryptodev_configure(ts_params->valid_devs[0],
1558                         &ts_params->conf),
1559                         "Failed test for rte_cryptodev_configure, dev_id %u,"
1560                         " invalid qps: %u",
1561                         ts_params->valid_devs[0],
1562                         ts_params->conf.nb_queue_pairs);
1563
1564
1565         /* invalid - max value + 1 queue pairs */
1566         ts_params->conf.nb_queue_pairs = orig_nb_qps + 1;
1567
1568         TEST_ASSERT_FAIL(rte_cryptodev_configure(ts_params->valid_devs[0],
1569                         &ts_params->conf),
1570                         "Failed test for rte_cryptodev_configure, dev_id %u,"
1571                         " invalid qps: %u",
1572                         ts_params->valid_devs[0],
1573                         ts_params->conf.nb_queue_pairs);
1574
1575         /* revert to original testsuite value */
1576         ts_params->conf.nb_queue_pairs = orig_nb_qps;
1577
1578         return TEST_SUCCESS;
1579 }
1580
1581 static int
1582 test_queue_pair_descriptor_setup(void)
1583 {
1584         struct crypto_testsuite_params *ts_params = &testsuite_params;
1585         struct rte_cryptodev_qp_conf qp_conf = {
1586                 .nb_descriptors = MAX_NUM_OPS_INFLIGHT
1587         };
1588         uint16_t qp_id;
1589
1590         /* Stop the device in case it's started so it can be configured */
1591         rte_cryptodev_stop(ts_params->valid_devs[0]);
1592
1593         TEST_ASSERT_SUCCESS(rte_cryptodev_configure(ts_params->valid_devs[0],
1594                         &ts_params->conf),
1595                         "Failed to configure cryptodev %u",
1596                         ts_params->valid_devs[0]);
1597
1598         /*
1599          * Test various ring sizes on this device. memzones can't be
1600          * freed so are re-used if ring is released and re-created.
1601          */
1602         qp_conf.nb_descriptors = MIN_NUM_OPS_INFLIGHT; /* min size*/
1603         qp_conf.mp_session = ts_params->session_mpool;
1604         qp_conf.mp_session_private = ts_params->session_priv_mpool;
1605
1606         for (qp_id = 0; qp_id < ts_params->conf.nb_queue_pairs; qp_id++) {
1607                 TEST_ASSERT_SUCCESS(rte_cryptodev_queue_pair_setup(
1608                                 ts_params->valid_devs[0], qp_id, &qp_conf,
1609                                 rte_cryptodev_socket_id(
1610                                                 ts_params->valid_devs[0])),
1611                                 "Failed test for "
1612                                 "rte_cryptodev_queue_pair_setup: num_inflights "
1613                                 "%u on qp %u on cryptodev %u",
1614                                 qp_conf.nb_descriptors, qp_id,
1615                                 ts_params->valid_devs[0]);
1616         }
1617
1618         qp_conf.nb_descriptors = (uint32_t)(MAX_NUM_OPS_INFLIGHT / 2);
1619
1620         for (qp_id = 0; qp_id < ts_params->conf.nb_queue_pairs; qp_id++) {
1621                 TEST_ASSERT_SUCCESS(rte_cryptodev_queue_pair_setup(
1622                                 ts_params->valid_devs[0], qp_id, &qp_conf,
1623                                 rte_cryptodev_socket_id(
1624                                                 ts_params->valid_devs[0])),
1625                                 "Failed test for"
1626                                 " rte_cryptodev_queue_pair_setup: num_inflights"
1627                                 " %u on qp %u on cryptodev %u",
1628                                 qp_conf.nb_descriptors, qp_id,
1629                                 ts_params->valid_devs[0]);
1630         }
1631
1632         qp_conf.nb_descriptors = MAX_NUM_OPS_INFLIGHT; /* valid */
1633
1634         for (qp_id = 0; qp_id < ts_params->conf.nb_queue_pairs; qp_id++) {
1635                 TEST_ASSERT_SUCCESS(rte_cryptodev_queue_pair_setup(
1636                                 ts_params->valid_devs[0], qp_id, &qp_conf,
1637                                 rte_cryptodev_socket_id(
1638                                                 ts_params->valid_devs[0])),
1639                                 "Failed test for "
1640                                 "rte_cryptodev_queue_pair_setup: num_inflights"
1641                                 " %u on qp %u on cryptodev %u",
1642                                 qp_conf.nb_descriptors, qp_id,
1643                                 ts_params->valid_devs[0]);
1644         }
1645
1646         qp_conf.nb_descriptors = DEFAULT_NUM_OPS_INFLIGHT;
1647
1648         for (qp_id = 0; qp_id < ts_params->conf.nb_queue_pairs; qp_id++) {
1649                 TEST_ASSERT_SUCCESS(rte_cryptodev_queue_pair_setup(
1650                                 ts_params->valid_devs[0], qp_id, &qp_conf,
1651                                 rte_cryptodev_socket_id(
1652                                                 ts_params->valid_devs[0])),
1653                                 "Failed test for"
1654                                 " rte_cryptodev_queue_pair_setup:"
1655                                 "num_inflights %u on qp %u on cryptodev %u",
1656                                 qp_conf.nb_descriptors, qp_id,
1657                                 ts_params->valid_devs[0]);
1658         }
1659
1660         /* test invalid queue pair id */
1661         qp_conf.nb_descriptors = DEFAULT_NUM_OPS_INFLIGHT;      /*valid */
1662
1663         qp_id = ts_params->conf.nb_queue_pairs;         /*invalid */
1664
1665         TEST_ASSERT_FAIL(rte_cryptodev_queue_pair_setup(
1666                         ts_params->valid_devs[0],
1667                         qp_id, &qp_conf,
1668                         rte_cryptodev_socket_id(ts_params->valid_devs[0])),
1669                         "Failed test for rte_cryptodev_queue_pair_setup:"
1670                         "invalid qp %u on cryptodev %u",
1671                         qp_id, ts_params->valid_devs[0]);
1672
1673         qp_id = 0xffff; /*invalid*/
1674
1675         TEST_ASSERT_FAIL(rte_cryptodev_queue_pair_setup(
1676                         ts_params->valid_devs[0],
1677                         qp_id, &qp_conf,
1678                         rte_cryptodev_socket_id(ts_params->valid_devs[0])),
1679                         "Failed test for rte_cryptodev_queue_pair_setup:"
1680                         "invalid qp %u on cryptodev %u",
1681                         qp_id, ts_params->valid_devs[0]);
1682
1683         return TEST_SUCCESS;
1684 }
1685
1686 /* ***** Plaintext data for tests ***** */
1687
1688 const char catch_22_quote_1[] =
1689                 "There was only one catch and that was Catch-22, which "
1690                 "specified that a concern for one's safety in the face of "
1691                 "dangers that were real and immediate was the process of a "
1692                 "rational mind. Orr was crazy and could be grounded. All he "
1693                 "had to do was ask; and as soon as he did, he would no longer "
1694                 "be crazy and would have to fly more missions. Orr would be "
1695                 "crazy to fly more missions and sane if he didn't, but if he "
1696                 "was sane he had to fly them. If he flew them he was crazy "
1697                 "and didn't have to; but if he didn't want to he was sane and "
1698                 "had to. Yossarian was moved very deeply by the absolute "
1699                 "simplicity of this clause of Catch-22 and let out a "
1700                 "respectful whistle. \"That's some catch, that Catch-22\", he "
1701                 "observed. \"It's the best there is,\" Doc Daneeka agreed.";
1702
1703 const char catch_22_quote[] =
1704                 "What a lousy earth! He wondered how many people were "
1705                 "destitute that same night even in his own prosperous country, "
1706                 "how many homes were shanties, how many husbands were drunk "
1707                 "and wives socked, and how many children were bullied, abused, "
1708                 "or abandoned. How many families hungered for food they could "
1709                 "not afford to buy? How many hearts were broken? How many "
1710                 "suicides would take place that same night, how many people "
1711                 "would go insane? How many cockroaches and landlords would "
1712                 "triumph? How many winners were losers, successes failures, "
1713                 "and rich men poor men? How many wise guys were stupid? How "
1714                 "many happy endings were unhappy endings? How many honest men "
1715                 "were liars, brave men cowards, loyal men traitors, how many "
1716                 "sainted men were corrupt, how many people in positions of "
1717                 "trust had sold their souls to bodyguards, how many had never "
1718                 "had souls? How many straight-and-narrow paths were crooked "
1719                 "paths? How many best families were worst families and how "
1720                 "many good people were bad people? When you added them all up "
1721                 "and then subtracted, you might be left with only the children, "
1722                 "and perhaps with Albert Einstein and an old violinist or "
1723                 "sculptor somewhere.";
1724
1725 #define QUOTE_480_BYTES         (480)
1726 #define QUOTE_512_BYTES         (512)
1727 #define QUOTE_768_BYTES         (768)
1728 #define QUOTE_1024_BYTES        (1024)
1729
1730
1731
1732 /* ***** SHA1 Hash Tests ***** */
1733
1734 #define HMAC_KEY_LENGTH_SHA1    (DIGEST_BYTE_LENGTH_SHA1)
1735
1736 static uint8_t hmac_sha1_key[] = {
1737         0xF8, 0x2A, 0xC7, 0x54, 0xDB, 0x96, 0x18, 0xAA,
1738         0xC3, 0xA1, 0x53, 0xF6, 0x1F, 0x17, 0x60, 0xBD,
1739         0xDE, 0xF4, 0xDE, 0xAD };
1740
1741 /* ***** SHA224 Hash Tests ***** */
1742
1743 #define HMAC_KEY_LENGTH_SHA224  (DIGEST_BYTE_LENGTH_SHA224)
1744
1745
1746 /* ***** AES-CBC Cipher Tests ***** */
1747
1748 #define CIPHER_KEY_LENGTH_AES_CBC       (16)
1749 #define CIPHER_IV_LENGTH_AES_CBC        (CIPHER_KEY_LENGTH_AES_CBC)
1750
1751 static uint8_t aes_cbc_key[] = {
1752         0xE4, 0x23, 0x33, 0x8A, 0x35, 0x64, 0x61, 0xE2,
1753         0x49, 0x03, 0xDD, 0xC6, 0xB8, 0xCA, 0x55, 0x7A };
1754
1755 static uint8_t aes_cbc_iv[] = {
1756         0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
1757         0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f };
1758
1759
1760 /* ***** AES-CBC / HMAC-SHA1 Hash Tests ***** */
1761
1762 static const uint8_t catch_22_quote_2_512_bytes_AES_CBC_ciphertext[] = {
1763         0x8B, 0x4D, 0xDA, 0x1B, 0xCF, 0x04, 0xA0, 0x31,
1764         0xB4, 0xBF, 0xBD, 0x68, 0x43, 0x20, 0x7E, 0x76,
1765         0xB1, 0x96, 0x8B, 0xA2, 0x7C, 0xA2, 0x83, 0x9E,
1766         0x39, 0x5A, 0x2F, 0x7E, 0x92, 0xB4, 0x48, 0x1A,
1767         0x3F, 0x6B, 0x5D, 0xDF, 0x52, 0x85, 0x5F, 0x8E,
1768         0x42, 0x3C, 0xFB, 0xE9, 0x1A, 0x24, 0xD6, 0x08,
1769         0xDD, 0xFD, 0x16, 0xFB, 0xE9, 0x55, 0xEF, 0xF0,
1770         0xA0, 0x8D, 0x13, 0xAB, 0x81, 0xC6, 0x90, 0x01,
1771         0xB5, 0x18, 0x84, 0xB3, 0xF6, 0xE6, 0x11, 0x57,
1772         0xD6, 0x71, 0xC6, 0x3C, 0x3F, 0x2F, 0x33, 0xEE,
1773         0x24, 0x42, 0x6E, 0xAC, 0x0B, 0xCA, 0xEC, 0xF9,
1774         0x84, 0xF8, 0x22, 0xAA, 0x60, 0xF0, 0x32, 0xA9,
1775         0x75, 0x75, 0x3B, 0xCB, 0x70, 0x21, 0x0A, 0x8D,
1776         0x0F, 0xE0, 0xC4, 0x78, 0x2B, 0xF8, 0x97, 0xE3,
1777         0xE4, 0x26, 0x4B, 0x29, 0xDA, 0x88, 0xCD, 0x46,
1778         0xEC, 0xAA, 0xF9, 0x7F, 0xF1, 0x15, 0xEA, 0xC3,
1779         0x87, 0xE6, 0x31, 0xF2, 0xCF, 0xDE, 0x4D, 0x80,
1780         0x70, 0x91, 0x7E, 0x0C, 0xF7, 0x26, 0x3A, 0x92,
1781         0x4F, 0x18, 0x83, 0xC0, 0x8F, 0x59, 0x01, 0xA5,
1782         0x88, 0xD1, 0xDB, 0x26, 0x71, 0x27, 0x16, 0xF5,
1783         0xEE, 0x10, 0x82, 0xAC, 0x68, 0x26, 0x9B, 0xE2,
1784         0x6D, 0xD8, 0x9A, 0x80, 0xDF, 0x04, 0x31, 0xD5,
1785         0xF1, 0x35, 0x5C, 0x3B, 0xDD, 0x9A, 0x65, 0xBA,
1786         0x58, 0x34, 0x85, 0x61, 0x1C, 0x42, 0x10, 0x76,
1787         0x73, 0x02, 0x42, 0xC9, 0x23, 0x18, 0x8E, 0xB4,
1788         0x6F, 0xB4, 0xA3, 0x54, 0x6E, 0x88, 0x3B, 0x62,
1789         0x7C, 0x02, 0x8D, 0x4C, 0x9F, 0xC8, 0x45, 0xF4,
1790         0xC9, 0xDE, 0x4F, 0xEB, 0x22, 0x83, 0x1B, 0xE4,
1791         0x49, 0x37, 0xE4, 0xAD, 0xE7, 0xCD, 0x21, 0x54,
1792         0xBC, 0x1C, 0xC2, 0x04, 0x97, 0xB4, 0x10, 0x61,
1793         0xF0, 0xE4, 0xEF, 0x27, 0x63, 0x3A, 0xDA, 0x91,
1794         0x41, 0x25, 0x62, 0x1C, 0x5C, 0xB6, 0x38, 0x4A,
1795         0x88, 0x71, 0x59, 0x5A, 0x8D, 0xA0, 0x09, 0xAF,
1796         0x72, 0x94, 0xD7, 0x79, 0x5C, 0x60, 0x7C, 0x8F,
1797         0x4C, 0xF5, 0xD9, 0xA1, 0x39, 0x6D, 0x81, 0x28,
1798         0xEF, 0x13, 0x28, 0xDF, 0xF5, 0x3E, 0xF7, 0x8E,
1799         0x09, 0x9C, 0x78, 0x18, 0x79, 0xB8, 0x68, 0xD7,
1800         0xA8, 0x29, 0x62, 0xAD, 0xDE, 0xE1, 0x61, 0x76,
1801         0x1B, 0x05, 0x16, 0xCD, 0xBF, 0x02, 0x8E, 0xA6,
1802         0x43, 0x6E, 0x92, 0x55, 0x4F, 0x60, 0x9C, 0x03,
1803         0xB8, 0x4F, 0xA3, 0x02, 0xAC, 0xA8, 0xA7, 0x0C,
1804         0x1E, 0xB5, 0x6B, 0xF8, 0xC8, 0x4D, 0xDE, 0xD2,
1805         0xB0, 0x29, 0x6E, 0x40, 0xE6, 0xD6, 0xC9, 0xE6,
1806         0xB9, 0x0F, 0xB6, 0x63, 0xF5, 0xAA, 0x2B, 0x96,
1807         0xA7, 0x16, 0xAC, 0x4E, 0x0A, 0x33, 0x1C, 0xA6,
1808         0xE6, 0xBD, 0x8A, 0xCF, 0x40, 0xA9, 0xB2, 0xFA,
1809         0x63, 0x27, 0xFD, 0x9B, 0xD9, 0xFC, 0xD5, 0x87,
1810         0x8D, 0x4C, 0xB6, 0xA4, 0xCB, 0xE7, 0x74, 0x55,
1811         0xF4, 0xFB, 0x41, 0x25, 0xB5, 0x4B, 0x0A, 0x1B,
1812         0xB1, 0xD6, 0xB7, 0xD9, 0x47, 0x2A, 0xC3, 0x98,
1813         0x6A, 0xC4, 0x03, 0x73, 0x1F, 0x93, 0x6E, 0x53,
1814         0x19, 0x25, 0x64, 0x15, 0x83, 0xF9, 0x73, 0x2A,
1815         0x74, 0xB4, 0x93, 0x69, 0xC4, 0x72, 0xFC, 0x26,
1816         0xA2, 0x9F, 0x43, 0x45, 0xDD, 0xB9, 0xEF, 0x36,
1817         0xC8, 0x3A, 0xCD, 0x99, 0x9B, 0x54, 0x1A, 0x36,
1818         0xC1, 0x59, 0xF8, 0x98, 0xA8, 0xCC, 0x28, 0x0D,
1819         0x73, 0x4C, 0xEE, 0x98, 0xCB, 0x7C, 0x58, 0x7E,
1820         0x20, 0x75, 0x1E, 0xB7, 0xC9, 0xF8, 0xF2, 0x0E,
1821         0x63, 0x9E, 0x05, 0x78, 0x1A, 0xB6, 0xA8, 0x7A,
1822         0xF9, 0x98, 0x6A, 0xA6, 0x46, 0x84, 0x2E, 0xF6,
1823         0x4B, 0xDC, 0x9B, 0x8F, 0x9B, 0x8F, 0xEE, 0xB4,
1824         0xAA, 0x3F, 0xEE, 0xC0, 0x37, 0x27, 0x76, 0xC7,
1825         0x95, 0xBB, 0x26, 0x74, 0x69, 0x12, 0x7F, 0xF1,
1826         0xBB, 0xFF, 0xAE, 0xB5, 0x99, 0x6E, 0xCB, 0x0C
1827 };
1828
1829 static const uint8_t catch_22_quote_2_512_bytes_AES_CBC_HMAC_SHA1_digest[] = {
1830         0x9a, 0x4f, 0x88, 0x1b, 0xb6, 0x8f, 0xd8, 0x60,
1831         0x42, 0x1a, 0x7d, 0x3d, 0xf5, 0x82, 0x80, 0xf1,
1832         0x18, 0x8c, 0x1d, 0x32
1833 };
1834
1835
1836 /* Multisession Vector context Test */
1837 /*Begin Session 0 */
1838 static uint8_t ms_aes_cbc_key0[] = {
1839         0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7,
1840         0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff
1841 };
1842
1843 static uint8_t ms_aes_cbc_iv0[] = {
1844         0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7,
1845         0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff
1846 };
1847
1848 static const uint8_t ms_aes_cbc_cipher0[] = {
1849                 0x3C, 0xE4, 0xEE, 0x42, 0xB6, 0x9B, 0xC3, 0x38,
1850                 0x5F, 0xAD, 0x54, 0xDC, 0xA8, 0x32, 0x81, 0xDC,
1851                 0x7A, 0x6F, 0x85, 0x58, 0x07, 0x35, 0xED, 0xEB,
1852                 0xAD, 0x79, 0x79, 0x96, 0xD3, 0x0E, 0xA6, 0xD9,
1853                 0xAA, 0x86, 0xA4, 0x8F, 0xB5, 0xD6, 0x6E, 0x6D,
1854                 0x0C, 0x91, 0x2F, 0xC4, 0x67, 0x98, 0x0E, 0xC4,
1855                 0x8D, 0x83, 0x68, 0x69, 0xC4, 0xD3, 0x94, 0x34,
1856                 0xC4, 0x5D, 0x60, 0x55, 0x22, 0x87, 0x8F, 0x6F,
1857                 0x17, 0x8E, 0x75, 0xE4, 0x02, 0xF5, 0x1B, 0x99,
1858                 0xC8, 0x39, 0xA9, 0xAB, 0x23, 0x91, 0x12, 0xED,
1859                 0x08, 0xE7, 0xD9, 0x25, 0x89, 0x24, 0x4F, 0x8D,
1860                 0x68, 0xF3, 0x10, 0x39, 0x0A, 0xEE, 0x45, 0x24,
1861                 0xDF, 0x7A, 0x9D, 0x00, 0x25, 0xE5, 0x35, 0x71,
1862                 0x4E, 0x40, 0x59, 0x6F, 0x0A, 0x13, 0xB3, 0x72,
1863                 0x1D, 0x98, 0x63, 0x94, 0x89, 0xA5, 0x39, 0x8E,
1864                 0xD3, 0x9C, 0x8A, 0x7F, 0x71, 0x2F, 0xC7, 0xCD,
1865                 0x81, 0x05, 0xDC, 0xC0, 0x8D, 0xCE, 0x6D, 0x18,
1866                 0x30, 0xC4, 0x72, 0x51, 0xF0, 0x27, 0xC8, 0xF6,
1867                 0x60, 0x5B, 0x7C, 0xB2, 0xE3, 0x49, 0x0C, 0x29,
1868                 0xC6, 0x9F, 0x39, 0x57, 0x80, 0x55, 0x24, 0x2C,
1869                 0x9B, 0x0F, 0x5A, 0xB3, 0x89, 0x55, 0x31, 0x96,
1870                 0x0D, 0xCD, 0xF6, 0x51, 0x03, 0x2D, 0x89, 0x26,
1871                 0x74, 0x44, 0xD6, 0xE8, 0xDC, 0xEA, 0x44, 0x55,
1872                 0x64, 0x71, 0x9C, 0x9F, 0x5D, 0xBA, 0x39, 0x46,
1873                 0xA8, 0x17, 0xA1, 0x9C, 0x52, 0x9D, 0xBC, 0x6B,
1874                 0x4A, 0x98, 0xE6, 0xEA, 0x33, 0xEC, 0x58, 0xB4,
1875                 0x43, 0xF0, 0x32, 0x45, 0xA4, 0xC1, 0x55, 0xB7,
1876                 0x5D, 0xB5, 0x59, 0xB2, 0xE3, 0x96, 0xFF, 0xA5,
1877                 0xAF, 0xE1, 0x86, 0x1B, 0x42, 0xE6, 0x3B, 0xA0,
1878                 0x90, 0x4A, 0xE8, 0x8C, 0x21, 0x7F, 0x36, 0x1E,
1879                 0x5B, 0x65, 0x25, 0xD1, 0xC1, 0x5A, 0xCA, 0x3D,
1880                 0x10, 0xED, 0x2D, 0x79, 0xD0, 0x0F, 0x58, 0x44,
1881                 0x69, 0x81, 0xF5, 0xD4, 0xC9, 0x0F, 0x90, 0x76,
1882                 0x1F, 0x54, 0xD2, 0xD5, 0x97, 0xCE, 0x2C, 0xE3,
1883                 0xEF, 0xF4, 0xB7, 0xC6, 0x3A, 0x87, 0x7F, 0x83,
1884                 0x2A, 0xAF, 0xCD, 0x90, 0x12, 0xA7, 0x7D, 0x85,
1885                 0x1D, 0x62, 0xD3, 0x85, 0x25, 0x05, 0xDB, 0x45,
1886                 0x92, 0xA3, 0xF6, 0xA2, 0xA8, 0x41, 0xE4, 0x25,
1887                 0x86, 0x87, 0x67, 0x24, 0xEC, 0x89, 0x23, 0x2A,
1888                 0x9B, 0x20, 0x4D, 0x93, 0xEE, 0xE2, 0x2E, 0xC1,
1889                 0x0B, 0x15, 0x33, 0xCF, 0x00, 0xD1, 0x1A, 0xDA,
1890                 0x93, 0xFD, 0x28, 0x21, 0x5B, 0xCF, 0xD1, 0xF3,
1891                 0x5A, 0x81, 0xBA, 0x82, 0x5E, 0x2F, 0x61, 0xB4,
1892                 0x05, 0x71, 0xB5, 0xF4, 0x39, 0x3C, 0x1F, 0x60,
1893                 0x00, 0x7A, 0xC4, 0xF8, 0x35, 0x20, 0x6C, 0x3A,
1894                 0xCC, 0x03, 0x8F, 0x7B, 0xA2, 0xB6, 0x65, 0x8A,
1895                 0xB6, 0x5F, 0xFD, 0x25, 0xD3, 0x5F, 0x92, 0xF9,
1896                 0xAE, 0x17, 0x9B, 0x5E, 0x6E, 0x9A, 0xE4, 0x55,
1897                 0x10, 0x25, 0x07, 0xA4, 0xAF, 0x21, 0x69, 0x13,
1898                 0xD8, 0xFA, 0x31, 0xED, 0xF7, 0xA7, 0xA7, 0x3B,
1899                 0xB8, 0x96, 0x8E, 0x10, 0x86, 0x74, 0xD8, 0xB1,
1900                 0x34, 0x9E, 0x9B, 0x6A, 0x26, 0xA8, 0xD4, 0xD0,
1901                 0xB5, 0xF6, 0xDE, 0xE7, 0xCA, 0x06, 0xDC, 0xA3,
1902                 0x6F, 0xEE, 0x6B, 0x1E, 0xB5, 0x30, 0x99, 0x23,
1903                 0xF9, 0x76, 0xF0, 0xA0, 0xCF, 0x3B, 0x94, 0x7B,
1904                 0x19, 0x8D, 0xA5, 0x0C, 0x18, 0xA6, 0x1D, 0x07,
1905                 0x89, 0xBE, 0x5B, 0x61, 0xE5, 0xF1, 0x42, 0xDB,
1906                 0xD4, 0x2E, 0x02, 0x1F, 0xCE, 0xEF, 0x92, 0xB1,
1907                 0x1B, 0x56, 0x50, 0xF2, 0x16, 0xE5, 0xE7, 0x4F,
1908                 0xFD, 0xBB, 0x3E, 0xD2, 0xFC, 0x3C, 0xC6, 0x0F,
1909                 0xF9, 0x12, 0x4E, 0xCB, 0x1E, 0x0C, 0x15, 0x84,
1910                 0x2A, 0x14, 0x8A, 0x02, 0xE4, 0x7E, 0x95, 0x5B,
1911                 0x86, 0xDB, 0x9B, 0x62, 0x5B, 0x19, 0xD2, 0x17,
1912                 0xFA, 0x13, 0xBB, 0x6B, 0x3F, 0x45, 0x9F, 0xBF
1913 };
1914
1915
1916 static  uint8_t ms_hmac_key0[] = {
1917                 0xFF, 0x1A, 0x7D, 0x3D, 0xF5, 0x82, 0x80, 0xF1,
1918                 0xF1, 0x35, 0x5C, 0x3B, 0xDD, 0x9A, 0x65, 0xBA,
1919                 0x58, 0x34, 0x85, 0x65, 0x1C, 0x42, 0x50, 0x76,
1920                 0x9A, 0xAF, 0x88, 0x1B, 0xB6, 0x8F, 0xF8, 0x60,
1921                 0xA2, 0x5A, 0x7F, 0x3F, 0xF4, 0x72, 0x70, 0xF1,
1922                 0xF5, 0x35, 0x4C, 0x3B, 0xDD, 0x90, 0x65, 0xB0,
1923                 0x47, 0x3A, 0x75, 0x61, 0x5C, 0xA2, 0x10, 0x76,
1924                 0x9A, 0xAF, 0x77, 0x5B, 0xB6, 0x7F, 0xF7, 0x60
1925 };
1926
1927 static const uint8_t ms_hmac_digest0[] = {
1928                 0x43, 0x52, 0xED, 0x34, 0xAB, 0x36, 0xB2, 0x51,
1929                 0xFB, 0xA3, 0xA6, 0x7C, 0x38, 0xFC, 0x42, 0x8F,
1930                 0x57, 0x64, 0xAB, 0x81, 0xA7, 0x89, 0xB7, 0x6C,
1931                 0xA0, 0xDC, 0xB9, 0x4D, 0xC4, 0x30, 0xF9, 0xD4,
1932                 0x10, 0x82, 0x55, 0xD0, 0xAB, 0x32, 0xFB, 0x56,
1933                 0x0D, 0xE4, 0x68, 0x3D, 0x76, 0xD0, 0x7B, 0xE4,
1934                 0xA6, 0x2C, 0x34, 0x9E, 0x8C, 0x41, 0xF8, 0x23,
1935                 0x28, 0x1B, 0x3A, 0x90, 0x26, 0x34, 0x47, 0x90
1936                 };
1937
1938 /* End Session 0 */
1939 /* Begin session 1 */
1940
1941 static  uint8_t ms_aes_cbc_key1[] = {
1942                 0xf1, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7,
1943                 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff
1944 };
1945
1946 static  uint8_t ms_aes_cbc_iv1[] = {
1947         0xf1, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7,
1948         0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff
1949 };
1950
1951 static const uint8_t ms_aes_cbc_cipher1[] = {
1952                 0x5A, 0x7A, 0x67, 0x5D, 0xB8, 0xE1, 0xDC, 0x71,
1953                 0x39, 0xA8, 0x74, 0x93, 0x9C, 0x4C, 0xFE, 0x23,
1954                 0x61, 0xCD, 0xA4, 0xB3, 0xD9, 0xCE, 0x99, 0x09,
1955                 0x2A, 0x23, 0xF3, 0x29, 0xBF, 0x4C, 0xB4, 0x6A,
1956                 0x1B, 0x6B, 0x73, 0x4D, 0x48, 0x0C, 0xCF, 0x6C,
1957                 0x5E, 0x34, 0x9E, 0x7F, 0xBC, 0x8F, 0xCC, 0x8F,
1958                 0x75, 0x1D, 0x3D, 0x77, 0x10, 0x76, 0xC8, 0xB9,
1959                 0x99, 0x6F, 0xD6, 0x56, 0x75, 0xA9, 0xB2, 0x66,
1960                 0xC2, 0x24, 0x2B, 0x9C, 0xFE, 0x40, 0x8E, 0x43,
1961                 0x20, 0x97, 0x1B, 0xFA, 0xD0, 0xCF, 0x04, 0xAB,
1962                 0xBB, 0xF6, 0x5D, 0xF5, 0xA0, 0x19, 0x7C, 0x23,
1963                 0x5D, 0x80, 0x8C, 0x49, 0xF6, 0x76, 0x88, 0x29,
1964                 0x27, 0x4C, 0x59, 0x2B, 0x43, 0xA6, 0xB2, 0x26,
1965                 0x27, 0x78, 0xBE, 0x1B, 0xE1, 0x4F, 0x5A, 0x1F,
1966                 0xFC, 0x68, 0x08, 0xE7, 0xC4, 0xD1, 0x34, 0x68,
1967                 0xB7, 0x13, 0x14, 0x41, 0x62, 0x6B, 0x1F, 0x77,
1968                 0x0C, 0x68, 0x1D, 0x0D, 0xED, 0x89, 0xAA, 0xD8,
1969                 0x97, 0x02, 0xBA, 0x5E, 0xD4, 0x84, 0x25, 0x97,
1970                 0x03, 0xA5, 0xA6, 0x13, 0x66, 0x02, 0xF4, 0xC3,
1971                 0xF3, 0xD3, 0xCC, 0x95, 0xC3, 0x87, 0x46, 0x90,
1972                 0x1F, 0x6E, 0x14, 0xA8, 0x00, 0xF2, 0x6F, 0xD5,
1973                 0xA1, 0xAD, 0xD5, 0x40, 0xA2, 0x0F, 0x32, 0x7E,
1974                 0x99, 0xA3, 0xF5, 0x53, 0xC3, 0x26, 0xA1, 0x45,
1975                 0x01, 0x88, 0x57, 0x84, 0x3E, 0x7B, 0x4E, 0x0B,
1976                 0x3C, 0xB5, 0x3E, 0x9E, 0xE9, 0x78, 0x77, 0xC5,
1977                 0xC0, 0x89, 0xA8, 0xF8, 0xF1, 0xA5, 0x2D, 0x5D,
1978                 0xF9, 0xC6, 0xFB, 0xCB, 0x05, 0x23, 0xBD, 0x6E,
1979                 0x5E, 0x14, 0xC6, 0x57, 0x73, 0xCF, 0x98, 0xBD,
1980                 0x10, 0x8B, 0x18, 0xA6, 0x01, 0x5B, 0x13, 0xAE,
1981                 0x8E, 0xDE, 0x1F, 0xB5, 0xB7, 0x40, 0x6C, 0xC1,
1982                 0x1E, 0xA1, 0x19, 0x20, 0x9E, 0x95, 0xE0, 0x2F,
1983                 0x1C, 0xF5, 0xD9, 0xD0, 0x2B, 0x1E, 0x82, 0x25,
1984                 0x62, 0xB4, 0xEB, 0xA1, 0x1F, 0xCE, 0x44, 0xA1,
1985                 0xCB, 0x92, 0x01, 0x6B, 0xE4, 0x26, 0x23, 0xE3,
1986                 0xC5, 0x67, 0x35, 0x55, 0xDA, 0xE5, 0x27, 0xEE,
1987                 0x8D, 0x12, 0x84, 0xB7, 0xBA, 0xA7, 0x1C, 0xD6,
1988                 0x32, 0x3F, 0x67, 0xED, 0xFB, 0x5B, 0x8B, 0x52,
1989                 0x46, 0x8C, 0xF9, 0x69, 0xCD, 0xAE, 0x79, 0xAA,
1990                 0x37, 0x78, 0x49, 0xEB, 0xC6, 0x8E, 0x76, 0x63,
1991                 0x84, 0xFF, 0x9D, 0x22, 0x99, 0x51, 0xB7, 0x5E,
1992                 0x83, 0x4C, 0x8B, 0xDF, 0x5A, 0x07, 0xCC, 0xBA,
1993                 0x42, 0xA5, 0x98, 0xB6, 0x47, 0x0E, 0x66, 0xEB,
1994                 0x23, 0x0E, 0xBA, 0x44, 0xA8, 0xAA, 0x20, 0x71,
1995                 0x79, 0x9C, 0x77, 0x5F, 0xF5, 0xFE, 0xEC, 0xEF,
1996                 0xC6, 0x64, 0x3D, 0x84, 0xD0, 0x2B, 0xA7, 0x0A,
1997                 0xC3, 0x72, 0x5B, 0x9C, 0xFA, 0xA8, 0x87, 0x95,
1998                 0x94, 0x11, 0x38, 0xA7, 0x1E, 0x58, 0xE3, 0x73,
1999                 0xC6, 0xC9, 0xD1, 0x7B, 0x92, 0xDB, 0x0F, 0x49,
2000                 0x74, 0xC2, 0xA2, 0x0E, 0x35, 0x57, 0xAC, 0xDB,
2001                 0x9A, 0x1C, 0xCF, 0x5A, 0x32, 0x3E, 0x26, 0x9B,
2002                 0xEC, 0xB3, 0xEF, 0x9C, 0xFE, 0xBE, 0x52, 0xAC,
2003                 0xB1, 0x29, 0xDD, 0xFD, 0x07, 0xE2, 0xEE, 0xED,
2004                 0xE4, 0x46, 0x37, 0xFE, 0xD1, 0xDC, 0xCD, 0x02,
2005                 0xF9, 0x31, 0xB0, 0xFB, 0x36, 0xB7, 0x34, 0xA4,
2006                 0x76, 0xE8, 0x57, 0xBF, 0x99, 0x92, 0xC7, 0xAF,
2007                 0x98, 0x10, 0xE2, 0x70, 0xCA, 0xC9, 0x2B, 0x82,
2008                 0x06, 0x96, 0x88, 0x0D, 0xB3, 0xAC, 0x9E, 0x6D,
2009                 0x43, 0xBC, 0x5B, 0x31, 0xCF, 0x65, 0x8D, 0xA6,
2010                 0xC7, 0xFE, 0x73, 0xE1, 0x54, 0xF7, 0x10, 0xF9,
2011                 0x86, 0xF7, 0xDF, 0xA1, 0xA1, 0xD8, 0xAE, 0x35,
2012                 0xB3, 0x90, 0xDC, 0x6F, 0x43, 0x7A, 0x8B, 0xE0,
2013                 0xFE, 0x8F, 0x33, 0x4D, 0x29, 0x6C, 0x45, 0x53,
2014                 0x73, 0xDD, 0x21, 0x0B, 0x85, 0x30, 0xB5, 0xA5,
2015                 0xF3, 0x5D, 0xEC, 0x79, 0x61, 0x9D, 0x9E, 0xB3
2016
2017 };
2018
2019 static uint8_t ms_hmac_key1[] = {
2020                 0xFE, 0x1A, 0x7D, 0x3D, 0xF5, 0x82, 0x80, 0xF1,
2021                 0xF1, 0x35, 0x5C, 0x3B, 0xDD, 0x9A, 0x65, 0xBA,
2022                 0x58, 0x34, 0x85, 0x65, 0x1C, 0x42, 0x50, 0x76,
2023                 0x9A, 0xAF, 0x88, 0x1B, 0xB6, 0x8F, 0xF8, 0x60,
2024                 0xA2, 0x5A, 0x7F, 0x3F, 0xF4, 0x72, 0x70, 0xF1,
2025                 0xF5, 0x35, 0x4C, 0x3B, 0xDD, 0x90, 0x65, 0xB0,
2026                 0x47, 0x3A, 0x75, 0x61, 0x5C, 0xA2, 0x10, 0x76,
2027                 0x9A, 0xAF, 0x77, 0x5B, 0xB6, 0x7F, 0xF7, 0x60
2028 };
2029
2030 static const uint8_t ms_hmac_digest1[] = {
2031                 0xCE, 0x6E, 0x5F, 0x77, 0x96, 0x9A, 0xB1, 0x69,
2032                 0x2D, 0x5E, 0xF3, 0x2F, 0x32, 0x10, 0xCB, 0x50,
2033                 0x0E, 0x09, 0x56, 0x25, 0x07, 0x34, 0xC9, 0x20,
2034                 0xEC, 0x13, 0x43, 0x23, 0x5C, 0x08, 0x8B, 0xCD,
2035                 0xDC, 0x86, 0x8C, 0xEE, 0x0A, 0x95, 0x2E, 0xB9,
2036                 0x8C, 0x7B, 0x02, 0x7A, 0xD4, 0xE1, 0x49, 0xB4,
2037                 0x45, 0xB5, 0x52, 0x37, 0xC6, 0xFF, 0xFE, 0xAA,
2038                 0x0A, 0x87, 0xB8, 0x51, 0xF9, 0x2A, 0x01, 0x8F
2039 };
2040 /* End Session 1  */
2041 /* Begin Session 2 */
2042 static  uint8_t ms_aes_cbc_key2[] = {
2043                 0xff, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7,
2044                 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff
2045 };
2046
2047 static  uint8_t ms_aes_cbc_iv2[] = {
2048                 0xff, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7,
2049                 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff
2050 };
2051
2052 static const uint8_t ms_aes_cbc_cipher2[] = {
2053                 0xBB, 0x3C, 0x68, 0x25, 0xFD, 0xB6, 0xA2, 0x91,
2054                 0x20, 0x56, 0xF6, 0x30, 0x35, 0xFC, 0x9E, 0x97,
2055                 0xF2, 0x90, 0xFC, 0x7E, 0x3E, 0x0A, 0x75, 0xC8,
2056                 0x4C, 0xF2, 0x2D, 0xAC, 0xD3, 0x93, 0xF0, 0xC5,
2057                 0x14, 0x88, 0x8A, 0x23, 0xC2, 0x59, 0x9A, 0x98,
2058                 0x4B, 0xD5, 0x2C, 0xDA, 0x43, 0xA9, 0x34, 0x69,
2059                 0x7C, 0x6D, 0xDB, 0xDC, 0xCB, 0xC0, 0xA0, 0x09,
2060                 0xA7, 0x86, 0x16, 0x4B, 0xBF, 0xA8, 0xB6, 0xCF,
2061                 0x7F, 0x74, 0x1F, 0x22, 0xF0, 0xF6, 0xBB, 0x44,
2062                 0x8B, 0x4C, 0x9E, 0x23, 0xF8, 0x9F, 0xFC, 0x5B,
2063                 0x9E, 0x9C, 0x2A, 0x79, 0x30, 0x8F, 0xBF, 0xA9,
2064                 0x68, 0xA1, 0x20, 0x71, 0x7C, 0x77, 0x22, 0x34,
2065                 0x07, 0xCD, 0xC6, 0xF6, 0x50, 0x0A, 0x08, 0x99,
2066                 0x17, 0x98, 0xE3, 0x93, 0x8A, 0xB0, 0xEE, 0xDF,
2067                 0xC2, 0xBA, 0x3B, 0x44, 0x73, 0xDF, 0xDD, 0xDC,
2068                 0x14, 0x4D, 0x3B, 0xBB, 0x5E, 0x58, 0xC1, 0x26,
2069                 0xA7, 0xAE, 0x47, 0xF3, 0x24, 0x6D, 0x4F, 0xD3,
2070                 0x6E, 0x3E, 0x33, 0xE6, 0x7F, 0xCA, 0x50, 0xAF,
2071                 0x5D, 0x3D, 0xA0, 0xDD, 0xC9, 0xF3, 0x30, 0xD3,
2072                 0x6E, 0x8B, 0x2E, 0x12, 0x24, 0x34, 0xF0, 0xD3,
2073                 0xC7, 0x8D, 0x23, 0x29, 0xAA, 0x05, 0xE1, 0xFA,
2074                 0x2E, 0xF6, 0x8D, 0x37, 0x86, 0xC0, 0x6D, 0x13,
2075                 0x2D, 0x98, 0xF3, 0x52, 0x39, 0x22, 0xCE, 0x38,
2076                 0xC2, 0x1A, 0x72, 0xED, 0xFB, 0xCC, 0xE4, 0x71,
2077                 0x5A, 0x0C, 0x0D, 0x09, 0xF8, 0xE8, 0x1B, 0xBC,
2078                 0x53, 0xC8, 0xD8, 0x8F, 0xE5, 0x98, 0x5A, 0xB1,
2079                 0x06, 0xA6, 0x5B, 0xE6, 0xA2, 0x88, 0x21, 0x9E,
2080                 0x36, 0xC0, 0x34, 0xF9, 0xFB, 0x3B, 0x0A, 0x22,
2081                 0x00, 0x00, 0x39, 0x48, 0x8D, 0x23, 0x74, 0x62,
2082                 0x72, 0x91, 0xE6, 0x36, 0xAA, 0x77, 0x9C, 0x72,
2083                 0x9D, 0xA8, 0xC3, 0xA9, 0xD5, 0x44, 0x72, 0xA6,
2084                 0xB9, 0x28, 0x8F, 0x64, 0x4C, 0x8A, 0x64, 0xE6,
2085                 0x4E, 0xFA, 0xEF, 0x87, 0xDE, 0x7B, 0x22, 0x44,
2086                 0xB0, 0xDF, 0x2E, 0x5F, 0x0B, 0xA5, 0xF2, 0x24,
2087                 0x07, 0x5C, 0x2D, 0x39, 0xB7, 0x3D, 0x8A, 0xE5,
2088                 0x0E, 0x9D, 0x4E, 0x50, 0xED, 0x03, 0x99, 0x8E,
2089                 0xF0, 0x06, 0x55, 0x4E, 0xA2, 0x24, 0xE7, 0x17,
2090                 0x46, 0xDF, 0x6C, 0xCD, 0xC6, 0x44, 0xE8, 0xF9,
2091                 0xB9, 0x1B, 0x36, 0xF6, 0x7F, 0x10, 0xA4, 0x7D,
2092                 0x90, 0xBD, 0xE4, 0xAA, 0xD6, 0x9E, 0x18, 0x9D,
2093                 0x22, 0x35, 0xD6, 0x55, 0x54, 0xAA, 0xF7, 0x22,
2094                 0xA3, 0x3E, 0xEF, 0xC8, 0xA2, 0x34, 0x8D, 0xA9,
2095                 0x37, 0x63, 0xA6, 0xC3, 0x57, 0xCB, 0x0C, 0x49,
2096                 0x7D, 0x02, 0xBE, 0xAA, 0x13, 0x75, 0xB7, 0x4E,
2097                 0x52, 0x62, 0xA5, 0xC2, 0x33, 0xC7, 0x6C, 0x1B,
2098                 0xF6, 0x34, 0xF6, 0x09, 0xA5, 0x0C, 0xC7, 0xA2,
2099                 0x61, 0x48, 0x62, 0x7D, 0x17, 0x15, 0xE3, 0x95,
2100                 0xC8, 0x63, 0xD2, 0xA4, 0x43, 0xA9, 0x49, 0x07,
2101                 0xB2, 0x3B, 0x2B, 0x62, 0x7D, 0xCB, 0x51, 0xB3,
2102                 0x25, 0x33, 0x47, 0x0E, 0x14, 0x67, 0xDC, 0x6A,
2103                 0x9B, 0x51, 0xAC, 0x9D, 0x8F, 0xA2, 0x2B, 0x57,
2104                 0x8C, 0x5C, 0x5F, 0x76, 0x23, 0x92, 0x0F, 0x84,
2105                 0x46, 0x0E, 0x40, 0x85, 0x38, 0x60, 0xFA, 0x61,
2106                 0x20, 0xC5, 0xE3, 0xF1, 0x70, 0xAC, 0x1B, 0xBF,
2107                 0xC4, 0x2B, 0xC5, 0x67, 0xD1, 0x43, 0xC5, 0x17,
2108                 0x74, 0x71, 0x69, 0x6F, 0x82, 0x89, 0x19, 0x8A,
2109                 0x70, 0x43, 0x92, 0x01, 0xC4, 0x63, 0x7E, 0xB1,
2110                 0x59, 0x4E, 0xCD, 0xEA, 0x93, 0xA4, 0x52, 0x53,
2111                 0x9B, 0x61, 0x5B, 0xD2, 0x3E, 0x19, 0x39, 0xB7,
2112                 0x32, 0xEA, 0x8E, 0xF8, 0x1D, 0x76, 0x5C, 0xB2,
2113                 0x73, 0x2D, 0x91, 0xC0, 0x18, 0xED, 0x25, 0x2A,
2114                 0x53, 0x64, 0xF0, 0x92, 0x31, 0x55, 0x21, 0xA8,
2115                 0x24, 0xA9, 0xD1, 0x02, 0xF6, 0x6C, 0x2B, 0x70,
2116                 0xA9, 0x59, 0xC1, 0xD6, 0xC3, 0x57, 0x5B, 0x92
2117 };
2118
2119 static  uint8_t ms_hmac_key2[] = {
2120                 0xFC, 0x1A, 0x7D, 0x3D, 0xF5, 0x82, 0x80, 0xF1,
2121                 0xF1, 0x35, 0x5C, 0x3B, 0xDD, 0x9A, 0x65, 0xBA,
2122                 0x58, 0x34, 0x85, 0x65, 0x1C, 0x42, 0x50, 0x76,
2123                 0x9A, 0xAF, 0x88, 0x1B, 0xB6, 0x8F, 0xF8, 0x60,
2124                 0xA2, 0x5A, 0x7F, 0x3F, 0xF4, 0x72, 0x70, 0xF1,
2125                 0xF5, 0x35, 0x4C, 0x3B, 0xDD, 0x90, 0x65, 0xB0,
2126                 0x47, 0x3A, 0x75, 0x61, 0x5C, 0xA2, 0x10, 0x76,
2127                 0x9A, 0xAF, 0x77, 0x5B, 0xB6, 0x7F, 0xF7, 0x60
2128 };
2129
2130 static const uint8_t ms_hmac_digest2[] = {
2131                 0xA5, 0x0F, 0x9C, 0xFB, 0x08, 0x62, 0x59, 0xFF,
2132                 0x80, 0x2F, 0xEB, 0x4B, 0xE1, 0x46, 0x21, 0xD6,
2133                 0x02, 0x98, 0xF2, 0x8E, 0xF4, 0xEC, 0xD4, 0x77,
2134                 0x86, 0x4C, 0x31, 0x28, 0xC8, 0x25, 0x80, 0x27,
2135                 0x3A, 0x72, 0x5D, 0x6A, 0x56, 0x8A, 0xD3, 0x82,
2136                 0xB0, 0xEC, 0x31, 0x6D, 0x8B, 0x6B, 0xB4, 0x24,
2137                 0xE7, 0x62, 0xC1, 0x52, 0xBC, 0x14, 0x1B, 0x8E,
2138                 0xEC, 0x9A, 0xF1, 0x47, 0x80, 0xD2, 0xB0, 0x59
2139 };
2140
2141 /* End Session 2 */
2142
2143
2144 static int
2145 test_AES_CBC_HMAC_SHA1_encrypt_digest(void)
2146 {
2147         struct crypto_testsuite_params *ts_params = &testsuite_params;
2148         struct crypto_unittest_params *ut_params = &unittest_params;
2149         int status;
2150
2151         /* Verify the capabilities */
2152         struct rte_cryptodev_sym_capability_idx cap_idx;
2153         cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
2154         cap_idx.algo.auth = RTE_CRYPTO_AUTH_SHA1_HMAC;
2155         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
2156                         &cap_idx) == NULL)
2157                 return TEST_SKIPPED;
2158         cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
2159         cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_AES_CBC;
2160         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
2161                         &cap_idx) == NULL)
2162                 return TEST_SKIPPED;
2163
2164         /* Generate test mbuf data and space for digest */
2165         ut_params->ibuf = setup_test_string(ts_params->mbuf_pool,
2166                         catch_22_quote, QUOTE_512_BYTES, 0);
2167
2168         ut_params->digest = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
2169                         DIGEST_BYTE_LENGTH_SHA1);
2170         TEST_ASSERT_NOT_NULL(ut_params->digest, "no room to append digest");
2171
2172         /* Setup Cipher Parameters */
2173         ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
2174         ut_params->cipher_xform.next = &ut_params->auth_xform;
2175
2176         ut_params->cipher_xform.cipher.algo = RTE_CRYPTO_CIPHER_AES_CBC;
2177         ut_params->cipher_xform.cipher.op = RTE_CRYPTO_CIPHER_OP_ENCRYPT;
2178         ut_params->cipher_xform.cipher.key.data = aes_cbc_key;
2179         ut_params->cipher_xform.cipher.key.length = CIPHER_KEY_LENGTH_AES_CBC;
2180         ut_params->cipher_xform.cipher.iv.offset = IV_OFFSET;
2181         ut_params->cipher_xform.cipher.iv.length = CIPHER_IV_LENGTH_AES_CBC;
2182
2183         /* Setup HMAC Parameters */
2184         ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;
2185
2186         ut_params->auth_xform.next = NULL;
2187
2188         ut_params->auth_xform.auth.op = RTE_CRYPTO_AUTH_OP_GENERATE;
2189         ut_params->auth_xform.auth.algo = RTE_CRYPTO_AUTH_SHA1_HMAC;
2190         ut_params->auth_xform.auth.key.length = HMAC_KEY_LENGTH_SHA1;
2191         ut_params->auth_xform.auth.key.data = hmac_sha1_key;
2192         ut_params->auth_xform.auth.digest_length = DIGEST_BYTE_LENGTH_SHA1;
2193
2194         ut_params->sess = rte_cryptodev_sym_session_create(
2195                         ts_params->session_mpool);
2196         TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed");
2197
2198         /* Create crypto session*/
2199         status = rte_cryptodev_sym_session_init(ts_params->valid_devs[0],
2200                         ut_params->sess, &ut_params->cipher_xform,
2201                         ts_params->session_priv_mpool);
2202
2203         if (status == -ENOTSUP)
2204                 return TEST_SKIPPED;
2205
2206         TEST_ASSERT_EQUAL(status, 0, "Session init failed");
2207
2208         /* Generate crypto op data structure */
2209         ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
2210                         RTE_CRYPTO_OP_TYPE_SYMMETRIC);
2211         TEST_ASSERT_NOT_NULL(ut_params->op,
2212                         "Failed to allocate symmetric crypto operation struct");
2213
2214         rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
2215
2216         struct rte_crypto_sym_op *sym_op = ut_params->op->sym;
2217
2218         /* set crypto operation source mbuf */
2219         sym_op->m_src = ut_params->ibuf;
2220
2221         /* Set crypto operation authentication parameters */
2222         sym_op->auth.digest.data = ut_params->digest;
2223         sym_op->auth.digest.phys_addr = rte_pktmbuf_iova_offset(
2224                         ut_params->ibuf, QUOTE_512_BYTES);
2225
2226         sym_op->auth.data.offset = 0;
2227         sym_op->auth.data.length = QUOTE_512_BYTES;
2228
2229         /* Copy IV at the end of the crypto operation */
2230         rte_memcpy(rte_crypto_op_ctod_offset(ut_params->op, uint8_t *, IV_OFFSET),
2231                         aes_cbc_iv, CIPHER_IV_LENGTH_AES_CBC);
2232
2233         /* Set crypto operation cipher parameters */
2234         sym_op->cipher.data.offset = 0;
2235         sym_op->cipher.data.length = QUOTE_512_BYTES;
2236
2237         /* Process crypto operation */
2238         if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
2239                 process_cpu_crypt_auth_op(ts_params->valid_devs[0],
2240                         ut_params->op);
2241         else
2242                 TEST_ASSERT_NOT_NULL(
2243                         process_crypto_request(ts_params->valid_devs[0],
2244                                 ut_params->op),
2245                                 "failed to process sym crypto op");
2246
2247         TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
2248                         "crypto op processing failed");
2249
2250         /* Validate obuf */
2251         uint8_t *ciphertext = rte_pktmbuf_mtod(ut_params->op->sym->m_src,
2252                         uint8_t *);
2253
2254         TEST_ASSERT_BUFFERS_ARE_EQUAL(ciphertext,
2255                         catch_22_quote_2_512_bytes_AES_CBC_ciphertext,
2256                         QUOTE_512_BYTES,
2257                         "ciphertext data not as expected");
2258
2259         uint8_t *digest = ciphertext + QUOTE_512_BYTES;
2260
2261         TEST_ASSERT_BUFFERS_ARE_EQUAL(digest,
2262                         catch_22_quote_2_512_bytes_AES_CBC_HMAC_SHA1_digest,
2263                         gbl_driver_id == rte_cryptodev_driver_id_get(
2264                                         RTE_STR(CRYPTODEV_NAME_AESNI_MB_PMD)) ?
2265                                         TRUNCATED_DIGEST_BYTE_LENGTH_SHA1 :
2266                                         DIGEST_BYTE_LENGTH_SHA1,
2267                         "Generated digest data not as expected");
2268
2269         return TEST_SUCCESS;
2270 }
2271
2272 /* ***** AES-CBC / HMAC-SHA512 Hash Tests ***** */
2273
2274 #define HMAC_KEY_LENGTH_SHA512  (DIGEST_BYTE_LENGTH_SHA512)
2275
2276 static uint8_t hmac_sha512_key[] = {
2277         0x42, 0x1a, 0x7d, 0x3d, 0xf5, 0x82, 0x80, 0xf1,
2278         0xF1, 0x35, 0x5C, 0x3B, 0xDD, 0x9A, 0x65, 0xBA,
2279         0x58, 0x34, 0x85, 0x65, 0x1C, 0x42, 0x50, 0x76,
2280         0x9a, 0xaf, 0x88, 0x1b, 0xb6, 0x8f, 0xf8, 0x60,
2281         0xa2, 0x5a, 0x7f, 0x3f, 0xf4, 0x72, 0x70, 0xf1,
2282         0xF5, 0x35, 0x4C, 0x3B, 0xDD, 0x90, 0x65, 0xB0,
2283         0x47, 0x3a, 0x75, 0x61, 0x5C, 0xa2, 0x10, 0x76,
2284         0x9a, 0xaf, 0x77, 0x5b, 0xb6, 0x7f, 0xf7, 0x60 };
2285
2286 static const uint8_t catch_22_quote_2_512_bytes_AES_CBC_HMAC_SHA512_digest[] = {
2287         0x5D, 0x54, 0x66, 0xC1, 0x6E, 0xBC, 0x04, 0xB8,
2288         0x46, 0xB8, 0x08, 0x6E, 0xE0, 0xF0, 0x43, 0x48,
2289         0x37, 0x96, 0x9C, 0xC6, 0x9C, 0xC2, 0x1E, 0xE8,
2290         0xF2, 0x0C, 0x0B, 0xEF, 0x86, 0xA2, 0xE3, 0x70,
2291         0x95, 0xC8, 0xB3, 0x06, 0x47, 0xA9, 0x90, 0xE8,
2292         0xA0, 0xC6, 0x72, 0x69, 0x05, 0xC0, 0x0D, 0x0E,
2293         0x21, 0x96, 0x65, 0x93, 0x74, 0x43, 0x2A, 0x1D,
2294         0x2E, 0xBF, 0xC2, 0xC2, 0xEE, 0xCC, 0x2F, 0x0A };
2295
2296
2297
2298 static int
2299 test_AES_CBC_HMAC_SHA512_decrypt_create_session_params(
2300                 struct crypto_unittest_params *ut_params,
2301                 uint8_t *cipher_key,
2302                 uint8_t *hmac_key);
2303
2304 static int
2305 test_AES_CBC_HMAC_SHA512_decrypt_perform(struct rte_cryptodev_sym_session *sess,
2306                 struct crypto_unittest_params *ut_params,
2307                 struct crypto_testsuite_params *ts_params,
2308                 const uint8_t *cipher,
2309                 const uint8_t *digest,
2310                 const uint8_t *iv);
2311
2312
2313 static int
2314 test_AES_CBC_HMAC_SHA512_decrypt_create_session_params(
2315                 struct crypto_unittest_params *ut_params,
2316                 uint8_t *cipher_key,
2317                 uint8_t *hmac_key)
2318 {
2319
2320         /* Setup Cipher Parameters */
2321         ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
2322         ut_params->cipher_xform.next = NULL;
2323
2324         ut_params->cipher_xform.cipher.algo = RTE_CRYPTO_CIPHER_AES_CBC;
2325         ut_params->cipher_xform.cipher.op = RTE_CRYPTO_CIPHER_OP_DECRYPT;
2326         ut_params->cipher_xform.cipher.key.data = cipher_key;
2327         ut_params->cipher_xform.cipher.key.length = CIPHER_KEY_LENGTH_AES_CBC;
2328         ut_params->cipher_xform.cipher.iv.offset = IV_OFFSET;
2329         ut_params->cipher_xform.cipher.iv.length = CIPHER_IV_LENGTH_AES_CBC;
2330
2331         /* Setup HMAC Parameters */
2332         ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;
2333         ut_params->auth_xform.next = &ut_params->cipher_xform;
2334
2335         ut_params->auth_xform.auth.op = RTE_CRYPTO_AUTH_OP_VERIFY;
2336         ut_params->auth_xform.auth.algo = RTE_CRYPTO_AUTH_SHA512_HMAC;
2337         ut_params->auth_xform.auth.key.data = hmac_key;
2338         ut_params->auth_xform.auth.key.length = HMAC_KEY_LENGTH_SHA512;
2339         ut_params->auth_xform.auth.digest_length = DIGEST_BYTE_LENGTH_SHA512;
2340
2341         return TEST_SUCCESS;
2342 }
2343
2344
2345 static int
2346 test_AES_CBC_HMAC_SHA512_decrypt_perform(struct rte_cryptodev_sym_session *sess,
2347                 struct crypto_unittest_params *ut_params,
2348                 struct crypto_testsuite_params *ts_params,
2349                 const uint8_t *cipher,
2350                 const uint8_t *digest,
2351                 const uint8_t *iv)
2352 {
2353         /* Generate test mbuf data and digest */
2354         ut_params->ibuf = setup_test_string(ts_params->mbuf_pool,
2355                         (const char *)
2356                         cipher,
2357                         QUOTE_512_BYTES, 0);
2358
2359         ut_params->digest = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
2360                         DIGEST_BYTE_LENGTH_SHA512);
2361         TEST_ASSERT_NOT_NULL(ut_params->digest, "no room to append digest");
2362
2363         rte_memcpy(ut_params->digest,
2364                         digest,
2365                         DIGEST_BYTE_LENGTH_SHA512);
2366
2367         /* Generate Crypto op data structure */
2368         ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
2369                         RTE_CRYPTO_OP_TYPE_SYMMETRIC);
2370         TEST_ASSERT_NOT_NULL(ut_params->op,
2371                         "Failed to allocate symmetric crypto operation struct");
2372
2373         rte_crypto_op_attach_sym_session(ut_params->op, sess);
2374
2375         struct rte_crypto_sym_op *sym_op = ut_params->op->sym;
2376
2377         /* set crypto operation source mbuf */
2378         sym_op->m_src = ut_params->ibuf;
2379
2380         sym_op->auth.digest.data = ut_params->digest;
2381         sym_op->auth.digest.phys_addr = rte_pktmbuf_iova_offset(
2382                         ut_params->ibuf, QUOTE_512_BYTES);
2383
2384         sym_op->auth.data.offset = 0;
2385         sym_op->auth.data.length = QUOTE_512_BYTES;
2386
2387         /* Copy IV at the end of the crypto operation */
2388         rte_memcpy(rte_crypto_op_ctod_offset(ut_params->op, uint8_t *, IV_OFFSET),
2389                         iv, CIPHER_IV_LENGTH_AES_CBC);
2390
2391         sym_op->cipher.data.offset = 0;
2392         sym_op->cipher.data.length = QUOTE_512_BYTES;
2393
2394         /* Process crypto operation */
2395         if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
2396                 process_cpu_crypt_auth_op(ts_params->valid_devs[0],
2397                         ut_params->op);
2398         else if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
2399                 process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
2400                                 ut_params->op, 1, 1, 0, 0);
2401         else
2402                 TEST_ASSERT_NOT_NULL(
2403                                 process_crypto_request(ts_params->valid_devs[0],
2404                                         ut_params->op),
2405                                         "failed to process sym crypto op");
2406
2407         TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
2408                         "crypto op processing failed");
2409
2410         ut_params->obuf = ut_params->op->sym->m_src;
2411
2412         /* Validate obuf */
2413         TEST_ASSERT_BUFFERS_ARE_EQUAL(
2414                         rte_pktmbuf_mtod(ut_params->obuf, uint8_t *),
2415                         catch_22_quote,
2416                         QUOTE_512_BYTES,
2417                         "Plaintext data not as expected");
2418
2419         /* Validate obuf */
2420         TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
2421                         "Digest verification failed");
2422
2423         return TEST_SUCCESS;
2424 }
2425
2426 /* ***** SNOW 3G Tests ***** */
2427 static int
2428 create_wireless_algo_hash_session(uint8_t dev_id,
2429         const uint8_t *key, const uint8_t key_len,
2430         const uint8_t iv_len, const uint8_t auth_len,
2431         enum rte_crypto_auth_operation op,
2432         enum rte_crypto_auth_algorithm algo)
2433 {
2434         uint8_t hash_key[key_len];
2435         int status;
2436
2437         struct crypto_testsuite_params *ts_params = &testsuite_params;
2438         struct crypto_unittest_params *ut_params = &unittest_params;
2439
2440         memcpy(hash_key, key, key_len);
2441
2442         debug_hexdump(stdout, "key:", key, key_len);
2443
2444         /* Setup Authentication Parameters */
2445         ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;
2446         ut_params->auth_xform.next = NULL;
2447
2448         ut_params->auth_xform.auth.op = op;
2449         ut_params->auth_xform.auth.algo = algo;
2450         ut_params->auth_xform.auth.key.length = key_len;
2451         ut_params->auth_xform.auth.key.data = hash_key;
2452         ut_params->auth_xform.auth.digest_length = auth_len;
2453         ut_params->auth_xform.auth.iv.offset = IV_OFFSET;
2454         ut_params->auth_xform.auth.iv.length = iv_len;
2455         ut_params->sess = rte_cryptodev_sym_session_create(
2456                         ts_params->session_mpool);
2457
2458         status = rte_cryptodev_sym_session_init(dev_id, ut_params->sess,
2459                         &ut_params->auth_xform,
2460                         ts_params->session_priv_mpool);
2461         if (status == -ENOTSUP)
2462                 return TEST_SKIPPED;
2463
2464         TEST_ASSERT_EQUAL(status, 0, "session init failed");
2465         TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed");
2466         return 0;
2467 }
2468
2469 static int
2470 create_wireless_algo_cipher_session(uint8_t dev_id,
2471                         enum rte_crypto_cipher_operation op,
2472                         enum rte_crypto_cipher_algorithm algo,
2473                         const uint8_t *key, const uint8_t key_len,
2474                         uint8_t iv_len)
2475 {
2476         uint8_t cipher_key[key_len];
2477         int status;
2478         struct crypto_testsuite_params *ts_params = &testsuite_params;
2479         struct crypto_unittest_params *ut_params = &unittest_params;
2480
2481         memcpy(cipher_key, key, key_len);
2482
2483         /* Setup Cipher Parameters */
2484         ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
2485         ut_params->cipher_xform.next = NULL;
2486
2487         ut_params->cipher_xform.cipher.algo = algo;
2488         ut_params->cipher_xform.cipher.op = op;
2489         ut_params->cipher_xform.cipher.key.data = cipher_key;
2490         ut_params->cipher_xform.cipher.key.length = key_len;
2491         ut_params->cipher_xform.cipher.iv.offset = IV_OFFSET;
2492         ut_params->cipher_xform.cipher.iv.length = iv_len;
2493
2494         debug_hexdump(stdout, "key:", key, key_len);
2495
2496         /* Create Crypto session */
2497         ut_params->sess = rte_cryptodev_sym_session_create(
2498                         ts_params->session_mpool);
2499
2500         status = rte_cryptodev_sym_session_init(dev_id, ut_params->sess,
2501                         &ut_params->cipher_xform,
2502                         ts_params->session_priv_mpool);
2503         if (status == -ENOTSUP)
2504                 return TEST_SKIPPED;
2505
2506         TEST_ASSERT_EQUAL(status, 0, "session init failed");
2507         TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed");
2508         return 0;
2509 }
2510
2511 static int
2512 create_wireless_algo_cipher_operation(const uint8_t *iv, uint8_t iv_len,
2513                         unsigned int cipher_len,
2514                         unsigned int cipher_offset)
2515 {
2516         struct crypto_testsuite_params *ts_params = &testsuite_params;
2517         struct crypto_unittest_params *ut_params = &unittest_params;
2518
2519         /* Generate Crypto op data structure */
2520         ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
2521                                 RTE_CRYPTO_OP_TYPE_SYMMETRIC);
2522         TEST_ASSERT_NOT_NULL(ut_params->op,
2523                                 "Failed to allocate pktmbuf offload");
2524
2525         /* Set crypto operation data parameters */
2526         rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
2527
2528         struct rte_crypto_sym_op *sym_op = ut_params->op->sym;
2529
2530         /* set crypto operation source mbuf */
2531         sym_op->m_src = ut_params->ibuf;
2532
2533         /* iv */
2534         rte_memcpy(rte_crypto_op_ctod_offset(ut_params->op, uint8_t *, IV_OFFSET),
2535                         iv, iv_len);
2536         sym_op->cipher.data.length = cipher_len;
2537         sym_op->cipher.data.offset = cipher_offset;
2538         return 0;
2539 }
2540
2541 static int
2542 create_wireless_algo_cipher_operation_oop(const uint8_t *iv, uint8_t iv_len,
2543                         unsigned int cipher_len,
2544                         unsigned int cipher_offset)
2545 {
2546         struct crypto_testsuite_params *ts_params = &testsuite_params;
2547         struct crypto_unittest_params *ut_params = &unittest_params;
2548
2549         /* Generate Crypto op data structure */
2550         ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
2551                                 RTE_CRYPTO_OP_TYPE_SYMMETRIC);
2552         TEST_ASSERT_NOT_NULL(ut_params->op,
2553                                 "Failed to allocate pktmbuf offload");
2554
2555         /* Set crypto operation data parameters */
2556         rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
2557
2558         struct rte_crypto_sym_op *sym_op = ut_params->op->sym;
2559
2560         /* set crypto operation source mbuf */
2561         sym_op->m_src = ut_params->ibuf;
2562         sym_op->m_dst = ut_params->obuf;
2563
2564         /* iv */
2565         rte_memcpy(rte_crypto_op_ctod_offset(ut_params->op, uint8_t *, IV_OFFSET),
2566                         iv, iv_len);
2567         sym_op->cipher.data.length = cipher_len;
2568         sym_op->cipher.data.offset = cipher_offset;
2569         return 0;
2570 }
2571
2572 static int
2573 create_wireless_algo_cipher_auth_session(uint8_t dev_id,
2574                 enum rte_crypto_cipher_operation cipher_op,
2575                 enum rte_crypto_auth_operation auth_op,
2576                 enum rte_crypto_auth_algorithm auth_algo,
2577                 enum rte_crypto_cipher_algorithm cipher_algo,
2578                 const uint8_t *key, uint8_t key_len,
2579                 uint8_t auth_iv_len, uint8_t auth_len,
2580                 uint8_t cipher_iv_len)
2581
2582 {
2583         uint8_t cipher_auth_key[key_len];
2584         int status;
2585
2586         struct crypto_testsuite_params *ts_params = &testsuite_params;
2587         struct crypto_unittest_params *ut_params = &unittest_params;
2588
2589         memcpy(cipher_auth_key, key, key_len);
2590
2591         /* Setup Authentication Parameters */
2592         ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;
2593         ut_params->auth_xform.next = NULL;
2594
2595         ut_params->auth_xform.auth.op = auth_op;
2596         ut_params->auth_xform.auth.algo = auth_algo;
2597         ut_params->auth_xform.auth.key.length = key_len;
2598         /* Hash key = cipher key */
2599         ut_params->auth_xform.auth.key.data = cipher_auth_key;
2600         ut_params->auth_xform.auth.digest_length = auth_len;
2601         /* Auth IV will be after cipher IV */
2602         ut_params->auth_xform.auth.iv.offset = IV_OFFSET + cipher_iv_len;
2603         ut_params->auth_xform.auth.iv.length = auth_iv_len;
2604
2605         /* Setup Cipher Parameters */
2606         ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
2607         ut_params->cipher_xform.next = &ut_params->auth_xform;
2608
2609         ut_params->cipher_xform.cipher.algo = cipher_algo;
2610         ut_params->cipher_xform.cipher.op = cipher_op;
2611         ut_params->cipher_xform.cipher.key.data = cipher_auth_key;
2612         ut_params->cipher_xform.cipher.key.length = key_len;
2613         ut_params->cipher_xform.cipher.iv.offset = IV_OFFSET;
2614         ut_params->cipher_xform.cipher.iv.length = cipher_iv_len;
2615
2616         debug_hexdump(stdout, "key:", key, key_len);
2617
2618         /* Create Crypto session*/
2619         ut_params->sess = rte_cryptodev_sym_session_create(
2620                         ts_params->session_mpool);
2621         TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed");
2622
2623         status = rte_cryptodev_sym_session_init(dev_id, ut_params->sess,
2624                         &ut_params->cipher_xform,
2625                         ts_params->session_priv_mpool);
2626         if (status == -ENOTSUP)
2627                 return TEST_SKIPPED;
2628
2629         TEST_ASSERT_EQUAL(status, 0, "session init failed");
2630         return 0;
2631 }
2632
2633 static int
2634 create_wireless_cipher_auth_session(uint8_t dev_id,
2635                 enum rte_crypto_cipher_operation cipher_op,
2636                 enum rte_crypto_auth_operation auth_op,
2637                 enum rte_crypto_auth_algorithm auth_algo,
2638                 enum rte_crypto_cipher_algorithm cipher_algo,
2639                 const struct wireless_test_data *tdata)
2640 {
2641         const uint8_t key_len = tdata->key.len;
2642         uint8_t cipher_auth_key[key_len];
2643         int status;
2644
2645         struct crypto_testsuite_params *ts_params = &testsuite_params;
2646         struct crypto_unittest_params *ut_params = &unittest_params;
2647         const uint8_t *key = tdata->key.data;
2648         const uint8_t auth_len = tdata->digest.len;
2649         uint8_t cipher_iv_len = tdata->cipher_iv.len;
2650         uint8_t auth_iv_len = tdata->auth_iv.len;
2651
2652         memcpy(cipher_auth_key, key, key_len);
2653
2654         /* Setup Authentication Parameters */
2655         ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;
2656         ut_params->auth_xform.next = NULL;
2657
2658         ut_params->auth_xform.auth.op = auth_op;
2659         ut_params->auth_xform.auth.algo = auth_algo;
2660         ut_params->auth_xform.auth.key.length = key_len;
2661         /* Hash key = cipher key */
2662         ut_params->auth_xform.auth.key.data = cipher_auth_key;
2663         ut_params->auth_xform.auth.digest_length = auth_len;
2664         /* Auth IV will be after cipher IV */
2665         ut_params->auth_xform.auth.iv.offset = IV_OFFSET + cipher_iv_len;
2666         ut_params->auth_xform.auth.iv.length = auth_iv_len;
2667
2668         /* Setup Cipher Parameters */
2669         ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
2670         ut_params->cipher_xform.next = &ut_params->auth_xform;
2671
2672         ut_params->cipher_xform.cipher.algo = cipher_algo;
2673         ut_params->cipher_xform.cipher.op = cipher_op;
2674         ut_params->cipher_xform.cipher.key.data = cipher_auth_key;
2675         ut_params->cipher_xform.cipher.key.length = key_len;
2676         ut_params->cipher_xform.cipher.iv.offset = IV_OFFSET;
2677         ut_params->cipher_xform.cipher.iv.length = cipher_iv_len;
2678
2679
2680         debug_hexdump(stdout, "key:", key, key_len);
2681
2682         /* Create Crypto session*/
2683         ut_params->sess = rte_cryptodev_sym_session_create(
2684                         ts_params->session_mpool);
2685
2686         status = rte_cryptodev_sym_session_init(dev_id, ut_params->sess,
2687                         &ut_params->cipher_xform,
2688                         ts_params->session_priv_mpool);
2689         if (status == -ENOTSUP)
2690                 return TEST_SKIPPED;
2691
2692         TEST_ASSERT_EQUAL(status, 0, "session init failed");
2693         TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed");
2694         return 0;
2695 }
2696
2697 static int
2698 create_zuc_cipher_auth_encrypt_generate_session(uint8_t dev_id,
2699                 const struct wireless_test_data *tdata)
2700 {
2701         return create_wireless_cipher_auth_session(dev_id,
2702                 RTE_CRYPTO_CIPHER_OP_ENCRYPT,
2703                 RTE_CRYPTO_AUTH_OP_GENERATE, RTE_CRYPTO_AUTH_ZUC_EIA3,
2704                 RTE_CRYPTO_CIPHER_ZUC_EEA3, tdata);
2705 }
2706
2707 static int
2708 create_wireless_algo_auth_cipher_session(uint8_t dev_id,
2709                 enum rte_crypto_cipher_operation cipher_op,
2710                 enum rte_crypto_auth_operation auth_op,
2711                 enum rte_crypto_auth_algorithm auth_algo,
2712                 enum rte_crypto_cipher_algorithm cipher_algo,
2713                 const uint8_t *key, const uint8_t key_len,
2714                 uint8_t auth_iv_len, uint8_t auth_len,
2715                 uint8_t cipher_iv_len)
2716 {
2717         uint8_t auth_cipher_key[key_len];
2718         int status;
2719         struct crypto_testsuite_params *ts_params = &testsuite_params;
2720         struct crypto_unittest_params *ut_params = &unittest_params;
2721
2722         memcpy(auth_cipher_key, key, key_len);
2723
2724         /* Setup Authentication Parameters */
2725         ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;
2726         ut_params->auth_xform.auth.op = auth_op;
2727         ut_params->auth_xform.next = &ut_params->cipher_xform;
2728         ut_params->auth_xform.auth.algo = auth_algo;
2729         ut_params->auth_xform.auth.key.length = key_len;
2730         ut_params->auth_xform.auth.key.data = auth_cipher_key;
2731         ut_params->auth_xform.auth.digest_length = auth_len;
2732         /* Auth IV will be after cipher IV */
2733         ut_params->auth_xform.auth.iv.offset = IV_OFFSET + cipher_iv_len;
2734         ut_params->auth_xform.auth.iv.length = auth_iv_len;
2735
2736         /* Setup Cipher Parameters */
2737         ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
2738         ut_params->cipher_xform.next = NULL;
2739         ut_params->cipher_xform.cipher.algo = cipher_algo;
2740         ut_params->cipher_xform.cipher.op = cipher_op;
2741         ut_params->cipher_xform.cipher.key.data = auth_cipher_key;
2742         ut_params->cipher_xform.cipher.key.length = key_len;
2743         ut_params->cipher_xform.cipher.iv.offset = IV_OFFSET;
2744         ut_params->cipher_xform.cipher.iv.length = cipher_iv_len;
2745
2746         debug_hexdump(stdout, "key:", key, key_len);
2747
2748         /* Create Crypto session*/
2749         ut_params->sess = rte_cryptodev_sym_session_create(
2750                         ts_params->session_mpool);
2751         TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed");
2752
2753         if (cipher_op == RTE_CRYPTO_CIPHER_OP_DECRYPT) {
2754                 ut_params->auth_xform.next = NULL;
2755                 ut_params->cipher_xform.next = &ut_params->auth_xform;
2756                 status = rte_cryptodev_sym_session_init(dev_id, ut_params->sess,
2757                                 &ut_params->cipher_xform,
2758                                 ts_params->session_priv_mpool);
2759
2760         } else
2761                 status = rte_cryptodev_sym_session_init(dev_id, ut_params->sess,
2762                                 &ut_params->auth_xform,
2763                                 ts_params->session_priv_mpool);
2764
2765         if (status == -ENOTSUP)
2766                 return TEST_SKIPPED;
2767
2768         TEST_ASSERT_EQUAL(status, 0, "session init failed");
2769
2770         return 0;
2771 }
2772
2773 static int
2774 create_wireless_algo_hash_operation(const uint8_t *auth_tag,
2775                 unsigned int auth_tag_len,
2776                 const uint8_t *iv, unsigned int iv_len,
2777                 unsigned int data_pad_len,
2778                 enum rte_crypto_auth_operation op,
2779                 unsigned int auth_len, unsigned int auth_offset)
2780 {
2781         struct crypto_testsuite_params *ts_params = &testsuite_params;
2782
2783         struct crypto_unittest_params *ut_params = &unittest_params;
2784
2785         /* Generate Crypto op data structure */
2786         ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
2787                         RTE_CRYPTO_OP_TYPE_SYMMETRIC);
2788         TEST_ASSERT_NOT_NULL(ut_params->op,
2789                 "Failed to allocate pktmbuf offload");
2790
2791         /* Set crypto operation data parameters */
2792         rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
2793
2794         struct rte_crypto_sym_op *sym_op = ut_params->op->sym;
2795
2796         /* set crypto operation source mbuf */
2797         sym_op->m_src = ut_params->ibuf;
2798
2799         /* iv */
2800         rte_memcpy(rte_crypto_op_ctod_offset(ut_params->op, uint8_t *, IV_OFFSET),
2801                         iv, iv_len);
2802         /* digest */
2803         sym_op->auth.digest.data = (uint8_t *)rte_pktmbuf_append(
2804                                         ut_params->ibuf, auth_tag_len);
2805
2806         TEST_ASSERT_NOT_NULL(sym_op->auth.digest.data,
2807                                 "no room to append auth tag");
2808         ut_params->digest = sym_op->auth.digest.data;
2809         sym_op->auth.digest.phys_addr = rte_pktmbuf_iova_offset(
2810                         ut_params->ibuf, data_pad_len);
2811         if (op == RTE_CRYPTO_AUTH_OP_GENERATE)
2812                 memset(sym_op->auth.digest.data, 0, auth_tag_len);
2813         else
2814                 rte_memcpy(sym_op->auth.digest.data, auth_tag, auth_tag_len);
2815
2816         debug_hexdump(stdout, "digest:",
2817                 sym_op->auth.digest.data,
2818                 auth_tag_len);
2819
2820         sym_op->auth.data.length = auth_len;
2821         sym_op->auth.data.offset = auth_offset;
2822
2823         return 0;
2824 }
2825
2826 static int
2827 create_wireless_cipher_hash_operation(const struct wireless_test_data *tdata,
2828         enum rte_crypto_auth_operation op)
2829 {
2830         struct crypto_testsuite_params *ts_params = &testsuite_params;
2831         struct crypto_unittest_params *ut_params = &unittest_params;
2832
2833         const uint8_t *auth_tag = tdata->digest.data;
2834         const unsigned int auth_tag_len = tdata->digest.len;
2835         unsigned int plaintext_len = ceil_byte_length(tdata->plaintext.len);
2836         unsigned int data_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16);
2837
2838         const uint8_t *cipher_iv = tdata->cipher_iv.data;
2839         const uint8_t cipher_iv_len = tdata->cipher_iv.len;
2840         const uint8_t *auth_iv = tdata->auth_iv.data;
2841         const uint8_t auth_iv_len = tdata->auth_iv.len;
2842         const unsigned int cipher_len = tdata->validCipherLenInBits.len;
2843         const unsigned int auth_len = tdata->validAuthLenInBits.len;
2844
2845         /* Generate Crypto op data structure */
2846         ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
2847                         RTE_CRYPTO_OP_TYPE_SYMMETRIC);
2848         TEST_ASSERT_NOT_NULL(ut_params->op,
2849                         "Failed to allocate pktmbuf offload");
2850         /* Set crypto operation data parameters */
2851         rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
2852
2853         struct rte_crypto_sym_op *sym_op = ut_params->op->sym;
2854
2855         /* set crypto operation source mbuf */
2856         sym_op->m_src = ut_params->ibuf;
2857
2858         /* digest */
2859         sym_op->auth.digest.data = (uint8_t *)rte_pktmbuf_append(
2860                         ut_params->ibuf, auth_tag_len);
2861
2862         TEST_ASSERT_NOT_NULL(sym_op->auth.digest.data,
2863                         "no room to append auth tag");
2864         ut_params->digest = sym_op->auth.digest.data;
2865         sym_op->auth.digest.phys_addr = rte_pktmbuf_iova_offset(
2866                         ut_params->ibuf, data_pad_len);
2867         if (op == RTE_CRYPTO_AUTH_OP_GENERATE)
2868                 memset(sym_op->auth.digest.data, 0, auth_tag_len);
2869         else
2870                 rte_memcpy(sym_op->auth.digest.data, auth_tag, auth_tag_len);
2871
2872         debug_hexdump(stdout, "digest:",
2873                 sym_op->auth.digest.data,
2874                 auth_tag_len);
2875
2876         /* Copy cipher and auth IVs at the end of the crypto operation */
2877         uint8_t *iv_ptr = rte_crypto_op_ctod_offset(ut_params->op, uint8_t *,
2878                                                 IV_OFFSET);
2879         rte_memcpy(iv_ptr, cipher_iv, cipher_iv_len);
2880         iv_ptr += cipher_iv_len;
2881         rte_memcpy(iv_ptr, auth_iv, auth_iv_len);
2882
2883         sym_op->cipher.data.length = cipher_len;
2884         sym_op->cipher.data.offset = 0;
2885         sym_op->auth.data.length = auth_len;
2886         sym_op->auth.data.offset = 0;
2887
2888         return 0;
2889 }
2890
2891 static int
2892 create_zuc_cipher_hash_generate_operation(
2893                 const struct wireless_test_data *tdata)
2894 {
2895         return create_wireless_cipher_hash_operation(tdata,
2896                 RTE_CRYPTO_AUTH_OP_GENERATE);
2897 }
2898
2899 static int
2900 create_wireless_algo_cipher_hash_operation(const uint8_t *auth_tag,
2901                 const unsigned auth_tag_len,
2902                 const uint8_t *auth_iv, uint8_t auth_iv_len,
2903                 unsigned data_pad_len,
2904                 enum rte_crypto_auth_operation op,
2905                 const uint8_t *cipher_iv, uint8_t cipher_iv_len,
2906                 const unsigned cipher_len, const unsigned cipher_offset,
2907                 const unsigned auth_len, const unsigned auth_offset)
2908 {
2909         struct crypto_testsuite_params *ts_params = &testsuite_params;
2910         struct crypto_unittest_params *ut_params = &unittest_params;
2911
2912         enum rte_crypto_cipher_algorithm cipher_algo =
2913                         ut_params->cipher_xform.cipher.algo;
2914         enum rte_crypto_auth_algorithm auth_algo =
2915                         ut_params->auth_xform.auth.algo;
2916
2917         /* Generate Crypto op data structure */
2918         ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
2919                         RTE_CRYPTO_OP_TYPE_SYMMETRIC);
2920         TEST_ASSERT_NOT_NULL(ut_params->op,
2921                         "Failed to allocate pktmbuf offload");
2922         /* Set crypto operation data parameters */
2923         rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
2924
2925         struct rte_crypto_sym_op *sym_op = ut_params->op->sym;
2926
2927         /* set crypto operation source mbuf */
2928         sym_op->m_src = ut_params->ibuf;
2929
2930         /* digest */
2931         sym_op->auth.digest.data = (uint8_t *)rte_pktmbuf_append(
2932                         ut_params->ibuf, auth_tag_len);
2933
2934         TEST_ASSERT_NOT_NULL(sym_op->auth.digest.data,
2935                         "no room to append auth tag");
2936         ut_params->digest = sym_op->auth.digest.data;
2937
2938         if (rte_pktmbuf_is_contiguous(ut_params->ibuf)) {
2939                 sym_op->auth.digest.phys_addr = rte_pktmbuf_iova_offset(
2940                                 ut_params->ibuf, data_pad_len);
2941         } else {
2942                 struct rte_mbuf *m = ut_params->ibuf;
2943                 unsigned int offset = data_pad_len;
2944
2945                 while (offset > m->data_len && m->next != NULL) {
2946                         offset -= m->data_len;
2947                         m = m->next;
2948                 }
2949                 sym_op->auth.digest.phys_addr = rte_pktmbuf_iova_offset(
2950                         m, offset);
2951         }
2952
2953         if (op == RTE_CRYPTO_AUTH_OP_GENERATE)
2954                 memset(sym_op->auth.digest.data, 0, auth_tag_len);
2955         else
2956                 rte_memcpy(sym_op->auth.digest.data, auth_tag, auth_tag_len);
2957
2958         debug_hexdump(stdout, "digest:",
2959                 sym_op->auth.digest.data,
2960                 auth_tag_len);
2961
2962         /* Copy cipher and auth IVs at the end of the crypto operation */
2963         uint8_t *iv_ptr = rte_crypto_op_ctod_offset(ut_params->op, uint8_t *,
2964                                                 IV_OFFSET);
2965         rte_memcpy(iv_ptr, cipher_iv, cipher_iv_len);
2966         iv_ptr += cipher_iv_len;
2967         rte_memcpy(iv_ptr, auth_iv, auth_iv_len);
2968
2969         if (cipher_algo == RTE_CRYPTO_CIPHER_SNOW3G_UEA2 ||
2970                 cipher_algo == RTE_CRYPTO_CIPHER_KASUMI_F8 ||
2971                 cipher_algo == RTE_CRYPTO_CIPHER_ZUC_EEA3) {
2972                 sym_op->cipher.data.length = cipher_len;
2973                 sym_op->cipher.data.offset = cipher_offset;
2974         } else {
2975                 sym_op->cipher.data.length = cipher_len >> 3;
2976                 sym_op->cipher.data.offset = cipher_offset >> 3;
2977         }
2978
2979         if (auth_algo == RTE_CRYPTO_AUTH_SNOW3G_UIA2 ||
2980                 auth_algo == RTE_CRYPTO_AUTH_KASUMI_F9 ||
2981                 auth_algo == RTE_CRYPTO_AUTH_ZUC_EIA3) {
2982                 sym_op->auth.data.length = auth_len;
2983                 sym_op->auth.data.offset = auth_offset;
2984         } else {
2985                 sym_op->auth.data.length = auth_len >> 3;
2986                 sym_op->auth.data.offset = auth_offset >> 3;
2987         }
2988
2989         return 0;
2990 }
2991
2992 static int
2993 create_wireless_algo_auth_cipher_operation(
2994                 const uint8_t *auth_tag, unsigned int auth_tag_len,
2995                 const uint8_t *cipher_iv, uint8_t cipher_iv_len,
2996                 const uint8_t *auth_iv, uint8_t auth_iv_len,
2997                 unsigned int data_pad_len,
2998                 unsigned int cipher_len, unsigned int cipher_offset,
2999                 unsigned int auth_len, unsigned int auth_offset,
3000                 uint8_t op_mode, uint8_t do_sgl, uint8_t verify)
3001 {
3002         struct crypto_testsuite_params *ts_params = &testsuite_params;
3003         struct crypto_unittest_params *ut_params = &unittest_params;
3004
3005         enum rte_crypto_cipher_algorithm cipher_algo =
3006                         ut_params->cipher_xform.cipher.algo;
3007         enum rte_crypto_auth_algorithm auth_algo =
3008                         ut_params->auth_xform.auth.algo;
3009
3010         /* Generate Crypto op data structure */
3011         ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
3012                         RTE_CRYPTO_OP_TYPE_SYMMETRIC);
3013         TEST_ASSERT_NOT_NULL(ut_params->op,
3014                         "Failed to allocate pktmbuf offload");
3015
3016         /* Set crypto operation data parameters */
3017         rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
3018
3019         struct rte_crypto_sym_op *sym_op = ut_params->op->sym;
3020
3021         /* set crypto operation mbufs */
3022         sym_op->m_src = ut_params->ibuf;
3023         if (op_mode == OUT_OF_PLACE)
3024                 sym_op->m_dst = ut_params->obuf;
3025
3026         /* digest */
3027         if (!do_sgl) {
3028                 sym_op->auth.digest.data = rte_pktmbuf_mtod_offset(
3029                         (op_mode == IN_PLACE ?
3030                                 ut_params->ibuf : ut_params->obuf),
3031                         uint8_t *, data_pad_len);
3032                 sym_op->auth.digest.phys_addr = rte_pktmbuf_iova_offset(
3033                         (op_mode == IN_PLACE ?
3034                                 ut_params->ibuf : ut_params->obuf),
3035                         data_pad_len);
3036                 memset(sym_op->auth.digest.data, 0, auth_tag_len);
3037         } else {
3038                 uint16_t remaining_off = (auth_offset >> 3) + (auth_len >> 3);
3039                 struct rte_mbuf *sgl_buf = (op_mode == IN_PLACE ?
3040                                 sym_op->m_src : sym_op->m_dst);
3041                 while (remaining_off >= rte_pktmbuf_data_len(sgl_buf)) {
3042                         remaining_off -= rte_pktmbuf_data_len(sgl_buf);
3043                         sgl_buf = sgl_buf->next;
3044                 }
3045                 sym_op->auth.digest.data = rte_pktmbuf_mtod_offset(sgl_buf,
3046                                 uint8_t *, remaining_off);
3047                 sym_op->auth.digest.phys_addr = rte_pktmbuf_iova_offset(sgl_buf,
3048                                 remaining_off);
3049                 memset(sym_op->auth.digest.data, 0, remaining_off);
3050                 while (sgl_buf->next != NULL) {
3051                         memset(rte_pktmbuf_mtod(sgl_buf, uint8_t *),
3052                                 0, rte_pktmbuf_data_len(sgl_buf));
3053                         sgl_buf = sgl_buf->next;
3054                 }
3055         }
3056
3057         /* Copy digest for the verification */
3058         if (verify)
3059                 memcpy(sym_op->auth.digest.data, auth_tag, auth_tag_len);
3060
3061         /* Copy cipher and auth IVs at the end of the crypto operation */
3062         uint8_t *iv_ptr = rte_crypto_op_ctod_offset(
3063                         ut_params->op, uint8_t *, IV_OFFSET);
3064
3065         rte_memcpy(iv_ptr, cipher_iv, cipher_iv_len);
3066         iv_ptr += cipher_iv_len;
3067         rte_memcpy(iv_ptr, auth_iv, auth_iv_len);
3068
3069         /* Only copy over the offset data needed from src to dst in OOP,
3070          * if the auth and cipher offsets are not aligned
3071          */
3072         if (op_mode == OUT_OF_PLACE) {
3073                 if (cipher_offset > auth_offset)
3074                         rte_memcpy(
3075                                 rte_pktmbuf_mtod_offset(
3076                                         sym_op->m_dst,
3077                                         uint8_t *, auth_offset >> 3),
3078                                 rte_pktmbuf_mtod_offset(
3079                                         sym_op->m_src,
3080                                         uint8_t *, auth_offset >> 3),
3081                                 ((cipher_offset >> 3) - (auth_offset >> 3)));
3082         }
3083
3084         if (cipher_algo == RTE_CRYPTO_CIPHER_SNOW3G_UEA2 ||
3085                 cipher_algo == RTE_CRYPTO_CIPHER_KASUMI_F8 ||
3086                 cipher_algo == RTE_CRYPTO_CIPHER_ZUC_EEA3) {
3087                 sym_op->cipher.data.length = cipher_len;
3088                 sym_op->cipher.data.offset = cipher_offset;
3089         } else {
3090                 sym_op->cipher.data.length = cipher_len >> 3;
3091                 sym_op->cipher.data.offset = cipher_offset >> 3;
3092         }
3093
3094         if (auth_algo == RTE_CRYPTO_AUTH_SNOW3G_UIA2 ||
3095                 auth_algo == RTE_CRYPTO_AUTH_KASUMI_F9 ||
3096                 auth_algo == RTE_CRYPTO_AUTH_ZUC_EIA3) {
3097                 sym_op->auth.data.length = auth_len;
3098                 sym_op->auth.data.offset = auth_offset;
3099         } else {
3100                 sym_op->auth.data.length = auth_len >> 3;
3101                 sym_op->auth.data.offset = auth_offset >> 3;
3102         }
3103
3104         return 0;
3105 }
3106
3107 static int
3108 test_snow3g_authentication(const struct snow3g_hash_test_data *tdata)
3109 {
3110         struct crypto_testsuite_params *ts_params = &testsuite_params;
3111         struct crypto_unittest_params *ut_params = &unittest_params;
3112
3113         int retval;
3114         unsigned plaintext_pad_len;
3115         unsigned plaintext_len;
3116         uint8_t *plaintext;
3117         struct rte_cryptodev_info dev_info;
3118
3119         rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
3120         uint64_t feat_flags = dev_info.feature_flags;
3121
3122         if (!(feat_flags & RTE_CRYPTODEV_FF_NON_BYTE_ALIGNED_DATA) &&
3123                         ((tdata->validAuthLenInBits.len % 8) != 0)) {
3124                 printf("Device doesn't support NON-Byte Aligned Data.\n");
3125                 return TEST_SKIPPED;
3126         }
3127
3128         if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
3129                         (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
3130                 printf("Device doesn't support RAW data-path APIs.\n");
3131                 return TEST_SKIPPED;
3132         }
3133
3134         if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
3135                 return TEST_SKIPPED;
3136
3137         /* Verify the capabilities */
3138         struct rte_cryptodev_sym_capability_idx cap_idx;
3139         cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
3140         cap_idx.algo.auth = RTE_CRYPTO_AUTH_SNOW3G_UIA2;
3141         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
3142                         &cap_idx) == NULL)
3143                 return TEST_SKIPPED;
3144
3145         /* Create SNOW 3G session */
3146         retval = create_wireless_algo_hash_session(ts_params->valid_devs[0],
3147                         tdata->key.data, tdata->key.len,
3148                         tdata->auth_iv.len, tdata->digest.len,
3149                         RTE_CRYPTO_AUTH_OP_GENERATE,
3150                         RTE_CRYPTO_AUTH_SNOW3G_UIA2);
3151         if (retval < 0)
3152                 return retval;
3153
3154         /* alloc mbuf and set payload */
3155         ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
3156
3157         memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
3158         rte_pktmbuf_tailroom(ut_params->ibuf));
3159
3160         plaintext_len = ceil_byte_length(tdata->plaintext.len);
3161         /* Append data which is padded to a multiple of */
3162         /* the algorithms block size */
3163         plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16);
3164         plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
3165                                 plaintext_pad_len);
3166         memcpy(plaintext, tdata->plaintext.data, plaintext_len);
3167
3168         /* Create SNOW 3G operation */
3169         retval = create_wireless_algo_hash_operation(NULL, tdata->digest.len,
3170                         tdata->auth_iv.data, tdata->auth_iv.len,
3171                         plaintext_pad_len, RTE_CRYPTO_AUTH_OP_GENERATE,
3172                         tdata->validAuthLenInBits.len,
3173                         0);
3174         if (retval < 0)
3175                 return retval;
3176
3177         if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
3178                 process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
3179                                 ut_params->op, 0, 1, 1, 0);
3180         else
3181                 ut_params->op = process_crypto_request(ts_params->valid_devs[0],
3182                                 ut_params->op);
3183         ut_params->obuf = ut_params->op->sym->m_src;
3184         TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
3185         ut_params->digest = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *)
3186                         + plaintext_pad_len;
3187
3188         /* Validate obuf */
3189         TEST_ASSERT_BUFFERS_ARE_EQUAL(
3190         ut_params->digest,
3191         tdata->digest.data,
3192         DIGEST_BYTE_LENGTH_SNOW3G_UIA2,
3193         "SNOW 3G Generated auth tag not as expected");
3194
3195         return 0;
3196 }
3197
3198 static int
3199 test_snow3g_authentication_verify(const struct snow3g_hash_test_data *tdata)
3200 {
3201         struct crypto_testsuite_params *ts_params = &testsuite_params;
3202         struct crypto_unittest_params *ut_params = &unittest_params;
3203
3204         int retval;
3205         unsigned plaintext_pad_len;
3206         unsigned plaintext_len;
3207         uint8_t *plaintext;
3208         struct rte_cryptodev_info dev_info;
3209
3210         rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
3211         uint64_t feat_flags = dev_info.feature_flags;
3212
3213         if (!(feat_flags & RTE_CRYPTODEV_FF_NON_BYTE_ALIGNED_DATA) &&
3214                         ((tdata->validAuthLenInBits.len % 8) != 0)) {
3215                 printf("Device doesn't support NON-Byte Aligned Data.\n");
3216                 return TEST_SKIPPED;
3217         }
3218
3219         if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
3220                         (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
3221                 printf("Device doesn't support RAW data-path APIs.\n");
3222                 return TEST_SKIPPED;
3223         }
3224
3225         if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
3226                 return TEST_SKIPPED;
3227
3228         /* Verify the capabilities */
3229         struct rte_cryptodev_sym_capability_idx cap_idx;
3230         cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
3231         cap_idx.algo.auth = RTE_CRYPTO_AUTH_SNOW3G_UIA2;
3232         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
3233                         &cap_idx) == NULL)
3234                 return TEST_SKIPPED;
3235
3236         /* Create SNOW 3G session */
3237         retval = create_wireless_algo_hash_session(ts_params->valid_devs[0],
3238                                 tdata->key.data, tdata->key.len,
3239                                 tdata->auth_iv.len, tdata->digest.len,
3240                                 RTE_CRYPTO_AUTH_OP_VERIFY,
3241                                 RTE_CRYPTO_AUTH_SNOW3G_UIA2);
3242         if (retval < 0)
3243                 return retval;
3244         /* alloc mbuf and set payload */
3245         ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
3246
3247         memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
3248         rte_pktmbuf_tailroom(ut_params->ibuf));
3249
3250         plaintext_len = ceil_byte_length(tdata->plaintext.len);
3251         /* Append data which is padded to a multiple of */
3252         /* the algorithms block size */
3253         plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16);
3254         plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
3255                                 plaintext_pad_len);
3256         memcpy(plaintext, tdata->plaintext.data, plaintext_len);
3257
3258         /* Create SNOW 3G operation */
3259         retval = create_wireless_algo_hash_operation(tdata->digest.data,
3260                         tdata->digest.len,
3261                         tdata->auth_iv.data, tdata->auth_iv.len,
3262                         plaintext_pad_len,
3263                         RTE_CRYPTO_AUTH_OP_VERIFY,
3264                         tdata->validAuthLenInBits.len,
3265                         0);
3266         if (retval < 0)
3267                 return retval;
3268
3269         if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
3270                 process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
3271                                 ut_params->op, 0, 1, 1, 0);
3272         else
3273                 ut_params->op = process_crypto_request(ts_params->valid_devs[0],
3274                                 ut_params->op);
3275         TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
3276         ut_params->obuf = ut_params->op->sym->m_src;
3277         ut_params->digest = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *)
3278                                 + plaintext_pad_len;
3279
3280         /* Validate obuf */
3281         if (ut_params->op->status == RTE_CRYPTO_OP_STATUS_SUCCESS)
3282                 return 0;
3283         else
3284                 return -1;
3285
3286         return 0;
3287 }
3288
3289 static int
3290 test_kasumi_authentication(const struct kasumi_hash_test_data *tdata)
3291 {
3292         struct crypto_testsuite_params *ts_params = &testsuite_params;
3293         struct crypto_unittest_params *ut_params = &unittest_params;
3294
3295         int retval;
3296         unsigned plaintext_pad_len;
3297         unsigned plaintext_len;
3298         uint8_t *plaintext;
3299         struct rte_cryptodev_info dev_info;
3300
3301         rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
3302         uint64_t feat_flags = dev_info.feature_flags;
3303
3304         if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
3305                         (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
3306                 printf("Device doesn't support RAW data-path APIs.\n");
3307                 return TEST_SKIPPED;
3308         }
3309
3310         if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
3311                 return TEST_SKIPPED;
3312
3313         /* Verify the capabilities */
3314         struct rte_cryptodev_sym_capability_idx cap_idx;
3315         cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
3316         cap_idx.algo.auth = RTE_CRYPTO_AUTH_KASUMI_F9;
3317         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
3318                         &cap_idx) == NULL)
3319                 return TEST_SKIPPED;
3320
3321         /* Create KASUMI session */
3322         retval = create_wireless_algo_hash_session(ts_params->valid_devs[0],
3323                         tdata->key.data, tdata->key.len,
3324                         0, tdata->digest.len,
3325                         RTE_CRYPTO_AUTH_OP_GENERATE,
3326                         RTE_CRYPTO_AUTH_KASUMI_F9);
3327         if (retval < 0)
3328                 return retval;
3329
3330         /* alloc mbuf and set payload */
3331         ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
3332
3333         memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
3334         rte_pktmbuf_tailroom(ut_params->ibuf));
3335
3336         plaintext_len = ceil_byte_length(tdata->plaintext.len);
3337         /* Append data which is padded to a multiple of */
3338         /* the algorithms block size */
3339         plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 8);
3340         plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
3341                                 plaintext_pad_len);
3342         memcpy(plaintext, tdata->plaintext.data, plaintext_len);
3343
3344         /* Create KASUMI operation */
3345         retval = create_wireless_algo_hash_operation(NULL, tdata->digest.len,
3346                         NULL, 0,
3347                         plaintext_pad_len, RTE_CRYPTO_AUTH_OP_GENERATE,
3348                         tdata->plaintext.len,
3349                         0);
3350         if (retval < 0)
3351                 return retval;
3352
3353         if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
3354                 process_cpu_crypt_auth_op(ts_params->valid_devs[0],
3355                         ut_params->op);
3356         else if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
3357                 process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
3358                                 ut_params->op, 0, 1, 1, 0);
3359         else
3360                 ut_params->op = process_crypto_request(ts_params->valid_devs[0],
3361                         ut_params->op);
3362
3363         ut_params->obuf = ut_params->op->sym->m_src;
3364         TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
3365         ut_params->digest = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *)
3366                         + plaintext_pad_len;
3367
3368         /* Validate obuf */
3369         TEST_ASSERT_BUFFERS_ARE_EQUAL(
3370         ut_params->digest,
3371         tdata->digest.data,
3372         DIGEST_BYTE_LENGTH_KASUMI_F9,
3373         "KASUMI Generated auth tag not as expected");
3374
3375         return 0;
3376 }
3377
3378 static int
3379 test_kasumi_authentication_verify(const struct kasumi_hash_test_data *tdata)
3380 {
3381         struct crypto_testsuite_params *ts_params = &testsuite_params;
3382         struct crypto_unittest_params *ut_params = &unittest_params;
3383
3384         int retval;
3385         unsigned plaintext_pad_len;
3386         unsigned plaintext_len;
3387         uint8_t *plaintext;
3388         struct rte_cryptodev_info dev_info;
3389
3390         rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
3391         uint64_t feat_flags = dev_info.feature_flags;
3392
3393         if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
3394                         (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
3395                 printf("Device doesn't support RAW data-path APIs.\n");
3396                 return TEST_SKIPPED;
3397         }
3398
3399         if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
3400                 return TEST_SKIPPED;
3401
3402         /* Verify the capabilities */
3403         struct rte_cryptodev_sym_capability_idx cap_idx;
3404         cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
3405         cap_idx.algo.auth = RTE_CRYPTO_AUTH_KASUMI_F9;
3406         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
3407                         &cap_idx) == NULL)
3408                 return TEST_SKIPPED;
3409
3410         /* Create KASUMI session */
3411         retval = create_wireless_algo_hash_session(ts_params->valid_devs[0],
3412                                 tdata->key.data, tdata->key.len,
3413                                 0, tdata->digest.len,
3414                                 RTE_CRYPTO_AUTH_OP_VERIFY,
3415                                 RTE_CRYPTO_AUTH_KASUMI_F9);
3416         if (retval < 0)
3417                 return retval;
3418         /* alloc mbuf and set payload */
3419         ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
3420
3421         memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
3422         rte_pktmbuf_tailroom(ut_params->ibuf));
3423
3424         plaintext_len = ceil_byte_length(tdata->plaintext.len);
3425         /* Append data which is padded to a multiple */
3426         /* of the algorithms block size */
3427         plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 8);
3428         plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
3429                                 plaintext_pad_len);
3430         memcpy(plaintext, tdata->plaintext.data, plaintext_len);
3431
3432         /* Create KASUMI operation */
3433         retval = create_wireless_algo_hash_operation(tdata->digest.data,
3434                         tdata->digest.len,
3435                         NULL, 0,
3436                         plaintext_pad_len,
3437                         RTE_CRYPTO_AUTH_OP_VERIFY,
3438                         tdata->plaintext.len,
3439                         0);
3440         if (retval < 0)
3441                 return retval;
3442
3443         if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
3444                 process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
3445                                 ut_params->op, 0, 1, 1, 0);
3446         else
3447                 ut_params->op = process_crypto_request(ts_params->valid_devs[0],
3448                                 ut_params->op);
3449         TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
3450         ut_params->obuf = ut_params->op->sym->m_src;
3451         ut_params->digest = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *)
3452                                 + plaintext_pad_len;
3453
3454         /* Validate obuf */
3455         if (ut_params->op->status == RTE_CRYPTO_OP_STATUS_SUCCESS)
3456                 return 0;
3457         else
3458                 return -1;
3459
3460         return 0;
3461 }
3462
3463 static int
3464 test_snow3g_hash_generate_test_case_1(void)
3465 {
3466         return test_snow3g_authentication(&snow3g_hash_test_case_1);
3467 }
3468
3469 static int
3470 test_snow3g_hash_generate_test_case_2(void)
3471 {
3472         return test_snow3g_authentication(&snow3g_hash_test_case_2);
3473 }
3474
3475 static int
3476 test_snow3g_hash_generate_test_case_3(void)
3477 {
3478         return test_snow3g_authentication(&snow3g_hash_test_case_3);
3479 }
3480
3481 static int
3482 test_snow3g_hash_generate_test_case_4(void)
3483 {
3484         return test_snow3g_authentication(&snow3g_hash_test_case_4);
3485 }
3486
3487 static int
3488 test_snow3g_hash_generate_test_case_5(void)
3489 {
3490         return test_snow3g_authentication(&snow3g_hash_test_case_5);
3491 }
3492
3493 static int
3494 test_snow3g_hash_generate_test_case_6(void)
3495 {
3496         return test_snow3g_authentication(&snow3g_hash_test_case_6);
3497 }
3498
3499 static int
3500 test_snow3g_hash_verify_test_case_1(void)
3501 {
3502         return test_snow3g_authentication_verify(&snow3g_hash_test_case_1);
3503
3504 }
3505
3506 static int
3507 test_snow3g_hash_verify_test_case_2(void)
3508 {
3509         return test_snow3g_authentication_verify(&snow3g_hash_test_case_2);
3510 }
3511
3512 static int
3513 test_snow3g_hash_verify_test_case_3(void)
3514 {
3515         return test_snow3g_authentication_verify(&snow3g_hash_test_case_3);
3516 }
3517
3518 static int
3519 test_snow3g_hash_verify_test_case_4(void)
3520 {
3521         return test_snow3g_authentication_verify(&snow3g_hash_test_case_4);
3522 }
3523
3524 static int
3525 test_snow3g_hash_verify_test_case_5(void)
3526 {
3527         return test_snow3g_authentication_verify(&snow3g_hash_test_case_5);
3528 }
3529
3530 static int
3531 test_snow3g_hash_verify_test_case_6(void)
3532 {
3533         return test_snow3g_authentication_verify(&snow3g_hash_test_case_6);
3534 }
3535
3536 static int
3537 test_kasumi_hash_generate_test_case_1(void)
3538 {
3539         return test_kasumi_authentication(&kasumi_hash_test_case_1);
3540 }
3541
3542 static int
3543 test_kasumi_hash_generate_test_case_2(void)
3544 {
3545         return test_kasumi_authentication(&kasumi_hash_test_case_2);
3546 }
3547
3548 static int
3549 test_kasumi_hash_generate_test_case_3(void)
3550 {
3551         return test_kasumi_authentication(&kasumi_hash_test_case_3);
3552 }
3553
3554 static int
3555 test_kasumi_hash_generate_test_case_4(void)
3556 {
3557         return test_kasumi_authentication(&kasumi_hash_test_case_4);
3558 }
3559
3560 static int
3561 test_kasumi_hash_generate_test_case_5(void)
3562 {
3563         return test_kasumi_authentication(&kasumi_hash_test_case_5);
3564 }
3565
3566 static int
3567 test_kasumi_hash_generate_test_case_6(void)
3568 {
3569         return test_kasumi_authentication(&kasumi_hash_test_case_6);
3570 }
3571
3572 static int
3573 test_kasumi_hash_verify_test_case_1(void)
3574 {
3575         return test_kasumi_authentication_verify(&kasumi_hash_test_case_1);
3576 }
3577
3578 static int
3579 test_kasumi_hash_verify_test_case_2(void)
3580 {
3581         return test_kasumi_authentication_verify(&kasumi_hash_test_case_2);
3582 }
3583
3584 static int
3585 test_kasumi_hash_verify_test_case_3(void)
3586 {
3587         return test_kasumi_authentication_verify(&kasumi_hash_test_case_3);
3588 }
3589
3590 static int
3591 test_kasumi_hash_verify_test_case_4(void)
3592 {
3593         return test_kasumi_authentication_verify(&kasumi_hash_test_case_4);
3594 }
3595
3596 static int
3597 test_kasumi_hash_verify_test_case_5(void)
3598 {
3599         return test_kasumi_authentication_verify(&kasumi_hash_test_case_5);
3600 }
3601
3602 static int
3603 test_kasumi_encryption(const struct kasumi_test_data *tdata)
3604 {
3605         struct crypto_testsuite_params *ts_params = &testsuite_params;
3606         struct crypto_unittest_params *ut_params = &unittest_params;
3607
3608         int retval;
3609         uint8_t *plaintext, *ciphertext;
3610         unsigned plaintext_pad_len;
3611         unsigned plaintext_len;
3612         struct rte_cryptodev_info dev_info;
3613
3614         rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
3615         uint64_t feat_flags = dev_info.feature_flags;
3616
3617         if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
3618                         (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
3619                 printf("Device doesn't support RAW data-path APIs.\n");
3620                 return TEST_SKIPPED;
3621         }
3622
3623         if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
3624                 return TEST_SKIPPED;
3625
3626         /* Verify the capabilities */
3627         struct rte_cryptodev_sym_capability_idx cap_idx;
3628         cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
3629         cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_KASUMI_F8;
3630         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
3631                         &cap_idx) == NULL)
3632                 return TEST_SKIPPED;
3633
3634         /* Create KASUMI session */
3635         retval = create_wireless_algo_cipher_session(ts_params->valid_devs[0],
3636                                         RTE_CRYPTO_CIPHER_OP_ENCRYPT,
3637                                         RTE_CRYPTO_CIPHER_KASUMI_F8,
3638                                         tdata->key.data, tdata->key.len,
3639                                         tdata->cipher_iv.len);
3640         if (retval < 0)
3641                 return retval;
3642
3643         ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
3644
3645         /* Clear mbuf payload */
3646         memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
3647                rte_pktmbuf_tailroom(ut_params->ibuf));
3648
3649         plaintext_len = ceil_byte_length(tdata->plaintext.len);
3650         /* Append data which is padded to a multiple */
3651         /* of the algorithms block size */
3652         plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 8);
3653         plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
3654                                 plaintext_pad_len);
3655         memcpy(plaintext, tdata->plaintext.data, plaintext_len);
3656
3657         debug_hexdump(stdout, "plaintext:", plaintext, plaintext_len);
3658
3659         /* Create KASUMI operation */
3660         retval = create_wireless_algo_cipher_operation(tdata->cipher_iv.data,
3661                                 tdata->cipher_iv.len,
3662                                 RTE_ALIGN_CEIL(tdata->validCipherLenInBits.len, 8),
3663                                 tdata->validCipherOffsetInBits.len);
3664         if (retval < 0)
3665                 return retval;
3666
3667         if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
3668                 process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
3669                                 ut_params->op, 1, 0, 1, tdata->cipher_iv.len);
3670         else
3671                 ut_params->op = process_crypto_request(ts_params->valid_devs[0],
3672                                 ut_params->op);
3673         TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
3674
3675         ut_params->obuf = ut_params->op->sym->m_dst;
3676         if (ut_params->obuf)
3677                 ciphertext = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *);
3678         else
3679                 ciphertext = plaintext + (tdata->validCipherOffsetInBits.len >> 3);
3680
3681         debug_hexdump(stdout, "ciphertext:", ciphertext, plaintext_len);
3682
3683         const uint8_t *reference_ciphertext = tdata->ciphertext.data +
3684                                 (tdata->validCipherOffsetInBits.len >> 3);
3685         /* Validate obuf */
3686         TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
3687                 ciphertext,
3688                 reference_ciphertext,
3689                 tdata->validCipherLenInBits.len,
3690                 "KASUMI Ciphertext data not as expected");
3691         return 0;
3692 }
3693
3694 static int
3695 test_kasumi_encryption_sgl(const struct kasumi_test_data *tdata)
3696 {
3697         struct crypto_testsuite_params *ts_params = &testsuite_params;
3698         struct crypto_unittest_params *ut_params = &unittest_params;
3699
3700         int retval;
3701
3702         unsigned int plaintext_pad_len;
3703         unsigned int plaintext_len;
3704
3705         uint8_t buffer[10000];
3706         const uint8_t *ciphertext;
3707
3708         struct rte_cryptodev_info dev_info;
3709
3710         /* Verify the capabilities */
3711         struct rte_cryptodev_sym_capability_idx cap_idx;
3712         cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
3713         cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_KASUMI_F8;
3714         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
3715                         &cap_idx) == NULL)
3716                 return TEST_SKIPPED;
3717
3718         rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
3719
3720         uint64_t feat_flags = dev_info.feature_flags;
3721
3722         if (!(feat_flags & RTE_CRYPTODEV_FF_IN_PLACE_SGL)) {
3723                 printf("Device doesn't support in-place scatter-gather. "
3724                                 "Test Skipped.\n");
3725                 return TEST_SKIPPED;
3726         }
3727
3728         if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
3729                         (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
3730                 printf("Device doesn't support RAW data-path APIs.\n");
3731                 return TEST_SKIPPED;
3732         }
3733
3734         if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
3735                 return TEST_SKIPPED;
3736
3737         /* Create KASUMI session */
3738         retval = create_wireless_algo_cipher_session(ts_params->valid_devs[0],
3739                                         RTE_CRYPTO_CIPHER_OP_ENCRYPT,
3740                                         RTE_CRYPTO_CIPHER_KASUMI_F8,
3741                                         tdata->key.data, tdata->key.len,
3742                                         tdata->cipher_iv.len);
3743         if (retval < 0)
3744                 return retval;
3745
3746         plaintext_len = ceil_byte_length(tdata->plaintext.len);
3747
3748
3749         /* Append data which is padded to a multiple */
3750         /* of the algorithms block size */
3751         plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 8);
3752
3753         ut_params->ibuf = create_segmented_mbuf(ts_params->mbuf_pool,
3754                         plaintext_pad_len, 10, 0);
3755
3756         pktmbuf_write(ut_params->ibuf, 0, plaintext_len, tdata->plaintext.data);
3757
3758         /* Create KASUMI operation */
3759         retval = create_wireless_algo_cipher_operation(tdata->cipher_iv.data,
3760                                 tdata->cipher_iv.len,
3761                                 RTE_ALIGN_CEIL(tdata->validCipherLenInBits.len, 8),
3762                                 tdata->validCipherOffsetInBits.len);
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
3776         if (ut_params->obuf)
3777                 ciphertext = rte_pktmbuf_read(ut_params->obuf, 0,
3778                                 plaintext_len, buffer);
3779         else
3780                 ciphertext = rte_pktmbuf_read(ut_params->ibuf,
3781                                 tdata->validCipherOffsetInBits.len >> 3,
3782                                 plaintext_len, buffer);
3783
3784         /* Validate obuf */
3785         debug_hexdump(stdout, "ciphertext:", ciphertext, plaintext_len);
3786
3787         const uint8_t *reference_ciphertext = tdata->ciphertext.data +
3788                                 (tdata->validCipherOffsetInBits.len >> 3);
3789         /* Validate obuf */
3790         TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
3791                 ciphertext,
3792                 reference_ciphertext,
3793                 tdata->validCipherLenInBits.len,
3794                 "KASUMI Ciphertext data not as expected");
3795         return 0;
3796 }
3797
3798 static int
3799 test_kasumi_encryption_oop(const struct kasumi_test_data *tdata)
3800 {
3801         struct crypto_testsuite_params *ts_params = &testsuite_params;
3802         struct crypto_unittest_params *ut_params = &unittest_params;
3803
3804         int retval;
3805         uint8_t *plaintext, *ciphertext;
3806         unsigned plaintext_pad_len;
3807         unsigned plaintext_len;
3808
3809         /* Verify the capabilities */
3810         struct rte_cryptodev_sym_capability_idx cap_idx;
3811         cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
3812         cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_KASUMI_F8;
3813         /* Data-path service does not support OOP */
3814         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
3815                         &cap_idx) == NULL)
3816                 return TEST_SKIPPED;
3817
3818         if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
3819                 return TEST_SKIPPED;
3820
3821         if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
3822                 return TEST_SKIPPED;
3823
3824         /* Create KASUMI session */
3825         retval = create_wireless_algo_cipher_session(ts_params->valid_devs[0],
3826                                         RTE_CRYPTO_CIPHER_OP_ENCRYPT,
3827                                         RTE_CRYPTO_CIPHER_KASUMI_F8,
3828                                         tdata->key.data, tdata->key.len,
3829                                         tdata->cipher_iv.len);
3830         if (retval < 0)
3831                 return retval;
3832
3833         ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
3834         ut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
3835
3836         /* Clear mbuf payload */
3837         memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
3838                rte_pktmbuf_tailroom(ut_params->ibuf));
3839
3840         plaintext_len = ceil_byte_length(tdata->plaintext.len);
3841         /* Append data which is padded to a multiple */
3842         /* of the algorithms block size */
3843         plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 8);
3844         plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
3845                                 plaintext_pad_len);
3846         rte_pktmbuf_append(ut_params->obuf, plaintext_pad_len);
3847         memcpy(plaintext, tdata->plaintext.data, plaintext_len);
3848
3849         debug_hexdump(stdout, "plaintext:", plaintext, plaintext_len);
3850
3851         /* Create KASUMI operation */
3852         retval = create_wireless_algo_cipher_operation_oop(tdata->cipher_iv.data,
3853                                 tdata->cipher_iv.len,
3854                                 RTE_ALIGN_CEIL(tdata->validCipherLenInBits.len, 8),
3855                                 tdata->validCipherOffsetInBits.len);
3856         if (retval < 0)
3857                 return retval;
3858
3859         ut_params->op = process_crypto_request(ts_params->valid_devs[0],
3860                                                 ut_params->op);
3861         TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
3862
3863         ut_params->obuf = ut_params->op->sym->m_dst;
3864         if (ut_params->obuf)
3865                 ciphertext = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *);
3866         else
3867                 ciphertext = plaintext + (tdata->validCipherOffsetInBits.len >> 3);
3868
3869         debug_hexdump(stdout, "ciphertext:", ciphertext, plaintext_len);
3870
3871         const uint8_t *reference_ciphertext = tdata->ciphertext.data +
3872                                 (tdata->validCipherOffsetInBits.len >> 3);
3873         /* Validate obuf */
3874         TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
3875                 ciphertext,
3876                 reference_ciphertext,
3877                 tdata->validCipherLenInBits.len,
3878                 "KASUMI Ciphertext data not as expected");
3879         return 0;
3880 }
3881
3882 static int
3883 test_kasumi_encryption_oop_sgl(const struct kasumi_test_data *tdata)
3884 {
3885         struct crypto_testsuite_params *ts_params = &testsuite_params;
3886         struct crypto_unittest_params *ut_params = &unittest_params;
3887
3888         int retval;
3889         unsigned int plaintext_pad_len;
3890         unsigned int plaintext_len;
3891
3892         const uint8_t *ciphertext;
3893         uint8_t buffer[2048];
3894
3895         struct rte_cryptodev_info dev_info;
3896
3897         /* Verify the capabilities */
3898         struct rte_cryptodev_sym_capability_idx cap_idx;
3899         cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
3900         cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_KASUMI_F8;
3901         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
3902                         &cap_idx) == NULL)
3903                 return TEST_SKIPPED;
3904
3905         if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
3906                 return TEST_SKIPPED;
3907
3908         if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
3909                 return TEST_SKIPPED;
3910
3911         rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
3912
3913         uint64_t feat_flags = dev_info.feature_flags;
3914         if (!(feat_flags & RTE_CRYPTODEV_FF_OOP_SGL_IN_SGL_OUT)) {
3915                 printf("Device doesn't support out-of-place scatter-gather "
3916                                 "in both input and output mbufs. "
3917                                 "Test Skipped.\n");
3918                 return TEST_SKIPPED;
3919         }
3920
3921         /* Create KASUMI session */
3922         retval = create_wireless_algo_cipher_session(ts_params->valid_devs[0],
3923                                         RTE_CRYPTO_CIPHER_OP_ENCRYPT,
3924                                         RTE_CRYPTO_CIPHER_KASUMI_F8,
3925                                         tdata->key.data, tdata->key.len,
3926                                         tdata->cipher_iv.len);
3927         if (retval < 0)
3928                 return retval;
3929
3930         plaintext_len = ceil_byte_length(tdata->plaintext.len);
3931         /* Append data which is padded to a multiple */
3932         /* of the algorithms block size */
3933         plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 8);
3934
3935         ut_params->ibuf = create_segmented_mbuf(ts_params->mbuf_pool,
3936                         plaintext_pad_len, 10, 0);
3937         ut_params->obuf = create_segmented_mbuf(ts_params->mbuf_pool,
3938                         plaintext_pad_len, 3, 0);
3939
3940         /* Append data which is padded to a multiple */
3941         /* of the algorithms block size */
3942         pktmbuf_write(ut_params->ibuf, 0, plaintext_len, tdata->plaintext.data);
3943
3944         /* Create KASUMI operation */
3945         retval = create_wireless_algo_cipher_operation_oop(tdata->cipher_iv.data,
3946                                 tdata->cipher_iv.len,
3947                                 RTE_ALIGN_CEIL(tdata->validCipherLenInBits.len, 8),
3948                                 tdata->validCipherOffsetInBits.len);
3949         if (retval < 0)
3950                 return retval;
3951
3952         ut_params->op = process_crypto_request(ts_params->valid_devs[0],
3953                                                 ut_params->op);
3954         TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
3955
3956         ut_params->obuf = ut_params->op->sym->m_dst;
3957         if (ut_params->obuf)
3958                 ciphertext = rte_pktmbuf_read(ut_params->obuf, 0,
3959                                 plaintext_pad_len, buffer);
3960         else
3961                 ciphertext = rte_pktmbuf_read(ut_params->ibuf,
3962                                 tdata->validCipherOffsetInBits.len >> 3,
3963                                 plaintext_pad_len, buffer);
3964
3965         const uint8_t *reference_ciphertext = tdata->ciphertext.data +
3966                                 (tdata->validCipherOffsetInBits.len >> 3);
3967         /* Validate obuf */
3968         TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
3969                 ciphertext,
3970                 reference_ciphertext,
3971                 tdata->validCipherLenInBits.len,
3972                 "KASUMI Ciphertext data not as expected");
3973         return 0;
3974 }
3975
3976
3977 static int
3978 test_kasumi_decryption_oop(const struct kasumi_test_data *tdata)
3979 {
3980         struct crypto_testsuite_params *ts_params = &testsuite_params;
3981         struct crypto_unittest_params *ut_params = &unittest_params;
3982
3983         int retval;
3984         uint8_t *ciphertext, *plaintext;
3985         unsigned ciphertext_pad_len;
3986         unsigned ciphertext_len;
3987
3988         /* Verify the capabilities */
3989         struct rte_cryptodev_sym_capability_idx cap_idx;
3990         cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
3991         cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_KASUMI_F8;
3992         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
3993                         &cap_idx) == NULL)
3994                 return TEST_SKIPPED;
3995
3996         if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
3997                 return TEST_SKIPPED;
3998
3999         if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
4000                 return TEST_SKIPPED;
4001
4002         /* Create KASUMI session */
4003         retval = create_wireless_algo_cipher_session(ts_params->valid_devs[0],
4004                                         RTE_CRYPTO_CIPHER_OP_DECRYPT,
4005                                         RTE_CRYPTO_CIPHER_KASUMI_F8,
4006                                         tdata->key.data, tdata->key.len,
4007                                         tdata->cipher_iv.len);
4008         if (retval < 0)
4009                 return retval;
4010
4011         ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
4012         ut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
4013
4014         /* Clear mbuf payload */
4015         memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
4016                rte_pktmbuf_tailroom(ut_params->ibuf));
4017
4018         ciphertext_len = ceil_byte_length(tdata->ciphertext.len);
4019         /* Append data which is padded to a multiple */
4020         /* of the algorithms block size */
4021         ciphertext_pad_len = RTE_ALIGN_CEIL(ciphertext_len, 8);
4022         ciphertext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
4023                                 ciphertext_pad_len);
4024         rte_pktmbuf_append(ut_params->obuf, ciphertext_pad_len);
4025         memcpy(ciphertext, tdata->ciphertext.data, ciphertext_len);
4026
4027         debug_hexdump(stdout, "ciphertext:", ciphertext, ciphertext_len);
4028
4029         /* Create KASUMI operation */
4030         retval = create_wireless_algo_cipher_operation_oop(tdata->cipher_iv.data,
4031                                 tdata->cipher_iv.len,
4032                                 RTE_ALIGN_CEIL(tdata->validCipherLenInBits.len, 8),
4033                                 tdata->validCipherOffsetInBits.len);
4034         if (retval < 0)
4035                 return retval;
4036
4037         ut_params->op = process_crypto_request(ts_params->valid_devs[0],
4038                                                 ut_params->op);
4039         TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
4040
4041         ut_params->obuf = ut_params->op->sym->m_dst;
4042         if (ut_params->obuf)
4043                 plaintext = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *);
4044         else
4045                 plaintext = ciphertext + (tdata->validCipherOffsetInBits.len >> 3);
4046
4047         debug_hexdump(stdout, "plaintext:", plaintext, ciphertext_len);
4048
4049         const uint8_t *reference_plaintext = tdata->plaintext.data +
4050                                 (tdata->validCipherOffsetInBits.len >> 3);
4051         /* Validate obuf */
4052         TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
4053                 plaintext,
4054                 reference_plaintext,
4055                 tdata->validCipherLenInBits.len,
4056                 "KASUMI Plaintext data not as expected");
4057         return 0;
4058 }
4059
4060 static int
4061 test_kasumi_decryption(const struct kasumi_test_data *tdata)
4062 {
4063         struct crypto_testsuite_params *ts_params = &testsuite_params;
4064         struct crypto_unittest_params *ut_params = &unittest_params;
4065
4066         int retval;
4067         uint8_t *ciphertext, *plaintext;
4068         unsigned ciphertext_pad_len;
4069         unsigned ciphertext_len;
4070         struct rte_cryptodev_info dev_info;
4071
4072         rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
4073         uint64_t feat_flags = dev_info.feature_flags;
4074
4075         if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
4076                         (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
4077                 printf("Device doesn't support RAW data-path APIs.\n");
4078                 return TEST_SKIPPED;
4079         }
4080
4081         if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
4082                 return TEST_SKIPPED;
4083
4084         /* Verify the capabilities */
4085         struct rte_cryptodev_sym_capability_idx cap_idx;
4086         cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
4087         cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_KASUMI_F8;
4088         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
4089                         &cap_idx) == NULL)
4090                 return TEST_SKIPPED;
4091
4092         /* Create KASUMI session */
4093         retval = create_wireless_algo_cipher_session(ts_params->valid_devs[0],
4094                                         RTE_CRYPTO_CIPHER_OP_DECRYPT,
4095                                         RTE_CRYPTO_CIPHER_KASUMI_F8,
4096                                         tdata->key.data, tdata->key.len,
4097                                         tdata->cipher_iv.len);
4098         if (retval < 0)
4099                 return retval;
4100
4101         ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
4102
4103         /* Clear mbuf payload */
4104         memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
4105                rte_pktmbuf_tailroom(ut_params->ibuf));
4106
4107         ciphertext_len = ceil_byte_length(tdata->ciphertext.len);
4108         /* Append data which is padded to a multiple */
4109         /* of the algorithms block size */
4110         ciphertext_pad_len = RTE_ALIGN_CEIL(ciphertext_len, 8);
4111         ciphertext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
4112                                 ciphertext_pad_len);
4113         memcpy(ciphertext, tdata->ciphertext.data, ciphertext_len);
4114
4115         debug_hexdump(stdout, "ciphertext:", ciphertext, ciphertext_len);
4116
4117         /* Create KASUMI operation */
4118         retval = create_wireless_algo_cipher_operation(tdata->cipher_iv.data,
4119                         tdata->cipher_iv.len,
4120                         RTE_ALIGN_CEIL(tdata->validCipherLenInBits.len, 8),
4121                         tdata->validCipherOffsetInBits.len);
4122         if (retval < 0)
4123                 return retval;
4124
4125         if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
4126                 process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
4127                                 ut_params->op, 1, 0, 1, 0);
4128         else
4129                 ut_params->op = process_crypto_request(ts_params->valid_devs[0],
4130                                                 ut_params->op);
4131         TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
4132
4133         ut_params->obuf = ut_params->op->sym->m_dst;
4134         if (ut_params->obuf)
4135                 plaintext = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *);
4136         else
4137                 plaintext = ciphertext + (tdata->validCipherOffsetInBits.len >> 3);
4138
4139         debug_hexdump(stdout, "plaintext:", plaintext, ciphertext_len);
4140
4141         const uint8_t *reference_plaintext = tdata->plaintext.data +
4142                                 (tdata->validCipherOffsetInBits.len >> 3);
4143         /* Validate obuf */
4144         TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
4145                 plaintext,
4146                 reference_plaintext,
4147                 tdata->validCipherLenInBits.len,
4148                 "KASUMI Plaintext data not as expected");
4149         return 0;
4150 }
4151
4152 static int
4153 test_snow3g_encryption(const struct snow3g_test_data *tdata)
4154 {
4155         struct crypto_testsuite_params *ts_params = &testsuite_params;
4156         struct crypto_unittest_params *ut_params = &unittest_params;
4157
4158         int retval;
4159         uint8_t *plaintext, *ciphertext;
4160         unsigned plaintext_pad_len;
4161         unsigned plaintext_len;
4162         struct rte_cryptodev_info dev_info;
4163
4164         rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
4165         uint64_t feat_flags = dev_info.feature_flags;
4166
4167         if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
4168                         (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
4169                 printf("Device doesn't support RAW data-path APIs.\n");
4170                 return TEST_SKIPPED;
4171         }
4172
4173         if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
4174                 return TEST_SKIPPED;
4175
4176         /* Verify the capabilities */
4177         struct rte_cryptodev_sym_capability_idx cap_idx;
4178         cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
4179         cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_SNOW3G_UEA2;
4180         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
4181                         &cap_idx) == NULL)
4182                 return TEST_SKIPPED;
4183
4184         /* Create SNOW 3G session */
4185         retval = create_wireless_algo_cipher_session(ts_params->valid_devs[0],
4186                                         RTE_CRYPTO_CIPHER_OP_ENCRYPT,
4187                                         RTE_CRYPTO_CIPHER_SNOW3G_UEA2,
4188                                         tdata->key.data, tdata->key.len,
4189                                         tdata->cipher_iv.len);
4190         if (retval < 0)
4191                 return retval;
4192
4193         ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
4194
4195         /* Clear mbuf payload */
4196         memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
4197                rte_pktmbuf_tailroom(ut_params->ibuf));
4198
4199         plaintext_len = ceil_byte_length(tdata->plaintext.len);
4200         /* Append data which is padded to a multiple of */
4201         /* the algorithms block size */
4202         plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16);
4203         plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
4204                                 plaintext_pad_len);
4205         memcpy(plaintext, tdata->plaintext.data, plaintext_len);
4206
4207         debug_hexdump(stdout, "plaintext:", plaintext, plaintext_len);
4208
4209         /* Create SNOW 3G operation */
4210         retval = create_wireless_algo_cipher_operation(tdata->cipher_iv.data,
4211                                         tdata->cipher_iv.len,
4212                                         tdata->validCipherLenInBits.len,
4213                                         0);
4214         if (retval < 0)
4215                 return retval;
4216
4217         if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
4218                 process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
4219                                 ut_params->op, 1, 0, 1, tdata->cipher_iv.len);
4220         else
4221                 ut_params->op = process_crypto_request(ts_params->valid_devs[0],
4222                                                 ut_params->op);
4223         TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
4224
4225         ut_params->obuf = ut_params->op->sym->m_dst;
4226         if (ut_params->obuf)
4227                 ciphertext = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *);
4228         else
4229                 ciphertext = plaintext;
4230
4231         debug_hexdump(stdout, "ciphertext:", ciphertext, plaintext_len);
4232
4233         /* Validate obuf */
4234         TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
4235                 ciphertext,
4236                 tdata->ciphertext.data,
4237                 tdata->validDataLenInBits.len,
4238                 "SNOW 3G Ciphertext data not as expected");
4239         return 0;
4240 }
4241
4242
4243 static int
4244 test_snow3g_encryption_oop(const struct snow3g_test_data *tdata)
4245 {
4246         struct crypto_testsuite_params *ts_params = &testsuite_params;
4247         struct crypto_unittest_params *ut_params = &unittest_params;
4248         uint8_t *plaintext, *ciphertext;
4249
4250         int retval;
4251         unsigned plaintext_pad_len;
4252         unsigned plaintext_len;
4253         struct rte_cryptodev_info dev_info;
4254
4255         rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
4256         uint64_t feat_flags = dev_info.feature_flags;
4257
4258         if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
4259                         (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
4260                 printf("Device does not support RAW data-path APIs.\n");
4261                 return -ENOTSUP;
4262         }
4263
4264         /* Verify the capabilities */
4265         struct rte_cryptodev_sym_capability_idx cap_idx;
4266         cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
4267         cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_SNOW3G_UEA2;
4268         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
4269                         &cap_idx) == NULL)
4270                 return TEST_SKIPPED;
4271
4272         if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
4273                 return TEST_SKIPPED;
4274
4275         if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
4276                 return TEST_SKIPPED;
4277
4278         /* Create SNOW 3G session */
4279         retval = create_wireless_algo_cipher_session(ts_params->valid_devs[0],
4280                                         RTE_CRYPTO_CIPHER_OP_ENCRYPT,
4281                                         RTE_CRYPTO_CIPHER_SNOW3G_UEA2,
4282                                         tdata->key.data, tdata->key.len,
4283                                         tdata->cipher_iv.len);
4284         if (retval < 0)
4285                 return retval;
4286
4287         ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
4288         ut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
4289
4290         TEST_ASSERT_NOT_NULL(ut_params->ibuf,
4291                         "Failed to allocate input buffer in mempool");
4292         TEST_ASSERT_NOT_NULL(ut_params->obuf,
4293                         "Failed to allocate output buffer in mempool");
4294
4295         /* Clear mbuf payload */
4296         memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
4297                rte_pktmbuf_tailroom(ut_params->ibuf));
4298
4299         plaintext_len = ceil_byte_length(tdata->plaintext.len);
4300         /* Append data which is padded to a multiple of */
4301         /* the algorithms block size */
4302         plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16);
4303         plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
4304                                 plaintext_pad_len);
4305         rte_pktmbuf_append(ut_params->obuf, plaintext_pad_len);
4306         memcpy(plaintext, tdata->plaintext.data, plaintext_len);
4307
4308         debug_hexdump(stdout, "plaintext:", plaintext, plaintext_len);
4309
4310         /* Create SNOW 3G operation */
4311         retval = create_wireless_algo_cipher_operation_oop(tdata->cipher_iv.data,
4312                                         tdata->cipher_iv.len,
4313                                         tdata->validCipherLenInBits.len,
4314                                         0);
4315         if (retval < 0)
4316                 return retval;
4317
4318         if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
4319                 process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
4320                         ut_params->op, 1, 0, 1, tdata->cipher_iv.len);
4321         else
4322                 ut_params->op = process_crypto_request(ts_params->valid_devs[0],
4323                                                 ut_params->op);
4324         TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
4325
4326         ut_params->obuf = ut_params->op->sym->m_dst;
4327         if (ut_params->obuf)
4328                 ciphertext = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *);
4329         else
4330                 ciphertext = plaintext;
4331
4332         debug_hexdump(stdout, "ciphertext:", ciphertext, plaintext_len);
4333
4334         /* Validate obuf */
4335         TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
4336                 ciphertext,
4337                 tdata->ciphertext.data,
4338                 tdata->validDataLenInBits.len,
4339                 "SNOW 3G Ciphertext data not as expected");
4340         return 0;
4341 }
4342
4343 static int
4344 test_snow3g_encryption_oop_sgl(const struct snow3g_test_data *tdata)
4345 {
4346         struct crypto_testsuite_params *ts_params = &testsuite_params;
4347         struct crypto_unittest_params *ut_params = &unittest_params;
4348
4349         int retval;
4350         unsigned int plaintext_pad_len;
4351         unsigned int plaintext_len;
4352         uint8_t buffer[10000];
4353         const uint8_t *ciphertext;
4354
4355         struct rte_cryptodev_info dev_info;
4356
4357         /* Verify the capabilities */
4358         struct rte_cryptodev_sym_capability_idx cap_idx;
4359         cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
4360         cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_SNOW3G_UEA2;
4361         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
4362                         &cap_idx) == NULL)
4363                 return TEST_SKIPPED;
4364
4365         if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
4366                 return TEST_SKIPPED;
4367
4368         if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
4369                 return TEST_SKIPPED;
4370
4371         rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
4372
4373         uint64_t feat_flags = dev_info.feature_flags;
4374
4375         if (!(feat_flags & RTE_CRYPTODEV_FF_OOP_SGL_IN_SGL_OUT)) {
4376                 printf("Device doesn't support out-of-place scatter-gather "
4377                                 "in both input and output mbufs. "
4378                                 "Test Skipped.\n");
4379                 return TEST_SKIPPED;
4380         }
4381
4382         if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
4383                         (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
4384                 printf("Device does not support RAW data-path APIs.\n");
4385                 return -ENOTSUP;
4386         }
4387
4388         /* Create SNOW 3G session */
4389         retval = create_wireless_algo_cipher_session(ts_params->valid_devs[0],
4390                                         RTE_CRYPTO_CIPHER_OP_ENCRYPT,
4391                                         RTE_CRYPTO_CIPHER_SNOW3G_UEA2,
4392                                         tdata->key.data, tdata->key.len,
4393                                         tdata->cipher_iv.len);
4394         if (retval < 0)
4395                 return retval;
4396
4397         plaintext_len = ceil_byte_length(tdata->plaintext.len);
4398         /* Append data which is padded to a multiple of */
4399         /* the algorithms block size */
4400         plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16);
4401
4402         ut_params->ibuf = create_segmented_mbuf(ts_params->mbuf_pool,
4403                         plaintext_pad_len, 10, 0);
4404         ut_params->obuf = create_segmented_mbuf(ts_params->mbuf_pool,
4405                         plaintext_pad_len, 3, 0);
4406
4407         TEST_ASSERT_NOT_NULL(ut_params->ibuf,
4408                         "Failed to allocate input buffer in mempool");
4409         TEST_ASSERT_NOT_NULL(ut_params->obuf,
4410                         "Failed to allocate output buffer in mempool");
4411
4412         pktmbuf_write(ut_params->ibuf, 0, plaintext_len, tdata->plaintext.data);
4413
4414         /* Create SNOW 3G operation */
4415         retval = create_wireless_algo_cipher_operation_oop(tdata->cipher_iv.data,
4416                                         tdata->cipher_iv.len,
4417                                         tdata->validCipherLenInBits.len,
4418                                         0);
4419         if (retval < 0)
4420                 return retval;
4421
4422         if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
4423                 process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
4424                         ut_params->op, 1, 0, 1, tdata->cipher_iv.len);
4425         else
4426                 ut_params->op = process_crypto_request(ts_params->valid_devs[0],
4427                                                 ut_params->op);
4428         TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
4429
4430         ut_params->obuf = ut_params->op->sym->m_dst;
4431         if (ut_params->obuf)
4432                 ciphertext = rte_pktmbuf_read(ut_params->obuf, 0,
4433                                 plaintext_len, buffer);
4434         else
4435                 ciphertext = rte_pktmbuf_read(ut_params->ibuf, 0,
4436                                 plaintext_len, buffer);
4437
4438         debug_hexdump(stdout, "ciphertext:", ciphertext, plaintext_len);
4439
4440         /* Validate obuf */
4441         TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
4442                 ciphertext,
4443                 tdata->ciphertext.data,
4444                 tdata->validDataLenInBits.len,
4445                 "SNOW 3G Ciphertext data not as expected");
4446
4447         return 0;
4448 }
4449
4450 /* Shift right a buffer by "offset" bits, "offset" < 8 */
4451 static void
4452 buffer_shift_right(uint8_t *buffer, uint32_t length, uint8_t offset)
4453 {
4454         uint8_t curr_byte, prev_byte;
4455         uint32_t length_in_bytes = ceil_byte_length(length + offset);
4456         uint8_t lower_byte_mask = (1 << offset) - 1;
4457         unsigned i;
4458
4459         prev_byte = buffer[0];
4460         buffer[0] >>= offset;
4461
4462         for (i = 1; i < length_in_bytes; i++) {
4463                 curr_byte = buffer[i];
4464                 buffer[i] = ((prev_byte & lower_byte_mask) << (8 - offset)) |
4465                                 (curr_byte >> offset);
4466                 prev_byte = curr_byte;
4467         }
4468 }
4469
4470 static int
4471 test_snow3g_encryption_offset_oop(const struct snow3g_test_data *tdata)
4472 {
4473         struct crypto_testsuite_params *ts_params = &testsuite_params;
4474         struct crypto_unittest_params *ut_params = &unittest_params;
4475         uint8_t *plaintext, *ciphertext;
4476         int retval;
4477         uint32_t plaintext_len;
4478         uint32_t plaintext_pad_len;
4479         uint8_t extra_offset = 4;
4480         uint8_t *expected_ciphertext_shifted;
4481         struct rte_cryptodev_info dev_info;
4482
4483         rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
4484         uint64_t feat_flags = dev_info.feature_flags;
4485
4486         if (!(feat_flags & RTE_CRYPTODEV_FF_NON_BYTE_ALIGNED_DATA) &&
4487                         ((tdata->validDataLenInBits.len % 8) != 0)) {
4488                 printf("Device doesn't support NON-Byte Aligned Data.\n");
4489                 return TEST_SKIPPED;
4490         }
4491
4492         /* Verify the capabilities */
4493         struct rte_cryptodev_sym_capability_idx cap_idx;
4494         cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
4495         cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_SNOW3G_UEA2;
4496         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
4497                         &cap_idx) == NULL)
4498                 return TEST_SKIPPED;
4499
4500         if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
4501                 return TEST_SKIPPED;
4502
4503         if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
4504                 return TEST_SKIPPED;
4505
4506         /* Create SNOW 3G session */
4507         retval = create_wireless_algo_cipher_session(ts_params->valid_devs[0],
4508                                         RTE_CRYPTO_CIPHER_OP_ENCRYPT,
4509                                         RTE_CRYPTO_CIPHER_SNOW3G_UEA2,
4510                                         tdata->key.data, tdata->key.len,
4511                                         tdata->cipher_iv.len);
4512         if (retval < 0)
4513                 return retval;
4514
4515         ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
4516         ut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
4517
4518         TEST_ASSERT_NOT_NULL(ut_params->ibuf,
4519                         "Failed to allocate input buffer in mempool");
4520         TEST_ASSERT_NOT_NULL(ut_params->obuf,
4521                         "Failed to allocate output buffer in mempool");
4522
4523         /* Clear mbuf payload */
4524         memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
4525                rte_pktmbuf_tailroom(ut_params->ibuf));
4526
4527         plaintext_len = ceil_byte_length(tdata->plaintext.len + extra_offset);
4528         /*
4529          * Append data which is padded to a
4530          * multiple of the algorithms block size
4531          */
4532         plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16);
4533
4534         plaintext = (uint8_t *) rte_pktmbuf_append(ut_params->ibuf,
4535                                                 plaintext_pad_len);
4536
4537         rte_pktmbuf_append(ut_params->obuf, plaintext_pad_len);
4538
4539         memcpy(plaintext, tdata->plaintext.data, (tdata->plaintext.len >> 3));
4540         buffer_shift_right(plaintext, tdata->plaintext.len, extra_offset);
4541
4542 #ifdef RTE_APP_TEST_DEBUG
4543         rte_hexdump(stdout, "plaintext:", plaintext, tdata->plaintext.len);
4544 #endif
4545         /* Create SNOW 3G operation */
4546         retval = create_wireless_algo_cipher_operation_oop(tdata->cipher_iv.data,
4547                                         tdata->cipher_iv.len,
4548                                         tdata->validCipherLenInBits.len,
4549                                         extra_offset);
4550         if (retval < 0)
4551                 return retval;
4552
4553         if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
4554                 process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
4555                         ut_params->op, 1, 0, 1, tdata->cipher_iv.len);
4556         else
4557                 ut_params->op = process_crypto_request(ts_params->valid_devs[0],
4558                                                 ut_params->op);
4559         TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
4560
4561         ut_params->obuf = ut_params->op->sym->m_dst;
4562         if (ut_params->obuf)
4563                 ciphertext = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *);
4564         else
4565                 ciphertext = plaintext;
4566
4567 #ifdef RTE_APP_TEST_DEBUG
4568         rte_hexdump(stdout, "ciphertext:", ciphertext, plaintext_len);
4569 #endif
4570
4571         expected_ciphertext_shifted = rte_malloc(NULL, plaintext_len, 8);
4572
4573         TEST_ASSERT_NOT_NULL(expected_ciphertext_shifted,
4574                         "failed to reserve memory for ciphertext shifted\n");
4575
4576         memcpy(expected_ciphertext_shifted, tdata->ciphertext.data,
4577                         ceil_byte_length(tdata->ciphertext.len));
4578         buffer_shift_right(expected_ciphertext_shifted, tdata->ciphertext.len,
4579                         extra_offset);
4580         /* Validate obuf */
4581         TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT_OFFSET(
4582                 ciphertext,
4583                 expected_ciphertext_shifted,
4584                 tdata->validDataLenInBits.len,
4585                 extra_offset,
4586                 "SNOW 3G Ciphertext data not as expected");
4587         return 0;
4588 }
4589
4590 static int test_snow3g_decryption(const struct snow3g_test_data *tdata)
4591 {
4592         struct crypto_testsuite_params *ts_params = &testsuite_params;
4593         struct crypto_unittest_params *ut_params = &unittest_params;
4594
4595         int retval;
4596
4597         uint8_t *plaintext, *ciphertext;
4598         unsigned ciphertext_pad_len;
4599         unsigned ciphertext_len;
4600         struct rte_cryptodev_info dev_info;
4601
4602         rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
4603         uint64_t feat_flags = dev_info.feature_flags;
4604
4605         if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
4606                         (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
4607                 printf("Device doesn't support RAW data-path APIs.\n");
4608                 return TEST_SKIPPED;
4609         }
4610
4611         if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
4612                 return TEST_SKIPPED;
4613
4614         /* Verify the capabilities */
4615         struct rte_cryptodev_sym_capability_idx cap_idx;
4616         cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
4617         cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_SNOW3G_UEA2;
4618         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
4619                         &cap_idx) == NULL)
4620                 return TEST_SKIPPED;
4621
4622         /* Create SNOW 3G session */
4623         retval = create_wireless_algo_cipher_session(ts_params->valid_devs[0],
4624                                         RTE_CRYPTO_CIPHER_OP_DECRYPT,
4625                                         RTE_CRYPTO_CIPHER_SNOW3G_UEA2,
4626                                         tdata->key.data, tdata->key.len,
4627                                         tdata->cipher_iv.len);
4628         if (retval < 0)
4629                 return retval;
4630
4631         ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
4632
4633         /* Clear mbuf payload */
4634         memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
4635                rte_pktmbuf_tailroom(ut_params->ibuf));
4636
4637         ciphertext_len = ceil_byte_length(tdata->ciphertext.len);
4638         /* Append data which is padded to a multiple of */
4639         /* the algorithms block size */
4640         ciphertext_pad_len = RTE_ALIGN_CEIL(ciphertext_len, 16);
4641         ciphertext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
4642                                 ciphertext_pad_len);
4643         memcpy(ciphertext, tdata->ciphertext.data, ciphertext_len);
4644
4645         debug_hexdump(stdout, "ciphertext:", ciphertext, ciphertext_len);
4646
4647         /* Create SNOW 3G operation */
4648         retval = create_wireless_algo_cipher_operation(tdata->cipher_iv.data,
4649                                         tdata->cipher_iv.len,
4650                                         tdata->validCipherLenInBits.len,
4651                                         tdata->cipher.offset_bits);
4652         if (retval < 0)
4653                 return retval;
4654
4655         if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
4656                 process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
4657                                 ut_params->op, 1, 0, 1, tdata->cipher_iv.len);
4658         else
4659                 ut_params->op = process_crypto_request(ts_params->valid_devs[0],
4660                                                 ut_params->op);
4661         TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
4662         ut_params->obuf = ut_params->op->sym->m_dst;
4663         if (ut_params->obuf)
4664                 plaintext = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *);
4665         else
4666                 plaintext = ciphertext;
4667
4668         debug_hexdump(stdout, "plaintext:", plaintext, ciphertext_len);
4669
4670         /* Validate obuf */
4671         TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(plaintext,
4672                                 tdata->plaintext.data,
4673                                 tdata->validDataLenInBits.len,
4674                                 "SNOW 3G Plaintext data not as expected");
4675         return 0;
4676 }
4677
4678 static int test_snow3g_decryption_oop(const struct snow3g_test_data *tdata)
4679 {
4680         struct crypto_testsuite_params *ts_params = &testsuite_params;
4681         struct crypto_unittest_params *ut_params = &unittest_params;
4682
4683         int retval;
4684
4685         uint8_t *plaintext, *ciphertext;
4686         unsigned ciphertext_pad_len;
4687         unsigned ciphertext_len;
4688         struct rte_cryptodev_info dev_info;
4689
4690         rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
4691         uint64_t feat_flags = dev_info.feature_flags;
4692
4693         if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
4694                         (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
4695                 printf("Device does not support RAW data-path APIs.\n");
4696                 return -ENOTSUP;
4697         }
4698         /* Verify the capabilities */
4699         struct rte_cryptodev_sym_capability_idx cap_idx;
4700         cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
4701         cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_SNOW3G_UEA2;
4702         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
4703                         &cap_idx) == NULL)
4704                 return TEST_SKIPPED;
4705
4706         if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
4707                 return TEST_SKIPPED;
4708
4709         if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
4710                 return TEST_SKIPPED;
4711
4712         /* Create SNOW 3G session */
4713         retval = create_wireless_algo_cipher_session(ts_params->valid_devs[0],
4714                                         RTE_CRYPTO_CIPHER_OP_DECRYPT,
4715                                         RTE_CRYPTO_CIPHER_SNOW3G_UEA2,
4716                                         tdata->key.data, tdata->key.len,
4717                                         tdata->cipher_iv.len);
4718         if (retval < 0)
4719                 return retval;
4720
4721         ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
4722         ut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
4723
4724         TEST_ASSERT_NOT_NULL(ut_params->ibuf,
4725                         "Failed to allocate input buffer");
4726         TEST_ASSERT_NOT_NULL(ut_params->obuf,
4727                         "Failed to allocate output buffer");
4728
4729         /* Clear mbuf payload */
4730         memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
4731                rte_pktmbuf_tailroom(ut_params->ibuf));
4732
4733         memset(rte_pktmbuf_mtod(ut_params->obuf, uint8_t *), 0,
4734                        rte_pktmbuf_tailroom(ut_params->obuf));
4735
4736         ciphertext_len = ceil_byte_length(tdata->ciphertext.len);
4737         /* Append data which is padded to a multiple of */
4738         /* the algorithms block size */
4739         ciphertext_pad_len = RTE_ALIGN_CEIL(ciphertext_len, 16);
4740         ciphertext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
4741                                 ciphertext_pad_len);
4742         rte_pktmbuf_append(ut_params->obuf, ciphertext_pad_len);
4743         memcpy(ciphertext, tdata->ciphertext.data, ciphertext_len);
4744
4745         debug_hexdump(stdout, "ciphertext:", ciphertext, ciphertext_len);
4746
4747         /* Create SNOW 3G operation */
4748         retval = create_wireless_algo_cipher_operation_oop(tdata->cipher_iv.data,
4749                                         tdata->cipher_iv.len,
4750                                         tdata->validCipherLenInBits.len,
4751                                         0);
4752         if (retval < 0)
4753                 return retval;
4754
4755         if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
4756                 process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
4757                         ut_params->op, 1, 0, 1, tdata->cipher_iv.len);
4758         else
4759                 ut_params->op = process_crypto_request(ts_params->valid_devs[0],
4760                                                 ut_params->op);
4761         TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
4762         ut_params->obuf = ut_params->op->sym->m_dst;
4763         if (ut_params->obuf)
4764                 plaintext = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *);
4765         else
4766                 plaintext = ciphertext;
4767
4768         debug_hexdump(stdout, "plaintext:", plaintext, ciphertext_len);
4769
4770         /* Validate obuf */
4771         TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(plaintext,
4772                                 tdata->plaintext.data,
4773                                 tdata->validDataLenInBits.len,
4774                                 "SNOW 3G Plaintext data not as expected");
4775         return 0;
4776 }
4777
4778 static int
4779 test_zuc_cipher_auth(const struct wireless_test_data *tdata)
4780 {
4781         struct crypto_testsuite_params *ts_params = &testsuite_params;
4782         struct crypto_unittest_params *ut_params = &unittest_params;
4783
4784         int retval;
4785
4786         uint8_t *plaintext, *ciphertext;
4787         unsigned int plaintext_pad_len;
4788         unsigned int plaintext_len;
4789
4790         struct rte_cryptodev_info dev_info;
4791         struct rte_cryptodev_sym_capability_idx cap_idx;
4792
4793         rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
4794         uint64_t feat_flags = dev_info.feature_flags;
4795
4796         if (!(feat_flags & RTE_CRYPTODEV_FF_NON_BYTE_ALIGNED_DATA) &&
4797                         ((tdata->validAuthLenInBits.len % 8 != 0) ||
4798                         (tdata->validDataLenInBits.len % 8 != 0))) {
4799                 printf("Device doesn't support NON-Byte Aligned Data.\n");
4800                 return TEST_SKIPPED;
4801         }
4802
4803         if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
4804                         (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
4805                 printf("Device doesn't support RAW data-path APIs.\n");
4806                 return TEST_SKIPPED;
4807         }
4808
4809         if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
4810                 return TEST_SKIPPED;
4811
4812         /* Check if device supports ZUC EEA3 */
4813         cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
4814         cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_ZUC_EEA3;
4815
4816         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
4817                         &cap_idx) == NULL)
4818                 return TEST_SKIPPED;
4819
4820         /* Check if device supports ZUC EIA3 */
4821         cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
4822         cap_idx.algo.auth = RTE_CRYPTO_AUTH_ZUC_EIA3;
4823
4824         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
4825                         &cap_idx) == NULL)
4826                 return TEST_SKIPPED;
4827
4828         /* Create ZUC session */
4829         retval = create_zuc_cipher_auth_encrypt_generate_session(
4830                         ts_params->valid_devs[0],
4831                         tdata);
4832         if (retval != 0)
4833                 return retval;
4834         ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
4835
4836         /* clear mbuf payload */
4837         memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
4838                         rte_pktmbuf_tailroom(ut_params->ibuf));
4839
4840         plaintext_len = ceil_byte_length(tdata->plaintext.len);
4841         /* Append data which is padded to a multiple of */
4842         /* the algorithms block size */
4843         plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16);
4844         plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
4845                                 plaintext_pad_len);
4846         memcpy(plaintext, tdata->plaintext.data, plaintext_len);
4847
4848         debug_hexdump(stdout, "plaintext:", plaintext, plaintext_len);
4849
4850         /* Create ZUC operation */
4851         retval = create_zuc_cipher_hash_generate_operation(tdata);
4852         if (retval < 0)
4853                 return retval;
4854
4855         if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
4856                 process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
4857                                 ut_params->op, 1, 1, 1, tdata->cipher_iv.len);
4858         else
4859                 ut_params->op = process_crypto_request(ts_params->valid_devs[0],
4860                         ut_params->op);
4861         TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
4862         ut_params->obuf = ut_params->op->sym->m_src;
4863         if (ut_params->obuf)
4864                 ciphertext = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *);
4865         else
4866                 ciphertext = plaintext;
4867
4868         debug_hexdump(stdout, "ciphertext:", ciphertext, plaintext_len);
4869         /* Validate obuf */
4870         TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
4871                         ciphertext,
4872                         tdata->ciphertext.data,
4873                         tdata->validDataLenInBits.len,
4874                         "ZUC Ciphertext data not as expected");
4875
4876         ut_params->digest = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *)
4877             + plaintext_pad_len;
4878
4879         /* Validate obuf */
4880         TEST_ASSERT_BUFFERS_ARE_EQUAL(
4881                         ut_params->digest,
4882                         tdata->digest.data,
4883                         4,
4884                         "ZUC Generated auth tag not as expected");
4885         return 0;
4886 }
4887
4888 static int
4889 test_snow3g_cipher_auth(const struct snow3g_test_data *tdata)
4890 {
4891         struct crypto_testsuite_params *ts_params = &testsuite_params;
4892         struct crypto_unittest_params *ut_params = &unittest_params;
4893
4894         int retval;
4895
4896         uint8_t *plaintext, *ciphertext;
4897         unsigned plaintext_pad_len;
4898         unsigned plaintext_len;
4899         struct rte_cryptodev_info dev_info;
4900
4901         rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
4902         uint64_t feat_flags = dev_info.feature_flags;
4903
4904         if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
4905                         (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
4906                 printf("Device doesn't support RAW data-path APIs.\n");
4907                 return TEST_SKIPPED;
4908         }
4909
4910         if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
4911                 return TEST_SKIPPED;
4912
4913         /* Verify the capabilities */
4914         struct rte_cryptodev_sym_capability_idx cap_idx;
4915         cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
4916         cap_idx.algo.auth = RTE_CRYPTO_AUTH_SNOW3G_UIA2;
4917         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
4918                         &cap_idx) == NULL)
4919                 return TEST_SKIPPED;
4920         cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
4921         cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_SNOW3G_UEA2;
4922         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
4923                         &cap_idx) == NULL)
4924                 return TEST_SKIPPED;
4925
4926         /* Create SNOW 3G session */
4927         retval = create_wireless_algo_cipher_auth_session(ts_params->valid_devs[0],
4928                         RTE_CRYPTO_CIPHER_OP_ENCRYPT,
4929                         RTE_CRYPTO_AUTH_OP_GENERATE,
4930                         RTE_CRYPTO_AUTH_SNOW3G_UIA2,
4931                         RTE_CRYPTO_CIPHER_SNOW3G_UEA2,
4932                         tdata->key.data, tdata->key.len,
4933                         tdata->auth_iv.len, tdata->digest.len,
4934                         tdata->cipher_iv.len);
4935         if (retval != 0)
4936                 return retval;
4937         ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
4938
4939         /* clear mbuf payload */
4940         memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
4941                         rte_pktmbuf_tailroom(ut_params->ibuf));
4942
4943         plaintext_len = ceil_byte_length(tdata->plaintext.len);
4944         /* Append data which is padded to a multiple of */
4945         /* the algorithms block size */
4946         plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16);
4947         plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
4948                                 plaintext_pad_len);
4949         memcpy(plaintext, tdata->plaintext.data, plaintext_len);
4950
4951         debug_hexdump(stdout, "plaintext:", plaintext, plaintext_len);
4952
4953         /* Create SNOW 3G operation */
4954         retval = create_wireless_algo_cipher_hash_operation(tdata->digest.data,
4955                         tdata->digest.len, tdata->auth_iv.data,
4956                         tdata->auth_iv.len,
4957                         plaintext_pad_len, RTE_CRYPTO_AUTH_OP_GENERATE,
4958                         tdata->cipher_iv.data, tdata->cipher_iv.len,
4959                         tdata->validCipherLenInBits.len,
4960                         0,
4961                         tdata->validAuthLenInBits.len,
4962                         0
4963                         );
4964         if (retval < 0)
4965                 return retval;
4966
4967         if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
4968                 process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
4969                                 ut_params->op, 1, 1, 1, tdata->cipher_iv.len);
4970         else
4971                 ut_params->op = process_crypto_request(ts_params->valid_devs[0],
4972                         ut_params->op);
4973         TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
4974         ut_params->obuf = ut_params->op->sym->m_src;
4975         if (ut_params->obuf)
4976                 ciphertext = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *);
4977         else
4978                 ciphertext = plaintext;
4979
4980         debug_hexdump(stdout, "ciphertext:", ciphertext, plaintext_len);
4981         /* Validate obuf */
4982         TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
4983                         ciphertext,
4984                         tdata->ciphertext.data,
4985                         tdata->validDataLenInBits.len,
4986                         "SNOW 3G Ciphertext data not as expected");
4987
4988         ut_params->digest = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *)
4989             + plaintext_pad_len;
4990
4991         /* Validate obuf */
4992         TEST_ASSERT_BUFFERS_ARE_EQUAL(
4993                         ut_params->digest,
4994                         tdata->digest.data,
4995                         DIGEST_BYTE_LENGTH_SNOW3G_UIA2,
4996                         "SNOW 3G Generated auth tag not as expected");
4997         return 0;
4998 }
4999
5000 static int
5001 test_snow3g_auth_cipher(const struct snow3g_test_data *tdata,
5002         uint8_t op_mode, uint8_t verify)
5003 {
5004         struct crypto_testsuite_params *ts_params = &testsuite_params;
5005         struct crypto_unittest_params *ut_params = &unittest_params;
5006
5007         int retval;
5008
5009         uint8_t *plaintext = NULL, *ciphertext = NULL;
5010         unsigned int plaintext_pad_len;
5011         unsigned int plaintext_len;
5012         unsigned int ciphertext_pad_len;
5013         unsigned int ciphertext_len;
5014
5015         struct rte_cryptodev_info dev_info;
5016
5017         /* Verify the capabilities */
5018         struct rte_cryptodev_sym_capability_idx cap_idx;
5019         cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
5020         cap_idx.algo.auth = RTE_CRYPTO_AUTH_SNOW3G_UIA2;
5021         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
5022                         &cap_idx) == NULL)
5023                 return TEST_SKIPPED;
5024         cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
5025         cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_SNOW3G_UEA2;
5026         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
5027                         &cap_idx) == NULL)
5028                 return TEST_SKIPPED;
5029
5030         if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
5031                 return TEST_SKIPPED;
5032
5033         rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
5034
5035         uint64_t feat_flags = dev_info.feature_flags;
5036
5037         if (op_mode == OUT_OF_PLACE) {
5038                 if (!(feat_flags & RTE_CRYPTODEV_FF_DIGEST_ENCRYPTED)) {
5039                         printf("Device doesn't support digest encrypted.\n");
5040                         return TEST_SKIPPED;
5041                 }
5042                 if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
5043                         return TEST_SKIPPED;
5044         }
5045
5046         if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
5047                         (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
5048                 printf("Device doesn't support RAW data-path APIs.\n");
5049                 return TEST_SKIPPED;
5050         }
5051
5052         /* Create SNOW 3G session */
5053         retval = create_wireless_algo_auth_cipher_session(
5054                         ts_params->valid_devs[0],
5055                         (verify ? RTE_CRYPTO_CIPHER_OP_DECRYPT
5056                                         : RTE_CRYPTO_CIPHER_OP_ENCRYPT),
5057                         (verify ? RTE_CRYPTO_AUTH_OP_VERIFY
5058                                         : RTE_CRYPTO_AUTH_OP_GENERATE),
5059                         RTE_CRYPTO_AUTH_SNOW3G_UIA2,
5060                         RTE_CRYPTO_CIPHER_SNOW3G_UEA2,
5061                         tdata->key.data, tdata->key.len,
5062                         tdata->auth_iv.len, tdata->digest.len,
5063                         tdata->cipher_iv.len);
5064         if (retval != 0)
5065                 return retval;
5066
5067         ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
5068         if (op_mode == OUT_OF_PLACE)
5069                 ut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
5070
5071         /* clear mbuf payload */
5072         memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
5073                 rte_pktmbuf_tailroom(ut_params->ibuf));
5074         if (op_mode == OUT_OF_PLACE)
5075                 memset(rte_pktmbuf_mtod(ut_params->obuf, uint8_t *), 0,
5076                         rte_pktmbuf_tailroom(ut_params->obuf));
5077
5078         ciphertext_len = ceil_byte_length(tdata->ciphertext.len);
5079         plaintext_len = ceil_byte_length(tdata->plaintext.len);
5080         ciphertext_pad_len = RTE_ALIGN_CEIL(ciphertext_len, 16);
5081         plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16);
5082
5083         if (verify) {
5084                 ciphertext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
5085                                         ciphertext_pad_len);
5086                 memcpy(ciphertext, tdata->ciphertext.data, ciphertext_len);
5087                 if (op_mode == OUT_OF_PLACE)
5088                         rte_pktmbuf_append(ut_params->obuf, ciphertext_pad_len);
5089                 debug_hexdump(stdout, "ciphertext:", ciphertext,
5090                         ciphertext_len);
5091         } else {
5092                 plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
5093                                         plaintext_pad_len);
5094                 memcpy(plaintext, tdata->plaintext.data, plaintext_len);
5095                 if (op_mode == OUT_OF_PLACE)
5096                         rte_pktmbuf_append(ut_params->obuf, plaintext_pad_len);
5097                 debug_hexdump(stdout, "plaintext:", plaintext, plaintext_len);
5098         }
5099
5100         /* Create SNOW 3G operation */
5101         retval = create_wireless_algo_auth_cipher_operation(
5102                 tdata->digest.data, tdata->digest.len,
5103                 tdata->cipher_iv.data, tdata->cipher_iv.len,
5104                 tdata->auth_iv.data, tdata->auth_iv.len,
5105                 (tdata->digest.offset_bytes == 0 ?
5106                 (verify ? ciphertext_pad_len : plaintext_pad_len)
5107                         : tdata->digest.offset_bytes),
5108                 tdata->validCipherLenInBits.len,
5109                 tdata->cipher.offset_bits,
5110                 tdata->validAuthLenInBits.len,
5111                 tdata->auth.offset_bits,
5112                 op_mode, 0, verify);
5113
5114         if (retval < 0)
5115                 return retval;
5116
5117         if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
5118                 process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
5119                                 ut_params->op, 1, 1, 1, tdata->cipher_iv.len);
5120         else
5121                 ut_params->op = process_crypto_request(ts_params->valid_devs[0],
5122                         ut_params->op);
5123
5124         TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
5125
5126         ut_params->obuf = (op_mode == IN_PLACE ?
5127                 ut_params->op->sym->m_src : ut_params->op->sym->m_dst);
5128
5129         if (verify) {
5130                 if (ut_params->obuf)
5131                         plaintext = rte_pktmbuf_mtod(ut_params->obuf,
5132                                                         uint8_t *);
5133                 else
5134                         plaintext = ciphertext +
5135                                 (tdata->cipher.offset_bits >> 3);
5136
5137                 debug_hexdump(stdout, "plaintext:", plaintext,
5138                         (tdata->plaintext.len >> 3) - tdata->digest.len);
5139                 debug_hexdump(stdout, "plaintext expected:",
5140                         tdata->plaintext.data,
5141                         (tdata->plaintext.len >> 3) - tdata->digest.len);
5142         } else {
5143                 if (ut_params->obuf)
5144                         ciphertext = rte_pktmbuf_mtod(ut_params->obuf,
5145                                                         uint8_t *);
5146                 else
5147                         ciphertext = plaintext;
5148
5149                 debug_hexdump(stdout, "ciphertext:", ciphertext,
5150                         ciphertext_len);
5151                 debug_hexdump(stdout, "ciphertext expected:",
5152                         tdata->ciphertext.data, tdata->ciphertext.len >> 3);
5153
5154                 ut_params->digest = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *)
5155                         + (tdata->digest.offset_bytes == 0 ?
5156                 plaintext_pad_len : tdata->digest.offset_bytes);
5157
5158                 debug_hexdump(stdout, "digest:", ut_params->digest,
5159                         tdata->digest.len);
5160                 debug_hexdump(stdout, "digest expected:", tdata->digest.data,
5161                                 tdata->digest.len);
5162         }
5163
5164         /* Validate obuf */
5165         if (verify) {
5166                 TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT_OFFSET(
5167                         plaintext,
5168                         tdata->plaintext.data,
5169                         (tdata->plaintext.len - tdata->cipher.offset_bits -
5170                          (tdata->digest.len << 3)),
5171                         tdata->cipher.offset_bits,
5172                         "SNOW 3G Plaintext data not as expected");
5173         } else {
5174                 TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT_OFFSET(
5175                         ciphertext,
5176                         tdata->ciphertext.data,
5177                         (tdata->validDataLenInBits.len -
5178                          tdata->cipher.offset_bits),
5179                         tdata->cipher.offset_bits,
5180                         "SNOW 3G Ciphertext data not as expected");
5181
5182                 TEST_ASSERT_BUFFERS_ARE_EQUAL(
5183                         ut_params->digest,
5184                         tdata->digest.data,
5185                         DIGEST_BYTE_LENGTH_SNOW3G_UIA2,
5186                         "SNOW 3G Generated auth tag not as expected");
5187         }
5188         return 0;
5189 }
5190
5191 static int
5192 test_snow3g_auth_cipher_sgl(const struct snow3g_test_data *tdata,
5193         uint8_t op_mode, uint8_t verify)
5194 {
5195         struct crypto_testsuite_params *ts_params = &testsuite_params;
5196         struct crypto_unittest_params *ut_params = &unittest_params;
5197
5198         int retval;
5199
5200         const uint8_t *plaintext = NULL;
5201         const uint8_t *ciphertext = NULL;
5202         const uint8_t *digest = NULL;
5203         unsigned int plaintext_pad_len;
5204         unsigned int plaintext_len;
5205         unsigned int ciphertext_pad_len;
5206         unsigned int ciphertext_len;
5207         uint8_t buffer[10000];
5208         uint8_t digest_buffer[10000];
5209
5210         struct rte_cryptodev_info dev_info;
5211
5212         /* Verify the capabilities */
5213         struct rte_cryptodev_sym_capability_idx cap_idx;
5214         cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
5215         cap_idx.algo.auth = RTE_CRYPTO_AUTH_SNOW3G_UIA2;
5216         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
5217                         &cap_idx) == NULL)
5218                 return TEST_SKIPPED;
5219         cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
5220         cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_SNOW3G_UEA2;
5221         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
5222                         &cap_idx) == NULL)
5223                 return TEST_SKIPPED;
5224
5225         if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
5226                 return TEST_SKIPPED;
5227
5228         rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
5229
5230         uint64_t feat_flags = dev_info.feature_flags;
5231
5232         if (op_mode == IN_PLACE) {
5233                 if (!(feat_flags & RTE_CRYPTODEV_FF_IN_PLACE_SGL)) {
5234                         printf("Device doesn't support in-place scatter-gather "
5235                                         "in both input and output mbufs.\n");
5236                         return TEST_SKIPPED;
5237                 }
5238                 if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
5239                         (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
5240                         printf("Device doesn't support RAW data-path APIs.\n");
5241                         return TEST_SKIPPED;
5242                 }
5243         } else {
5244                 if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
5245                         return TEST_SKIPPED;
5246                 if (!(feat_flags & RTE_CRYPTODEV_FF_OOP_SGL_IN_SGL_OUT)) {
5247                         printf("Device doesn't support out-of-place scatter-gather "
5248                                         "in both input and output mbufs.\n");
5249                         return TEST_SKIPPED;
5250                 }
5251                 if (!(feat_flags & RTE_CRYPTODEV_FF_DIGEST_ENCRYPTED)) {
5252                         printf("Device doesn't support digest encrypted.\n");
5253                         return TEST_SKIPPED;
5254                 }
5255         }
5256
5257         /* Create SNOW 3G session */
5258         retval = create_wireless_algo_auth_cipher_session(
5259                         ts_params->valid_devs[0],
5260                         (verify ? RTE_CRYPTO_CIPHER_OP_DECRYPT
5261                                         : RTE_CRYPTO_CIPHER_OP_ENCRYPT),
5262                         (verify ? RTE_CRYPTO_AUTH_OP_VERIFY
5263                                         : RTE_CRYPTO_AUTH_OP_GENERATE),
5264                         RTE_CRYPTO_AUTH_SNOW3G_UIA2,
5265                         RTE_CRYPTO_CIPHER_SNOW3G_UEA2,
5266                         tdata->key.data, tdata->key.len,
5267                         tdata->auth_iv.len, tdata->digest.len,
5268                         tdata->cipher_iv.len);
5269
5270         if (retval != 0)
5271                 return retval;
5272
5273         ciphertext_len = ceil_byte_length(tdata->ciphertext.len);
5274         plaintext_len = ceil_byte_length(tdata->plaintext.len);
5275         ciphertext_pad_len = RTE_ALIGN_CEIL(ciphertext_len, 16);
5276         plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16);
5277
5278         ut_params->ibuf = create_segmented_mbuf(ts_params->mbuf_pool,
5279                         plaintext_pad_len, 15, 0);
5280         TEST_ASSERT_NOT_NULL(ut_params->ibuf,
5281                         "Failed to allocate input buffer in mempool");
5282
5283         if (op_mode == OUT_OF_PLACE) {
5284                 ut_params->obuf = create_segmented_mbuf(ts_params->mbuf_pool,
5285                                 plaintext_pad_len, 15, 0);
5286                 TEST_ASSERT_NOT_NULL(ut_params->obuf,
5287                                 "Failed to allocate output buffer in mempool");
5288         }
5289
5290         if (verify) {
5291                 pktmbuf_write(ut_params->ibuf, 0, ciphertext_len,
5292                         tdata->ciphertext.data);
5293                 ciphertext = rte_pktmbuf_read(ut_params->ibuf, 0,
5294                                         ciphertext_len, buffer);
5295                 debug_hexdump(stdout, "ciphertext:", ciphertext,
5296                         ciphertext_len);
5297         } else {
5298                 pktmbuf_write(ut_params->ibuf, 0, plaintext_len,
5299                         tdata->plaintext.data);
5300                 plaintext = rte_pktmbuf_read(ut_params->ibuf, 0,
5301                                         plaintext_len, buffer);
5302                 debug_hexdump(stdout, "plaintext:", plaintext,
5303                         plaintext_len);
5304         }
5305         memset(buffer, 0, sizeof(buffer));
5306
5307         /* Create SNOW 3G operation */
5308         retval = create_wireless_algo_auth_cipher_operation(
5309                 tdata->digest.data, tdata->digest.len,
5310                 tdata->cipher_iv.data, tdata->cipher_iv.len,
5311                 tdata->auth_iv.data, tdata->auth_iv.len,
5312                 (tdata->digest.offset_bytes == 0 ?
5313                 (verify ? ciphertext_pad_len : plaintext_pad_len)
5314                         : tdata->digest.offset_bytes),
5315                 tdata->validCipherLenInBits.len,
5316                 tdata->cipher.offset_bits,
5317                 tdata->validAuthLenInBits.len,
5318                 tdata->auth.offset_bits,
5319                 op_mode, 1, verify);
5320
5321         if (retval < 0)
5322                 return retval;
5323
5324         if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
5325                 process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
5326                                 ut_params->op, 1, 1, 1, tdata->cipher_iv.len);
5327         else
5328                 ut_params->op = process_crypto_request(ts_params->valid_devs[0],
5329                         ut_params->op);
5330
5331         TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
5332
5333         ut_params->obuf = (op_mode == IN_PLACE ?
5334                 ut_params->op->sym->m_src : ut_params->op->sym->m_dst);
5335
5336         if (verify) {
5337                 if (ut_params->obuf)
5338                         plaintext = rte_pktmbuf_read(ut_params->obuf, 0,
5339                                         plaintext_len, buffer);
5340                 else
5341                         plaintext = rte_pktmbuf_read(ut_params->ibuf, 0,
5342                                         plaintext_len, buffer);
5343
5344                 debug_hexdump(stdout, "plaintext:", plaintext,
5345                         (tdata->plaintext.len >> 3) - tdata->digest.len);
5346                 debug_hexdump(stdout, "plaintext expected:",
5347                         tdata->plaintext.data,
5348                         (tdata->plaintext.len >> 3) - tdata->digest.len);
5349         } else {
5350                 if (ut_params->obuf)
5351                         ciphertext = rte_pktmbuf_read(ut_params->obuf, 0,
5352                                         ciphertext_len, buffer);
5353                 else
5354                         ciphertext = rte_pktmbuf_read(ut_params->ibuf, 0,
5355                                         ciphertext_len, buffer);
5356
5357                 debug_hexdump(stdout, "ciphertext:", ciphertext,
5358                         ciphertext_len);
5359                 debug_hexdump(stdout, "ciphertext expected:",
5360                         tdata->ciphertext.data, tdata->ciphertext.len >> 3);
5361
5362                 if (ut_params->obuf)
5363                         digest = rte_pktmbuf_read(ut_params->obuf,
5364                                 (tdata->digest.offset_bytes == 0 ?
5365                                 plaintext_pad_len : tdata->digest.offset_bytes),
5366                                 tdata->digest.len, digest_buffer);
5367                 else
5368                         digest = rte_pktmbuf_read(ut_params->ibuf,
5369                                 (tdata->digest.offset_bytes == 0 ?
5370                                 plaintext_pad_len : tdata->digest.offset_bytes),
5371                                 tdata->digest.len, digest_buffer);
5372
5373                 debug_hexdump(stdout, "digest:", digest,
5374                         tdata->digest.len);
5375                 debug_hexdump(stdout, "digest expected:",
5376                         tdata->digest.data, tdata->digest.len);
5377         }
5378
5379         /* Validate obuf */
5380         if (verify) {
5381                 TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT_OFFSET(
5382                         plaintext,
5383                         tdata->plaintext.data,
5384                         (tdata->plaintext.len - tdata->cipher.offset_bits -
5385                          (tdata->digest.len << 3)),
5386                         tdata->cipher.offset_bits,
5387                         "SNOW 3G Plaintext data not as expected");
5388         } else {
5389                 TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT_OFFSET(
5390                         ciphertext,
5391                         tdata->ciphertext.data,
5392                         (tdata->validDataLenInBits.len -
5393                          tdata->cipher.offset_bits),
5394                         tdata->cipher.offset_bits,
5395                         "SNOW 3G Ciphertext data not as expected");
5396
5397                 TEST_ASSERT_BUFFERS_ARE_EQUAL(
5398                         digest,
5399                         tdata->digest.data,
5400                         DIGEST_BYTE_LENGTH_SNOW3G_UIA2,
5401                         "SNOW 3G Generated auth tag not as expected");
5402         }
5403         return 0;
5404 }
5405
5406 static int
5407 test_kasumi_auth_cipher(const struct kasumi_test_data *tdata,
5408         uint8_t op_mode, uint8_t verify)
5409 {
5410         struct crypto_testsuite_params *ts_params = &testsuite_params;
5411         struct crypto_unittest_params *ut_params = &unittest_params;
5412
5413         int retval;
5414
5415         uint8_t *plaintext = NULL, *ciphertext = NULL;
5416         unsigned int plaintext_pad_len;
5417         unsigned int plaintext_len;
5418         unsigned int ciphertext_pad_len;
5419         unsigned int ciphertext_len;
5420
5421         struct rte_cryptodev_info dev_info;
5422
5423         /* Verify the capabilities */
5424         struct rte_cryptodev_sym_capability_idx cap_idx;
5425         cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
5426         cap_idx.algo.auth = RTE_CRYPTO_AUTH_KASUMI_F9;
5427         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
5428                         &cap_idx) == NULL)
5429                 return TEST_SKIPPED;
5430         cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
5431         cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_KASUMI_F8;
5432         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
5433                         &cap_idx) == NULL)
5434                 return TEST_SKIPPED;
5435
5436         rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
5437
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 TEST_SKIPPED;
5444         }
5445
5446         if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
5447                 return TEST_SKIPPED;
5448
5449         if (op_mode == OUT_OF_PLACE) {
5450                 if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
5451                         return TEST_SKIPPED;
5452                 if (!(feat_flags & RTE_CRYPTODEV_FF_DIGEST_ENCRYPTED)) {
5453                         printf("Device doesn't support digest encrypted.\n");
5454                         return TEST_SKIPPED;
5455                 }
5456         }
5457
5458         /* Create KASUMI session */
5459         retval = create_wireless_algo_auth_cipher_session(
5460                         ts_params->valid_devs[0],
5461                         (verify ? RTE_CRYPTO_CIPHER_OP_DECRYPT
5462                                         : RTE_CRYPTO_CIPHER_OP_ENCRYPT),
5463                         (verify ? RTE_CRYPTO_AUTH_OP_VERIFY
5464                                         : RTE_CRYPTO_AUTH_OP_GENERATE),
5465                         RTE_CRYPTO_AUTH_KASUMI_F9,
5466                         RTE_CRYPTO_CIPHER_KASUMI_F8,
5467                         tdata->key.data, tdata->key.len,
5468                         0, tdata->digest.len,
5469                         tdata->cipher_iv.len);
5470
5471         if (retval != 0)
5472                 return retval;
5473
5474         ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
5475         if (op_mode == OUT_OF_PLACE)
5476                 ut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
5477
5478         /* clear mbuf payload */
5479         memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
5480                 rte_pktmbuf_tailroom(ut_params->ibuf));
5481         if (op_mode == OUT_OF_PLACE)
5482                 memset(rte_pktmbuf_mtod(ut_params->obuf, uint8_t *), 0,
5483                         rte_pktmbuf_tailroom(ut_params->obuf));
5484
5485         ciphertext_len = ceil_byte_length(tdata->ciphertext.len);
5486         plaintext_len = ceil_byte_length(tdata->plaintext.len);
5487         ciphertext_pad_len = RTE_ALIGN_CEIL(ciphertext_len, 16);
5488         plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16);
5489
5490         if (verify) {
5491                 ciphertext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
5492                                         ciphertext_pad_len);
5493                 memcpy(ciphertext, tdata->ciphertext.data, ciphertext_len);
5494                 if (op_mode == OUT_OF_PLACE)
5495                         rte_pktmbuf_append(ut_params->obuf, ciphertext_pad_len);
5496                 debug_hexdump(stdout, "ciphertext:", ciphertext,
5497                         ciphertext_len);
5498         } else {
5499                 plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
5500                                         plaintext_pad_len);
5501                 memcpy(plaintext, tdata->plaintext.data, plaintext_len);
5502                 if (op_mode == OUT_OF_PLACE)
5503                         rte_pktmbuf_append(ut_params->obuf, plaintext_pad_len);
5504                 debug_hexdump(stdout, "plaintext:", plaintext,
5505                         plaintext_len);
5506         }
5507
5508         /* Create KASUMI operation */
5509         retval = create_wireless_algo_auth_cipher_operation(
5510                 tdata->digest.data, tdata->digest.len,
5511                 tdata->cipher_iv.data, tdata->cipher_iv.len,
5512                 NULL, 0,
5513                 (tdata->digest.offset_bytes == 0 ?
5514                 (verify ? ciphertext_pad_len : plaintext_pad_len)
5515                         : tdata->digest.offset_bytes),
5516                 tdata->validCipherLenInBits.len,
5517                 tdata->validCipherOffsetInBits.len,
5518                 tdata->validAuthLenInBits.len,
5519                 0,
5520                 op_mode, 0, verify);
5521
5522         if (retval < 0)
5523                 return retval;
5524
5525         if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
5526                 process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
5527                                 ut_params->op, 1, 1, 1, tdata->cipher_iv.len);
5528         else
5529                 ut_params->op = process_crypto_request(ts_params->valid_devs[0],
5530                         ut_params->op);
5531
5532         TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
5533
5534         ut_params->obuf = (op_mode == IN_PLACE ?
5535                 ut_params->op->sym->m_src : ut_params->op->sym->m_dst);
5536
5537
5538         if (verify) {
5539                 if (ut_params->obuf)
5540                         plaintext = rte_pktmbuf_mtod(ut_params->obuf,
5541                                                         uint8_t *);
5542                 else
5543                         plaintext = ciphertext;
5544
5545                 debug_hexdump(stdout, "plaintext:", plaintext,
5546                         (tdata->plaintext.len >> 3) - tdata->digest.len);
5547                 debug_hexdump(stdout, "plaintext expected:",
5548                         tdata->plaintext.data,
5549                         (tdata->plaintext.len >> 3) - tdata->digest.len);
5550         } else {
5551                 if (ut_params->obuf)
5552                         ciphertext = rte_pktmbuf_mtod(ut_params->obuf,
5553                                                         uint8_t *);
5554                 else
5555                         ciphertext = plaintext;
5556
5557                 debug_hexdump(stdout, "ciphertext:", ciphertext,
5558                         ciphertext_len);
5559                 debug_hexdump(stdout, "ciphertext expected:",
5560                         tdata->ciphertext.data, tdata->ciphertext.len >> 3);
5561
5562                 ut_params->digest = rte_pktmbuf_mtod(
5563                         ut_params->obuf, uint8_t *) +
5564                         (tdata->digest.offset_bytes == 0 ?
5565                         plaintext_pad_len : tdata->digest.offset_bytes);
5566
5567                 debug_hexdump(stdout, "digest:", ut_params->digest,
5568                         tdata->digest.len);
5569                 debug_hexdump(stdout, "digest expected:",
5570                         tdata->digest.data, tdata->digest.len);
5571         }
5572
5573         /* Validate obuf */
5574         if (verify) {
5575                 TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
5576                         plaintext,
5577                         tdata->plaintext.data,
5578                         tdata->plaintext.len >> 3,
5579                         "KASUMI Plaintext data not as expected");
5580         } else {
5581                 TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
5582                         ciphertext,
5583                         tdata->ciphertext.data,
5584                         tdata->ciphertext.len >> 3,
5585                         "KASUMI Ciphertext data not as expected");
5586
5587                 TEST_ASSERT_BUFFERS_ARE_EQUAL(
5588                         ut_params->digest,
5589                         tdata->digest.data,
5590                         DIGEST_BYTE_LENGTH_KASUMI_F9,
5591                         "KASUMI Generated auth tag not as expected");
5592         }
5593         return 0;
5594 }
5595
5596 static int
5597 test_kasumi_auth_cipher_sgl(const struct kasumi_test_data *tdata,
5598         uint8_t op_mode, uint8_t verify)
5599 {
5600         struct crypto_testsuite_params *ts_params = &testsuite_params;
5601         struct crypto_unittest_params *ut_params = &unittest_params;
5602
5603         int retval;
5604
5605         const uint8_t *plaintext = NULL;
5606         const uint8_t *ciphertext = NULL;
5607         const uint8_t *digest = NULL;
5608         unsigned int plaintext_pad_len;
5609         unsigned int plaintext_len;
5610         unsigned int ciphertext_pad_len;
5611         unsigned int ciphertext_len;
5612         uint8_t buffer[10000];
5613         uint8_t digest_buffer[10000];
5614
5615         struct rte_cryptodev_info dev_info;
5616
5617         /* Verify the capabilities */
5618         struct rte_cryptodev_sym_capability_idx cap_idx;
5619         cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
5620         cap_idx.algo.auth = RTE_CRYPTO_AUTH_KASUMI_F9;
5621         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
5622                         &cap_idx) == NULL)
5623                 return TEST_SKIPPED;
5624         cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
5625         cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_KASUMI_F8;
5626         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
5627                         &cap_idx) == NULL)
5628                 return TEST_SKIPPED;
5629
5630         if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
5631                 return TEST_SKIPPED;
5632
5633         rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
5634
5635         uint64_t feat_flags = dev_info.feature_flags;
5636
5637         if (op_mode == IN_PLACE) {
5638                 if (!(feat_flags & RTE_CRYPTODEV_FF_IN_PLACE_SGL)) {
5639                         printf("Device doesn't support in-place scatter-gather "
5640                                         "in both input and output mbufs.\n");
5641                         return TEST_SKIPPED;
5642                 }
5643                 if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
5644                         (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
5645                         printf("Device doesn't support RAW data-path APIs.\n");
5646                         return TEST_SKIPPED;
5647                 }
5648         } else {
5649                 if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
5650                         return TEST_SKIPPED;
5651                 if (!(feat_flags & RTE_CRYPTODEV_FF_OOP_SGL_IN_SGL_OUT)) {
5652                         printf("Device doesn't support out-of-place scatter-gather "
5653                                         "in both input and output mbufs.\n");
5654                         return TEST_SKIPPED;
5655                 }
5656                 if (!(feat_flags & RTE_CRYPTODEV_FF_DIGEST_ENCRYPTED)) {
5657                         printf("Device doesn't support digest encrypted.\n");
5658                         return TEST_SKIPPED;
5659                 }
5660         }
5661
5662         /* Create KASUMI session */
5663         retval = create_wireless_algo_auth_cipher_session(
5664                         ts_params->valid_devs[0],
5665                         (verify ? RTE_CRYPTO_CIPHER_OP_DECRYPT
5666                                         : RTE_CRYPTO_CIPHER_OP_ENCRYPT),
5667                         (verify ? RTE_CRYPTO_AUTH_OP_VERIFY
5668                                         : RTE_CRYPTO_AUTH_OP_GENERATE),
5669                         RTE_CRYPTO_AUTH_KASUMI_F9,
5670                         RTE_CRYPTO_CIPHER_KASUMI_F8,
5671                         tdata->key.data, tdata->key.len,
5672                         0, tdata->digest.len,
5673                         tdata->cipher_iv.len);
5674
5675         if (retval != 0)
5676                 return retval;
5677
5678         ciphertext_len = ceil_byte_length(tdata->ciphertext.len);
5679         plaintext_len = ceil_byte_length(tdata->plaintext.len);
5680         ciphertext_pad_len = RTE_ALIGN_CEIL(ciphertext_len, 16);
5681         plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16);
5682
5683         ut_params->ibuf = create_segmented_mbuf(ts_params->mbuf_pool,
5684                         plaintext_pad_len, 15, 0);
5685         TEST_ASSERT_NOT_NULL(ut_params->ibuf,
5686                         "Failed to allocate input buffer in mempool");
5687
5688         if (op_mode == OUT_OF_PLACE) {
5689                 ut_params->obuf = create_segmented_mbuf(ts_params->mbuf_pool,
5690                                 plaintext_pad_len, 15, 0);
5691                 TEST_ASSERT_NOT_NULL(ut_params->obuf,
5692                                 "Failed to allocate output buffer in mempool");
5693         }
5694
5695         if (verify) {
5696                 pktmbuf_write(ut_params->ibuf, 0, ciphertext_len,
5697                         tdata->ciphertext.data);
5698                 ciphertext = rte_pktmbuf_read(ut_params->ibuf, 0,
5699                                         ciphertext_len, buffer);
5700                 debug_hexdump(stdout, "ciphertext:", ciphertext,
5701                         ciphertext_len);
5702         } else {
5703                 pktmbuf_write(ut_params->ibuf, 0, plaintext_len,
5704                         tdata->plaintext.data);
5705                 plaintext = rte_pktmbuf_read(ut_params->ibuf, 0,
5706                                         plaintext_len, buffer);
5707                 debug_hexdump(stdout, "plaintext:", plaintext,
5708                         plaintext_len);
5709         }
5710         memset(buffer, 0, sizeof(buffer));
5711
5712         /* Create KASUMI operation */
5713         retval = create_wireless_algo_auth_cipher_operation(
5714                 tdata->digest.data, tdata->digest.len,
5715                 tdata->cipher_iv.data, tdata->cipher_iv.len,
5716                 NULL, 0,
5717                 (tdata->digest.offset_bytes == 0 ?
5718                 (verify ? ciphertext_pad_len : plaintext_pad_len)
5719                         : tdata->digest.offset_bytes),
5720                 tdata->validCipherLenInBits.len,
5721                 tdata->validCipherOffsetInBits.len,
5722                 tdata->validAuthLenInBits.len,
5723                 0,
5724                 op_mode, 1, verify);
5725
5726         if (retval < 0)
5727                 return retval;
5728
5729         if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
5730                 process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
5731                                 ut_params->op, 1, 1, 1, tdata->cipher_iv.len);
5732         else
5733                 ut_params->op = process_crypto_request(ts_params->valid_devs[0],
5734                         ut_params->op);
5735
5736         TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
5737
5738         ut_params->obuf = (op_mode == IN_PLACE ?
5739                 ut_params->op->sym->m_src : ut_params->op->sym->m_dst);
5740
5741         if (verify) {
5742                 if (ut_params->obuf)
5743                         plaintext = rte_pktmbuf_read(ut_params->obuf, 0,
5744                                         plaintext_len, buffer);
5745                 else
5746                         plaintext = rte_pktmbuf_read(ut_params->ibuf, 0,
5747                                         plaintext_len, buffer);
5748
5749                 debug_hexdump(stdout, "plaintext:", plaintext,
5750                         (tdata->plaintext.len >> 3) - tdata->digest.len);
5751                 debug_hexdump(stdout, "plaintext expected:",
5752                         tdata->plaintext.data,
5753                         (tdata->plaintext.len >> 3) - tdata->digest.len);
5754         } else {
5755                 if (ut_params->obuf)
5756                         ciphertext = rte_pktmbuf_read(ut_params->obuf, 0,
5757                                         ciphertext_len, buffer);
5758                 else
5759                         ciphertext = rte_pktmbuf_read(ut_params->ibuf, 0,
5760                                         ciphertext_len, buffer);
5761
5762                 debug_hexdump(stdout, "ciphertext:", ciphertext,
5763                         ciphertext_len);
5764                 debug_hexdump(stdout, "ciphertext expected:",
5765                         tdata->ciphertext.data, tdata->ciphertext.len >> 3);
5766
5767                 if (ut_params->obuf)
5768                         digest = rte_pktmbuf_read(ut_params->obuf,
5769                                 (tdata->digest.offset_bytes == 0 ?
5770                                 plaintext_pad_len : tdata->digest.offset_bytes),
5771                                 tdata->digest.len, digest_buffer);
5772                 else
5773                         digest = rte_pktmbuf_read(ut_params->ibuf,
5774                                 (tdata->digest.offset_bytes == 0 ?
5775                                 plaintext_pad_len : tdata->digest.offset_bytes),
5776                                 tdata->digest.len, digest_buffer);
5777
5778                 debug_hexdump(stdout, "digest:", digest,
5779                         tdata->digest.len);
5780                 debug_hexdump(stdout, "digest expected:",
5781                         tdata->digest.data, tdata->digest.len);
5782         }
5783
5784         /* Validate obuf */
5785         if (verify) {
5786                 TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
5787                         plaintext,
5788                         tdata->plaintext.data,
5789                         tdata->plaintext.len >> 3,
5790                         "KASUMI Plaintext data not as expected");
5791         } else {
5792                 TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
5793                         ciphertext,
5794                         tdata->ciphertext.data,
5795                         tdata->validDataLenInBits.len,
5796                         "KASUMI Ciphertext data not as expected");
5797
5798                 TEST_ASSERT_BUFFERS_ARE_EQUAL(
5799                         digest,
5800                         tdata->digest.data,
5801                         DIGEST_BYTE_LENGTH_KASUMI_F9,
5802                         "KASUMI Generated auth tag not as expected");
5803         }
5804         return 0;
5805 }
5806
5807 static int
5808 test_kasumi_cipher_auth(const struct kasumi_test_data *tdata)
5809 {
5810         struct crypto_testsuite_params *ts_params = &testsuite_params;
5811         struct crypto_unittest_params *ut_params = &unittest_params;
5812
5813         int retval;
5814
5815         uint8_t *plaintext, *ciphertext;
5816         unsigned plaintext_pad_len;
5817         unsigned plaintext_len;
5818         struct rte_cryptodev_info dev_info;
5819
5820         rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
5821         uint64_t feat_flags = dev_info.feature_flags;
5822
5823         if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
5824                         (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
5825                 printf("Device doesn't support RAW data-path APIs.\n");
5826                 return TEST_SKIPPED;
5827         }
5828
5829         if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
5830                 return TEST_SKIPPED;
5831
5832         /* Verify the capabilities */
5833         struct rte_cryptodev_sym_capability_idx cap_idx;
5834         cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
5835         cap_idx.algo.auth = RTE_CRYPTO_AUTH_KASUMI_F9;
5836         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
5837                         &cap_idx) == NULL)
5838                 return TEST_SKIPPED;
5839         cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
5840         cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_KASUMI_F8;
5841         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
5842                         &cap_idx) == NULL)
5843                 return TEST_SKIPPED;
5844
5845         /* Create KASUMI session */
5846         retval = create_wireless_algo_cipher_auth_session(
5847                         ts_params->valid_devs[0],
5848                         RTE_CRYPTO_CIPHER_OP_ENCRYPT,
5849                         RTE_CRYPTO_AUTH_OP_GENERATE,
5850                         RTE_CRYPTO_AUTH_KASUMI_F9,
5851                         RTE_CRYPTO_CIPHER_KASUMI_F8,
5852                         tdata->key.data, tdata->key.len,
5853                         0, tdata->digest.len,
5854                         tdata->cipher_iv.len);
5855         if (retval != 0)
5856                 return retval;
5857
5858         ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
5859
5860         /* clear mbuf payload */
5861         memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
5862                         rte_pktmbuf_tailroom(ut_params->ibuf));
5863
5864         plaintext_len = ceil_byte_length(tdata->plaintext.len);
5865         /* Append data which is padded to a multiple of */
5866         /* the algorithms block size */
5867         plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16);
5868         plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
5869                                 plaintext_pad_len);
5870         memcpy(plaintext, tdata->plaintext.data, plaintext_len);
5871
5872         debug_hexdump(stdout, "plaintext:", plaintext, plaintext_len);
5873
5874         /* Create KASUMI operation */
5875         retval = create_wireless_algo_cipher_hash_operation(tdata->digest.data,
5876                                 tdata->digest.len, NULL, 0,
5877                                 plaintext_pad_len, RTE_CRYPTO_AUTH_OP_GENERATE,
5878                                 tdata->cipher_iv.data, tdata->cipher_iv.len,
5879                                 RTE_ALIGN_CEIL(tdata->validCipherLenInBits.len, 8),
5880                                 tdata->validCipherOffsetInBits.len,
5881                                 tdata->validAuthLenInBits.len,
5882                                 0
5883                                 );
5884         if (retval < 0)
5885                 return retval;
5886
5887         if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
5888                 process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
5889                                 ut_params->op, 1, 1, 1, tdata->cipher_iv.len);
5890         else
5891                 ut_params->op = process_crypto_request(ts_params->valid_devs[0],
5892                         ut_params->op);
5893         TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
5894
5895         if (ut_params->op->sym->m_dst)
5896                 ut_params->obuf = ut_params->op->sym->m_dst;
5897         else
5898                 ut_params->obuf = ut_params->op->sym->m_src;
5899
5900         ciphertext = rte_pktmbuf_mtod_offset(ut_params->obuf, uint8_t *,
5901                                 tdata->validCipherOffsetInBits.len >> 3);
5902
5903         ut_params->digest = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *)
5904                         + plaintext_pad_len;
5905
5906         const uint8_t *reference_ciphertext = tdata->ciphertext.data +
5907                                 (tdata->validCipherOffsetInBits.len >> 3);
5908         /* Validate obuf */
5909         TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
5910                 ciphertext,
5911                 reference_ciphertext,
5912                 tdata->validCipherLenInBits.len,
5913                 "KASUMI Ciphertext data not as expected");
5914
5915         /* Validate obuf */
5916         TEST_ASSERT_BUFFERS_ARE_EQUAL(
5917                 ut_params->digest,
5918                 tdata->digest.data,
5919                 DIGEST_BYTE_LENGTH_SNOW3G_UIA2,
5920                 "KASUMI Generated auth tag not as expected");
5921         return 0;
5922 }
5923
5924 static int
5925 check_cipher_capability(const struct crypto_testsuite_params *ts_params,
5926                         const enum rte_crypto_cipher_algorithm cipher_algo,
5927                         const uint16_t key_size, const uint16_t iv_size)
5928 {
5929         struct rte_cryptodev_sym_capability_idx cap_idx;
5930         const struct rte_cryptodev_symmetric_capability *cap;
5931
5932         /* Check if device supports the algorithm */
5933         cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
5934         cap_idx.algo.cipher = cipher_algo;
5935
5936         cap = rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
5937                         &cap_idx);
5938
5939         if (cap == NULL)
5940                 return -1;
5941
5942         /* Check if device supports key size and IV size */
5943         if (rte_cryptodev_sym_capability_check_cipher(cap, key_size,
5944                         iv_size) < 0) {
5945                 return -1;
5946         }
5947
5948         return 0;
5949 }
5950
5951 static int
5952 check_auth_capability(const struct crypto_testsuite_params *ts_params,
5953                         const enum rte_crypto_auth_algorithm auth_algo,
5954                         const uint16_t key_size, const uint16_t iv_size,
5955                         const uint16_t tag_size)
5956 {
5957         struct rte_cryptodev_sym_capability_idx cap_idx;
5958         const struct rte_cryptodev_symmetric_capability *cap;
5959
5960         /* Check if device supports the algorithm */
5961         cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
5962         cap_idx.algo.auth = auth_algo;
5963
5964         cap = rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
5965                         &cap_idx);
5966
5967         if (cap == NULL)
5968                 return -1;
5969
5970         /* Check if device supports key size and IV size */
5971         if (rte_cryptodev_sym_capability_check_auth(cap, key_size,
5972                         tag_size, iv_size) < 0) {
5973                 return -1;
5974         }
5975
5976         return 0;
5977 }
5978
5979 static int
5980 test_zuc_encryption(const struct wireless_test_data *tdata)
5981 {
5982         struct crypto_testsuite_params *ts_params = &testsuite_params;
5983         struct crypto_unittest_params *ut_params = &unittest_params;
5984
5985         int retval;
5986         uint8_t *plaintext, *ciphertext;
5987         unsigned plaintext_pad_len;
5988         unsigned plaintext_len;
5989         struct rte_cryptodev_info dev_info;
5990
5991         rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
5992         uint64_t feat_flags = dev_info.feature_flags;
5993
5994         if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
5995                         (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
5996                 printf("Device doesn't support RAW data-path APIs.\n");
5997                 return TEST_SKIPPED;
5998         }
5999
6000         if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
6001                 return TEST_SKIPPED;
6002
6003         /* Check if device supports ZUC EEA3 */
6004         if (check_cipher_capability(ts_params, RTE_CRYPTO_CIPHER_ZUC_EEA3,
6005                         tdata->key.len, tdata->cipher_iv.len) < 0)
6006                 return TEST_SKIPPED;
6007
6008         /* Create ZUC session */
6009         retval = create_wireless_algo_cipher_session(ts_params->valid_devs[0],
6010                                         RTE_CRYPTO_CIPHER_OP_ENCRYPT,
6011                                         RTE_CRYPTO_CIPHER_ZUC_EEA3,
6012                                         tdata->key.data, tdata->key.len,
6013                                         tdata->cipher_iv.len);
6014         if (retval != 0)
6015                 return retval;
6016
6017         ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
6018
6019         /* Clear mbuf payload */
6020         memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
6021                rte_pktmbuf_tailroom(ut_params->ibuf));
6022
6023         plaintext_len = ceil_byte_length(tdata->plaintext.len);
6024         /* Append data which is padded to a multiple */
6025         /* of the algorithms block size */
6026         plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 8);
6027         plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
6028                                 plaintext_pad_len);
6029         memcpy(plaintext, tdata->plaintext.data, plaintext_len);
6030
6031         debug_hexdump(stdout, "plaintext:", plaintext, plaintext_len);
6032
6033         /* Create ZUC operation */
6034         retval = create_wireless_algo_cipher_operation(tdata->cipher_iv.data,
6035                                         tdata->cipher_iv.len,
6036                                         tdata->plaintext.len,
6037                                         0);
6038         if (retval < 0)
6039                 return retval;
6040
6041         if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
6042                 process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
6043                                 ut_params->op, 1, 0, 1, tdata->cipher_iv.len);
6044         else
6045                 ut_params->op = process_crypto_request(ts_params->valid_devs[0],
6046                                                 ut_params->op);
6047         TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
6048
6049         ut_params->obuf = ut_params->op->sym->m_dst;
6050         if (ut_params->obuf)
6051                 ciphertext = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *);
6052         else
6053                 ciphertext = plaintext;
6054
6055         debug_hexdump(stdout, "ciphertext:", ciphertext, plaintext_len);
6056
6057         /* Validate obuf */
6058         TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
6059                 ciphertext,
6060                 tdata->ciphertext.data,
6061                 tdata->validCipherLenInBits.len,
6062                 "ZUC Ciphertext data not as expected");
6063         return 0;
6064 }
6065
6066 static int
6067 test_zuc_encryption_sgl(const struct wireless_test_data *tdata)
6068 {
6069         struct crypto_testsuite_params *ts_params = &testsuite_params;
6070         struct crypto_unittest_params *ut_params = &unittest_params;
6071
6072         int retval;
6073
6074         unsigned int plaintext_pad_len;
6075         unsigned int plaintext_len;
6076         const uint8_t *ciphertext;
6077         uint8_t ciphertext_buffer[2048];
6078         struct rte_cryptodev_info dev_info;
6079
6080         /* Check if device supports ZUC EEA3 */
6081         if (check_cipher_capability(ts_params, RTE_CRYPTO_CIPHER_ZUC_EEA3,
6082                         tdata->key.len, tdata->cipher_iv.len) < 0)
6083                 return TEST_SKIPPED;
6084
6085         if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
6086                 return TEST_SKIPPED;
6087
6088         rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
6089
6090         uint64_t feat_flags = dev_info.feature_flags;
6091
6092         if (!(feat_flags & RTE_CRYPTODEV_FF_IN_PLACE_SGL)) {
6093                 printf("Device doesn't support in-place scatter-gather. "
6094                                 "Test Skipped.\n");
6095                 return TEST_SKIPPED;
6096         }
6097
6098         if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
6099                         (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
6100                 printf("Device doesn't support RAW data-path APIs.\n");
6101                 return TEST_SKIPPED;
6102         }
6103
6104         plaintext_len = ceil_byte_length(tdata->plaintext.len);
6105
6106         /* Append data which is padded to a multiple */
6107         /* of the algorithms block size */
6108         plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 8);
6109
6110         ut_params->ibuf = create_segmented_mbuf(ts_params->mbuf_pool,
6111                         plaintext_pad_len, 10, 0);
6112
6113         pktmbuf_write(ut_params->ibuf, 0, plaintext_len,
6114                         tdata->plaintext.data);
6115
6116         /* Create ZUC session */
6117         retval = create_wireless_algo_cipher_session(ts_params->valid_devs[0],
6118                         RTE_CRYPTO_CIPHER_OP_ENCRYPT,
6119                         RTE_CRYPTO_CIPHER_ZUC_EEA3,
6120                         tdata->key.data, tdata->key.len,
6121                         tdata->cipher_iv.len);
6122         if (retval < 0)
6123                 return retval;
6124
6125         /* Clear mbuf payload */
6126
6127         pktmbuf_write(ut_params->ibuf, 0, plaintext_len, tdata->plaintext.data);
6128
6129         /* Create ZUC operation */
6130         retval = create_wireless_algo_cipher_operation(tdata->cipher_iv.data,
6131                         tdata->cipher_iv.len, tdata->plaintext.len,
6132                         0);
6133         if (retval < 0)
6134                 return retval;
6135
6136         if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
6137                 process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
6138                                 ut_params->op, 1, 0, 1, tdata->cipher_iv.len);
6139         else
6140                 ut_params->op = process_crypto_request(ts_params->valid_devs[0],
6141                                                 ut_params->op);
6142         TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
6143
6144         ut_params->obuf = ut_params->op->sym->m_dst;
6145         if (ut_params->obuf)
6146                 ciphertext = rte_pktmbuf_read(ut_params->obuf,
6147                         0, plaintext_len, ciphertext_buffer);
6148         else
6149                 ciphertext = rte_pktmbuf_read(ut_params->ibuf,
6150                         0, plaintext_len, ciphertext_buffer);
6151
6152         /* Validate obuf */
6153         debug_hexdump(stdout, "ciphertext:", ciphertext, plaintext_len);
6154
6155         /* Validate obuf */
6156         TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
6157                 ciphertext,
6158                 tdata->ciphertext.data,
6159                 tdata->validCipherLenInBits.len,
6160                 "ZUC Ciphertext data not as expected");
6161
6162         return 0;
6163 }
6164
6165 static int
6166 test_zuc_authentication(const struct wireless_test_data *tdata)
6167 {
6168         struct crypto_testsuite_params *ts_params = &testsuite_params;
6169         struct crypto_unittest_params *ut_params = &unittest_params;
6170
6171         int retval;
6172         unsigned plaintext_pad_len;
6173         unsigned plaintext_len;
6174         uint8_t *plaintext;
6175
6176         struct rte_cryptodev_info dev_info;
6177
6178         rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
6179         uint64_t feat_flags = dev_info.feature_flags;
6180
6181         if (!(feat_flags & RTE_CRYPTODEV_FF_NON_BYTE_ALIGNED_DATA) &&
6182                         (tdata->validAuthLenInBits.len % 8 != 0)) {
6183                 printf("Device doesn't support NON-Byte Aligned Data.\n");
6184                 return TEST_SKIPPED;
6185         }
6186
6187         if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
6188                         (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
6189                 printf("Device doesn't support RAW data-path APIs.\n");
6190                 return TEST_SKIPPED;
6191         }
6192
6193         if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
6194                 return TEST_SKIPPED;
6195
6196         /* Check if device supports ZUC EIA3 */
6197         if (check_auth_capability(ts_params, RTE_CRYPTO_AUTH_ZUC_EIA3,
6198                         tdata->key.len, tdata->auth_iv.len,
6199                         tdata->digest.len) < 0)
6200                 return TEST_SKIPPED;
6201
6202         /* Create ZUC session */
6203         retval = create_wireless_algo_hash_session(ts_params->valid_devs[0],
6204                         tdata->key.data, tdata->key.len,
6205                         tdata->auth_iv.len, tdata->digest.len,
6206                         RTE_CRYPTO_AUTH_OP_GENERATE,
6207                         RTE_CRYPTO_AUTH_ZUC_EIA3);
6208         if (retval != 0)
6209                 return retval;
6210
6211         /* alloc mbuf and set payload */
6212         ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
6213
6214         memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
6215         rte_pktmbuf_tailroom(ut_params->ibuf));
6216
6217         plaintext_len = ceil_byte_length(tdata->plaintext.len);
6218         /* Append data which is padded to a multiple of */
6219         /* the algorithms block size */
6220         plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 8);
6221         plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
6222                                 plaintext_pad_len);
6223         memcpy(plaintext, tdata->plaintext.data, plaintext_len);
6224
6225         /* Create ZUC operation */
6226         retval = create_wireless_algo_hash_operation(NULL, tdata->digest.len,
6227                         tdata->auth_iv.data, tdata->auth_iv.len,
6228                         plaintext_pad_len, RTE_CRYPTO_AUTH_OP_GENERATE,
6229                         tdata->validAuthLenInBits.len,
6230                         0);
6231         if (retval < 0)
6232                 return retval;
6233
6234         if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
6235                 process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
6236                                 ut_params->op, 0, 1, 1, 0);
6237         else
6238                 ut_params->op = process_crypto_request(ts_params->valid_devs[0],
6239                                 ut_params->op);
6240         ut_params->obuf = ut_params->op->sym->m_src;
6241         TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
6242         ut_params->digest = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *)
6243                         + plaintext_pad_len;
6244
6245         /* Validate obuf */
6246         TEST_ASSERT_BUFFERS_ARE_EQUAL(
6247         ut_params->digest,
6248         tdata->digest.data,
6249         tdata->digest.len,
6250         "ZUC Generated auth tag not as expected");
6251
6252         return 0;
6253 }
6254
6255 static int
6256 test_zuc_auth_cipher(const struct wireless_test_data *tdata,
6257         uint8_t op_mode, uint8_t verify)
6258 {
6259         struct crypto_testsuite_params *ts_params = &testsuite_params;
6260         struct crypto_unittest_params *ut_params = &unittest_params;
6261
6262         int retval;
6263
6264         uint8_t *plaintext = NULL, *ciphertext = NULL;
6265         unsigned int plaintext_pad_len;
6266         unsigned int plaintext_len;
6267         unsigned int ciphertext_pad_len;
6268         unsigned int ciphertext_len;
6269
6270         struct rte_cryptodev_info dev_info;
6271
6272         /* Check if device supports ZUC EEA3 */
6273         if (check_cipher_capability(ts_params, RTE_CRYPTO_CIPHER_ZUC_EEA3,
6274                         tdata->key.len, tdata->cipher_iv.len) < 0)
6275                 return TEST_SKIPPED;
6276
6277         /* Check if device supports ZUC EIA3 */
6278         if (check_auth_capability(ts_params, RTE_CRYPTO_AUTH_ZUC_EIA3,
6279                         tdata->key.len, tdata->auth_iv.len,
6280                         tdata->digest.len) < 0)
6281                 return TEST_SKIPPED;
6282
6283         rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
6284
6285         uint64_t feat_flags = dev_info.feature_flags;
6286
6287         if (!(feat_flags & RTE_CRYPTODEV_FF_DIGEST_ENCRYPTED)) {
6288                 printf("Device doesn't support digest encrypted.\n");
6289                 return TEST_SKIPPED;
6290         }
6291         if (op_mode == IN_PLACE) {
6292                 if (!(feat_flags & RTE_CRYPTODEV_FF_IN_PLACE_SGL)) {
6293                         printf("Device doesn't support in-place scatter-gather "
6294                                         "in both input and output mbufs.\n");
6295                         return TEST_SKIPPED;
6296                 }
6297
6298                 if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
6299                         (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
6300                         printf("Device doesn't support RAW data-path APIs.\n");
6301                         return TEST_SKIPPED;
6302                 }
6303         } else {
6304                 if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
6305                         return TEST_SKIPPED;
6306                 if (!(feat_flags & RTE_CRYPTODEV_FF_OOP_SGL_IN_SGL_OUT)) {
6307                         printf("Device doesn't support out-of-place scatter-gather "
6308                                         "in both input and output mbufs.\n");
6309                         return TEST_SKIPPED;
6310                 }
6311         }
6312
6313         /* Create ZUC session */
6314         retval = create_wireless_algo_auth_cipher_session(
6315                         ts_params->valid_devs[0],
6316                         (verify ? RTE_CRYPTO_CIPHER_OP_DECRYPT
6317                                         : RTE_CRYPTO_CIPHER_OP_ENCRYPT),
6318                         (verify ? RTE_CRYPTO_AUTH_OP_VERIFY
6319                                         : RTE_CRYPTO_AUTH_OP_GENERATE),
6320                         RTE_CRYPTO_AUTH_ZUC_EIA3,
6321                         RTE_CRYPTO_CIPHER_ZUC_EEA3,
6322                         tdata->key.data, tdata->key.len,
6323                         tdata->auth_iv.len, tdata->digest.len,
6324                         tdata->cipher_iv.len);
6325
6326         if (retval != 0)
6327                 return retval;
6328
6329         ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
6330         if (op_mode == OUT_OF_PLACE)
6331                 ut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
6332
6333         /* clear mbuf payload */
6334         memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
6335                 rte_pktmbuf_tailroom(ut_params->ibuf));
6336         if (op_mode == OUT_OF_PLACE)
6337                 memset(rte_pktmbuf_mtod(ut_params->obuf, uint8_t *), 0,
6338                         rte_pktmbuf_tailroom(ut_params->obuf));
6339
6340         ciphertext_len = ceil_byte_length(tdata->ciphertext.len);
6341         plaintext_len = ceil_byte_length(tdata->plaintext.len);
6342         ciphertext_pad_len = RTE_ALIGN_CEIL(ciphertext_len, 16);
6343         plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16);
6344
6345         if (verify) {
6346                 ciphertext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
6347                                         ciphertext_pad_len);
6348                 memcpy(ciphertext, tdata->ciphertext.data, ciphertext_len);
6349                 debug_hexdump(stdout, "ciphertext:", ciphertext,
6350                         ciphertext_len);
6351         } else {
6352                 /* make sure enough space to cover partial digest verify case */
6353                 plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
6354                                         ciphertext_pad_len);
6355                 memcpy(plaintext, tdata->plaintext.data, plaintext_len);
6356                 debug_hexdump(stdout, "plaintext:", plaintext,
6357                         plaintext_len);
6358         }
6359
6360         if (op_mode == OUT_OF_PLACE)
6361                 rte_pktmbuf_append(ut_params->obuf, ciphertext_pad_len);
6362
6363         /* Create ZUC operation */
6364         retval = create_wireless_algo_auth_cipher_operation(
6365                 tdata->digest.data, tdata->digest.len,
6366                 tdata->cipher_iv.data, tdata->cipher_iv.len,
6367                 tdata->auth_iv.data, tdata->auth_iv.len,
6368                 (tdata->digest.offset_bytes == 0 ?
6369                 (verify ? ciphertext_pad_len : plaintext_pad_len)
6370                         : tdata->digest.offset_bytes),
6371                 tdata->validCipherLenInBits.len,
6372                 tdata->validCipherOffsetInBits.len,
6373                 tdata->validAuthLenInBits.len,
6374                 0,
6375                 op_mode, 0, verify);
6376
6377         if (retval < 0)
6378                 return retval;
6379
6380         if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
6381                 process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
6382                                 ut_params->op, 1, 1, 1, tdata->cipher_iv.len);
6383         else
6384                 ut_params->op = process_crypto_request(ts_params->valid_devs[0],
6385                         ut_params->op);
6386
6387         TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
6388
6389         ut_params->obuf = (op_mode == IN_PLACE ?
6390                 ut_params->op->sym->m_src : ut_params->op->sym->m_dst);
6391
6392
6393         if (verify) {
6394                 if (ut_params->obuf)
6395                         plaintext = rte_pktmbuf_mtod(ut_params->obuf,
6396                                                         uint8_t *);
6397                 else
6398                         plaintext = ciphertext;
6399
6400                 debug_hexdump(stdout, "plaintext:", plaintext,
6401                         (tdata->plaintext.len >> 3) - tdata->digest.len);
6402                 debug_hexdump(stdout, "plaintext expected:",
6403                         tdata->plaintext.data,
6404                         (tdata->plaintext.len >> 3) - tdata->digest.len);
6405         } else {
6406                 if (ut_params->obuf)
6407                         ciphertext = rte_pktmbuf_mtod(ut_params->obuf,
6408                                                         uint8_t *);
6409                 else
6410                         ciphertext = plaintext;
6411
6412                 debug_hexdump(stdout, "ciphertext:", ciphertext,
6413                         ciphertext_len);
6414                 debug_hexdump(stdout, "ciphertext expected:",
6415                         tdata->ciphertext.data, tdata->ciphertext.len >> 3);
6416
6417                 ut_params->digest = rte_pktmbuf_mtod(
6418                         ut_params->obuf, uint8_t *) +
6419                         (tdata->digest.offset_bytes == 0 ?
6420                         plaintext_pad_len : tdata->digest.offset_bytes);
6421
6422                 debug_hexdump(stdout, "digest:", ut_params->digest,
6423                         tdata->digest.len);
6424                 debug_hexdump(stdout, "digest expected:",
6425                         tdata->digest.data, tdata->digest.len);
6426         }
6427
6428         /* Validate obuf */
6429         if (verify) {
6430                 TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
6431                         plaintext,
6432                         tdata->plaintext.data,
6433                         tdata->plaintext.len >> 3,
6434                         "ZUC Plaintext data not as expected");
6435         } else {
6436                 TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
6437                         ciphertext,
6438                         tdata->ciphertext.data,
6439                         tdata->ciphertext.len >> 3,
6440                         "ZUC Ciphertext data not as expected");
6441
6442                 TEST_ASSERT_BUFFERS_ARE_EQUAL(
6443                         ut_params->digest,
6444                         tdata->digest.data,
6445                         DIGEST_BYTE_LENGTH_KASUMI_F9,
6446                         "ZUC Generated auth tag not as expected");
6447         }
6448         return 0;
6449 }
6450
6451 static int
6452 test_zuc_auth_cipher_sgl(const struct wireless_test_data *tdata,
6453         uint8_t op_mode, uint8_t verify)
6454 {
6455         struct crypto_testsuite_params *ts_params = &testsuite_params;
6456         struct crypto_unittest_params *ut_params = &unittest_params;
6457
6458         int retval;
6459
6460         const uint8_t *plaintext = NULL;
6461         const uint8_t *ciphertext = NULL;
6462         const uint8_t *digest = NULL;
6463         unsigned int plaintext_pad_len;
6464         unsigned int plaintext_len;
6465         unsigned int ciphertext_pad_len;
6466         unsigned int ciphertext_len;
6467         uint8_t buffer[10000];
6468         uint8_t digest_buffer[10000];
6469
6470         struct rte_cryptodev_info dev_info;
6471
6472         /* Check if device supports ZUC EEA3 */
6473         if (check_cipher_capability(ts_params, RTE_CRYPTO_CIPHER_ZUC_EEA3,
6474                         tdata->key.len, tdata->cipher_iv.len) < 0)
6475                 return TEST_SKIPPED;
6476
6477         /* Check if device supports ZUC EIA3 */
6478         if (check_auth_capability(ts_params, RTE_CRYPTO_AUTH_ZUC_EIA3,
6479                         tdata->key.len, tdata->auth_iv.len,
6480                         tdata->digest.len) < 0)
6481                 return TEST_SKIPPED;
6482
6483         rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
6484
6485         uint64_t feat_flags = dev_info.feature_flags;
6486
6487         if (op_mode == IN_PLACE) {
6488                 if (!(feat_flags & RTE_CRYPTODEV_FF_IN_PLACE_SGL)) {
6489                         printf("Device doesn't support in-place scatter-gather "
6490                                         "in both input and output mbufs.\n");
6491                         return TEST_SKIPPED;
6492                 }
6493
6494                 if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
6495                         (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
6496                         printf("Device doesn't support RAW data-path APIs.\n");
6497                         return TEST_SKIPPED;
6498                 }
6499         } else {
6500                 if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
6501                         return TEST_SKIPPED;
6502                 if (!(feat_flags & RTE_CRYPTODEV_FF_OOP_SGL_IN_SGL_OUT)) {
6503                         printf("Device doesn't support out-of-place scatter-gather "
6504                                         "in both input and output mbufs.\n");
6505                         return TEST_SKIPPED;
6506                 }
6507                 if (!(feat_flags & RTE_CRYPTODEV_FF_DIGEST_ENCRYPTED)) {
6508                         printf("Device doesn't support digest encrypted.\n");
6509                         return TEST_SKIPPED;
6510                 }
6511         }
6512
6513         /* Create ZUC session */
6514         retval = create_wireless_algo_auth_cipher_session(
6515                         ts_params->valid_devs[0],
6516                         (verify ? RTE_CRYPTO_CIPHER_OP_DECRYPT
6517                                         : RTE_CRYPTO_CIPHER_OP_ENCRYPT),
6518                         (verify ? RTE_CRYPTO_AUTH_OP_VERIFY
6519                                         : RTE_CRYPTO_AUTH_OP_GENERATE),
6520                         RTE_CRYPTO_AUTH_ZUC_EIA3,
6521                         RTE_CRYPTO_CIPHER_ZUC_EEA3,
6522                         tdata->key.data, tdata->key.len,
6523                         tdata->auth_iv.len, tdata->digest.len,
6524                         tdata->cipher_iv.len);
6525
6526         if (retval != 0)
6527                 return retval;
6528
6529         ciphertext_len = ceil_byte_length(tdata->ciphertext.len);
6530         plaintext_len = ceil_byte_length(tdata->plaintext.len);
6531         ciphertext_pad_len = RTE_ALIGN_CEIL(ciphertext_len, 16);
6532         plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16);
6533
6534         ut_params->ibuf = create_segmented_mbuf(ts_params->mbuf_pool,
6535                         plaintext_pad_len, 15, 0);
6536         TEST_ASSERT_NOT_NULL(ut_params->ibuf,
6537                         "Failed to allocate input buffer in mempool");
6538
6539         if (op_mode == OUT_OF_PLACE) {
6540                 ut_params->obuf = create_segmented_mbuf(ts_params->mbuf_pool,
6541                                 plaintext_pad_len, 15, 0);
6542                 TEST_ASSERT_NOT_NULL(ut_params->obuf,
6543                                 "Failed to allocate output buffer in mempool");
6544         }
6545
6546         if (verify) {
6547                 pktmbuf_write(ut_params->ibuf, 0, ciphertext_len,
6548                         tdata->ciphertext.data);
6549                 ciphertext = rte_pktmbuf_read(ut_params->ibuf, 0,
6550                                         ciphertext_len, buffer);
6551                 debug_hexdump(stdout, "ciphertext:", ciphertext,
6552                         ciphertext_len);
6553         } else {
6554                 pktmbuf_write(ut_params->ibuf, 0, plaintext_len,
6555                         tdata->plaintext.data);
6556                 plaintext = rte_pktmbuf_read(ut_params->ibuf, 0,
6557                                         plaintext_len, buffer);
6558                 debug_hexdump(stdout, "plaintext:", plaintext,
6559                         plaintext_len);
6560         }
6561         memset(buffer, 0, sizeof(buffer));
6562
6563         /* Create ZUC operation */
6564         retval = create_wireless_algo_auth_cipher_operation(
6565                 tdata->digest.data, tdata->digest.len,
6566                 tdata->cipher_iv.data, tdata->cipher_iv.len,
6567                 NULL, 0,
6568                 (tdata->digest.offset_bytes == 0 ?
6569                 (verify ? ciphertext_pad_len : plaintext_pad_len)
6570                         : tdata->digest.offset_bytes),
6571                 tdata->validCipherLenInBits.len,
6572                 tdata->validCipherOffsetInBits.len,
6573                 tdata->validAuthLenInBits.len,
6574                 0,
6575                 op_mode, 1, verify);
6576
6577         if (retval < 0)
6578                 return retval;
6579
6580         if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
6581                 process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
6582                                 ut_params->op, 1, 1, 1, tdata->cipher_iv.len);
6583         else
6584                 ut_params->op = process_crypto_request(ts_params->valid_devs[0],
6585                         ut_params->op);
6586
6587         TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
6588
6589         ut_params->obuf = (op_mode == IN_PLACE ?
6590                 ut_params->op->sym->m_src : ut_params->op->sym->m_dst);
6591
6592         if (verify) {
6593                 if (ut_params->obuf)
6594                         plaintext = rte_pktmbuf_read(ut_params->obuf, 0,
6595                                         plaintext_len, buffer);
6596                 else
6597                         plaintext = rte_pktmbuf_read(ut_params->ibuf, 0,
6598                                         plaintext_len, buffer);
6599
6600                 debug_hexdump(stdout, "plaintext:", plaintext,
6601                         (tdata->plaintext.len >> 3) - tdata->digest.len);
6602                 debug_hexdump(stdout, "plaintext expected:",
6603                         tdata->plaintext.data,
6604                         (tdata->plaintext.len >> 3) - tdata->digest.len);
6605         } else {
6606                 if (ut_params->obuf)
6607                         ciphertext = rte_pktmbuf_read(ut_params->obuf, 0,
6608                                         ciphertext_len, buffer);
6609                 else
6610                         ciphertext = rte_pktmbuf_read(ut_params->ibuf, 0,
6611                                         ciphertext_len, buffer);
6612
6613                 debug_hexdump(stdout, "ciphertext:", ciphertext,
6614                         ciphertext_len);
6615                 debug_hexdump(stdout, "ciphertext expected:",
6616                         tdata->ciphertext.data, tdata->ciphertext.len >> 3);
6617
6618                 if (ut_params->obuf)
6619                         digest = rte_pktmbuf_read(ut_params->obuf,
6620                                 (tdata->digest.offset_bytes == 0 ?
6621                                 plaintext_pad_len : tdata->digest.offset_bytes),
6622                                 tdata->digest.len, digest_buffer);
6623                 else
6624                         digest = rte_pktmbuf_read(ut_params->ibuf,
6625                                 (tdata->digest.offset_bytes == 0 ?
6626                                 plaintext_pad_len : tdata->digest.offset_bytes),
6627                                 tdata->digest.len, digest_buffer);
6628
6629                 debug_hexdump(stdout, "digest:", digest,
6630                         tdata->digest.len);
6631                 debug_hexdump(stdout, "digest expected:",
6632                         tdata->digest.data, tdata->digest.len);
6633         }
6634
6635         /* Validate obuf */
6636         if (verify) {
6637                 TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
6638                         plaintext,
6639                         tdata->plaintext.data,
6640                         tdata->plaintext.len >> 3,
6641                         "ZUC Plaintext data not as expected");
6642         } else {
6643                 TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
6644                         ciphertext,
6645                         tdata->ciphertext.data,
6646                         tdata->validDataLenInBits.len,
6647                         "ZUC Ciphertext data not as expected");
6648
6649                 TEST_ASSERT_BUFFERS_ARE_EQUAL(
6650                         digest,
6651                         tdata->digest.data,
6652                         DIGEST_BYTE_LENGTH_KASUMI_F9,
6653                         "ZUC Generated auth tag not as expected");
6654         }
6655         return 0;
6656 }
6657
6658 static int
6659 test_kasumi_encryption_test_case_1(void)
6660 {
6661         return test_kasumi_encryption(&kasumi_test_case_1);
6662 }
6663
6664 static int
6665 test_kasumi_encryption_test_case_1_sgl(void)
6666 {
6667         return test_kasumi_encryption_sgl(&kasumi_test_case_1);
6668 }
6669
6670 static int
6671 test_kasumi_encryption_test_case_1_oop(void)
6672 {
6673         return test_kasumi_encryption_oop(&kasumi_test_case_1);
6674 }
6675
6676 static int
6677 test_kasumi_encryption_test_case_1_oop_sgl(void)
6678 {
6679         return test_kasumi_encryption_oop_sgl(&kasumi_test_case_1);
6680 }
6681
6682 static int
6683 test_kasumi_encryption_test_case_2(void)
6684 {
6685         return test_kasumi_encryption(&kasumi_test_case_2);
6686 }
6687
6688 static int
6689 test_kasumi_encryption_test_case_3(void)
6690 {
6691         return test_kasumi_encryption(&kasumi_test_case_3);
6692 }
6693
6694 static int
6695 test_kasumi_encryption_test_case_4(void)
6696 {
6697         return test_kasumi_encryption(&kasumi_test_case_4);
6698 }
6699
6700 static int
6701 test_kasumi_encryption_test_case_5(void)
6702 {
6703         return test_kasumi_encryption(&kasumi_test_case_5);
6704 }
6705
6706 static int
6707 test_kasumi_decryption_test_case_1(void)
6708 {
6709         return test_kasumi_decryption(&kasumi_test_case_1);
6710 }
6711
6712 static int
6713 test_kasumi_decryption_test_case_1_oop(void)
6714 {
6715         return test_kasumi_decryption_oop(&kasumi_test_case_1);
6716 }
6717
6718 static int
6719 test_kasumi_decryption_test_case_2(void)
6720 {
6721         return test_kasumi_decryption(&kasumi_test_case_2);
6722 }
6723
6724 static int
6725 test_kasumi_decryption_test_case_3(void)
6726 {
6727         /* rte_crypto_mbuf_to_vec does not support incomplete mbuf build */
6728         if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
6729                 return TEST_SKIPPED;
6730         return test_kasumi_decryption(&kasumi_test_case_3);
6731 }
6732
6733 static int
6734 test_kasumi_decryption_test_case_4(void)
6735 {
6736         return test_kasumi_decryption(&kasumi_test_case_4);
6737 }
6738
6739 static int
6740 test_kasumi_decryption_test_case_5(void)
6741 {
6742         return test_kasumi_decryption(&kasumi_test_case_5);
6743 }
6744 static int
6745 test_snow3g_encryption_test_case_1(void)
6746 {
6747         return test_snow3g_encryption(&snow3g_test_case_1);
6748 }
6749
6750 static int
6751 test_snow3g_encryption_test_case_1_oop(void)
6752 {
6753         return test_snow3g_encryption_oop(&snow3g_test_case_1);
6754 }
6755
6756 static int
6757 test_snow3g_encryption_test_case_1_oop_sgl(void)
6758 {
6759         return test_snow3g_encryption_oop_sgl(&snow3g_test_case_1);
6760 }
6761
6762
6763 static int
6764 test_snow3g_encryption_test_case_1_offset_oop(void)
6765 {
6766         return test_snow3g_encryption_offset_oop(&snow3g_test_case_1);
6767 }
6768
6769 static int
6770 test_snow3g_encryption_test_case_2(void)
6771 {
6772         return test_snow3g_encryption(&snow3g_test_case_2);
6773 }
6774
6775 static int
6776 test_snow3g_encryption_test_case_3(void)
6777 {
6778         return test_snow3g_encryption(&snow3g_test_case_3);
6779 }
6780
6781 static int
6782 test_snow3g_encryption_test_case_4(void)
6783 {
6784         return test_snow3g_encryption(&snow3g_test_case_4);
6785 }
6786
6787 static int
6788 test_snow3g_encryption_test_case_5(void)
6789 {
6790         return test_snow3g_encryption(&snow3g_test_case_5);
6791 }
6792
6793 static int
6794 test_snow3g_decryption_test_case_1(void)
6795 {
6796         return test_snow3g_decryption(&snow3g_test_case_1);
6797 }
6798
6799 static int
6800 test_snow3g_decryption_test_case_1_oop(void)
6801 {
6802         return test_snow3g_decryption_oop(&snow3g_test_case_1);
6803 }
6804
6805 static int
6806 test_snow3g_decryption_test_case_2(void)
6807 {
6808         return test_snow3g_decryption(&snow3g_test_case_2);
6809 }
6810
6811 static int
6812 test_snow3g_decryption_test_case_3(void)
6813 {
6814         return test_snow3g_decryption(&snow3g_test_case_3);
6815 }
6816
6817 static int
6818 test_snow3g_decryption_test_case_4(void)
6819 {
6820         return test_snow3g_decryption(&snow3g_test_case_4);
6821 }
6822
6823 static int
6824 test_snow3g_decryption_test_case_5(void)
6825 {
6826         return test_snow3g_decryption(&snow3g_test_case_5);
6827 }
6828
6829 /*
6830  * Function prepares snow3g_hash_test_data from snow3g_test_data.
6831  * Pattern digest from snow3g_test_data must be allocated as
6832  * 4 last bytes in plaintext.
6833  */
6834 static void
6835 snow3g_hash_test_vector_setup(const struct snow3g_test_data *pattern,
6836                 struct snow3g_hash_test_data *output)
6837 {
6838         if ((pattern != NULL) && (output != NULL)) {
6839                 output->key.len = pattern->key.len;
6840
6841                 memcpy(output->key.data,
6842                 pattern->key.data, pattern->key.len);
6843
6844                 output->auth_iv.len = pattern->auth_iv.len;
6845
6846                 memcpy(output->auth_iv.data,
6847                 pattern->auth_iv.data, pattern->auth_iv.len);
6848
6849                 output->plaintext.len = pattern->plaintext.len;
6850
6851                 memcpy(output->plaintext.data,
6852                 pattern->plaintext.data, pattern->plaintext.len >> 3);
6853
6854                 output->digest.len = pattern->digest.len;
6855
6856                 memcpy(output->digest.data,
6857                 &pattern->plaintext.data[pattern->digest.offset_bytes],
6858                 pattern->digest.len);
6859
6860                 output->validAuthLenInBits.len =
6861                 pattern->validAuthLenInBits.len;
6862         }
6863 }
6864
6865 /*
6866  * Test case verify computed cipher and digest from snow3g_test_case_7 data.
6867  */
6868 static int
6869 test_snow3g_decryption_with_digest_test_case_1(void)
6870 {
6871         struct snow3g_hash_test_data snow3g_hash_data;
6872         struct rte_cryptodev_info dev_info;
6873         struct crypto_testsuite_params *ts_params = &testsuite_params;
6874
6875         rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
6876         uint64_t feat_flags = dev_info.feature_flags;
6877
6878         if (!(feat_flags & RTE_CRYPTODEV_FF_DIGEST_ENCRYPTED)) {
6879                 printf("Device doesn't support encrypted digest operations.\n");
6880                 return TEST_SKIPPED;
6881         }
6882
6883         /*
6884          * Function prepare data for hash verification test case.
6885          * Digest is allocated in 4 last bytes in plaintext, pattern.
6886          */
6887         snow3g_hash_test_vector_setup(&snow3g_test_case_7, &snow3g_hash_data);
6888
6889         return test_snow3g_decryption(&snow3g_test_case_7) &
6890                         test_snow3g_authentication_verify(&snow3g_hash_data);
6891 }
6892
6893 static int
6894 test_snow3g_cipher_auth_test_case_1(void)
6895 {
6896         return test_snow3g_cipher_auth(&snow3g_test_case_3);
6897 }
6898
6899 static int
6900 test_snow3g_auth_cipher_test_case_1(void)
6901 {
6902         return test_snow3g_auth_cipher(
6903                 &snow3g_auth_cipher_test_case_1, IN_PLACE, 0);
6904 }
6905
6906 static int
6907 test_snow3g_auth_cipher_test_case_2(void)
6908 {
6909         return test_snow3g_auth_cipher(
6910                 &snow3g_auth_cipher_test_case_2, IN_PLACE, 0);
6911 }
6912
6913 static int
6914 test_snow3g_auth_cipher_test_case_2_oop(void)
6915 {
6916         return test_snow3g_auth_cipher(
6917                 &snow3g_auth_cipher_test_case_2, OUT_OF_PLACE, 0);
6918 }
6919
6920 static int
6921 test_snow3g_auth_cipher_part_digest_enc(void)
6922 {
6923         return test_snow3g_auth_cipher(
6924                 &snow3g_auth_cipher_partial_digest_encryption,
6925                         IN_PLACE, 0);
6926 }
6927
6928 static int
6929 test_snow3g_auth_cipher_part_digest_enc_oop(void)
6930 {
6931         return test_snow3g_auth_cipher(
6932                 &snow3g_auth_cipher_partial_digest_encryption,
6933                         OUT_OF_PLACE, 0);
6934 }
6935
6936 static int
6937 test_snow3g_auth_cipher_test_case_3_sgl(void)
6938 {
6939         /* rte_crypto_mbuf_to_vec does not support incomplete mbuf build */
6940         if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
6941                 return TEST_SKIPPED;
6942         return test_snow3g_auth_cipher_sgl(
6943                 &snow3g_auth_cipher_test_case_3, IN_PLACE, 0);
6944 }
6945
6946 static int
6947 test_snow3g_auth_cipher_test_case_3_oop_sgl(void)
6948 {
6949         return test_snow3g_auth_cipher_sgl(
6950                 &snow3g_auth_cipher_test_case_3, OUT_OF_PLACE, 0);
6951 }
6952
6953 static int
6954 test_snow3g_auth_cipher_part_digest_enc_sgl(void)
6955 {
6956         /* rte_crypto_mbuf_to_vec does not support incomplete mbuf build */
6957         if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
6958                 return TEST_SKIPPED;
6959         return test_snow3g_auth_cipher_sgl(
6960                 &snow3g_auth_cipher_partial_digest_encryption,
6961                         IN_PLACE, 0);
6962 }
6963
6964 static int
6965 test_snow3g_auth_cipher_part_digest_enc_oop_sgl(void)
6966 {
6967         return test_snow3g_auth_cipher_sgl(
6968                 &snow3g_auth_cipher_partial_digest_encryption,
6969                         OUT_OF_PLACE, 0);
6970 }
6971
6972 static int
6973 test_snow3g_auth_cipher_verify_test_case_1(void)
6974 {
6975         return test_snow3g_auth_cipher(
6976                 &snow3g_auth_cipher_test_case_1, IN_PLACE, 1);
6977 }
6978
6979 static int
6980 test_snow3g_auth_cipher_verify_test_case_2(void)
6981 {
6982         return test_snow3g_auth_cipher(
6983                 &snow3g_auth_cipher_test_case_2, IN_PLACE, 1);
6984 }
6985
6986 static int
6987 test_snow3g_auth_cipher_verify_test_case_2_oop(void)
6988 {
6989         return test_snow3g_auth_cipher(
6990                 &snow3g_auth_cipher_test_case_2, OUT_OF_PLACE, 1);
6991 }
6992
6993 static int
6994 test_snow3g_auth_cipher_verify_part_digest_enc(void)
6995 {
6996         return test_snow3g_auth_cipher(
6997                 &snow3g_auth_cipher_partial_digest_encryption,
6998                         IN_PLACE, 1);
6999 }
7000
7001 static int
7002 test_snow3g_auth_cipher_verify_part_digest_enc_oop(void)
7003 {
7004         return test_snow3g_auth_cipher(
7005                 &snow3g_auth_cipher_partial_digest_encryption,
7006                         OUT_OF_PLACE, 1);
7007 }
7008
7009 static int
7010 test_snow3g_auth_cipher_verify_test_case_3_sgl(void)
7011 {
7012         return test_snow3g_auth_cipher_sgl(
7013                 &snow3g_auth_cipher_test_case_3, IN_PLACE, 1);
7014 }
7015
7016 static int
7017 test_snow3g_auth_cipher_verify_test_case_3_oop_sgl(void)
7018 {
7019         return test_snow3g_auth_cipher_sgl(
7020                 &snow3g_auth_cipher_test_case_3, OUT_OF_PLACE, 1);
7021 }
7022
7023 static int
7024 test_snow3g_auth_cipher_verify_part_digest_enc_sgl(void)
7025 {
7026         return test_snow3g_auth_cipher_sgl(
7027                 &snow3g_auth_cipher_partial_digest_encryption,
7028                         IN_PLACE, 1);
7029 }
7030
7031 static int
7032 test_snow3g_auth_cipher_verify_part_digest_enc_oop_sgl(void)
7033 {
7034         return test_snow3g_auth_cipher_sgl(
7035                 &snow3g_auth_cipher_partial_digest_encryption,
7036                         OUT_OF_PLACE, 1);
7037 }
7038
7039 static int
7040 test_snow3g_auth_cipher_with_digest_test_case_1(void)
7041 {
7042         return test_snow3g_auth_cipher(
7043                 &snow3g_test_case_7, IN_PLACE, 0);
7044 }
7045
7046 static int
7047 test_kasumi_auth_cipher_test_case_1(void)
7048 {
7049         return test_kasumi_auth_cipher(
7050                 &kasumi_test_case_3, IN_PLACE, 0);
7051 }
7052
7053 static int
7054 test_kasumi_auth_cipher_test_case_2(void)
7055 {
7056         return test_kasumi_auth_cipher(
7057                 &kasumi_auth_cipher_test_case_2, IN_PLACE, 0);
7058 }
7059
7060 static int
7061 test_kasumi_auth_cipher_test_case_2_oop(void)
7062 {
7063         return test_kasumi_auth_cipher(
7064                 &kasumi_auth_cipher_test_case_2, OUT_OF_PLACE, 0);
7065 }
7066
7067 static int
7068 test_kasumi_auth_cipher_test_case_2_sgl(void)
7069 {
7070         return test_kasumi_auth_cipher_sgl(
7071                 &kasumi_auth_cipher_test_case_2, IN_PLACE, 0);
7072 }
7073
7074 static int
7075 test_kasumi_auth_cipher_test_case_2_oop_sgl(void)
7076 {
7077         return test_kasumi_auth_cipher_sgl(
7078                 &kasumi_auth_cipher_test_case_2, OUT_OF_PLACE, 0);
7079 }
7080
7081 static int
7082 test_kasumi_auth_cipher_verify_test_case_1(void)
7083 {
7084         return test_kasumi_auth_cipher(
7085                 &kasumi_test_case_3, IN_PLACE, 1);
7086 }
7087
7088 static int
7089 test_kasumi_auth_cipher_verify_test_case_2(void)
7090 {
7091         return test_kasumi_auth_cipher(
7092                 &kasumi_auth_cipher_test_case_2, IN_PLACE, 1);
7093 }
7094
7095 static int
7096 test_kasumi_auth_cipher_verify_test_case_2_oop(void)
7097 {
7098         return test_kasumi_auth_cipher(
7099                 &kasumi_auth_cipher_test_case_2, OUT_OF_PLACE, 1);
7100 }
7101
7102 static int
7103 test_kasumi_auth_cipher_verify_test_case_2_sgl(void)
7104 {
7105         return test_kasumi_auth_cipher_sgl(
7106                 &kasumi_auth_cipher_test_case_2, IN_PLACE, 1);
7107 }
7108
7109 static int
7110 test_kasumi_auth_cipher_verify_test_case_2_oop_sgl(void)
7111 {
7112         return test_kasumi_auth_cipher_sgl(
7113                 &kasumi_auth_cipher_test_case_2, OUT_OF_PLACE, 1);
7114 }
7115
7116 static int
7117 test_kasumi_cipher_auth_test_case_1(void)
7118 {
7119         return test_kasumi_cipher_auth(&kasumi_test_case_6);
7120 }
7121
7122 static int
7123 test_zuc_encryption_test_case_1(void)
7124 {
7125         return test_zuc_encryption(&zuc_test_case_cipher_193b);
7126 }
7127
7128 static int
7129 test_zuc_encryption_test_case_2(void)
7130 {
7131         return test_zuc_encryption(&zuc_test_case_cipher_800b);
7132 }
7133
7134 static int
7135 test_zuc_encryption_test_case_3(void)
7136 {
7137         return test_zuc_encryption(&zuc_test_case_cipher_1570b);
7138 }
7139
7140 static int
7141 test_zuc_encryption_test_case_4(void)
7142 {
7143         return test_zuc_encryption(&zuc_test_case_cipher_2798b);
7144 }
7145
7146 static int
7147 test_zuc_encryption_test_case_5(void)
7148 {
7149         return test_zuc_encryption(&zuc_test_case_cipher_4019b);
7150 }
7151
7152 static int
7153 test_zuc_encryption_test_case_6_sgl(void)
7154 {
7155         return test_zuc_encryption_sgl(&zuc_test_case_cipher_193b);
7156 }
7157
7158 static int
7159 test_zuc_hash_generate_test_case_1(void)
7160 {
7161         return test_zuc_authentication(&zuc_test_case_auth_1b);
7162 }
7163
7164 static int
7165 test_zuc_hash_generate_test_case_2(void)
7166 {
7167         return test_zuc_authentication(&zuc_test_case_auth_90b);
7168 }
7169
7170 static int
7171 test_zuc_hash_generate_test_case_3(void)
7172 {
7173         return test_zuc_authentication(&zuc_test_case_auth_577b);
7174 }
7175
7176 static int
7177 test_zuc_hash_generate_test_case_4(void)
7178 {
7179         return test_zuc_authentication(&zuc_test_case_auth_2079b);
7180 }
7181
7182 static int
7183 test_zuc_hash_generate_test_case_5(void)
7184 {
7185         return test_zuc_authentication(&zuc_test_auth_5670b);
7186 }
7187
7188 static int
7189 test_zuc_hash_generate_test_case_6(void)
7190 {
7191         return test_zuc_authentication(&zuc_test_case_auth_128b);
7192 }
7193
7194 static int
7195 test_zuc_hash_generate_test_case_7(void)
7196 {
7197         return test_zuc_authentication(&zuc_test_case_auth_2080b);
7198 }
7199
7200 static int
7201 test_zuc_hash_generate_test_case_8(void)
7202 {
7203         return test_zuc_authentication(&zuc_test_case_auth_584b);
7204 }
7205
7206 static int
7207 test_zuc_hash_generate_test_case_9(void)
7208 {
7209         return test_zuc_authentication(&zuc_test_case_auth_4000b_mac_32b);
7210 }
7211
7212 static int
7213 test_zuc_hash_generate_test_case_10(void)
7214 {
7215         return test_zuc_authentication(&zuc_test_case_auth_4000b_mac_64b);
7216 }
7217
7218 static int
7219 test_zuc_hash_generate_test_case_11(void)
7220 {
7221         return test_zuc_authentication(&zuc_test_case_auth_4000b_mac_128b);
7222 }
7223
7224 static int
7225 test_zuc_cipher_auth_test_case_1(void)
7226 {
7227         return test_zuc_cipher_auth(&zuc_test_case_cipher_200b_auth_200b);
7228 }
7229
7230 static int
7231 test_zuc_cipher_auth_test_case_2(void)
7232 {
7233         return test_zuc_cipher_auth(&zuc_test_case_cipher_800b_auth_120b);
7234 }
7235
7236 static int
7237 test_zuc_auth_cipher_test_case_1(void)
7238 {
7239         return test_zuc_auth_cipher(
7240                 &zuc_auth_cipher_test_case_1, IN_PLACE, 0);
7241 }
7242
7243 static int
7244 test_zuc_auth_cipher_test_case_1_oop(void)
7245 {
7246         return test_zuc_auth_cipher(
7247                 &zuc_auth_cipher_test_case_1, OUT_OF_PLACE, 0);
7248 }
7249
7250 static int
7251 test_zuc_auth_cipher_test_case_1_sgl(void)
7252 {
7253         return test_zuc_auth_cipher_sgl(
7254                 &zuc_auth_cipher_test_case_1, IN_PLACE, 0);
7255 }
7256
7257 static int
7258 test_zuc_auth_cipher_test_case_1_oop_sgl(void)
7259 {
7260         return test_zuc_auth_cipher_sgl(
7261                 &zuc_auth_cipher_test_case_1, OUT_OF_PLACE, 0);
7262 }
7263
7264 static int
7265 test_zuc_auth_cipher_verify_test_case_1(void)
7266 {
7267         return test_zuc_auth_cipher(
7268                 &zuc_auth_cipher_test_case_1, IN_PLACE, 1);
7269 }
7270
7271 static int
7272 test_zuc_auth_cipher_verify_test_case_1_oop(void)
7273 {
7274         return test_zuc_auth_cipher(
7275                 &zuc_auth_cipher_test_case_1, OUT_OF_PLACE, 1);
7276 }
7277
7278 static int
7279 test_zuc_auth_cipher_verify_test_case_1_sgl(void)
7280 {
7281         return test_zuc_auth_cipher_sgl(
7282                 &zuc_auth_cipher_test_case_1, IN_PLACE, 1);
7283 }
7284
7285 static int
7286 test_zuc_auth_cipher_verify_test_case_1_oop_sgl(void)
7287 {
7288         return test_zuc_auth_cipher_sgl(
7289                 &zuc_auth_cipher_test_case_1, OUT_OF_PLACE, 1);
7290 }
7291
7292 static int
7293 test_zuc256_encryption_test_case_1(void)
7294 {
7295         return test_zuc_encryption(&zuc256_test_case_cipher_1);
7296 }
7297
7298 static int
7299 test_zuc256_encryption_test_case_2(void)
7300 {
7301         return test_zuc_encryption(&zuc256_test_case_cipher_2);
7302 }
7303
7304 static int
7305 test_zuc256_authentication_test_case_1(void)
7306 {
7307         return test_zuc_authentication(&zuc256_test_case_auth_1);
7308 }
7309
7310 static int
7311 test_zuc256_authentication_test_case_2(void)
7312 {
7313         return test_zuc_authentication(&zuc256_test_case_auth_2);
7314 }
7315
7316 static int
7317 test_mixed_check_if_unsupported(const struct mixed_cipher_auth_test_data *tdata)
7318 {
7319         uint8_t dev_id = testsuite_params.valid_devs[0];
7320
7321         struct rte_cryptodev_sym_capability_idx cap_idx;
7322
7323         /* Check if device supports particular cipher algorithm */
7324         cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
7325         cap_idx.algo.cipher = tdata->cipher_algo;
7326         if (rte_cryptodev_sym_capability_get(dev_id, &cap_idx) == NULL)
7327                 return TEST_SKIPPED;
7328
7329         /* Check if device supports particular hash algorithm */
7330         cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
7331         cap_idx.algo.auth = tdata->auth_algo;
7332         if (rte_cryptodev_sym_capability_get(dev_id, &cap_idx) == NULL)
7333                 return TEST_SKIPPED;
7334
7335         return 0;
7336 }
7337
7338 static int
7339 test_mixed_auth_cipher(const struct mixed_cipher_auth_test_data *tdata,
7340         uint8_t op_mode, uint8_t verify)
7341 {
7342         struct crypto_testsuite_params *ts_params = &testsuite_params;
7343         struct crypto_unittest_params *ut_params = &unittest_params;
7344
7345         int retval;
7346
7347         uint8_t *plaintext = NULL, *ciphertext = NULL;
7348         unsigned int plaintext_pad_len;
7349         unsigned int plaintext_len;
7350         unsigned int ciphertext_pad_len;
7351         unsigned int ciphertext_len;
7352
7353         struct rte_cryptodev_info dev_info;
7354         struct rte_crypto_op *op;
7355
7356         /* Check if device supports particular algorithms separately */
7357         if (test_mixed_check_if_unsupported(tdata))
7358                 return TEST_SKIPPED;
7359         if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
7360                 return TEST_SKIPPED;
7361
7362         rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
7363
7364         uint64_t feat_flags = dev_info.feature_flags;
7365
7366         if (!(feat_flags & RTE_CRYPTODEV_FF_DIGEST_ENCRYPTED)) {
7367                 printf("Device doesn't support digest encrypted.\n");
7368                 return TEST_SKIPPED;
7369         }
7370
7371         /* Create the session */
7372         if (verify)
7373                 retval = create_wireless_algo_cipher_auth_session(
7374                                 ts_params->valid_devs[0],
7375                                 RTE_CRYPTO_CIPHER_OP_DECRYPT,
7376                                 RTE_CRYPTO_AUTH_OP_VERIFY,
7377                                 tdata->auth_algo,
7378                                 tdata->cipher_algo,
7379                                 tdata->auth_key.data, tdata->auth_key.len,
7380                                 tdata->auth_iv.len, tdata->digest_enc.len,
7381                                 tdata->cipher_iv.len);
7382         else
7383                 retval = create_wireless_algo_auth_cipher_session(
7384                                 ts_params->valid_devs[0],
7385                                 RTE_CRYPTO_CIPHER_OP_ENCRYPT,
7386                                 RTE_CRYPTO_AUTH_OP_GENERATE,
7387                                 tdata->auth_algo,
7388                                 tdata->cipher_algo,
7389                                 tdata->auth_key.data, tdata->auth_key.len,
7390                                 tdata->auth_iv.len, tdata->digest_enc.len,
7391                                 tdata->cipher_iv.len);
7392         if (retval != 0)
7393                 return retval;
7394
7395         ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
7396         if (op_mode == OUT_OF_PLACE)
7397                 ut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
7398
7399         /* clear mbuf payload */
7400         memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
7401                 rte_pktmbuf_tailroom(ut_params->ibuf));
7402         if (op_mode == OUT_OF_PLACE) {
7403
7404                 memset(rte_pktmbuf_mtod(ut_params->obuf, uint8_t *), 0,
7405                                 rte_pktmbuf_tailroom(ut_params->obuf));
7406         }
7407
7408         ciphertext_len = ceil_byte_length(tdata->ciphertext.len_bits);
7409         plaintext_len = ceil_byte_length(tdata->plaintext.len_bits);
7410         ciphertext_pad_len = RTE_ALIGN_CEIL(ciphertext_len, 16);
7411         plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16);
7412
7413         if (verify) {
7414                 ciphertext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
7415                                 ciphertext_pad_len);
7416                 memcpy(ciphertext, tdata->ciphertext.data, ciphertext_len);
7417                 debug_hexdump(stdout, "ciphertext:", ciphertext,
7418                                 ciphertext_len);
7419         } else {
7420                 /* make sure enough space to cover partial digest verify case */
7421                 plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
7422                                 ciphertext_pad_len);
7423                 memcpy(plaintext, tdata->plaintext.data, plaintext_len);
7424                 debug_hexdump(stdout, "plaintext:", plaintext, plaintext_len);
7425         }
7426
7427         if (op_mode == OUT_OF_PLACE)
7428                 rte_pktmbuf_append(ut_params->obuf, ciphertext_pad_len);
7429
7430         /* Create the operation */
7431         retval = create_wireless_algo_auth_cipher_operation(
7432                         tdata->digest_enc.data, tdata->digest_enc.len,
7433                         tdata->cipher_iv.data, tdata->cipher_iv.len,
7434                         tdata->auth_iv.data, tdata->auth_iv.len,
7435                         (tdata->digest_enc.offset == 0 ?
7436                                 plaintext_pad_len
7437                                 : tdata->digest_enc.offset),
7438                         tdata->validCipherLen.len_bits,
7439                         tdata->cipher.offset_bits,
7440                         tdata->validAuthLen.len_bits,
7441                         tdata->auth.offset_bits,
7442                         op_mode, 0, verify);
7443
7444         if (retval < 0)
7445                 return retval;
7446
7447         op = process_crypto_request(ts_params->valid_devs[0], ut_params->op);
7448
7449         /* Check if the op failed because the device doesn't */
7450         /* support this particular combination of algorithms */
7451         if (op == NULL && ut_params->op->status ==
7452                         RTE_CRYPTO_OP_STATUS_INVALID_SESSION) {
7453                 printf("Device doesn't support this mixed combination. "
7454                                 "Test Skipped.\n");
7455                 return TEST_SKIPPED;
7456         }
7457         ut_params->op = op;
7458
7459         TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
7460
7461         ut_params->obuf = (op_mode == IN_PLACE ?
7462                         ut_params->op->sym->m_src : ut_params->op->sym->m_dst);
7463
7464         if (verify) {
7465                 if (ut_params->obuf)
7466                         plaintext = rte_pktmbuf_mtod(ut_params->obuf,
7467                                                         uint8_t *);
7468                 else
7469                         plaintext = ciphertext +
7470                                         (tdata->cipher.offset_bits >> 3);
7471
7472                 debug_hexdump(stdout, "plaintext:", plaintext,
7473                                 tdata->plaintext.len_bits >> 3);
7474                 debug_hexdump(stdout, "plaintext expected:",
7475                                 tdata->plaintext.data,
7476                                 tdata->plaintext.len_bits >> 3);
7477         } else {
7478                 if (ut_params->obuf)
7479                         ciphertext = rte_pktmbuf_mtod(ut_params->obuf,
7480                                         uint8_t *);
7481                 else
7482                         ciphertext = plaintext;
7483
7484                 debug_hexdump(stdout, "ciphertext:", ciphertext,
7485                                 ciphertext_len);
7486                 debug_hexdump(stdout, "ciphertext expected:",
7487                                 tdata->ciphertext.data,
7488                                 tdata->ciphertext.len_bits >> 3);
7489
7490                 ut_params->digest = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *)
7491                                 + (tdata->digest_enc.offset == 0 ?
7492                 plaintext_pad_len : tdata->digest_enc.offset);
7493
7494                 debug_hexdump(stdout, "digest:", ut_params->digest,
7495                                 tdata->digest_enc.len);
7496                 debug_hexdump(stdout, "digest expected:",
7497                                 tdata->digest_enc.data,
7498                                 tdata->digest_enc.len);
7499         }
7500
7501         if (!verify) {
7502                 TEST_ASSERT_BUFFERS_ARE_EQUAL(
7503                                 ut_params->digest,
7504                                 tdata->digest_enc.data,
7505                                 tdata->digest_enc.len,
7506                                 "Generated auth tag not as expected");
7507         }
7508
7509         if (tdata->cipher_algo != RTE_CRYPTO_CIPHER_NULL) {
7510                 if (verify) {
7511                         TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
7512                                         plaintext,
7513                                         tdata->plaintext.data,
7514                                         tdata->plaintext.len_bits >> 3,
7515                                         "Plaintext data not as expected");
7516                 } else {
7517                         TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
7518                                         ciphertext,
7519                                         tdata->ciphertext.data,
7520                                         tdata->validDataLen.len_bits,
7521                                         "Ciphertext data not as expected");
7522                 }
7523         }
7524
7525         TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
7526                         "crypto op processing failed");
7527
7528         return 0;
7529 }
7530
7531 static int
7532 test_mixed_auth_cipher_sgl(const struct mixed_cipher_auth_test_data *tdata,
7533         uint8_t op_mode, uint8_t verify)
7534 {
7535         struct crypto_testsuite_params *ts_params = &testsuite_params;
7536         struct crypto_unittest_params *ut_params = &unittest_params;
7537
7538         int retval;
7539
7540         const uint8_t *plaintext = NULL;
7541         const uint8_t *ciphertext = NULL;
7542         const uint8_t *digest = NULL;
7543         unsigned int plaintext_pad_len;
7544         unsigned int plaintext_len;
7545         unsigned int ciphertext_pad_len;
7546         unsigned int ciphertext_len;
7547         uint8_t buffer[10000];
7548         uint8_t digest_buffer[10000];
7549
7550         struct rte_cryptodev_info dev_info;
7551         struct rte_crypto_op *op;
7552
7553         /* Check if device supports particular algorithms */
7554         if (test_mixed_check_if_unsupported(tdata))
7555                 return TEST_SKIPPED;
7556         if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
7557                 return TEST_SKIPPED;
7558
7559         rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
7560
7561         uint64_t feat_flags = dev_info.feature_flags;
7562
7563         if (op_mode == IN_PLACE) {
7564                 if (!(feat_flags & RTE_CRYPTODEV_FF_IN_PLACE_SGL)) {
7565                         printf("Device doesn't support in-place scatter-gather "
7566                                         "in both input and output mbufs.\n");
7567                         return TEST_SKIPPED;
7568                 }
7569         } else {
7570                 if (!(feat_flags & RTE_CRYPTODEV_FF_OOP_SGL_IN_SGL_OUT)) {
7571                         printf("Device doesn't support out-of-place scatter-gather "
7572                                         "in both input and output mbufs.\n");
7573                         return TEST_SKIPPED;
7574                 }
7575                 if (!(feat_flags & RTE_CRYPTODEV_FF_DIGEST_ENCRYPTED)) {
7576                         printf("Device doesn't support digest encrypted.\n");
7577                         return TEST_SKIPPED;
7578                 }
7579         }
7580
7581         /* Create the session */
7582         if (verify)
7583                 retval = create_wireless_algo_cipher_auth_session(
7584                                 ts_params->valid_devs[0],
7585                                 RTE_CRYPTO_CIPHER_OP_DECRYPT,
7586                                 RTE_CRYPTO_AUTH_OP_VERIFY,
7587                                 tdata->auth_algo,
7588                                 tdata->cipher_algo,
7589                                 tdata->auth_key.data, tdata->auth_key.len,
7590                                 tdata->auth_iv.len, tdata->digest_enc.len,
7591                                 tdata->cipher_iv.len);
7592         else
7593                 retval = create_wireless_algo_auth_cipher_session(
7594                                 ts_params->valid_devs[0],
7595                                 RTE_CRYPTO_CIPHER_OP_ENCRYPT,
7596                                 RTE_CRYPTO_AUTH_OP_GENERATE,
7597                                 tdata->auth_algo,
7598                                 tdata->cipher_algo,
7599                                 tdata->auth_key.data, tdata->auth_key.len,
7600                                 tdata->auth_iv.len, tdata->digest_enc.len,
7601                                 tdata->cipher_iv.len);
7602         if (retval != 0)
7603                 return retval;
7604
7605         ciphertext_len = ceil_byte_length(tdata->ciphertext.len_bits);
7606         plaintext_len = ceil_byte_length(tdata->plaintext.len_bits);
7607         ciphertext_pad_len = RTE_ALIGN_CEIL(ciphertext_len, 16);
7608         plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16);
7609
7610         ut_params->ibuf = create_segmented_mbuf(ts_params->mbuf_pool,
7611                         ciphertext_pad_len, 15, 0);
7612         TEST_ASSERT_NOT_NULL(ut_params->ibuf,
7613                         "Failed to allocate input buffer in mempool");
7614
7615         if (op_mode == OUT_OF_PLACE) {
7616                 ut_params->obuf = create_segmented_mbuf(ts_params->mbuf_pool,
7617                                 plaintext_pad_len, 15, 0);
7618                 TEST_ASSERT_NOT_NULL(ut_params->obuf,
7619                                 "Failed to allocate output buffer in mempool");
7620         }
7621
7622         if (verify) {
7623                 pktmbuf_write(ut_params->ibuf, 0, ciphertext_len,
7624                         tdata->ciphertext.data);
7625                 ciphertext = rte_pktmbuf_read(ut_params->ibuf, 0,
7626                                         ciphertext_len, buffer);
7627                 debug_hexdump(stdout, "ciphertext:", ciphertext,
7628                         ciphertext_len);
7629         } else {
7630                 pktmbuf_write(ut_params->ibuf, 0, plaintext_len,
7631                         tdata->plaintext.data);
7632                 plaintext = rte_pktmbuf_read(ut_params->ibuf, 0,
7633                                         plaintext_len, buffer);
7634                 debug_hexdump(stdout, "plaintext:", plaintext,
7635                         plaintext_len);
7636         }
7637         memset(buffer, 0, sizeof(buffer));
7638
7639         /* Create the operation */
7640         retval = create_wireless_algo_auth_cipher_operation(
7641                         tdata->digest_enc.data, tdata->digest_enc.len,
7642                         tdata->cipher_iv.data, tdata->cipher_iv.len,
7643                         tdata->auth_iv.data, tdata->auth_iv.len,
7644                         (tdata->digest_enc.offset == 0 ?
7645                                 plaintext_pad_len
7646                                 : tdata->digest_enc.offset),
7647                         tdata->validCipherLen.len_bits,
7648                         tdata->cipher.offset_bits,
7649                         tdata->validAuthLen.len_bits,
7650                         tdata->auth.offset_bits,
7651                         op_mode, 1, verify);
7652
7653         if (retval < 0)
7654                 return retval;
7655
7656         op = process_crypto_request(ts_params->valid_devs[0], ut_params->op);
7657
7658         /* Check if the op failed because the device doesn't */
7659         /* support this particular combination of algorithms */
7660         if (op == NULL && ut_params->op->status ==
7661                         RTE_CRYPTO_OP_STATUS_INVALID_SESSION) {
7662                 printf("Device doesn't support this mixed combination. "
7663                                 "Test Skipped.\n");
7664                 return TEST_SKIPPED;
7665         }
7666         ut_params->op = op;
7667
7668         TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
7669
7670         ut_params->obuf = (op_mode == IN_PLACE ?
7671                         ut_params->op->sym->m_src : ut_params->op->sym->m_dst);
7672
7673         if (verify) {
7674                 if (ut_params->obuf)
7675                         plaintext = rte_pktmbuf_read(ut_params->obuf, 0,
7676                                         plaintext_len, buffer);
7677                 else
7678                         plaintext = rte_pktmbuf_read(ut_params->ibuf, 0,
7679                                         plaintext_len, buffer);
7680
7681                 debug_hexdump(stdout, "plaintext:", plaintext,
7682                                 (tdata->plaintext.len_bits >> 3) -
7683                                 tdata->digest_enc.len);
7684                 debug_hexdump(stdout, "plaintext expected:",
7685                                 tdata->plaintext.data,
7686                                 (tdata->plaintext.len_bits >> 3) -
7687                                 tdata->digest_enc.len);
7688         } else {
7689                 if (ut_params->obuf)
7690                         ciphertext = rte_pktmbuf_read(ut_params->obuf, 0,
7691                                         ciphertext_len, buffer);
7692                 else
7693                         ciphertext = rte_pktmbuf_read(ut_params->ibuf, 0,
7694                                         ciphertext_len, buffer);
7695
7696                 debug_hexdump(stdout, "ciphertext:", ciphertext,
7697                         ciphertext_len);
7698                 debug_hexdump(stdout, "ciphertext expected:",
7699                         tdata->ciphertext.data,
7700                         tdata->ciphertext.len_bits >> 3);
7701
7702                 if (ut_params->obuf)
7703                         digest = rte_pktmbuf_read(ut_params->obuf,
7704                                         (tdata->digest_enc.offset == 0 ?
7705                                                 plaintext_pad_len :
7706                                                 tdata->digest_enc.offset),
7707                                         tdata->digest_enc.len, digest_buffer);
7708                 else
7709                         digest = rte_pktmbuf_read(ut_params->ibuf,
7710                                         (tdata->digest_enc.offset == 0 ?
7711                                                 plaintext_pad_len :
7712                                                 tdata->digest_enc.offset),
7713                                         tdata->digest_enc.len, digest_buffer);
7714
7715                 debug_hexdump(stdout, "digest:", digest,
7716                                 tdata->digest_enc.len);
7717                 debug_hexdump(stdout, "digest expected:",
7718                                 tdata->digest_enc.data, tdata->digest_enc.len);
7719         }
7720
7721         if (!verify) {
7722                 TEST_ASSERT_BUFFERS_ARE_EQUAL(
7723                                 digest,
7724                                 tdata->digest_enc.data,
7725                                 tdata->digest_enc.len,
7726                                 "Generated auth tag not as expected");
7727         }
7728
7729         if (tdata->cipher_algo != RTE_CRYPTO_CIPHER_NULL) {
7730                 if (verify) {
7731                         TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
7732                                         plaintext,
7733                                         tdata->plaintext.data,
7734                                         tdata->plaintext.len_bits >> 3,
7735                                         "Plaintext data not as expected");
7736                 } else {
7737                         TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
7738                                         ciphertext,
7739                                         tdata->ciphertext.data,
7740                                         tdata->validDataLen.len_bits,
7741                                         "Ciphertext data not as expected");
7742                 }
7743         }
7744
7745         TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
7746                         "crypto op processing failed");
7747
7748         return 0;
7749 }
7750
7751 /** AUTH AES CMAC + CIPHER AES CTR */
7752
7753 static int
7754 test_aes_cmac_aes_ctr_digest_enc_test_case_1(void)
7755 {
7756         return test_mixed_auth_cipher(
7757                 &auth_aes_cmac_cipher_aes_ctr_test_case_1, IN_PLACE, 0);
7758 }
7759
7760 static int
7761 test_aes_cmac_aes_ctr_digest_enc_test_case_1_oop(void)
7762 {
7763         return test_mixed_auth_cipher(
7764                 &auth_aes_cmac_cipher_aes_ctr_test_case_1, OUT_OF_PLACE, 0);
7765 }
7766
7767 static int
7768 test_aes_cmac_aes_ctr_digest_enc_test_case_1_sgl(void)
7769 {
7770         return test_mixed_auth_cipher_sgl(
7771                 &auth_aes_cmac_cipher_aes_ctr_test_case_1, IN_PLACE, 0);
7772 }
7773
7774 static int
7775 test_aes_cmac_aes_ctr_digest_enc_test_case_1_oop_sgl(void)
7776 {
7777         return test_mixed_auth_cipher_sgl(
7778                 &auth_aes_cmac_cipher_aes_ctr_test_case_1, OUT_OF_PLACE, 0);
7779 }
7780
7781 static int
7782 test_verify_aes_cmac_aes_ctr_digest_enc_test_case_1(void)
7783 {
7784         return test_mixed_auth_cipher(
7785                 &auth_aes_cmac_cipher_aes_ctr_test_case_1, IN_PLACE, 1);
7786 }
7787
7788 static int
7789 test_verify_aes_cmac_aes_ctr_digest_enc_test_case_1_oop(void)
7790 {
7791         return test_mixed_auth_cipher(
7792                 &auth_aes_cmac_cipher_aes_ctr_test_case_1, OUT_OF_PLACE, 1);
7793 }
7794
7795 static int
7796 test_verify_aes_cmac_aes_ctr_digest_enc_test_case_1_sgl(void)
7797 {
7798         return test_mixed_auth_cipher_sgl(
7799                 &auth_aes_cmac_cipher_aes_ctr_test_case_1, IN_PLACE, 1);
7800 }
7801
7802 static int
7803 test_verify_aes_cmac_aes_ctr_digest_enc_test_case_1_oop_sgl(void)
7804 {
7805         return test_mixed_auth_cipher_sgl(
7806                 &auth_aes_cmac_cipher_aes_ctr_test_case_1, OUT_OF_PLACE, 1);
7807 }
7808
7809 /** MIXED AUTH + CIPHER */
7810
7811 static int
7812 test_auth_zuc_cipher_snow_test_case_1(void)
7813 {
7814         return test_mixed_auth_cipher(
7815                 &auth_zuc_cipher_snow_test_case_1, OUT_OF_PLACE, 0);
7816 }
7817
7818 static int
7819 test_verify_auth_zuc_cipher_snow_test_case_1(void)
7820 {
7821         return test_mixed_auth_cipher(
7822                 &auth_zuc_cipher_snow_test_case_1, OUT_OF_PLACE, 1);
7823 }
7824
7825 static int
7826 test_auth_aes_cmac_cipher_snow_test_case_1(void)
7827 {
7828         return test_mixed_auth_cipher(
7829                 &auth_aes_cmac_cipher_snow_test_case_1, OUT_OF_PLACE, 0);
7830 }
7831
7832 static int
7833 test_verify_auth_aes_cmac_cipher_snow_test_case_1(void)
7834 {
7835         return test_mixed_auth_cipher(
7836                 &auth_aes_cmac_cipher_snow_test_case_1, OUT_OF_PLACE, 1);
7837 }
7838
7839 static int
7840 test_auth_zuc_cipher_aes_ctr_test_case_1(void)
7841 {
7842         return test_mixed_auth_cipher(
7843                 &auth_zuc_cipher_aes_ctr_test_case_1, OUT_OF_PLACE, 0);
7844 }
7845
7846 static int
7847 test_verify_auth_zuc_cipher_aes_ctr_test_case_1(void)
7848 {
7849         return test_mixed_auth_cipher(
7850                 &auth_zuc_cipher_aes_ctr_test_case_1, OUT_OF_PLACE, 1);
7851 }
7852
7853 static int
7854 test_auth_snow_cipher_aes_ctr_test_case_1(void)
7855 {
7856         return test_mixed_auth_cipher(
7857                 &auth_snow_cipher_aes_ctr_test_case_1, OUT_OF_PLACE, 0);
7858 }
7859
7860 static int
7861 test_verify_auth_snow_cipher_aes_ctr_test_case_1(void)
7862 {
7863         return test_mixed_auth_cipher(
7864                 &auth_snow_cipher_aes_ctr_test_case_1, OUT_OF_PLACE, 1);
7865 }
7866
7867 static int
7868 test_auth_snow_cipher_zuc_test_case_1(void)
7869 {
7870         return test_mixed_auth_cipher(
7871                 &auth_snow_cipher_zuc_test_case_1, OUT_OF_PLACE, 0);
7872 }
7873
7874 static int
7875 test_verify_auth_snow_cipher_zuc_test_case_1(void)
7876 {
7877         return test_mixed_auth_cipher(
7878                 &auth_snow_cipher_zuc_test_case_1, OUT_OF_PLACE, 1);
7879 }
7880
7881 static int
7882 test_auth_aes_cmac_cipher_zuc_test_case_1(void)
7883 {
7884         return test_mixed_auth_cipher(
7885                 &auth_aes_cmac_cipher_zuc_test_case_1, OUT_OF_PLACE, 0);
7886 }
7887
7888 static int
7889 test_verify_auth_aes_cmac_cipher_zuc_test_case_1(void)
7890 {
7891         return test_mixed_auth_cipher(
7892                 &auth_aes_cmac_cipher_zuc_test_case_1, OUT_OF_PLACE, 1);
7893 }
7894
7895 static int
7896 test_auth_null_cipher_snow_test_case_1(void)
7897 {
7898         return test_mixed_auth_cipher(
7899                 &auth_null_cipher_snow_test_case_1, OUT_OF_PLACE, 0);
7900 }
7901
7902 static int
7903 test_verify_auth_null_cipher_snow_test_case_1(void)
7904 {
7905         return test_mixed_auth_cipher(
7906                 &auth_null_cipher_snow_test_case_1, OUT_OF_PLACE, 1);
7907 }
7908
7909 static int
7910 test_auth_null_cipher_zuc_test_case_1(void)
7911 {
7912         return test_mixed_auth_cipher(
7913                 &auth_null_cipher_zuc_test_case_1, OUT_OF_PLACE, 0);
7914 }
7915
7916 static int
7917 test_verify_auth_null_cipher_zuc_test_case_1(void)
7918 {
7919         return test_mixed_auth_cipher(
7920                 &auth_null_cipher_zuc_test_case_1, OUT_OF_PLACE, 1);
7921 }
7922
7923 static int
7924 test_auth_snow_cipher_null_test_case_1(void)
7925 {
7926         return test_mixed_auth_cipher(
7927                 &auth_snow_cipher_null_test_case_1, OUT_OF_PLACE, 0);
7928 }
7929
7930 static int
7931 test_verify_auth_snow_cipher_null_test_case_1(void)
7932 {
7933         return test_mixed_auth_cipher(
7934                 &auth_snow_cipher_null_test_case_1, OUT_OF_PLACE, 1);
7935 }
7936
7937 static int
7938 test_auth_zuc_cipher_null_test_case_1(void)
7939 {
7940         return test_mixed_auth_cipher(
7941                 &auth_zuc_cipher_null_test_case_1, OUT_OF_PLACE, 0);
7942 }
7943
7944 static int
7945 test_verify_auth_zuc_cipher_null_test_case_1(void)
7946 {
7947         return test_mixed_auth_cipher(
7948                 &auth_zuc_cipher_null_test_case_1, OUT_OF_PLACE, 1);
7949 }
7950
7951 static int
7952 test_auth_null_cipher_aes_ctr_test_case_1(void)
7953 {
7954         return test_mixed_auth_cipher(
7955                 &auth_null_cipher_aes_ctr_test_case_1, OUT_OF_PLACE, 0);
7956 }
7957
7958 static int
7959 test_verify_auth_null_cipher_aes_ctr_test_case_1(void)
7960 {
7961         return test_mixed_auth_cipher(
7962                 &auth_null_cipher_aes_ctr_test_case_1, OUT_OF_PLACE, 1);
7963 }
7964
7965 static int
7966 test_auth_aes_cmac_cipher_null_test_case_1(void)
7967 {
7968         return test_mixed_auth_cipher(
7969                 &auth_aes_cmac_cipher_null_test_case_1, OUT_OF_PLACE, 0);
7970 }
7971
7972 static int
7973 test_verify_auth_aes_cmac_cipher_null_test_case_1(void)
7974 {
7975         return test_mixed_auth_cipher(
7976                 &auth_aes_cmac_cipher_null_test_case_1, OUT_OF_PLACE, 1);
7977 }
7978
7979 /* ***** AEAD algorithm Tests ***** */
7980
7981 static int
7982 create_aead_session(uint8_t dev_id, enum rte_crypto_aead_algorithm algo,
7983                 enum rte_crypto_aead_operation op,
7984                 const uint8_t *key, const uint8_t key_len,
7985                 const uint16_t aad_len, const uint8_t auth_len,
7986                 uint8_t iv_len)
7987 {
7988         uint8_t aead_key[key_len];
7989         int status;
7990
7991         struct crypto_testsuite_params *ts_params = &testsuite_params;
7992         struct crypto_unittest_params *ut_params = &unittest_params;
7993
7994         memcpy(aead_key, key, key_len);
7995
7996         /* Setup AEAD Parameters */
7997         ut_params->aead_xform.type = RTE_CRYPTO_SYM_XFORM_AEAD;
7998         ut_params->aead_xform.next = NULL;
7999         ut_params->aead_xform.aead.algo = algo;
8000         ut_params->aead_xform.aead.op = op;
8001         ut_params->aead_xform.aead.key.data = aead_key;
8002         ut_params->aead_xform.aead.key.length = key_len;
8003         ut_params->aead_xform.aead.iv.offset = IV_OFFSET;
8004         ut_params->aead_xform.aead.iv.length = iv_len;
8005         ut_params->aead_xform.aead.digest_length = auth_len;
8006         ut_params->aead_xform.aead.aad_length = aad_len;
8007
8008         debug_hexdump(stdout, "key:", key, key_len);
8009
8010         /* Create Crypto session*/
8011         ut_params->sess = rte_cryptodev_sym_session_create(
8012                         ts_params->session_mpool);
8013         TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed");
8014
8015         status = rte_cryptodev_sym_session_init(dev_id, ut_params->sess,
8016                         &ut_params->aead_xform,
8017                         ts_params->session_priv_mpool);
8018
8019         return status;
8020 }
8021
8022 static int
8023 create_aead_xform(struct rte_crypto_op *op,
8024                 enum rte_crypto_aead_algorithm algo,
8025                 enum rte_crypto_aead_operation aead_op,
8026                 uint8_t *key, const uint8_t key_len,
8027                 const uint8_t aad_len, const uint8_t auth_len,
8028                 uint8_t iv_len)
8029 {
8030         TEST_ASSERT_NOT_NULL(rte_crypto_op_sym_xforms_alloc(op, 1),
8031                         "failed to allocate space for crypto transform");
8032
8033         struct rte_crypto_sym_op *sym_op = op->sym;
8034
8035         /* Setup AEAD Parameters */
8036         sym_op->xform->type = RTE_CRYPTO_SYM_XFORM_AEAD;
8037         sym_op->xform->next = NULL;
8038         sym_op->xform->aead.algo = algo;
8039         sym_op->xform->aead.op = aead_op;
8040         sym_op->xform->aead.key.data = key;
8041         sym_op->xform->aead.key.length = key_len;
8042         sym_op->xform->aead.iv.offset = IV_OFFSET;
8043         sym_op->xform->aead.iv.length = iv_len;
8044         sym_op->xform->aead.digest_length = auth_len;
8045         sym_op->xform->aead.aad_length = aad_len;
8046
8047         debug_hexdump(stdout, "key:", key, key_len);
8048
8049         return 0;
8050 }
8051
8052 static int
8053 create_aead_operation(enum rte_crypto_aead_operation op,
8054                 const struct aead_test_data *tdata)
8055 {
8056         struct crypto_testsuite_params *ts_params = &testsuite_params;
8057         struct crypto_unittest_params *ut_params = &unittest_params;
8058
8059         uint8_t *plaintext, *ciphertext;
8060         unsigned int aad_pad_len, plaintext_pad_len;
8061
8062         /* Generate Crypto op data structure */
8063         ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
8064                         RTE_CRYPTO_OP_TYPE_SYMMETRIC);
8065         TEST_ASSERT_NOT_NULL(ut_params->op,
8066                         "Failed to allocate symmetric crypto operation struct");
8067
8068         struct rte_crypto_sym_op *sym_op = ut_params->op->sym;
8069
8070         /* Append aad data */
8071         if (tdata->algo == RTE_CRYPTO_AEAD_AES_CCM) {
8072                 aad_pad_len = RTE_ALIGN_CEIL(tdata->aad.len + 18, 16);
8073                 sym_op->aead.aad.data = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
8074                                 aad_pad_len);
8075                 TEST_ASSERT_NOT_NULL(sym_op->aead.aad.data,
8076                                 "no room to append aad");
8077
8078                 sym_op->aead.aad.phys_addr =
8079                                 rte_pktmbuf_iova(ut_params->ibuf);
8080                 /* Copy AAD 18 bytes after the AAD pointer, according to the API */
8081                 memcpy(sym_op->aead.aad.data + 18, tdata->aad.data, tdata->aad.len);
8082                 debug_hexdump(stdout, "aad:", sym_op->aead.aad.data,
8083                         tdata->aad.len);
8084
8085                 /* Append IV at the end of the crypto operation*/
8086                 uint8_t *iv_ptr = rte_crypto_op_ctod_offset(ut_params->op,
8087                                 uint8_t *, IV_OFFSET);
8088
8089                 /* Copy IV 1 byte after the IV pointer, according to the API */
8090                 rte_memcpy(iv_ptr + 1, tdata->iv.data, tdata->iv.len);
8091                 debug_hexdump(stdout, "iv:", iv_ptr,
8092                         tdata->iv.len);
8093         } else {
8094                 aad_pad_len = RTE_ALIGN_CEIL(tdata->aad.len, 16);
8095                 sym_op->aead.aad.data = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
8096                                 aad_pad_len);
8097                 TEST_ASSERT_NOT_NULL(sym_op->aead.aad.data,
8098                                 "no room to append aad");
8099
8100                 sym_op->aead.aad.phys_addr =
8101                                 rte_pktmbuf_iova(ut_params->ibuf);
8102                 memcpy(sym_op->aead.aad.data, tdata->aad.data, tdata->aad.len);
8103                 debug_hexdump(stdout, "aad:", sym_op->aead.aad.data,
8104                         tdata->aad.len);
8105
8106                 /* Append IV at the end of the crypto operation*/
8107                 uint8_t *iv_ptr = rte_crypto_op_ctod_offset(ut_params->op,
8108                                 uint8_t *, IV_OFFSET);
8109
8110                 if (tdata->iv.len == 0) {
8111                         rte_memcpy(iv_ptr, tdata->iv.data, AES_GCM_J0_LENGTH);
8112                         debug_hexdump(stdout, "iv:", iv_ptr,
8113                                 AES_GCM_J0_LENGTH);
8114                 } else {
8115                         rte_memcpy(iv_ptr, tdata->iv.data, tdata->iv.len);
8116                         debug_hexdump(stdout, "iv:", iv_ptr,
8117                                 tdata->iv.len);
8118                 }
8119         }
8120
8121         /* Append plaintext/ciphertext */
8122         if (op == RTE_CRYPTO_AEAD_OP_ENCRYPT) {
8123                 plaintext_pad_len = RTE_ALIGN_CEIL(tdata->plaintext.len, 16);
8124                 plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
8125                                 plaintext_pad_len);
8126                 TEST_ASSERT_NOT_NULL(plaintext, "no room to append plaintext");
8127
8128                 memcpy(plaintext, tdata->plaintext.data, tdata->plaintext.len);
8129                 debug_hexdump(stdout, "plaintext:", plaintext,
8130                                 tdata->plaintext.len);
8131
8132                 if (ut_params->obuf) {
8133                         ciphertext = (uint8_t *)rte_pktmbuf_append(
8134                                         ut_params->obuf,
8135                                         plaintext_pad_len + aad_pad_len);
8136                         TEST_ASSERT_NOT_NULL(ciphertext,
8137                                         "no room to append ciphertext");
8138
8139                         memset(ciphertext + aad_pad_len, 0,
8140                                         tdata->ciphertext.len);
8141                 }
8142         } else {
8143                 plaintext_pad_len = RTE_ALIGN_CEIL(tdata->ciphertext.len, 16);
8144                 ciphertext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
8145                                 plaintext_pad_len);
8146                 TEST_ASSERT_NOT_NULL(ciphertext,
8147                                 "no room to append ciphertext");
8148
8149                 memcpy(ciphertext, tdata->ciphertext.data,
8150                                 tdata->ciphertext.len);
8151                 debug_hexdump(stdout, "ciphertext:", ciphertext,
8152                                 tdata->ciphertext.len);
8153
8154                 if (ut_params->obuf) {
8155                         plaintext = (uint8_t *)rte_pktmbuf_append(
8156                                         ut_params->obuf,
8157                                         plaintext_pad_len + aad_pad_len);
8158                         TEST_ASSERT_NOT_NULL(plaintext,
8159                                         "no room to append plaintext");
8160
8161                         memset(plaintext + aad_pad_len, 0,
8162                                         tdata->plaintext.len);
8163                 }
8164         }
8165
8166         /* Append digest data */
8167         if (op == RTE_CRYPTO_AEAD_OP_ENCRYPT) {
8168                 sym_op->aead.digest.data = (uint8_t *)rte_pktmbuf_append(
8169                                 ut_params->obuf ? ut_params->obuf :
8170                                                 ut_params->ibuf,
8171                                                 tdata->auth_tag.len);
8172                 TEST_ASSERT_NOT_NULL(sym_op->aead.digest.data,
8173                                 "no room to append digest");
8174                 memset(sym_op->aead.digest.data, 0, tdata->auth_tag.len);
8175                 sym_op->aead.digest.phys_addr = rte_pktmbuf_iova_offset(
8176                                 ut_params->obuf ? ut_params->obuf :
8177                                                 ut_params->ibuf,
8178                                                 plaintext_pad_len +
8179                                                 aad_pad_len);
8180         } else {
8181                 sym_op->aead.digest.data = (uint8_t *)rte_pktmbuf_append(
8182                                 ut_params->ibuf, tdata->auth_tag.len);
8183                 TEST_ASSERT_NOT_NULL(sym_op->aead.digest.data,
8184                                 "no room to append digest");
8185                 sym_op->aead.digest.phys_addr = rte_pktmbuf_iova_offset(
8186                                 ut_params->ibuf,
8187                                 plaintext_pad_len + aad_pad_len);
8188
8189                 rte_memcpy(sym_op->aead.digest.data, tdata->auth_tag.data,
8190                         tdata->auth_tag.len);
8191                 debug_hexdump(stdout, "digest:",
8192                         sym_op->aead.digest.data,
8193                         tdata->auth_tag.len);
8194         }
8195
8196         sym_op->aead.data.length = tdata->plaintext.len;
8197         sym_op->aead.data.offset = aad_pad_len;
8198
8199         return 0;
8200 }
8201
8202 static int
8203 test_authenticated_encryption(const struct aead_test_data *tdata)
8204 {
8205         struct crypto_testsuite_params *ts_params = &testsuite_params;
8206         struct crypto_unittest_params *ut_params = &unittest_params;
8207
8208         int retval;
8209         uint8_t *ciphertext, *auth_tag;
8210         uint16_t plaintext_pad_len;
8211         uint32_t i;
8212         struct rte_cryptodev_info dev_info;
8213
8214         rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
8215         uint64_t feat_flags = dev_info.feature_flags;
8216
8217         if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
8218                         (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
8219                 printf("Device doesn't support RAW data-path APIs.\n");
8220                 return TEST_SKIPPED;
8221         }
8222
8223         /* Verify the capabilities */
8224         struct rte_cryptodev_sym_capability_idx cap_idx;
8225         const struct rte_cryptodev_symmetric_capability *capability;
8226         cap_idx.type = RTE_CRYPTO_SYM_XFORM_AEAD;
8227         cap_idx.algo.aead = tdata->algo;
8228         capability = rte_cryptodev_sym_capability_get(
8229                         ts_params->valid_devs[0], &cap_idx);
8230         if (capability == NULL)
8231                 return TEST_SKIPPED;
8232         if (rte_cryptodev_sym_capability_check_aead(
8233                         capability, tdata->key.len, tdata->auth_tag.len,
8234                         tdata->aad.len, tdata->iv.len))
8235                 return TEST_SKIPPED;
8236
8237         /* Create AEAD session */
8238         retval = create_aead_session(ts_params->valid_devs[0],
8239                         tdata->algo,
8240                         RTE_CRYPTO_AEAD_OP_ENCRYPT,
8241                         tdata->key.data, tdata->key.len,
8242                         tdata->aad.len, tdata->auth_tag.len,
8243                         tdata->iv.len);
8244         if (retval < 0)
8245                 return retval;
8246
8247         if (tdata->aad.len > MBUF_SIZE) {
8248                 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->large_mbuf_pool);
8249                 /* Populate full size of add data */
8250                 for (i = 32; i < MAX_AAD_LENGTH; i += 32)
8251                         memcpy(&tdata->aad.data[i], &tdata->aad.data[0], 32);
8252         } else
8253                 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
8254
8255         /* clear mbuf payload */
8256         memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
8257                         rte_pktmbuf_tailroom(ut_params->ibuf));
8258
8259         /* Create AEAD operation */
8260         retval = create_aead_operation(RTE_CRYPTO_AEAD_OP_ENCRYPT, tdata);
8261         if (retval < 0)
8262                 return retval;
8263
8264         rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
8265
8266         ut_params->op->sym->m_src = ut_params->ibuf;
8267
8268         /* Process crypto operation */
8269         if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
8270                 process_cpu_aead_op(ts_params->valid_devs[0], ut_params->op);
8271         else if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
8272                 process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
8273                                 ut_params->op, 0, 0, 0, 0);
8274         else
8275                 TEST_ASSERT_NOT_NULL(
8276                         process_crypto_request(ts_params->valid_devs[0],
8277                         ut_params->op), "failed to process sym crypto op");
8278
8279         TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
8280                         "crypto op processing failed");
8281
8282         plaintext_pad_len = RTE_ALIGN_CEIL(tdata->plaintext.len, 16);
8283
8284         if (ut_params->op->sym->m_dst) {
8285                 ciphertext = rte_pktmbuf_mtod(ut_params->op->sym->m_dst,
8286                                 uint8_t *);
8287                 auth_tag = rte_pktmbuf_mtod_offset(ut_params->op->sym->m_dst,
8288                                 uint8_t *, plaintext_pad_len);
8289         } else {
8290                 ciphertext = rte_pktmbuf_mtod_offset(ut_params->op->sym->m_src,
8291                                 uint8_t *,
8292                                 ut_params->op->sym->cipher.data.offset);
8293                 auth_tag = ciphertext + plaintext_pad_len;
8294         }
8295
8296         debug_hexdump(stdout, "ciphertext:", ciphertext, tdata->ciphertext.len);
8297         debug_hexdump(stdout, "auth tag:", auth_tag, tdata->auth_tag.len);
8298
8299         /* Validate obuf */
8300         TEST_ASSERT_BUFFERS_ARE_EQUAL(
8301                         ciphertext,
8302                         tdata->ciphertext.data,
8303                         tdata->ciphertext.len,
8304                         "Ciphertext data not as expected");
8305
8306         TEST_ASSERT_BUFFERS_ARE_EQUAL(
8307                         auth_tag,
8308                         tdata->auth_tag.data,
8309                         tdata->auth_tag.len,
8310                         "Generated auth tag not as expected");
8311
8312         return 0;
8313
8314 }
8315
8316 #ifdef RTE_LIB_SECURITY
8317 static int
8318 security_proto_supported(enum rte_security_session_action_type action,
8319         enum rte_security_session_protocol proto)
8320 {
8321         struct crypto_testsuite_params *ts_params = &testsuite_params;
8322
8323         const struct rte_security_capability *capabilities;
8324         const struct rte_security_capability *capability;
8325         uint16_t i = 0;
8326
8327         struct rte_security_ctx *ctx = (struct rte_security_ctx *)
8328                                 rte_cryptodev_get_sec_ctx(
8329                                 ts_params->valid_devs[0]);
8330
8331
8332         capabilities = rte_security_capabilities_get(ctx);
8333
8334         if (capabilities == NULL)
8335                 return -ENOTSUP;
8336
8337         while ((capability = &capabilities[i++])->action !=
8338                         RTE_SECURITY_ACTION_TYPE_NONE) {
8339                 if (capability->action == action &&
8340                                 capability->protocol == proto)
8341                         return 0;
8342         }
8343
8344         return -ENOTSUP;
8345 }
8346
8347 /* Basic algorithm run function for async inplace mode.
8348  * Creates a session from input parameters and runs one operation
8349  * on input_vec. Checks the output of the crypto operation against
8350  * output_vec.
8351  */
8352 static int test_pdcp_proto(int i, int oop, enum rte_crypto_cipher_operation opc,
8353                            enum rte_crypto_auth_operation opa,
8354                            const uint8_t *input_vec, unsigned int input_vec_len,
8355                            const uint8_t *output_vec,
8356                            unsigned int output_vec_len,
8357                            enum rte_crypto_cipher_algorithm cipher_alg,
8358                            const uint8_t *cipher_key, uint32_t cipher_key_len,
8359                            enum rte_crypto_auth_algorithm auth_alg,
8360                            const uint8_t *auth_key, uint32_t auth_key_len,
8361                            uint8_t bearer, enum rte_security_pdcp_domain domain,
8362                            uint8_t packet_direction, uint8_t sn_size,
8363                            uint32_t hfn, uint32_t hfn_threshold, uint8_t sdap)
8364 {
8365         struct crypto_testsuite_params *ts_params = &testsuite_params;
8366         struct crypto_unittest_params *ut_params = &unittest_params;
8367         uint8_t *plaintext;
8368         int ret = TEST_SUCCESS;
8369         struct rte_security_ctx *ctx = (struct rte_security_ctx *)
8370                                 rte_cryptodev_get_sec_ctx(
8371                                 ts_params->valid_devs[0]);
8372
8373         /* Verify the capabilities */
8374         struct rte_security_capability_idx sec_cap_idx;
8375
8376         sec_cap_idx.action = ut_params->type;
8377         sec_cap_idx.protocol = RTE_SECURITY_PROTOCOL_PDCP;
8378         sec_cap_idx.pdcp.domain = domain;
8379         if (rte_security_capability_get(ctx, &sec_cap_idx) == NULL)
8380                 return TEST_SKIPPED;
8381
8382         /* Generate test mbuf data */
8383         ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
8384
8385         /* clear mbuf payload */
8386         memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
8387                         rte_pktmbuf_tailroom(ut_params->ibuf));
8388
8389         plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
8390                                                   input_vec_len);
8391         memcpy(plaintext, input_vec, input_vec_len);
8392
8393         /* Out of place support */
8394         if (oop) {
8395                 /*
8396                  * For out-op-place we need to alloc another mbuf
8397                  */
8398                 ut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
8399                 rte_pktmbuf_append(ut_params->obuf, output_vec_len);
8400         }
8401
8402         /* Setup Cipher Parameters */
8403         ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
8404         ut_params->cipher_xform.cipher.algo = cipher_alg;
8405         ut_params->cipher_xform.cipher.op = opc;
8406         ut_params->cipher_xform.cipher.key.data = cipher_key;
8407         ut_params->cipher_xform.cipher.key.length = cipher_key_len;
8408         ut_params->cipher_xform.cipher.iv.length =
8409                                 packet_direction ? 4 : 0;
8410         ut_params->cipher_xform.cipher.iv.offset = IV_OFFSET;
8411
8412         /* Setup HMAC Parameters if ICV header is required */
8413         if (auth_alg != 0) {
8414                 ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;
8415                 ut_params->auth_xform.next = NULL;
8416                 ut_params->auth_xform.auth.algo = auth_alg;
8417                 ut_params->auth_xform.auth.op = opa;
8418                 ut_params->auth_xform.auth.key.data = auth_key;
8419                 ut_params->auth_xform.auth.key.length = auth_key_len;
8420
8421                 ut_params->cipher_xform.next = &ut_params->auth_xform;
8422         } else {
8423                 ut_params->cipher_xform.next = NULL;
8424         }
8425
8426         struct rte_security_session_conf sess_conf = {
8427                 .action_type = ut_params->type,
8428                 .protocol = RTE_SECURITY_PROTOCOL_PDCP,
8429                 {.pdcp = {
8430                         .bearer = bearer,
8431                         .domain = domain,
8432                         .pkt_dir = packet_direction,
8433                         .sn_size = sn_size,
8434                         .hfn = packet_direction ? 0 : hfn,
8435                         /**
8436                          * hfn can be set as pdcp_test_hfn[i]
8437                          * if hfn_ovrd is not set. Here, PDCP
8438                          * packet direction is just used to
8439                          * run half of the cases with session
8440                          * HFN and other half with per packet
8441                          * HFN.
8442                          */
8443                         .hfn_threshold = hfn_threshold,
8444                         .hfn_ovrd = packet_direction ? 1 : 0,
8445                         .sdap_enabled = sdap,
8446                 } },
8447                 .crypto_xform = &ut_params->cipher_xform
8448         };
8449
8450         /* Create security session */
8451         ut_params->sec_session = rte_security_session_create(ctx,
8452                                 &sess_conf, ts_params->session_mpool,
8453                                 ts_params->session_priv_mpool);
8454
8455         if (!ut_params->sec_session) {
8456                 printf("TestCase %s()-%d line %d failed %s: ",
8457                         __func__, i, __LINE__, "Failed to allocate session");
8458                 ret = TEST_FAILED;
8459                 goto on_err;
8460         }
8461
8462         /* Generate crypto op data structure */
8463         ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
8464                         RTE_CRYPTO_OP_TYPE_SYMMETRIC);
8465         if (!ut_params->op) {
8466                 printf("TestCase %s()-%d line %d failed %s: ",
8467                         __func__, i, __LINE__,
8468                         "Failed to allocate symmetric crypto operation struct");
8469                 ret = TEST_FAILED;
8470                 goto on_err;
8471         }
8472
8473         uint32_t *per_pkt_hfn = rte_crypto_op_ctod_offset(ut_params->op,
8474                                         uint32_t *, IV_OFFSET);
8475         *per_pkt_hfn = packet_direction ? hfn : 0;
8476
8477         rte_security_attach_session(ut_params->op, ut_params->sec_session);
8478
8479         /* set crypto operation source mbuf */
8480         ut_params->op->sym->m_src = ut_params->ibuf;
8481         if (oop)
8482                 ut_params->op->sym->m_dst = ut_params->obuf;
8483
8484         /* Process crypto operation */
8485         if (process_crypto_request(ts_params->valid_devs[0], ut_params->op)
8486                 == NULL) {
8487                 printf("TestCase %s()-%d line %d failed %s: ",
8488                         __func__, i, __LINE__,
8489                         "failed to process sym crypto op");
8490                 ret = TEST_FAILED;
8491                 goto on_err;
8492         }
8493
8494         if (ut_params->op->status != RTE_CRYPTO_OP_STATUS_SUCCESS) {
8495                 printf("TestCase %s()-%d line %d failed %s: ",
8496                         __func__, i, __LINE__, "crypto op processing failed");
8497                 ret = TEST_FAILED;
8498                 goto on_err;
8499         }
8500
8501         /* Validate obuf */
8502         uint8_t *ciphertext = rte_pktmbuf_mtod(ut_params->op->sym->m_src,
8503                         uint8_t *);
8504         if (oop) {
8505                 ciphertext = rte_pktmbuf_mtod(ut_params->op->sym->m_dst,
8506                                 uint8_t *);
8507         }
8508
8509         if (memcmp(ciphertext, output_vec, output_vec_len)) {
8510                 printf("\n=======PDCP TestCase #%d failed: Data Mismatch ", i);
8511                 rte_hexdump(stdout, "encrypted", ciphertext, output_vec_len);
8512                 rte_hexdump(stdout, "reference", output_vec, output_vec_len);
8513                 ret = TEST_FAILED;
8514                 goto on_err;
8515         }
8516
8517 on_err:
8518         rte_crypto_op_free(ut_params->op);
8519         ut_params->op = NULL;
8520
8521         if (ut_params->sec_session)
8522                 rte_security_session_destroy(ctx, ut_params->sec_session);
8523         ut_params->sec_session = NULL;
8524
8525         rte_pktmbuf_free(ut_params->ibuf);
8526         ut_params->ibuf = NULL;
8527         if (oop) {
8528                 rte_pktmbuf_free(ut_params->obuf);
8529                 ut_params->obuf = NULL;
8530         }
8531
8532         return ret;
8533 }
8534
8535 static int
8536 test_pdcp_proto_SGL(int i, int oop,
8537         enum rte_crypto_cipher_operation opc,
8538         enum rte_crypto_auth_operation opa,
8539         uint8_t *input_vec,
8540         unsigned int input_vec_len,
8541         uint8_t *output_vec,
8542         unsigned int output_vec_len,
8543         uint32_t fragsz,
8544         uint32_t fragsz_oop)
8545 {
8546         struct crypto_testsuite_params *ts_params = &testsuite_params;
8547         struct crypto_unittest_params *ut_params = &unittest_params;
8548         uint8_t *plaintext;
8549         struct rte_mbuf *buf, *buf_oop = NULL;
8550         int ret = TEST_SUCCESS;
8551         int to_trn = 0;
8552         int to_trn_tbl[16];
8553         int segs = 1;
8554         unsigned int trn_data = 0;
8555         struct rte_cryptodev_info dev_info;
8556         uint64_t feat_flags;
8557         struct rte_security_ctx *ctx = (struct rte_security_ctx *)
8558                                 rte_cryptodev_get_sec_ctx(
8559                                 ts_params->valid_devs[0]);
8560         struct rte_mbuf *temp_mbuf;
8561
8562         rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
8563         feat_flags = dev_info.feature_flags;
8564
8565         if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
8566                         (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
8567                 printf("Device does not support RAW data-path APIs.\n");
8568                 return -ENOTSUP;
8569         }
8570         /* Verify the capabilities */
8571         struct rte_security_capability_idx sec_cap_idx;
8572
8573         sec_cap_idx.action = ut_params->type;
8574         sec_cap_idx.protocol = RTE_SECURITY_PROTOCOL_PDCP;
8575         sec_cap_idx.pdcp.domain = pdcp_test_params[i].domain;
8576         if (rte_security_capability_get(ctx, &sec_cap_idx) == NULL)
8577                 return TEST_SKIPPED;
8578
8579         if (fragsz > input_vec_len)
8580                 fragsz = input_vec_len;
8581
8582         uint16_t plaintext_len = fragsz;
8583         uint16_t frag_size_oop = fragsz_oop ? fragsz_oop : fragsz;
8584
8585         if (fragsz_oop > output_vec_len)
8586                 frag_size_oop = output_vec_len;
8587
8588         int ecx = 0;
8589         if (input_vec_len % fragsz != 0) {
8590                 if (input_vec_len / fragsz + 1 > 16)
8591                         return 1;
8592         } else if (input_vec_len / fragsz > 16)
8593                 return 1;
8594
8595         /* Out of place support */
8596         if (oop) {
8597                 /*
8598                  * For out-op-place we need to alloc another mbuf
8599                  */
8600                 ut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
8601                 rte_pktmbuf_append(ut_params->obuf, frag_size_oop);
8602                 buf_oop = ut_params->obuf;
8603         }
8604
8605         /* Generate test mbuf data */
8606         ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
8607
8608         /* clear mbuf payload */
8609         memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
8610                         rte_pktmbuf_tailroom(ut_params->ibuf));
8611
8612         plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
8613                                                   plaintext_len);
8614         memcpy(plaintext, input_vec, plaintext_len);
8615         trn_data += plaintext_len;
8616
8617         buf = ut_params->ibuf;
8618
8619         /*
8620          * Loop until no more fragments
8621          */
8622
8623         while (trn_data < input_vec_len) {
8624                 ++segs;
8625                 to_trn = (input_vec_len - trn_data < fragsz) ?
8626                                 (input_vec_len - trn_data) : fragsz;
8627
8628                 to_trn_tbl[ecx++] = to_trn;
8629
8630                 buf->next = rte_pktmbuf_alloc(ts_params->mbuf_pool);
8631                 buf = buf->next;
8632
8633                 memset(rte_pktmbuf_mtod(buf, uint8_t *), 0,
8634                                 rte_pktmbuf_tailroom(buf));
8635
8636                 /* OOP */
8637                 if (oop && !fragsz_oop) {
8638                         buf_oop->next =
8639                                         rte_pktmbuf_alloc(ts_params->mbuf_pool);
8640                         buf_oop = buf_oop->next;
8641                         memset(rte_pktmbuf_mtod(buf_oop, uint8_t *),
8642                                         0, rte_pktmbuf_tailroom(buf_oop));
8643                         rte_pktmbuf_append(buf_oop, to_trn);
8644                 }
8645
8646                 plaintext = (uint8_t *)rte_pktmbuf_append(buf,
8647                                 to_trn);
8648
8649                 memcpy(plaintext, input_vec + trn_data, to_trn);
8650                 trn_data += to_trn;
8651         }
8652
8653         ut_params->ibuf->nb_segs = segs;
8654
8655         segs = 1;
8656         if (fragsz_oop && oop) {
8657                 to_trn = 0;
8658                 ecx = 0;
8659
8660                 trn_data = frag_size_oop;
8661                 while (trn_data < output_vec_len) {
8662                         ++segs;
8663                         to_trn =
8664                                 (output_vec_len - trn_data <
8665                                                 frag_size_oop) ?
8666                                 (output_vec_len - trn_data) :
8667                                                 frag_size_oop;
8668
8669                         to_trn_tbl[ecx++] = to_trn;
8670
8671                         buf_oop->next =
8672                                 rte_pktmbuf_alloc(ts_params->mbuf_pool);
8673                         buf_oop = buf_oop->next;
8674                         memset(rte_pktmbuf_mtod(buf_oop, uint8_t *),
8675                                         0, rte_pktmbuf_tailroom(buf_oop));
8676                         rte_pktmbuf_append(buf_oop, to_trn);
8677
8678                         trn_data += to_trn;
8679                 }
8680                 ut_params->obuf->nb_segs = segs;
8681         }
8682
8683         /* Setup Cipher Parameters */
8684         ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
8685         ut_params->cipher_xform.cipher.algo = pdcp_test_params[i].cipher_alg;
8686         ut_params->cipher_xform.cipher.op = opc;
8687         ut_params->cipher_xform.cipher.key.data = pdcp_test_crypto_key[i];
8688         ut_params->cipher_xform.cipher.key.length =
8689                                         pdcp_test_params[i].cipher_key_len;
8690         ut_params->cipher_xform.cipher.iv.length = 0;
8691
8692         /* Setup HMAC Parameters if ICV header is required */
8693         if (pdcp_test_params[i].auth_alg != 0) {
8694                 ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;
8695                 ut_params->auth_xform.next = NULL;
8696                 ut_params->auth_xform.auth.algo = pdcp_test_params[i].auth_alg;
8697                 ut_params->auth_xform.auth.op = opa;
8698                 ut_params->auth_xform.auth.key.data = pdcp_test_auth_key[i];
8699                 ut_params->auth_xform.auth.key.length =
8700                                         pdcp_test_params[i].auth_key_len;
8701
8702                 ut_params->cipher_xform.next = &ut_params->auth_xform;
8703         } else {
8704                 ut_params->cipher_xform.next = NULL;
8705         }
8706
8707         struct rte_security_session_conf sess_conf = {
8708                 .action_type = ut_params->type,
8709                 .protocol = RTE_SECURITY_PROTOCOL_PDCP,
8710                 {.pdcp = {
8711                         .bearer = pdcp_test_bearer[i],
8712                         .domain = pdcp_test_params[i].domain,
8713                         .pkt_dir = pdcp_test_packet_direction[i],
8714                         .sn_size = pdcp_test_data_sn_size[i],
8715                         .hfn = pdcp_test_hfn[i],
8716                         .hfn_threshold = pdcp_test_hfn_threshold[i],
8717                         .hfn_ovrd = 0,
8718                 } },
8719                 .crypto_xform = &ut_params->cipher_xform
8720         };
8721
8722         /* Create security session */
8723         ut_params->sec_session = rte_security_session_create(ctx,
8724                                 &sess_conf, ts_params->session_mpool,
8725                                 ts_params->session_priv_mpool);
8726
8727         if (!ut_params->sec_session) {
8728                 printf("TestCase %s()-%d line %d failed %s: ",
8729                         __func__, i, __LINE__, "Failed to allocate session");
8730                 ret = TEST_FAILED;
8731                 goto on_err;
8732         }
8733
8734         /* Generate crypto op data structure */
8735         ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
8736                         RTE_CRYPTO_OP_TYPE_SYMMETRIC);
8737         if (!ut_params->op) {
8738                 printf("TestCase %s()-%d line %d failed %s: ",
8739                         __func__, i, __LINE__,
8740                         "Failed to allocate symmetric crypto operation struct");
8741                 ret = TEST_FAILED;
8742                 goto on_err;
8743         }
8744
8745         rte_security_attach_session(ut_params->op, ut_params->sec_session);
8746
8747         /* set crypto operation source mbuf */
8748         ut_params->op->sym->m_src = ut_params->ibuf;
8749         if (oop)
8750                 ut_params->op->sym->m_dst = ut_params->obuf;
8751
8752         /* Process crypto operation */
8753         temp_mbuf = ut_params->op->sym->m_src;
8754         if (global_api_test_type == CRYPTODEV_RAW_API_TEST) {
8755                 /* filling lengths */
8756                 while (temp_mbuf) {
8757                         ut_params->op->sym->cipher.data.length
8758                                 += temp_mbuf->pkt_len;
8759                         ut_params->op->sym->auth.data.length
8760                                 += temp_mbuf->pkt_len;
8761                         temp_mbuf = temp_mbuf->next;
8762                 }
8763                 process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
8764                         ut_params->op, 1, 1, 0, 0);
8765         } else {
8766                 ut_params->op = process_crypto_request(ts_params->valid_devs[0],
8767                                                         ut_params->op);
8768         }
8769         if (ut_params->op == NULL) {
8770                 printf("TestCase %s()-%d line %d failed %s: ",
8771                         __func__, i, __LINE__,
8772                         "failed to process sym crypto op");
8773                 ret = TEST_FAILED;
8774                 goto on_err;
8775         }
8776
8777         if (ut_params->op->status != RTE_CRYPTO_OP_STATUS_SUCCESS) {
8778                 printf("TestCase %s()-%d line %d failed %s: ",
8779                         __func__, i, __LINE__, "crypto op processing failed");
8780                 ret = TEST_FAILED;
8781                 goto on_err;
8782         }
8783
8784         /* Validate obuf */
8785         uint8_t *ciphertext = rte_pktmbuf_mtod(ut_params->op->sym->m_src,
8786                         uint8_t *);
8787         if (oop) {
8788                 ciphertext = rte_pktmbuf_mtod(ut_params->op->sym->m_dst,
8789                                 uint8_t *);
8790         }
8791         if (fragsz_oop)
8792                 fragsz = frag_size_oop;
8793         if (memcmp(ciphertext, output_vec, fragsz)) {
8794                 printf("\n=======PDCP TestCase #%d failed: Data Mismatch ", i);
8795                 rte_hexdump(stdout, "encrypted", ciphertext, fragsz);
8796                 rte_hexdump(stdout, "reference", output_vec, fragsz);
8797                 ret = TEST_FAILED;
8798                 goto on_err;
8799         }
8800
8801         buf = ut_params->op->sym->m_src->next;
8802         if (oop)
8803                 buf = ut_params->op->sym->m_dst->next;
8804
8805         unsigned int off = fragsz;
8806
8807         ecx = 0;
8808         while (buf) {
8809                 ciphertext = rte_pktmbuf_mtod(buf,
8810                                 uint8_t *);
8811                 if (memcmp(ciphertext, output_vec + off, to_trn_tbl[ecx])) {
8812                         printf("\n=======PDCP TestCase #%d failed: Data Mismatch ", i);
8813                         rte_hexdump(stdout, "encrypted", ciphertext, to_trn_tbl[ecx]);
8814                         rte_hexdump(stdout, "reference", output_vec + off,
8815                                         to_trn_tbl[ecx]);
8816                         ret = TEST_FAILED;
8817                         goto on_err;
8818                 }
8819                 off += to_trn_tbl[ecx++];
8820                 buf = buf->next;
8821         }
8822 on_err:
8823         rte_crypto_op_free(ut_params->op);
8824         ut_params->op = NULL;
8825
8826         if (ut_params->sec_session)
8827                 rte_security_session_destroy(ctx, ut_params->sec_session);
8828         ut_params->sec_session = NULL;
8829
8830         rte_pktmbuf_free(ut_params->ibuf);
8831         ut_params->ibuf = NULL;
8832         if (oop) {
8833                 rte_pktmbuf_free(ut_params->obuf);
8834                 ut_params->obuf = NULL;
8835         }
8836
8837         return ret;
8838 }
8839
8840 int
8841 test_pdcp_proto_cplane_encap(int i)
8842 {
8843         return test_pdcp_proto(
8844                 i, 0, RTE_CRYPTO_CIPHER_OP_ENCRYPT, RTE_CRYPTO_AUTH_OP_GENERATE,
8845                 pdcp_test_data_in[i], pdcp_test_data_in_len[i],
8846                 pdcp_test_data_out[i], pdcp_test_data_in_len[i] + 4,
8847                 pdcp_test_params[i].cipher_alg, pdcp_test_crypto_key[i],
8848                 pdcp_test_params[i].cipher_key_len,
8849                 pdcp_test_params[i].auth_alg, pdcp_test_auth_key[i],
8850                 pdcp_test_params[i].auth_key_len, pdcp_test_bearer[i],
8851                 pdcp_test_params[i].domain, pdcp_test_packet_direction[i],
8852                 pdcp_test_data_sn_size[i], pdcp_test_hfn[i],
8853                 pdcp_test_hfn_threshold[i], SDAP_DISABLED);
8854 }
8855
8856 int
8857 test_pdcp_proto_uplane_encap(int i)
8858 {
8859         return test_pdcp_proto(
8860                 i, 0, RTE_CRYPTO_CIPHER_OP_ENCRYPT, RTE_CRYPTO_AUTH_OP_GENERATE,
8861                 pdcp_test_data_in[i], pdcp_test_data_in_len[i],
8862                 pdcp_test_data_out[i], pdcp_test_data_in_len[i],
8863                 pdcp_test_params[i].cipher_alg, pdcp_test_crypto_key[i],
8864                 pdcp_test_params[i].cipher_key_len,
8865                 pdcp_test_params[i].auth_alg, pdcp_test_auth_key[i],
8866                 pdcp_test_params[i].auth_key_len, pdcp_test_bearer[i],
8867                 pdcp_test_params[i].domain, pdcp_test_packet_direction[i],
8868                 pdcp_test_data_sn_size[i], pdcp_test_hfn[i],
8869                 pdcp_test_hfn_threshold[i], SDAP_DISABLED);
8870 }
8871
8872 int
8873 test_pdcp_proto_uplane_encap_with_int(int i)
8874 {
8875         return test_pdcp_proto(
8876                 i, 0, RTE_CRYPTO_CIPHER_OP_ENCRYPT, RTE_CRYPTO_AUTH_OP_GENERATE,
8877                 pdcp_test_data_in[i], pdcp_test_data_in_len[i],
8878                 pdcp_test_data_out[i], pdcp_test_data_in_len[i] + 4,
8879                 pdcp_test_params[i].cipher_alg, pdcp_test_crypto_key[i],
8880                 pdcp_test_params[i].cipher_key_len,
8881                 pdcp_test_params[i].auth_alg, pdcp_test_auth_key[i],
8882                 pdcp_test_params[i].auth_key_len, pdcp_test_bearer[i],
8883                 pdcp_test_params[i].domain, pdcp_test_packet_direction[i],
8884                 pdcp_test_data_sn_size[i], pdcp_test_hfn[i],
8885                 pdcp_test_hfn_threshold[i], SDAP_DISABLED);
8886 }
8887
8888 int
8889 test_pdcp_proto_cplane_decap(int i)
8890 {
8891         return test_pdcp_proto(
8892                 i, 0, RTE_CRYPTO_CIPHER_OP_DECRYPT, RTE_CRYPTO_AUTH_OP_VERIFY,
8893                 pdcp_test_data_out[i], pdcp_test_data_in_len[i] + 4,
8894                 pdcp_test_data_in[i], pdcp_test_data_in_len[i],
8895                 pdcp_test_params[i].cipher_alg, pdcp_test_crypto_key[i],
8896                 pdcp_test_params[i].cipher_key_len,
8897                 pdcp_test_params[i].auth_alg, pdcp_test_auth_key[i],
8898                 pdcp_test_params[i].auth_key_len, pdcp_test_bearer[i],
8899                 pdcp_test_params[i].domain, pdcp_test_packet_direction[i],
8900                 pdcp_test_data_sn_size[i], pdcp_test_hfn[i],
8901                 pdcp_test_hfn_threshold[i], SDAP_DISABLED);
8902 }
8903
8904 int
8905 test_pdcp_proto_uplane_decap(int i)
8906 {
8907         return test_pdcp_proto(
8908                 i, 0, RTE_CRYPTO_CIPHER_OP_DECRYPT, RTE_CRYPTO_AUTH_OP_VERIFY,
8909                 pdcp_test_data_out[i], pdcp_test_data_in_len[i],
8910                 pdcp_test_data_in[i], pdcp_test_data_in_len[i],
8911                 pdcp_test_params[i].cipher_alg, pdcp_test_crypto_key[i],
8912                 pdcp_test_params[i].cipher_key_len,
8913                 pdcp_test_params[i].auth_alg, pdcp_test_auth_key[i],
8914                 pdcp_test_params[i].auth_key_len, pdcp_test_bearer[i],
8915                 pdcp_test_params[i].domain, pdcp_test_packet_direction[i],
8916                 pdcp_test_data_sn_size[i], pdcp_test_hfn[i],
8917                 pdcp_test_hfn_threshold[i], SDAP_DISABLED);
8918 }
8919
8920 int
8921 test_pdcp_proto_uplane_decap_with_int(int i)
8922 {
8923         return test_pdcp_proto(
8924                 i, 0, RTE_CRYPTO_CIPHER_OP_DECRYPT, RTE_CRYPTO_AUTH_OP_VERIFY,
8925                 pdcp_test_data_out[i], pdcp_test_data_in_len[i] + 4,
8926                 pdcp_test_data_in[i], pdcp_test_data_in_len[i],
8927                 pdcp_test_params[i].cipher_alg, pdcp_test_crypto_key[i],
8928                 pdcp_test_params[i].cipher_key_len,
8929                 pdcp_test_params[i].auth_alg, pdcp_test_auth_key[i],
8930                 pdcp_test_params[i].auth_key_len, pdcp_test_bearer[i],
8931                 pdcp_test_params[i].domain, pdcp_test_packet_direction[i],
8932                 pdcp_test_data_sn_size[i], pdcp_test_hfn[i],
8933                 pdcp_test_hfn_threshold[i], SDAP_DISABLED);
8934 }
8935
8936 static int
8937 test_PDCP_PROTO_SGL_in_place_32B(void)
8938 {
8939         /* i can be used for running any PDCP case
8940          * In this case it is uplane 12-bit AES-SNOW DL encap
8941          */
8942         int i = PDCP_UPLANE_12BIT_OFFSET + AES_ENC + SNOW_AUTH + DOWNLINK;
8943         return test_pdcp_proto_SGL(i, IN_PLACE,
8944                         RTE_CRYPTO_CIPHER_OP_ENCRYPT,
8945                         RTE_CRYPTO_AUTH_OP_GENERATE,
8946                         pdcp_test_data_in[i],
8947                         pdcp_test_data_in_len[i],
8948                         pdcp_test_data_out[i],
8949                         pdcp_test_data_in_len[i]+4,
8950                         32, 0);
8951 }
8952 static int
8953 test_PDCP_PROTO_SGL_oop_32B_128B(void)
8954 {
8955         /* i can be used for running any PDCP case
8956          * In this case it is uplane 18-bit NULL-NULL DL encap
8957          */
8958         int i = PDCP_UPLANE_18BIT_OFFSET + NULL_ENC + NULL_AUTH + DOWNLINK;
8959         return test_pdcp_proto_SGL(i, OUT_OF_PLACE,
8960                         RTE_CRYPTO_CIPHER_OP_ENCRYPT,
8961                         RTE_CRYPTO_AUTH_OP_GENERATE,
8962                         pdcp_test_data_in[i],
8963                         pdcp_test_data_in_len[i],
8964                         pdcp_test_data_out[i],
8965                         pdcp_test_data_in_len[i]+4,
8966                         32, 128);
8967 }
8968 static int
8969 test_PDCP_PROTO_SGL_oop_32B_40B(void)
8970 {
8971         /* i can be used for running any PDCP case
8972          * In this case it is uplane 18-bit AES DL encap
8973          */
8974         int i = PDCP_UPLANE_OFFSET + AES_ENC + EIGHTEEN_BIT_SEQ_NUM_OFFSET
8975                         + DOWNLINK;
8976         return test_pdcp_proto_SGL(i, OUT_OF_PLACE,
8977                         RTE_CRYPTO_CIPHER_OP_ENCRYPT,
8978                         RTE_CRYPTO_AUTH_OP_GENERATE,
8979                         pdcp_test_data_in[i],
8980                         pdcp_test_data_in_len[i],
8981                         pdcp_test_data_out[i],
8982                         pdcp_test_data_in_len[i],
8983                         32, 40);
8984 }
8985 static int
8986 test_PDCP_PROTO_SGL_oop_128B_32B(void)
8987 {
8988         /* i can be used for running any PDCP case
8989          * In this case it is cplane 12-bit AES-ZUC DL encap
8990          */
8991         int i = PDCP_CPLANE_LONG_SN_OFFSET + AES_ENC + ZUC_AUTH + DOWNLINK;
8992         return test_pdcp_proto_SGL(i, OUT_OF_PLACE,
8993                         RTE_CRYPTO_CIPHER_OP_ENCRYPT,
8994                         RTE_CRYPTO_AUTH_OP_GENERATE,
8995                         pdcp_test_data_in[i],
8996                         pdcp_test_data_in_len[i],
8997                         pdcp_test_data_out[i],
8998                         pdcp_test_data_in_len[i]+4,
8999                         128, 32);
9000 }
9001
9002 static int
9003 test_PDCP_SDAP_PROTO_encap_all(void)
9004 {
9005         int i = 0, size = 0;
9006         int err, all_err = TEST_SUCCESS;
9007         const struct pdcp_sdap_test *cur_test;
9008
9009         size = RTE_DIM(list_pdcp_sdap_tests);
9010
9011         for (i = 0; i < size; i++) {
9012                 cur_test = &list_pdcp_sdap_tests[i];
9013                 err = test_pdcp_proto(
9014                         i, 0, RTE_CRYPTO_CIPHER_OP_ENCRYPT,
9015                         RTE_CRYPTO_AUTH_OP_GENERATE, cur_test->data_in,
9016                         cur_test->in_len, cur_test->data_out,
9017                         cur_test->in_len + ((cur_test->auth_key) ? 4 : 0),
9018                         cur_test->param.cipher_alg, cur_test->cipher_key,
9019                         cur_test->param.cipher_key_len,
9020                         cur_test->param.auth_alg,
9021                         cur_test->auth_key, cur_test->param.auth_key_len,
9022                         cur_test->bearer, cur_test->param.domain,
9023                         cur_test->packet_direction, cur_test->sn_size,
9024                         cur_test->hfn,
9025                         cur_test->hfn_threshold, SDAP_ENABLED);
9026                 if (err) {
9027                         printf("\t%d) %s: Encapsulation failed\n",
9028                                         cur_test->test_idx,
9029                                         cur_test->param.name);
9030                         err = TEST_FAILED;
9031                 } else {
9032                         printf("\t%d) %s: Encap PASS\n", cur_test->test_idx,
9033                                         cur_test->param.name);
9034                         err = TEST_SUCCESS;
9035                 }
9036                 all_err += err;
9037         }
9038
9039         printf("Success: %d, Failure: %d\n", size + all_err, -all_err);
9040
9041         return (all_err == TEST_SUCCESS) ? TEST_SUCCESS : TEST_FAILED;
9042 }
9043
9044 static int
9045 test_PDCP_PROTO_short_mac(void)
9046 {
9047         int i = 0, size = 0;
9048         int err, all_err = TEST_SUCCESS;
9049         const struct pdcp_short_mac_test *cur_test;
9050
9051         size = RTE_DIM(list_pdcp_smac_tests);
9052
9053         for (i = 0; i < size; i++) {
9054                 cur_test = &list_pdcp_smac_tests[i];
9055                 err = test_pdcp_proto(
9056                         i, 0, RTE_CRYPTO_CIPHER_OP_ENCRYPT,
9057                         RTE_CRYPTO_AUTH_OP_GENERATE, cur_test->data_in,
9058                         cur_test->in_len, cur_test->data_out,
9059                         cur_test->in_len + ((cur_test->auth_key) ? 4 : 0),
9060                         RTE_CRYPTO_CIPHER_NULL, NULL,
9061                         0, cur_test->param.auth_alg,
9062                         cur_test->auth_key, cur_test->param.auth_key_len,
9063                         0, cur_test->param.domain, 0, 0,
9064                         0, 0, 0);
9065                 if (err) {
9066                         printf("\t%d) %s: Short MAC test failed\n",
9067                                         cur_test->test_idx,
9068                                         cur_test->param.name);
9069                         err = TEST_FAILED;
9070                 } else {
9071                         printf("\t%d) %s: Short MAC test PASS\n",
9072                                         cur_test->test_idx,
9073                                         cur_test->param.name);
9074                         rte_hexdump(stdout, "MAC I",
9075                                     cur_test->data_out + cur_test->in_len + 2,
9076                                     2);
9077                         err = TEST_SUCCESS;
9078                 }
9079                 all_err += err;
9080         }
9081
9082         printf("Success: %d, Failure: %d\n", size + all_err, -all_err);
9083
9084         return (all_err == TEST_SUCCESS) ? TEST_SUCCESS : TEST_FAILED;
9085
9086 }
9087
9088 static int
9089 test_PDCP_SDAP_PROTO_decap_all(void)
9090 {
9091         int i = 0, size = 0;
9092         int err, all_err = TEST_SUCCESS;
9093         const struct pdcp_sdap_test *cur_test;
9094
9095         size = RTE_DIM(list_pdcp_sdap_tests);
9096
9097         for (i = 0; i < size; i++) {
9098                 cur_test = &list_pdcp_sdap_tests[i];
9099                 err = test_pdcp_proto(
9100                         i, 0, RTE_CRYPTO_CIPHER_OP_DECRYPT,
9101                         RTE_CRYPTO_AUTH_OP_VERIFY,
9102                         cur_test->data_out,
9103                         cur_test->in_len + ((cur_test->auth_key) ? 4 : 0),
9104                         cur_test->data_in, cur_test->in_len,
9105                         cur_test->param.cipher_alg,
9106                         cur_test->cipher_key, cur_test->param.cipher_key_len,
9107                         cur_test->param.auth_alg, cur_test->auth_key,
9108                         cur_test->param.auth_key_len, cur_test->bearer,
9109                         cur_test->param.domain, cur_test->packet_direction,
9110                         cur_test->sn_size, cur_test->hfn,
9111                         cur_test->hfn_threshold, SDAP_ENABLED);
9112                 if (err) {
9113                         printf("\t%d) %s: Decapsulation failed\n",
9114                                         cur_test->test_idx,
9115                                         cur_test->param.name);
9116                         err = TEST_FAILED;
9117                 } else {
9118                         printf("\t%d) %s: Decap PASS\n", cur_test->test_idx,
9119                                         cur_test->param.name);
9120                         err = TEST_SUCCESS;
9121                 }
9122                 all_err += err;
9123         }
9124
9125         printf("Success: %d, Failure: %d\n", size + all_err, -all_err);
9126
9127         return (all_err == TEST_SUCCESS) ? TEST_SUCCESS : TEST_FAILED;
9128 }
9129
9130 static int
9131 test_ipsec_proto_process(const struct ipsec_test_data td[],
9132                          struct ipsec_test_data res_d[],
9133                          int nb_td,
9134                          bool silent,
9135                          const struct ipsec_test_flags *flags)
9136 {
9137         uint16_t v6_src[8] = {0x2607, 0xf8b0, 0x400c, 0x0c03, 0x0000, 0x0000,
9138                                 0x0000, 0x001a};
9139         uint16_t v6_dst[8] = {0x2001, 0x0470, 0xe5bf, 0xdead, 0x4957, 0x2174,
9140                                 0xe82c, 0x4887};
9141         struct crypto_testsuite_params *ts_params = &testsuite_params;
9142         struct crypto_unittest_params *ut_params = &unittest_params;
9143         struct rte_security_capability_idx sec_cap_idx;
9144         const struct rte_security_capability *sec_cap;
9145         struct rte_security_ipsec_xform ipsec_xform;
9146         uint8_t dev_id = ts_params->valid_devs[0];
9147         enum rte_security_ipsec_sa_direction dir;
9148         struct ipsec_test_data *res_d_tmp = NULL;
9149         uint32_t src = RTE_IPV4(192, 168, 1, 0);
9150         uint32_t dst = RTE_IPV4(192, 168, 1, 1);
9151         int salt_len, i, ret = TEST_SUCCESS;
9152         struct rte_security_ctx *ctx;
9153         uint8_t *input_text;
9154         uint32_t verify;
9155
9156         ut_params->type = RTE_SECURITY_ACTION_TYPE_LOOKASIDE_PROTOCOL;
9157         gbl_action_type = RTE_SECURITY_ACTION_TYPE_LOOKASIDE_PROTOCOL;
9158
9159         /* Use first test data to create session */
9160
9161         /* Copy IPsec xform */
9162         memcpy(&ipsec_xform, &td[0].ipsec_xform, sizeof(ipsec_xform));
9163
9164         dir = ipsec_xform.direction;
9165         verify = flags->tunnel_hdr_verify;
9166
9167         if ((dir == RTE_SECURITY_IPSEC_SA_DIR_INGRESS) && verify) {
9168                 if (verify == RTE_SECURITY_IPSEC_TUNNEL_VERIFY_SRC_DST_ADDR)
9169                         src += 1;
9170                 else if (verify == RTE_SECURITY_IPSEC_TUNNEL_VERIFY_DST_ADDR)
9171                         dst += 1;
9172         }
9173
9174         if (td->ipsec_xform.mode == RTE_SECURITY_IPSEC_SA_MODE_TUNNEL) {
9175                 if (td->ipsec_xform.tunnel.type ==
9176                                 RTE_SECURITY_IPSEC_TUNNEL_IPV4) {
9177                         memcpy(&ipsec_xform.tunnel.ipv4.src_ip, &src,
9178                                sizeof(src));
9179                         memcpy(&ipsec_xform.tunnel.ipv4.dst_ip, &dst,
9180                                sizeof(dst));
9181
9182                         if (flags->df == TEST_IPSEC_SET_DF_0_INNER_1)
9183                                 ipsec_xform.tunnel.ipv4.df = 0;
9184
9185                         if (flags->df == TEST_IPSEC_SET_DF_1_INNER_0)
9186                                 ipsec_xform.tunnel.ipv4.df = 1;
9187
9188                         if (flags->dscp == TEST_IPSEC_SET_DSCP_0_INNER_1)
9189                                 ipsec_xform.tunnel.ipv4.dscp = 0;
9190
9191                         if (flags->dscp == TEST_IPSEC_SET_DSCP_1_INNER_0)
9192                                 ipsec_xform.tunnel.ipv4.dscp =
9193                                                 TEST_IPSEC_DSCP_VAL;
9194
9195                 } else {
9196                         if (flags->dscp == TEST_IPSEC_SET_DSCP_0_INNER_1)
9197                                 ipsec_xform.tunnel.ipv6.dscp = 0;
9198
9199                         if (flags->dscp == TEST_IPSEC_SET_DSCP_1_INNER_0)
9200                                 ipsec_xform.tunnel.ipv6.dscp =
9201                                                 TEST_IPSEC_DSCP_VAL;
9202
9203                         memcpy(&ipsec_xform.tunnel.ipv6.src_addr, &v6_src,
9204                                sizeof(v6_src));
9205                         memcpy(&ipsec_xform.tunnel.ipv6.dst_addr, &v6_dst,
9206                                sizeof(v6_dst));
9207                 }
9208         }
9209
9210         ctx = rte_cryptodev_get_sec_ctx(dev_id);
9211
9212         sec_cap_idx.action = ut_params->type;
9213         sec_cap_idx.protocol = RTE_SECURITY_PROTOCOL_IPSEC;
9214         sec_cap_idx.ipsec.proto = ipsec_xform.proto;
9215         sec_cap_idx.ipsec.mode = ipsec_xform.mode;
9216         sec_cap_idx.ipsec.direction = ipsec_xform.direction;
9217
9218         if (flags->udp_encap)
9219                 ipsec_xform.options.udp_encap = 1;
9220
9221         sec_cap = rte_security_capability_get(ctx, &sec_cap_idx);
9222         if (sec_cap == NULL)
9223                 return TEST_SKIPPED;
9224
9225         /* Copy cipher session parameters */
9226         if (td[0].aead) {
9227                 memcpy(&ut_params->aead_xform, &td[0].xform.aead,
9228                        sizeof(ut_params->aead_xform));
9229                 ut_params->aead_xform.aead.key.data = td[0].key.data;
9230                 ut_params->aead_xform.aead.iv.offset = IV_OFFSET;
9231
9232                 /* Verify crypto capabilities */
9233                 if (test_ipsec_crypto_caps_aead_verify(
9234                                 sec_cap,
9235                                 &ut_params->aead_xform) != 0) {
9236                         if (!silent)
9237                                 RTE_LOG(INFO, USER1,
9238                                         "Crypto capabilities not supported\n");
9239                         return TEST_SKIPPED;
9240                 }
9241         } else {
9242                 memcpy(&ut_params->cipher_xform, &td[0].xform.chain.cipher,
9243                        sizeof(ut_params->cipher_xform));
9244                 memcpy(&ut_params->auth_xform, &td[0].xform.chain.auth,
9245                        sizeof(ut_params->auth_xform));
9246                 ut_params->cipher_xform.cipher.key.data = td[0].key.data;
9247                 ut_params->cipher_xform.cipher.iv.offset = IV_OFFSET;
9248                 ut_params->auth_xform.auth.key.data = td[0].auth_key.data;
9249
9250                 /* Verify crypto capabilities */
9251
9252                 if (test_ipsec_crypto_caps_cipher_verify(
9253                                 sec_cap,
9254                                 &ut_params->cipher_xform) != 0) {
9255                         if (!silent)
9256                                 RTE_LOG(INFO, USER1,
9257                                         "Cipher crypto capabilities not supported\n");
9258                         return TEST_SKIPPED;
9259                 }
9260
9261                 if (test_ipsec_crypto_caps_auth_verify(
9262                                 sec_cap,
9263                                 &ut_params->auth_xform) != 0) {
9264                         if (!silent)
9265                                 RTE_LOG(INFO, USER1,
9266                                         "Auth crypto capabilities not supported\n");
9267                         return TEST_SKIPPED;
9268                 }
9269         }
9270
9271         if (test_ipsec_sec_caps_verify(&ipsec_xform, sec_cap, silent) != 0)
9272                 return TEST_SKIPPED;
9273
9274         struct rte_security_session_conf sess_conf = {
9275                 .action_type = ut_params->type,
9276                 .protocol = RTE_SECURITY_PROTOCOL_IPSEC,
9277         };
9278
9279         if (td[0].aead) {
9280                 salt_len = RTE_MIN(sizeof(ipsec_xform.salt), td[0].salt.len);
9281                 memcpy(&ipsec_xform.salt, td[0].salt.data, salt_len);
9282                 sess_conf.ipsec = ipsec_xform;
9283                 sess_conf.crypto_xform = &ut_params->aead_xform;
9284         } else {
9285                 sess_conf.ipsec = ipsec_xform;
9286                 if (dir == RTE_SECURITY_IPSEC_SA_DIR_EGRESS) {
9287                         sess_conf.crypto_xform = &ut_params->cipher_xform;
9288                         ut_params->cipher_xform.next = &ut_params->auth_xform;
9289                 } else {
9290                         sess_conf.crypto_xform = &ut_params->auth_xform;
9291                         ut_params->auth_xform.next = &ut_params->cipher_xform;
9292                 }
9293         }
9294
9295         /* Create security session */
9296         ut_params->sec_session = rte_security_session_create(ctx, &sess_conf,
9297                                         ts_params->session_mpool,
9298                                         ts_params->session_priv_mpool);
9299
9300         if (ut_params->sec_session == NULL)
9301                 return TEST_SKIPPED;
9302
9303         for (i = 0; i < nb_td; i++) {
9304                 if (flags->antireplay &&
9305                     (dir == RTE_SECURITY_IPSEC_SA_DIR_EGRESS)) {
9306                         sess_conf.ipsec.esn.value = td[i].ipsec_xform.esn.value;
9307                         ret = rte_security_session_update(ctx,
9308                                 ut_params->sec_session, &sess_conf);
9309                         if (ret) {
9310                                 printf("Could not update sequence number in "
9311                                        "session\n");
9312                                 return TEST_SKIPPED;
9313                         }
9314                 }
9315
9316                 /* Setup source mbuf payload */
9317                 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
9318                 memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
9319                                 rte_pktmbuf_tailroom(ut_params->ibuf));
9320
9321                 input_text = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
9322                                 td[i].input_text.len);
9323
9324                 memcpy(input_text, td[i].input_text.data,
9325                        td[i].input_text.len);
9326
9327                 if (test_ipsec_pkt_update(input_text, flags))
9328                         return TEST_FAILED;
9329
9330                 /* Generate crypto op data structure */
9331                 ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
9332                                         RTE_CRYPTO_OP_TYPE_SYMMETRIC);
9333                 if (!ut_params->op) {
9334                         printf("TestCase %s line %d: %s\n",
9335                                 __func__, __LINE__,
9336                                 "failed to allocate crypto op");
9337                         ret = TEST_FAILED;
9338                         goto crypto_op_free;
9339                 }
9340
9341                 /* Attach session to operation */
9342                 rte_security_attach_session(ut_params->op,
9343                                             ut_params->sec_session);
9344
9345                 /* Set crypto operation mbufs */
9346                 ut_params->op->sym->m_src = ut_params->ibuf;
9347                 ut_params->op->sym->m_dst = NULL;
9348
9349                 /* Copy IV in crypto operation when IV generation is disabled */
9350                 if (dir == RTE_SECURITY_IPSEC_SA_DIR_EGRESS &&
9351                     ipsec_xform.options.iv_gen_disable == 1) {
9352                         uint8_t *iv = rte_crypto_op_ctod_offset(ut_params->op,
9353                                                                 uint8_t *,
9354                                                                 IV_OFFSET);
9355                         int len;
9356
9357                         if (td[i].aead)
9358                                 len = td[i].xform.aead.aead.iv.length;
9359                         else
9360                                 len = td[i].xform.chain.cipher.cipher.iv.length;
9361
9362                         memcpy(iv, td[i].iv.data, len);
9363                 }
9364
9365                 /* Process crypto operation */
9366                 process_crypto_request(dev_id, ut_params->op);
9367
9368                 ret = test_ipsec_status_check(&td[i], ut_params->op, flags, dir,
9369                                               i + 1);
9370                 if (ret != TEST_SUCCESS)
9371                         goto crypto_op_free;
9372
9373                 if (res_d != NULL)
9374                         res_d_tmp = &res_d[i];
9375
9376                 ret = test_ipsec_post_process(ut_params->ibuf, &td[i],
9377                                               res_d_tmp, silent, flags);
9378                 if (ret != TEST_SUCCESS)
9379                         goto crypto_op_free;
9380
9381                 ret = test_ipsec_stats_verify(ctx, ut_params->sec_session,
9382                                               flags, dir);
9383                 if (ret != TEST_SUCCESS)
9384                         goto crypto_op_free;
9385
9386                 rte_crypto_op_free(ut_params->op);
9387                 ut_params->op = NULL;
9388
9389                 rte_pktmbuf_free(ut_params->ibuf);
9390                 ut_params->ibuf = NULL;
9391         }
9392
9393 crypto_op_free:
9394         rte_crypto_op_free(ut_params->op);
9395         ut_params->op = NULL;
9396
9397         rte_pktmbuf_free(ut_params->ibuf);
9398         ut_params->ibuf = NULL;
9399
9400         if (ut_params->sec_session)
9401                 rte_security_session_destroy(ctx, ut_params->sec_session);
9402         ut_params->sec_session = NULL;
9403
9404         return ret;
9405 }
9406
9407 static int
9408 test_ipsec_proto_known_vec(const void *test_data)
9409 {
9410         struct ipsec_test_data td_outb;
9411         struct ipsec_test_flags flags;
9412
9413         memset(&flags, 0, sizeof(flags));
9414
9415         memcpy(&td_outb, test_data, sizeof(td_outb));
9416
9417         if (td_outb.aead ||
9418             td_outb.xform.chain.cipher.cipher.algo != RTE_CRYPTO_CIPHER_NULL) {
9419                 /* Disable IV gen to be able to test with known vectors */
9420                 td_outb.ipsec_xform.options.iv_gen_disable = 1;
9421         }
9422
9423         return test_ipsec_proto_process(&td_outb, NULL, 1, false, &flags);
9424 }
9425
9426 static int
9427 test_ipsec_proto_known_vec_inb(const void *test_data)
9428 {
9429         const struct ipsec_test_data *td = test_data;
9430         struct ipsec_test_flags flags;
9431         struct ipsec_test_data td_inb;
9432
9433         memset(&flags, 0, sizeof(flags));
9434
9435         if (td->ipsec_xform.direction == RTE_SECURITY_IPSEC_SA_DIR_EGRESS)
9436                 test_ipsec_td_in_from_out(td, &td_inb);
9437         else
9438                 memcpy(&td_inb, td, sizeof(td_inb));
9439
9440         return test_ipsec_proto_process(&td_inb, NULL, 1, false, &flags);
9441 }
9442
9443 static int
9444 test_ipsec_proto_known_vec_fragmented(const void *test_data)
9445 {
9446         struct ipsec_test_data td_outb;
9447         struct ipsec_test_flags flags;
9448
9449         memset(&flags, 0, sizeof(flags));
9450         flags.fragment = true;
9451
9452         memcpy(&td_outb, test_data, sizeof(td_outb));
9453
9454         /* Disable IV gen to be able to test with known vectors */
9455         td_outb.ipsec_xform.options.iv_gen_disable = 1;
9456
9457         return test_ipsec_proto_process(&td_outb, NULL, 1, false, &flags);
9458 }
9459
9460 static int
9461 test_ipsec_proto_all(const struct ipsec_test_flags *flags)
9462 {
9463         struct ipsec_test_data td_outb[IPSEC_TEST_PACKETS_MAX];
9464         struct ipsec_test_data td_inb[IPSEC_TEST_PACKETS_MAX];
9465         unsigned int i, nb_pkts = 1, pass_cnt = 0;
9466         int ret;
9467
9468         if (flags->iv_gen ||
9469             flags->sa_expiry_pkts_soft ||
9470             flags->sa_expiry_pkts_hard)
9471                 nb_pkts = IPSEC_TEST_PACKETS_MAX;
9472
9473         for (i = 0; i < RTE_DIM(alg_list); i++) {
9474                 test_ipsec_td_prepare(alg_list[i].param1,
9475                                       alg_list[i].param2,
9476                                       flags,
9477                                       td_outb,
9478                                       nb_pkts);
9479
9480                 if (!td_outb->aead) {
9481                         enum rte_crypto_cipher_algorithm cipher_alg;
9482                         enum rte_crypto_auth_algorithm auth_alg;
9483
9484                         cipher_alg = td_outb->xform.chain.cipher.cipher.algo;
9485                         auth_alg = td_outb->xform.chain.auth.auth.algo;
9486
9487                         /* ICV is not applicable for NULL auth */
9488                         if (flags->icv_corrupt &&
9489                             auth_alg == RTE_CRYPTO_AUTH_NULL)
9490                                 continue;
9491
9492                         /* IV is not applicable for NULL cipher */
9493                         if (flags->iv_gen &&
9494                             cipher_alg == RTE_CRYPTO_CIPHER_NULL)
9495                                 continue;
9496                 }
9497
9498                 ret = test_ipsec_proto_process(td_outb, td_inb, nb_pkts, true,
9499                                                flags);
9500                 if (ret == TEST_SKIPPED)
9501                         continue;
9502
9503                 if (ret == TEST_FAILED)
9504                         return TEST_FAILED;
9505
9506                 test_ipsec_td_update(td_inb, td_outb, nb_pkts, flags);
9507
9508                 ret = test_ipsec_proto_process(td_inb, NULL, nb_pkts, true,
9509                                                flags);
9510                 if (ret == TEST_SKIPPED)
9511                         continue;
9512
9513                 if (ret == TEST_FAILED)
9514                         return TEST_FAILED;
9515
9516                 if (flags->display_alg)
9517                         test_ipsec_display_alg(alg_list[i].param1,
9518                                                alg_list[i].param2);
9519
9520                 pass_cnt++;
9521         }
9522
9523         if (pass_cnt > 0)
9524                 return TEST_SUCCESS;
9525         else
9526                 return TEST_SKIPPED;
9527 }
9528
9529 static int
9530 test_ipsec_proto_display_list(const void *data __rte_unused)
9531 {
9532         struct ipsec_test_flags flags;
9533
9534         memset(&flags, 0, sizeof(flags));
9535
9536         flags.display_alg = true;
9537
9538         return test_ipsec_proto_all(&flags);
9539 }
9540
9541 static int
9542 test_ipsec_proto_iv_gen(const void *data __rte_unused)
9543 {
9544         struct ipsec_test_flags flags;
9545
9546         memset(&flags, 0, sizeof(flags));
9547
9548         flags.iv_gen = true;
9549
9550         return test_ipsec_proto_all(&flags);
9551 }
9552
9553 static int
9554 test_ipsec_proto_sa_exp_pkts_soft(const void *data __rte_unused)
9555 {
9556         struct ipsec_test_flags flags;
9557
9558         memset(&flags, 0, sizeof(flags));
9559
9560         flags.sa_expiry_pkts_soft = true;
9561
9562         return test_ipsec_proto_all(&flags);
9563 }
9564
9565 static int
9566 test_ipsec_proto_sa_exp_pkts_hard(const void *data __rte_unused)
9567 {
9568         struct ipsec_test_flags flags;
9569
9570         memset(&flags, 0, sizeof(flags));
9571
9572         flags.sa_expiry_pkts_hard = true;
9573
9574         return test_ipsec_proto_all(&flags);
9575 }
9576
9577 static int
9578 test_ipsec_proto_err_icv_corrupt(const void *data __rte_unused)
9579 {
9580         struct ipsec_test_flags flags;
9581
9582         memset(&flags, 0, sizeof(flags));
9583
9584         flags.icv_corrupt = true;
9585
9586         return test_ipsec_proto_all(&flags);
9587 }
9588
9589 static int
9590 test_ipsec_proto_udp_encap(const void *data __rte_unused)
9591 {
9592         struct ipsec_test_flags flags;
9593
9594         memset(&flags, 0, sizeof(flags));
9595
9596         flags.udp_encap = true;
9597
9598         return test_ipsec_proto_all(&flags);
9599 }
9600
9601 static int
9602 test_ipsec_proto_tunnel_src_dst_addr_verify(const void *data __rte_unused)
9603 {
9604         struct ipsec_test_flags flags;
9605
9606         memset(&flags, 0, sizeof(flags));
9607
9608         flags.tunnel_hdr_verify = RTE_SECURITY_IPSEC_TUNNEL_VERIFY_SRC_DST_ADDR;
9609
9610         return test_ipsec_proto_all(&flags);
9611 }
9612
9613 static int
9614 test_ipsec_proto_tunnel_dst_addr_verify(const void *data __rte_unused)
9615 {
9616         struct ipsec_test_flags flags;
9617
9618         memset(&flags, 0, sizeof(flags));
9619
9620         flags.tunnel_hdr_verify = RTE_SECURITY_IPSEC_TUNNEL_VERIFY_DST_ADDR;
9621
9622         return test_ipsec_proto_all(&flags);
9623 }
9624
9625 static int
9626 test_ipsec_proto_udp_ports_verify(const void *data __rte_unused)
9627 {
9628         struct ipsec_test_flags flags;
9629
9630         memset(&flags, 0, sizeof(flags));
9631
9632         flags.udp_encap = true;
9633         flags.udp_ports_verify = true;
9634
9635         return test_ipsec_proto_all(&flags);
9636 }
9637
9638 static int
9639 test_ipsec_proto_inner_ip_csum(const void *data __rte_unused)
9640 {
9641         struct ipsec_test_flags flags;
9642
9643         memset(&flags, 0, sizeof(flags));
9644
9645         flags.ip_csum = true;
9646
9647         return test_ipsec_proto_all(&flags);
9648 }
9649
9650 static int
9651 test_ipsec_proto_inner_l4_csum(const void *data __rte_unused)
9652 {
9653         struct ipsec_test_flags flags;
9654
9655         memset(&flags, 0, sizeof(flags));
9656
9657         flags.l4_csum = true;
9658
9659         return test_ipsec_proto_all(&flags);
9660 }
9661
9662 static int
9663 test_ipsec_proto_tunnel_v4_in_v4(const void *data __rte_unused)
9664 {
9665         struct ipsec_test_flags flags;
9666
9667         memset(&flags, 0, sizeof(flags));
9668
9669         flags.ipv6 = false;
9670         flags.tunnel_ipv6 = false;
9671
9672         return test_ipsec_proto_all(&flags);
9673 }
9674
9675 static int
9676 test_ipsec_proto_tunnel_v6_in_v6(const void *data __rte_unused)
9677 {
9678         struct ipsec_test_flags flags;
9679
9680         memset(&flags, 0, sizeof(flags));
9681
9682         flags.ipv6 = true;
9683         flags.tunnel_ipv6 = true;
9684
9685         return test_ipsec_proto_all(&flags);
9686 }
9687
9688 static int
9689 test_ipsec_proto_tunnel_v4_in_v6(const void *data __rte_unused)
9690 {
9691         struct ipsec_test_flags flags;
9692
9693         memset(&flags, 0, sizeof(flags));
9694
9695         flags.ipv6 = false;
9696         flags.tunnel_ipv6 = true;
9697
9698         return test_ipsec_proto_all(&flags);
9699 }
9700
9701 static int
9702 test_ipsec_proto_tunnel_v6_in_v4(const void *data __rte_unused)
9703 {
9704         struct ipsec_test_flags flags;
9705
9706         memset(&flags, 0, sizeof(flags));
9707
9708         flags.ipv6 = true;
9709         flags.tunnel_ipv6 = false;
9710
9711         return test_ipsec_proto_all(&flags);
9712 }
9713
9714 static int
9715 test_ipsec_proto_transport_v4(const void *data __rte_unused)
9716 {
9717         struct ipsec_test_flags flags;
9718
9719         memset(&flags, 0, sizeof(flags));
9720
9721         flags.ipv6 = false;
9722         flags.transport = true;
9723
9724         return test_ipsec_proto_all(&flags);
9725 }
9726
9727 static int
9728 test_ipsec_proto_stats(const void *data __rte_unused)
9729 {
9730         struct ipsec_test_flags flags;
9731
9732         memset(&flags, 0, sizeof(flags));
9733
9734         flags.stats_success = true;
9735
9736         return test_ipsec_proto_all(&flags);
9737 }
9738
9739 static int
9740 test_ipsec_proto_pkt_fragment(const void *data __rte_unused)
9741 {
9742         struct ipsec_test_flags flags;
9743
9744         memset(&flags, 0, sizeof(flags));
9745
9746         flags.fragment = true;
9747
9748         return test_ipsec_proto_all(&flags);
9749
9750 }
9751
9752 static int
9753 test_ipsec_proto_copy_df_inner_0(const void *data __rte_unused)
9754 {
9755         struct ipsec_test_flags flags;
9756
9757         memset(&flags, 0, sizeof(flags));
9758
9759         flags.df = TEST_IPSEC_COPY_DF_INNER_0;
9760
9761         return test_ipsec_proto_all(&flags);
9762 }
9763
9764 static int
9765 test_ipsec_proto_copy_df_inner_1(const void *data __rte_unused)
9766 {
9767         struct ipsec_test_flags flags;
9768
9769         memset(&flags, 0, sizeof(flags));
9770
9771         flags.df = TEST_IPSEC_COPY_DF_INNER_1;
9772
9773         return test_ipsec_proto_all(&flags);
9774 }
9775
9776 static int
9777 test_ipsec_proto_set_df_0_inner_1(const void *data __rte_unused)
9778 {
9779         struct ipsec_test_flags flags;
9780
9781         memset(&flags, 0, sizeof(flags));
9782
9783         flags.df = TEST_IPSEC_SET_DF_0_INNER_1;
9784
9785         return test_ipsec_proto_all(&flags);
9786 }
9787
9788 static int
9789 test_ipsec_proto_set_df_1_inner_0(const void *data __rte_unused)
9790 {
9791         struct ipsec_test_flags flags;
9792
9793         memset(&flags, 0, sizeof(flags));
9794
9795         flags.df = TEST_IPSEC_SET_DF_1_INNER_0;
9796
9797         return test_ipsec_proto_all(&flags);
9798 }
9799
9800 static int
9801 test_ipsec_proto_ipv4_copy_dscp_inner_0(const void *data __rte_unused)
9802 {
9803         struct ipsec_test_flags flags;
9804
9805         memset(&flags, 0, sizeof(flags));
9806
9807         flags.dscp = TEST_IPSEC_COPY_DSCP_INNER_0;
9808
9809         return test_ipsec_proto_all(&flags);
9810 }
9811
9812 static int
9813 test_ipsec_proto_ipv4_copy_dscp_inner_1(const void *data __rte_unused)
9814 {
9815         struct ipsec_test_flags flags;
9816
9817         memset(&flags, 0, sizeof(flags));
9818
9819         flags.dscp = TEST_IPSEC_COPY_DSCP_INNER_1;
9820
9821         return test_ipsec_proto_all(&flags);
9822 }
9823
9824 static int
9825 test_ipsec_proto_ipv4_set_dscp_0_inner_1(const void *data __rte_unused)
9826 {
9827         struct ipsec_test_flags flags;
9828
9829         if (gbl_driver_id == rte_cryptodev_driver_id_get(
9830                         RTE_STR(CRYPTODEV_NAME_CN9K_PMD)))
9831                 return TEST_SKIPPED;
9832
9833         memset(&flags, 0, sizeof(flags));
9834
9835         flags.dscp = TEST_IPSEC_SET_DSCP_0_INNER_1;
9836
9837         return test_ipsec_proto_all(&flags);
9838 }
9839
9840 static int
9841 test_ipsec_proto_ipv4_set_dscp_1_inner_0(const void *data __rte_unused)
9842 {
9843         struct ipsec_test_flags flags;
9844
9845         if (gbl_driver_id == rte_cryptodev_driver_id_get(
9846                         RTE_STR(CRYPTODEV_NAME_CN9K_PMD)))
9847                 return TEST_SKIPPED;
9848
9849         memset(&flags, 0, sizeof(flags));
9850
9851         flags.dscp = TEST_IPSEC_SET_DSCP_1_INNER_0;
9852
9853         return test_ipsec_proto_all(&flags);
9854 }
9855
9856 static int
9857 test_ipsec_proto_ipv6_copy_dscp_inner_0(const void *data __rte_unused)
9858 {
9859         struct ipsec_test_flags flags;
9860
9861         memset(&flags, 0, sizeof(flags));
9862
9863         flags.ipv6 = true;
9864         flags.tunnel_ipv6 = true;
9865         flags.dscp = TEST_IPSEC_COPY_DSCP_INNER_0;
9866
9867         return test_ipsec_proto_all(&flags);
9868 }
9869
9870 static int
9871 test_ipsec_proto_ipv6_copy_dscp_inner_1(const void *data __rte_unused)
9872 {
9873         struct ipsec_test_flags flags;
9874
9875         memset(&flags, 0, sizeof(flags));
9876
9877         flags.ipv6 = true;
9878         flags.tunnel_ipv6 = true;
9879         flags.dscp = TEST_IPSEC_COPY_DSCP_INNER_1;
9880
9881         return test_ipsec_proto_all(&flags);
9882 }
9883
9884 static int
9885 test_ipsec_proto_ipv6_set_dscp_0_inner_1(const void *data __rte_unused)
9886 {
9887         struct ipsec_test_flags flags;
9888
9889         if (gbl_driver_id == rte_cryptodev_driver_id_get(
9890                         RTE_STR(CRYPTODEV_NAME_CN9K_PMD)))
9891                 return TEST_SKIPPED;
9892
9893         memset(&flags, 0, sizeof(flags));
9894
9895         flags.ipv6 = true;
9896         flags.tunnel_ipv6 = true;
9897         flags.dscp = TEST_IPSEC_SET_DSCP_0_INNER_1;
9898
9899         return test_ipsec_proto_all(&flags);
9900 }
9901
9902 static int
9903 test_ipsec_proto_ipv6_set_dscp_1_inner_0(const void *data __rte_unused)
9904 {
9905         struct ipsec_test_flags flags;
9906
9907         if (gbl_driver_id == rte_cryptodev_driver_id_get(
9908                         RTE_STR(CRYPTODEV_NAME_CN9K_PMD)))
9909                 return TEST_SKIPPED;
9910
9911         memset(&flags, 0, sizeof(flags));
9912
9913         flags.ipv6 = true;
9914         flags.tunnel_ipv6 = true;
9915         flags.dscp = TEST_IPSEC_SET_DSCP_1_INNER_0;
9916
9917         return test_ipsec_proto_all(&flags);
9918 }
9919
9920 static int
9921 test_ipsec_pkt_replay(const void *test_data, const uint64_t esn[],
9922                       bool replayed_pkt[], uint32_t nb_pkts, bool esn_en,
9923                       uint64_t winsz)
9924 {
9925         struct ipsec_test_data td_outb[IPSEC_TEST_PACKETS_MAX];
9926         struct ipsec_test_data td_inb[IPSEC_TEST_PACKETS_MAX];
9927         struct ipsec_test_flags flags;
9928         uint32_t i = 0, ret = 0;
9929
9930         memset(&flags, 0, sizeof(flags));
9931         flags.antireplay = true;
9932
9933         for (i = 0; i < nb_pkts; i++) {
9934                 memcpy(&td_outb[i], test_data, sizeof(td_outb[i]));
9935                 td_outb[i].ipsec_xform.options.iv_gen_disable = 1;
9936                 td_outb[i].ipsec_xform.replay_win_sz = winsz;
9937                 td_outb[i].ipsec_xform.options.esn = esn_en;
9938         }
9939
9940         for (i = 0; i < nb_pkts; i++)
9941                 td_outb[i].ipsec_xform.esn.value = esn[i];
9942
9943         ret = test_ipsec_proto_process(td_outb, td_inb, nb_pkts, true,
9944                                        &flags);
9945         if (ret != TEST_SUCCESS)
9946                 return ret;
9947
9948         test_ipsec_td_update(td_inb, td_outb, nb_pkts, &flags);
9949
9950         for (i = 0; i < nb_pkts; i++) {
9951                 td_inb[i].ipsec_xform.options.esn = esn_en;
9952                 /* Set antireplay flag for packets to be dropped */
9953                 td_inb[i].ar_packet = replayed_pkt[i];
9954         }
9955
9956         ret = test_ipsec_proto_process(td_inb, NULL, nb_pkts, true,
9957                                        &flags);
9958
9959         return ret;
9960 }
9961
9962 static int
9963 test_ipsec_proto_pkt_antireplay(const void *test_data, uint64_t winsz)
9964 {
9965
9966         uint32_t nb_pkts = 5;
9967         bool replayed_pkt[5];
9968         uint64_t esn[5];
9969
9970         /* 1. Advance the TOP of the window to WS * 2 */
9971         esn[0] = winsz * 2;
9972         /* 2. Test sequence number within the new window(WS + 1) */
9973         esn[1] = winsz + 1;
9974         /* 3. Test sequence number less than the window BOTTOM */
9975         esn[2] = winsz;
9976         /* 4. Test sequence number in the middle of the window */
9977         esn[3] = winsz + (winsz / 2);
9978         /* 5. Test replay of the packet in the middle of the window */
9979         esn[4] = winsz + (winsz / 2);
9980
9981         replayed_pkt[0] = false;
9982         replayed_pkt[1] = false;
9983         replayed_pkt[2] = true;
9984         replayed_pkt[3] = false;
9985         replayed_pkt[4] = true;
9986
9987         return test_ipsec_pkt_replay(test_data, esn, replayed_pkt, nb_pkts,
9988                                      false, winsz);
9989 }
9990
9991 static int
9992 test_ipsec_proto_pkt_antireplay1024(const void *test_data)
9993 {
9994         return test_ipsec_proto_pkt_antireplay(test_data, 1024);
9995 }
9996
9997 static int
9998 test_ipsec_proto_pkt_antireplay2048(const void *test_data)
9999 {
10000         return test_ipsec_proto_pkt_antireplay(test_data, 2048);
10001 }
10002
10003 static int
10004 test_ipsec_proto_pkt_antireplay4096(const void *test_data)
10005 {
10006         return test_ipsec_proto_pkt_antireplay(test_data, 4096);
10007 }
10008
10009 static int
10010 test_ipsec_proto_pkt_esn_antireplay(const void *test_data, uint64_t winsz)
10011 {
10012
10013         uint32_t nb_pkts = 7;
10014         bool replayed_pkt[7];
10015         uint64_t esn[7];
10016
10017         /* Set the initial sequence number */
10018         esn[0] = (uint64_t)(0xFFFFFFFF - winsz);
10019         /* 1. Advance the TOP of the window to (1<<32 + WS/2) */
10020         esn[1] = (uint64_t)((1ULL << 32) + (winsz / 2));
10021         /* 2. Test sequence number within new window (1<<32 + WS/2 + 1) */
10022         esn[2] = (uint64_t)((1ULL << 32) - (winsz / 2) + 1);
10023         /* 3. Test with sequence number within window (1<<32 - 1) */
10024         esn[3] = (uint64_t)((1ULL << 32) - 1);
10025         /* 4. Test with sequence number within window (1<<32 - 1) */
10026         esn[4] = (uint64_t)(1ULL << 32);
10027         /* 5. Test with duplicate sequence number within
10028          * new window (1<<32 - 1)
10029          */
10030         esn[5] = (uint64_t)((1ULL << 32) - 1);
10031         /* 6. Test with duplicate sequence number within new window (1<<32) */
10032         esn[6] = (uint64_t)(1ULL << 32);
10033
10034         replayed_pkt[0] = false;
10035         replayed_pkt[1] = false;
10036         replayed_pkt[2] = false;
10037         replayed_pkt[3] = false;
10038         replayed_pkt[4] = false;
10039         replayed_pkt[5] = true;
10040         replayed_pkt[6] = true;
10041
10042         return test_ipsec_pkt_replay(test_data, esn, replayed_pkt, nb_pkts,
10043                                      true, winsz);
10044 }
10045
10046 static int
10047 test_ipsec_proto_pkt_esn_antireplay1024(const void *test_data)
10048 {
10049         return test_ipsec_proto_pkt_esn_antireplay(test_data, 1024);
10050 }
10051
10052 static int
10053 test_ipsec_proto_pkt_esn_antireplay2048(const void *test_data)
10054 {
10055         return test_ipsec_proto_pkt_esn_antireplay(test_data, 2048);
10056 }
10057
10058 static int
10059 test_ipsec_proto_pkt_esn_antireplay4096(const void *test_data)
10060 {
10061         return test_ipsec_proto_pkt_esn_antireplay(test_data, 4096);
10062 }
10063
10064 static int
10065 test_PDCP_PROTO_all(void)
10066 {
10067         struct crypto_testsuite_params *ts_params = &testsuite_params;
10068         struct crypto_unittest_params *ut_params = &unittest_params;
10069         struct rte_cryptodev_info dev_info;
10070         int status;
10071
10072         rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
10073         uint64_t feat_flags = dev_info.feature_flags;
10074
10075         if (!(feat_flags & RTE_CRYPTODEV_FF_SECURITY))
10076                 return TEST_SKIPPED;
10077
10078         /* Set action type */
10079         ut_params->type = gbl_action_type == RTE_SECURITY_ACTION_TYPE_NONE ?
10080                 RTE_SECURITY_ACTION_TYPE_LOOKASIDE_PROTOCOL :
10081                 gbl_action_type;
10082
10083         if (security_proto_supported(ut_params->type,
10084                         RTE_SECURITY_PROTOCOL_PDCP) < 0)
10085                 return TEST_SKIPPED;
10086
10087         status = test_PDCP_PROTO_cplane_encap_all();
10088         status += test_PDCP_PROTO_cplane_decap_all();
10089         status += test_PDCP_PROTO_uplane_encap_all();
10090         status += test_PDCP_PROTO_uplane_decap_all();
10091         status += test_PDCP_PROTO_SGL_in_place_32B();
10092         status += test_PDCP_PROTO_SGL_oop_32B_128B();
10093         status += test_PDCP_PROTO_SGL_oop_32B_40B();
10094         status += test_PDCP_PROTO_SGL_oop_128B_32B();
10095         status += test_PDCP_SDAP_PROTO_encap_all();
10096         status += test_PDCP_SDAP_PROTO_decap_all();
10097         status += test_PDCP_PROTO_short_mac();
10098
10099         if (status)
10100                 return TEST_FAILED;
10101         else
10102                 return TEST_SUCCESS;
10103 }
10104
10105 static int
10106 test_docsis_proto_uplink(const void *data)
10107 {
10108         const struct docsis_test_data *d_td = data;
10109         struct crypto_testsuite_params *ts_params = &testsuite_params;
10110         struct crypto_unittest_params *ut_params = &unittest_params;
10111         uint8_t *plaintext = NULL;
10112         uint8_t *ciphertext = NULL;
10113         uint8_t *iv_ptr;
10114         int32_t cipher_len, crc_len;
10115         uint32_t crc_data_len;
10116         int ret = TEST_SUCCESS;
10117
10118         struct rte_security_ctx *ctx = (struct rte_security_ctx *)
10119                                         rte_cryptodev_get_sec_ctx(
10120                                                 ts_params->valid_devs[0]);
10121
10122         /* Verify the capabilities */
10123         struct rte_security_capability_idx sec_cap_idx;
10124         const struct rte_security_capability *sec_cap;
10125         const struct rte_cryptodev_capabilities *crypto_cap;
10126         const struct rte_cryptodev_symmetric_capability *sym_cap;
10127         int j = 0;
10128
10129         /* Set action type */
10130         ut_params->type = gbl_action_type == RTE_SECURITY_ACTION_TYPE_NONE ?
10131                 RTE_SECURITY_ACTION_TYPE_LOOKASIDE_PROTOCOL :
10132                 gbl_action_type;
10133
10134         if (security_proto_supported(ut_params->type,
10135                         RTE_SECURITY_PROTOCOL_DOCSIS) < 0)
10136                 return TEST_SKIPPED;
10137
10138         sec_cap_idx.action = ut_params->type;
10139         sec_cap_idx.protocol = RTE_SECURITY_PROTOCOL_DOCSIS;
10140         sec_cap_idx.docsis.direction = RTE_SECURITY_DOCSIS_UPLINK;
10141
10142         sec_cap = rte_security_capability_get(ctx, &sec_cap_idx);
10143         if (sec_cap == NULL)
10144                 return TEST_SKIPPED;
10145
10146         while ((crypto_cap = &sec_cap->crypto_capabilities[j++])->op !=
10147                         RTE_CRYPTO_OP_TYPE_UNDEFINED) {
10148                 if (crypto_cap->op == RTE_CRYPTO_OP_TYPE_SYMMETRIC &&
10149                                 crypto_cap->sym.xform_type ==
10150                                         RTE_CRYPTO_SYM_XFORM_CIPHER &&
10151                                 crypto_cap->sym.cipher.algo ==
10152                                         RTE_CRYPTO_CIPHER_AES_DOCSISBPI) {
10153                         sym_cap = &crypto_cap->sym;
10154                         if (rte_cryptodev_sym_capability_check_cipher(sym_cap,
10155                                                 d_td->key.len,
10156                                                 d_td->iv.len) == 0)
10157                                 break;
10158                 }
10159         }
10160
10161         if (crypto_cap->op == RTE_CRYPTO_OP_TYPE_UNDEFINED)
10162                 return TEST_SKIPPED;
10163
10164         /* Setup source mbuf payload */
10165         ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
10166         memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
10167                         rte_pktmbuf_tailroom(ut_params->ibuf));
10168
10169         ciphertext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
10170                         d_td->ciphertext.len);
10171
10172         memcpy(ciphertext, d_td->ciphertext.data, d_td->ciphertext.len);
10173
10174         /* Setup cipher session parameters */
10175         ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
10176         ut_params->cipher_xform.cipher.algo = RTE_CRYPTO_CIPHER_AES_DOCSISBPI;
10177         ut_params->cipher_xform.cipher.op = RTE_CRYPTO_CIPHER_OP_DECRYPT;
10178         ut_params->cipher_xform.cipher.key.data = d_td->key.data;
10179         ut_params->cipher_xform.cipher.key.length = d_td->key.len;
10180         ut_params->cipher_xform.cipher.iv.length = d_td->iv.len;
10181         ut_params->cipher_xform.cipher.iv.offset = IV_OFFSET;
10182         ut_params->cipher_xform.next = NULL;
10183
10184         /* Setup DOCSIS session parameters */
10185         ut_params->docsis_xform.direction = RTE_SECURITY_DOCSIS_UPLINK;
10186
10187         struct rte_security_session_conf sess_conf = {
10188                 .action_type = ut_params->type,
10189                 .protocol = RTE_SECURITY_PROTOCOL_DOCSIS,
10190                 .docsis = ut_params->docsis_xform,
10191                 .crypto_xform = &ut_params->cipher_xform,
10192         };
10193
10194         /* Create security session */
10195         ut_params->sec_session = rte_security_session_create(ctx, &sess_conf,
10196                                         ts_params->session_mpool,
10197                                         ts_params->session_priv_mpool);
10198
10199         if (!ut_params->sec_session) {
10200                 printf("Test function %s line %u: failed to allocate session\n",
10201                         __func__, __LINE__);
10202                 ret = TEST_FAILED;
10203                 goto on_err;
10204         }
10205
10206         /* Generate crypto op data structure */
10207         ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
10208                                 RTE_CRYPTO_OP_TYPE_SYMMETRIC);
10209         if (!ut_params->op) {
10210                 printf("Test function %s line %u: failed to allocate symmetric "
10211                         "crypto operation\n", __func__, __LINE__);
10212                 ret = TEST_FAILED;
10213                 goto on_err;
10214         }
10215
10216         /* Setup CRC operation parameters */
10217         crc_len = d_td->ciphertext.no_crc == false ?
10218                         (d_td->ciphertext.len -
10219                                 d_td->ciphertext.crc_offset -
10220                                 RTE_ETHER_CRC_LEN) :
10221                         0;
10222         crc_len = crc_len > 0 ? crc_len : 0;
10223         crc_data_len = crc_len == 0 ? 0 : RTE_ETHER_CRC_LEN;
10224         ut_params->op->sym->auth.data.length = crc_len;
10225         ut_params->op->sym->auth.data.offset = d_td->ciphertext.crc_offset;
10226
10227         /* Setup cipher operation parameters */
10228         cipher_len = d_td->ciphertext.no_cipher == false ?
10229                         (d_td->ciphertext.len -
10230                                 d_td->ciphertext.cipher_offset) :
10231                         0;
10232         cipher_len = cipher_len > 0 ? cipher_len : 0;
10233         ut_params->op->sym->cipher.data.length = cipher_len;
10234         ut_params->op->sym->cipher.data.offset = d_td->ciphertext.cipher_offset;
10235
10236         /* Setup cipher IV */
10237         iv_ptr = (uint8_t *)ut_params->op + IV_OFFSET;
10238         rte_memcpy(iv_ptr, d_td->iv.data, d_td->iv.len);
10239
10240         /* Attach session to operation */
10241         rte_security_attach_session(ut_params->op, ut_params->sec_session);
10242
10243         /* Set crypto operation mbufs */
10244         ut_params->op->sym->m_src = ut_params->ibuf;
10245         ut_params->op->sym->m_dst = NULL;
10246
10247         /* Process crypto operation */
10248         if (process_crypto_request(ts_params->valid_devs[0], ut_params->op) ==
10249                         NULL) {
10250                 printf("Test function %s line %u: failed to process security "
10251                         "crypto op\n", __func__, __LINE__);
10252                 ret = TEST_FAILED;
10253                 goto on_err;
10254         }
10255
10256         if (ut_params->op->status != RTE_CRYPTO_OP_STATUS_SUCCESS) {
10257                 printf("Test function %s line %u: failed to process crypto op\n",
10258                         __func__, __LINE__);
10259                 ret = TEST_FAILED;
10260                 goto on_err;
10261         }
10262
10263         /* Validate plaintext */
10264         plaintext = ciphertext;
10265
10266         if (memcmp(plaintext, d_td->plaintext.data,
10267                         d_td->plaintext.len - crc_data_len)) {
10268                 printf("Test function %s line %u: plaintext not as expected\n",
10269                         __func__, __LINE__);
10270                 rte_hexdump(stdout, "expected", d_td->plaintext.data,
10271                                 d_td->plaintext.len);
10272                 rte_hexdump(stdout, "actual", plaintext, d_td->plaintext.len);
10273                 ret = TEST_FAILED;
10274                 goto on_err;
10275         }
10276
10277 on_err:
10278         rte_crypto_op_free(ut_params->op);
10279         ut_params->op = NULL;
10280
10281         if (ut_params->sec_session)
10282                 rte_security_session_destroy(ctx, ut_params->sec_session);
10283         ut_params->sec_session = NULL;
10284
10285         rte_pktmbuf_free(ut_params->ibuf);
10286         ut_params->ibuf = NULL;
10287
10288         return ret;
10289 }
10290
10291 static int
10292 test_docsis_proto_downlink(const void *data)
10293 {
10294         const struct docsis_test_data *d_td = data;
10295         struct crypto_testsuite_params *ts_params = &testsuite_params;
10296         struct crypto_unittest_params *ut_params = &unittest_params;
10297         uint8_t *plaintext = NULL;
10298         uint8_t *ciphertext = NULL;
10299         uint8_t *iv_ptr;
10300         int32_t cipher_len, crc_len;
10301         int ret = TEST_SUCCESS;
10302
10303         struct rte_security_ctx *ctx = (struct rte_security_ctx *)
10304                                         rte_cryptodev_get_sec_ctx(
10305                                                 ts_params->valid_devs[0]);
10306
10307         /* Verify the capabilities */
10308         struct rte_security_capability_idx sec_cap_idx;
10309         const struct rte_security_capability *sec_cap;
10310         const struct rte_cryptodev_capabilities *crypto_cap;
10311         const struct rte_cryptodev_symmetric_capability *sym_cap;
10312         int j = 0;
10313
10314         /* Set action type */
10315         ut_params->type = gbl_action_type == RTE_SECURITY_ACTION_TYPE_NONE ?
10316                 RTE_SECURITY_ACTION_TYPE_LOOKASIDE_PROTOCOL :
10317                 gbl_action_type;
10318
10319         if (security_proto_supported(ut_params->type,
10320                         RTE_SECURITY_PROTOCOL_DOCSIS) < 0)
10321                 return TEST_SKIPPED;
10322
10323         sec_cap_idx.action = ut_params->type;
10324         sec_cap_idx.protocol = RTE_SECURITY_PROTOCOL_DOCSIS;
10325         sec_cap_idx.docsis.direction = RTE_SECURITY_DOCSIS_DOWNLINK;
10326
10327         sec_cap = rte_security_capability_get(ctx, &sec_cap_idx);
10328         if (sec_cap == NULL)
10329                 return TEST_SKIPPED;
10330
10331         while ((crypto_cap = &sec_cap->crypto_capabilities[j++])->op !=
10332                         RTE_CRYPTO_OP_TYPE_UNDEFINED) {
10333                 if (crypto_cap->op == RTE_CRYPTO_OP_TYPE_SYMMETRIC &&
10334                                 crypto_cap->sym.xform_type ==
10335                                         RTE_CRYPTO_SYM_XFORM_CIPHER &&
10336                                 crypto_cap->sym.cipher.algo ==
10337                                         RTE_CRYPTO_CIPHER_AES_DOCSISBPI) {
10338                         sym_cap = &crypto_cap->sym;
10339                         if (rte_cryptodev_sym_capability_check_cipher(sym_cap,
10340                                                 d_td->key.len,
10341                                                 d_td->iv.len) == 0)
10342                                 break;
10343                 }
10344         }
10345
10346         if (crypto_cap->op == RTE_CRYPTO_OP_TYPE_UNDEFINED)
10347                 return TEST_SKIPPED;
10348
10349         /* Setup source mbuf payload */
10350         ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
10351         memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
10352                         rte_pktmbuf_tailroom(ut_params->ibuf));
10353
10354         plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
10355                         d_td->plaintext.len);
10356
10357         memcpy(plaintext, d_td->plaintext.data, d_td->plaintext.len);
10358
10359         /* Setup cipher session parameters */
10360         ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
10361         ut_params->cipher_xform.cipher.algo = RTE_CRYPTO_CIPHER_AES_DOCSISBPI;
10362         ut_params->cipher_xform.cipher.op = RTE_CRYPTO_CIPHER_OP_ENCRYPT;
10363         ut_params->cipher_xform.cipher.key.data = d_td->key.data;
10364         ut_params->cipher_xform.cipher.key.length = d_td->key.len;
10365         ut_params->cipher_xform.cipher.iv.length = d_td->iv.len;
10366         ut_params->cipher_xform.cipher.iv.offset = IV_OFFSET;
10367         ut_params->cipher_xform.next = NULL;
10368
10369         /* Setup DOCSIS session parameters */
10370         ut_params->docsis_xform.direction = RTE_SECURITY_DOCSIS_DOWNLINK;
10371
10372         struct rte_security_session_conf sess_conf = {
10373                 .action_type = ut_params->type,
10374                 .protocol = RTE_SECURITY_PROTOCOL_DOCSIS,
10375                 .docsis = ut_params->docsis_xform,
10376                 .crypto_xform = &ut_params->cipher_xform,
10377         };
10378
10379         /* Create security session */
10380         ut_params->sec_session = rte_security_session_create(ctx, &sess_conf,
10381                                         ts_params->session_mpool,
10382                                         ts_params->session_priv_mpool);
10383
10384         if (!ut_params->sec_session) {
10385                 printf("Test function %s line %u: failed to allocate session\n",
10386                         __func__, __LINE__);
10387                 ret = TEST_FAILED;
10388                 goto on_err;
10389         }
10390
10391         /* Generate crypto op data structure */
10392         ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
10393                                 RTE_CRYPTO_OP_TYPE_SYMMETRIC);
10394         if (!ut_params->op) {
10395                 printf("Test function %s line %u: failed to allocate symmetric "
10396                         "crypto operation\n", __func__, __LINE__);
10397                 ret = TEST_FAILED;
10398                 goto on_err;
10399         }
10400
10401         /* Setup CRC operation parameters */
10402         crc_len = d_td->plaintext.no_crc == false ?
10403                         (d_td->plaintext.len -
10404                                 d_td->plaintext.crc_offset -
10405                                 RTE_ETHER_CRC_LEN) :
10406                         0;
10407         crc_len = crc_len > 0 ? crc_len : 0;
10408         ut_params->op->sym->auth.data.length = crc_len;
10409         ut_params->op->sym->auth.data.offset = d_td->plaintext.crc_offset;
10410
10411         /* Setup cipher operation parameters */
10412         cipher_len = d_td->plaintext.no_cipher == false ?
10413                         (d_td->plaintext.len -
10414                                 d_td->plaintext.cipher_offset) :
10415                         0;
10416         cipher_len = cipher_len > 0 ? cipher_len : 0;
10417         ut_params->op->sym->cipher.data.length = cipher_len;
10418         ut_params->op->sym->cipher.data.offset = d_td->plaintext.cipher_offset;
10419
10420         /* Setup cipher IV */
10421         iv_ptr = (uint8_t *)ut_params->op + IV_OFFSET;
10422         rte_memcpy(iv_ptr, d_td->iv.data, d_td->iv.len);
10423
10424         /* Attach session to operation */
10425         rte_security_attach_session(ut_params->op, ut_params->sec_session);
10426
10427         /* Set crypto operation mbufs */
10428         ut_params->op->sym->m_src = ut_params->ibuf;
10429         ut_params->op->sym->m_dst = NULL;
10430
10431         /* Process crypto operation */
10432         if (process_crypto_request(ts_params->valid_devs[0], ut_params->op) ==
10433                         NULL) {
10434                 printf("Test function %s line %u: failed to process crypto op\n",
10435                         __func__, __LINE__);
10436                 ret = TEST_FAILED;
10437                 goto on_err;
10438         }
10439
10440         if (ut_params->op->status != RTE_CRYPTO_OP_STATUS_SUCCESS) {
10441                 printf("Test function %s line %u: crypto op processing failed\n",
10442                         __func__, __LINE__);
10443                 ret = TEST_FAILED;
10444                 goto on_err;
10445         }
10446
10447         /* Validate ciphertext */
10448         ciphertext = plaintext;
10449
10450         if (memcmp(ciphertext, d_td->ciphertext.data, d_td->ciphertext.len)) {
10451                 printf("Test function %s line %u: plaintext not as expected\n",
10452                         __func__, __LINE__);
10453                 rte_hexdump(stdout, "expected", d_td->ciphertext.data,
10454                                 d_td->ciphertext.len);
10455                 rte_hexdump(stdout, "actual", ciphertext, d_td->ciphertext.len);
10456                 ret = TEST_FAILED;
10457                 goto on_err;
10458         }
10459
10460 on_err:
10461         rte_crypto_op_free(ut_params->op);
10462         ut_params->op = NULL;
10463
10464         if (ut_params->sec_session)
10465                 rte_security_session_destroy(ctx, ut_params->sec_session);
10466         ut_params->sec_session = NULL;
10467
10468         rte_pktmbuf_free(ut_params->ibuf);
10469         ut_params->ibuf = NULL;
10470
10471         return ret;
10472 }
10473 #endif
10474
10475 static int
10476 test_AES_GCM_authenticated_encryption_test_case_1(void)
10477 {
10478         return test_authenticated_encryption(&gcm_test_case_1);
10479 }
10480
10481 static int
10482 test_AES_GCM_authenticated_encryption_test_case_2(void)
10483 {
10484         return test_authenticated_encryption(&gcm_test_case_2);
10485 }
10486
10487 static int
10488 test_AES_GCM_authenticated_encryption_test_case_3(void)
10489 {
10490         return test_authenticated_encryption(&gcm_test_case_3);
10491 }
10492
10493 static int
10494 test_AES_GCM_authenticated_encryption_test_case_4(void)
10495 {
10496         return test_authenticated_encryption(&gcm_test_case_4);
10497 }
10498
10499 static int
10500 test_AES_GCM_authenticated_encryption_test_case_5(void)
10501 {
10502         return test_authenticated_encryption(&gcm_test_case_5);
10503 }
10504
10505 static int
10506 test_AES_GCM_authenticated_encryption_test_case_6(void)
10507 {
10508         return test_authenticated_encryption(&gcm_test_case_6);
10509 }
10510
10511 static int
10512 test_AES_GCM_authenticated_encryption_test_case_7(void)
10513 {
10514         return test_authenticated_encryption(&gcm_test_case_7);
10515 }
10516
10517 static int
10518 test_AES_GCM_authenticated_encryption_test_case_8(void)
10519 {
10520         return test_authenticated_encryption(&gcm_test_case_8);
10521 }
10522
10523 static int
10524 test_AES_GCM_J0_authenticated_encryption_test_case_1(void)
10525 {
10526         return test_authenticated_encryption(&gcm_J0_test_case_1);
10527 }
10528
10529 static int
10530 test_AES_GCM_auth_encryption_test_case_192_1(void)
10531 {
10532         return test_authenticated_encryption(&gcm_test_case_192_1);
10533 }
10534
10535 static int
10536 test_AES_GCM_auth_encryption_test_case_192_2(void)
10537 {
10538         return test_authenticated_encryption(&gcm_test_case_192_2);
10539 }
10540
10541 static int
10542 test_AES_GCM_auth_encryption_test_case_192_3(void)
10543 {
10544         return test_authenticated_encryption(&gcm_test_case_192_3);
10545 }
10546
10547 static int
10548 test_AES_GCM_auth_encryption_test_case_192_4(void)
10549 {
10550         return test_authenticated_encryption(&gcm_test_case_192_4);
10551 }
10552
10553 static int
10554 test_AES_GCM_auth_encryption_test_case_192_5(void)
10555 {
10556         return test_authenticated_encryption(&gcm_test_case_192_5);
10557 }
10558
10559 static int
10560 test_AES_GCM_auth_encryption_test_case_192_6(void)
10561 {
10562         return test_authenticated_encryption(&gcm_test_case_192_6);
10563 }
10564
10565 static int
10566 test_AES_GCM_auth_encryption_test_case_192_7(void)
10567 {
10568         return test_authenticated_encryption(&gcm_test_case_192_7);
10569 }
10570
10571 static int
10572 test_AES_GCM_auth_encryption_test_case_256_1(void)
10573 {
10574         return test_authenticated_encryption(&gcm_test_case_256_1);
10575 }
10576
10577 static int
10578 test_AES_GCM_auth_encryption_test_case_256_2(void)
10579 {
10580         return test_authenticated_encryption(&gcm_test_case_256_2);
10581 }
10582
10583 static int
10584 test_AES_GCM_auth_encryption_test_case_256_3(void)
10585 {
10586         return test_authenticated_encryption(&gcm_test_case_256_3);
10587 }
10588
10589 static int
10590 test_AES_GCM_auth_encryption_test_case_256_4(void)
10591 {
10592         return test_authenticated_encryption(&gcm_test_case_256_4);
10593 }
10594
10595 static int
10596 test_AES_GCM_auth_encryption_test_case_256_5(void)
10597 {
10598         return test_authenticated_encryption(&gcm_test_case_256_5);
10599 }
10600
10601 static int
10602 test_AES_GCM_auth_encryption_test_case_256_6(void)
10603 {
10604         return test_authenticated_encryption(&gcm_test_case_256_6);
10605 }
10606
10607 static int
10608 test_AES_GCM_auth_encryption_test_case_256_7(void)
10609 {
10610         return test_authenticated_encryption(&gcm_test_case_256_7);
10611 }
10612
10613 static int
10614 test_AES_GCM_auth_encryption_test_case_aad_1(void)
10615 {
10616         return test_authenticated_encryption(&gcm_test_case_aad_1);
10617 }
10618
10619 static int
10620 test_AES_GCM_auth_encryption_test_case_aad_2(void)
10621 {
10622         return test_authenticated_encryption(&gcm_test_case_aad_2);
10623 }
10624
10625 static int
10626 test_AES_GCM_auth_encryption_fail_iv_corrupt(void)
10627 {
10628         struct aead_test_data tdata;
10629         int res;
10630
10631         RTE_LOG(INFO, USER1, "This is a negative test, errors are expected\n");
10632         memcpy(&tdata, &gcm_test_case_7, sizeof(struct aead_test_data));
10633         tdata.iv.data[0] += 1;
10634         res = test_authenticated_encryption(&tdata);
10635         if (res == TEST_SKIPPED)
10636                 return res;
10637         TEST_ASSERT_EQUAL(res, TEST_FAILED, "encryption not failed");
10638         return TEST_SUCCESS;
10639 }
10640
10641 static int
10642 test_AES_GCM_auth_encryption_fail_in_data_corrupt(void)
10643 {
10644         struct aead_test_data tdata;
10645         int res;
10646
10647         RTE_LOG(INFO, USER1, "This is a negative test, errors are expected\n");
10648         memcpy(&tdata, &gcm_test_case_7, sizeof(struct aead_test_data));
10649         tdata.plaintext.data[0] += 1;
10650         res = test_authenticated_encryption(&tdata);
10651         if (res == TEST_SKIPPED)
10652                 return res;
10653         TEST_ASSERT_EQUAL(res, TEST_FAILED, "encryption not failed");
10654         return TEST_SUCCESS;
10655 }
10656
10657 static int
10658 test_AES_GCM_auth_encryption_fail_out_data_corrupt(void)
10659 {
10660         struct aead_test_data tdata;
10661         int res;
10662
10663         RTE_LOG(INFO, USER1, "This is a negative test, errors are expected\n");
10664         memcpy(&tdata, &gcm_test_case_7, sizeof(struct aead_test_data));
10665         tdata.ciphertext.data[0] += 1;
10666         res = test_authenticated_encryption(&tdata);
10667         if (res == TEST_SKIPPED)
10668                 return res;
10669         TEST_ASSERT_EQUAL(res, TEST_FAILED, "encryption not failed");
10670         return TEST_SUCCESS;
10671 }
10672
10673 static int
10674 test_AES_GCM_auth_encryption_fail_aad_len_corrupt(void)
10675 {
10676         struct aead_test_data tdata;
10677         int res;
10678
10679         RTE_LOG(INFO, USER1, "This is a negative test, errors are expected\n");
10680         memcpy(&tdata, &gcm_test_case_7, sizeof(struct aead_test_data));
10681         tdata.aad.len += 1;
10682         res = test_authenticated_encryption(&tdata);
10683         if (res == TEST_SKIPPED)
10684                 return res;
10685         TEST_ASSERT_EQUAL(res, TEST_FAILED, "encryption not failed");
10686         return TEST_SUCCESS;
10687 }
10688
10689 static int
10690 test_AES_GCM_auth_encryption_fail_aad_corrupt(void)
10691 {
10692         struct aead_test_data tdata;
10693         uint8_t aad[gcm_test_case_7.aad.len];
10694         int res;
10695
10696         RTE_LOG(INFO, USER1, "This is a negative test, errors are expected\n");
10697         memcpy(&tdata, &gcm_test_case_7, sizeof(struct aead_test_data));
10698         memcpy(aad, gcm_test_case_7.aad.data, gcm_test_case_7.aad.len);
10699         aad[0] += 1;
10700         tdata.aad.data = aad;
10701         res = test_authenticated_encryption(&tdata);
10702         if (res == TEST_SKIPPED)
10703                 return res;
10704         TEST_ASSERT_EQUAL(res, TEST_FAILED, "encryption not failed");
10705         return TEST_SUCCESS;
10706 }
10707
10708 static int
10709 test_AES_GCM_auth_encryption_fail_tag_corrupt(void)
10710 {
10711         struct aead_test_data tdata;
10712         int res;
10713
10714         RTE_LOG(INFO, USER1, "This is a negative test, errors are expected\n");
10715         memcpy(&tdata, &gcm_test_case_7, sizeof(struct aead_test_data));
10716         tdata.auth_tag.data[0] += 1;
10717         res = test_authenticated_encryption(&tdata);
10718         if (res == TEST_SKIPPED)
10719                 return res;
10720         TEST_ASSERT_EQUAL(res, TEST_FAILED, "encryption not failed");
10721         return TEST_SUCCESS;
10722 }
10723
10724 static int
10725 test_authenticated_decryption(const struct aead_test_data *tdata)
10726 {
10727         struct crypto_testsuite_params *ts_params = &testsuite_params;
10728         struct crypto_unittest_params *ut_params = &unittest_params;
10729
10730         int retval;
10731         uint8_t *plaintext;
10732         uint32_t i;
10733         struct rte_cryptodev_info dev_info;
10734
10735         rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
10736         uint64_t feat_flags = dev_info.feature_flags;
10737
10738         if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
10739                         (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
10740                 printf("Device doesn't support RAW data-path APIs.\n");
10741                 return TEST_SKIPPED;
10742         }
10743
10744         /* Verify the capabilities */
10745         struct rte_cryptodev_sym_capability_idx cap_idx;
10746         const struct rte_cryptodev_symmetric_capability *capability;
10747         cap_idx.type = RTE_CRYPTO_SYM_XFORM_AEAD;
10748         cap_idx.algo.aead = tdata->algo;
10749         capability = rte_cryptodev_sym_capability_get(
10750                         ts_params->valid_devs[0], &cap_idx);
10751         if (capability == NULL)
10752                 return TEST_SKIPPED;
10753         if (rte_cryptodev_sym_capability_check_aead(
10754                         capability, tdata->key.len, tdata->auth_tag.len,
10755                         tdata->aad.len, tdata->iv.len))
10756                 return TEST_SKIPPED;
10757
10758         /* Create AEAD session */
10759         retval = create_aead_session(ts_params->valid_devs[0],
10760                         tdata->algo,
10761                         RTE_CRYPTO_AEAD_OP_DECRYPT,
10762                         tdata->key.data, tdata->key.len,
10763                         tdata->aad.len, tdata->auth_tag.len,
10764                         tdata->iv.len);
10765         if (retval < 0)
10766                 return retval;
10767
10768         /* alloc mbuf and set payload */
10769         if (tdata->aad.len > MBUF_SIZE) {
10770                 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->large_mbuf_pool);
10771                 /* Populate full size of add data */
10772                 for (i = 32; i < MAX_AAD_LENGTH; i += 32)
10773                         memcpy(&tdata->aad.data[i], &tdata->aad.data[0], 32);
10774         } else
10775                 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
10776
10777         memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
10778                         rte_pktmbuf_tailroom(ut_params->ibuf));
10779
10780         /* Create AEAD operation */
10781         retval = create_aead_operation(RTE_CRYPTO_AEAD_OP_DECRYPT, tdata);
10782         if (retval < 0)
10783                 return retval;
10784
10785         rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
10786
10787         ut_params->op->sym->m_src = ut_params->ibuf;
10788
10789         /* Process crypto operation */
10790         if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
10791                 process_cpu_aead_op(ts_params->valid_devs[0], ut_params->op);
10792         else if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
10793                 process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
10794                                 ut_params->op, 0, 0, 0, 0);
10795         else
10796                 TEST_ASSERT_NOT_NULL(
10797                         process_crypto_request(ts_params->valid_devs[0],
10798                         ut_params->op), "failed to process sym crypto op");
10799
10800         TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
10801                         "crypto op processing failed");
10802
10803         if (ut_params->op->sym->m_dst)
10804                 plaintext = rte_pktmbuf_mtod(ut_params->op->sym->m_dst,
10805                                 uint8_t *);
10806         else
10807                 plaintext = rte_pktmbuf_mtod_offset(ut_params->op->sym->m_src,
10808                                 uint8_t *,
10809                                 ut_params->op->sym->cipher.data.offset);
10810
10811         debug_hexdump(stdout, "plaintext:", plaintext, tdata->ciphertext.len);
10812
10813         /* Validate obuf */
10814         TEST_ASSERT_BUFFERS_ARE_EQUAL(
10815                         plaintext,
10816                         tdata->plaintext.data,
10817                         tdata->plaintext.len,
10818                         "Plaintext data not as expected");
10819
10820         TEST_ASSERT_EQUAL(ut_params->op->status,
10821                         RTE_CRYPTO_OP_STATUS_SUCCESS,
10822                         "Authentication failed");
10823
10824         return 0;
10825 }
10826
10827 static int
10828 test_AES_GCM_authenticated_decryption_test_case_1(void)
10829 {
10830         return test_authenticated_decryption(&gcm_test_case_1);
10831 }
10832
10833 static int
10834 test_AES_GCM_authenticated_decryption_test_case_2(void)
10835 {
10836         return test_authenticated_decryption(&gcm_test_case_2);
10837 }
10838
10839 static int
10840 test_AES_GCM_authenticated_decryption_test_case_3(void)
10841 {
10842         return test_authenticated_decryption(&gcm_test_case_3);
10843 }
10844
10845 static int
10846 test_AES_GCM_authenticated_decryption_test_case_4(void)
10847 {
10848         return test_authenticated_decryption(&gcm_test_case_4);
10849 }
10850
10851 static int
10852 test_AES_GCM_authenticated_decryption_test_case_5(void)
10853 {
10854         return test_authenticated_decryption(&gcm_test_case_5);
10855 }
10856
10857 static int
10858 test_AES_GCM_authenticated_decryption_test_case_6(void)
10859 {
10860         return test_authenticated_decryption(&gcm_test_case_6);
10861 }
10862
10863 static int
10864 test_AES_GCM_authenticated_decryption_test_case_7(void)
10865 {
10866         return test_authenticated_decryption(&gcm_test_case_7);
10867 }
10868
10869 static int
10870 test_AES_GCM_authenticated_decryption_test_case_8(void)
10871 {
10872         return test_authenticated_decryption(&gcm_test_case_8);
10873 }
10874
10875 static int
10876 test_AES_GCM_J0_authenticated_decryption_test_case_1(void)
10877 {
10878         return test_authenticated_decryption(&gcm_J0_test_case_1);
10879 }
10880
10881 static int
10882 test_AES_GCM_auth_decryption_test_case_192_1(void)
10883 {
10884         return test_authenticated_decryption(&gcm_test_case_192_1);
10885 }
10886
10887 static int
10888 test_AES_GCM_auth_decryption_test_case_192_2(void)
10889 {
10890         return test_authenticated_decryption(&gcm_test_case_192_2);
10891 }
10892
10893 static int
10894 test_AES_GCM_auth_decryption_test_case_192_3(void)
10895 {
10896         return test_authenticated_decryption(&gcm_test_case_192_3);
10897 }
10898
10899 static int
10900 test_AES_GCM_auth_decryption_test_case_192_4(void)
10901 {
10902         return test_authenticated_decryption(&gcm_test_case_192_4);
10903 }
10904
10905 static int
10906 test_AES_GCM_auth_decryption_test_case_192_5(void)
10907 {
10908         return test_authenticated_decryption(&gcm_test_case_192_5);
10909 }
10910
10911 static int
10912 test_AES_GCM_auth_decryption_test_case_192_6(void)
10913 {
10914         return test_authenticated_decryption(&gcm_test_case_192_6);
10915 }
10916
10917 static int
10918 test_AES_GCM_auth_decryption_test_case_192_7(void)
10919 {
10920         return test_authenticated_decryption(&gcm_test_case_192_7);
10921 }
10922
10923 static int
10924 test_AES_GCM_auth_decryption_test_case_256_1(void)
10925 {
10926         return test_authenticated_decryption(&gcm_test_case_256_1);
10927 }
10928
10929 static int
10930 test_AES_GCM_auth_decryption_test_case_256_2(void)
10931 {
10932         return test_authenticated_decryption(&gcm_test_case_256_2);
10933 }
10934
10935 static int
10936 test_AES_GCM_auth_decryption_test_case_256_3(void)
10937 {
10938         return test_authenticated_decryption(&gcm_test_case_256_3);
10939 }
10940
10941 static int
10942 test_AES_GCM_auth_decryption_test_case_256_4(void)
10943 {
10944         return test_authenticated_decryption(&gcm_test_case_256_4);
10945 }
10946
10947 static int
10948 test_AES_GCM_auth_decryption_test_case_256_5(void)
10949 {
10950         return test_authenticated_decryption(&gcm_test_case_256_5);
10951 }
10952
10953 static int
10954 test_AES_GCM_auth_decryption_test_case_256_6(void)
10955 {
10956         return test_authenticated_decryption(&gcm_test_case_256_6);
10957 }
10958
10959 static int
10960 test_AES_GCM_auth_decryption_test_case_256_7(void)
10961 {
10962         return test_authenticated_decryption(&gcm_test_case_256_7);
10963 }
10964
10965 static int
10966 test_AES_GCM_auth_decryption_test_case_aad_1(void)
10967 {
10968         return test_authenticated_decryption(&gcm_test_case_aad_1);
10969 }
10970
10971 static int
10972 test_AES_GCM_auth_decryption_test_case_aad_2(void)
10973 {
10974         return test_authenticated_decryption(&gcm_test_case_aad_2);
10975 }
10976
10977 static int
10978 test_AES_GCM_auth_decryption_fail_iv_corrupt(void)
10979 {
10980         struct aead_test_data tdata;
10981         int res;
10982
10983         memcpy(&tdata, &gcm_test_case_7, sizeof(struct aead_test_data));
10984         tdata.iv.data[0] += 1;
10985         res = test_authenticated_decryption(&tdata);
10986         if (res == TEST_SKIPPED)
10987                 return res;
10988         TEST_ASSERT_EQUAL(res, TEST_FAILED, "decryption not failed");
10989         return TEST_SUCCESS;
10990 }
10991
10992 static int
10993 test_AES_GCM_auth_decryption_fail_in_data_corrupt(void)
10994 {
10995         struct aead_test_data tdata;
10996         int res;
10997
10998         RTE_LOG(INFO, USER1, "This is a negative test, errors are expected\n");
10999         memcpy(&tdata, &gcm_test_case_7, sizeof(struct aead_test_data));
11000         tdata.plaintext.data[0] += 1;
11001         res = test_authenticated_decryption(&tdata);
11002         if (res == TEST_SKIPPED)
11003                 return res;
11004         TEST_ASSERT_EQUAL(res, TEST_FAILED, "decryption not failed");
11005         return TEST_SUCCESS;
11006 }
11007
11008 static int
11009 test_AES_GCM_auth_decryption_fail_out_data_corrupt(void)
11010 {
11011         struct aead_test_data tdata;
11012         int res;
11013
11014         memcpy(&tdata, &gcm_test_case_7, sizeof(struct aead_test_data));
11015         tdata.ciphertext.data[0] += 1;
11016         res = test_authenticated_decryption(&tdata);
11017         if (res == TEST_SKIPPED)
11018                 return res;
11019         TEST_ASSERT_EQUAL(res, TEST_FAILED, "decryption not failed");
11020         return TEST_SUCCESS;
11021 }
11022
11023 static int
11024 test_AES_GCM_auth_decryption_fail_aad_len_corrupt(void)
11025 {
11026         struct aead_test_data tdata;
11027         int res;
11028
11029         memcpy(&tdata, &gcm_test_case_7, sizeof(struct aead_test_data));
11030         tdata.aad.len += 1;
11031         res = test_authenticated_decryption(&tdata);
11032         if (res == TEST_SKIPPED)
11033                 return res;
11034         TEST_ASSERT_EQUAL(res, TEST_FAILED, "decryption not failed");
11035         return TEST_SUCCESS;
11036 }
11037
11038 static int
11039 test_AES_GCM_auth_decryption_fail_aad_corrupt(void)
11040 {
11041         struct aead_test_data tdata;
11042         uint8_t aad[gcm_test_case_7.aad.len];
11043         int res;
11044
11045         memcpy(&tdata, &gcm_test_case_7, sizeof(struct aead_test_data));
11046         memcpy(aad, gcm_test_case_7.aad.data, gcm_test_case_7.aad.len);
11047         aad[0] += 1;
11048         tdata.aad.data = aad;
11049         res = test_authenticated_decryption(&tdata);
11050         if (res == TEST_SKIPPED)
11051                 return res;
11052         TEST_ASSERT_EQUAL(res, TEST_FAILED, "decryption not failed");
11053         return TEST_SUCCESS;
11054 }
11055
11056 static int
11057 test_AES_GCM_auth_decryption_fail_tag_corrupt(void)
11058 {
11059         struct aead_test_data tdata;
11060         int res;
11061
11062         memcpy(&tdata, &gcm_test_case_7, sizeof(struct aead_test_data));
11063         tdata.auth_tag.data[0] += 1;
11064         res = test_authenticated_decryption(&tdata);
11065         if (res == TEST_SKIPPED)
11066                 return res;
11067         TEST_ASSERT_EQUAL(res, TEST_FAILED, "authentication not failed");
11068         return TEST_SUCCESS;
11069 }
11070
11071 static int
11072 test_authenticated_encryption_oop(const struct aead_test_data *tdata)
11073 {
11074         struct crypto_testsuite_params *ts_params = &testsuite_params;
11075         struct crypto_unittest_params *ut_params = &unittest_params;
11076
11077         int retval;
11078         uint8_t *ciphertext, *auth_tag;
11079         uint16_t plaintext_pad_len;
11080         struct rte_cryptodev_info dev_info;
11081
11082         /* Verify the capabilities */
11083         struct rte_cryptodev_sym_capability_idx cap_idx;
11084         cap_idx.type = RTE_CRYPTO_SYM_XFORM_AEAD;
11085         cap_idx.algo.aead = tdata->algo;
11086         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
11087                         &cap_idx) == NULL)
11088                 return TEST_SKIPPED;
11089
11090         rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
11091         uint64_t feat_flags = dev_info.feature_flags;
11092
11093         if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
11094                         (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP)))
11095                 return TEST_SKIPPED;
11096
11097         /* not supported with CPU crypto */
11098         if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
11099                 return TEST_SKIPPED;
11100
11101         /* Create AEAD session */
11102         retval = create_aead_session(ts_params->valid_devs[0],
11103                         tdata->algo,
11104                         RTE_CRYPTO_AEAD_OP_ENCRYPT,
11105                         tdata->key.data, tdata->key.len,
11106                         tdata->aad.len, tdata->auth_tag.len,
11107                         tdata->iv.len);
11108         if (retval < 0)
11109                 return retval;
11110
11111         ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
11112         ut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
11113
11114         /* clear mbuf payload */
11115         memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
11116                         rte_pktmbuf_tailroom(ut_params->ibuf));
11117         memset(rte_pktmbuf_mtod(ut_params->obuf, uint8_t *), 0,
11118                         rte_pktmbuf_tailroom(ut_params->obuf));
11119
11120         /* Create AEAD operation */
11121         retval = create_aead_operation(RTE_CRYPTO_AEAD_OP_ENCRYPT, tdata);
11122         if (retval < 0)
11123                 return retval;
11124
11125         rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
11126
11127         ut_params->op->sym->m_src = ut_params->ibuf;
11128         ut_params->op->sym->m_dst = ut_params->obuf;
11129
11130         /* Process crypto operation */
11131         if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
11132                 process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
11133                         ut_params->op, 0, 0, 0, 0);
11134         else
11135                 TEST_ASSERT_NOT_NULL(process_crypto_request(ts_params->valid_devs[0],
11136                         ut_params->op), "failed to process sym crypto op");
11137
11138         TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
11139                         "crypto op processing failed");
11140
11141         plaintext_pad_len = RTE_ALIGN_CEIL(tdata->plaintext.len, 16);
11142
11143         ciphertext = rte_pktmbuf_mtod_offset(ut_params->obuf, uint8_t *,
11144                         ut_params->op->sym->cipher.data.offset);
11145         auth_tag = ciphertext + plaintext_pad_len;
11146
11147         debug_hexdump(stdout, "ciphertext:", ciphertext, tdata->ciphertext.len);
11148         debug_hexdump(stdout, "auth tag:", auth_tag, tdata->auth_tag.len);
11149
11150         /* Validate obuf */
11151         TEST_ASSERT_BUFFERS_ARE_EQUAL(
11152                         ciphertext,
11153                         tdata->ciphertext.data,
11154                         tdata->ciphertext.len,
11155                         "Ciphertext data not as expected");
11156
11157         TEST_ASSERT_BUFFERS_ARE_EQUAL(
11158                         auth_tag,
11159                         tdata->auth_tag.data,
11160                         tdata->auth_tag.len,
11161                         "Generated auth tag not as expected");
11162
11163         return 0;
11164
11165 }
11166
11167 static int
11168 test_AES_GCM_authenticated_encryption_oop_test_case_1(void)
11169 {
11170         return test_authenticated_encryption_oop(&gcm_test_case_5);
11171 }
11172
11173 static int
11174 test_authenticated_decryption_oop(const struct aead_test_data *tdata)
11175 {
11176         struct crypto_testsuite_params *ts_params = &testsuite_params;
11177         struct crypto_unittest_params *ut_params = &unittest_params;
11178
11179         int retval;
11180         uint8_t *plaintext;
11181         struct rte_cryptodev_info dev_info;
11182
11183         rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
11184         uint64_t feat_flags = dev_info.feature_flags;
11185
11186         /* Verify the capabilities */
11187         struct rte_cryptodev_sym_capability_idx cap_idx;
11188         cap_idx.type = RTE_CRYPTO_SYM_XFORM_AEAD;
11189         cap_idx.algo.aead = tdata->algo;
11190         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
11191                         &cap_idx) == NULL)
11192                 return TEST_SKIPPED;
11193
11194         /* not supported with CPU crypto and raw data-path APIs*/
11195         if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO ||
11196                         global_api_test_type == CRYPTODEV_RAW_API_TEST)
11197                 return TEST_SKIPPED;
11198
11199         if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
11200                         (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
11201                 printf("Device does not support RAW data-path APIs.\n");
11202                 return TEST_SKIPPED;
11203         }
11204
11205         /* Create AEAD session */
11206         retval = create_aead_session(ts_params->valid_devs[0],
11207                         tdata->algo,
11208                         RTE_CRYPTO_AEAD_OP_DECRYPT,
11209                         tdata->key.data, tdata->key.len,
11210                         tdata->aad.len, tdata->auth_tag.len,
11211                         tdata->iv.len);
11212         if (retval < 0)
11213                 return retval;
11214
11215         /* alloc mbuf and set payload */
11216         ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
11217         ut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
11218
11219         memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
11220                         rte_pktmbuf_tailroom(ut_params->ibuf));
11221         memset(rte_pktmbuf_mtod(ut_params->obuf, uint8_t *), 0,
11222                         rte_pktmbuf_tailroom(ut_params->obuf));
11223
11224         /* Create AEAD operation */
11225         retval = create_aead_operation(RTE_CRYPTO_AEAD_OP_DECRYPT, tdata);
11226         if (retval < 0)
11227                 return retval;
11228
11229         rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
11230
11231         ut_params->op->sym->m_src = ut_params->ibuf;
11232         ut_params->op->sym->m_dst = ut_params->obuf;
11233
11234         /* Process crypto operation */
11235         if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
11236                 process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
11237                                 ut_params->op, 0, 0, 0, 0);
11238         else
11239                 TEST_ASSERT_NOT_NULL(process_crypto_request(ts_params->valid_devs[0],
11240                         ut_params->op), "failed to process sym crypto op");
11241
11242         TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
11243                         "crypto op processing failed");
11244
11245         plaintext = rte_pktmbuf_mtod_offset(ut_params->obuf, uint8_t *,
11246                         ut_params->op->sym->cipher.data.offset);
11247
11248         debug_hexdump(stdout, "plaintext:", plaintext, tdata->ciphertext.len);
11249
11250         /* Validate obuf */
11251         TEST_ASSERT_BUFFERS_ARE_EQUAL(
11252                         plaintext,
11253                         tdata->plaintext.data,
11254                         tdata->plaintext.len,
11255                         "Plaintext data not as expected");
11256
11257         TEST_ASSERT_EQUAL(ut_params->op->status,
11258                         RTE_CRYPTO_OP_STATUS_SUCCESS,
11259                         "Authentication failed");
11260         return 0;
11261 }
11262
11263 static int
11264 test_AES_GCM_authenticated_decryption_oop_test_case_1(void)
11265 {
11266         return test_authenticated_decryption_oop(&gcm_test_case_5);
11267 }
11268
11269 static int
11270 test_authenticated_encryption_sessionless(
11271                 const struct aead_test_data *tdata)
11272 {
11273         struct crypto_testsuite_params *ts_params = &testsuite_params;
11274         struct crypto_unittest_params *ut_params = &unittest_params;
11275
11276         int retval;
11277         uint8_t *ciphertext, *auth_tag;
11278         uint16_t plaintext_pad_len;
11279         uint8_t key[tdata->key.len + 1];
11280         struct rte_cryptodev_info dev_info;
11281
11282         rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
11283         uint64_t feat_flags = dev_info.feature_flags;
11284
11285         if (!(feat_flags & RTE_CRYPTODEV_FF_SYM_SESSIONLESS)) {
11286                 printf("Device doesn't support Sessionless ops.\n");
11287                 return TEST_SKIPPED;
11288         }
11289
11290         /* not supported with CPU crypto */
11291         if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
11292                 return TEST_SKIPPED;
11293
11294         /* Verify the capabilities */
11295         struct rte_cryptodev_sym_capability_idx cap_idx;
11296         cap_idx.type = RTE_CRYPTO_SYM_XFORM_AEAD;
11297         cap_idx.algo.aead = tdata->algo;
11298         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
11299                         &cap_idx) == NULL)
11300                 return TEST_SKIPPED;
11301
11302         ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
11303
11304         /* clear mbuf payload */
11305         memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
11306                         rte_pktmbuf_tailroom(ut_params->ibuf));
11307
11308         /* Create AEAD operation */
11309         retval = create_aead_operation(RTE_CRYPTO_AEAD_OP_ENCRYPT, tdata);
11310         if (retval < 0)
11311                 return retval;
11312
11313         /* Create GCM xform */
11314         memcpy(key, tdata->key.data, tdata->key.len);
11315         retval = create_aead_xform(ut_params->op,
11316                         tdata->algo,
11317                         RTE_CRYPTO_AEAD_OP_ENCRYPT,
11318                         key, tdata->key.len,
11319                         tdata->aad.len, tdata->auth_tag.len,
11320                         tdata->iv.len);
11321         if (retval < 0)
11322                 return retval;
11323
11324         ut_params->op->sym->m_src = ut_params->ibuf;
11325
11326         TEST_ASSERT_EQUAL(ut_params->op->sess_type,
11327                         RTE_CRYPTO_OP_SESSIONLESS,
11328                         "crypto op session type not sessionless");
11329
11330         /* Process crypto operation */
11331         TEST_ASSERT_NOT_NULL(process_crypto_request(ts_params->valid_devs[0],
11332                         ut_params->op), "failed to process sym crypto op");
11333
11334         TEST_ASSERT_NOT_NULL(ut_params->op, "failed crypto process");
11335
11336         TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
11337                         "crypto op status not success");
11338
11339         plaintext_pad_len = RTE_ALIGN_CEIL(tdata->plaintext.len, 16);
11340
11341         ciphertext = rte_pktmbuf_mtod_offset(ut_params->ibuf, uint8_t *,
11342                         ut_params->op->sym->cipher.data.offset);
11343         auth_tag = ciphertext + plaintext_pad_len;
11344
11345         debug_hexdump(stdout, "ciphertext:", ciphertext, tdata->ciphertext.len);
11346         debug_hexdump(stdout, "auth tag:", auth_tag, tdata->auth_tag.len);
11347
11348         /* Validate obuf */
11349         TEST_ASSERT_BUFFERS_ARE_EQUAL(
11350                         ciphertext,
11351                         tdata->ciphertext.data,
11352                         tdata->ciphertext.len,
11353                         "Ciphertext data not as expected");
11354
11355         TEST_ASSERT_BUFFERS_ARE_EQUAL(
11356                         auth_tag,
11357                         tdata->auth_tag.data,
11358                         tdata->auth_tag.len,
11359                         "Generated auth tag not as expected");
11360
11361         return 0;
11362
11363 }
11364
11365 static int
11366 test_AES_GCM_authenticated_encryption_sessionless_test_case_1(void)
11367 {
11368         return test_authenticated_encryption_sessionless(
11369                         &gcm_test_case_5);
11370 }
11371
11372 static int
11373 test_authenticated_decryption_sessionless(
11374                 const struct aead_test_data *tdata)
11375 {
11376         struct crypto_testsuite_params *ts_params = &testsuite_params;
11377         struct crypto_unittest_params *ut_params = &unittest_params;
11378
11379         int retval;
11380         uint8_t *plaintext;
11381         uint8_t key[tdata->key.len + 1];
11382         struct rte_cryptodev_info dev_info;
11383
11384         rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
11385         uint64_t feat_flags = dev_info.feature_flags;
11386
11387         if (!(feat_flags & RTE_CRYPTODEV_FF_SYM_SESSIONLESS)) {
11388                 printf("Device doesn't support Sessionless ops.\n");
11389                 return TEST_SKIPPED;
11390         }
11391
11392         if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
11393                         (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
11394                 printf("Device doesn't support RAW data-path APIs.\n");
11395                 return TEST_SKIPPED;
11396         }
11397
11398         /* not supported with CPU crypto */
11399         if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
11400                 return TEST_SKIPPED;
11401
11402         /* Verify the capabilities */
11403         struct rte_cryptodev_sym_capability_idx cap_idx;
11404         cap_idx.type = RTE_CRYPTO_SYM_XFORM_AEAD;
11405         cap_idx.algo.aead = tdata->algo;
11406         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
11407                         &cap_idx) == NULL)
11408                 return TEST_SKIPPED;
11409
11410         /* alloc mbuf and set payload */
11411         ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
11412
11413         memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
11414                         rte_pktmbuf_tailroom(ut_params->ibuf));
11415
11416         /* Create AEAD operation */
11417         retval = create_aead_operation(RTE_CRYPTO_AEAD_OP_DECRYPT, tdata);
11418         if (retval < 0)
11419                 return retval;
11420
11421         /* Create AEAD xform */
11422         memcpy(key, tdata->key.data, tdata->key.len);
11423         retval = create_aead_xform(ut_params->op,
11424                         tdata->algo,
11425                         RTE_CRYPTO_AEAD_OP_DECRYPT,
11426                         key, tdata->key.len,
11427                         tdata->aad.len, tdata->auth_tag.len,
11428                         tdata->iv.len);
11429         if (retval < 0)
11430                 return retval;
11431
11432         ut_params->op->sym->m_src = ut_params->ibuf;
11433
11434         TEST_ASSERT_EQUAL(ut_params->op->sess_type,
11435                         RTE_CRYPTO_OP_SESSIONLESS,
11436                         "crypto op session type not sessionless");
11437
11438         /* Process crypto operation */
11439         if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
11440                 process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
11441                                 ut_params->op, 0, 0, 0, 0);
11442         else
11443                 TEST_ASSERT_NOT_NULL(process_crypto_request(
11444                         ts_params->valid_devs[0], ut_params->op),
11445                                 "failed to process sym crypto op");
11446
11447         TEST_ASSERT_NOT_NULL(ut_params->op, "failed crypto process");
11448
11449         TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
11450                         "crypto op status not success");
11451
11452         plaintext = rte_pktmbuf_mtod_offset(ut_params->ibuf, uint8_t *,
11453                         ut_params->op->sym->cipher.data.offset);
11454
11455         debug_hexdump(stdout, "plaintext:", plaintext, tdata->ciphertext.len);
11456
11457         /* Validate obuf */
11458         TEST_ASSERT_BUFFERS_ARE_EQUAL(
11459                         plaintext,
11460                         tdata->plaintext.data,
11461                         tdata->plaintext.len,
11462                         "Plaintext data not as expected");
11463
11464         TEST_ASSERT_EQUAL(ut_params->op->status,
11465                         RTE_CRYPTO_OP_STATUS_SUCCESS,
11466                         "Authentication failed");
11467         return 0;
11468 }
11469
11470 static int
11471 test_AES_GCM_authenticated_decryption_sessionless_test_case_1(void)
11472 {
11473         return test_authenticated_decryption_sessionless(
11474                         &gcm_test_case_5);
11475 }
11476
11477 static int
11478 test_AES_CCM_authenticated_encryption_test_case_128_1(void)
11479 {
11480         return test_authenticated_encryption(&ccm_test_case_128_1);
11481 }
11482
11483 static int
11484 test_AES_CCM_authenticated_encryption_test_case_128_2(void)
11485 {
11486         return test_authenticated_encryption(&ccm_test_case_128_2);
11487 }
11488
11489 static int
11490 test_AES_CCM_authenticated_encryption_test_case_128_3(void)
11491 {
11492         return test_authenticated_encryption(&ccm_test_case_128_3);
11493 }
11494
11495 static int
11496 test_AES_CCM_authenticated_decryption_test_case_128_1(void)
11497 {
11498         return test_authenticated_decryption(&ccm_test_case_128_1);
11499 }
11500
11501 static int
11502 test_AES_CCM_authenticated_decryption_test_case_128_2(void)
11503 {
11504         return test_authenticated_decryption(&ccm_test_case_128_2);
11505 }
11506
11507 static int
11508 test_AES_CCM_authenticated_decryption_test_case_128_3(void)
11509 {
11510         return test_authenticated_decryption(&ccm_test_case_128_3);
11511 }
11512
11513 static int
11514 test_AES_CCM_authenticated_encryption_test_case_192_1(void)
11515 {
11516         return test_authenticated_encryption(&ccm_test_case_192_1);
11517 }
11518
11519 static int
11520 test_AES_CCM_authenticated_encryption_test_case_192_2(void)
11521 {
11522         return test_authenticated_encryption(&ccm_test_case_192_2);
11523 }
11524
11525 static int
11526 test_AES_CCM_authenticated_encryption_test_case_192_3(void)
11527 {
11528         return test_authenticated_encryption(&ccm_test_case_192_3);
11529 }
11530
11531 static int
11532 test_AES_CCM_authenticated_decryption_test_case_192_1(void)
11533 {
11534         return test_authenticated_decryption(&ccm_test_case_192_1);
11535 }
11536
11537 static int
11538 test_AES_CCM_authenticated_decryption_test_case_192_2(void)
11539 {
11540         return test_authenticated_decryption(&ccm_test_case_192_2);
11541 }
11542
11543 static int
11544 test_AES_CCM_authenticated_decryption_test_case_192_3(void)
11545 {
11546         return test_authenticated_decryption(&ccm_test_case_192_3);
11547 }
11548
11549 static int
11550 test_AES_CCM_authenticated_encryption_test_case_256_1(void)
11551 {
11552         return test_authenticated_encryption(&ccm_test_case_256_1);
11553 }
11554
11555 static int
11556 test_AES_CCM_authenticated_encryption_test_case_256_2(void)
11557 {
11558         return test_authenticated_encryption(&ccm_test_case_256_2);
11559 }
11560
11561 static int
11562 test_AES_CCM_authenticated_encryption_test_case_256_3(void)
11563 {
11564         return test_authenticated_encryption(&ccm_test_case_256_3);
11565 }
11566
11567 static int
11568 test_AES_CCM_authenticated_decryption_test_case_256_1(void)
11569 {
11570         return test_authenticated_decryption(&ccm_test_case_256_1);
11571 }
11572
11573 static int
11574 test_AES_CCM_authenticated_decryption_test_case_256_2(void)
11575 {
11576         return test_authenticated_decryption(&ccm_test_case_256_2);
11577 }
11578
11579 static int
11580 test_AES_CCM_authenticated_decryption_test_case_256_3(void)
11581 {
11582         return test_authenticated_decryption(&ccm_test_case_256_3);
11583 }
11584
11585 static int
11586 test_stats(void)
11587 {
11588         struct crypto_testsuite_params *ts_params = &testsuite_params;
11589         struct rte_cryptodev_stats stats;
11590
11591         if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
11592                 return TEST_SKIPPED;
11593
11594         /* Verify the capabilities */
11595         struct rte_cryptodev_sym_capability_idx cap_idx;
11596         cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
11597         cap_idx.algo.auth = RTE_CRYPTO_AUTH_SHA1_HMAC;
11598         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
11599                         &cap_idx) == NULL)
11600                 return TEST_SKIPPED;
11601         cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
11602         cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_AES_CBC;
11603         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
11604                         &cap_idx) == NULL)
11605                 return TEST_SKIPPED;
11606
11607         if (rte_cryptodev_stats_get(ts_params->valid_devs[0], &stats)
11608                         == -ENOTSUP)
11609                 return TEST_SKIPPED;
11610
11611         rte_cryptodev_stats_reset(ts_params->valid_devs[0]);
11612         TEST_ASSERT((rte_cryptodev_stats_get(ts_params->valid_devs[0] + 600,
11613                         &stats) == -ENODEV),
11614                 "rte_cryptodev_stats_get invalid dev failed");
11615         TEST_ASSERT((rte_cryptodev_stats_get(ts_params->valid_devs[0], 0) != 0),
11616                 "rte_cryptodev_stats_get invalid Param failed");
11617
11618         /* Test expected values */
11619         test_AES_CBC_HMAC_SHA1_encrypt_digest();
11620         TEST_ASSERT_SUCCESS(rte_cryptodev_stats_get(ts_params->valid_devs[0],
11621                         &stats),
11622                 "rte_cryptodev_stats_get failed");
11623         TEST_ASSERT((stats.enqueued_count == 1),
11624                 "rte_cryptodev_stats_get returned unexpected enqueued stat");
11625         TEST_ASSERT((stats.dequeued_count == 1),
11626                 "rte_cryptodev_stats_get returned unexpected enqueued stat");
11627         TEST_ASSERT((stats.enqueue_err_count == 0),
11628                 "rte_cryptodev_stats_get returned unexpected enqueued stat");
11629         TEST_ASSERT((stats.dequeue_err_count == 0),
11630                 "rte_cryptodev_stats_get returned unexpected enqueued stat");
11631
11632         /* invalid device but should ignore and not reset device stats*/
11633         rte_cryptodev_stats_reset(ts_params->valid_devs[0] + 300);
11634         TEST_ASSERT_SUCCESS(rte_cryptodev_stats_get(ts_params->valid_devs[0],
11635                         &stats),
11636                 "rte_cryptodev_stats_get failed");
11637         TEST_ASSERT((stats.enqueued_count == 1),
11638                 "rte_cryptodev_stats_get returned unexpected enqueued stat");
11639
11640         /* check that a valid reset clears stats */
11641         rte_cryptodev_stats_reset(ts_params->valid_devs[0]);
11642         TEST_ASSERT_SUCCESS(rte_cryptodev_stats_get(ts_params->valid_devs[0],
11643                         &stats),
11644                                           "rte_cryptodev_stats_get failed");
11645         TEST_ASSERT((stats.enqueued_count == 0),
11646                 "rte_cryptodev_stats_get returned unexpected enqueued stat");
11647         TEST_ASSERT((stats.dequeued_count == 0),
11648                 "rte_cryptodev_stats_get returned unexpected enqueued stat");
11649
11650         return TEST_SUCCESS;
11651 }
11652
11653 static int MD5_HMAC_create_session(struct crypto_testsuite_params *ts_params,
11654                                    struct crypto_unittest_params *ut_params,
11655                                    enum rte_crypto_auth_operation op,
11656                                    const struct HMAC_MD5_vector *test_case)
11657 {
11658         uint8_t key[64];
11659         int status;
11660
11661         memcpy(key, test_case->key.data, test_case->key.len);
11662
11663         ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;
11664         ut_params->auth_xform.next = NULL;
11665         ut_params->auth_xform.auth.op = op;
11666
11667         ut_params->auth_xform.auth.algo = RTE_CRYPTO_AUTH_MD5_HMAC;
11668
11669         ut_params->auth_xform.auth.digest_length = MD5_DIGEST_LEN;
11670         ut_params->auth_xform.auth.key.length = test_case->key.len;
11671         ut_params->auth_xform.auth.key.data = key;
11672
11673         ut_params->sess = rte_cryptodev_sym_session_create(
11674                         ts_params->session_mpool);
11675         TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed");
11676         if (ut_params->sess == NULL)
11677                 return TEST_FAILED;
11678
11679         status = rte_cryptodev_sym_session_init(ts_params->valid_devs[0],
11680                         ut_params->sess, &ut_params->auth_xform,
11681                         ts_params->session_priv_mpool);
11682         if (status == -ENOTSUP)
11683                 return TEST_SKIPPED;
11684
11685         ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
11686
11687         memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
11688                         rte_pktmbuf_tailroom(ut_params->ibuf));
11689
11690         return 0;
11691 }
11692
11693 static int MD5_HMAC_create_op(struct crypto_unittest_params *ut_params,
11694                               const struct HMAC_MD5_vector *test_case,
11695                               uint8_t **plaintext)
11696 {
11697         uint16_t plaintext_pad_len;
11698
11699         struct rte_crypto_sym_op *sym_op = ut_params->op->sym;
11700
11701         plaintext_pad_len = RTE_ALIGN_CEIL(test_case->plaintext.len,
11702                                 16);
11703
11704         *plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
11705                         plaintext_pad_len);
11706         memcpy(*plaintext, test_case->plaintext.data,
11707                         test_case->plaintext.len);
11708
11709         sym_op->auth.digest.data = (uint8_t *)rte_pktmbuf_append(
11710                         ut_params->ibuf, MD5_DIGEST_LEN);
11711         TEST_ASSERT_NOT_NULL(sym_op->auth.digest.data,
11712                         "no room to append digest");
11713         sym_op->auth.digest.phys_addr = rte_pktmbuf_iova_offset(
11714                         ut_params->ibuf, plaintext_pad_len);
11715
11716         if (ut_params->auth_xform.auth.op == RTE_CRYPTO_AUTH_OP_VERIFY) {
11717                 rte_memcpy(sym_op->auth.digest.data, test_case->auth_tag.data,
11718                            test_case->auth_tag.len);
11719         }
11720
11721         sym_op->auth.data.offset = 0;
11722         sym_op->auth.data.length = test_case->plaintext.len;
11723
11724         rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
11725         ut_params->op->sym->m_src = ut_params->ibuf;
11726
11727         return 0;
11728 }
11729
11730 static int
11731 test_MD5_HMAC_generate(const struct HMAC_MD5_vector *test_case)
11732 {
11733         uint16_t plaintext_pad_len;
11734         uint8_t *plaintext, *auth_tag;
11735
11736         struct crypto_testsuite_params *ts_params = &testsuite_params;
11737         struct crypto_unittest_params *ut_params = &unittest_params;
11738         struct rte_cryptodev_info dev_info;
11739
11740         rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
11741         uint64_t feat_flags = dev_info.feature_flags;
11742
11743         if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
11744                         (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
11745                 printf("Device doesn't support RAW data-path APIs.\n");
11746                 return TEST_SKIPPED;
11747         }
11748
11749         /* Verify the capabilities */
11750         struct rte_cryptodev_sym_capability_idx cap_idx;
11751         cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
11752         cap_idx.algo.auth = RTE_CRYPTO_AUTH_MD5_HMAC;
11753         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
11754                         &cap_idx) == NULL)
11755                 return TEST_SKIPPED;
11756
11757         if (MD5_HMAC_create_session(ts_params, ut_params,
11758                         RTE_CRYPTO_AUTH_OP_GENERATE, test_case))
11759                 return TEST_FAILED;
11760
11761         /* Generate Crypto op data structure */
11762         ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
11763                         RTE_CRYPTO_OP_TYPE_SYMMETRIC);
11764         TEST_ASSERT_NOT_NULL(ut_params->op,
11765                         "Failed to allocate symmetric crypto operation struct");
11766
11767         plaintext_pad_len = RTE_ALIGN_CEIL(test_case->plaintext.len,
11768                                 16);
11769
11770         if (MD5_HMAC_create_op(ut_params, test_case, &plaintext))
11771                 return TEST_FAILED;
11772
11773         if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
11774                 process_cpu_crypt_auth_op(ts_params->valid_devs[0],
11775                         ut_params->op);
11776         else if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
11777                 process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
11778                                 ut_params->op, 0, 1, 0, 0);
11779         else
11780                 TEST_ASSERT_NOT_NULL(
11781                         process_crypto_request(ts_params->valid_devs[0],
11782                                 ut_params->op),
11783                                 "failed to process sym crypto op");
11784
11785         TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
11786                         "crypto op processing failed");
11787
11788         if (ut_params->op->sym->m_dst) {
11789                 auth_tag = rte_pktmbuf_mtod_offset(ut_params->op->sym->m_dst,
11790                                 uint8_t *, plaintext_pad_len);
11791         } else {
11792                 auth_tag = plaintext + plaintext_pad_len;
11793         }
11794
11795         TEST_ASSERT_BUFFERS_ARE_EQUAL(
11796                         auth_tag,
11797                         test_case->auth_tag.data,
11798                         test_case->auth_tag.len,
11799                         "HMAC_MD5 generated tag not as expected");
11800
11801         return TEST_SUCCESS;
11802 }
11803
11804 static int
11805 test_MD5_HMAC_verify(const struct HMAC_MD5_vector *test_case)
11806 {
11807         uint8_t *plaintext;
11808
11809         struct crypto_testsuite_params *ts_params = &testsuite_params;
11810         struct crypto_unittest_params *ut_params = &unittest_params;
11811         struct rte_cryptodev_info dev_info;
11812
11813         rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
11814         uint64_t feat_flags = dev_info.feature_flags;
11815
11816         if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
11817                         (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
11818                 printf("Device doesn't support RAW data-path APIs.\n");
11819                 return TEST_SKIPPED;
11820         }
11821
11822         /* Verify the capabilities */
11823         struct rte_cryptodev_sym_capability_idx cap_idx;
11824         cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
11825         cap_idx.algo.auth = RTE_CRYPTO_AUTH_MD5_HMAC;
11826         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
11827                         &cap_idx) == NULL)
11828                 return TEST_SKIPPED;
11829
11830         if (MD5_HMAC_create_session(ts_params, ut_params,
11831                         RTE_CRYPTO_AUTH_OP_VERIFY, test_case)) {
11832                 return TEST_FAILED;
11833         }
11834
11835         /* Generate Crypto op data structure */
11836         ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
11837                         RTE_CRYPTO_OP_TYPE_SYMMETRIC);
11838         TEST_ASSERT_NOT_NULL(ut_params->op,
11839                         "Failed to allocate symmetric crypto operation struct");
11840
11841         if (MD5_HMAC_create_op(ut_params, test_case, &plaintext))
11842                 return TEST_FAILED;
11843
11844         if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
11845                 process_cpu_crypt_auth_op(ts_params->valid_devs[0],
11846                         ut_params->op);
11847         else if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
11848                 process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
11849                                 ut_params->op, 0, 1, 0, 0);
11850         else
11851                 TEST_ASSERT_NOT_NULL(
11852                         process_crypto_request(ts_params->valid_devs[0],
11853                                 ut_params->op),
11854                                 "failed to process sym crypto op");
11855
11856         TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
11857                         "HMAC_MD5 crypto op processing failed");
11858
11859         return TEST_SUCCESS;
11860 }
11861
11862 static int
11863 test_MD5_HMAC_generate_case_1(void)
11864 {
11865         return test_MD5_HMAC_generate(&HMAC_MD5_test_case_1);
11866 }
11867
11868 static int
11869 test_MD5_HMAC_verify_case_1(void)
11870 {
11871         return test_MD5_HMAC_verify(&HMAC_MD5_test_case_1);
11872 }
11873
11874 static int
11875 test_MD5_HMAC_generate_case_2(void)
11876 {
11877         return test_MD5_HMAC_generate(&HMAC_MD5_test_case_2);
11878 }
11879
11880 static int
11881 test_MD5_HMAC_verify_case_2(void)
11882 {
11883         return test_MD5_HMAC_verify(&HMAC_MD5_test_case_2);
11884 }
11885
11886 static int
11887 test_multi_session(void)
11888 {
11889         struct crypto_testsuite_params *ts_params = &testsuite_params;
11890         struct crypto_unittest_params *ut_params = &unittest_params;
11891
11892         struct rte_cryptodev_info dev_info;
11893         struct rte_cryptodev_sym_session **sessions;
11894
11895         uint16_t i;
11896         int status;
11897
11898         /* Verify the capabilities */
11899         struct rte_cryptodev_sym_capability_idx cap_idx;
11900         cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
11901         cap_idx.algo.auth = RTE_CRYPTO_AUTH_SHA512_HMAC;
11902         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
11903                         &cap_idx) == NULL)
11904                 return TEST_SKIPPED;
11905         cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
11906         cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_AES_CBC;
11907         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
11908                         &cap_idx) == NULL)
11909                 return TEST_SKIPPED;
11910
11911         test_AES_CBC_HMAC_SHA512_decrypt_create_session_params(ut_params,
11912                         aes_cbc_key, hmac_sha512_key);
11913
11914
11915         rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
11916
11917         sessions = rte_malloc(NULL,
11918                         sizeof(struct rte_cryptodev_sym_session *) *
11919                         (MAX_NB_SESSIONS + 1), 0);
11920
11921         /* Create multiple crypto sessions*/
11922         for (i = 0; i < MAX_NB_SESSIONS; i++) {
11923
11924                 sessions[i] = rte_cryptodev_sym_session_create(
11925                                 ts_params->session_mpool);
11926                 TEST_ASSERT_NOT_NULL(sessions[i],
11927                                 "Session creation failed at session number %u",
11928                                 i);
11929
11930                 status = rte_cryptodev_sym_session_init(
11931                                 ts_params->valid_devs[0],
11932                                 sessions[i], &ut_params->auth_xform,
11933                                 ts_params->session_priv_mpool);
11934                 if (status == -ENOTSUP)
11935                         return TEST_SKIPPED;
11936
11937                 /* Attempt to send a request on each session */
11938                 TEST_ASSERT_SUCCESS( test_AES_CBC_HMAC_SHA512_decrypt_perform(
11939                         sessions[i],
11940                         ut_params,
11941                         ts_params,
11942                         catch_22_quote_2_512_bytes_AES_CBC_ciphertext,
11943                         catch_22_quote_2_512_bytes_AES_CBC_HMAC_SHA512_digest,
11944                         aes_cbc_iv),
11945                         "Failed to perform decrypt on request number %u.", i);
11946                 /* free crypto operation structure */
11947                 if (ut_params->op)
11948                         rte_crypto_op_free(ut_params->op);
11949
11950                 /*
11951                  * free mbuf - both obuf and ibuf are usually the same,
11952                  * so check if they point at the same address is necessary,
11953                  * to avoid freeing the mbuf twice.
11954                  */
11955                 if (ut_params->obuf) {
11956                         rte_pktmbuf_free(ut_params->obuf);
11957                         if (ut_params->ibuf == ut_params->obuf)
11958                                 ut_params->ibuf = 0;
11959                         ut_params->obuf = 0;
11960                 }
11961                 if (ut_params->ibuf) {
11962                         rte_pktmbuf_free(ut_params->ibuf);
11963                         ut_params->ibuf = 0;
11964                 }
11965         }
11966
11967         sessions[i] = NULL;
11968         /* Next session create should fail */
11969         rte_cryptodev_sym_session_init(ts_params->valid_devs[0],
11970                         sessions[i], &ut_params->auth_xform,
11971                         ts_params->session_priv_mpool);
11972         TEST_ASSERT_NULL(sessions[i],
11973                         "Session creation succeeded unexpectedly!");
11974
11975         for (i = 0; i < MAX_NB_SESSIONS; i++) {
11976                 rte_cryptodev_sym_session_clear(ts_params->valid_devs[0],
11977                                 sessions[i]);
11978                 rte_cryptodev_sym_session_free(sessions[i]);
11979         }
11980
11981         rte_free(sessions);
11982
11983         return TEST_SUCCESS;
11984 }
11985
11986 struct multi_session_params {
11987         struct crypto_unittest_params ut_params;
11988         uint8_t *cipher_key;
11989         uint8_t *hmac_key;
11990         const uint8_t *cipher;
11991         const uint8_t *digest;
11992         uint8_t *iv;
11993 };
11994
11995 #define MB_SESSION_NUMBER 3
11996
11997 static int
11998 test_multi_session_random_usage(void)
11999 {
12000         struct crypto_testsuite_params *ts_params = &testsuite_params;
12001         struct rte_cryptodev_info dev_info;
12002         struct rte_cryptodev_sym_session **sessions;
12003         uint32_t i, j;
12004         struct multi_session_params ut_paramz[] = {
12005
12006                 {
12007                         .cipher_key = ms_aes_cbc_key0,
12008                         .hmac_key = ms_hmac_key0,
12009                         .cipher = ms_aes_cbc_cipher0,
12010                         .digest = ms_hmac_digest0,
12011                         .iv = ms_aes_cbc_iv0
12012                 },
12013                 {
12014                         .cipher_key = ms_aes_cbc_key1,
12015                         .hmac_key = ms_hmac_key1,
12016                         .cipher = ms_aes_cbc_cipher1,
12017                         .digest = ms_hmac_digest1,
12018                         .iv = ms_aes_cbc_iv1
12019                 },
12020                 {
12021                         .cipher_key = ms_aes_cbc_key2,
12022                         .hmac_key = ms_hmac_key2,
12023                         .cipher = ms_aes_cbc_cipher2,
12024                         .digest = ms_hmac_digest2,
12025                         .iv = ms_aes_cbc_iv2
12026                 },
12027
12028         };
12029         int status;
12030
12031         /* Verify the capabilities */
12032         struct rte_cryptodev_sym_capability_idx cap_idx;
12033         cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
12034         cap_idx.algo.auth = RTE_CRYPTO_AUTH_SHA512_HMAC;
12035         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
12036                         &cap_idx) == NULL)
12037                 return TEST_SKIPPED;
12038         cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
12039         cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_AES_CBC;
12040         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
12041                         &cap_idx) == NULL)
12042                 return TEST_SKIPPED;
12043
12044         rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
12045
12046         sessions = rte_malloc(NULL,
12047                         (sizeof(struct rte_cryptodev_sym_session *)
12048                                         * MAX_NB_SESSIONS) + 1, 0);
12049
12050         for (i = 0; i < MB_SESSION_NUMBER; i++) {
12051                 sessions[i] = rte_cryptodev_sym_session_create(
12052                                 ts_params->session_mpool);
12053                 TEST_ASSERT_NOT_NULL(sessions[i],
12054                                 "Session creation failed at session number %u",
12055                                 i);
12056
12057                 rte_memcpy(&ut_paramz[i].ut_params, &unittest_params,
12058                                 sizeof(struct crypto_unittest_params));
12059
12060                 test_AES_CBC_HMAC_SHA512_decrypt_create_session_params(
12061                                 &ut_paramz[i].ut_params,
12062                                 ut_paramz[i].cipher_key, ut_paramz[i].hmac_key);
12063
12064                 /* Create multiple crypto sessions*/
12065                 status = rte_cryptodev_sym_session_init(
12066                                 ts_params->valid_devs[0],
12067                                 sessions[i],
12068                                 &ut_paramz[i].ut_params.auth_xform,
12069                                 ts_params->session_priv_mpool);
12070
12071                 if (status == -ENOTSUP)
12072                         return TEST_SKIPPED;
12073
12074                 TEST_ASSERT_EQUAL(status, 0, "Session init failed");
12075         }
12076
12077         srand(time(NULL));
12078         for (i = 0; i < 40000; i++) {
12079
12080                 j = rand() % MB_SESSION_NUMBER;
12081
12082                 TEST_ASSERT_SUCCESS(
12083                         test_AES_CBC_HMAC_SHA512_decrypt_perform(
12084                                         sessions[j],
12085                                         &ut_paramz[j].ut_params,
12086                                         ts_params, ut_paramz[j].cipher,
12087                                         ut_paramz[j].digest,
12088                                         ut_paramz[j].iv),
12089                         "Failed to perform decrypt on request number %u.", i);
12090
12091                 if (ut_paramz[j].ut_params.op)
12092                         rte_crypto_op_free(ut_paramz[j].ut_params.op);
12093
12094                 /*
12095                  * free mbuf - both obuf and ibuf are usually the same,
12096                  * so check if they point at the same address is necessary,
12097                  * to avoid freeing the mbuf twice.
12098                  */
12099                 if (ut_paramz[j].ut_params.obuf) {
12100                         rte_pktmbuf_free(ut_paramz[j].ut_params.obuf);
12101                         if (ut_paramz[j].ut_params.ibuf
12102                                         == ut_paramz[j].ut_params.obuf)
12103                                 ut_paramz[j].ut_params.ibuf = 0;
12104                         ut_paramz[j].ut_params.obuf = 0;
12105                 }
12106                 if (ut_paramz[j].ut_params.ibuf) {
12107                         rte_pktmbuf_free(ut_paramz[j].ut_params.ibuf);
12108                         ut_paramz[j].ut_params.ibuf = 0;
12109                 }
12110         }
12111
12112         for (i = 0; i < MB_SESSION_NUMBER; i++) {
12113                 rte_cryptodev_sym_session_clear(ts_params->valid_devs[0],
12114                                 sessions[i]);
12115                 rte_cryptodev_sym_session_free(sessions[i]);
12116         }
12117
12118         rte_free(sessions);
12119
12120         return TEST_SUCCESS;
12121 }
12122
12123 uint8_t orig_data[] = {0xab, 0xab, 0xab, 0xab,
12124                         0xab, 0xab, 0xab, 0xab,
12125                         0xab, 0xab, 0xab, 0xab,
12126                         0xab, 0xab, 0xab, 0xab};
12127
12128 static int
12129 test_null_invalid_operation(void)
12130 {
12131         struct crypto_testsuite_params *ts_params = &testsuite_params;
12132         struct crypto_unittest_params *ut_params = &unittest_params;
12133         int ret;
12134
12135         /* This test is for NULL PMD only */
12136         if (gbl_driver_id != rte_cryptodev_driver_id_get(
12137                         RTE_STR(CRYPTODEV_NAME_NULL_PMD)))
12138                 return TEST_SKIPPED;
12139
12140         /* Setup Cipher Parameters */
12141         ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
12142         ut_params->cipher_xform.next = NULL;
12143
12144         ut_params->cipher_xform.cipher.algo = RTE_CRYPTO_CIPHER_AES_CBC;
12145         ut_params->cipher_xform.cipher.op = RTE_CRYPTO_CIPHER_OP_ENCRYPT;
12146
12147         ut_params->sess = rte_cryptodev_sym_session_create(
12148                         ts_params->session_mpool);
12149
12150         /* Create Crypto session*/
12151         ret = rte_cryptodev_sym_session_init(ts_params->valid_devs[0],
12152                         ut_params->sess, &ut_params->cipher_xform,
12153                         ts_params->session_priv_mpool);
12154         TEST_ASSERT(ret < 0,
12155                         "Session creation succeeded unexpectedly");
12156
12157
12158         /* Setup HMAC Parameters */
12159         ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;
12160         ut_params->auth_xform.next = NULL;
12161
12162         ut_params->auth_xform.auth.algo = RTE_CRYPTO_AUTH_SHA1_HMAC;
12163         ut_params->auth_xform.auth.op = RTE_CRYPTO_AUTH_OP_GENERATE;
12164
12165         ut_params->sess = rte_cryptodev_sym_session_create(
12166                         ts_params->session_mpool);
12167
12168         /* Create Crypto session*/
12169         ret = rte_cryptodev_sym_session_init(ts_params->valid_devs[0],
12170                         ut_params->sess, &ut_params->auth_xform,
12171                         ts_params->session_priv_mpool);
12172         TEST_ASSERT(ret < 0,
12173                         "Session creation succeeded unexpectedly");
12174
12175         return TEST_SUCCESS;
12176 }
12177
12178
12179 #define NULL_BURST_LENGTH (32)
12180
12181 static int
12182 test_null_burst_operation(void)
12183 {
12184         struct crypto_testsuite_params *ts_params = &testsuite_params;
12185         struct crypto_unittest_params *ut_params = &unittest_params;
12186         int status;
12187
12188         unsigned i, burst_len = NULL_BURST_LENGTH;
12189
12190         struct rte_crypto_op *burst[NULL_BURST_LENGTH] = { NULL };
12191         struct rte_crypto_op *burst_dequeued[NULL_BURST_LENGTH] = { NULL };
12192
12193         /* This test is for NULL PMD only */
12194         if (gbl_driver_id != rte_cryptodev_driver_id_get(
12195                         RTE_STR(CRYPTODEV_NAME_NULL_PMD)))
12196                 return TEST_SKIPPED;
12197
12198         /* Setup Cipher Parameters */
12199         ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
12200         ut_params->cipher_xform.next = &ut_params->auth_xform;
12201
12202         ut_params->cipher_xform.cipher.algo = RTE_CRYPTO_CIPHER_NULL;
12203         ut_params->cipher_xform.cipher.op = RTE_CRYPTO_CIPHER_OP_ENCRYPT;
12204
12205         /* Setup HMAC Parameters */
12206         ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;
12207         ut_params->auth_xform.next = NULL;
12208
12209         ut_params->auth_xform.auth.algo = RTE_CRYPTO_AUTH_NULL;
12210         ut_params->auth_xform.auth.op = RTE_CRYPTO_AUTH_OP_GENERATE;
12211
12212         ut_params->sess = rte_cryptodev_sym_session_create(
12213                         ts_params->session_mpool);
12214         TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed");
12215
12216         /* Create Crypto session*/
12217         status = rte_cryptodev_sym_session_init(ts_params->valid_devs[0],
12218                         ut_params->sess, &ut_params->cipher_xform,
12219                         ts_params->session_priv_mpool);
12220
12221         if (status == -ENOTSUP)
12222                 return TEST_SKIPPED;
12223
12224         TEST_ASSERT_EQUAL(status, 0, "Session init failed");
12225
12226         TEST_ASSERT_EQUAL(rte_crypto_op_bulk_alloc(ts_params->op_mpool,
12227                         RTE_CRYPTO_OP_TYPE_SYMMETRIC, burst, burst_len),
12228                         burst_len, "failed to generate burst of crypto ops");
12229
12230         /* Generate an operation for each mbuf in burst */
12231         for (i = 0; i < burst_len; i++) {
12232                 struct rte_mbuf *m = rte_pktmbuf_alloc(ts_params->mbuf_pool);
12233
12234                 TEST_ASSERT_NOT_NULL(m, "Failed to allocate mbuf");
12235
12236                 unsigned *data = (unsigned *)rte_pktmbuf_append(m,
12237                                 sizeof(unsigned));
12238                 *data = i;
12239
12240                 rte_crypto_op_attach_sym_session(burst[i], ut_params->sess);
12241
12242                 burst[i]->sym->m_src = m;
12243         }
12244
12245         /* Process crypto operation */
12246         TEST_ASSERT_EQUAL(rte_cryptodev_enqueue_burst(ts_params->valid_devs[0],
12247                         0, burst, burst_len),
12248                         burst_len,
12249                         "Error enqueuing burst");
12250
12251         TEST_ASSERT_EQUAL(rte_cryptodev_dequeue_burst(ts_params->valid_devs[0],
12252                         0, burst_dequeued, burst_len),
12253                         burst_len,
12254                         "Error dequeuing burst");
12255
12256
12257         for (i = 0; i < burst_len; i++) {
12258                 TEST_ASSERT_EQUAL(
12259                         *rte_pktmbuf_mtod(burst[i]->sym->m_src, uint32_t *),
12260                         *rte_pktmbuf_mtod(burst_dequeued[i]->sym->m_src,
12261                                         uint32_t *),
12262                         "data not as expected");
12263
12264                 rte_pktmbuf_free(burst[i]->sym->m_src);
12265                 rte_crypto_op_free(burst[i]);
12266         }
12267
12268         return TEST_SUCCESS;
12269 }
12270
12271 static uint16_t
12272 test_enq_callback(uint16_t dev_id, uint16_t qp_id, struct rte_crypto_op **ops,
12273                   uint16_t nb_ops, void *user_param)
12274 {
12275         RTE_SET_USED(dev_id);
12276         RTE_SET_USED(qp_id);
12277         RTE_SET_USED(ops);
12278         RTE_SET_USED(user_param);
12279
12280         printf("crypto enqueue callback called\n");
12281         return nb_ops;
12282 }
12283
12284 static uint16_t
12285 test_deq_callback(uint16_t dev_id, uint16_t qp_id, struct rte_crypto_op **ops,
12286                   uint16_t nb_ops, void *user_param)
12287 {
12288         RTE_SET_USED(dev_id);
12289         RTE_SET_USED(qp_id);
12290         RTE_SET_USED(ops);
12291         RTE_SET_USED(user_param);
12292
12293         printf("crypto dequeue callback called\n");
12294         return nb_ops;
12295 }
12296
12297 /*
12298  * Thread using enqueue/dequeue callback with RCU.
12299  */
12300 static int
12301 test_enqdeq_callback_thread(void *arg)
12302 {
12303         RTE_SET_USED(arg);
12304         /* DP thread calls rte_cryptodev_enqueue_burst()/
12305          * rte_cryptodev_dequeue_burst() and invokes callback.
12306          */
12307         test_null_burst_operation();
12308         return 0;
12309 }
12310
12311 static int
12312 test_enq_callback_setup(void)
12313 {
12314         struct crypto_testsuite_params *ts_params = &testsuite_params;
12315         struct rte_cryptodev_info dev_info;
12316         struct rte_cryptodev_qp_conf qp_conf = {
12317                 .nb_descriptors = MAX_NUM_OPS_INFLIGHT
12318         };
12319
12320         struct rte_cryptodev_cb *cb;
12321         uint16_t qp_id = 0;
12322
12323         /* Stop the device in case it's started so it can be configured */
12324         rte_cryptodev_stop(ts_params->valid_devs[0]);
12325
12326         rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
12327
12328         TEST_ASSERT_SUCCESS(rte_cryptodev_configure(ts_params->valid_devs[0],
12329                         &ts_params->conf),
12330                         "Failed to configure cryptodev %u",
12331                         ts_params->valid_devs[0]);
12332
12333         qp_conf.nb_descriptors = MAX_NUM_OPS_INFLIGHT;
12334         qp_conf.mp_session = ts_params->session_mpool;
12335         qp_conf.mp_session_private = ts_params->session_priv_mpool;
12336
12337         TEST_ASSERT_SUCCESS(rte_cryptodev_queue_pair_setup(
12338                         ts_params->valid_devs[0], qp_id, &qp_conf,
12339                         rte_cryptodev_socket_id(ts_params->valid_devs[0])),
12340                         "Failed test for "
12341                         "rte_cryptodev_queue_pair_setup: num_inflights "
12342                         "%u on qp %u on cryptodev %u",
12343                         qp_conf.nb_descriptors, qp_id,
12344                         ts_params->valid_devs[0]);
12345
12346         /* Test with invalid crypto device */
12347         cb = rte_cryptodev_add_enq_callback(RTE_CRYPTO_MAX_DEVS,
12348                         qp_id, test_enq_callback, NULL);
12349         TEST_ASSERT_NULL(cb, "Add callback on qp %u on "
12350                         "cryptodev %u did not fail",
12351                         qp_id, RTE_CRYPTO_MAX_DEVS);
12352
12353         /* Test with invalid queue pair */
12354         cb = rte_cryptodev_add_enq_callback(ts_params->valid_devs[0],
12355                         dev_info.max_nb_queue_pairs + 1,
12356                         test_enq_callback, NULL);
12357         TEST_ASSERT_NULL(cb, "Add callback on qp %u on "
12358                         "cryptodev %u did not fail",
12359                         dev_info.max_nb_queue_pairs + 1,
12360                         ts_params->valid_devs[0]);
12361
12362         /* Test with NULL callback */
12363         cb = rte_cryptodev_add_enq_callback(ts_params->valid_devs[0],
12364                         qp_id, NULL, NULL);
12365         TEST_ASSERT_NULL(cb, "Add callback on qp %u on "
12366                         "cryptodev %u did not fail",
12367                         qp_id, ts_params->valid_devs[0]);
12368
12369         /* Test with valid configuration */
12370         cb = rte_cryptodev_add_enq_callback(ts_params->valid_devs[0],
12371                         qp_id, test_enq_callback, NULL);
12372         TEST_ASSERT_NOT_NULL(cb, "Failed test to add callback on "
12373                         "qp %u on cryptodev %u",
12374                         qp_id, ts_params->valid_devs[0]);
12375
12376         rte_cryptodev_start(ts_params->valid_devs[0]);
12377
12378         /* Launch a thread */
12379         rte_eal_remote_launch(test_enqdeq_callback_thread, NULL,
12380                                 rte_get_next_lcore(-1, 1, 0));
12381
12382         /* Wait until reader exited. */
12383         rte_eal_mp_wait_lcore();
12384
12385         /* Test with invalid crypto device */
12386         TEST_ASSERT_FAIL(rte_cryptodev_remove_enq_callback(
12387                         RTE_CRYPTO_MAX_DEVS, qp_id, cb),
12388                         "Expected call to fail as crypto device is invalid");
12389
12390         /* Test with invalid queue pair */
12391         TEST_ASSERT_FAIL(rte_cryptodev_remove_enq_callback(
12392                         ts_params->valid_devs[0],
12393                         dev_info.max_nb_queue_pairs + 1, cb),
12394                         "Expected call to fail as queue pair is invalid");
12395
12396         /* Test with NULL callback */
12397         TEST_ASSERT_FAIL(rte_cryptodev_remove_enq_callback(
12398                         ts_params->valid_devs[0], qp_id, NULL),
12399                         "Expected call to fail as callback is NULL");
12400
12401         /* Test with valid configuration */
12402         TEST_ASSERT_SUCCESS(rte_cryptodev_remove_enq_callback(
12403                         ts_params->valid_devs[0], qp_id, cb),
12404                         "Failed test to remove callback on "
12405                         "qp %u on cryptodev %u",
12406                         qp_id, ts_params->valid_devs[0]);
12407
12408         return TEST_SUCCESS;
12409 }
12410
12411 static int
12412 test_deq_callback_setup(void)
12413 {
12414         struct crypto_testsuite_params *ts_params = &testsuite_params;
12415         struct rte_cryptodev_info dev_info;
12416         struct rte_cryptodev_qp_conf qp_conf = {
12417                 .nb_descriptors = MAX_NUM_OPS_INFLIGHT
12418         };
12419
12420         struct rte_cryptodev_cb *cb;
12421         uint16_t qp_id = 0;
12422
12423         /* Stop the device in case it's started so it can be configured */
12424         rte_cryptodev_stop(ts_params->valid_devs[0]);
12425
12426         rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
12427
12428         TEST_ASSERT_SUCCESS(rte_cryptodev_configure(ts_params->valid_devs[0],
12429                         &ts_params->conf),
12430                         "Failed to configure cryptodev %u",
12431                         ts_params->valid_devs[0]);
12432
12433         qp_conf.nb_descriptors = MAX_NUM_OPS_INFLIGHT;
12434         qp_conf.mp_session = ts_params->session_mpool;
12435         qp_conf.mp_session_private = ts_params->session_priv_mpool;
12436
12437         TEST_ASSERT_SUCCESS(rte_cryptodev_queue_pair_setup(
12438                         ts_params->valid_devs[0], qp_id, &qp_conf,
12439                         rte_cryptodev_socket_id(ts_params->valid_devs[0])),
12440                         "Failed test for "
12441                         "rte_cryptodev_queue_pair_setup: num_inflights "
12442                         "%u on qp %u on cryptodev %u",
12443                         qp_conf.nb_descriptors, qp_id,
12444                         ts_params->valid_devs[0]);
12445
12446         /* Test with invalid crypto device */
12447         cb = rte_cryptodev_add_deq_callback(RTE_CRYPTO_MAX_DEVS,
12448                         qp_id, test_deq_callback, NULL);
12449         TEST_ASSERT_NULL(cb, "Add callback on qp %u on "
12450                         "cryptodev %u did not fail",
12451                         qp_id, RTE_CRYPTO_MAX_DEVS);
12452
12453         /* Test with invalid queue pair */
12454         cb = rte_cryptodev_add_deq_callback(ts_params->valid_devs[0],
12455                         dev_info.max_nb_queue_pairs + 1,
12456                         test_deq_callback, NULL);
12457         TEST_ASSERT_NULL(cb, "Add callback on qp %u on "
12458                         "cryptodev %u did not fail",
12459                         dev_info.max_nb_queue_pairs + 1,
12460                         ts_params->valid_devs[0]);
12461
12462         /* Test with NULL callback */
12463         cb = rte_cryptodev_add_deq_callback(ts_params->valid_devs[0],
12464                         qp_id, NULL, NULL);
12465         TEST_ASSERT_NULL(cb, "Add callback on qp %u on "
12466                         "cryptodev %u did not fail",
12467                         qp_id, ts_params->valid_devs[0]);
12468
12469         /* Test with valid configuration */
12470         cb = rte_cryptodev_add_deq_callback(ts_params->valid_devs[0],
12471                         qp_id, test_deq_callback, NULL);
12472         TEST_ASSERT_NOT_NULL(cb, "Failed test to add callback on "
12473                         "qp %u on cryptodev %u",
12474                         qp_id, ts_params->valid_devs[0]);
12475
12476         rte_cryptodev_start(ts_params->valid_devs[0]);
12477
12478         /* Launch a thread */
12479         rte_eal_remote_launch(test_enqdeq_callback_thread, NULL,
12480                                 rte_get_next_lcore(-1, 1, 0));
12481
12482         /* Wait until reader exited. */
12483         rte_eal_mp_wait_lcore();
12484
12485         /* Test with invalid crypto device */
12486         TEST_ASSERT_FAIL(rte_cryptodev_remove_deq_callback(
12487                         RTE_CRYPTO_MAX_DEVS, qp_id, cb),
12488                         "Expected call to fail as crypto device is invalid");
12489
12490         /* Test with invalid queue pair */
12491         TEST_ASSERT_FAIL(rte_cryptodev_remove_deq_callback(
12492                         ts_params->valid_devs[0],
12493                         dev_info.max_nb_queue_pairs + 1, cb),
12494                         "Expected call to fail as queue pair is invalid");
12495
12496         /* Test with NULL callback */
12497         TEST_ASSERT_FAIL(rte_cryptodev_remove_deq_callback(
12498                         ts_params->valid_devs[0], qp_id, NULL),
12499                         "Expected call to fail as callback is NULL");
12500
12501         /* Test with valid configuration */
12502         TEST_ASSERT_SUCCESS(rte_cryptodev_remove_deq_callback(
12503                         ts_params->valid_devs[0], qp_id, cb),
12504                         "Failed test to remove callback on "
12505                         "qp %u on cryptodev %u",
12506                         qp_id, ts_params->valid_devs[0]);
12507
12508         return TEST_SUCCESS;
12509 }
12510
12511 static void
12512 generate_gmac_large_plaintext(uint8_t *data)
12513 {
12514         uint16_t i;
12515
12516         for (i = 32; i < GMAC_LARGE_PLAINTEXT_LENGTH; i += 32)
12517                 memcpy(&data[i], &data[0], 32);
12518 }
12519
12520 static int
12521 create_gmac_operation(enum rte_crypto_auth_operation op,
12522                 const struct gmac_test_data *tdata)
12523 {
12524         struct crypto_testsuite_params *ts_params = &testsuite_params;
12525         struct crypto_unittest_params *ut_params = &unittest_params;
12526         struct rte_crypto_sym_op *sym_op;
12527
12528         uint32_t plaintext_pad_len = RTE_ALIGN_CEIL(tdata->plaintext.len, 16);
12529
12530         /* Generate Crypto op data structure */
12531         ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
12532                         RTE_CRYPTO_OP_TYPE_SYMMETRIC);
12533         TEST_ASSERT_NOT_NULL(ut_params->op,
12534                         "Failed to allocate symmetric crypto operation struct");
12535
12536         sym_op = ut_params->op->sym;
12537
12538         sym_op->auth.digest.data = (uint8_t *)rte_pktmbuf_append(
12539                         ut_params->ibuf, tdata->gmac_tag.len);
12540         TEST_ASSERT_NOT_NULL(sym_op->auth.digest.data,
12541                         "no room to append digest");
12542
12543         sym_op->auth.digest.phys_addr = rte_pktmbuf_iova_offset(
12544                         ut_params->ibuf, plaintext_pad_len);
12545
12546         if (op == RTE_CRYPTO_AUTH_OP_VERIFY) {
12547                 rte_memcpy(sym_op->auth.digest.data, tdata->gmac_tag.data,
12548                                 tdata->gmac_tag.len);
12549                 debug_hexdump(stdout, "digest:",
12550                                 sym_op->auth.digest.data,
12551                                 tdata->gmac_tag.len);
12552         }
12553
12554         uint8_t *iv_ptr = rte_crypto_op_ctod_offset(ut_params->op,
12555                         uint8_t *, IV_OFFSET);
12556
12557         rte_memcpy(iv_ptr, tdata->iv.data, tdata->iv.len);
12558
12559         debug_hexdump(stdout, "iv:", iv_ptr, tdata->iv.len);
12560
12561         sym_op->cipher.data.length = 0;
12562         sym_op->cipher.data.offset = 0;
12563
12564         sym_op->auth.data.offset = 0;
12565         sym_op->auth.data.length = tdata->plaintext.len;
12566
12567         return 0;
12568 }
12569
12570 static int
12571 create_gmac_operation_sgl(enum rte_crypto_auth_operation op,
12572                 const struct gmac_test_data *tdata,
12573                 void *digest_mem, uint64_t digest_phys)
12574 {
12575         struct crypto_testsuite_params *ts_params = &testsuite_params;
12576         struct crypto_unittest_params *ut_params = &unittest_params;
12577         struct rte_crypto_sym_op *sym_op;
12578
12579         /* Generate Crypto op data structure */
12580         ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
12581                         RTE_CRYPTO_OP_TYPE_SYMMETRIC);
12582         TEST_ASSERT_NOT_NULL(ut_params->op,
12583                         "Failed to allocate symmetric crypto operation struct");
12584
12585         sym_op = ut_params->op->sym;
12586
12587         sym_op->auth.digest.data = digest_mem;
12588         TEST_ASSERT_NOT_NULL(sym_op->auth.digest.data,
12589                         "no room to append digest");
12590
12591         sym_op->auth.digest.phys_addr = digest_phys;
12592
12593         if (op == RTE_CRYPTO_AUTH_OP_VERIFY) {
12594                 rte_memcpy(sym_op->auth.digest.data, tdata->gmac_tag.data,
12595                                 tdata->gmac_tag.len);
12596                 debug_hexdump(stdout, "digest:",
12597                                 sym_op->auth.digest.data,
12598                                 tdata->gmac_tag.len);
12599         }
12600
12601         uint8_t *iv_ptr = rte_crypto_op_ctod_offset(ut_params->op,
12602                         uint8_t *, IV_OFFSET);
12603
12604         rte_memcpy(iv_ptr, tdata->iv.data, tdata->iv.len);
12605
12606         debug_hexdump(stdout, "iv:", iv_ptr, tdata->iv.len);
12607
12608         sym_op->cipher.data.length = 0;
12609         sym_op->cipher.data.offset = 0;
12610
12611         sym_op->auth.data.offset = 0;
12612         sym_op->auth.data.length = tdata->plaintext.len;
12613
12614         return 0;
12615 }
12616
12617 static int create_gmac_session(uint8_t dev_id,
12618                 const struct gmac_test_data *tdata,
12619                 enum rte_crypto_auth_operation auth_op)
12620 {
12621         uint8_t auth_key[tdata->key.len];
12622         int status;
12623
12624         struct crypto_testsuite_params *ts_params = &testsuite_params;
12625         struct crypto_unittest_params *ut_params = &unittest_params;
12626
12627         memcpy(auth_key, tdata->key.data, tdata->key.len);
12628
12629         ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;
12630         ut_params->auth_xform.next = NULL;
12631
12632         ut_params->auth_xform.auth.algo = RTE_CRYPTO_AUTH_AES_GMAC;
12633         ut_params->auth_xform.auth.op = auth_op;
12634         ut_params->auth_xform.auth.digest_length = tdata->gmac_tag.len;
12635         ut_params->auth_xform.auth.key.length = tdata->key.len;
12636         ut_params->auth_xform.auth.key.data = auth_key;
12637         ut_params->auth_xform.auth.iv.offset = IV_OFFSET;
12638         ut_params->auth_xform.auth.iv.length = tdata->iv.len;
12639
12640
12641         ut_params->sess = rte_cryptodev_sym_session_create(
12642                         ts_params->session_mpool);
12643         TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed");
12644
12645         status = rte_cryptodev_sym_session_init(dev_id, ut_params->sess,
12646                         &ut_params->auth_xform,
12647                         ts_params->session_priv_mpool);
12648
12649         return status;
12650 }
12651
12652 static int
12653 test_AES_GMAC_authentication(const struct gmac_test_data *tdata)
12654 {
12655         struct crypto_testsuite_params *ts_params = &testsuite_params;
12656         struct crypto_unittest_params *ut_params = &unittest_params;
12657         struct rte_cryptodev_info dev_info;
12658
12659         rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
12660         uint64_t feat_flags = dev_info.feature_flags;
12661
12662         if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
12663                         (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
12664                 printf("Device doesn't support RAW data-path APIs.\n");
12665                 return TEST_SKIPPED;
12666         }
12667
12668         int retval;
12669
12670         uint8_t *auth_tag, *plaintext;
12671         uint16_t plaintext_pad_len;
12672
12673         TEST_ASSERT_NOT_EQUAL(tdata->gmac_tag.len, 0,
12674                               "No GMAC length in the source data");
12675
12676         /* Verify the capabilities */
12677         struct rte_cryptodev_sym_capability_idx cap_idx;
12678         cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
12679         cap_idx.algo.auth = RTE_CRYPTO_AUTH_AES_GMAC;
12680         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
12681                         &cap_idx) == NULL)
12682                 return TEST_SKIPPED;
12683
12684         retval = create_gmac_session(ts_params->valid_devs[0],
12685                         tdata, RTE_CRYPTO_AUTH_OP_GENERATE);
12686
12687         if (retval == -ENOTSUP)
12688                 return TEST_SKIPPED;
12689         if (retval < 0)
12690                 return retval;
12691
12692         if (tdata->plaintext.len > MBUF_SIZE)
12693                 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->large_mbuf_pool);
12694         else
12695                 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
12696         TEST_ASSERT_NOT_NULL(ut_params->ibuf,
12697                         "Failed to allocate input buffer in mempool");
12698
12699         memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
12700                         rte_pktmbuf_tailroom(ut_params->ibuf));
12701
12702         plaintext_pad_len = RTE_ALIGN_CEIL(tdata->plaintext.len, 16);
12703         /*
12704          * Runtime generate the large plain text instead of use hard code
12705          * plain text vector. It is done to avoid create huge source file
12706          * with the test vector.
12707          */
12708         if (tdata->plaintext.len == GMAC_LARGE_PLAINTEXT_LENGTH)
12709                 generate_gmac_large_plaintext(tdata->plaintext.data);
12710
12711         plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
12712                                 plaintext_pad_len);
12713         TEST_ASSERT_NOT_NULL(plaintext, "no room to append plaintext");
12714
12715         memcpy(plaintext, tdata->plaintext.data, tdata->plaintext.len);
12716         debug_hexdump(stdout, "plaintext:", plaintext,
12717                         tdata->plaintext.len);
12718
12719         retval = create_gmac_operation(RTE_CRYPTO_AUTH_OP_GENERATE,
12720                         tdata);
12721
12722         if (retval < 0)
12723                 return retval;
12724
12725         rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
12726
12727         ut_params->op->sym->m_src = ut_params->ibuf;
12728
12729         if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
12730                 process_cpu_crypt_auth_op(ts_params->valid_devs[0],
12731                         ut_params->op);
12732         else if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
12733                 process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
12734                                 ut_params->op, 0, 1, 0, 0);
12735         else
12736                 TEST_ASSERT_NOT_NULL(
12737                         process_crypto_request(ts_params->valid_devs[0],
12738                         ut_params->op), "failed to process sym crypto op");
12739
12740         TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
12741                         "crypto op processing failed");
12742
12743         if (ut_params->op->sym->m_dst) {
12744                 auth_tag = rte_pktmbuf_mtod_offset(ut_params->op->sym->m_dst,
12745                                 uint8_t *, plaintext_pad_len);
12746         } else {
12747                 auth_tag = plaintext + plaintext_pad_len;
12748         }
12749
12750         debug_hexdump(stdout, "auth tag:", auth_tag, tdata->gmac_tag.len);
12751
12752         TEST_ASSERT_BUFFERS_ARE_EQUAL(
12753                         auth_tag,
12754                         tdata->gmac_tag.data,
12755                         tdata->gmac_tag.len,
12756                         "GMAC Generated auth tag not as expected");
12757
12758         return 0;
12759 }
12760
12761 static int
12762 test_AES_GMAC_authentication_test_case_1(void)
12763 {
12764         return test_AES_GMAC_authentication(&gmac_test_case_1);
12765 }
12766
12767 static int
12768 test_AES_GMAC_authentication_test_case_2(void)
12769 {
12770         return test_AES_GMAC_authentication(&gmac_test_case_2);
12771 }
12772
12773 static int
12774 test_AES_GMAC_authentication_test_case_3(void)
12775 {
12776         return test_AES_GMAC_authentication(&gmac_test_case_3);
12777 }
12778
12779 static int
12780 test_AES_GMAC_authentication_test_case_4(void)
12781 {
12782         return test_AES_GMAC_authentication(&gmac_test_case_4);
12783 }
12784
12785 static int
12786 test_AES_GMAC_authentication_verify(const struct gmac_test_data *tdata)
12787 {
12788         struct crypto_testsuite_params *ts_params = &testsuite_params;
12789         struct crypto_unittest_params *ut_params = &unittest_params;
12790         int retval;
12791         uint32_t plaintext_pad_len;
12792         uint8_t *plaintext;
12793         struct rte_cryptodev_info dev_info;
12794
12795         rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
12796         uint64_t feat_flags = dev_info.feature_flags;
12797
12798         if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
12799                         (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
12800                 printf("Device doesn't support RAW data-path APIs.\n");
12801                 return TEST_SKIPPED;
12802         }
12803
12804         TEST_ASSERT_NOT_EQUAL(tdata->gmac_tag.len, 0,
12805                               "No GMAC length in the source data");
12806
12807         /* Verify the capabilities */
12808         struct rte_cryptodev_sym_capability_idx cap_idx;
12809         cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
12810         cap_idx.algo.auth = RTE_CRYPTO_AUTH_AES_GMAC;
12811         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
12812                         &cap_idx) == NULL)
12813                 return TEST_SKIPPED;
12814
12815         retval = create_gmac_session(ts_params->valid_devs[0],
12816                         tdata, RTE_CRYPTO_AUTH_OP_VERIFY);
12817
12818         if (retval == -ENOTSUP)
12819                 return TEST_SKIPPED;
12820         if (retval < 0)
12821                 return retval;
12822
12823         if (tdata->plaintext.len > MBUF_SIZE)
12824                 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->large_mbuf_pool);
12825         else
12826                 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
12827         TEST_ASSERT_NOT_NULL(ut_params->ibuf,
12828                         "Failed to allocate input buffer in mempool");
12829
12830         memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
12831                         rte_pktmbuf_tailroom(ut_params->ibuf));
12832
12833         plaintext_pad_len = RTE_ALIGN_CEIL(tdata->plaintext.len, 16);
12834
12835         /*
12836          * Runtime generate the large plain text instead of use hard code
12837          * plain text vector. It is done to avoid create huge source file
12838          * with the test vector.
12839          */
12840         if (tdata->plaintext.len == GMAC_LARGE_PLAINTEXT_LENGTH)
12841                 generate_gmac_large_plaintext(tdata->plaintext.data);
12842
12843         plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
12844                                 plaintext_pad_len);
12845         TEST_ASSERT_NOT_NULL(plaintext, "no room to append plaintext");
12846
12847         memcpy(plaintext, tdata->plaintext.data, tdata->plaintext.len);
12848         debug_hexdump(stdout, "plaintext:", plaintext,
12849                         tdata->plaintext.len);
12850
12851         retval = create_gmac_operation(RTE_CRYPTO_AUTH_OP_VERIFY,
12852                         tdata);
12853
12854         if (retval < 0)
12855                 return retval;
12856
12857         rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
12858
12859         ut_params->op->sym->m_src = ut_params->ibuf;
12860
12861         if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
12862                 process_cpu_crypt_auth_op(ts_params->valid_devs[0],
12863                         ut_params->op);
12864         else if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
12865                 process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
12866                                 ut_params->op, 0, 1, 0, 0);
12867         else
12868                 TEST_ASSERT_NOT_NULL(
12869                         process_crypto_request(ts_params->valid_devs[0],
12870                         ut_params->op), "failed to process sym crypto op");
12871
12872         TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
12873                         "crypto op processing failed");
12874
12875         return 0;
12876
12877 }
12878
12879 static int
12880 test_AES_GMAC_authentication_verify_test_case_1(void)
12881 {
12882         return test_AES_GMAC_authentication_verify(&gmac_test_case_1);
12883 }
12884
12885 static int
12886 test_AES_GMAC_authentication_verify_test_case_2(void)
12887 {
12888         return test_AES_GMAC_authentication_verify(&gmac_test_case_2);
12889 }
12890
12891 static int
12892 test_AES_GMAC_authentication_verify_test_case_3(void)
12893 {
12894         return test_AES_GMAC_authentication_verify(&gmac_test_case_3);
12895 }
12896
12897 static int
12898 test_AES_GMAC_authentication_verify_test_case_4(void)
12899 {
12900         return test_AES_GMAC_authentication_verify(&gmac_test_case_4);
12901 }
12902
12903 static int
12904 test_AES_GMAC_authentication_SGL(const struct gmac_test_data *tdata,
12905                                 uint32_t fragsz)
12906 {
12907         struct crypto_testsuite_params *ts_params = &testsuite_params;
12908         struct crypto_unittest_params *ut_params = &unittest_params;
12909         struct rte_cryptodev_info dev_info;
12910         uint64_t feature_flags;
12911         unsigned int trn_data = 0;
12912         void *digest_mem = NULL;
12913         uint32_t segs = 1;
12914         unsigned int to_trn = 0;
12915         struct rte_mbuf *buf = NULL;
12916         uint8_t *auth_tag, *plaintext;
12917         int retval;
12918
12919         TEST_ASSERT_NOT_EQUAL(tdata->gmac_tag.len, 0,
12920                               "No GMAC length in the source data");
12921
12922         /* Verify the capabilities */
12923         struct rte_cryptodev_sym_capability_idx cap_idx;
12924         cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
12925         cap_idx.algo.auth = RTE_CRYPTO_AUTH_AES_GMAC;
12926         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
12927                         &cap_idx) == NULL)
12928                 return TEST_SKIPPED;
12929
12930         /* Check for any input SGL support */
12931         rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
12932         feature_flags = dev_info.feature_flags;
12933
12934         if ((!(feature_flags & RTE_CRYPTODEV_FF_IN_PLACE_SGL)) ||
12935                         (!(feature_flags & RTE_CRYPTODEV_FF_OOP_SGL_IN_LB_OUT)) ||
12936                         (!(feature_flags & RTE_CRYPTODEV_FF_OOP_SGL_IN_SGL_OUT)))
12937                 return TEST_SKIPPED;
12938
12939         if (fragsz > tdata->plaintext.len)
12940                 fragsz = tdata->plaintext.len;
12941
12942         uint16_t plaintext_len = fragsz;
12943
12944         retval = create_gmac_session(ts_params->valid_devs[0],
12945                         tdata, RTE_CRYPTO_AUTH_OP_GENERATE);
12946
12947         if (retval == -ENOTSUP)
12948                 return TEST_SKIPPED;
12949         if (retval < 0)
12950                 return retval;
12951
12952         ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
12953         TEST_ASSERT_NOT_NULL(ut_params->ibuf,
12954                         "Failed to allocate input buffer in mempool");
12955
12956         memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
12957                         rte_pktmbuf_tailroom(ut_params->ibuf));
12958
12959         plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
12960                                 plaintext_len);
12961         TEST_ASSERT_NOT_NULL(plaintext, "no room to append plaintext");
12962
12963         memcpy(plaintext, tdata->plaintext.data, plaintext_len);
12964
12965         trn_data += plaintext_len;
12966
12967         buf = ut_params->ibuf;
12968
12969         /*
12970          * Loop until no more fragments
12971          */
12972
12973         while (trn_data < tdata->plaintext.len) {
12974                 ++segs;
12975                 to_trn = (tdata->plaintext.len - trn_data < fragsz) ?
12976                                 (tdata->plaintext.len - trn_data) : fragsz;
12977
12978                 buf->next = rte_pktmbuf_alloc(ts_params->mbuf_pool);
12979                 buf = buf->next;
12980
12981                 memset(rte_pktmbuf_mtod(buf, uint8_t *), 0,
12982                                 rte_pktmbuf_tailroom(buf));
12983
12984                 plaintext = (uint8_t *)rte_pktmbuf_append(buf,
12985                                 to_trn);
12986
12987                 memcpy(plaintext, tdata->plaintext.data + trn_data,
12988                                 to_trn);
12989                 trn_data += to_trn;
12990                 if (trn_data  == tdata->plaintext.len)
12991                         digest_mem = (uint8_t *)rte_pktmbuf_append(buf,
12992                                         tdata->gmac_tag.len);
12993         }
12994         ut_params->ibuf->nb_segs = segs;
12995
12996         /*
12997          * Place digest at the end of the last buffer
12998          */
12999         uint64_t digest_phys = rte_pktmbuf_iova(buf) + to_trn;
13000
13001         if (!digest_mem) {
13002                 digest_mem = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
13003                                 + tdata->gmac_tag.len);
13004                 digest_phys = rte_pktmbuf_iova_offset(ut_params->ibuf,
13005                                 tdata->plaintext.len);
13006         }
13007
13008         retval = create_gmac_operation_sgl(RTE_CRYPTO_AUTH_OP_GENERATE,
13009                         tdata, digest_mem, digest_phys);
13010
13011         if (retval < 0)
13012                 return retval;
13013
13014         rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
13015
13016         ut_params->op->sym->m_src = ut_params->ibuf;
13017
13018         if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
13019                 return TEST_SKIPPED;
13020
13021         TEST_ASSERT_NOT_NULL(
13022                 process_crypto_request(ts_params->valid_devs[0],
13023                 ut_params->op), "failed to process sym crypto op");
13024
13025         TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
13026                         "crypto op processing failed");
13027
13028         auth_tag = digest_mem;
13029         debug_hexdump(stdout, "auth tag:", auth_tag, tdata->gmac_tag.len);
13030         TEST_ASSERT_BUFFERS_ARE_EQUAL(
13031                         auth_tag,
13032                         tdata->gmac_tag.data,
13033                         tdata->gmac_tag.len,
13034                         "GMAC Generated auth tag not as expected");
13035
13036         return 0;
13037 }
13038
13039 /* Segment size not multiple of block size (16B) */
13040 static int
13041 test_AES_GMAC_authentication_SGL_40B(void)
13042 {
13043         return test_AES_GMAC_authentication_SGL(&gmac_test_case_1, 40);
13044 }
13045
13046 static int
13047 test_AES_GMAC_authentication_SGL_80B(void)
13048 {
13049         return test_AES_GMAC_authentication_SGL(&gmac_test_case_1, 80);
13050 }
13051
13052 static int
13053 test_AES_GMAC_authentication_SGL_2048B(void)
13054 {
13055         return test_AES_GMAC_authentication_SGL(&gmac_test_case_5, 2048);
13056 }
13057
13058 /* Segment size not multiple of block size (16B) */
13059 static int
13060 test_AES_GMAC_authentication_SGL_2047B(void)
13061 {
13062         return test_AES_GMAC_authentication_SGL(&gmac_test_case_5, 2047);
13063 }
13064
13065 struct test_crypto_vector {
13066         enum rte_crypto_cipher_algorithm crypto_algo;
13067         unsigned int cipher_offset;
13068         unsigned int cipher_len;
13069
13070         struct {
13071                 uint8_t data[64];
13072                 unsigned int len;
13073         } cipher_key;
13074
13075         struct {
13076                 uint8_t data[64];
13077                 unsigned int len;
13078         } iv;
13079
13080         struct {
13081                 const uint8_t *data;
13082                 unsigned int len;
13083         } plaintext;
13084
13085         struct {
13086                 const uint8_t *data;
13087                 unsigned int len;
13088         } ciphertext;
13089
13090         enum rte_crypto_auth_algorithm auth_algo;
13091         unsigned int auth_offset;
13092
13093         struct {
13094                 uint8_t data[128];
13095                 unsigned int len;
13096         } auth_key;
13097
13098         struct {
13099                 const uint8_t *data;
13100                 unsigned int len;
13101         } aad;
13102
13103         struct {
13104                 uint8_t data[128];
13105                 unsigned int len;
13106         } digest;
13107 };
13108
13109 static const struct test_crypto_vector
13110 hmac_sha1_test_crypto_vector = {
13111         .auth_algo = RTE_CRYPTO_AUTH_SHA1_HMAC,
13112         .plaintext = {
13113                 .data = plaintext_hash,
13114                 .len = 512
13115         },
13116         .auth_key = {
13117                 .data = {
13118                         0xF8, 0x2A, 0xC7, 0x54, 0xDB, 0x96, 0x18, 0xAA,
13119                         0xC3, 0xA1, 0x53, 0xF6, 0x1F, 0x17, 0x60, 0xBD,
13120                         0xDE, 0xF4, 0xDE, 0xAD
13121                 },
13122                 .len = 20
13123         },
13124         .digest = {
13125                 .data = {
13126                         0xC4, 0xB7, 0x0E, 0x6B, 0xDE, 0xD1, 0xE7, 0x77,
13127                         0x7E, 0x2E, 0x8F, 0xFC, 0x48, 0x39, 0x46, 0x17,
13128                         0x3F, 0x91, 0x64, 0x59
13129                 },
13130                 .len = 20
13131         }
13132 };
13133
13134 static const struct test_crypto_vector
13135 aes128_gmac_test_vector = {
13136         .auth_algo = RTE_CRYPTO_AUTH_AES_GMAC,
13137         .plaintext = {
13138                 .data = plaintext_hash,
13139                 .len = 512
13140         },
13141         .iv = {
13142                 .data = {
13143                         0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
13144                         0x08, 0x09, 0x0A, 0x0B
13145                 },
13146                 .len = 12
13147         },
13148         .auth_key = {
13149                 .data = {
13150                         0x42, 0x1A, 0x7D, 0x3D, 0xF5, 0x82, 0x80, 0xF1,
13151                         0xF1, 0x35, 0x5C, 0x3B, 0xDD, 0x9A, 0x65, 0xBA
13152                 },
13153                 .len = 16
13154         },
13155         .digest = {
13156                 .data = {
13157                         0xCA, 0x00, 0x99, 0x8B, 0x30, 0x7E, 0x74, 0x56,
13158                         0x32, 0xA7, 0x87, 0xB5, 0xE9, 0xB2, 0x34, 0x5A
13159                 },
13160                 .len = 16
13161         }
13162 };
13163
13164 static const struct test_crypto_vector
13165 aes128cbc_hmac_sha1_test_vector = {
13166         .crypto_algo = RTE_CRYPTO_CIPHER_AES_CBC,
13167         .cipher_offset = 0,
13168         .cipher_len = 512,
13169         .cipher_key = {
13170                 .data = {
13171                         0xE4, 0x23, 0x33, 0x8A, 0x35, 0x64, 0x61, 0xE2,
13172                         0x49, 0x03, 0xDD, 0xC6, 0xB8, 0xCA, 0x55, 0x7A
13173                 },
13174                 .len = 16
13175         },
13176         .iv = {
13177                 .data = {
13178                         0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
13179                         0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F
13180                 },
13181                 .len = 16
13182         },
13183         .plaintext = {
13184                 .data = plaintext_hash,
13185                 .len = 512
13186         },
13187         .ciphertext = {
13188                 .data = ciphertext512_aes128cbc,
13189                 .len = 512
13190         },
13191         .auth_algo = RTE_CRYPTO_AUTH_SHA1_HMAC,
13192         .auth_offset = 0,
13193         .auth_key = {
13194                 .data = {
13195                         0xF8, 0x2A, 0xC7, 0x54, 0xDB, 0x96, 0x18, 0xAA,
13196                         0xC3, 0xA1, 0x53, 0xF6, 0x1F, 0x17, 0x60, 0xBD,
13197                         0xDE, 0xF4, 0xDE, 0xAD
13198                 },
13199                 .len = 20
13200         },
13201         .digest = {
13202                 .data = {
13203                         0x9A, 0x4F, 0x88, 0x1B, 0xB6, 0x8F, 0xD8, 0x60,
13204                         0x42, 0x1A, 0x7D, 0x3D, 0xF5, 0x82, 0x80, 0xF1,
13205                         0x18, 0x8C, 0x1D, 0x32
13206                 },
13207                 .len = 20
13208         }
13209 };
13210
13211 static const struct test_crypto_vector
13212 aes128cbc_hmac_sha1_aad_test_vector = {
13213         .crypto_algo = RTE_CRYPTO_CIPHER_AES_CBC,
13214         .cipher_offset = 8,
13215         .cipher_len = 496,
13216         .cipher_key = {
13217                 .data = {
13218                         0xE4, 0x23, 0x33, 0x8A, 0x35, 0x64, 0x61, 0xE2,
13219                         0x49, 0x03, 0xDD, 0xC6, 0xB8, 0xCA, 0x55, 0x7A
13220                 },
13221                 .len = 16
13222         },
13223         .iv = {
13224                 .data = {
13225                         0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
13226                         0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F
13227                 },
13228                 .len = 16
13229         },
13230         .plaintext = {
13231                 .data = plaintext_hash,
13232                 .len = 512
13233         },
13234         .ciphertext = {
13235                 .data = ciphertext512_aes128cbc_aad,
13236                 .len = 512
13237         },
13238         .auth_algo = RTE_CRYPTO_AUTH_SHA1_HMAC,
13239         .auth_offset = 0,
13240         .auth_key = {
13241                 .data = {
13242                         0xF8, 0x2A, 0xC7, 0x54, 0xDB, 0x96, 0x18, 0xAA,
13243                         0xC3, 0xA1, 0x53, 0xF6, 0x1F, 0x17, 0x60, 0xBD,
13244                         0xDE, 0xF4, 0xDE, 0xAD
13245                 },
13246                 .len = 20
13247         },
13248         .digest = {
13249                 .data = {
13250                         0x6D, 0xF3, 0x50, 0x79, 0x7A, 0x2A, 0xAC, 0x7F,
13251                         0xA6, 0xF0, 0xC6, 0x38, 0x1F, 0xA4, 0xDD, 0x9B,
13252                         0x62, 0x0F, 0xFB, 0x10
13253                 },
13254                 .len = 20
13255         }
13256 };
13257
13258 static void
13259 data_corruption(uint8_t *data)
13260 {
13261         data[0] += 1;
13262 }
13263
13264 static void
13265 tag_corruption(uint8_t *data, unsigned int tag_offset)
13266 {
13267         data[tag_offset] += 1;
13268 }
13269
13270 static int
13271 create_auth_session(struct crypto_unittest_params *ut_params,
13272                 uint8_t dev_id,
13273                 const struct test_crypto_vector *reference,
13274                 enum rte_crypto_auth_operation auth_op)
13275 {
13276         struct crypto_testsuite_params *ts_params = &testsuite_params;
13277         uint8_t auth_key[reference->auth_key.len + 1];
13278         int status;
13279
13280         memcpy(auth_key, reference->auth_key.data, reference->auth_key.len);
13281
13282         /* Setup Authentication Parameters */
13283         ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;
13284         ut_params->auth_xform.auth.op = auth_op;
13285         ut_params->auth_xform.next = NULL;
13286         ut_params->auth_xform.auth.algo = reference->auth_algo;
13287         ut_params->auth_xform.auth.key.length = reference->auth_key.len;
13288         ut_params->auth_xform.auth.key.data = auth_key;
13289         ut_params->auth_xform.auth.digest_length = reference->digest.len;
13290
13291         /* Create Crypto session*/
13292         ut_params->sess = rte_cryptodev_sym_session_create(
13293                         ts_params->session_mpool);
13294         TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed");
13295
13296         status = rte_cryptodev_sym_session_init(dev_id, ut_params->sess,
13297                                 &ut_params->auth_xform,
13298                                 ts_params->session_priv_mpool);
13299
13300         return status;
13301 }
13302
13303 static int
13304 create_auth_cipher_session(struct crypto_unittest_params *ut_params,
13305                 uint8_t dev_id,
13306                 const struct test_crypto_vector *reference,
13307                 enum rte_crypto_auth_operation auth_op,
13308                 enum rte_crypto_cipher_operation cipher_op)
13309 {
13310         struct crypto_testsuite_params *ts_params = &testsuite_params;
13311         uint8_t cipher_key[reference->cipher_key.len + 1];
13312         uint8_t auth_key[reference->auth_key.len + 1];
13313         int status;
13314
13315         memcpy(cipher_key, reference->cipher_key.data,
13316                         reference->cipher_key.len);
13317         memcpy(auth_key, reference->auth_key.data, reference->auth_key.len);
13318
13319         /* Setup Authentication Parameters */
13320         ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;
13321         ut_params->auth_xform.auth.op = auth_op;
13322         ut_params->auth_xform.auth.algo = reference->auth_algo;
13323         ut_params->auth_xform.auth.key.length = reference->auth_key.len;
13324         ut_params->auth_xform.auth.key.data = auth_key;
13325         ut_params->auth_xform.auth.digest_length = reference->digest.len;
13326
13327         if (reference->auth_algo == RTE_CRYPTO_AUTH_AES_GMAC) {
13328                 ut_params->auth_xform.auth.iv.offset = IV_OFFSET;
13329                 ut_params->auth_xform.auth.iv.length = reference->iv.len;
13330         } else {
13331                 ut_params->auth_xform.next = &ut_params->cipher_xform;
13332
13333                 /* Setup Cipher Parameters */
13334                 ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
13335                 ut_params->cipher_xform.next = NULL;
13336                 ut_params->cipher_xform.cipher.algo = reference->crypto_algo;
13337                 ut_params->cipher_xform.cipher.op = cipher_op;
13338                 ut_params->cipher_xform.cipher.key.data = cipher_key;
13339                 ut_params->cipher_xform.cipher.key.length = reference->cipher_key.len;
13340                 ut_params->cipher_xform.cipher.iv.offset = IV_OFFSET;
13341                 ut_params->cipher_xform.cipher.iv.length = reference->iv.len;
13342         }
13343
13344         /* Create Crypto session*/
13345         ut_params->sess = rte_cryptodev_sym_session_create(
13346                         ts_params->session_mpool);
13347         TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed");
13348
13349         status = rte_cryptodev_sym_session_init(dev_id, ut_params->sess,
13350                                 &ut_params->auth_xform,
13351                                 ts_params->session_priv_mpool);
13352
13353         return status;
13354 }
13355
13356 static int
13357 create_auth_operation(struct crypto_testsuite_params *ts_params,
13358                 struct crypto_unittest_params *ut_params,
13359                 const struct test_crypto_vector *reference,
13360                 unsigned int auth_generate)
13361 {
13362         /* Generate Crypto op data structure */
13363         ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
13364                         RTE_CRYPTO_OP_TYPE_SYMMETRIC);
13365         TEST_ASSERT_NOT_NULL(ut_params->op,
13366                         "Failed to allocate pktmbuf offload");
13367
13368         /* Set crypto operation data parameters */
13369         rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
13370
13371         struct rte_crypto_sym_op *sym_op = ut_params->op->sym;
13372
13373         /* set crypto operation source mbuf */
13374         sym_op->m_src = ut_params->ibuf;
13375
13376         /* digest */
13377         sym_op->auth.digest.data = (uint8_t *)rte_pktmbuf_append(
13378                         ut_params->ibuf, reference->digest.len);
13379
13380         TEST_ASSERT_NOT_NULL(sym_op->auth.digest.data,
13381                         "no room to append auth tag");
13382
13383         sym_op->auth.digest.phys_addr = rte_pktmbuf_iova_offset(
13384                         ut_params->ibuf, reference->plaintext.len);
13385
13386         if (auth_generate)
13387                 memset(sym_op->auth.digest.data, 0, reference->digest.len);
13388         else
13389                 memcpy(sym_op->auth.digest.data,
13390                                 reference->digest.data,
13391                                 reference->digest.len);
13392
13393         debug_hexdump(stdout, "digest:",
13394                         sym_op->auth.digest.data,
13395                         reference->digest.len);
13396
13397         sym_op->auth.data.length = reference->plaintext.len;
13398         sym_op->auth.data.offset = 0;
13399
13400         return 0;
13401 }
13402
13403 static int
13404 create_auth_GMAC_operation(struct crypto_testsuite_params *ts_params,
13405                 struct crypto_unittest_params *ut_params,
13406                 const struct test_crypto_vector *reference,
13407                 unsigned int auth_generate)
13408 {
13409         /* Generate Crypto op data structure */
13410         ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
13411                         RTE_CRYPTO_OP_TYPE_SYMMETRIC);
13412         TEST_ASSERT_NOT_NULL(ut_params->op,
13413                         "Failed to allocate pktmbuf offload");
13414
13415         /* Set crypto operation data parameters */
13416         rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
13417
13418         struct rte_crypto_sym_op *sym_op = ut_params->op->sym;
13419
13420         /* set crypto operation source mbuf */
13421         sym_op->m_src = ut_params->ibuf;
13422
13423         /* digest */
13424         sym_op->auth.digest.data = (uint8_t *)rte_pktmbuf_append(
13425                         ut_params->ibuf, reference->digest.len);
13426
13427         TEST_ASSERT_NOT_NULL(sym_op->auth.digest.data,
13428                         "no room to append auth tag");
13429
13430         sym_op->auth.digest.phys_addr = rte_pktmbuf_iova_offset(
13431                         ut_params->ibuf, reference->ciphertext.len);
13432
13433         if (auth_generate)
13434                 memset(sym_op->auth.digest.data, 0, reference->digest.len);
13435         else
13436                 memcpy(sym_op->auth.digest.data,
13437                                 reference->digest.data,
13438                                 reference->digest.len);
13439
13440         debug_hexdump(stdout, "digest:",
13441                         sym_op->auth.digest.data,
13442                         reference->digest.len);
13443
13444         rte_memcpy(rte_crypto_op_ctod_offset(ut_params->op, uint8_t *, IV_OFFSET),
13445                         reference->iv.data, reference->iv.len);
13446
13447         sym_op->cipher.data.length = 0;
13448         sym_op->cipher.data.offset = 0;
13449
13450         sym_op->auth.data.length = reference->plaintext.len;
13451         sym_op->auth.data.offset = 0;
13452
13453         return 0;
13454 }
13455
13456 static int
13457 create_cipher_auth_operation(struct crypto_testsuite_params *ts_params,
13458                 struct crypto_unittest_params *ut_params,
13459                 const struct test_crypto_vector *reference,
13460                 unsigned int auth_generate)
13461 {
13462         /* Generate Crypto op data structure */
13463         ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
13464                         RTE_CRYPTO_OP_TYPE_SYMMETRIC);
13465         TEST_ASSERT_NOT_NULL(ut_params->op,
13466                         "Failed to allocate pktmbuf offload");
13467
13468         /* Set crypto operation data parameters */
13469         rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
13470
13471         struct rte_crypto_sym_op *sym_op = ut_params->op->sym;
13472
13473         /* set crypto operation source mbuf */
13474         sym_op->m_src = ut_params->ibuf;
13475
13476         /* digest */
13477         sym_op->auth.digest.data = (uint8_t *)rte_pktmbuf_append(
13478                         ut_params->ibuf, reference->digest.len);
13479
13480         TEST_ASSERT_NOT_NULL(sym_op->auth.digest.data,
13481                         "no room to append auth tag");
13482
13483         sym_op->auth.digest.phys_addr = rte_pktmbuf_iova_offset(
13484                         ut_params->ibuf, reference->ciphertext.len);
13485
13486         if (auth_generate)
13487                 memset(sym_op->auth.digest.data, 0, reference->digest.len);
13488         else
13489                 memcpy(sym_op->auth.digest.data,
13490                                 reference->digest.data,
13491                                 reference->digest.len);
13492
13493         debug_hexdump(stdout, "digest:",
13494                         sym_op->auth.digest.data,
13495                         reference->digest.len);
13496
13497         rte_memcpy(rte_crypto_op_ctod_offset(ut_params->op, uint8_t *, IV_OFFSET),
13498                         reference->iv.data, reference->iv.len);
13499
13500         sym_op->cipher.data.length = reference->cipher_len;
13501         sym_op->cipher.data.offset = reference->cipher_offset;
13502
13503         sym_op->auth.data.length = reference->plaintext.len;
13504         sym_op->auth.data.offset = reference->auth_offset;
13505
13506         return 0;
13507 }
13508
13509 static int
13510 create_auth_verify_operation(struct crypto_testsuite_params *ts_params,
13511                 struct crypto_unittest_params *ut_params,
13512                 const struct test_crypto_vector *reference)
13513 {
13514         return create_auth_operation(ts_params, ut_params, reference, 0);
13515 }
13516
13517 static int
13518 create_auth_verify_GMAC_operation(
13519                 struct crypto_testsuite_params *ts_params,
13520                 struct crypto_unittest_params *ut_params,
13521                 const struct test_crypto_vector *reference)
13522 {
13523         return create_auth_GMAC_operation(ts_params, ut_params, reference, 0);
13524 }
13525
13526 static int
13527 create_cipher_auth_verify_operation(struct crypto_testsuite_params *ts_params,
13528                 struct crypto_unittest_params *ut_params,
13529                 const struct test_crypto_vector *reference)
13530 {
13531         return create_cipher_auth_operation(ts_params, ut_params, reference, 0);
13532 }
13533
13534 static int
13535 test_authentication_verify_fail_when_data_corruption(
13536                 struct crypto_testsuite_params *ts_params,
13537                 struct crypto_unittest_params *ut_params,
13538                 const struct test_crypto_vector *reference,
13539                 unsigned int data_corrupted)
13540 {
13541         int retval;
13542
13543         uint8_t *plaintext;
13544         struct rte_cryptodev_info dev_info;
13545
13546         rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
13547         uint64_t feat_flags = dev_info.feature_flags;
13548
13549         if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
13550                         (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
13551                 printf("Device doesn't support RAW data-path APIs.\n");
13552                 return TEST_SKIPPED;
13553         }
13554
13555         /* Verify the capabilities */
13556         struct rte_cryptodev_sym_capability_idx cap_idx;
13557         cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
13558         cap_idx.algo.auth = reference->auth_algo;
13559         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
13560                         &cap_idx) == NULL)
13561                 return TEST_SKIPPED;
13562
13563
13564         /* Create session */
13565         retval = create_auth_session(ut_params,
13566                         ts_params->valid_devs[0],
13567                         reference,
13568                         RTE_CRYPTO_AUTH_OP_VERIFY);
13569
13570         if (retval == -ENOTSUP)
13571                 return TEST_SKIPPED;
13572         if (retval < 0)
13573                 return retval;
13574
13575         ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
13576         TEST_ASSERT_NOT_NULL(ut_params->ibuf,
13577                         "Failed to allocate input buffer in mempool");
13578
13579         /* clear mbuf payload */
13580         memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
13581                         rte_pktmbuf_tailroom(ut_params->ibuf));
13582
13583         plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
13584                         reference->plaintext.len);
13585         TEST_ASSERT_NOT_NULL(plaintext, "no room to append plaintext");
13586         memcpy(plaintext, reference->plaintext.data, reference->plaintext.len);
13587
13588         debug_hexdump(stdout, "plaintext:", plaintext,
13589                 reference->plaintext.len);
13590
13591         /* Create operation */
13592         retval = create_auth_verify_operation(ts_params, ut_params, reference);
13593
13594         if (retval < 0)
13595                 return retval;
13596
13597         if (data_corrupted)
13598                 data_corruption(plaintext);
13599         else
13600                 tag_corruption(plaintext, reference->plaintext.len);
13601
13602         if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO) {
13603                 process_cpu_crypt_auth_op(ts_params->valid_devs[0],
13604                         ut_params->op);
13605                 TEST_ASSERT_NOT_EQUAL(ut_params->op->status,
13606                         RTE_CRYPTO_OP_STATUS_SUCCESS,
13607                         "authentication not failed");
13608         } else if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
13609                 process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
13610                                 ut_params->op, 0, 1, 0, 0);
13611         else {
13612                 ut_params->op = process_crypto_request(ts_params->valid_devs[0],
13613                         ut_params->op);
13614         }
13615         if (ut_params->op == NULL)
13616                 return 0;
13617         else if (ut_params->op->status != RTE_CRYPTO_OP_STATUS_SUCCESS)
13618                 return 0;
13619
13620         return -1;
13621 }
13622
13623 static int
13624 test_authentication_verify_GMAC_fail_when_corruption(
13625                 struct crypto_testsuite_params *ts_params,
13626                 struct crypto_unittest_params *ut_params,
13627                 const struct test_crypto_vector *reference,
13628                 unsigned int data_corrupted)
13629 {
13630         int retval;
13631         uint8_t *plaintext;
13632         struct rte_cryptodev_info dev_info;
13633
13634         rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
13635         uint64_t feat_flags = dev_info.feature_flags;
13636
13637         if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
13638                         (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
13639                 printf("Device doesn't support RAW data-path APIs.\n");
13640                 return TEST_SKIPPED;
13641         }
13642
13643         /* Verify the capabilities */
13644         struct rte_cryptodev_sym_capability_idx cap_idx;
13645         cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
13646         cap_idx.algo.auth = reference->auth_algo;
13647         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
13648                         &cap_idx) == NULL)
13649                 return TEST_SKIPPED;
13650
13651         /* Create session */
13652         retval = create_auth_cipher_session(ut_params,
13653                         ts_params->valid_devs[0],
13654                         reference,
13655                         RTE_CRYPTO_AUTH_OP_VERIFY,
13656                         RTE_CRYPTO_CIPHER_OP_DECRYPT);
13657         if (retval < 0)
13658                 return retval;
13659
13660         ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
13661         TEST_ASSERT_NOT_NULL(ut_params->ibuf,
13662                         "Failed to allocate input buffer in mempool");
13663
13664         /* clear mbuf payload */
13665         memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
13666                         rte_pktmbuf_tailroom(ut_params->ibuf));
13667
13668         plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
13669                         reference->plaintext.len);
13670         TEST_ASSERT_NOT_NULL(plaintext, "no room to append plaintext");
13671         memcpy(plaintext, reference->plaintext.data, reference->plaintext.len);
13672
13673         debug_hexdump(stdout, "plaintext:", plaintext,
13674                 reference->plaintext.len);
13675
13676         /* Create operation */
13677         retval = create_auth_verify_GMAC_operation(ts_params,
13678                         ut_params,
13679                         reference);
13680
13681         if (retval < 0)
13682                 return retval;
13683
13684         if (data_corrupted)
13685                 data_corruption(plaintext);
13686         else
13687                 tag_corruption(plaintext, reference->aad.len);
13688
13689         if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO) {
13690                 process_cpu_crypt_auth_op(ts_params->valid_devs[0],
13691                         ut_params->op);
13692                 TEST_ASSERT_NOT_EQUAL(ut_params->op->status,
13693                         RTE_CRYPTO_OP_STATUS_SUCCESS,
13694                         "authentication not failed");
13695         } else if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
13696                 process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
13697                                 ut_params->op, 0, 1, 0, 0);
13698         else {
13699                 ut_params->op = process_crypto_request(ts_params->valid_devs[0],
13700                         ut_params->op);
13701                 TEST_ASSERT_NULL(ut_params->op, "authentication not failed");
13702         }
13703
13704         return 0;
13705 }
13706
13707 static int
13708 test_authenticated_decryption_fail_when_corruption(
13709                 struct crypto_testsuite_params *ts_params,
13710                 struct crypto_unittest_params *ut_params,
13711                 const struct test_crypto_vector *reference,
13712                 unsigned int data_corrupted)
13713 {
13714         int retval;
13715
13716         uint8_t *ciphertext;
13717         struct rte_cryptodev_info dev_info;
13718
13719         rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
13720         uint64_t feat_flags = dev_info.feature_flags;
13721
13722         if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
13723                         (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
13724                 printf("Device doesn't support RAW data-path APIs.\n");
13725                 return TEST_SKIPPED;
13726         }
13727
13728         /* Verify the capabilities */
13729         struct rte_cryptodev_sym_capability_idx cap_idx;
13730         cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
13731         cap_idx.algo.auth = reference->auth_algo;
13732         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
13733                         &cap_idx) == NULL)
13734                 return TEST_SKIPPED;
13735         cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
13736         cap_idx.algo.cipher = reference->crypto_algo;
13737         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
13738                         &cap_idx) == NULL)
13739                 return TEST_SKIPPED;
13740
13741         /* Create session */
13742         retval = create_auth_cipher_session(ut_params,
13743                         ts_params->valid_devs[0],
13744                         reference,
13745                         RTE_CRYPTO_AUTH_OP_VERIFY,
13746                         RTE_CRYPTO_CIPHER_OP_DECRYPT);
13747
13748         if (retval == -ENOTSUP)
13749                 return TEST_SKIPPED;
13750         if (retval < 0)
13751                 return retval;
13752
13753         ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
13754         TEST_ASSERT_NOT_NULL(ut_params->ibuf,
13755                         "Failed to allocate input buffer in mempool");
13756
13757         /* clear mbuf payload */
13758         memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
13759                         rte_pktmbuf_tailroom(ut_params->ibuf));
13760
13761         ciphertext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
13762                         reference->ciphertext.len);
13763         TEST_ASSERT_NOT_NULL(ciphertext, "no room to append ciphertext");
13764         memcpy(ciphertext, reference->ciphertext.data,
13765                         reference->ciphertext.len);
13766
13767         /* Create operation */
13768         retval = create_cipher_auth_verify_operation(ts_params,
13769                         ut_params,
13770                         reference);
13771
13772         if (retval < 0)
13773                 return retval;
13774
13775         if (data_corrupted)
13776                 data_corruption(ciphertext);
13777         else
13778                 tag_corruption(ciphertext, reference->ciphertext.len);
13779
13780         if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO) {
13781                 process_cpu_crypt_auth_op(ts_params->valid_devs[0],
13782                         ut_params->op);
13783                 TEST_ASSERT_NOT_EQUAL(ut_params->op->status,
13784                         RTE_CRYPTO_OP_STATUS_SUCCESS,
13785                         "authentication not failed");
13786         } else if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
13787                 process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
13788                                 ut_params->op, 1, 1, 0, 0);
13789         else {
13790                 ut_params->op = process_crypto_request(ts_params->valid_devs[0],
13791                         ut_params->op);
13792                 TEST_ASSERT_NULL(ut_params->op, "authentication not failed");
13793         }
13794
13795         return 0;
13796 }
13797
13798 static int
13799 test_authenticated_encrypt_with_esn(
13800                 struct crypto_testsuite_params *ts_params,
13801                 struct crypto_unittest_params *ut_params,
13802                 const struct test_crypto_vector *reference)
13803 {
13804         int retval;
13805
13806         uint8_t *authciphertext, *plaintext, *auth_tag;
13807         uint16_t plaintext_pad_len;
13808         uint8_t cipher_key[reference->cipher_key.len + 1];
13809         uint8_t auth_key[reference->auth_key.len + 1];
13810         struct rte_cryptodev_info dev_info;
13811         int status;
13812
13813         rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
13814         uint64_t feat_flags = dev_info.feature_flags;
13815
13816         if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
13817                         (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
13818                 printf("Device doesn't support RAW data-path APIs.\n");
13819                 return TEST_SKIPPED;
13820         }
13821
13822         /* Verify the capabilities */
13823         struct rte_cryptodev_sym_capability_idx cap_idx;
13824         cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
13825         cap_idx.algo.auth = reference->auth_algo;
13826         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
13827                         &cap_idx) == NULL)
13828                 return TEST_SKIPPED;
13829         cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
13830         cap_idx.algo.cipher = reference->crypto_algo;
13831         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
13832                         &cap_idx) == NULL)
13833                 return TEST_SKIPPED;
13834
13835         /* Create session */
13836         memcpy(cipher_key, reference->cipher_key.data,
13837                         reference->cipher_key.len);
13838         memcpy(auth_key, reference->auth_key.data, reference->auth_key.len);
13839
13840         /* Setup Cipher Parameters */
13841         ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
13842         ut_params->cipher_xform.cipher.algo = reference->crypto_algo;
13843         ut_params->cipher_xform.cipher.op = RTE_CRYPTO_CIPHER_OP_ENCRYPT;
13844         ut_params->cipher_xform.cipher.key.data = cipher_key;
13845         ut_params->cipher_xform.cipher.key.length = reference->cipher_key.len;
13846         ut_params->cipher_xform.cipher.iv.offset = IV_OFFSET;
13847         ut_params->cipher_xform.cipher.iv.length = reference->iv.len;
13848
13849         ut_params->cipher_xform.next = &ut_params->auth_xform;
13850
13851         /* Setup Authentication Parameters */
13852         ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;
13853         ut_params->auth_xform.auth.op = RTE_CRYPTO_AUTH_OP_GENERATE;
13854         ut_params->auth_xform.auth.algo = reference->auth_algo;
13855         ut_params->auth_xform.auth.key.length = reference->auth_key.len;
13856         ut_params->auth_xform.auth.key.data = auth_key;
13857         ut_params->auth_xform.auth.digest_length = reference->digest.len;
13858         ut_params->auth_xform.next = NULL;
13859
13860         /* Create Crypto session*/
13861         ut_params->sess = rte_cryptodev_sym_session_create(
13862                         ts_params->session_mpool);
13863         TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed");
13864
13865         status = rte_cryptodev_sym_session_init(ts_params->valid_devs[0],
13866                                 ut_params->sess,
13867                                 &ut_params->cipher_xform,
13868                                 ts_params->session_priv_mpool);
13869
13870         if (status == -ENOTSUP)
13871                 return TEST_SKIPPED;
13872
13873         TEST_ASSERT_EQUAL(status, 0, "Session init failed");
13874
13875         ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
13876         TEST_ASSERT_NOT_NULL(ut_params->ibuf,
13877                         "Failed to allocate input buffer in mempool");
13878
13879         /* clear mbuf payload */
13880         memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
13881                         rte_pktmbuf_tailroom(ut_params->ibuf));
13882
13883         plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
13884                         reference->plaintext.len);
13885         TEST_ASSERT_NOT_NULL(plaintext, "no room to append plaintext");
13886         memcpy(plaintext, reference->plaintext.data, reference->plaintext.len);
13887
13888         /* Create operation */
13889         retval = create_cipher_auth_operation(ts_params,
13890                         ut_params,
13891                         reference, 0);
13892
13893         if (retval < 0)
13894                 return retval;
13895
13896         if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
13897                 process_cpu_crypt_auth_op(ts_params->valid_devs[0],
13898                         ut_params->op);
13899         else if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
13900                 process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
13901                                 ut_params->op, 1, 1, 0, 0);
13902         else
13903                 ut_params->op = process_crypto_request(
13904                         ts_params->valid_devs[0], ut_params->op);
13905
13906         TEST_ASSERT_NOT_NULL(ut_params->op, "no crypto operation returned");
13907
13908         TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
13909                         "crypto op processing failed");
13910
13911         plaintext_pad_len = RTE_ALIGN_CEIL(reference->plaintext.len, 16);
13912
13913         authciphertext = rte_pktmbuf_mtod_offset(ut_params->ibuf, uint8_t *,
13914                         ut_params->op->sym->auth.data.offset);
13915         auth_tag = authciphertext + plaintext_pad_len;
13916         debug_hexdump(stdout, "ciphertext:", authciphertext,
13917                         reference->ciphertext.len);
13918         debug_hexdump(stdout, "auth tag:", auth_tag, reference->digest.len);
13919
13920         /* Validate obuf */
13921         TEST_ASSERT_BUFFERS_ARE_EQUAL(
13922                         authciphertext,
13923                         reference->ciphertext.data,
13924                         reference->ciphertext.len,
13925                         "Ciphertext data not as expected");
13926
13927         TEST_ASSERT_BUFFERS_ARE_EQUAL(
13928                         auth_tag,
13929                         reference->digest.data,
13930                         reference->digest.len,
13931                         "Generated digest not as expected");
13932
13933         return TEST_SUCCESS;
13934
13935 }
13936
13937 static int
13938 test_authenticated_decrypt_with_esn(
13939                 struct crypto_testsuite_params *ts_params,
13940                 struct crypto_unittest_params *ut_params,
13941                 const struct test_crypto_vector *reference)
13942 {
13943         int retval;
13944
13945         uint8_t *ciphertext;
13946         uint8_t cipher_key[reference->cipher_key.len + 1];
13947         uint8_t auth_key[reference->auth_key.len + 1];
13948         struct rte_cryptodev_info dev_info;
13949
13950         rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
13951         uint64_t feat_flags = dev_info.feature_flags;
13952
13953         if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
13954                         (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
13955                 printf("Device doesn't support RAW data-path APIs.\n");
13956                 return TEST_SKIPPED;
13957         }
13958
13959         /* Verify the capabilities */
13960         struct rte_cryptodev_sym_capability_idx cap_idx;
13961         cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
13962         cap_idx.algo.auth = reference->auth_algo;
13963         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
13964                         &cap_idx) == NULL)
13965                 return TEST_SKIPPED;
13966         cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
13967         cap_idx.algo.cipher = reference->crypto_algo;
13968         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
13969                         &cap_idx) == NULL)
13970                 return TEST_SKIPPED;
13971
13972         /* Create session */
13973         memcpy(cipher_key, reference->cipher_key.data,
13974                         reference->cipher_key.len);
13975         memcpy(auth_key, reference->auth_key.data, reference->auth_key.len);
13976
13977         /* Setup Authentication Parameters */
13978         ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;
13979         ut_params->auth_xform.auth.op = RTE_CRYPTO_AUTH_OP_VERIFY;
13980         ut_params->auth_xform.auth.algo = reference->auth_algo;
13981         ut_params->auth_xform.auth.key.length = reference->auth_key.len;
13982         ut_params->auth_xform.auth.key.data = auth_key;
13983         ut_params->auth_xform.auth.digest_length = reference->digest.len;
13984         ut_params->auth_xform.next = &ut_params->cipher_xform;
13985
13986         /* Setup Cipher Parameters */
13987         ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
13988         ut_params->cipher_xform.next = NULL;
13989         ut_params->cipher_xform.cipher.algo = reference->crypto_algo;
13990         ut_params->cipher_xform.cipher.op = RTE_CRYPTO_CIPHER_OP_DECRYPT;
13991         ut_params->cipher_xform.cipher.key.data = cipher_key;
13992         ut_params->cipher_xform.cipher.key.length = reference->cipher_key.len;
13993         ut_params->cipher_xform.cipher.iv.offset = IV_OFFSET;
13994         ut_params->cipher_xform.cipher.iv.length = reference->iv.len;
13995
13996         /* Create Crypto session*/
13997         ut_params->sess = rte_cryptodev_sym_session_create(
13998                         ts_params->session_mpool);
13999         TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed");
14000
14001         retval = rte_cryptodev_sym_session_init(ts_params->valid_devs[0],
14002                                 ut_params->sess,
14003                                 &ut_params->auth_xform,
14004                                 ts_params->session_priv_mpool);
14005
14006         if (retval == -ENOTSUP)
14007                 return TEST_SKIPPED;
14008
14009         TEST_ASSERT_EQUAL(retval, 0, "Session init failed");
14010
14011         ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
14012         TEST_ASSERT_NOT_NULL(ut_params->ibuf,
14013                         "Failed to allocate input buffer in mempool");
14014
14015         /* clear mbuf payload */
14016         memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
14017                         rte_pktmbuf_tailroom(ut_params->ibuf));
14018
14019         ciphertext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
14020                         reference->ciphertext.len);
14021         TEST_ASSERT_NOT_NULL(ciphertext, "no room to append ciphertext");
14022         memcpy(ciphertext, reference->ciphertext.data,
14023                         reference->ciphertext.len);
14024
14025         /* Create operation */
14026         retval = create_cipher_auth_verify_operation(ts_params,
14027                         ut_params,
14028                         reference);
14029
14030         if (retval < 0)
14031                 return retval;
14032
14033         if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
14034                 process_cpu_crypt_auth_op(ts_params->valid_devs[0],
14035                         ut_params->op);
14036         else if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
14037                 process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
14038                                 ut_params->op, 1, 1, 0, 0);
14039         else
14040                 ut_params->op = process_crypto_request(ts_params->valid_devs[0],
14041                         ut_params->op);
14042
14043         TEST_ASSERT_NOT_NULL(ut_params->op, "failed crypto process");
14044         TEST_ASSERT_EQUAL(ut_params->op->status,
14045                         RTE_CRYPTO_OP_STATUS_SUCCESS,
14046                         "crypto op processing passed");
14047
14048         ut_params->obuf = ut_params->op->sym->m_src;
14049         TEST_ASSERT_NOT_NULL(ut_params->obuf, "failed to retrieve obuf");
14050
14051         return 0;
14052 }
14053
14054 static int
14055 create_aead_operation_SGL(enum rte_crypto_aead_operation op,
14056                 const struct aead_test_data *tdata,
14057                 void *digest_mem, uint64_t digest_phys)
14058 {
14059         struct crypto_testsuite_params *ts_params = &testsuite_params;
14060         struct crypto_unittest_params *ut_params = &unittest_params;
14061
14062         const unsigned int auth_tag_len = tdata->auth_tag.len;
14063         const unsigned int iv_len = tdata->iv.len;
14064         unsigned int aad_len = tdata->aad.len;
14065         unsigned int aad_len_pad = 0;
14066
14067         /* Generate Crypto op data structure */
14068         ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
14069                         RTE_CRYPTO_OP_TYPE_SYMMETRIC);
14070         TEST_ASSERT_NOT_NULL(ut_params->op,
14071                 "Failed to allocate symmetric crypto operation struct");
14072
14073         struct rte_crypto_sym_op *sym_op = ut_params->op->sym;
14074
14075         sym_op->aead.digest.data = digest_mem;
14076
14077         TEST_ASSERT_NOT_NULL(sym_op->aead.digest.data,
14078                         "no room to append digest");
14079
14080         sym_op->aead.digest.phys_addr = digest_phys;
14081
14082         if (op == RTE_CRYPTO_AEAD_OP_DECRYPT) {
14083                 rte_memcpy(sym_op->aead.digest.data, tdata->auth_tag.data,
14084                                 auth_tag_len);
14085                 debug_hexdump(stdout, "digest:",
14086                                 sym_op->aead.digest.data,
14087                                 auth_tag_len);
14088         }
14089
14090         /* Append aad data */
14091         if (tdata->algo == RTE_CRYPTO_AEAD_AES_CCM) {
14092                 uint8_t *iv_ptr = rte_crypto_op_ctod_offset(ut_params->op,
14093                                 uint8_t *, IV_OFFSET);
14094
14095                 /* Copy IV 1 byte after the IV pointer, according to the API */
14096                 rte_memcpy(iv_ptr + 1, tdata->iv.data, iv_len);
14097
14098                 aad_len = RTE_ALIGN_CEIL(aad_len + 18, 16);
14099
14100                 sym_op->aead.aad.data = (uint8_t *)rte_pktmbuf_prepend(
14101                                 ut_params->ibuf, aad_len);
14102                 TEST_ASSERT_NOT_NULL(sym_op->aead.aad.data,
14103                                 "no room to prepend aad");
14104                 sym_op->aead.aad.phys_addr = rte_pktmbuf_iova(
14105                                 ut_params->ibuf);
14106
14107                 memset(sym_op->aead.aad.data, 0, aad_len);
14108                 /* Copy AAD 18 bytes after the AAD pointer, according to the API */
14109                 rte_memcpy(sym_op->aead.aad.data, tdata->aad.data, aad_len);
14110
14111                 debug_hexdump(stdout, "iv:", iv_ptr, iv_len);
14112                 debug_hexdump(stdout, "aad:",
14113                                 sym_op->aead.aad.data, aad_len);
14114         } else {
14115                 uint8_t *iv_ptr = rte_crypto_op_ctod_offset(ut_params->op,
14116                                 uint8_t *, IV_OFFSET);
14117
14118                 rte_memcpy(iv_ptr, tdata->iv.data, iv_len);
14119
14120                 aad_len_pad = RTE_ALIGN_CEIL(aad_len, 16);
14121
14122                 sym_op->aead.aad.data = (uint8_t *)rte_pktmbuf_prepend(
14123                                 ut_params->ibuf, aad_len_pad);
14124                 TEST_ASSERT_NOT_NULL(sym_op->aead.aad.data,
14125                                 "no room to prepend aad");
14126                 sym_op->aead.aad.phys_addr = rte_pktmbuf_iova(
14127                                 ut_params->ibuf);
14128
14129                 memset(sym_op->aead.aad.data, 0, aad_len);
14130                 rte_memcpy(sym_op->aead.aad.data, tdata->aad.data, aad_len);
14131
14132                 debug_hexdump(stdout, "iv:", iv_ptr, iv_len);
14133                 debug_hexdump(stdout, "aad:",
14134                                 sym_op->aead.aad.data, aad_len);
14135         }
14136
14137         sym_op->aead.data.length = tdata->plaintext.len;
14138         sym_op->aead.data.offset = aad_len_pad;
14139
14140         return 0;
14141 }
14142
14143 #define SGL_MAX_NO      16
14144
14145 static int
14146 test_authenticated_encryption_SGL(const struct aead_test_data *tdata,
14147                 const int oop, uint32_t fragsz, uint32_t fragsz_oop)
14148 {
14149         struct crypto_testsuite_params *ts_params = &testsuite_params;
14150         struct crypto_unittest_params *ut_params = &unittest_params;
14151         struct rte_mbuf *buf, *buf_oop = NULL, *buf_last_oop = NULL;
14152         int retval;
14153         int to_trn = 0;
14154         int to_trn_tbl[SGL_MAX_NO];
14155         int segs = 1;
14156         unsigned int trn_data = 0;
14157         uint8_t *plaintext, *ciphertext, *auth_tag;
14158         struct rte_cryptodev_info dev_info;
14159
14160         /* Verify the capabilities */
14161         struct rte_cryptodev_sym_capability_idx cap_idx;
14162         cap_idx.type = RTE_CRYPTO_SYM_XFORM_AEAD;
14163         cap_idx.algo.aead = tdata->algo;
14164         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
14165                         &cap_idx) == NULL)
14166                 return TEST_SKIPPED;
14167
14168         /* OOP not supported with CPU crypto */
14169         if (oop && gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
14170                 return TEST_SKIPPED;
14171
14172         /* Detailed check for the particular SGL support flag */
14173         rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
14174         if (!oop) {
14175                 unsigned int sgl_in = fragsz < tdata->plaintext.len;
14176                 if (sgl_in && (!(dev_info.feature_flags &
14177                                 RTE_CRYPTODEV_FF_IN_PLACE_SGL)))
14178                         return TEST_SKIPPED;
14179
14180                 uint64_t feat_flags = dev_info.feature_flags;
14181
14182                 if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
14183                         (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
14184                         printf("Device doesn't support RAW data-path APIs.\n");
14185                         return TEST_SKIPPED;
14186                 }
14187         } else {
14188                 unsigned int sgl_in = fragsz < tdata->plaintext.len;
14189                 unsigned int sgl_out = (fragsz_oop ? fragsz_oop : fragsz) <
14190                                 tdata->plaintext.len;
14191                 /* Raw data path API does not support OOP */
14192                 if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
14193                         return TEST_SKIPPED;
14194                 if (sgl_in && !sgl_out) {
14195                         if (!(dev_info.feature_flags &
14196                                         RTE_CRYPTODEV_FF_OOP_SGL_IN_LB_OUT))
14197                                 return TEST_SKIPPED;
14198                 } else if (!sgl_in && sgl_out) {
14199                         if (!(dev_info.feature_flags &
14200                                         RTE_CRYPTODEV_FF_OOP_LB_IN_SGL_OUT))
14201                                 return TEST_SKIPPED;
14202                 } else if (sgl_in && sgl_out) {
14203                         if (!(dev_info.feature_flags &
14204                                         RTE_CRYPTODEV_FF_OOP_SGL_IN_SGL_OUT))
14205                                 return TEST_SKIPPED;
14206                 }
14207         }
14208
14209         if (fragsz > tdata->plaintext.len)
14210                 fragsz = tdata->plaintext.len;
14211
14212         uint16_t plaintext_len = fragsz;
14213         uint16_t frag_size_oop = fragsz_oop ? fragsz_oop : fragsz;
14214
14215         if (fragsz_oop > tdata->plaintext.len)
14216                 frag_size_oop = tdata->plaintext.len;
14217
14218         int ecx = 0;
14219         void *digest_mem = NULL;
14220
14221         uint32_t prepend_len = RTE_ALIGN_CEIL(tdata->aad.len, 16);
14222
14223         if (tdata->plaintext.len % fragsz != 0) {
14224                 if (tdata->plaintext.len / fragsz + 1 > SGL_MAX_NO)
14225                         return 1;
14226         }       else {
14227                 if (tdata->plaintext.len / fragsz > SGL_MAX_NO)
14228                         return 1;
14229         }
14230
14231         /*
14232          * For out-op-place we need to alloc another mbuf
14233          */
14234         if (oop) {
14235                 ut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
14236                 rte_pktmbuf_append(ut_params->obuf,
14237                                 frag_size_oop + prepend_len);
14238                 buf_oop = ut_params->obuf;
14239         }
14240
14241         /* Create AEAD session */
14242         retval = create_aead_session(ts_params->valid_devs[0],
14243                         tdata->algo,
14244                         RTE_CRYPTO_AEAD_OP_ENCRYPT,
14245                         tdata->key.data, tdata->key.len,
14246                         tdata->aad.len, tdata->auth_tag.len,
14247                         tdata->iv.len);
14248         if (retval < 0)
14249                 return retval;
14250
14251         ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
14252
14253         /* clear mbuf payload */
14254         memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
14255                         rte_pktmbuf_tailroom(ut_params->ibuf));
14256
14257         plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
14258                         plaintext_len);
14259
14260         memcpy(plaintext, tdata->plaintext.data, plaintext_len);
14261
14262         trn_data += plaintext_len;
14263
14264         buf = ut_params->ibuf;
14265
14266         /*
14267          * Loop until no more fragments
14268          */
14269
14270         while (trn_data < tdata->plaintext.len) {
14271                 ++segs;
14272                 to_trn = (tdata->plaintext.len - trn_data < fragsz) ?
14273                                 (tdata->plaintext.len - trn_data) : fragsz;
14274
14275                 to_trn_tbl[ecx++] = to_trn;
14276
14277                 buf->next = rte_pktmbuf_alloc(ts_params->mbuf_pool);
14278                 buf = buf->next;
14279
14280                 memset(rte_pktmbuf_mtod(buf, uint8_t *), 0,
14281                                 rte_pktmbuf_tailroom(buf));
14282
14283                 /* OOP */
14284                 if (oop && !fragsz_oop) {
14285                         buf_last_oop = buf_oop->next =
14286                                         rte_pktmbuf_alloc(ts_params->mbuf_pool);
14287                         buf_oop = buf_oop->next;
14288                         memset(rte_pktmbuf_mtod(buf_oop, uint8_t *),
14289                                         0, rte_pktmbuf_tailroom(buf_oop));
14290                         rte_pktmbuf_append(buf_oop, to_trn);
14291                 }
14292
14293                 plaintext = (uint8_t *)rte_pktmbuf_append(buf,
14294                                 to_trn);
14295
14296                 memcpy(plaintext, tdata->plaintext.data + trn_data,
14297                                 to_trn);
14298                 trn_data += to_trn;
14299                 if (trn_data  == tdata->plaintext.len) {
14300                         if (oop) {
14301                                 if (!fragsz_oop)
14302                                         digest_mem = rte_pktmbuf_append(buf_oop,
14303                                                 tdata->auth_tag.len);
14304                         } else
14305                                 digest_mem = (uint8_t *)rte_pktmbuf_append(buf,
14306                                         tdata->auth_tag.len);
14307                 }
14308         }
14309
14310         uint64_t digest_phys = 0;
14311
14312         ut_params->ibuf->nb_segs = segs;
14313
14314         segs = 1;
14315         if (fragsz_oop && oop) {
14316                 to_trn = 0;
14317                 ecx = 0;
14318
14319                 if (frag_size_oop == tdata->plaintext.len) {
14320                         digest_mem = rte_pktmbuf_append(ut_params->obuf,
14321                                 tdata->auth_tag.len);
14322
14323                         digest_phys = rte_pktmbuf_iova_offset(
14324                                         ut_params->obuf,
14325                                         tdata->plaintext.len + prepend_len);
14326                 }
14327
14328                 trn_data = frag_size_oop;
14329                 while (trn_data < tdata->plaintext.len) {
14330                         ++segs;
14331                         to_trn =
14332                                 (tdata->plaintext.len - trn_data <
14333                                                 frag_size_oop) ?
14334                                 (tdata->plaintext.len - trn_data) :
14335                                                 frag_size_oop;
14336
14337                         to_trn_tbl[ecx++] = to_trn;
14338
14339                         buf_last_oop = buf_oop->next =
14340                                         rte_pktmbuf_alloc(ts_params->mbuf_pool);
14341                         buf_oop = buf_oop->next;
14342                         memset(rte_pktmbuf_mtod(buf_oop, uint8_t *),
14343                                         0, rte_pktmbuf_tailroom(buf_oop));
14344                         rte_pktmbuf_append(buf_oop, to_trn);
14345
14346                         trn_data += to_trn;
14347
14348                         if (trn_data  == tdata->plaintext.len) {
14349                                 digest_mem = rte_pktmbuf_append(buf_oop,
14350                                         tdata->auth_tag.len);
14351                         }
14352                 }
14353
14354                 ut_params->obuf->nb_segs = segs;
14355         }
14356
14357         /*
14358          * Place digest at the end of the last buffer
14359          */
14360         if (!digest_phys)
14361                 digest_phys = rte_pktmbuf_iova(buf) + to_trn;
14362         if (oop && buf_last_oop)
14363                 digest_phys = rte_pktmbuf_iova(buf_last_oop) + to_trn;
14364
14365         if (!digest_mem && !oop) {
14366                 digest_mem = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
14367                                 + tdata->auth_tag.len);
14368                 digest_phys = rte_pktmbuf_iova_offset(ut_params->ibuf,
14369                                 tdata->plaintext.len);
14370         }
14371
14372         /* Create AEAD operation */
14373         retval = create_aead_operation_SGL(RTE_CRYPTO_AEAD_OP_ENCRYPT,
14374                         tdata, digest_mem, digest_phys);
14375
14376         if (retval < 0)
14377                 return retval;
14378
14379         rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
14380
14381         ut_params->op->sym->m_src = ut_params->ibuf;
14382         if (oop)
14383                 ut_params->op->sym->m_dst = ut_params->obuf;
14384
14385         /* Process crypto operation */
14386         if (oop == IN_PLACE &&
14387                         gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
14388                 process_cpu_aead_op(ts_params->valid_devs[0], ut_params->op);
14389         else if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
14390                 process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
14391                                 ut_params->op, 0, 0, 0, 0);
14392         else
14393                 TEST_ASSERT_NOT_NULL(
14394                         process_crypto_request(ts_params->valid_devs[0],
14395                         ut_params->op), "failed to process sym crypto op");
14396
14397         TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
14398                         "crypto op processing failed");
14399
14400
14401         ciphertext = rte_pktmbuf_mtod_offset(ut_params->op->sym->m_src,
14402                         uint8_t *, prepend_len);
14403         if (oop) {
14404                 ciphertext = rte_pktmbuf_mtod_offset(ut_params->op->sym->m_dst,
14405                                 uint8_t *, prepend_len);
14406         }
14407
14408         if (fragsz_oop)
14409                 fragsz = fragsz_oop;
14410
14411         TEST_ASSERT_BUFFERS_ARE_EQUAL(
14412                         ciphertext,
14413                         tdata->ciphertext.data,
14414                         fragsz,
14415                         "Ciphertext data not as expected");
14416
14417         buf = ut_params->op->sym->m_src->next;
14418         if (oop)
14419                 buf = ut_params->op->sym->m_dst->next;
14420
14421         unsigned int off = fragsz;
14422
14423         ecx = 0;
14424         while (buf) {
14425                 ciphertext = rte_pktmbuf_mtod(buf,
14426                                 uint8_t *);
14427
14428                 TEST_ASSERT_BUFFERS_ARE_EQUAL(
14429                                 ciphertext,
14430                                 tdata->ciphertext.data + off,
14431                                 to_trn_tbl[ecx],
14432                                 "Ciphertext data not as expected");
14433
14434                 off += to_trn_tbl[ecx++];
14435                 buf = buf->next;
14436         }
14437
14438         auth_tag = digest_mem;
14439         TEST_ASSERT_BUFFERS_ARE_EQUAL(
14440                         auth_tag,
14441                         tdata->auth_tag.data,
14442                         tdata->auth_tag.len,
14443                         "Generated auth tag not as expected");
14444
14445         return 0;
14446 }
14447
14448 static int
14449 test_AES_GCM_auth_encrypt_SGL_out_of_place_400B_400B(void)
14450 {
14451         return test_authenticated_encryption_SGL(
14452                         &gcm_test_case_SGL_1, OUT_OF_PLACE, 400, 400);
14453 }
14454
14455 static int
14456 test_AES_GCM_auth_encrypt_SGL_out_of_place_1500B_2000B(void)
14457 {
14458         return test_authenticated_encryption_SGL(
14459                         &gcm_test_case_SGL_1, OUT_OF_PLACE, 1500, 2000);
14460 }
14461
14462 static int
14463 test_AES_GCM_auth_encrypt_SGL_out_of_place_400B_1seg(void)
14464 {
14465         return test_authenticated_encryption_SGL(
14466                         &gcm_test_case_8, OUT_OF_PLACE, 400,
14467                         gcm_test_case_8.plaintext.len);
14468 }
14469
14470 static int
14471 test_AES_GCM_auth_encrypt_SGL_in_place_1500B(void)
14472 {
14473         /* This test is not for OPENSSL PMD */
14474         if (gbl_driver_id == rte_cryptodev_driver_id_get(
14475                         RTE_STR(CRYPTODEV_NAME_OPENSSL_PMD)))
14476                 return TEST_SKIPPED;
14477
14478         return test_authenticated_encryption_SGL(
14479                         &gcm_test_case_SGL_1, IN_PLACE, 1500, 0);
14480 }
14481
14482 static int
14483 test_authentication_verify_fail_when_data_corrupted(
14484                 struct crypto_testsuite_params *ts_params,
14485                 struct crypto_unittest_params *ut_params,
14486                 const struct test_crypto_vector *reference)
14487 {
14488         return test_authentication_verify_fail_when_data_corruption(
14489                         ts_params, ut_params, reference, 1);
14490 }
14491
14492 static int
14493 test_authentication_verify_fail_when_tag_corrupted(
14494                 struct crypto_testsuite_params *ts_params,
14495                 struct crypto_unittest_params *ut_params,
14496                 const struct test_crypto_vector *reference)
14497 {
14498         return test_authentication_verify_fail_when_data_corruption(
14499                         ts_params, ut_params, reference, 0);
14500 }
14501
14502 static int
14503 test_authentication_verify_GMAC_fail_when_data_corrupted(
14504                 struct crypto_testsuite_params *ts_params,
14505                 struct crypto_unittest_params *ut_params,
14506                 const struct test_crypto_vector *reference)
14507 {
14508         return test_authentication_verify_GMAC_fail_when_corruption(
14509                         ts_params, ut_params, reference, 1);
14510 }
14511
14512 static int
14513 test_authentication_verify_GMAC_fail_when_tag_corrupted(
14514                 struct crypto_testsuite_params *ts_params,
14515                 struct crypto_unittest_params *ut_params,
14516                 const struct test_crypto_vector *reference)
14517 {
14518         return test_authentication_verify_GMAC_fail_when_corruption(
14519                         ts_params, ut_params, reference, 0);
14520 }
14521
14522 static int
14523 test_authenticated_decryption_fail_when_data_corrupted(
14524                 struct crypto_testsuite_params *ts_params,
14525                 struct crypto_unittest_params *ut_params,
14526                 const struct test_crypto_vector *reference)
14527 {
14528         return test_authenticated_decryption_fail_when_corruption(
14529                         ts_params, ut_params, reference, 1);
14530 }
14531
14532 static int
14533 test_authenticated_decryption_fail_when_tag_corrupted(
14534                 struct crypto_testsuite_params *ts_params,
14535                 struct crypto_unittest_params *ut_params,
14536                 const struct test_crypto_vector *reference)
14537 {
14538         return test_authenticated_decryption_fail_when_corruption(
14539                         ts_params, ut_params, reference, 0);
14540 }
14541
14542 static int
14543 authentication_verify_HMAC_SHA1_fail_data_corrupt(void)
14544 {
14545         return test_authentication_verify_fail_when_data_corrupted(
14546                         &testsuite_params, &unittest_params,
14547                         &hmac_sha1_test_crypto_vector);
14548 }
14549
14550 static int
14551 authentication_verify_HMAC_SHA1_fail_tag_corrupt(void)
14552 {
14553         return test_authentication_verify_fail_when_tag_corrupted(
14554                         &testsuite_params, &unittest_params,
14555                         &hmac_sha1_test_crypto_vector);
14556 }
14557
14558 static int
14559 authentication_verify_AES128_GMAC_fail_data_corrupt(void)
14560 {
14561         return test_authentication_verify_GMAC_fail_when_data_corrupted(
14562                         &testsuite_params, &unittest_params,
14563                         &aes128_gmac_test_vector);
14564 }
14565
14566 static int
14567 authentication_verify_AES128_GMAC_fail_tag_corrupt(void)
14568 {
14569         return test_authentication_verify_GMAC_fail_when_tag_corrupted(
14570                         &testsuite_params, &unittest_params,
14571                         &aes128_gmac_test_vector);
14572 }
14573
14574 static int
14575 auth_decryption_AES128CBC_HMAC_SHA1_fail_data_corrupt(void)
14576 {
14577         return test_authenticated_decryption_fail_when_data_corrupted(
14578                         &testsuite_params,
14579                         &unittest_params,
14580                         &aes128cbc_hmac_sha1_test_vector);
14581 }
14582
14583 static int
14584 auth_decryption_AES128CBC_HMAC_SHA1_fail_tag_corrupt(void)
14585 {
14586         return test_authenticated_decryption_fail_when_tag_corrupted(
14587                         &testsuite_params,
14588                         &unittest_params,
14589                         &aes128cbc_hmac_sha1_test_vector);
14590 }
14591
14592 static int
14593 auth_encrypt_AES128CBC_HMAC_SHA1_esn_check(void)
14594 {
14595         return test_authenticated_encrypt_with_esn(
14596                         &testsuite_params,
14597                         &unittest_params,
14598                         &aes128cbc_hmac_sha1_aad_test_vector);
14599 }
14600
14601 static int
14602 auth_decrypt_AES128CBC_HMAC_SHA1_esn_check(void)
14603 {
14604         return test_authenticated_decrypt_with_esn(
14605                         &testsuite_params,
14606                         &unittest_params,
14607                         &aes128cbc_hmac_sha1_aad_test_vector);
14608 }
14609
14610 static int
14611 test_chacha20_poly1305_encrypt_test_case_rfc8439(void)
14612 {
14613         return test_authenticated_encryption(&chacha20_poly1305_case_rfc8439);
14614 }
14615
14616 static int
14617 test_chacha20_poly1305_decrypt_test_case_rfc8439(void)
14618 {
14619         return test_authenticated_decryption(&chacha20_poly1305_case_rfc8439);
14620 }
14621
14622 static int
14623 test_chacha20_poly1305_encrypt_SGL_out_of_place(void)
14624 {
14625         return test_authenticated_encryption_SGL(
14626                 &chacha20_poly1305_case_2, OUT_OF_PLACE, 32,
14627                 chacha20_poly1305_case_2.plaintext.len);
14628 }
14629
14630 #ifdef RTE_CRYPTO_SCHEDULER
14631
14632 /* global AESNI worker IDs for the scheduler test */
14633 uint8_t aesni_ids[2];
14634
14635 static int
14636 scheduler_testsuite_setup(void)
14637 {
14638         uint32_t i = 0;
14639         int32_t nb_devs, ret;
14640         char vdev_args[VDEV_ARGS_SIZE] = {""};
14641         char temp_str[VDEV_ARGS_SIZE] = {"mode=multi-core,"
14642                 "ordering=enable,name=cryptodev_test_scheduler,corelist="};
14643         uint16_t worker_core_count = 0;
14644         uint16_t socket_id = 0;
14645
14646         if (gbl_driver_id == rte_cryptodev_driver_id_get(
14647                         RTE_STR(CRYPTODEV_NAME_SCHEDULER_PMD))) {
14648
14649                 /* Identify the Worker Cores
14650                  * Use 2 worker cores for the device args
14651                  */
14652                 RTE_LCORE_FOREACH_WORKER(i) {
14653                         if (worker_core_count > 1)
14654                                 break;
14655                         snprintf(vdev_args, sizeof(vdev_args),
14656                                         "%s%d", temp_str, i);
14657                         strcpy(temp_str, vdev_args);
14658                         strlcat(temp_str, ";", sizeof(temp_str));
14659                         worker_core_count++;
14660                         socket_id = rte_lcore_to_socket_id(i);
14661                 }
14662                 if (worker_core_count != 2) {
14663                         RTE_LOG(ERR, USER1,
14664                                 "Cryptodev scheduler test require at least "
14665                                 "two worker cores to run. "
14666                                 "Please use the correct coremask.\n");
14667                         return TEST_FAILED;
14668                 }
14669                 strcpy(temp_str, vdev_args);
14670                 snprintf(vdev_args, sizeof(vdev_args), "%s,socket_id=%d",
14671                                 temp_str, socket_id);
14672                 RTE_LOG(DEBUG, USER1, "vdev_args: %s\n", vdev_args);
14673                 nb_devs = rte_cryptodev_device_count_by_driver(
14674                                 rte_cryptodev_driver_id_get(
14675                                 RTE_STR(CRYPTODEV_NAME_SCHEDULER_PMD)));
14676                 if (nb_devs < 1) {
14677                         ret = rte_vdev_init(
14678                                 RTE_STR(CRYPTODEV_NAME_SCHEDULER_PMD),
14679                                         vdev_args);
14680                         TEST_ASSERT(ret == 0,
14681                                 "Failed to create instance %u of pmd : %s",
14682                                 i, RTE_STR(CRYPTODEV_NAME_SCHEDULER_PMD));
14683                 }
14684         }
14685         return testsuite_setup();
14686 }
14687
14688 static int
14689 test_scheduler_attach_worker_op(void)
14690 {
14691         struct crypto_testsuite_params *ts_params = &testsuite_params;
14692         uint8_t sched_id = ts_params->valid_devs[0];
14693         uint32_t i, nb_devs_attached = 0;
14694         int ret;
14695         char vdev_name[32];
14696         unsigned int count = rte_cryptodev_count();
14697
14698         /* create 2 AESNI_MB vdevs on top of existing devices */
14699         for (i = count; i < count + 2; i++) {
14700                 snprintf(vdev_name, sizeof(vdev_name), "%s_%u",
14701                                 RTE_STR(CRYPTODEV_NAME_AESNI_MB_PMD),
14702                                 i);
14703                 ret = rte_vdev_init(vdev_name, NULL);
14704
14705                 TEST_ASSERT(ret == 0,
14706                         "Failed to create instance %u of"
14707                         " pmd : %s",
14708                         i, RTE_STR(CRYPTODEV_NAME_AESNI_MB_PMD));
14709
14710                 if (ret < 0) {
14711                         RTE_LOG(ERR, USER1,
14712                                 "Failed to create 2 AESNI MB PMDs.\n");
14713                         return TEST_SKIPPED;
14714                 }
14715         }
14716
14717         /* attach 2 AESNI_MB cdevs */
14718         for (i = count; i < count + 2; i++) {
14719                 struct rte_cryptodev_info info;
14720                 unsigned int session_size;
14721
14722                 rte_cryptodev_info_get(i, &info);
14723                 if (info.driver_id != rte_cryptodev_driver_id_get(
14724                                 RTE_STR(CRYPTODEV_NAME_AESNI_MB_PMD)))
14725                         continue;
14726
14727                 session_size = rte_cryptodev_sym_get_private_session_size(i);
14728                 /*
14729                  * Create the session mempool again, since now there are new devices
14730                  * to use the mempool.
14731                  */
14732                 if (ts_params->session_mpool) {
14733                         rte_mempool_free(ts_params->session_mpool);
14734                         ts_params->session_mpool = NULL;
14735                 }
14736                 if (ts_params->session_priv_mpool) {
14737                         rte_mempool_free(ts_params->session_priv_mpool);
14738                         ts_params->session_priv_mpool = NULL;
14739                 }
14740
14741                 if (info.sym.max_nb_sessions != 0 &&
14742                                 info.sym.max_nb_sessions < MAX_NB_SESSIONS) {
14743                         RTE_LOG(ERR, USER1,
14744                                         "Device does not support "
14745                                         "at least %u sessions\n",
14746                                         MAX_NB_SESSIONS);
14747                         return TEST_FAILED;
14748                 }
14749                 /*
14750                  * Create mempool with maximum number of sessions,
14751                  * to include the session headers
14752                  */
14753                 if (ts_params->session_mpool == NULL) {
14754                         ts_params->session_mpool =
14755                                 rte_cryptodev_sym_session_pool_create(
14756                                                 "test_sess_mp",
14757                                                 MAX_NB_SESSIONS, 0, 0, 0,
14758                                                 SOCKET_ID_ANY);
14759                         TEST_ASSERT_NOT_NULL(ts_params->session_mpool,
14760                                         "session mempool allocation failed");
14761                 }
14762
14763                 /*
14764                  * Create mempool with maximum number of sessions,
14765                  * to include device specific session private data
14766                  */
14767                 if (ts_params->session_priv_mpool == NULL) {
14768                         ts_params->session_priv_mpool = rte_mempool_create(
14769                                         "test_sess_mp_priv",
14770                                         MAX_NB_SESSIONS,
14771                                         session_size,
14772                                         0, 0, NULL, NULL, NULL,
14773                                         NULL, SOCKET_ID_ANY,
14774                                         0);
14775
14776                         TEST_ASSERT_NOT_NULL(ts_params->session_priv_mpool,
14777                                         "session mempool allocation failed");
14778                 }
14779
14780                 ts_params->qp_conf.mp_session = ts_params->session_mpool;
14781                 ts_params->qp_conf.mp_session_private =
14782                                 ts_params->session_priv_mpool;
14783
14784                 ret = rte_cryptodev_scheduler_worker_attach(sched_id,
14785                                 (uint8_t)i);
14786
14787                 TEST_ASSERT(ret == 0,
14788                         "Failed to attach device %u of pmd : %s", i,
14789                         RTE_STR(CRYPTODEV_NAME_AESNI_MB_PMD));
14790
14791                 aesni_ids[nb_devs_attached] = (uint8_t)i;
14792
14793                 nb_devs_attached++;
14794         }
14795
14796         return 0;
14797 }
14798
14799 static int
14800 test_scheduler_detach_worker_op(void)
14801 {
14802         struct crypto_testsuite_params *ts_params = &testsuite_params;
14803         uint8_t sched_id = ts_params->valid_devs[0];
14804         uint32_t i;
14805         int ret;
14806
14807         for (i = 0; i < 2; i++) {
14808                 ret = rte_cryptodev_scheduler_worker_detach(sched_id,
14809                                 aesni_ids[i]);
14810                 TEST_ASSERT(ret == 0,
14811                         "Failed to detach device %u", aesni_ids[i]);
14812         }
14813
14814         return 0;
14815 }
14816
14817 static int
14818 test_scheduler_mode_op(enum rte_cryptodev_scheduler_mode scheduler_mode)
14819 {
14820         struct crypto_testsuite_params *ts_params = &testsuite_params;
14821         uint8_t sched_id = ts_params->valid_devs[0];
14822         /* set mode */
14823         return rte_cryptodev_scheduler_mode_set(sched_id,
14824                 scheduler_mode);
14825 }
14826
14827 static int
14828 test_scheduler_mode_roundrobin_op(void)
14829 {
14830         TEST_ASSERT(test_scheduler_mode_op(CDEV_SCHED_MODE_ROUNDROBIN) ==
14831                         0, "Failed to set roundrobin mode");
14832         return 0;
14833
14834 }
14835
14836 static int
14837 test_scheduler_mode_multicore_op(void)
14838 {
14839         TEST_ASSERT(test_scheduler_mode_op(CDEV_SCHED_MODE_MULTICORE) ==
14840                         0, "Failed to set multicore mode");
14841
14842         return 0;
14843 }
14844
14845 static int
14846 test_scheduler_mode_failover_op(void)
14847 {
14848         TEST_ASSERT(test_scheduler_mode_op(CDEV_SCHED_MODE_FAILOVER) ==
14849                         0, "Failed to set failover mode");
14850
14851         return 0;
14852 }
14853
14854 static int
14855 test_scheduler_mode_pkt_size_distr_op(void)
14856 {
14857         TEST_ASSERT(test_scheduler_mode_op(CDEV_SCHED_MODE_PKT_SIZE_DISTR) ==
14858                         0, "Failed to set pktsize mode");
14859
14860         return 0;
14861 }
14862
14863 static int
14864 scheduler_multicore_testsuite_setup(void)
14865 {
14866         if (test_scheduler_attach_worker_op() < 0)
14867                 return TEST_SKIPPED;
14868         if (test_scheduler_mode_op(CDEV_SCHED_MODE_MULTICORE) < 0)
14869                 return TEST_SKIPPED;
14870         return 0;
14871 }
14872
14873 static int
14874 scheduler_roundrobin_testsuite_setup(void)
14875 {
14876         if (test_scheduler_attach_worker_op() < 0)
14877                 return TEST_SKIPPED;
14878         if (test_scheduler_mode_op(CDEV_SCHED_MODE_ROUNDROBIN) < 0)
14879                 return TEST_SKIPPED;
14880         return 0;
14881 }
14882
14883 static int
14884 scheduler_failover_testsuite_setup(void)
14885 {
14886         if (test_scheduler_attach_worker_op() < 0)
14887                 return TEST_SKIPPED;
14888         if (test_scheduler_mode_op(CDEV_SCHED_MODE_FAILOVER) < 0)
14889                 return TEST_SKIPPED;
14890         return 0;
14891 }
14892
14893 static int
14894 scheduler_pkt_size_distr_testsuite_setup(void)
14895 {
14896         if (test_scheduler_attach_worker_op() < 0)
14897                 return TEST_SKIPPED;
14898         if (test_scheduler_mode_op(CDEV_SCHED_MODE_PKT_SIZE_DISTR) < 0)
14899                 return TEST_SKIPPED;
14900         return 0;
14901 }
14902
14903 static void
14904 scheduler_mode_testsuite_teardown(void)
14905 {
14906         test_scheduler_detach_worker_op();
14907 }
14908
14909 #endif /* RTE_CRYPTO_SCHEDULER */
14910
14911 static struct unit_test_suite end_testsuite = {
14912         .suite_name = NULL,
14913         .setup = NULL,
14914         .teardown = NULL,
14915         .unit_test_suites = NULL
14916 };
14917
14918 #ifdef RTE_LIB_SECURITY
14919 static struct unit_test_suite ipsec_proto_testsuite  = {
14920         .suite_name = "IPsec Proto Unit Test Suite",
14921         .setup = ipsec_proto_testsuite_setup,
14922         .unit_test_cases = {
14923                 TEST_CASE_NAMED_WITH_DATA(
14924                         "Outbound known vector (ESP tunnel mode IPv4 AES-GCM 128)",
14925                         ut_setup_security, ut_teardown,
14926                         test_ipsec_proto_known_vec, &pkt_aes_128_gcm),
14927                 TEST_CASE_NAMED_WITH_DATA(
14928                         "Outbound known vector (ESP tunnel mode IPv4 AES-GCM 192)",
14929                         ut_setup_security, ut_teardown,
14930                         test_ipsec_proto_known_vec, &pkt_aes_192_gcm),
14931                 TEST_CASE_NAMED_WITH_DATA(
14932                         "Outbound known vector (ESP tunnel mode IPv4 AES-GCM 256)",
14933                         ut_setup_security, ut_teardown,
14934                         test_ipsec_proto_known_vec, &pkt_aes_256_gcm),
14935                 TEST_CASE_NAMED_WITH_DATA(
14936                         "Outbound known vector (ESP tunnel mode IPv4 AES-CBC 128 HMAC-SHA256 [16B ICV])",
14937                         ut_setup_security, ut_teardown,
14938                         test_ipsec_proto_known_vec,
14939                         &pkt_aes_128_cbc_hmac_sha256),
14940                 TEST_CASE_NAMED_WITH_DATA(
14941                         "Outbound known vector (ESP tunnel mode IPv4 AES-CBC 128 HMAC-SHA384 [24B ICV])",
14942                         ut_setup_security, ut_teardown,
14943                         test_ipsec_proto_known_vec,
14944                         &pkt_aes_128_cbc_hmac_sha384),
14945                 TEST_CASE_NAMED_WITH_DATA(
14946                         "Outbound known vector (ESP tunnel mode IPv4 AES-CBC 128 HMAC-SHA512 [32B ICV])",
14947                         ut_setup_security, ut_teardown,
14948                         test_ipsec_proto_known_vec,
14949                         &pkt_aes_128_cbc_hmac_sha512),
14950                 TEST_CASE_NAMED_WITH_DATA(
14951                         "Outbound known vector (ESP tunnel mode IPv6 AES-GCM 128)",
14952                         ut_setup_security, ut_teardown,
14953                         test_ipsec_proto_known_vec, &pkt_aes_256_gcm_v6),
14954                 TEST_CASE_NAMED_WITH_DATA(
14955                         "Outbound known vector (ESP tunnel mode IPv6 AES-CBC 128 HMAC-SHA256 [16B ICV])",
14956                         ut_setup_security, ut_teardown,
14957                         test_ipsec_proto_known_vec,
14958                         &pkt_aes_128_cbc_hmac_sha256_v6),
14959                 TEST_CASE_NAMED_WITH_DATA(
14960                         "Outbound known vector (ESP tunnel mode IPv4 NULL AES-XCBC-MAC [12B ICV])",
14961                         ut_setup_security, ut_teardown,
14962                         test_ipsec_proto_known_vec,
14963                         &pkt_null_aes_xcbc),
14964                 TEST_CASE_NAMED_WITH_DATA(
14965                         "Outbound fragmented packet",
14966                         ut_setup_security, ut_teardown,
14967                         test_ipsec_proto_known_vec_fragmented,
14968                         &pkt_aes_128_gcm_frag),
14969                 TEST_CASE_NAMED_WITH_DATA(
14970                         "Inbound known vector (ESP tunnel mode IPv4 AES-GCM 128)",
14971                         ut_setup_security, ut_teardown,
14972                         test_ipsec_proto_known_vec_inb, &pkt_aes_128_gcm),
14973                 TEST_CASE_NAMED_WITH_DATA(
14974                         "Inbound known vector (ESP tunnel mode IPv4 AES-GCM 192)",
14975                         ut_setup_security, ut_teardown,
14976                         test_ipsec_proto_known_vec_inb, &pkt_aes_192_gcm),
14977                 TEST_CASE_NAMED_WITH_DATA(
14978                         "Inbound known vector (ESP tunnel mode IPv4 AES-GCM 256)",
14979                         ut_setup_security, ut_teardown,
14980                         test_ipsec_proto_known_vec_inb, &pkt_aes_256_gcm),
14981                 TEST_CASE_NAMED_WITH_DATA(
14982                         "Inbound known vector (ESP tunnel mode IPv4 AES-CBC 128)",
14983                         ut_setup_security, ut_teardown,
14984                         test_ipsec_proto_known_vec_inb, &pkt_aes_128_cbc_null),
14985                 TEST_CASE_NAMED_WITH_DATA(
14986                         "Inbound known vector (ESP tunnel mode IPv4 AES-CBC 128 HMAC-SHA256 [16B ICV])",
14987                         ut_setup_security, ut_teardown,
14988                         test_ipsec_proto_known_vec_inb,
14989                         &pkt_aes_128_cbc_hmac_sha256),
14990                 TEST_CASE_NAMED_WITH_DATA(
14991                         "Inbound known vector (ESP tunnel mode IPv4 AES-CBC 128 HMAC-SHA384 [24B ICV])",
14992                         ut_setup_security, ut_teardown,
14993                         test_ipsec_proto_known_vec_inb,
14994                         &pkt_aes_128_cbc_hmac_sha384),
14995                 TEST_CASE_NAMED_WITH_DATA(
14996                         "Inbound known vector (ESP tunnel mode IPv4 AES-CBC 128 HMAC-SHA512 [32B ICV])",
14997                         ut_setup_security, ut_teardown,
14998                         test_ipsec_proto_known_vec_inb,
14999                         &pkt_aes_128_cbc_hmac_sha512),
15000                 TEST_CASE_NAMED_WITH_DATA(
15001                         "Inbound known vector (ESP tunnel mode IPv6 AES-GCM 128)",
15002                         ut_setup_security, ut_teardown,
15003                         test_ipsec_proto_known_vec_inb, &pkt_aes_256_gcm_v6),
15004                 TEST_CASE_NAMED_WITH_DATA(
15005                         "Inbound known vector (ESP tunnel mode IPv6 AES-CBC 128 HMAC-SHA256 [16B ICV])",
15006                         ut_setup_security, ut_teardown,
15007                         test_ipsec_proto_known_vec_inb,
15008                         &pkt_aes_128_cbc_hmac_sha256_v6),
15009                 TEST_CASE_NAMED_WITH_DATA(
15010                         "Inbound known vector (ESP tunnel mode IPv4 NULL AES-XCBC-MAC [12B ICV])",
15011                         ut_setup_security, ut_teardown,
15012                         test_ipsec_proto_known_vec_inb,
15013                         &pkt_null_aes_xcbc),
15014                 TEST_CASE_NAMED_ST(
15015                         "Combined test alg list",
15016                         ut_setup_security, ut_teardown,
15017                         test_ipsec_proto_display_list),
15018                 TEST_CASE_NAMED_ST(
15019                         "IV generation",
15020                         ut_setup_security, ut_teardown,
15021                         test_ipsec_proto_iv_gen),
15022                 TEST_CASE_NAMED_ST(
15023                         "UDP encapsulation",
15024                         ut_setup_security, ut_teardown,
15025                         test_ipsec_proto_udp_encap),
15026                 TEST_CASE_NAMED_ST(
15027                         "UDP encapsulation ports verification test",
15028                         ut_setup_security, ut_teardown,
15029                         test_ipsec_proto_udp_ports_verify),
15030                 TEST_CASE_NAMED_ST(
15031                         "SA expiry packets soft",
15032                         ut_setup_security, ut_teardown,
15033                         test_ipsec_proto_sa_exp_pkts_soft),
15034                 TEST_CASE_NAMED_ST(
15035                         "SA expiry packets hard",
15036                         ut_setup_security, ut_teardown,
15037                         test_ipsec_proto_sa_exp_pkts_hard),
15038                 TEST_CASE_NAMED_ST(
15039                         "Negative test: ICV corruption",
15040                         ut_setup_security, ut_teardown,
15041                         test_ipsec_proto_err_icv_corrupt),
15042                 TEST_CASE_NAMED_ST(
15043                         "Tunnel dst addr verification",
15044                         ut_setup_security, ut_teardown,
15045                         test_ipsec_proto_tunnel_dst_addr_verify),
15046                 TEST_CASE_NAMED_ST(
15047                         "Tunnel src and dst addr verification",
15048                         ut_setup_security, ut_teardown,
15049                         test_ipsec_proto_tunnel_src_dst_addr_verify),
15050                 TEST_CASE_NAMED_ST(
15051                         "Inner IP checksum",
15052                         ut_setup_security, ut_teardown,
15053                         test_ipsec_proto_inner_ip_csum),
15054                 TEST_CASE_NAMED_ST(
15055                         "Inner L4 checksum",
15056                         ut_setup_security, ut_teardown,
15057                         test_ipsec_proto_inner_l4_csum),
15058                 TEST_CASE_NAMED_ST(
15059                         "Tunnel IPv4 in IPv4",
15060                         ut_setup_security, ut_teardown,
15061                         test_ipsec_proto_tunnel_v4_in_v4),
15062                 TEST_CASE_NAMED_ST(
15063                         "Tunnel IPv6 in IPv6",
15064                         ut_setup_security, ut_teardown,
15065                         test_ipsec_proto_tunnel_v6_in_v6),
15066                 TEST_CASE_NAMED_ST(
15067                         "Tunnel IPv4 in IPv6",
15068                         ut_setup_security, ut_teardown,
15069                         test_ipsec_proto_tunnel_v4_in_v6),
15070                 TEST_CASE_NAMED_ST(
15071                         "Tunnel IPv6 in IPv4",
15072                         ut_setup_security, ut_teardown,
15073                         test_ipsec_proto_tunnel_v6_in_v4),
15074                 TEST_CASE_NAMED_ST(
15075                         "Transport IPv4",
15076                         ut_setup_security, ut_teardown,
15077                         test_ipsec_proto_transport_v4),
15078                 TEST_CASE_NAMED_ST(
15079                         "Statistics: success",
15080                         ut_setup_security, ut_teardown,
15081                         test_ipsec_proto_stats),
15082                 TEST_CASE_NAMED_ST(
15083                         "Fragmented packet",
15084                         ut_setup_security, ut_teardown,
15085                         test_ipsec_proto_pkt_fragment),
15086                 TEST_CASE_NAMED_ST(
15087                         "Tunnel header copy DF (inner 0)",
15088                         ut_setup_security, ut_teardown,
15089                         test_ipsec_proto_copy_df_inner_0),
15090                 TEST_CASE_NAMED_ST(
15091                         "Tunnel header copy DF (inner 1)",
15092                         ut_setup_security, ut_teardown,
15093                         test_ipsec_proto_copy_df_inner_1),
15094                 TEST_CASE_NAMED_ST(
15095                         "Tunnel header set DF 0 (inner 1)",
15096                         ut_setup_security, ut_teardown,
15097                         test_ipsec_proto_set_df_0_inner_1),
15098                 TEST_CASE_NAMED_ST(
15099                         "Tunnel header set DF 1 (inner 0)",
15100                         ut_setup_security, ut_teardown,
15101                         test_ipsec_proto_set_df_1_inner_0),
15102                 TEST_CASE_NAMED_ST(
15103                         "Tunnel header IPv4 copy DSCP (inner 0)",
15104                         ut_setup_security, ut_teardown,
15105                         test_ipsec_proto_ipv4_copy_dscp_inner_0),
15106                 TEST_CASE_NAMED_ST(
15107                         "Tunnel header IPv4 copy DSCP (inner 1)",
15108                         ut_setup_security, ut_teardown,
15109                         test_ipsec_proto_ipv4_copy_dscp_inner_1),
15110                 TEST_CASE_NAMED_ST(
15111                         "Tunnel header IPv4 set DSCP 0 (inner 1)",
15112                         ut_setup_security, ut_teardown,
15113                         test_ipsec_proto_ipv4_set_dscp_0_inner_1),
15114                 TEST_CASE_NAMED_ST(
15115                         "Tunnel header IPv4 set DSCP 1 (inner 0)",
15116                         ut_setup_security, ut_teardown,
15117                         test_ipsec_proto_ipv4_set_dscp_1_inner_0),
15118                 TEST_CASE_NAMED_ST(
15119                         "Tunnel header IPv6 copy DSCP (inner 0)",
15120                         ut_setup_security, ut_teardown,
15121                         test_ipsec_proto_ipv6_copy_dscp_inner_0),
15122                 TEST_CASE_NAMED_ST(
15123                         "Tunnel header IPv6 copy DSCP (inner 1)",
15124                         ut_setup_security, ut_teardown,
15125                         test_ipsec_proto_ipv6_copy_dscp_inner_1),
15126                 TEST_CASE_NAMED_ST(
15127                         "Tunnel header IPv6 set DSCP 0 (inner 1)",
15128                         ut_setup_security, ut_teardown,
15129                         test_ipsec_proto_ipv6_set_dscp_0_inner_1),
15130                 TEST_CASE_NAMED_ST(
15131                         "Tunnel header IPv6 set DSCP 1 (inner 0)",
15132                         ut_setup_security, ut_teardown,
15133                         test_ipsec_proto_ipv6_set_dscp_1_inner_0),
15134                 TEST_CASE_NAMED_WITH_DATA(
15135                         "Antireplay with window size 1024",
15136                         ut_setup_security, ut_teardown,
15137                         test_ipsec_proto_pkt_antireplay1024, &pkt_aes_128_gcm),
15138                 TEST_CASE_NAMED_WITH_DATA(
15139                         "Antireplay with window size 2048",
15140                         ut_setup_security, ut_teardown,
15141                         test_ipsec_proto_pkt_antireplay2048, &pkt_aes_128_gcm),
15142                 TEST_CASE_NAMED_WITH_DATA(
15143                         "Antireplay with window size 4096",
15144                         ut_setup_security, ut_teardown,
15145                         test_ipsec_proto_pkt_antireplay4096, &pkt_aes_128_gcm),
15146                 TEST_CASE_NAMED_WITH_DATA(
15147                         "ESN and Antireplay with window size 1024",
15148                         ut_setup_security, ut_teardown,
15149                         test_ipsec_proto_pkt_esn_antireplay1024,
15150                         &pkt_aes_128_gcm),
15151                 TEST_CASE_NAMED_WITH_DATA(
15152                         "ESN and Antireplay with window size 2048",
15153                         ut_setup_security, ut_teardown,
15154                         test_ipsec_proto_pkt_esn_antireplay2048,
15155                         &pkt_aes_128_gcm),
15156                 TEST_CASE_NAMED_WITH_DATA(
15157                         "ESN and Antireplay with window size 4096",
15158                         ut_setup_security, ut_teardown,
15159                         test_ipsec_proto_pkt_esn_antireplay4096,
15160                         &pkt_aes_128_gcm),
15161                 TEST_CASES_END() /**< NULL terminate unit test array */
15162         }
15163 };
15164
15165 static struct unit_test_suite pdcp_proto_testsuite  = {
15166         .suite_name = "PDCP Proto Unit Test Suite",
15167         .setup = pdcp_proto_testsuite_setup,
15168         .unit_test_cases = {
15169                 TEST_CASE_ST(ut_setup_security, ut_teardown,
15170                         test_PDCP_PROTO_all),
15171                 TEST_CASES_END() /**< NULL terminate unit test array */
15172         }
15173 };
15174
15175 #define ADD_UPLINK_TESTCASE(data)                                               \
15176         TEST_CASE_NAMED_WITH_DATA(data.test_descr_uplink, ut_setup_security,    \
15177         ut_teardown, test_docsis_proto_uplink, (const void *) &data),           \
15178
15179 #define ADD_DOWNLINK_TESTCASE(data)                                             \
15180         TEST_CASE_NAMED_WITH_DATA(data.test_descr_downlink, ut_setup_security,  \
15181         ut_teardown, test_docsis_proto_downlink, (const void *) &data),         \
15182
15183 static struct unit_test_suite docsis_proto_testsuite  = {
15184         .suite_name = "DOCSIS Proto Unit Test Suite",
15185         .setup = docsis_proto_testsuite_setup,
15186         .unit_test_cases = {
15187                 /* Uplink */
15188                 ADD_UPLINK_TESTCASE(docsis_test_case_1)
15189                 ADD_UPLINK_TESTCASE(docsis_test_case_2)
15190                 ADD_UPLINK_TESTCASE(docsis_test_case_3)
15191                 ADD_UPLINK_TESTCASE(docsis_test_case_4)
15192                 ADD_UPLINK_TESTCASE(docsis_test_case_5)
15193                 ADD_UPLINK_TESTCASE(docsis_test_case_6)
15194                 ADD_UPLINK_TESTCASE(docsis_test_case_7)
15195                 ADD_UPLINK_TESTCASE(docsis_test_case_8)
15196                 ADD_UPLINK_TESTCASE(docsis_test_case_9)
15197                 ADD_UPLINK_TESTCASE(docsis_test_case_10)
15198                 ADD_UPLINK_TESTCASE(docsis_test_case_11)
15199                 ADD_UPLINK_TESTCASE(docsis_test_case_12)
15200                 ADD_UPLINK_TESTCASE(docsis_test_case_13)
15201                 ADD_UPLINK_TESTCASE(docsis_test_case_14)
15202                 ADD_UPLINK_TESTCASE(docsis_test_case_15)
15203                 ADD_UPLINK_TESTCASE(docsis_test_case_16)
15204                 ADD_UPLINK_TESTCASE(docsis_test_case_17)
15205                 ADD_UPLINK_TESTCASE(docsis_test_case_18)
15206                 ADD_UPLINK_TESTCASE(docsis_test_case_19)
15207                 ADD_UPLINK_TESTCASE(docsis_test_case_20)
15208                 ADD_UPLINK_TESTCASE(docsis_test_case_21)
15209                 ADD_UPLINK_TESTCASE(docsis_test_case_22)
15210                 ADD_UPLINK_TESTCASE(docsis_test_case_23)
15211                 ADD_UPLINK_TESTCASE(docsis_test_case_24)
15212                 ADD_UPLINK_TESTCASE(docsis_test_case_25)
15213                 ADD_UPLINK_TESTCASE(docsis_test_case_26)
15214                 /* Downlink */
15215                 ADD_DOWNLINK_TESTCASE(docsis_test_case_1)
15216                 ADD_DOWNLINK_TESTCASE(docsis_test_case_2)
15217                 ADD_DOWNLINK_TESTCASE(docsis_test_case_3)
15218                 ADD_DOWNLINK_TESTCASE(docsis_test_case_4)
15219                 ADD_DOWNLINK_TESTCASE(docsis_test_case_5)
15220                 ADD_DOWNLINK_TESTCASE(docsis_test_case_6)
15221                 ADD_DOWNLINK_TESTCASE(docsis_test_case_7)
15222                 ADD_DOWNLINK_TESTCASE(docsis_test_case_8)
15223                 ADD_DOWNLINK_TESTCASE(docsis_test_case_9)
15224                 ADD_DOWNLINK_TESTCASE(docsis_test_case_10)
15225                 ADD_DOWNLINK_TESTCASE(docsis_test_case_11)
15226                 ADD_DOWNLINK_TESTCASE(docsis_test_case_12)
15227                 ADD_DOWNLINK_TESTCASE(docsis_test_case_13)
15228                 ADD_DOWNLINK_TESTCASE(docsis_test_case_14)
15229                 ADD_DOWNLINK_TESTCASE(docsis_test_case_15)
15230                 ADD_DOWNLINK_TESTCASE(docsis_test_case_16)
15231                 ADD_DOWNLINK_TESTCASE(docsis_test_case_17)
15232                 ADD_DOWNLINK_TESTCASE(docsis_test_case_18)
15233                 ADD_DOWNLINK_TESTCASE(docsis_test_case_19)
15234                 ADD_DOWNLINK_TESTCASE(docsis_test_case_20)
15235                 ADD_DOWNLINK_TESTCASE(docsis_test_case_21)
15236                 ADD_DOWNLINK_TESTCASE(docsis_test_case_22)
15237                 ADD_DOWNLINK_TESTCASE(docsis_test_case_23)
15238                 ADD_DOWNLINK_TESTCASE(docsis_test_case_24)
15239                 ADD_DOWNLINK_TESTCASE(docsis_test_case_25)
15240                 ADD_DOWNLINK_TESTCASE(docsis_test_case_26)
15241                 TEST_CASES_END() /**< NULL terminate unit test array */
15242         }
15243 };
15244 #endif
15245
15246 static struct unit_test_suite cryptodev_gen_testsuite  = {
15247         .suite_name = "Crypto General Unit Test Suite",
15248         .setup = crypto_gen_testsuite_setup,
15249         .unit_test_cases = {
15250                 TEST_CASE_ST(ut_setup, ut_teardown,
15251                                 test_device_configure_invalid_dev_id),
15252                 TEST_CASE_ST(ut_setup, ut_teardown,
15253                                 test_queue_pair_descriptor_setup),
15254                 TEST_CASE_ST(ut_setup, ut_teardown,
15255                                 test_device_configure_invalid_queue_pair_ids),
15256                 TEST_CASE_ST(ut_setup, ut_teardown, test_stats),
15257                 TEST_CASE_ST(ut_setup, ut_teardown, test_enq_callback_setup),
15258                 TEST_CASE_ST(ut_setup, ut_teardown, test_deq_callback_setup),
15259                 TEST_CASES_END() /**< NULL terminate unit test array */
15260         }
15261 };
15262
15263 static struct unit_test_suite cryptodev_negative_hmac_sha1_testsuite = {
15264         .suite_name = "Negative HMAC SHA1 Unit Test Suite",
15265         .setup = negative_hmac_sha1_testsuite_setup,
15266         .unit_test_cases = {
15267                 /** Negative tests */
15268                 TEST_CASE_ST(ut_setup, ut_teardown,
15269                         authentication_verify_HMAC_SHA1_fail_data_corrupt),
15270                 TEST_CASE_ST(ut_setup, ut_teardown,
15271                         authentication_verify_HMAC_SHA1_fail_tag_corrupt),
15272                 TEST_CASE_ST(ut_setup, ut_teardown,
15273                         auth_decryption_AES128CBC_HMAC_SHA1_fail_data_corrupt),
15274                 TEST_CASE_ST(ut_setup, ut_teardown,
15275                         auth_decryption_AES128CBC_HMAC_SHA1_fail_tag_corrupt),
15276
15277                 TEST_CASES_END() /**< NULL terminate unit test array */
15278         }
15279 };
15280
15281 static struct unit_test_suite cryptodev_multi_session_testsuite = {
15282         .suite_name = "Multi Session Unit Test Suite",
15283         .setup = multi_session_testsuite_setup,
15284         .unit_test_cases = {
15285                 TEST_CASE_ST(ut_setup, ut_teardown, test_multi_session),
15286                 TEST_CASE_ST(ut_setup, ut_teardown,
15287                                 test_multi_session_random_usage),
15288
15289                 TEST_CASES_END() /**< NULL terminate unit test array */
15290         }
15291 };
15292
15293 static struct unit_test_suite cryptodev_null_testsuite  = {
15294         .suite_name = "NULL Test Suite",
15295         .setup = null_testsuite_setup,
15296         .unit_test_cases = {
15297                 TEST_CASE_ST(ut_setup, ut_teardown,
15298                         test_null_invalid_operation),
15299                 TEST_CASE_ST(ut_setup, ut_teardown, test_null_burst_operation),
15300                 TEST_CASES_END()
15301         }
15302 };
15303
15304 static struct unit_test_suite cryptodev_aes_ccm_auth_testsuite  = {
15305         .suite_name = "AES CCM Authenticated Test Suite",
15306         .setup = aes_ccm_auth_testsuite_setup,
15307         .unit_test_cases = {
15308                 /** AES CCM Authenticated Encryption 128 bits key*/
15309                 TEST_CASE_ST(ut_setup, ut_teardown,
15310                         test_AES_CCM_authenticated_encryption_test_case_128_1),
15311                 TEST_CASE_ST(ut_setup, ut_teardown,
15312                         test_AES_CCM_authenticated_encryption_test_case_128_2),
15313                 TEST_CASE_ST(ut_setup, ut_teardown,
15314                         test_AES_CCM_authenticated_encryption_test_case_128_3),
15315
15316                 /** AES CCM Authenticated Decryption 128 bits key*/
15317                 TEST_CASE_ST(ut_setup, ut_teardown,
15318                         test_AES_CCM_authenticated_decryption_test_case_128_1),
15319                 TEST_CASE_ST(ut_setup, ut_teardown,
15320                         test_AES_CCM_authenticated_decryption_test_case_128_2),
15321                 TEST_CASE_ST(ut_setup, ut_teardown,
15322                         test_AES_CCM_authenticated_decryption_test_case_128_3),
15323
15324                 /** AES CCM Authenticated Encryption 192 bits key */
15325                 TEST_CASE_ST(ut_setup, ut_teardown,
15326                         test_AES_CCM_authenticated_encryption_test_case_192_1),
15327                 TEST_CASE_ST(ut_setup, ut_teardown,
15328                         test_AES_CCM_authenticated_encryption_test_case_192_2),
15329                 TEST_CASE_ST(ut_setup, ut_teardown,
15330                         test_AES_CCM_authenticated_encryption_test_case_192_3),
15331
15332                 /** AES CCM Authenticated Decryption 192 bits key*/
15333                 TEST_CASE_ST(ut_setup, ut_teardown,
15334                         test_AES_CCM_authenticated_decryption_test_case_192_1),
15335                 TEST_CASE_ST(ut_setup, ut_teardown,
15336                         test_AES_CCM_authenticated_decryption_test_case_192_2),
15337                 TEST_CASE_ST(ut_setup, ut_teardown,
15338                         test_AES_CCM_authenticated_decryption_test_case_192_3),
15339
15340                 /** AES CCM Authenticated Encryption 256 bits key */
15341                 TEST_CASE_ST(ut_setup, ut_teardown,
15342                         test_AES_CCM_authenticated_encryption_test_case_256_1),
15343                 TEST_CASE_ST(ut_setup, ut_teardown,
15344                         test_AES_CCM_authenticated_encryption_test_case_256_2),
15345                 TEST_CASE_ST(ut_setup, ut_teardown,
15346                         test_AES_CCM_authenticated_encryption_test_case_256_3),
15347
15348                 /** AES CCM Authenticated Decryption 256 bits key*/
15349                 TEST_CASE_ST(ut_setup, ut_teardown,
15350                         test_AES_CCM_authenticated_decryption_test_case_256_1),
15351                 TEST_CASE_ST(ut_setup, ut_teardown,
15352                         test_AES_CCM_authenticated_decryption_test_case_256_2),
15353                 TEST_CASE_ST(ut_setup, ut_teardown,
15354                         test_AES_CCM_authenticated_decryption_test_case_256_3),
15355                 TEST_CASES_END()
15356         }
15357 };
15358
15359 static struct unit_test_suite cryptodev_aes_gcm_auth_testsuite  = {
15360         .suite_name = "AES GCM Authenticated Test Suite",
15361         .setup = aes_gcm_auth_testsuite_setup,
15362         .unit_test_cases = {
15363                 /** AES GCM Authenticated Encryption */
15364                 TEST_CASE_ST(ut_setup, ut_teardown,
15365                         test_AES_GCM_auth_encrypt_SGL_in_place_1500B),
15366                 TEST_CASE_ST(ut_setup, ut_teardown,
15367                         test_AES_GCM_auth_encrypt_SGL_out_of_place_400B_400B),
15368                 TEST_CASE_ST(ut_setup, ut_teardown,
15369                         test_AES_GCM_auth_encrypt_SGL_out_of_place_1500B_2000B),
15370                 TEST_CASE_ST(ut_setup, ut_teardown,
15371                         test_AES_GCM_auth_encrypt_SGL_out_of_place_400B_1seg),
15372                 TEST_CASE_ST(ut_setup, ut_teardown,
15373                         test_AES_GCM_authenticated_encryption_test_case_1),
15374                 TEST_CASE_ST(ut_setup, ut_teardown,
15375                         test_AES_GCM_authenticated_encryption_test_case_2),
15376                 TEST_CASE_ST(ut_setup, ut_teardown,
15377                         test_AES_GCM_authenticated_encryption_test_case_3),
15378                 TEST_CASE_ST(ut_setup, ut_teardown,
15379                         test_AES_GCM_authenticated_encryption_test_case_4),
15380                 TEST_CASE_ST(ut_setup, ut_teardown,
15381                         test_AES_GCM_authenticated_encryption_test_case_5),
15382                 TEST_CASE_ST(ut_setup, ut_teardown,
15383                         test_AES_GCM_authenticated_encryption_test_case_6),
15384                 TEST_CASE_ST(ut_setup, ut_teardown,
15385                         test_AES_GCM_authenticated_encryption_test_case_7),
15386                 TEST_CASE_ST(ut_setup, ut_teardown,
15387                         test_AES_GCM_authenticated_encryption_test_case_8),
15388                 TEST_CASE_ST(ut_setup, ut_teardown,
15389                         test_AES_GCM_J0_authenticated_encryption_test_case_1),
15390
15391                 /** AES GCM Authenticated Decryption */
15392                 TEST_CASE_ST(ut_setup, ut_teardown,
15393                         test_AES_GCM_authenticated_decryption_test_case_1),
15394                 TEST_CASE_ST(ut_setup, ut_teardown,
15395                         test_AES_GCM_authenticated_decryption_test_case_2),
15396                 TEST_CASE_ST(ut_setup, ut_teardown,
15397                         test_AES_GCM_authenticated_decryption_test_case_3),
15398                 TEST_CASE_ST(ut_setup, ut_teardown,
15399                         test_AES_GCM_authenticated_decryption_test_case_4),
15400                 TEST_CASE_ST(ut_setup, ut_teardown,
15401                         test_AES_GCM_authenticated_decryption_test_case_5),
15402                 TEST_CASE_ST(ut_setup, ut_teardown,
15403                         test_AES_GCM_authenticated_decryption_test_case_6),
15404                 TEST_CASE_ST(ut_setup, ut_teardown,
15405                         test_AES_GCM_authenticated_decryption_test_case_7),
15406                 TEST_CASE_ST(ut_setup, ut_teardown,
15407                         test_AES_GCM_authenticated_decryption_test_case_8),
15408                 TEST_CASE_ST(ut_setup, ut_teardown,
15409                         test_AES_GCM_J0_authenticated_decryption_test_case_1),
15410
15411                 /** AES GCM Authenticated Encryption 192 bits key */
15412                 TEST_CASE_ST(ut_setup, ut_teardown,
15413                         test_AES_GCM_auth_encryption_test_case_192_1),
15414                 TEST_CASE_ST(ut_setup, ut_teardown,
15415                         test_AES_GCM_auth_encryption_test_case_192_2),
15416                 TEST_CASE_ST(ut_setup, ut_teardown,
15417                         test_AES_GCM_auth_encryption_test_case_192_3),
15418                 TEST_CASE_ST(ut_setup, ut_teardown,
15419                         test_AES_GCM_auth_encryption_test_case_192_4),
15420                 TEST_CASE_ST(ut_setup, ut_teardown,
15421                         test_AES_GCM_auth_encryption_test_case_192_5),
15422                 TEST_CASE_ST(ut_setup, ut_teardown,
15423                         test_AES_GCM_auth_encryption_test_case_192_6),
15424                 TEST_CASE_ST(ut_setup, ut_teardown,
15425                         test_AES_GCM_auth_encryption_test_case_192_7),
15426
15427                 /** AES GCM Authenticated Decryption 192 bits key */
15428                 TEST_CASE_ST(ut_setup, ut_teardown,
15429                         test_AES_GCM_auth_decryption_test_case_192_1),
15430                 TEST_CASE_ST(ut_setup, ut_teardown,
15431                         test_AES_GCM_auth_decryption_test_case_192_2),
15432                 TEST_CASE_ST(ut_setup, ut_teardown,
15433                         test_AES_GCM_auth_decryption_test_case_192_3),
15434                 TEST_CASE_ST(ut_setup, ut_teardown,
15435                         test_AES_GCM_auth_decryption_test_case_192_4),
15436                 TEST_CASE_ST(ut_setup, ut_teardown,
15437                         test_AES_GCM_auth_decryption_test_case_192_5),
15438                 TEST_CASE_ST(ut_setup, ut_teardown,
15439                         test_AES_GCM_auth_decryption_test_case_192_6),
15440                 TEST_CASE_ST(ut_setup, ut_teardown,
15441                         test_AES_GCM_auth_decryption_test_case_192_7),
15442
15443                 /** AES GCM Authenticated Encryption 256 bits key */
15444                 TEST_CASE_ST(ut_setup, ut_teardown,
15445                         test_AES_GCM_auth_encryption_test_case_256_1),
15446                 TEST_CASE_ST(ut_setup, ut_teardown,
15447                         test_AES_GCM_auth_encryption_test_case_256_2),
15448                 TEST_CASE_ST(ut_setup, ut_teardown,
15449                         test_AES_GCM_auth_encryption_test_case_256_3),
15450                 TEST_CASE_ST(ut_setup, ut_teardown,
15451                         test_AES_GCM_auth_encryption_test_case_256_4),
15452                 TEST_CASE_ST(ut_setup, ut_teardown,
15453                         test_AES_GCM_auth_encryption_test_case_256_5),
15454                 TEST_CASE_ST(ut_setup, ut_teardown,
15455                         test_AES_GCM_auth_encryption_test_case_256_6),
15456                 TEST_CASE_ST(ut_setup, ut_teardown,
15457                         test_AES_GCM_auth_encryption_test_case_256_7),
15458
15459                 /** AES GCM Authenticated Decryption 256 bits key */
15460                 TEST_CASE_ST(ut_setup, ut_teardown,
15461                         test_AES_GCM_auth_decryption_test_case_256_1),
15462                 TEST_CASE_ST(ut_setup, ut_teardown,
15463                         test_AES_GCM_auth_decryption_test_case_256_2),
15464                 TEST_CASE_ST(ut_setup, ut_teardown,
15465                         test_AES_GCM_auth_decryption_test_case_256_3),
15466                 TEST_CASE_ST(ut_setup, ut_teardown,
15467                         test_AES_GCM_auth_decryption_test_case_256_4),
15468                 TEST_CASE_ST(ut_setup, ut_teardown,
15469                         test_AES_GCM_auth_decryption_test_case_256_5),
15470                 TEST_CASE_ST(ut_setup, ut_teardown,
15471                         test_AES_GCM_auth_decryption_test_case_256_6),
15472                 TEST_CASE_ST(ut_setup, ut_teardown,
15473                         test_AES_GCM_auth_decryption_test_case_256_7),
15474
15475                 /** AES GCM Authenticated Encryption big aad size */
15476                 TEST_CASE_ST(ut_setup, ut_teardown,
15477                         test_AES_GCM_auth_encryption_test_case_aad_1),
15478                 TEST_CASE_ST(ut_setup, ut_teardown,
15479                         test_AES_GCM_auth_encryption_test_case_aad_2),
15480
15481                 /** AES GCM Authenticated Decryption big aad size */
15482                 TEST_CASE_ST(ut_setup, ut_teardown,
15483                         test_AES_GCM_auth_decryption_test_case_aad_1),
15484                 TEST_CASE_ST(ut_setup, ut_teardown,
15485                         test_AES_GCM_auth_decryption_test_case_aad_2),
15486
15487                 /** Out of place tests */
15488                 TEST_CASE_ST(ut_setup, ut_teardown,
15489                         test_AES_GCM_authenticated_encryption_oop_test_case_1),
15490                 TEST_CASE_ST(ut_setup, ut_teardown,
15491                         test_AES_GCM_authenticated_decryption_oop_test_case_1),
15492
15493                 /** Session-less tests */
15494                 TEST_CASE_ST(ut_setup, ut_teardown,
15495                         test_AES_GCM_authenticated_encryption_sessionless_test_case_1),
15496                 TEST_CASE_ST(ut_setup, ut_teardown,
15497                         test_AES_GCM_authenticated_decryption_sessionless_test_case_1),
15498
15499                 TEST_CASES_END()
15500         }
15501 };
15502
15503 static struct unit_test_suite cryptodev_aes_gmac_auth_testsuite  = {
15504         .suite_name = "AES GMAC Authentication Test Suite",
15505         .setup = aes_gmac_auth_testsuite_setup,
15506         .unit_test_cases = {
15507                 TEST_CASE_ST(ut_setup, ut_teardown,
15508                         test_AES_GMAC_authentication_test_case_1),
15509                 TEST_CASE_ST(ut_setup, ut_teardown,
15510                         test_AES_GMAC_authentication_verify_test_case_1),
15511                 TEST_CASE_ST(ut_setup, ut_teardown,
15512                         test_AES_GMAC_authentication_test_case_2),
15513                 TEST_CASE_ST(ut_setup, ut_teardown,
15514                         test_AES_GMAC_authentication_verify_test_case_2),
15515                 TEST_CASE_ST(ut_setup, ut_teardown,
15516                         test_AES_GMAC_authentication_test_case_3),
15517                 TEST_CASE_ST(ut_setup, ut_teardown,
15518                         test_AES_GMAC_authentication_verify_test_case_3),
15519                 TEST_CASE_ST(ut_setup, ut_teardown,
15520                         test_AES_GMAC_authentication_test_case_4),
15521                 TEST_CASE_ST(ut_setup, ut_teardown,
15522                         test_AES_GMAC_authentication_verify_test_case_4),
15523                 TEST_CASE_ST(ut_setup, ut_teardown,
15524                         test_AES_GMAC_authentication_SGL_40B),
15525                 TEST_CASE_ST(ut_setup, ut_teardown,
15526                         test_AES_GMAC_authentication_SGL_80B),
15527                 TEST_CASE_ST(ut_setup, ut_teardown,
15528                         test_AES_GMAC_authentication_SGL_2048B),
15529                 TEST_CASE_ST(ut_setup, ut_teardown,
15530                         test_AES_GMAC_authentication_SGL_2047B),
15531
15532                 TEST_CASES_END()
15533         }
15534 };
15535
15536 static struct unit_test_suite cryptodev_chacha20_poly1305_testsuite  = {
15537         .suite_name = "Chacha20-Poly1305 Test Suite",
15538         .setup = chacha20_poly1305_testsuite_setup,
15539         .unit_test_cases = {
15540                 TEST_CASE_ST(ut_setup, ut_teardown,
15541                         test_chacha20_poly1305_encrypt_test_case_rfc8439),
15542                 TEST_CASE_ST(ut_setup, ut_teardown,
15543                         test_chacha20_poly1305_decrypt_test_case_rfc8439),
15544                 TEST_CASE_ST(ut_setup, ut_teardown,
15545                         test_chacha20_poly1305_encrypt_SGL_out_of_place),
15546                 TEST_CASES_END()
15547         }
15548 };
15549
15550 static struct unit_test_suite cryptodev_snow3g_testsuite  = {
15551         .suite_name = "SNOW 3G Test Suite",
15552         .setup = snow3g_testsuite_setup,
15553         .unit_test_cases = {
15554                 /** SNOW 3G encrypt only (UEA2) */
15555                 TEST_CASE_ST(ut_setup, ut_teardown,
15556                         test_snow3g_encryption_test_case_1),
15557                 TEST_CASE_ST(ut_setup, ut_teardown,
15558                         test_snow3g_encryption_test_case_2),
15559                 TEST_CASE_ST(ut_setup, ut_teardown,
15560                         test_snow3g_encryption_test_case_3),
15561                 TEST_CASE_ST(ut_setup, ut_teardown,
15562                         test_snow3g_encryption_test_case_4),
15563                 TEST_CASE_ST(ut_setup, ut_teardown,
15564                         test_snow3g_encryption_test_case_5),
15565
15566                 TEST_CASE_ST(ut_setup, ut_teardown,
15567                         test_snow3g_encryption_test_case_1_oop),
15568                 TEST_CASE_ST(ut_setup, ut_teardown,
15569                         test_snow3g_encryption_test_case_1_oop_sgl),
15570                 TEST_CASE_ST(ut_setup, ut_teardown,
15571                         test_snow3g_encryption_test_case_1_offset_oop),
15572                 TEST_CASE_ST(ut_setup, ut_teardown,
15573                         test_snow3g_decryption_test_case_1_oop),
15574
15575                 /** SNOW 3G generate auth, then encrypt (UEA2) */
15576                 TEST_CASE_ST(ut_setup, ut_teardown,
15577                         test_snow3g_auth_cipher_test_case_1),
15578                 TEST_CASE_ST(ut_setup, ut_teardown,
15579                         test_snow3g_auth_cipher_test_case_2),
15580                 TEST_CASE_ST(ut_setup, ut_teardown,
15581                         test_snow3g_auth_cipher_test_case_2_oop),
15582                 TEST_CASE_ST(ut_setup, ut_teardown,
15583                         test_snow3g_auth_cipher_part_digest_enc),
15584                 TEST_CASE_ST(ut_setup, ut_teardown,
15585                         test_snow3g_auth_cipher_part_digest_enc_oop),
15586                 TEST_CASE_ST(ut_setup, ut_teardown,
15587                         test_snow3g_auth_cipher_test_case_3_sgl),
15588                 TEST_CASE_ST(ut_setup, ut_teardown,
15589                         test_snow3g_auth_cipher_test_case_3_oop_sgl),
15590                 TEST_CASE_ST(ut_setup, ut_teardown,
15591                         test_snow3g_auth_cipher_part_digest_enc_sgl),
15592                 TEST_CASE_ST(ut_setup, ut_teardown,
15593                         test_snow3g_auth_cipher_part_digest_enc_oop_sgl),
15594
15595                 /** SNOW 3G decrypt (UEA2), then verify auth */
15596                 TEST_CASE_ST(ut_setup, ut_teardown,
15597                         test_snow3g_auth_cipher_verify_test_case_1),
15598                 TEST_CASE_ST(ut_setup, ut_teardown,
15599                         test_snow3g_auth_cipher_verify_test_case_2),
15600                 TEST_CASE_ST(ut_setup, ut_teardown,
15601                         test_snow3g_auth_cipher_verify_test_case_2_oop),
15602                 TEST_CASE_ST(ut_setup, ut_teardown,
15603                         test_snow3g_auth_cipher_verify_part_digest_enc),
15604                 TEST_CASE_ST(ut_setup, ut_teardown,
15605                         test_snow3g_auth_cipher_verify_part_digest_enc_oop),
15606                 TEST_CASE_ST(ut_setup, ut_teardown,
15607                         test_snow3g_auth_cipher_verify_test_case_3_sgl),
15608                 TEST_CASE_ST(ut_setup, ut_teardown,
15609                         test_snow3g_auth_cipher_verify_test_case_3_oop_sgl),
15610                 TEST_CASE_ST(ut_setup, ut_teardown,
15611                         test_snow3g_auth_cipher_verify_part_digest_enc_sgl),
15612                 TEST_CASE_ST(ut_setup, ut_teardown,
15613                         test_snow3g_auth_cipher_verify_part_digest_enc_oop_sgl),
15614
15615                 /** SNOW 3G decrypt only (UEA2) */
15616                 TEST_CASE_ST(ut_setup, ut_teardown,
15617                         test_snow3g_decryption_test_case_1),
15618                 TEST_CASE_ST(ut_setup, ut_teardown,
15619                         test_snow3g_decryption_test_case_2),
15620                 TEST_CASE_ST(ut_setup, ut_teardown,
15621                         test_snow3g_decryption_test_case_3),
15622                 TEST_CASE_ST(ut_setup, ut_teardown,
15623                         test_snow3g_decryption_test_case_4),
15624                 TEST_CASE_ST(ut_setup, ut_teardown,
15625                         test_snow3g_decryption_test_case_5),
15626                 TEST_CASE_ST(ut_setup, ut_teardown,
15627                         test_snow3g_decryption_with_digest_test_case_1),
15628                 TEST_CASE_ST(ut_setup, ut_teardown,
15629                         test_snow3g_hash_generate_test_case_1),
15630                 TEST_CASE_ST(ut_setup, ut_teardown,
15631                         test_snow3g_hash_generate_test_case_2),
15632                 TEST_CASE_ST(ut_setup, ut_teardown,
15633                         test_snow3g_hash_generate_test_case_3),
15634
15635                 /* Tests with buffers which length is not byte-aligned */
15636                 TEST_CASE_ST(ut_setup, ut_teardown,
15637                         test_snow3g_hash_generate_test_case_4),
15638                 TEST_CASE_ST(ut_setup, ut_teardown,
15639                         test_snow3g_hash_generate_test_case_5),
15640                 TEST_CASE_ST(ut_setup, ut_teardown,
15641                         test_snow3g_hash_generate_test_case_6),
15642                 TEST_CASE_ST(ut_setup, ut_teardown,
15643                         test_snow3g_hash_verify_test_case_1),
15644                 TEST_CASE_ST(ut_setup, ut_teardown,
15645                         test_snow3g_hash_verify_test_case_2),
15646                 TEST_CASE_ST(ut_setup, ut_teardown,
15647                         test_snow3g_hash_verify_test_case_3),
15648
15649                 /* Tests with buffers which length is not byte-aligned */
15650                 TEST_CASE_ST(ut_setup, ut_teardown,
15651                         test_snow3g_hash_verify_test_case_4),
15652                 TEST_CASE_ST(ut_setup, ut_teardown,
15653                         test_snow3g_hash_verify_test_case_5),
15654                 TEST_CASE_ST(ut_setup, ut_teardown,
15655                         test_snow3g_hash_verify_test_case_6),
15656                 TEST_CASE_ST(ut_setup, ut_teardown,
15657                         test_snow3g_cipher_auth_test_case_1),
15658                 TEST_CASE_ST(ut_setup, ut_teardown,
15659                         test_snow3g_auth_cipher_with_digest_test_case_1),
15660                 TEST_CASES_END()
15661         }
15662 };
15663
15664 static struct unit_test_suite cryptodev_zuc_testsuite  = {
15665         .suite_name = "ZUC Test Suite",
15666         .setup = zuc_testsuite_setup,
15667         .unit_test_cases = {
15668                 /** ZUC encrypt only (EEA3) */
15669                 TEST_CASE_ST(ut_setup, ut_teardown,
15670                         test_zuc_encryption_test_case_1),
15671                 TEST_CASE_ST(ut_setup, ut_teardown,
15672                         test_zuc_encryption_test_case_2),
15673                 TEST_CASE_ST(ut_setup, ut_teardown,
15674                         test_zuc_encryption_test_case_3),
15675                 TEST_CASE_ST(ut_setup, ut_teardown,
15676                         test_zuc_encryption_test_case_4),
15677                 TEST_CASE_ST(ut_setup, ut_teardown,
15678                         test_zuc_encryption_test_case_5),
15679                 TEST_CASE_ST(ut_setup, ut_teardown,
15680                         test_zuc_encryption_test_case_6_sgl),
15681
15682                 /** ZUC authenticate (EIA3) */
15683                 TEST_CASE_ST(ut_setup, ut_teardown,
15684                         test_zuc_hash_generate_test_case_1),
15685                 TEST_CASE_ST(ut_setup, ut_teardown,
15686                         test_zuc_hash_generate_test_case_2),
15687                 TEST_CASE_ST(ut_setup, ut_teardown,
15688                         test_zuc_hash_generate_test_case_3),
15689                 TEST_CASE_ST(ut_setup, ut_teardown,
15690                         test_zuc_hash_generate_test_case_4),
15691                 TEST_CASE_ST(ut_setup, ut_teardown,
15692                         test_zuc_hash_generate_test_case_5),
15693                 TEST_CASE_ST(ut_setup, ut_teardown,
15694                         test_zuc_hash_generate_test_case_6),
15695                 TEST_CASE_ST(ut_setup, ut_teardown,
15696                         test_zuc_hash_generate_test_case_7),
15697                 TEST_CASE_ST(ut_setup, ut_teardown,
15698                         test_zuc_hash_generate_test_case_8),
15699                 TEST_CASE_ST(ut_setup, ut_teardown,
15700                         test_zuc_hash_generate_test_case_9),
15701                 TEST_CASE_ST(ut_setup, ut_teardown,
15702                         test_zuc_hash_generate_test_case_10),
15703                 TEST_CASE_ST(ut_setup, ut_teardown,
15704                         test_zuc_hash_generate_test_case_11),
15705
15706
15707                 /** ZUC alg-chain (EEA3/EIA3) */
15708                 TEST_CASE_ST(ut_setup, ut_teardown,
15709                         test_zuc_cipher_auth_test_case_1),
15710                 TEST_CASE_ST(ut_setup, ut_teardown,
15711                         test_zuc_cipher_auth_test_case_2),
15712
15713                 /** ZUC generate auth, then encrypt (EEA3) */
15714                 TEST_CASE_ST(ut_setup, ut_teardown,
15715                         test_zuc_auth_cipher_test_case_1),
15716                 TEST_CASE_ST(ut_setup, ut_teardown,
15717                         test_zuc_auth_cipher_test_case_1_oop),
15718                 TEST_CASE_ST(ut_setup, ut_teardown,
15719                         test_zuc_auth_cipher_test_case_1_sgl),
15720                 TEST_CASE_ST(ut_setup, ut_teardown,
15721                         test_zuc_auth_cipher_test_case_1_oop_sgl),
15722
15723                 /** ZUC decrypt (EEA3), then verify auth */
15724                 TEST_CASE_ST(ut_setup, ut_teardown,
15725                         test_zuc_auth_cipher_verify_test_case_1),
15726                 TEST_CASE_ST(ut_setup, ut_teardown,
15727                         test_zuc_auth_cipher_verify_test_case_1_oop),
15728                 TEST_CASE_ST(ut_setup, ut_teardown,
15729                         test_zuc_auth_cipher_verify_test_case_1_sgl),
15730                 TEST_CASE_ST(ut_setup, ut_teardown,
15731                         test_zuc_auth_cipher_verify_test_case_1_oop_sgl),
15732
15733                 /** ZUC-256 encrypt only **/
15734                 TEST_CASE_ST(ut_setup, ut_teardown,
15735                         test_zuc256_encryption_test_case_1),
15736                 TEST_CASE_ST(ut_setup, ut_teardown,
15737                         test_zuc256_encryption_test_case_2),
15738
15739                 /** ZUC-256 authentication only **/
15740                 TEST_CASE_ST(ut_setup, ut_teardown,
15741                         test_zuc256_authentication_test_case_1),
15742                 TEST_CASE_ST(ut_setup, ut_teardown,
15743                         test_zuc256_authentication_test_case_2),
15744
15745                 TEST_CASES_END()
15746         }
15747 };
15748
15749 static struct unit_test_suite cryptodev_hmac_md5_auth_testsuite  = {
15750         .suite_name = "HMAC_MD5 Authentication Test Suite",
15751         .setup = hmac_md5_auth_testsuite_setup,
15752         .unit_test_cases = {
15753                 TEST_CASE_ST(ut_setup, ut_teardown,
15754                         test_MD5_HMAC_generate_case_1),
15755                 TEST_CASE_ST(ut_setup, ut_teardown,
15756                         test_MD5_HMAC_verify_case_1),
15757                 TEST_CASE_ST(ut_setup, ut_teardown,
15758                         test_MD5_HMAC_generate_case_2),
15759                 TEST_CASE_ST(ut_setup, ut_teardown,
15760                         test_MD5_HMAC_verify_case_2),
15761                 TEST_CASES_END()
15762         }
15763 };
15764
15765 static struct unit_test_suite cryptodev_kasumi_testsuite  = {
15766         .suite_name = "Kasumi Test Suite",
15767         .setup = kasumi_testsuite_setup,
15768         .unit_test_cases = {
15769                 /** KASUMI hash only (UIA1) */
15770                 TEST_CASE_ST(ut_setup, ut_teardown,
15771                         test_kasumi_hash_generate_test_case_1),
15772                 TEST_CASE_ST(ut_setup, ut_teardown,
15773                         test_kasumi_hash_generate_test_case_2),
15774                 TEST_CASE_ST(ut_setup, ut_teardown,
15775                         test_kasumi_hash_generate_test_case_3),
15776                 TEST_CASE_ST(ut_setup, ut_teardown,
15777                         test_kasumi_hash_generate_test_case_4),
15778                 TEST_CASE_ST(ut_setup, ut_teardown,
15779                         test_kasumi_hash_generate_test_case_5),
15780                 TEST_CASE_ST(ut_setup, ut_teardown,
15781                         test_kasumi_hash_generate_test_case_6),
15782
15783                 TEST_CASE_ST(ut_setup, ut_teardown,
15784                         test_kasumi_hash_verify_test_case_1),
15785                 TEST_CASE_ST(ut_setup, ut_teardown,
15786                         test_kasumi_hash_verify_test_case_2),
15787                 TEST_CASE_ST(ut_setup, ut_teardown,
15788                         test_kasumi_hash_verify_test_case_3),
15789                 TEST_CASE_ST(ut_setup, ut_teardown,
15790                         test_kasumi_hash_verify_test_case_4),
15791                 TEST_CASE_ST(ut_setup, ut_teardown,
15792                         test_kasumi_hash_verify_test_case_5),
15793
15794                 /** KASUMI encrypt only (UEA1) */
15795                 TEST_CASE_ST(ut_setup, ut_teardown,
15796                         test_kasumi_encryption_test_case_1),
15797                 TEST_CASE_ST(ut_setup, ut_teardown,
15798                         test_kasumi_encryption_test_case_1_sgl),
15799                 TEST_CASE_ST(ut_setup, ut_teardown,
15800                         test_kasumi_encryption_test_case_1_oop),
15801                 TEST_CASE_ST(ut_setup, ut_teardown,
15802                         test_kasumi_encryption_test_case_1_oop_sgl),
15803                 TEST_CASE_ST(ut_setup, ut_teardown,
15804                         test_kasumi_encryption_test_case_2),
15805                 TEST_CASE_ST(ut_setup, ut_teardown,
15806                         test_kasumi_encryption_test_case_3),
15807                 TEST_CASE_ST(ut_setup, ut_teardown,
15808                         test_kasumi_encryption_test_case_4),
15809                 TEST_CASE_ST(ut_setup, ut_teardown,
15810                         test_kasumi_encryption_test_case_5),
15811
15812                 /** KASUMI decrypt only (UEA1) */
15813                 TEST_CASE_ST(ut_setup, ut_teardown,
15814                         test_kasumi_decryption_test_case_1),
15815                 TEST_CASE_ST(ut_setup, ut_teardown,
15816                         test_kasumi_decryption_test_case_2),
15817                 TEST_CASE_ST(ut_setup, ut_teardown,
15818                         test_kasumi_decryption_test_case_3),
15819                 TEST_CASE_ST(ut_setup, ut_teardown,
15820                         test_kasumi_decryption_test_case_4),
15821                 TEST_CASE_ST(ut_setup, ut_teardown,
15822                         test_kasumi_decryption_test_case_5),
15823                 TEST_CASE_ST(ut_setup, ut_teardown,
15824                         test_kasumi_decryption_test_case_1_oop),
15825                 TEST_CASE_ST(ut_setup, ut_teardown,
15826                         test_kasumi_cipher_auth_test_case_1),
15827
15828                 /** KASUMI generate auth, then encrypt (F8) */
15829                 TEST_CASE_ST(ut_setup, ut_teardown,
15830                         test_kasumi_auth_cipher_test_case_1),
15831                 TEST_CASE_ST(ut_setup, ut_teardown,
15832                         test_kasumi_auth_cipher_test_case_2),
15833                 TEST_CASE_ST(ut_setup, ut_teardown,
15834                         test_kasumi_auth_cipher_test_case_2_oop),
15835                 TEST_CASE_ST(ut_setup, ut_teardown,
15836                         test_kasumi_auth_cipher_test_case_2_sgl),
15837                 TEST_CASE_ST(ut_setup, ut_teardown,
15838                         test_kasumi_auth_cipher_test_case_2_oop_sgl),
15839
15840                 /** KASUMI decrypt (F8), then verify auth */
15841                 TEST_CASE_ST(ut_setup, ut_teardown,
15842                         test_kasumi_auth_cipher_verify_test_case_1),
15843                 TEST_CASE_ST(ut_setup, ut_teardown,
15844                         test_kasumi_auth_cipher_verify_test_case_2),
15845                 TEST_CASE_ST(ut_setup, ut_teardown,
15846                         test_kasumi_auth_cipher_verify_test_case_2_oop),
15847                 TEST_CASE_ST(ut_setup, ut_teardown,
15848                         test_kasumi_auth_cipher_verify_test_case_2_sgl),
15849                 TEST_CASE_ST(ut_setup, ut_teardown,
15850                         test_kasumi_auth_cipher_verify_test_case_2_oop_sgl),
15851
15852                 TEST_CASES_END()
15853         }
15854 };
15855
15856 static struct unit_test_suite cryptodev_esn_testsuite  = {
15857         .suite_name = "ESN Test Suite",
15858         .setup = esn_testsuite_setup,
15859         .unit_test_cases = {
15860                 TEST_CASE_ST(ut_setup, ut_teardown,
15861                         auth_encrypt_AES128CBC_HMAC_SHA1_esn_check),
15862                 TEST_CASE_ST(ut_setup, ut_teardown,
15863                         auth_decrypt_AES128CBC_HMAC_SHA1_esn_check),
15864                 TEST_CASES_END()
15865         }
15866 };
15867
15868 static struct unit_test_suite cryptodev_negative_aes_gcm_testsuite  = {
15869         .suite_name = "Negative AES GCM Test Suite",
15870         .setup = negative_aes_gcm_testsuite_setup,
15871         .unit_test_cases = {
15872                 TEST_CASE_ST(ut_setup, ut_teardown,
15873                         test_AES_GCM_auth_encryption_fail_iv_corrupt),
15874                 TEST_CASE_ST(ut_setup, ut_teardown,
15875                         test_AES_GCM_auth_encryption_fail_in_data_corrupt),
15876                 TEST_CASE_ST(ut_setup, ut_teardown,
15877                         test_AES_GCM_auth_encryption_fail_out_data_corrupt),
15878                 TEST_CASE_ST(ut_setup, ut_teardown,
15879                         test_AES_GCM_auth_encryption_fail_aad_len_corrupt),
15880                 TEST_CASE_ST(ut_setup, ut_teardown,
15881                         test_AES_GCM_auth_encryption_fail_aad_corrupt),
15882                 TEST_CASE_ST(ut_setup, ut_teardown,
15883                         test_AES_GCM_auth_encryption_fail_tag_corrupt),
15884                 TEST_CASE_ST(ut_setup, ut_teardown,
15885                         test_AES_GCM_auth_decryption_fail_iv_corrupt),
15886                 TEST_CASE_ST(ut_setup, ut_teardown,
15887                         test_AES_GCM_auth_decryption_fail_in_data_corrupt),
15888                 TEST_CASE_ST(ut_setup, ut_teardown,
15889                         test_AES_GCM_auth_decryption_fail_out_data_corrupt),
15890                 TEST_CASE_ST(ut_setup, ut_teardown,
15891                         test_AES_GCM_auth_decryption_fail_aad_len_corrupt),
15892                 TEST_CASE_ST(ut_setup, ut_teardown,
15893                         test_AES_GCM_auth_decryption_fail_aad_corrupt),
15894                 TEST_CASE_ST(ut_setup, ut_teardown,
15895                         test_AES_GCM_auth_decryption_fail_tag_corrupt),
15896
15897                 TEST_CASES_END()
15898         }
15899 };
15900
15901 static struct unit_test_suite cryptodev_negative_aes_gmac_testsuite  = {
15902         .suite_name = "Negative AES GMAC Test Suite",
15903         .setup = negative_aes_gmac_testsuite_setup,
15904         .unit_test_cases = {
15905                 TEST_CASE_ST(ut_setup, ut_teardown,
15906                         authentication_verify_AES128_GMAC_fail_data_corrupt),
15907                 TEST_CASE_ST(ut_setup, ut_teardown,
15908                         authentication_verify_AES128_GMAC_fail_tag_corrupt),
15909
15910                 TEST_CASES_END()
15911         }
15912 };
15913
15914 static struct unit_test_suite cryptodev_mixed_cipher_hash_testsuite  = {
15915         .suite_name = "Mixed CIPHER + HASH algorithms Test Suite",
15916         .setup = mixed_cipher_hash_testsuite_setup,
15917         .unit_test_cases = {
15918                 /** AUTH AES CMAC + CIPHER AES CTR */
15919                 TEST_CASE_ST(ut_setup, ut_teardown,
15920                         test_aes_cmac_aes_ctr_digest_enc_test_case_1),
15921                 TEST_CASE_ST(ut_setup, ut_teardown,
15922                         test_aes_cmac_aes_ctr_digest_enc_test_case_1_oop),
15923                 TEST_CASE_ST(ut_setup, ut_teardown,
15924                         test_aes_cmac_aes_ctr_digest_enc_test_case_1_sgl),
15925                 TEST_CASE_ST(ut_setup, ut_teardown,
15926                         test_aes_cmac_aes_ctr_digest_enc_test_case_1_oop_sgl),
15927                 TEST_CASE_ST(ut_setup, ut_teardown,
15928                         test_verify_aes_cmac_aes_ctr_digest_enc_test_case_1),
15929                 TEST_CASE_ST(ut_setup, ut_teardown,
15930                         test_verify_aes_cmac_aes_ctr_digest_enc_test_case_1_oop),
15931                 TEST_CASE_ST(ut_setup, ut_teardown,
15932                         test_verify_aes_cmac_aes_ctr_digest_enc_test_case_1_sgl),
15933                 TEST_CASE_ST(ut_setup, ut_teardown,
15934                         test_verify_aes_cmac_aes_ctr_digest_enc_test_case_1_oop_sgl),
15935
15936                 /** AUTH ZUC + CIPHER SNOW3G */
15937                 TEST_CASE_ST(ut_setup, ut_teardown,
15938                         test_auth_zuc_cipher_snow_test_case_1),
15939                 TEST_CASE_ST(ut_setup, ut_teardown,
15940                         test_verify_auth_zuc_cipher_snow_test_case_1),
15941                 /** AUTH AES CMAC + CIPHER SNOW3G */
15942                 TEST_CASE_ST(ut_setup, ut_teardown,
15943                         test_auth_aes_cmac_cipher_snow_test_case_1),
15944                 TEST_CASE_ST(ut_setup, ut_teardown,
15945                         test_verify_auth_aes_cmac_cipher_snow_test_case_1),
15946                 /** AUTH ZUC + CIPHER AES CTR */
15947                 TEST_CASE_ST(ut_setup, ut_teardown,
15948                         test_auth_zuc_cipher_aes_ctr_test_case_1),
15949                 TEST_CASE_ST(ut_setup, ut_teardown,
15950                         test_verify_auth_zuc_cipher_aes_ctr_test_case_1),
15951                 /** AUTH SNOW3G + CIPHER AES CTR */
15952                 TEST_CASE_ST(ut_setup, ut_teardown,
15953                         test_auth_snow_cipher_aes_ctr_test_case_1),
15954                 TEST_CASE_ST(ut_setup, ut_teardown,
15955                         test_verify_auth_snow_cipher_aes_ctr_test_case_1),
15956                 /** AUTH SNOW3G + CIPHER ZUC */
15957                 TEST_CASE_ST(ut_setup, ut_teardown,
15958                         test_auth_snow_cipher_zuc_test_case_1),
15959                 TEST_CASE_ST(ut_setup, ut_teardown,
15960                         test_verify_auth_snow_cipher_zuc_test_case_1),
15961                 /** AUTH AES CMAC + CIPHER ZUC */
15962                 TEST_CASE_ST(ut_setup, ut_teardown,
15963                         test_auth_aes_cmac_cipher_zuc_test_case_1),
15964                 TEST_CASE_ST(ut_setup, ut_teardown,
15965                         test_verify_auth_aes_cmac_cipher_zuc_test_case_1),
15966
15967                 /** AUTH NULL + CIPHER SNOW3G */
15968                 TEST_CASE_ST(ut_setup, ut_teardown,
15969                         test_auth_null_cipher_snow_test_case_1),
15970                 TEST_CASE_ST(ut_setup, ut_teardown,
15971                         test_verify_auth_null_cipher_snow_test_case_1),
15972                 /** AUTH NULL + CIPHER ZUC */
15973                 TEST_CASE_ST(ut_setup, ut_teardown,
15974                         test_auth_null_cipher_zuc_test_case_1),
15975                 TEST_CASE_ST(ut_setup, ut_teardown,
15976                         test_verify_auth_null_cipher_zuc_test_case_1),
15977                 /** AUTH SNOW3G + CIPHER NULL */
15978                 TEST_CASE_ST(ut_setup, ut_teardown,
15979                         test_auth_snow_cipher_null_test_case_1),
15980                 TEST_CASE_ST(ut_setup, ut_teardown,
15981                         test_verify_auth_snow_cipher_null_test_case_1),
15982                 /** AUTH ZUC + CIPHER NULL */
15983                 TEST_CASE_ST(ut_setup, ut_teardown,
15984                         test_auth_zuc_cipher_null_test_case_1),
15985                 TEST_CASE_ST(ut_setup, ut_teardown,
15986                         test_verify_auth_zuc_cipher_null_test_case_1),
15987                 /** AUTH NULL + CIPHER AES CTR */
15988                 TEST_CASE_ST(ut_setup, ut_teardown,
15989                         test_auth_null_cipher_aes_ctr_test_case_1),
15990                 TEST_CASE_ST(ut_setup, ut_teardown,
15991                         test_verify_auth_null_cipher_aes_ctr_test_case_1),
15992                 /** AUTH AES CMAC + CIPHER NULL */
15993                 TEST_CASE_ST(ut_setup, ut_teardown,
15994                         test_auth_aes_cmac_cipher_null_test_case_1),
15995                 TEST_CASE_ST(ut_setup, ut_teardown,
15996                         test_verify_auth_aes_cmac_cipher_null_test_case_1),
15997                 TEST_CASES_END()
15998         }
15999 };
16000
16001 static int
16002 run_cryptodev_testsuite(const char *pmd_name)
16003 {
16004         uint8_t ret, j, i = 0, blk_start_idx = 0;
16005         const enum blockcipher_test_type blk_suites[] = {
16006                 BLKCIPHER_AES_CHAIN_TYPE,
16007                 BLKCIPHER_AES_CIPHERONLY_TYPE,
16008                 BLKCIPHER_AES_DOCSIS_TYPE,
16009                 BLKCIPHER_3DES_CHAIN_TYPE,
16010                 BLKCIPHER_3DES_CIPHERONLY_TYPE,
16011                 BLKCIPHER_DES_CIPHERONLY_TYPE,
16012                 BLKCIPHER_DES_DOCSIS_TYPE,
16013                 BLKCIPHER_AUTHONLY_TYPE};
16014         struct unit_test_suite *static_suites[] = {
16015                 &cryptodev_multi_session_testsuite,
16016                 &cryptodev_null_testsuite,
16017                 &cryptodev_aes_ccm_auth_testsuite,
16018                 &cryptodev_aes_gcm_auth_testsuite,
16019                 &cryptodev_aes_gmac_auth_testsuite,
16020                 &cryptodev_snow3g_testsuite,
16021                 &cryptodev_chacha20_poly1305_testsuite,
16022                 &cryptodev_zuc_testsuite,
16023                 &cryptodev_hmac_md5_auth_testsuite,
16024                 &cryptodev_kasumi_testsuite,
16025                 &cryptodev_esn_testsuite,
16026                 &cryptodev_negative_aes_gcm_testsuite,
16027                 &cryptodev_negative_aes_gmac_testsuite,
16028                 &cryptodev_mixed_cipher_hash_testsuite,
16029                 &cryptodev_negative_hmac_sha1_testsuite,
16030                 &cryptodev_gen_testsuite,
16031 #ifdef RTE_LIB_SECURITY
16032                 &ipsec_proto_testsuite,
16033                 &pdcp_proto_testsuite,
16034                 &docsis_proto_testsuite,
16035 #endif
16036                 &end_testsuite
16037         };
16038         static struct unit_test_suite ts = {
16039                 .suite_name = "Cryptodev Unit Test Suite",
16040                 .setup = testsuite_setup,
16041                 .teardown = testsuite_teardown,
16042                 .unit_test_cases = {TEST_CASES_END()}
16043         };
16044
16045         gbl_driver_id = rte_cryptodev_driver_id_get(pmd_name);
16046
16047         if (gbl_driver_id == -1) {
16048                 RTE_LOG(ERR, USER1, "%s PMD must be loaded.\n", pmd_name);
16049                 return TEST_SKIPPED;
16050         }
16051
16052         ts.unit_test_suites = malloc(sizeof(struct unit_test_suite *) *
16053                         (RTE_DIM(blk_suites) + RTE_DIM(static_suites)));
16054
16055         ADD_BLOCKCIPHER_TESTSUITE(i, ts, blk_suites, RTE_DIM(blk_suites));
16056         ADD_STATIC_TESTSUITE(i, ts, static_suites, RTE_DIM(static_suites));
16057         ret = unit_test_suite_runner(&ts);
16058
16059         FREE_BLOCKCIPHER_TESTSUITE(blk_start_idx, ts, RTE_DIM(blk_suites));
16060         free(ts.unit_test_suites);
16061         return ret;
16062 }
16063
16064 static int
16065 require_feature_flag(const char *pmd_name, uint64_t flag, const char *flag_name)
16066 {
16067         struct rte_cryptodev_info dev_info;
16068         uint8_t i, nb_devs;
16069         int driver_id;
16070
16071         driver_id = rte_cryptodev_driver_id_get(pmd_name);
16072         if (driver_id == -1) {
16073                 RTE_LOG(WARNING, USER1, "%s PMD must be loaded.\n", pmd_name);
16074                 return TEST_SKIPPED;
16075         }
16076
16077         nb_devs = rte_cryptodev_count();
16078         if (nb_devs < 1) {
16079                 RTE_LOG(WARNING, USER1, "No crypto devices found?\n");
16080                 return TEST_SKIPPED;
16081         }
16082
16083         for (i = 0; i < nb_devs; i++) {
16084                 rte_cryptodev_info_get(i, &dev_info);
16085                 if (dev_info.driver_id == driver_id) {
16086                         if (!(dev_info.feature_flags & flag)) {
16087                                 RTE_LOG(INFO, USER1, "%s not supported\n",
16088                                                 flag_name);
16089                                 return TEST_SKIPPED;
16090                         }
16091                         return 0; /* found */
16092                 }
16093         }
16094
16095         RTE_LOG(INFO, USER1, "%s not supported\n", flag_name);
16096         return TEST_SKIPPED;
16097 }
16098
16099 static int
16100 test_cryptodev_qat(void)
16101 {
16102         return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_QAT_SYM_PMD));
16103 }
16104
16105 static int
16106 test_cryptodev_virtio(void)
16107 {
16108         return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_VIRTIO_PMD));
16109 }
16110
16111 static int
16112 test_cryptodev_aesni_mb(void)
16113 {
16114         return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_AESNI_MB_PMD));
16115 }
16116
16117 static int
16118 test_cryptodev_cpu_aesni_mb(void)
16119 {
16120         int32_t rc;
16121         enum rte_security_session_action_type at = gbl_action_type;
16122         gbl_action_type = RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO;
16123         rc = run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_AESNI_MB_PMD));
16124         gbl_action_type = at;
16125         return rc;
16126 }
16127
16128 static int
16129 test_cryptodev_chacha_poly_mb(void)
16130 {
16131         int32_t rc;
16132         enum rte_security_session_action_type at = gbl_action_type;
16133         rc = run_cryptodev_testsuite(
16134                         RTE_STR(CRYPTODEV_NAME_CHACHA20_POLY1305_PMD));
16135         gbl_action_type = at;
16136         return rc;
16137 }
16138
16139 static int
16140 test_cryptodev_openssl(void)
16141 {
16142         return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_OPENSSL_PMD));
16143 }
16144
16145 static int
16146 test_cryptodev_aesni_gcm(void)
16147 {
16148         return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_AESNI_GCM_PMD));
16149 }
16150
16151 static int
16152 test_cryptodev_cpu_aesni_gcm(void)
16153 {
16154         int32_t rc;
16155         enum rte_security_session_action_type at = gbl_action_type;
16156         gbl_action_type = RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO;
16157         rc  = run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_AESNI_GCM_PMD));
16158         gbl_action_type = at;
16159         return rc;
16160 }
16161
16162 static int
16163 test_cryptodev_mlx5(void)
16164 {
16165         return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_MLX5_PMD));
16166 }
16167
16168 static int
16169 test_cryptodev_null(void)
16170 {
16171         return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_NULL_PMD));
16172 }
16173
16174 static int
16175 test_cryptodev_sw_snow3g(void)
16176 {
16177         return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_SNOW3G_PMD));
16178 }
16179
16180 static int
16181 test_cryptodev_sw_kasumi(void)
16182 {
16183         return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_KASUMI_PMD));
16184 }
16185
16186 static int
16187 test_cryptodev_sw_zuc(void)
16188 {
16189         return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_ZUC_PMD));
16190 }
16191
16192 static int
16193 test_cryptodev_armv8(void)
16194 {
16195         return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_ARMV8_PMD));
16196 }
16197
16198 static int
16199 test_cryptodev_mrvl(void)
16200 {
16201         return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_MVSAM_PMD));
16202 }
16203
16204 #ifdef RTE_CRYPTO_SCHEDULER
16205
16206 static int
16207 test_cryptodev_scheduler(void)
16208 {
16209         uint8_t ret, sched_i, j, i = 0, blk_start_idx = 0;
16210         const enum blockcipher_test_type blk_suites[] = {
16211                 BLKCIPHER_AES_CHAIN_TYPE,
16212                 BLKCIPHER_AES_CIPHERONLY_TYPE,
16213                 BLKCIPHER_AUTHONLY_TYPE
16214         };
16215         static struct unit_test_suite scheduler_multicore = {
16216                 .suite_name = "Scheduler Multicore Unit Test Suite",
16217                 .setup = scheduler_multicore_testsuite_setup,
16218                 .teardown = scheduler_mode_testsuite_teardown,
16219                 .unit_test_cases = {TEST_CASES_END()}
16220         };
16221         static struct unit_test_suite scheduler_round_robin = {
16222                 .suite_name = "Scheduler Round Robin Unit Test Suite",
16223                 .setup = scheduler_roundrobin_testsuite_setup,
16224                 .teardown = scheduler_mode_testsuite_teardown,
16225                 .unit_test_cases = {TEST_CASES_END()}
16226         };
16227         static struct unit_test_suite scheduler_failover = {
16228                 .suite_name = "Scheduler Failover Unit Test Suite",
16229                 .setup = scheduler_failover_testsuite_setup,
16230                 .teardown = scheduler_mode_testsuite_teardown,
16231                 .unit_test_cases = {TEST_CASES_END()}
16232         };
16233         static struct unit_test_suite scheduler_pkt_size_distr = {
16234                 .suite_name = "Scheduler Pkt Size Distr Unit Test Suite",
16235                 .setup = scheduler_pkt_size_distr_testsuite_setup,
16236                 .teardown = scheduler_mode_testsuite_teardown,
16237                 .unit_test_cases = {TEST_CASES_END()}
16238         };
16239         struct unit_test_suite *sched_mode_suites[] = {
16240                 &scheduler_multicore,
16241                 &scheduler_round_robin,
16242                 &scheduler_failover,
16243                 &scheduler_pkt_size_distr
16244         };
16245         static struct unit_test_suite scheduler_config = {
16246                 .suite_name = "Crypto Device Scheduler Config Unit Test Suite",
16247                 .unit_test_cases = {
16248                         TEST_CASE(test_scheduler_attach_worker_op),
16249                         TEST_CASE(test_scheduler_mode_multicore_op),
16250                         TEST_CASE(test_scheduler_mode_roundrobin_op),
16251                         TEST_CASE(test_scheduler_mode_failover_op),
16252                         TEST_CASE(test_scheduler_mode_pkt_size_distr_op),
16253                         TEST_CASE(test_scheduler_detach_worker_op),
16254
16255                         TEST_CASES_END() /**< NULL terminate array */
16256                 }
16257         };
16258         struct unit_test_suite *static_suites[] = {
16259                 &scheduler_config,
16260                 &end_testsuite
16261         };
16262         static struct unit_test_suite ts = {
16263                 .suite_name = "Scheduler Unit Test Suite",
16264                 .setup = scheduler_testsuite_setup,
16265                 .teardown = testsuite_teardown,
16266                 .unit_test_cases = {TEST_CASES_END()}
16267         };
16268
16269         gbl_driver_id = rte_cryptodev_driver_id_get(
16270                         RTE_STR(CRYPTODEV_NAME_SCHEDULER_PMD));
16271
16272         if (gbl_driver_id == -1) {
16273                 RTE_LOG(ERR, USER1, "SCHEDULER PMD must be loaded.\n");
16274                 return TEST_SKIPPED;
16275         }
16276
16277         if (rte_cryptodev_driver_id_get(
16278                                 RTE_STR(CRYPTODEV_NAME_AESNI_MB_PMD)) == -1) {
16279                 RTE_LOG(ERR, USER1, "AESNI MB PMD must be loaded.\n");
16280                 return TEST_SKIPPED;
16281         }
16282
16283         for (sched_i = 0; sched_i < RTE_DIM(sched_mode_suites); sched_i++) {
16284                 uint8_t blk_i = 0;
16285                 sched_mode_suites[sched_i]->unit_test_suites = malloc(sizeof
16286                                 (struct unit_test_suite *) *
16287                                 (RTE_DIM(blk_suites) + 1));
16288                 ADD_BLOCKCIPHER_TESTSUITE(blk_i, (*sched_mode_suites[sched_i]),
16289                                 blk_suites, RTE_DIM(blk_suites));
16290                 sched_mode_suites[sched_i]->unit_test_suites[blk_i] = &end_testsuite;
16291         }
16292
16293         ts.unit_test_suites = malloc(sizeof(struct unit_test_suite *) *
16294                         (RTE_DIM(static_suites) + RTE_DIM(sched_mode_suites)));
16295         ADD_STATIC_TESTSUITE(i, ts, sched_mode_suites,
16296                         RTE_DIM(sched_mode_suites));
16297         ADD_STATIC_TESTSUITE(i, ts, static_suites, RTE_DIM(static_suites));
16298         ret = unit_test_suite_runner(&ts);
16299
16300         for (sched_i = 0; sched_i < RTE_DIM(sched_mode_suites); sched_i++) {
16301                 FREE_BLOCKCIPHER_TESTSUITE(blk_start_idx,
16302                                 (*sched_mode_suites[sched_i]),
16303                                 RTE_DIM(blk_suites));
16304                 free(sched_mode_suites[sched_i]->unit_test_suites);
16305         }
16306         free(ts.unit_test_suites);
16307         return ret;
16308 }
16309
16310 REGISTER_TEST_COMMAND(cryptodev_scheduler_autotest, test_cryptodev_scheduler);
16311
16312 #endif
16313
16314 static int
16315 test_cryptodev_dpaa2_sec(void)
16316 {
16317         return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_DPAA2_SEC_PMD));
16318 }
16319
16320 static int
16321 test_cryptodev_dpaa_sec(void)
16322 {
16323         return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_DPAA_SEC_PMD));
16324 }
16325
16326 static int
16327 test_cryptodev_ccp(void)
16328 {
16329         return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_CCP_PMD));
16330 }
16331
16332 static int
16333 test_cryptodev_octeontx(void)
16334 {
16335         return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_OCTEONTX_SYM_PMD));
16336 }
16337
16338 static int
16339 test_cryptodev_caam_jr(void)
16340 {
16341         return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_CAAM_JR_PMD));
16342 }
16343
16344 static int
16345 test_cryptodev_nitrox(void)
16346 {
16347         return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_NITROX_PMD));
16348 }
16349
16350 static int
16351 test_cryptodev_bcmfs(void)
16352 {
16353         return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_BCMFS_PMD));
16354 }
16355
16356 static int
16357 test_cryptodev_qat_raw_api(void)
16358 {
16359         static const char *pmd_name = RTE_STR(CRYPTODEV_NAME_QAT_SYM_PMD);
16360         int ret;
16361
16362         ret = require_feature_flag(pmd_name, RTE_CRYPTODEV_FF_SYM_RAW_DP,
16363                         "RAW API");
16364         if (ret)
16365                 return ret;
16366
16367         global_api_test_type = CRYPTODEV_RAW_API_TEST;
16368         ret = run_cryptodev_testsuite(pmd_name);
16369         global_api_test_type = CRYPTODEV_API_TEST;
16370
16371         return ret;
16372 }
16373
16374 static int
16375 test_cryptodev_cn9k(void)
16376 {
16377         return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_CN9K_PMD));
16378 }
16379
16380 static int
16381 test_cryptodev_cn10k(void)
16382 {
16383         return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_CN10K_PMD));
16384 }
16385
16386 static int
16387 test_cryptodev_dpaa2_sec_raw_api(void)
16388 {
16389         static const char *pmd_name = RTE_STR(CRYPTODEV_NAME_DPAA2_SEC_PMD);
16390         int ret;
16391
16392         ret = require_feature_flag(pmd_name, RTE_CRYPTODEV_FF_SYM_RAW_DP,
16393                         "RAW API");
16394         if (ret)
16395                 return ret;
16396
16397         global_api_test_type = CRYPTODEV_RAW_API_TEST;
16398         ret = run_cryptodev_testsuite(pmd_name);
16399         global_api_test_type = CRYPTODEV_API_TEST;
16400
16401         return ret;
16402 }
16403
16404 static int
16405 test_cryptodev_dpaa_sec_raw_api(void)
16406 {
16407         static const char *pmd_name = RTE_STR(CRYPTODEV_NAME_DPAA2_SEC_PMD);
16408         int ret;
16409
16410         ret = require_feature_flag(pmd_name, RTE_CRYPTODEV_FF_SYM_RAW_DP,
16411                         "RAW API");
16412         if (ret)
16413                 return ret;
16414
16415         global_api_test_type = CRYPTODEV_RAW_API_TEST;
16416         ret = run_cryptodev_testsuite(pmd_name);
16417         global_api_test_type = CRYPTODEV_API_TEST;
16418
16419         return ret;
16420 }
16421
16422 REGISTER_TEST_COMMAND(cryptodev_dpaa2_sec_raw_api_autotest,
16423                 test_cryptodev_dpaa2_sec_raw_api);
16424 REGISTER_TEST_COMMAND(cryptodev_dpaa_sec_raw_api_autotest,
16425                 test_cryptodev_dpaa_sec_raw_api);
16426 REGISTER_TEST_COMMAND(cryptodev_qat_raw_api_autotest,
16427                 test_cryptodev_qat_raw_api);
16428 REGISTER_TEST_COMMAND(cryptodev_qat_autotest, test_cryptodev_qat);
16429 REGISTER_TEST_COMMAND(cryptodev_aesni_mb_autotest, test_cryptodev_aesni_mb);
16430 REGISTER_TEST_COMMAND(cryptodev_cpu_aesni_mb_autotest,
16431         test_cryptodev_cpu_aesni_mb);
16432 REGISTER_TEST_COMMAND(cryptodev_chacha_poly_mb_autotest,
16433         test_cryptodev_chacha_poly_mb);
16434 REGISTER_TEST_COMMAND(cryptodev_openssl_autotest, test_cryptodev_openssl);
16435 REGISTER_TEST_COMMAND(cryptodev_aesni_gcm_autotest, test_cryptodev_aesni_gcm);
16436 REGISTER_TEST_COMMAND(cryptodev_cpu_aesni_gcm_autotest,
16437         test_cryptodev_cpu_aesni_gcm);
16438 REGISTER_TEST_COMMAND(cryptodev_mlx5_autotest, test_cryptodev_mlx5);
16439 REGISTER_TEST_COMMAND(cryptodev_null_autotest, test_cryptodev_null);
16440 REGISTER_TEST_COMMAND(cryptodev_sw_snow3g_autotest, test_cryptodev_sw_snow3g);
16441 REGISTER_TEST_COMMAND(cryptodev_sw_kasumi_autotest, test_cryptodev_sw_kasumi);
16442 REGISTER_TEST_COMMAND(cryptodev_sw_zuc_autotest, test_cryptodev_sw_zuc);
16443 REGISTER_TEST_COMMAND(cryptodev_sw_armv8_autotest, test_cryptodev_armv8);
16444 REGISTER_TEST_COMMAND(cryptodev_sw_mvsam_autotest, test_cryptodev_mrvl);
16445 REGISTER_TEST_COMMAND(cryptodev_dpaa2_sec_autotest, test_cryptodev_dpaa2_sec);
16446 REGISTER_TEST_COMMAND(cryptodev_dpaa_sec_autotest, test_cryptodev_dpaa_sec);
16447 REGISTER_TEST_COMMAND(cryptodev_ccp_autotest, test_cryptodev_ccp);
16448 REGISTER_TEST_COMMAND(cryptodev_virtio_autotest, test_cryptodev_virtio);
16449 REGISTER_TEST_COMMAND(cryptodev_octeontx_autotest, test_cryptodev_octeontx);
16450 REGISTER_TEST_COMMAND(cryptodev_caam_jr_autotest, test_cryptodev_caam_jr);
16451 REGISTER_TEST_COMMAND(cryptodev_nitrox_autotest, test_cryptodev_nitrox);
16452 REGISTER_TEST_COMMAND(cryptodev_bcmfs_autotest, test_cryptodev_bcmfs);
16453 REGISTER_TEST_COMMAND(cryptodev_cn9k_autotest, test_cryptodev_cn9k);
16454 REGISTER_TEST_COMMAND(cryptodev_cn10k_autotest, test_cryptodev_cn10k);
16455
16456 #endif /* !RTE_EXEC_ENV_WINDOWS */