cryptodev: reorganize asymmetric structs
[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                 } else {
9189                         memcpy(&ipsec_xform.tunnel.ipv6.src_addr, &v6_src,
9190                                sizeof(v6_src));
9191                         memcpy(&ipsec_xform.tunnel.ipv6.dst_addr, &v6_dst,
9192                                sizeof(v6_dst));
9193                 }
9194         }
9195
9196         ctx = rte_cryptodev_get_sec_ctx(dev_id);
9197
9198         sec_cap_idx.action = ut_params->type;
9199         sec_cap_idx.protocol = RTE_SECURITY_PROTOCOL_IPSEC;
9200         sec_cap_idx.ipsec.proto = ipsec_xform.proto;
9201         sec_cap_idx.ipsec.mode = ipsec_xform.mode;
9202         sec_cap_idx.ipsec.direction = ipsec_xform.direction;
9203
9204         if (flags->udp_encap)
9205                 ipsec_xform.options.udp_encap = 1;
9206
9207         sec_cap = rte_security_capability_get(ctx, &sec_cap_idx);
9208         if (sec_cap == NULL)
9209                 return TEST_SKIPPED;
9210
9211         /* Copy cipher session parameters */
9212         if (td[0].aead) {
9213                 memcpy(&ut_params->aead_xform, &td[0].xform.aead,
9214                        sizeof(ut_params->aead_xform));
9215                 ut_params->aead_xform.aead.key.data = td[0].key.data;
9216                 ut_params->aead_xform.aead.iv.offset = IV_OFFSET;
9217
9218                 /* Verify crypto capabilities */
9219                 if (test_ipsec_crypto_caps_aead_verify(
9220                                 sec_cap,
9221                                 &ut_params->aead_xform) != 0) {
9222                         if (!silent)
9223                                 RTE_LOG(INFO, USER1,
9224                                         "Crypto capabilities not supported\n");
9225                         return TEST_SKIPPED;
9226                 }
9227         } else {
9228                 memcpy(&ut_params->cipher_xform, &td[0].xform.chain.cipher,
9229                        sizeof(ut_params->cipher_xform));
9230                 memcpy(&ut_params->auth_xform, &td[0].xform.chain.auth,
9231                        sizeof(ut_params->auth_xform));
9232                 ut_params->cipher_xform.cipher.key.data = td[0].key.data;
9233                 ut_params->cipher_xform.cipher.iv.offset = IV_OFFSET;
9234                 ut_params->auth_xform.auth.key.data = td[0].auth_key.data;
9235
9236                 /* Verify crypto capabilities */
9237
9238                 if (test_ipsec_crypto_caps_cipher_verify(
9239                                 sec_cap,
9240                                 &ut_params->cipher_xform) != 0) {
9241                         if (!silent)
9242                                 RTE_LOG(INFO, USER1,
9243                                         "Cipher crypto capabilities not supported\n");
9244                         return TEST_SKIPPED;
9245                 }
9246
9247                 if (test_ipsec_crypto_caps_auth_verify(
9248                                 sec_cap,
9249                                 &ut_params->auth_xform) != 0) {
9250                         if (!silent)
9251                                 RTE_LOG(INFO, USER1,
9252                                         "Auth crypto capabilities not supported\n");
9253                         return TEST_SKIPPED;
9254                 }
9255         }
9256
9257         if (test_ipsec_sec_caps_verify(&ipsec_xform, sec_cap, silent) != 0)
9258                 return TEST_SKIPPED;
9259
9260         struct rte_security_session_conf sess_conf = {
9261                 .action_type = ut_params->type,
9262                 .protocol = RTE_SECURITY_PROTOCOL_IPSEC,
9263         };
9264
9265         if (td[0].aead) {
9266                 salt_len = RTE_MIN(sizeof(ipsec_xform.salt), td[0].salt.len);
9267                 memcpy(&ipsec_xform.salt, td[0].salt.data, salt_len);
9268                 sess_conf.ipsec = ipsec_xform;
9269                 sess_conf.crypto_xform = &ut_params->aead_xform;
9270         } else {
9271                 sess_conf.ipsec = ipsec_xform;
9272                 if (dir == RTE_SECURITY_IPSEC_SA_DIR_EGRESS) {
9273                         sess_conf.crypto_xform = &ut_params->cipher_xform;
9274                         ut_params->cipher_xform.next = &ut_params->auth_xform;
9275                 } else {
9276                         sess_conf.crypto_xform = &ut_params->auth_xform;
9277                         ut_params->auth_xform.next = &ut_params->cipher_xform;
9278                 }
9279         }
9280
9281         /* Create security session */
9282         ut_params->sec_session = rte_security_session_create(ctx, &sess_conf,
9283                                         ts_params->session_mpool,
9284                                         ts_params->session_priv_mpool);
9285
9286         if (ut_params->sec_session == NULL)
9287                 return TEST_SKIPPED;
9288
9289         for (i = 0; i < nb_td; i++) {
9290                 /* Setup source mbuf payload */
9291                 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
9292                 memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
9293                                 rte_pktmbuf_tailroom(ut_params->ibuf));
9294
9295                 input_text = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
9296                                 td[i].input_text.len);
9297
9298                 memcpy(input_text, td[i].input_text.data,
9299                        td[i].input_text.len);
9300
9301                 if (test_ipsec_pkt_update(input_text, flags))
9302                         return TEST_FAILED;
9303
9304                 /* Generate crypto op data structure */
9305                 ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
9306                                         RTE_CRYPTO_OP_TYPE_SYMMETRIC);
9307                 if (!ut_params->op) {
9308                         printf("TestCase %s line %d: %s\n",
9309                                 __func__, __LINE__,
9310                                 "failed to allocate crypto op");
9311                         ret = TEST_FAILED;
9312                         goto crypto_op_free;
9313                 }
9314
9315                 /* Attach session to operation */
9316                 rte_security_attach_session(ut_params->op,
9317                                             ut_params->sec_session);
9318
9319                 /* Set crypto operation mbufs */
9320                 ut_params->op->sym->m_src = ut_params->ibuf;
9321                 ut_params->op->sym->m_dst = NULL;
9322
9323                 /* Copy IV in crypto operation when IV generation is disabled */
9324                 if (dir == RTE_SECURITY_IPSEC_SA_DIR_EGRESS &&
9325                     ipsec_xform.options.iv_gen_disable == 1) {
9326                         uint8_t *iv = rte_crypto_op_ctod_offset(ut_params->op,
9327                                                                 uint8_t *,
9328                                                                 IV_OFFSET);
9329                         int len;
9330
9331                         if (td[i].aead)
9332                                 len = td[i].xform.aead.aead.iv.length;
9333                         else
9334                                 len = td[i].xform.chain.cipher.cipher.iv.length;
9335
9336                         memcpy(iv, td[i].iv.data, len);
9337                 }
9338
9339                 /* Process crypto operation */
9340                 process_crypto_request(dev_id, ut_params->op);
9341
9342                 ret = test_ipsec_status_check(ut_params->op, flags, dir, i + 1);
9343                 if (ret != TEST_SUCCESS)
9344                         goto crypto_op_free;
9345
9346                 if (res_d != NULL)
9347                         res_d_tmp = &res_d[i];
9348
9349                 ret = test_ipsec_post_process(ut_params->ibuf, &td[i],
9350                                               res_d_tmp, silent, flags);
9351                 if (ret != TEST_SUCCESS)
9352                         goto crypto_op_free;
9353
9354                 ret = test_ipsec_stats_verify(ctx, ut_params->sec_session,
9355                                               flags, dir);
9356                 if (ret != TEST_SUCCESS)
9357                         goto crypto_op_free;
9358
9359                 rte_crypto_op_free(ut_params->op);
9360                 ut_params->op = NULL;
9361
9362                 rte_pktmbuf_free(ut_params->ibuf);
9363                 ut_params->ibuf = NULL;
9364         }
9365
9366 crypto_op_free:
9367         rte_crypto_op_free(ut_params->op);
9368         ut_params->op = NULL;
9369
9370         rte_pktmbuf_free(ut_params->ibuf);
9371         ut_params->ibuf = NULL;
9372
9373         if (ut_params->sec_session)
9374                 rte_security_session_destroy(ctx, ut_params->sec_session);
9375         ut_params->sec_session = NULL;
9376
9377         return ret;
9378 }
9379
9380 static int
9381 test_ipsec_proto_known_vec(const void *test_data)
9382 {
9383         struct ipsec_test_data td_outb;
9384         struct ipsec_test_flags flags;
9385
9386         memset(&flags, 0, sizeof(flags));
9387
9388         memcpy(&td_outb, test_data, sizeof(td_outb));
9389
9390         if (td_outb.aead ||
9391             td_outb.xform.chain.cipher.cipher.algo != RTE_CRYPTO_CIPHER_NULL) {
9392                 /* Disable IV gen to be able to test with known vectors */
9393                 td_outb.ipsec_xform.options.iv_gen_disable = 1;
9394         }
9395
9396         return test_ipsec_proto_process(&td_outb, NULL, 1, false, &flags);
9397 }
9398
9399 static int
9400 test_ipsec_proto_known_vec_inb(const void *test_data)
9401 {
9402         const struct ipsec_test_data *td = test_data;
9403         struct ipsec_test_flags flags;
9404         struct ipsec_test_data td_inb;
9405
9406         memset(&flags, 0, sizeof(flags));
9407
9408         if (td->ipsec_xform.direction == RTE_SECURITY_IPSEC_SA_DIR_EGRESS)
9409                 test_ipsec_td_in_from_out(td, &td_inb);
9410         else
9411                 memcpy(&td_inb, td, sizeof(td_inb));
9412
9413         return test_ipsec_proto_process(&td_inb, NULL, 1, false, &flags);
9414 }
9415
9416 static int
9417 test_ipsec_proto_known_vec_fragmented(const void *test_data)
9418 {
9419         struct ipsec_test_data td_outb;
9420         struct ipsec_test_flags flags;
9421
9422         memset(&flags, 0, sizeof(flags));
9423         flags.fragment = true;
9424
9425         memcpy(&td_outb, test_data, sizeof(td_outb));
9426
9427         /* Disable IV gen to be able to test with known vectors */
9428         td_outb.ipsec_xform.options.iv_gen_disable = 1;
9429
9430         return test_ipsec_proto_process(&td_outb, NULL, 1, false, &flags);
9431 }
9432
9433 static int
9434 test_ipsec_proto_all(const struct ipsec_test_flags *flags)
9435 {
9436         struct ipsec_test_data td_outb[IPSEC_TEST_PACKETS_MAX];
9437         struct ipsec_test_data td_inb[IPSEC_TEST_PACKETS_MAX];
9438         unsigned int i, nb_pkts = 1, pass_cnt = 0;
9439         int ret;
9440
9441         if (flags->iv_gen ||
9442             flags->sa_expiry_pkts_soft ||
9443             flags->sa_expiry_pkts_hard)
9444                 nb_pkts = IPSEC_TEST_PACKETS_MAX;
9445
9446         for (i = 0; i < RTE_DIM(alg_list); i++) {
9447                 test_ipsec_td_prepare(alg_list[i].param1,
9448                                       alg_list[i].param2,
9449                                       flags,
9450                                       td_outb,
9451                                       nb_pkts);
9452
9453                 if (!td_outb->aead) {
9454                         enum rte_crypto_cipher_algorithm cipher_alg;
9455                         enum rte_crypto_auth_algorithm auth_alg;
9456
9457                         cipher_alg = td_outb->xform.chain.cipher.cipher.algo;
9458                         auth_alg = td_outb->xform.chain.auth.auth.algo;
9459
9460                         /* ICV is not applicable for NULL auth */
9461                         if (flags->icv_corrupt &&
9462                             auth_alg == RTE_CRYPTO_AUTH_NULL)
9463                                 continue;
9464
9465                         /* IV is not applicable for NULL cipher */
9466                         if (flags->iv_gen &&
9467                             cipher_alg == RTE_CRYPTO_CIPHER_NULL)
9468                                 continue;
9469                 }
9470
9471                 ret = test_ipsec_proto_process(td_outb, td_inb, nb_pkts, true,
9472                                                flags);
9473                 if (ret == TEST_SKIPPED)
9474                         continue;
9475
9476                 if (ret == TEST_FAILED)
9477                         return TEST_FAILED;
9478
9479                 test_ipsec_td_update(td_inb, td_outb, nb_pkts, flags);
9480
9481                 ret = test_ipsec_proto_process(td_inb, NULL, nb_pkts, true,
9482                                                flags);
9483                 if (ret == TEST_SKIPPED)
9484                         continue;
9485
9486                 if (ret == TEST_FAILED)
9487                         return TEST_FAILED;
9488
9489                 if (flags->display_alg)
9490                         test_ipsec_display_alg(alg_list[i].param1,
9491                                                alg_list[i].param2);
9492
9493                 pass_cnt++;
9494         }
9495
9496         if (pass_cnt > 0)
9497                 return TEST_SUCCESS;
9498         else
9499                 return TEST_SKIPPED;
9500 }
9501
9502 static int
9503 test_ipsec_proto_display_list(const void *data __rte_unused)
9504 {
9505         struct ipsec_test_flags flags;
9506
9507         memset(&flags, 0, sizeof(flags));
9508
9509         flags.display_alg = true;
9510
9511         return test_ipsec_proto_all(&flags);
9512 }
9513
9514 static int
9515 test_ipsec_proto_iv_gen(const void *data __rte_unused)
9516 {
9517         struct ipsec_test_flags flags;
9518
9519         memset(&flags, 0, sizeof(flags));
9520
9521         flags.iv_gen = true;
9522
9523         return test_ipsec_proto_all(&flags);
9524 }
9525
9526 static int
9527 test_ipsec_proto_sa_exp_pkts_soft(const void *data __rte_unused)
9528 {
9529         struct ipsec_test_flags flags;
9530
9531         memset(&flags, 0, sizeof(flags));
9532
9533         flags.sa_expiry_pkts_soft = true;
9534
9535         return test_ipsec_proto_all(&flags);
9536 }
9537
9538 static int
9539 test_ipsec_proto_sa_exp_pkts_hard(const void *data __rte_unused)
9540 {
9541         struct ipsec_test_flags flags;
9542
9543         memset(&flags, 0, sizeof(flags));
9544
9545         flags.sa_expiry_pkts_hard = true;
9546
9547         return test_ipsec_proto_all(&flags);
9548 }
9549
9550 static int
9551 test_ipsec_proto_err_icv_corrupt(const void *data __rte_unused)
9552 {
9553         struct ipsec_test_flags flags;
9554
9555         memset(&flags, 0, sizeof(flags));
9556
9557         flags.icv_corrupt = true;
9558
9559         return test_ipsec_proto_all(&flags);
9560 }
9561
9562 static int
9563 test_ipsec_proto_udp_encap(const void *data __rte_unused)
9564 {
9565         struct ipsec_test_flags flags;
9566
9567         memset(&flags, 0, sizeof(flags));
9568
9569         flags.udp_encap = true;
9570
9571         return test_ipsec_proto_all(&flags);
9572 }
9573
9574 static int
9575 test_ipsec_proto_tunnel_src_dst_addr_verify(const void *data __rte_unused)
9576 {
9577         struct ipsec_test_flags flags;
9578
9579         memset(&flags, 0, sizeof(flags));
9580
9581         flags.tunnel_hdr_verify = RTE_SECURITY_IPSEC_TUNNEL_VERIFY_SRC_DST_ADDR;
9582
9583         return test_ipsec_proto_all(&flags);
9584 }
9585
9586 static int
9587 test_ipsec_proto_tunnel_dst_addr_verify(const void *data __rte_unused)
9588 {
9589         struct ipsec_test_flags flags;
9590
9591         memset(&flags, 0, sizeof(flags));
9592
9593         flags.tunnel_hdr_verify = RTE_SECURITY_IPSEC_TUNNEL_VERIFY_DST_ADDR;
9594
9595         return test_ipsec_proto_all(&flags);
9596 }
9597
9598 static int
9599 test_ipsec_proto_udp_ports_verify(const void *data __rte_unused)
9600 {
9601         struct ipsec_test_flags flags;
9602
9603         memset(&flags, 0, sizeof(flags));
9604
9605         flags.udp_encap = true;
9606         flags.udp_ports_verify = true;
9607
9608         return test_ipsec_proto_all(&flags);
9609 }
9610
9611 static int
9612 test_ipsec_proto_inner_ip_csum(const void *data __rte_unused)
9613 {
9614         struct ipsec_test_flags flags;
9615
9616         memset(&flags, 0, sizeof(flags));
9617
9618         flags.ip_csum = true;
9619
9620         return test_ipsec_proto_all(&flags);
9621 }
9622
9623 static int
9624 test_ipsec_proto_inner_l4_csum(const void *data __rte_unused)
9625 {
9626         struct ipsec_test_flags flags;
9627
9628         memset(&flags, 0, sizeof(flags));
9629
9630         flags.l4_csum = true;
9631
9632         return test_ipsec_proto_all(&flags);
9633 }
9634
9635 static int
9636 test_ipsec_proto_tunnel_v4_in_v4(const void *data __rte_unused)
9637 {
9638         struct ipsec_test_flags flags;
9639
9640         memset(&flags, 0, sizeof(flags));
9641
9642         flags.ipv6 = false;
9643         flags.tunnel_ipv6 = false;
9644
9645         return test_ipsec_proto_all(&flags);
9646 }
9647
9648 static int
9649 test_ipsec_proto_tunnel_v6_in_v6(const void *data __rte_unused)
9650 {
9651         struct ipsec_test_flags flags;
9652
9653         memset(&flags, 0, sizeof(flags));
9654
9655         flags.ipv6 = true;
9656         flags.tunnel_ipv6 = true;
9657
9658         return test_ipsec_proto_all(&flags);
9659 }
9660
9661 static int
9662 test_ipsec_proto_tunnel_v4_in_v6(const void *data __rte_unused)
9663 {
9664         struct ipsec_test_flags flags;
9665
9666         memset(&flags, 0, sizeof(flags));
9667
9668         flags.ipv6 = false;
9669         flags.tunnel_ipv6 = true;
9670
9671         return test_ipsec_proto_all(&flags);
9672 }
9673
9674 static int
9675 test_ipsec_proto_tunnel_v6_in_v4(const void *data __rte_unused)
9676 {
9677         struct ipsec_test_flags flags;
9678
9679         memset(&flags, 0, sizeof(flags));
9680
9681         flags.ipv6 = true;
9682         flags.tunnel_ipv6 = false;
9683
9684         return test_ipsec_proto_all(&flags);
9685 }
9686
9687 static int
9688 test_ipsec_proto_transport_v4(const void *data __rte_unused)
9689 {
9690         struct ipsec_test_flags flags;
9691
9692         memset(&flags, 0, sizeof(flags));
9693
9694         flags.ipv6 = false;
9695         flags.transport = true;
9696
9697         return test_ipsec_proto_all(&flags);
9698 }
9699
9700 static int
9701 test_ipsec_proto_stats(const void *data __rte_unused)
9702 {
9703         struct ipsec_test_flags flags;
9704
9705         memset(&flags, 0, sizeof(flags));
9706
9707         flags.stats_success = true;
9708
9709         return test_ipsec_proto_all(&flags);
9710 }
9711
9712 static int
9713 test_ipsec_proto_pkt_fragment(const void *data __rte_unused)
9714 {
9715         struct ipsec_test_flags flags;
9716
9717         memset(&flags, 0, sizeof(flags));
9718
9719         flags.fragment = true;
9720
9721         return test_ipsec_proto_all(&flags);
9722
9723 }
9724
9725 static int
9726 test_ipsec_proto_copy_df_inner_0(const void *data __rte_unused)
9727 {
9728         struct ipsec_test_flags flags;
9729
9730         memset(&flags, 0, sizeof(flags));
9731
9732         flags.df = TEST_IPSEC_COPY_DF_INNER_0;
9733
9734         return test_ipsec_proto_all(&flags);
9735 }
9736
9737 static int
9738 test_ipsec_proto_copy_df_inner_1(const void *data __rte_unused)
9739 {
9740         struct ipsec_test_flags flags;
9741
9742         memset(&flags, 0, sizeof(flags));
9743
9744         flags.df = TEST_IPSEC_COPY_DF_INNER_1;
9745
9746         return test_ipsec_proto_all(&flags);
9747 }
9748
9749 static int
9750 test_ipsec_proto_set_df_0_inner_1(const void *data __rte_unused)
9751 {
9752         struct ipsec_test_flags flags;
9753
9754         memset(&flags, 0, sizeof(flags));
9755
9756         flags.df = TEST_IPSEC_SET_DF_0_INNER_1;
9757
9758         return test_ipsec_proto_all(&flags);
9759 }
9760
9761 static int
9762 test_ipsec_proto_set_df_1_inner_0(const void *data __rte_unused)
9763 {
9764         struct ipsec_test_flags flags;
9765
9766         memset(&flags, 0, sizeof(flags));
9767
9768         flags.df = TEST_IPSEC_SET_DF_1_INNER_0;
9769
9770         return test_ipsec_proto_all(&flags);
9771 }
9772
9773 static int
9774 test_PDCP_PROTO_all(void)
9775 {
9776         struct crypto_testsuite_params *ts_params = &testsuite_params;
9777         struct crypto_unittest_params *ut_params = &unittest_params;
9778         struct rte_cryptodev_info dev_info;
9779         int status;
9780
9781         rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
9782         uint64_t feat_flags = dev_info.feature_flags;
9783
9784         if (!(feat_flags & RTE_CRYPTODEV_FF_SECURITY))
9785                 return TEST_SKIPPED;
9786
9787         /* Set action type */
9788         ut_params->type = gbl_action_type == RTE_SECURITY_ACTION_TYPE_NONE ?
9789                 RTE_SECURITY_ACTION_TYPE_LOOKASIDE_PROTOCOL :
9790                 gbl_action_type;
9791
9792         if (security_proto_supported(ut_params->type,
9793                         RTE_SECURITY_PROTOCOL_PDCP) < 0)
9794                 return TEST_SKIPPED;
9795
9796         status = test_PDCP_PROTO_cplane_encap_all();
9797         status += test_PDCP_PROTO_cplane_decap_all();
9798         status += test_PDCP_PROTO_uplane_encap_all();
9799         status += test_PDCP_PROTO_uplane_decap_all();
9800         status += test_PDCP_PROTO_SGL_in_place_32B();
9801         status += test_PDCP_PROTO_SGL_oop_32B_128B();
9802         status += test_PDCP_PROTO_SGL_oop_32B_40B();
9803         status += test_PDCP_PROTO_SGL_oop_128B_32B();
9804         status += test_PDCP_SDAP_PROTO_encap_all();
9805         status += test_PDCP_SDAP_PROTO_decap_all();
9806         status += test_PDCP_PROTO_short_mac();
9807
9808         if (status)
9809                 return TEST_FAILED;
9810         else
9811                 return TEST_SUCCESS;
9812 }
9813
9814 static int
9815 test_docsis_proto_uplink(const void *data)
9816 {
9817         const struct docsis_test_data *d_td = data;
9818         struct crypto_testsuite_params *ts_params = &testsuite_params;
9819         struct crypto_unittest_params *ut_params = &unittest_params;
9820         uint8_t *plaintext = NULL;
9821         uint8_t *ciphertext = NULL;
9822         uint8_t *iv_ptr;
9823         int32_t cipher_len, crc_len;
9824         uint32_t crc_data_len;
9825         int ret = TEST_SUCCESS;
9826
9827         struct rte_security_ctx *ctx = (struct rte_security_ctx *)
9828                                         rte_cryptodev_get_sec_ctx(
9829                                                 ts_params->valid_devs[0]);
9830
9831         /* Verify the capabilities */
9832         struct rte_security_capability_idx sec_cap_idx;
9833         const struct rte_security_capability *sec_cap;
9834         const struct rte_cryptodev_capabilities *crypto_cap;
9835         const struct rte_cryptodev_symmetric_capability *sym_cap;
9836         int j = 0;
9837
9838         /* Set action type */
9839         ut_params->type = gbl_action_type == RTE_SECURITY_ACTION_TYPE_NONE ?
9840                 RTE_SECURITY_ACTION_TYPE_LOOKASIDE_PROTOCOL :
9841                 gbl_action_type;
9842
9843         if (security_proto_supported(ut_params->type,
9844                         RTE_SECURITY_PROTOCOL_DOCSIS) < 0)
9845                 return TEST_SKIPPED;
9846
9847         sec_cap_idx.action = ut_params->type;
9848         sec_cap_idx.protocol = RTE_SECURITY_PROTOCOL_DOCSIS;
9849         sec_cap_idx.docsis.direction = RTE_SECURITY_DOCSIS_UPLINK;
9850
9851         sec_cap = rte_security_capability_get(ctx, &sec_cap_idx);
9852         if (sec_cap == NULL)
9853                 return TEST_SKIPPED;
9854
9855         while ((crypto_cap = &sec_cap->crypto_capabilities[j++])->op !=
9856                         RTE_CRYPTO_OP_TYPE_UNDEFINED) {
9857                 if (crypto_cap->op == RTE_CRYPTO_OP_TYPE_SYMMETRIC &&
9858                                 crypto_cap->sym.xform_type ==
9859                                         RTE_CRYPTO_SYM_XFORM_CIPHER &&
9860                                 crypto_cap->sym.cipher.algo ==
9861                                         RTE_CRYPTO_CIPHER_AES_DOCSISBPI) {
9862                         sym_cap = &crypto_cap->sym;
9863                         if (rte_cryptodev_sym_capability_check_cipher(sym_cap,
9864                                                 d_td->key.len,
9865                                                 d_td->iv.len) == 0)
9866                                 break;
9867                 }
9868         }
9869
9870         if (crypto_cap->op == RTE_CRYPTO_OP_TYPE_UNDEFINED)
9871                 return TEST_SKIPPED;
9872
9873         /* Setup source mbuf payload */
9874         ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
9875         memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
9876                         rte_pktmbuf_tailroom(ut_params->ibuf));
9877
9878         ciphertext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
9879                         d_td->ciphertext.len);
9880
9881         memcpy(ciphertext, d_td->ciphertext.data, d_td->ciphertext.len);
9882
9883         /* Setup cipher session parameters */
9884         ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
9885         ut_params->cipher_xform.cipher.algo = RTE_CRYPTO_CIPHER_AES_DOCSISBPI;
9886         ut_params->cipher_xform.cipher.op = RTE_CRYPTO_CIPHER_OP_DECRYPT;
9887         ut_params->cipher_xform.cipher.key.data = d_td->key.data;
9888         ut_params->cipher_xform.cipher.key.length = d_td->key.len;
9889         ut_params->cipher_xform.cipher.iv.length = d_td->iv.len;
9890         ut_params->cipher_xform.cipher.iv.offset = IV_OFFSET;
9891         ut_params->cipher_xform.next = NULL;
9892
9893         /* Setup DOCSIS session parameters */
9894         ut_params->docsis_xform.direction = RTE_SECURITY_DOCSIS_UPLINK;
9895
9896         struct rte_security_session_conf sess_conf = {
9897                 .action_type = ut_params->type,
9898                 .protocol = RTE_SECURITY_PROTOCOL_DOCSIS,
9899                 .docsis = ut_params->docsis_xform,
9900                 .crypto_xform = &ut_params->cipher_xform,
9901         };
9902
9903         /* Create security session */
9904         ut_params->sec_session = rte_security_session_create(ctx, &sess_conf,
9905                                         ts_params->session_mpool,
9906                                         ts_params->session_priv_mpool);
9907
9908         if (!ut_params->sec_session) {
9909                 printf("Test function %s line %u: failed to allocate session\n",
9910                         __func__, __LINE__);
9911                 ret = TEST_FAILED;
9912                 goto on_err;
9913         }
9914
9915         /* Generate crypto op data structure */
9916         ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
9917                                 RTE_CRYPTO_OP_TYPE_SYMMETRIC);
9918         if (!ut_params->op) {
9919                 printf("Test function %s line %u: failed to allocate symmetric "
9920                         "crypto operation\n", __func__, __LINE__);
9921                 ret = TEST_FAILED;
9922                 goto on_err;
9923         }
9924
9925         /* Setup CRC operation parameters */
9926         crc_len = d_td->ciphertext.no_crc == false ?
9927                         (d_td->ciphertext.len -
9928                                 d_td->ciphertext.crc_offset -
9929                                 RTE_ETHER_CRC_LEN) :
9930                         0;
9931         crc_len = crc_len > 0 ? crc_len : 0;
9932         crc_data_len = crc_len == 0 ? 0 : RTE_ETHER_CRC_LEN;
9933         ut_params->op->sym->auth.data.length = crc_len;
9934         ut_params->op->sym->auth.data.offset = d_td->ciphertext.crc_offset;
9935
9936         /* Setup cipher operation parameters */
9937         cipher_len = d_td->ciphertext.no_cipher == false ?
9938                         (d_td->ciphertext.len -
9939                                 d_td->ciphertext.cipher_offset) :
9940                         0;
9941         cipher_len = cipher_len > 0 ? cipher_len : 0;
9942         ut_params->op->sym->cipher.data.length = cipher_len;
9943         ut_params->op->sym->cipher.data.offset = d_td->ciphertext.cipher_offset;
9944
9945         /* Setup cipher IV */
9946         iv_ptr = (uint8_t *)ut_params->op + IV_OFFSET;
9947         rte_memcpy(iv_ptr, d_td->iv.data, d_td->iv.len);
9948
9949         /* Attach session to operation */
9950         rte_security_attach_session(ut_params->op, ut_params->sec_session);
9951
9952         /* Set crypto operation mbufs */
9953         ut_params->op->sym->m_src = ut_params->ibuf;
9954         ut_params->op->sym->m_dst = NULL;
9955
9956         /* Process crypto operation */
9957         if (process_crypto_request(ts_params->valid_devs[0], ut_params->op) ==
9958                         NULL) {
9959                 printf("Test function %s line %u: failed to process security "
9960                         "crypto op\n", __func__, __LINE__);
9961                 ret = TEST_FAILED;
9962                 goto on_err;
9963         }
9964
9965         if (ut_params->op->status != RTE_CRYPTO_OP_STATUS_SUCCESS) {
9966                 printf("Test function %s line %u: failed to process crypto op\n",
9967                         __func__, __LINE__);
9968                 ret = TEST_FAILED;
9969                 goto on_err;
9970         }
9971
9972         /* Validate plaintext */
9973         plaintext = ciphertext;
9974
9975         if (memcmp(plaintext, d_td->plaintext.data,
9976                         d_td->plaintext.len - crc_data_len)) {
9977                 printf("Test function %s line %u: plaintext not as expected\n",
9978                         __func__, __LINE__);
9979                 rte_hexdump(stdout, "expected", d_td->plaintext.data,
9980                                 d_td->plaintext.len);
9981                 rte_hexdump(stdout, "actual", plaintext, d_td->plaintext.len);
9982                 ret = TEST_FAILED;
9983                 goto on_err;
9984         }
9985
9986 on_err:
9987         rte_crypto_op_free(ut_params->op);
9988         ut_params->op = NULL;
9989
9990         if (ut_params->sec_session)
9991                 rte_security_session_destroy(ctx, ut_params->sec_session);
9992         ut_params->sec_session = NULL;
9993
9994         rte_pktmbuf_free(ut_params->ibuf);
9995         ut_params->ibuf = NULL;
9996
9997         return ret;
9998 }
9999
10000 static int
10001 test_docsis_proto_downlink(const void *data)
10002 {
10003         const struct docsis_test_data *d_td = data;
10004         struct crypto_testsuite_params *ts_params = &testsuite_params;
10005         struct crypto_unittest_params *ut_params = &unittest_params;
10006         uint8_t *plaintext = NULL;
10007         uint8_t *ciphertext = NULL;
10008         uint8_t *iv_ptr;
10009         int32_t cipher_len, crc_len;
10010         int ret = TEST_SUCCESS;
10011
10012         struct rte_security_ctx *ctx = (struct rte_security_ctx *)
10013                                         rte_cryptodev_get_sec_ctx(
10014                                                 ts_params->valid_devs[0]);
10015
10016         /* Verify the capabilities */
10017         struct rte_security_capability_idx sec_cap_idx;
10018         const struct rte_security_capability *sec_cap;
10019         const struct rte_cryptodev_capabilities *crypto_cap;
10020         const struct rte_cryptodev_symmetric_capability *sym_cap;
10021         int j = 0;
10022
10023         /* Set action type */
10024         ut_params->type = gbl_action_type == RTE_SECURITY_ACTION_TYPE_NONE ?
10025                 RTE_SECURITY_ACTION_TYPE_LOOKASIDE_PROTOCOL :
10026                 gbl_action_type;
10027
10028         if (security_proto_supported(ut_params->type,
10029                         RTE_SECURITY_PROTOCOL_DOCSIS) < 0)
10030                 return TEST_SKIPPED;
10031
10032         sec_cap_idx.action = ut_params->type;
10033         sec_cap_idx.protocol = RTE_SECURITY_PROTOCOL_DOCSIS;
10034         sec_cap_idx.docsis.direction = RTE_SECURITY_DOCSIS_DOWNLINK;
10035
10036         sec_cap = rte_security_capability_get(ctx, &sec_cap_idx);
10037         if (sec_cap == NULL)
10038                 return TEST_SKIPPED;
10039
10040         while ((crypto_cap = &sec_cap->crypto_capabilities[j++])->op !=
10041                         RTE_CRYPTO_OP_TYPE_UNDEFINED) {
10042                 if (crypto_cap->op == RTE_CRYPTO_OP_TYPE_SYMMETRIC &&
10043                                 crypto_cap->sym.xform_type ==
10044                                         RTE_CRYPTO_SYM_XFORM_CIPHER &&
10045                                 crypto_cap->sym.cipher.algo ==
10046                                         RTE_CRYPTO_CIPHER_AES_DOCSISBPI) {
10047                         sym_cap = &crypto_cap->sym;
10048                         if (rte_cryptodev_sym_capability_check_cipher(sym_cap,
10049                                                 d_td->key.len,
10050                                                 d_td->iv.len) == 0)
10051                                 break;
10052                 }
10053         }
10054
10055         if (crypto_cap->op == RTE_CRYPTO_OP_TYPE_UNDEFINED)
10056                 return TEST_SKIPPED;
10057
10058         /* Setup source mbuf payload */
10059         ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
10060         memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
10061                         rte_pktmbuf_tailroom(ut_params->ibuf));
10062
10063         plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
10064                         d_td->plaintext.len);
10065
10066         memcpy(plaintext, d_td->plaintext.data, d_td->plaintext.len);
10067
10068         /* Setup cipher session parameters */
10069         ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
10070         ut_params->cipher_xform.cipher.algo = RTE_CRYPTO_CIPHER_AES_DOCSISBPI;
10071         ut_params->cipher_xform.cipher.op = RTE_CRYPTO_CIPHER_OP_ENCRYPT;
10072         ut_params->cipher_xform.cipher.key.data = d_td->key.data;
10073         ut_params->cipher_xform.cipher.key.length = d_td->key.len;
10074         ut_params->cipher_xform.cipher.iv.length = d_td->iv.len;
10075         ut_params->cipher_xform.cipher.iv.offset = IV_OFFSET;
10076         ut_params->cipher_xform.next = NULL;
10077
10078         /* Setup DOCSIS session parameters */
10079         ut_params->docsis_xform.direction = RTE_SECURITY_DOCSIS_DOWNLINK;
10080
10081         struct rte_security_session_conf sess_conf = {
10082                 .action_type = ut_params->type,
10083                 .protocol = RTE_SECURITY_PROTOCOL_DOCSIS,
10084                 .docsis = ut_params->docsis_xform,
10085                 .crypto_xform = &ut_params->cipher_xform,
10086         };
10087
10088         /* Create security session */
10089         ut_params->sec_session = rte_security_session_create(ctx, &sess_conf,
10090                                         ts_params->session_mpool,
10091                                         ts_params->session_priv_mpool);
10092
10093         if (!ut_params->sec_session) {
10094                 printf("Test function %s line %u: failed to allocate session\n",
10095                         __func__, __LINE__);
10096                 ret = TEST_FAILED;
10097                 goto on_err;
10098         }
10099
10100         /* Generate crypto op data structure */
10101         ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
10102                                 RTE_CRYPTO_OP_TYPE_SYMMETRIC);
10103         if (!ut_params->op) {
10104                 printf("Test function %s line %u: failed to allocate symmetric "
10105                         "crypto operation\n", __func__, __LINE__);
10106                 ret = TEST_FAILED;
10107                 goto on_err;
10108         }
10109
10110         /* Setup CRC operation parameters */
10111         crc_len = d_td->plaintext.no_crc == false ?
10112                         (d_td->plaintext.len -
10113                                 d_td->plaintext.crc_offset -
10114                                 RTE_ETHER_CRC_LEN) :
10115                         0;
10116         crc_len = crc_len > 0 ? crc_len : 0;
10117         ut_params->op->sym->auth.data.length = crc_len;
10118         ut_params->op->sym->auth.data.offset = d_td->plaintext.crc_offset;
10119
10120         /* Setup cipher operation parameters */
10121         cipher_len = d_td->plaintext.no_cipher == false ?
10122                         (d_td->plaintext.len -
10123                                 d_td->plaintext.cipher_offset) :
10124                         0;
10125         cipher_len = cipher_len > 0 ? cipher_len : 0;
10126         ut_params->op->sym->cipher.data.length = cipher_len;
10127         ut_params->op->sym->cipher.data.offset = d_td->plaintext.cipher_offset;
10128
10129         /* Setup cipher IV */
10130         iv_ptr = (uint8_t *)ut_params->op + IV_OFFSET;
10131         rte_memcpy(iv_ptr, d_td->iv.data, d_td->iv.len);
10132
10133         /* Attach session to operation */
10134         rte_security_attach_session(ut_params->op, ut_params->sec_session);
10135
10136         /* Set crypto operation mbufs */
10137         ut_params->op->sym->m_src = ut_params->ibuf;
10138         ut_params->op->sym->m_dst = NULL;
10139
10140         /* Process crypto operation */
10141         if (process_crypto_request(ts_params->valid_devs[0], ut_params->op) ==
10142                         NULL) {
10143                 printf("Test function %s line %u: failed to process crypto op\n",
10144                         __func__, __LINE__);
10145                 ret = TEST_FAILED;
10146                 goto on_err;
10147         }
10148
10149         if (ut_params->op->status != RTE_CRYPTO_OP_STATUS_SUCCESS) {
10150                 printf("Test function %s line %u: crypto op processing failed\n",
10151                         __func__, __LINE__);
10152                 ret = TEST_FAILED;
10153                 goto on_err;
10154         }
10155
10156         /* Validate ciphertext */
10157         ciphertext = plaintext;
10158
10159         if (memcmp(ciphertext, d_td->ciphertext.data, d_td->ciphertext.len)) {
10160                 printf("Test function %s line %u: plaintext not as expected\n",
10161                         __func__, __LINE__);
10162                 rte_hexdump(stdout, "expected", d_td->ciphertext.data,
10163                                 d_td->ciphertext.len);
10164                 rte_hexdump(stdout, "actual", ciphertext, d_td->ciphertext.len);
10165                 ret = TEST_FAILED;
10166                 goto on_err;
10167         }
10168
10169 on_err:
10170         rte_crypto_op_free(ut_params->op);
10171         ut_params->op = NULL;
10172
10173         if (ut_params->sec_session)
10174                 rte_security_session_destroy(ctx, ut_params->sec_session);
10175         ut_params->sec_session = NULL;
10176
10177         rte_pktmbuf_free(ut_params->ibuf);
10178         ut_params->ibuf = NULL;
10179
10180         return ret;
10181 }
10182 #endif
10183
10184 static int
10185 test_AES_GCM_authenticated_encryption_test_case_1(void)
10186 {
10187         return test_authenticated_encryption(&gcm_test_case_1);
10188 }
10189
10190 static int
10191 test_AES_GCM_authenticated_encryption_test_case_2(void)
10192 {
10193         return test_authenticated_encryption(&gcm_test_case_2);
10194 }
10195
10196 static int
10197 test_AES_GCM_authenticated_encryption_test_case_3(void)
10198 {
10199         return test_authenticated_encryption(&gcm_test_case_3);
10200 }
10201
10202 static int
10203 test_AES_GCM_authenticated_encryption_test_case_4(void)
10204 {
10205         return test_authenticated_encryption(&gcm_test_case_4);
10206 }
10207
10208 static int
10209 test_AES_GCM_authenticated_encryption_test_case_5(void)
10210 {
10211         return test_authenticated_encryption(&gcm_test_case_5);
10212 }
10213
10214 static int
10215 test_AES_GCM_authenticated_encryption_test_case_6(void)
10216 {
10217         return test_authenticated_encryption(&gcm_test_case_6);
10218 }
10219
10220 static int
10221 test_AES_GCM_authenticated_encryption_test_case_7(void)
10222 {
10223         return test_authenticated_encryption(&gcm_test_case_7);
10224 }
10225
10226 static int
10227 test_AES_GCM_authenticated_encryption_test_case_8(void)
10228 {
10229         return test_authenticated_encryption(&gcm_test_case_8);
10230 }
10231
10232 static int
10233 test_AES_GCM_J0_authenticated_encryption_test_case_1(void)
10234 {
10235         return test_authenticated_encryption(&gcm_J0_test_case_1);
10236 }
10237
10238 static int
10239 test_AES_GCM_auth_encryption_test_case_192_1(void)
10240 {
10241         return test_authenticated_encryption(&gcm_test_case_192_1);
10242 }
10243
10244 static int
10245 test_AES_GCM_auth_encryption_test_case_192_2(void)
10246 {
10247         return test_authenticated_encryption(&gcm_test_case_192_2);
10248 }
10249
10250 static int
10251 test_AES_GCM_auth_encryption_test_case_192_3(void)
10252 {
10253         return test_authenticated_encryption(&gcm_test_case_192_3);
10254 }
10255
10256 static int
10257 test_AES_GCM_auth_encryption_test_case_192_4(void)
10258 {
10259         return test_authenticated_encryption(&gcm_test_case_192_4);
10260 }
10261
10262 static int
10263 test_AES_GCM_auth_encryption_test_case_192_5(void)
10264 {
10265         return test_authenticated_encryption(&gcm_test_case_192_5);
10266 }
10267
10268 static int
10269 test_AES_GCM_auth_encryption_test_case_192_6(void)
10270 {
10271         return test_authenticated_encryption(&gcm_test_case_192_6);
10272 }
10273
10274 static int
10275 test_AES_GCM_auth_encryption_test_case_192_7(void)
10276 {
10277         return test_authenticated_encryption(&gcm_test_case_192_7);
10278 }
10279
10280 static int
10281 test_AES_GCM_auth_encryption_test_case_256_1(void)
10282 {
10283         return test_authenticated_encryption(&gcm_test_case_256_1);
10284 }
10285
10286 static int
10287 test_AES_GCM_auth_encryption_test_case_256_2(void)
10288 {
10289         return test_authenticated_encryption(&gcm_test_case_256_2);
10290 }
10291
10292 static int
10293 test_AES_GCM_auth_encryption_test_case_256_3(void)
10294 {
10295         return test_authenticated_encryption(&gcm_test_case_256_3);
10296 }
10297
10298 static int
10299 test_AES_GCM_auth_encryption_test_case_256_4(void)
10300 {
10301         return test_authenticated_encryption(&gcm_test_case_256_4);
10302 }
10303
10304 static int
10305 test_AES_GCM_auth_encryption_test_case_256_5(void)
10306 {
10307         return test_authenticated_encryption(&gcm_test_case_256_5);
10308 }
10309
10310 static int
10311 test_AES_GCM_auth_encryption_test_case_256_6(void)
10312 {
10313         return test_authenticated_encryption(&gcm_test_case_256_6);
10314 }
10315
10316 static int
10317 test_AES_GCM_auth_encryption_test_case_256_7(void)
10318 {
10319         return test_authenticated_encryption(&gcm_test_case_256_7);
10320 }
10321
10322 static int
10323 test_AES_GCM_auth_encryption_test_case_aad_1(void)
10324 {
10325         return test_authenticated_encryption(&gcm_test_case_aad_1);
10326 }
10327
10328 static int
10329 test_AES_GCM_auth_encryption_test_case_aad_2(void)
10330 {
10331         return test_authenticated_encryption(&gcm_test_case_aad_2);
10332 }
10333
10334 static int
10335 test_AES_GCM_auth_encryption_fail_iv_corrupt(void)
10336 {
10337         struct aead_test_data tdata;
10338         int res;
10339
10340         RTE_LOG(INFO, USER1, "This is a negative test, errors are expected\n");
10341         memcpy(&tdata, &gcm_test_case_7, sizeof(struct aead_test_data));
10342         tdata.iv.data[0] += 1;
10343         res = test_authenticated_encryption(&tdata);
10344         if (res == TEST_SKIPPED)
10345                 return res;
10346         TEST_ASSERT_EQUAL(res, TEST_FAILED, "encryption not failed");
10347         return TEST_SUCCESS;
10348 }
10349
10350 static int
10351 test_AES_GCM_auth_encryption_fail_in_data_corrupt(void)
10352 {
10353         struct aead_test_data tdata;
10354         int res;
10355
10356         RTE_LOG(INFO, USER1, "This is a negative test, errors are expected\n");
10357         memcpy(&tdata, &gcm_test_case_7, sizeof(struct aead_test_data));
10358         tdata.plaintext.data[0] += 1;
10359         res = test_authenticated_encryption(&tdata);
10360         if (res == TEST_SKIPPED)
10361                 return res;
10362         TEST_ASSERT_EQUAL(res, TEST_FAILED, "encryption not failed");
10363         return TEST_SUCCESS;
10364 }
10365
10366 static int
10367 test_AES_GCM_auth_encryption_fail_out_data_corrupt(void)
10368 {
10369         struct aead_test_data tdata;
10370         int res;
10371
10372         RTE_LOG(INFO, USER1, "This is a negative test, errors are expected\n");
10373         memcpy(&tdata, &gcm_test_case_7, sizeof(struct aead_test_data));
10374         tdata.ciphertext.data[0] += 1;
10375         res = test_authenticated_encryption(&tdata);
10376         if (res == TEST_SKIPPED)
10377                 return res;
10378         TEST_ASSERT_EQUAL(res, TEST_FAILED, "encryption not failed");
10379         return TEST_SUCCESS;
10380 }
10381
10382 static int
10383 test_AES_GCM_auth_encryption_fail_aad_len_corrupt(void)
10384 {
10385         struct aead_test_data tdata;
10386         int res;
10387
10388         RTE_LOG(INFO, USER1, "This is a negative test, errors are expected\n");
10389         memcpy(&tdata, &gcm_test_case_7, sizeof(struct aead_test_data));
10390         tdata.aad.len += 1;
10391         res = test_authenticated_encryption(&tdata);
10392         if (res == TEST_SKIPPED)
10393                 return res;
10394         TEST_ASSERT_EQUAL(res, TEST_FAILED, "encryption not failed");
10395         return TEST_SUCCESS;
10396 }
10397
10398 static int
10399 test_AES_GCM_auth_encryption_fail_aad_corrupt(void)
10400 {
10401         struct aead_test_data tdata;
10402         uint8_t aad[gcm_test_case_7.aad.len];
10403         int res;
10404
10405         RTE_LOG(INFO, USER1, "This is a negative test, errors are expected\n");
10406         memcpy(&tdata, &gcm_test_case_7, sizeof(struct aead_test_data));
10407         memcpy(aad, gcm_test_case_7.aad.data, gcm_test_case_7.aad.len);
10408         aad[0] += 1;
10409         tdata.aad.data = aad;
10410         res = test_authenticated_encryption(&tdata);
10411         if (res == TEST_SKIPPED)
10412                 return res;
10413         TEST_ASSERT_EQUAL(res, TEST_FAILED, "encryption not failed");
10414         return TEST_SUCCESS;
10415 }
10416
10417 static int
10418 test_AES_GCM_auth_encryption_fail_tag_corrupt(void)
10419 {
10420         struct aead_test_data tdata;
10421         int res;
10422
10423         RTE_LOG(INFO, USER1, "This is a negative test, errors are expected\n");
10424         memcpy(&tdata, &gcm_test_case_7, sizeof(struct aead_test_data));
10425         tdata.auth_tag.data[0] += 1;
10426         res = test_authenticated_encryption(&tdata);
10427         if (res == TEST_SKIPPED)
10428                 return res;
10429         TEST_ASSERT_EQUAL(res, TEST_FAILED, "encryption not failed");
10430         return TEST_SUCCESS;
10431 }
10432
10433 static int
10434 test_authenticated_decryption(const struct aead_test_data *tdata)
10435 {
10436         struct crypto_testsuite_params *ts_params = &testsuite_params;
10437         struct crypto_unittest_params *ut_params = &unittest_params;
10438
10439         int retval;
10440         uint8_t *plaintext;
10441         uint32_t i;
10442         struct rte_cryptodev_info dev_info;
10443
10444         rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
10445         uint64_t feat_flags = dev_info.feature_flags;
10446
10447         if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
10448                         (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
10449                 printf("Device doesn't support RAW data-path APIs.\n");
10450                 return TEST_SKIPPED;
10451         }
10452
10453         /* Verify the capabilities */
10454         struct rte_cryptodev_sym_capability_idx cap_idx;
10455         const struct rte_cryptodev_symmetric_capability *capability;
10456         cap_idx.type = RTE_CRYPTO_SYM_XFORM_AEAD;
10457         cap_idx.algo.aead = tdata->algo;
10458         capability = rte_cryptodev_sym_capability_get(
10459                         ts_params->valid_devs[0], &cap_idx);
10460         if (capability == NULL)
10461                 return TEST_SKIPPED;
10462         if (rte_cryptodev_sym_capability_check_aead(
10463                         capability, tdata->key.len, tdata->auth_tag.len,
10464                         tdata->aad.len, tdata->iv.len))
10465                 return TEST_SKIPPED;
10466
10467         /* Create AEAD session */
10468         retval = create_aead_session(ts_params->valid_devs[0],
10469                         tdata->algo,
10470                         RTE_CRYPTO_AEAD_OP_DECRYPT,
10471                         tdata->key.data, tdata->key.len,
10472                         tdata->aad.len, tdata->auth_tag.len,
10473                         tdata->iv.len);
10474         if (retval < 0)
10475                 return retval;
10476
10477         /* alloc mbuf and set payload */
10478         if (tdata->aad.len > MBUF_SIZE) {
10479                 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->large_mbuf_pool);
10480                 /* Populate full size of add data */
10481                 for (i = 32; i < MAX_AAD_LENGTH; i += 32)
10482                         memcpy(&tdata->aad.data[i], &tdata->aad.data[0], 32);
10483         } else
10484                 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
10485
10486         memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
10487                         rte_pktmbuf_tailroom(ut_params->ibuf));
10488
10489         /* Create AEAD operation */
10490         retval = create_aead_operation(RTE_CRYPTO_AEAD_OP_DECRYPT, tdata);
10491         if (retval < 0)
10492                 return retval;
10493
10494         rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
10495
10496         ut_params->op->sym->m_src = ut_params->ibuf;
10497
10498         /* Process crypto operation */
10499         if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
10500                 process_cpu_aead_op(ts_params->valid_devs[0], ut_params->op);
10501         else if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
10502                 process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
10503                                 ut_params->op, 0, 0, 0, 0);
10504         else
10505                 TEST_ASSERT_NOT_NULL(
10506                         process_crypto_request(ts_params->valid_devs[0],
10507                         ut_params->op), "failed to process sym crypto op");
10508
10509         TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
10510                         "crypto op processing failed");
10511
10512         if (ut_params->op->sym->m_dst)
10513                 plaintext = rte_pktmbuf_mtod(ut_params->op->sym->m_dst,
10514                                 uint8_t *);
10515         else
10516                 plaintext = rte_pktmbuf_mtod_offset(ut_params->op->sym->m_src,
10517                                 uint8_t *,
10518                                 ut_params->op->sym->cipher.data.offset);
10519
10520         debug_hexdump(stdout, "plaintext:", plaintext, tdata->ciphertext.len);
10521
10522         /* Validate obuf */
10523         TEST_ASSERT_BUFFERS_ARE_EQUAL(
10524                         plaintext,
10525                         tdata->plaintext.data,
10526                         tdata->plaintext.len,
10527                         "Plaintext data not as expected");
10528
10529         TEST_ASSERT_EQUAL(ut_params->op->status,
10530                         RTE_CRYPTO_OP_STATUS_SUCCESS,
10531                         "Authentication failed");
10532
10533         return 0;
10534 }
10535
10536 static int
10537 test_AES_GCM_authenticated_decryption_test_case_1(void)
10538 {
10539         return test_authenticated_decryption(&gcm_test_case_1);
10540 }
10541
10542 static int
10543 test_AES_GCM_authenticated_decryption_test_case_2(void)
10544 {
10545         return test_authenticated_decryption(&gcm_test_case_2);
10546 }
10547
10548 static int
10549 test_AES_GCM_authenticated_decryption_test_case_3(void)
10550 {
10551         return test_authenticated_decryption(&gcm_test_case_3);
10552 }
10553
10554 static int
10555 test_AES_GCM_authenticated_decryption_test_case_4(void)
10556 {
10557         return test_authenticated_decryption(&gcm_test_case_4);
10558 }
10559
10560 static int
10561 test_AES_GCM_authenticated_decryption_test_case_5(void)
10562 {
10563         return test_authenticated_decryption(&gcm_test_case_5);
10564 }
10565
10566 static int
10567 test_AES_GCM_authenticated_decryption_test_case_6(void)
10568 {
10569         return test_authenticated_decryption(&gcm_test_case_6);
10570 }
10571
10572 static int
10573 test_AES_GCM_authenticated_decryption_test_case_7(void)
10574 {
10575         return test_authenticated_decryption(&gcm_test_case_7);
10576 }
10577
10578 static int
10579 test_AES_GCM_authenticated_decryption_test_case_8(void)
10580 {
10581         return test_authenticated_decryption(&gcm_test_case_8);
10582 }
10583
10584 static int
10585 test_AES_GCM_J0_authenticated_decryption_test_case_1(void)
10586 {
10587         return test_authenticated_decryption(&gcm_J0_test_case_1);
10588 }
10589
10590 static int
10591 test_AES_GCM_auth_decryption_test_case_192_1(void)
10592 {
10593         return test_authenticated_decryption(&gcm_test_case_192_1);
10594 }
10595
10596 static int
10597 test_AES_GCM_auth_decryption_test_case_192_2(void)
10598 {
10599         return test_authenticated_decryption(&gcm_test_case_192_2);
10600 }
10601
10602 static int
10603 test_AES_GCM_auth_decryption_test_case_192_3(void)
10604 {
10605         return test_authenticated_decryption(&gcm_test_case_192_3);
10606 }
10607
10608 static int
10609 test_AES_GCM_auth_decryption_test_case_192_4(void)
10610 {
10611         return test_authenticated_decryption(&gcm_test_case_192_4);
10612 }
10613
10614 static int
10615 test_AES_GCM_auth_decryption_test_case_192_5(void)
10616 {
10617         return test_authenticated_decryption(&gcm_test_case_192_5);
10618 }
10619
10620 static int
10621 test_AES_GCM_auth_decryption_test_case_192_6(void)
10622 {
10623         return test_authenticated_decryption(&gcm_test_case_192_6);
10624 }
10625
10626 static int
10627 test_AES_GCM_auth_decryption_test_case_192_7(void)
10628 {
10629         return test_authenticated_decryption(&gcm_test_case_192_7);
10630 }
10631
10632 static int
10633 test_AES_GCM_auth_decryption_test_case_256_1(void)
10634 {
10635         return test_authenticated_decryption(&gcm_test_case_256_1);
10636 }
10637
10638 static int
10639 test_AES_GCM_auth_decryption_test_case_256_2(void)
10640 {
10641         return test_authenticated_decryption(&gcm_test_case_256_2);
10642 }
10643
10644 static int
10645 test_AES_GCM_auth_decryption_test_case_256_3(void)
10646 {
10647         return test_authenticated_decryption(&gcm_test_case_256_3);
10648 }
10649
10650 static int
10651 test_AES_GCM_auth_decryption_test_case_256_4(void)
10652 {
10653         return test_authenticated_decryption(&gcm_test_case_256_4);
10654 }
10655
10656 static int
10657 test_AES_GCM_auth_decryption_test_case_256_5(void)
10658 {
10659         return test_authenticated_decryption(&gcm_test_case_256_5);
10660 }
10661
10662 static int
10663 test_AES_GCM_auth_decryption_test_case_256_6(void)
10664 {
10665         return test_authenticated_decryption(&gcm_test_case_256_6);
10666 }
10667
10668 static int
10669 test_AES_GCM_auth_decryption_test_case_256_7(void)
10670 {
10671         return test_authenticated_decryption(&gcm_test_case_256_7);
10672 }
10673
10674 static int
10675 test_AES_GCM_auth_decryption_test_case_aad_1(void)
10676 {
10677         return test_authenticated_decryption(&gcm_test_case_aad_1);
10678 }
10679
10680 static int
10681 test_AES_GCM_auth_decryption_test_case_aad_2(void)
10682 {
10683         return test_authenticated_decryption(&gcm_test_case_aad_2);
10684 }
10685
10686 static int
10687 test_AES_GCM_auth_decryption_fail_iv_corrupt(void)
10688 {
10689         struct aead_test_data tdata;
10690         int res;
10691
10692         memcpy(&tdata, &gcm_test_case_7, sizeof(struct aead_test_data));
10693         tdata.iv.data[0] += 1;
10694         res = test_authenticated_decryption(&tdata);
10695         if (res == TEST_SKIPPED)
10696                 return res;
10697         TEST_ASSERT_EQUAL(res, TEST_FAILED, "decryption not failed");
10698         return TEST_SUCCESS;
10699 }
10700
10701 static int
10702 test_AES_GCM_auth_decryption_fail_in_data_corrupt(void)
10703 {
10704         struct aead_test_data tdata;
10705         int res;
10706
10707         RTE_LOG(INFO, USER1, "This is a negative test, errors are expected\n");
10708         memcpy(&tdata, &gcm_test_case_7, sizeof(struct aead_test_data));
10709         tdata.plaintext.data[0] += 1;
10710         res = test_authenticated_decryption(&tdata);
10711         if (res == TEST_SKIPPED)
10712                 return res;
10713         TEST_ASSERT_EQUAL(res, TEST_FAILED, "decryption not failed");
10714         return TEST_SUCCESS;
10715 }
10716
10717 static int
10718 test_AES_GCM_auth_decryption_fail_out_data_corrupt(void)
10719 {
10720         struct aead_test_data tdata;
10721         int res;
10722
10723         memcpy(&tdata, &gcm_test_case_7, sizeof(struct aead_test_data));
10724         tdata.ciphertext.data[0] += 1;
10725         res = test_authenticated_decryption(&tdata);
10726         if (res == TEST_SKIPPED)
10727                 return res;
10728         TEST_ASSERT_EQUAL(res, TEST_FAILED, "decryption not failed");
10729         return TEST_SUCCESS;
10730 }
10731
10732 static int
10733 test_AES_GCM_auth_decryption_fail_aad_len_corrupt(void)
10734 {
10735         struct aead_test_data tdata;
10736         int res;
10737
10738         memcpy(&tdata, &gcm_test_case_7, sizeof(struct aead_test_data));
10739         tdata.aad.len += 1;
10740         res = test_authenticated_decryption(&tdata);
10741         if (res == TEST_SKIPPED)
10742                 return res;
10743         TEST_ASSERT_EQUAL(res, TEST_FAILED, "decryption not failed");
10744         return TEST_SUCCESS;
10745 }
10746
10747 static int
10748 test_AES_GCM_auth_decryption_fail_aad_corrupt(void)
10749 {
10750         struct aead_test_data tdata;
10751         uint8_t aad[gcm_test_case_7.aad.len];
10752         int res;
10753
10754         memcpy(&tdata, &gcm_test_case_7, sizeof(struct aead_test_data));
10755         memcpy(aad, gcm_test_case_7.aad.data, gcm_test_case_7.aad.len);
10756         aad[0] += 1;
10757         tdata.aad.data = aad;
10758         res = test_authenticated_decryption(&tdata);
10759         if (res == TEST_SKIPPED)
10760                 return res;
10761         TEST_ASSERT_EQUAL(res, TEST_FAILED, "decryption not failed");
10762         return TEST_SUCCESS;
10763 }
10764
10765 static int
10766 test_AES_GCM_auth_decryption_fail_tag_corrupt(void)
10767 {
10768         struct aead_test_data tdata;
10769         int res;
10770
10771         memcpy(&tdata, &gcm_test_case_7, sizeof(struct aead_test_data));
10772         tdata.auth_tag.data[0] += 1;
10773         res = test_authenticated_decryption(&tdata);
10774         if (res == TEST_SKIPPED)
10775                 return res;
10776         TEST_ASSERT_EQUAL(res, TEST_FAILED, "authentication not failed");
10777         return TEST_SUCCESS;
10778 }
10779
10780 static int
10781 test_authenticated_encryption_oop(const struct aead_test_data *tdata)
10782 {
10783         struct crypto_testsuite_params *ts_params = &testsuite_params;
10784         struct crypto_unittest_params *ut_params = &unittest_params;
10785
10786         int retval;
10787         uint8_t *ciphertext, *auth_tag;
10788         uint16_t plaintext_pad_len;
10789         struct rte_cryptodev_info dev_info;
10790
10791         /* Verify the capabilities */
10792         struct rte_cryptodev_sym_capability_idx cap_idx;
10793         cap_idx.type = RTE_CRYPTO_SYM_XFORM_AEAD;
10794         cap_idx.algo.aead = tdata->algo;
10795         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
10796                         &cap_idx) == NULL)
10797                 return TEST_SKIPPED;
10798
10799         rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
10800         uint64_t feat_flags = dev_info.feature_flags;
10801
10802         if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
10803                         (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP)))
10804                 return TEST_SKIPPED;
10805
10806         /* not supported with CPU crypto */
10807         if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
10808                 return TEST_SKIPPED;
10809
10810         /* Create AEAD session */
10811         retval = create_aead_session(ts_params->valid_devs[0],
10812                         tdata->algo,
10813                         RTE_CRYPTO_AEAD_OP_ENCRYPT,
10814                         tdata->key.data, tdata->key.len,
10815                         tdata->aad.len, tdata->auth_tag.len,
10816                         tdata->iv.len);
10817         if (retval < 0)
10818                 return retval;
10819
10820         ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
10821         ut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
10822
10823         /* clear mbuf payload */
10824         memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
10825                         rte_pktmbuf_tailroom(ut_params->ibuf));
10826         memset(rte_pktmbuf_mtod(ut_params->obuf, uint8_t *), 0,
10827                         rte_pktmbuf_tailroom(ut_params->obuf));
10828
10829         /* Create AEAD operation */
10830         retval = create_aead_operation(RTE_CRYPTO_AEAD_OP_ENCRYPT, tdata);
10831         if (retval < 0)
10832                 return retval;
10833
10834         rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
10835
10836         ut_params->op->sym->m_src = ut_params->ibuf;
10837         ut_params->op->sym->m_dst = ut_params->obuf;
10838
10839         /* Process crypto operation */
10840         if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
10841                 process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
10842                         ut_params->op, 0, 0, 0, 0);
10843         else
10844                 TEST_ASSERT_NOT_NULL(process_crypto_request(ts_params->valid_devs[0],
10845                         ut_params->op), "failed to process sym crypto op");
10846
10847         TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
10848                         "crypto op processing failed");
10849
10850         plaintext_pad_len = RTE_ALIGN_CEIL(tdata->plaintext.len, 16);
10851
10852         ciphertext = rte_pktmbuf_mtod_offset(ut_params->obuf, uint8_t *,
10853                         ut_params->op->sym->cipher.data.offset);
10854         auth_tag = ciphertext + plaintext_pad_len;
10855
10856         debug_hexdump(stdout, "ciphertext:", ciphertext, tdata->ciphertext.len);
10857         debug_hexdump(stdout, "auth tag:", auth_tag, tdata->auth_tag.len);
10858
10859         /* Validate obuf */
10860         TEST_ASSERT_BUFFERS_ARE_EQUAL(
10861                         ciphertext,
10862                         tdata->ciphertext.data,
10863                         tdata->ciphertext.len,
10864                         "Ciphertext data not as expected");
10865
10866         TEST_ASSERT_BUFFERS_ARE_EQUAL(
10867                         auth_tag,
10868                         tdata->auth_tag.data,
10869                         tdata->auth_tag.len,
10870                         "Generated auth tag not as expected");
10871
10872         return 0;
10873
10874 }
10875
10876 static int
10877 test_AES_GCM_authenticated_encryption_oop_test_case_1(void)
10878 {
10879         return test_authenticated_encryption_oop(&gcm_test_case_5);
10880 }
10881
10882 static int
10883 test_authenticated_decryption_oop(const struct aead_test_data *tdata)
10884 {
10885         struct crypto_testsuite_params *ts_params = &testsuite_params;
10886         struct crypto_unittest_params *ut_params = &unittest_params;
10887
10888         int retval;
10889         uint8_t *plaintext;
10890         struct rte_cryptodev_info dev_info;
10891
10892         rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
10893         uint64_t feat_flags = dev_info.feature_flags;
10894
10895         /* Verify the capabilities */
10896         struct rte_cryptodev_sym_capability_idx cap_idx;
10897         cap_idx.type = RTE_CRYPTO_SYM_XFORM_AEAD;
10898         cap_idx.algo.aead = tdata->algo;
10899         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
10900                         &cap_idx) == NULL)
10901                 return TEST_SKIPPED;
10902
10903         /* not supported with CPU crypto and raw data-path APIs*/
10904         if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO ||
10905                         global_api_test_type == CRYPTODEV_RAW_API_TEST)
10906                 return TEST_SKIPPED;
10907
10908         if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
10909                         (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
10910                 printf("Device does not support RAW data-path APIs.\n");
10911                 return TEST_SKIPPED;
10912         }
10913
10914         /* Create AEAD session */
10915         retval = create_aead_session(ts_params->valid_devs[0],
10916                         tdata->algo,
10917                         RTE_CRYPTO_AEAD_OP_DECRYPT,
10918                         tdata->key.data, tdata->key.len,
10919                         tdata->aad.len, tdata->auth_tag.len,
10920                         tdata->iv.len);
10921         if (retval < 0)
10922                 return retval;
10923
10924         /* alloc mbuf and set payload */
10925         ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
10926         ut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
10927
10928         memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
10929                         rte_pktmbuf_tailroom(ut_params->ibuf));
10930         memset(rte_pktmbuf_mtod(ut_params->obuf, uint8_t *), 0,
10931                         rte_pktmbuf_tailroom(ut_params->obuf));
10932
10933         /* Create AEAD operation */
10934         retval = create_aead_operation(RTE_CRYPTO_AEAD_OP_DECRYPT, tdata);
10935         if (retval < 0)
10936                 return retval;
10937
10938         rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
10939
10940         ut_params->op->sym->m_src = ut_params->ibuf;
10941         ut_params->op->sym->m_dst = ut_params->obuf;
10942
10943         /* Process crypto operation */
10944         if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
10945                 process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
10946                                 ut_params->op, 0, 0, 0, 0);
10947         else
10948                 TEST_ASSERT_NOT_NULL(process_crypto_request(ts_params->valid_devs[0],
10949                         ut_params->op), "failed to process sym crypto op");
10950
10951         TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
10952                         "crypto op processing failed");
10953
10954         plaintext = rte_pktmbuf_mtod_offset(ut_params->obuf, uint8_t *,
10955                         ut_params->op->sym->cipher.data.offset);
10956
10957         debug_hexdump(stdout, "plaintext:", plaintext, tdata->ciphertext.len);
10958
10959         /* Validate obuf */
10960         TEST_ASSERT_BUFFERS_ARE_EQUAL(
10961                         plaintext,
10962                         tdata->plaintext.data,
10963                         tdata->plaintext.len,
10964                         "Plaintext data not as expected");
10965
10966         TEST_ASSERT_EQUAL(ut_params->op->status,
10967                         RTE_CRYPTO_OP_STATUS_SUCCESS,
10968                         "Authentication failed");
10969         return 0;
10970 }
10971
10972 static int
10973 test_AES_GCM_authenticated_decryption_oop_test_case_1(void)
10974 {
10975         return test_authenticated_decryption_oop(&gcm_test_case_5);
10976 }
10977
10978 static int
10979 test_authenticated_encryption_sessionless(
10980                 const struct aead_test_data *tdata)
10981 {
10982         struct crypto_testsuite_params *ts_params = &testsuite_params;
10983         struct crypto_unittest_params *ut_params = &unittest_params;
10984
10985         int retval;
10986         uint8_t *ciphertext, *auth_tag;
10987         uint16_t plaintext_pad_len;
10988         uint8_t key[tdata->key.len + 1];
10989         struct rte_cryptodev_info dev_info;
10990
10991         rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
10992         uint64_t feat_flags = dev_info.feature_flags;
10993
10994         if (!(feat_flags & RTE_CRYPTODEV_FF_SYM_SESSIONLESS)) {
10995                 printf("Device doesn't support Sessionless ops.\n");
10996                 return TEST_SKIPPED;
10997         }
10998
10999         /* not supported with CPU crypto */
11000         if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
11001                 return TEST_SKIPPED;
11002
11003         /* Verify the capabilities */
11004         struct rte_cryptodev_sym_capability_idx cap_idx;
11005         cap_idx.type = RTE_CRYPTO_SYM_XFORM_AEAD;
11006         cap_idx.algo.aead = tdata->algo;
11007         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
11008                         &cap_idx) == NULL)
11009                 return TEST_SKIPPED;
11010
11011         ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
11012
11013         /* clear mbuf payload */
11014         memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
11015                         rte_pktmbuf_tailroom(ut_params->ibuf));
11016
11017         /* Create AEAD operation */
11018         retval = create_aead_operation(RTE_CRYPTO_AEAD_OP_ENCRYPT, tdata);
11019         if (retval < 0)
11020                 return retval;
11021
11022         /* Create GCM xform */
11023         memcpy(key, tdata->key.data, tdata->key.len);
11024         retval = create_aead_xform(ut_params->op,
11025                         tdata->algo,
11026                         RTE_CRYPTO_AEAD_OP_ENCRYPT,
11027                         key, tdata->key.len,
11028                         tdata->aad.len, tdata->auth_tag.len,
11029                         tdata->iv.len);
11030         if (retval < 0)
11031                 return retval;
11032
11033         ut_params->op->sym->m_src = ut_params->ibuf;
11034
11035         TEST_ASSERT_EQUAL(ut_params->op->sess_type,
11036                         RTE_CRYPTO_OP_SESSIONLESS,
11037                         "crypto op session type not sessionless");
11038
11039         /* Process crypto operation */
11040         TEST_ASSERT_NOT_NULL(process_crypto_request(ts_params->valid_devs[0],
11041                         ut_params->op), "failed to process sym crypto op");
11042
11043         TEST_ASSERT_NOT_NULL(ut_params->op, "failed crypto process");
11044
11045         TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
11046                         "crypto op status not success");
11047
11048         plaintext_pad_len = RTE_ALIGN_CEIL(tdata->plaintext.len, 16);
11049
11050         ciphertext = rte_pktmbuf_mtod_offset(ut_params->ibuf, uint8_t *,
11051                         ut_params->op->sym->cipher.data.offset);
11052         auth_tag = ciphertext + plaintext_pad_len;
11053
11054         debug_hexdump(stdout, "ciphertext:", ciphertext, tdata->ciphertext.len);
11055         debug_hexdump(stdout, "auth tag:", auth_tag, tdata->auth_tag.len);
11056
11057         /* Validate obuf */
11058         TEST_ASSERT_BUFFERS_ARE_EQUAL(
11059                         ciphertext,
11060                         tdata->ciphertext.data,
11061                         tdata->ciphertext.len,
11062                         "Ciphertext data not as expected");
11063
11064         TEST_ASSERT_BUFFERS_ARE_EQUAL(
11065                         auth_tag,
11066                         tdata->auth_tag.data,
11067                         tdata->auth_tag.len,
11068                         "Generated auth tag not as expected");
11069
11070         return 0;
11071
11072 }
11073
11074 static int
11075 test_AES_GCM_authenticated_encryption_sessionless_test_case_1(void)
11076 {
11077         return test_authenticated_encryption_sessionless(
11078                         &gcm_test_case_5);
11079 }
11080
11081 static int
11082 test_authenticated_decryption_sessionless(
11083                 const struct aead_test_data *tdata)
11084 {
11085         struct crypto_testsuite_params *ts_params = &testsuite_params;
11086         struct crypto_unittest_params *ut_params = &unittest_params;
11087
11088         int retval;
11089         uint8_t *plaintext;
11090         uint8_t key[tdata->key.len + 1];
11091         struct rte_cryptodev_info dev_info;
11092
11093         rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
11094         uint64_t feat_flags = dev_info.feature_flags;
11095
11096         if (!(feat_flags & RTE_CRYPTODEV_FF_SYM_SESSIONLESS)) {
11097                 printf("Device doesn't support Sessionless ops.\n");
11098                 return TEST_SKIPPED;
11099         }
11100
11101         if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
11102                         (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
11103                 printf("Device doesn't support RAW data-path APIs.\n");
11104                 return TEST_SKIPPED;
11105         }
11106
11107         /* not supported with CPU crypto */
11108         if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
11109                 return TEST_SKIPPED;
11110
11111         /* Verify the capabilities */
11112         struct rte_cryptodev_sym_capability_idx cap_idx;
11113         cap_idx.type = RTE_CRYPTO_SYM_XFORM_AEAD;
11114         cap_idx.algo.aead = tdata->algo;
11115         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
11116                         &cap_idx) == NULL)
11117                 return TEST_SKIPPED;
11118
11119         /* alloc mbuf and set payload */
11120         ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
11121
11122         memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
11123                         rte_pktmbuf_tailroom(ut_params->ibuf));
11124
11125         /* Create AEAD operation */
11126         retval = create_aead_operation(RTE_CRYPTO_AEAD_OP_DECRYPT, tdata);
11127         if (retval < 0)
11128                 return retval;
11129
11130         /* Create AEAD xform */
11131         memcpy(key, tdata->key.data, tdata->key.len);
11132         retval = create_aead_xform(ut_params->op,
11133                         tdata->algo,
11134                         RTE_CRYPTO_AEAD_OP_DECRYPT,
11135                         key, tdata->key.len,
11136                         tdata->aad.len, tdata->auth_tag.len,
11137                         tdata->iv.len);
11138         if (retval < 0)
11139                 return retval;
11140
11141         ut_params->op->sym->m_src = ut_params->ibuf;
11142
11143         TEST_ASSERT_EQUAL(ut_params->op->sess_type,
11144                         RTE_CRYPTO_OP_SESSIONLESS,
11145                         "crypto op session type not sessionless");
11146
11147         /* Process crypto operation */
11148         if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
11149                 process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
11150                                 ut_params->op, 0, 0, 0, 0);
11151         else
11152                 TEST_ASSERT_NOT_NULL(process_crypto_request(
11153                         ts_params->valid_devs[0], ut_params->op),
11154                                 "failed to process sym crypto op");
11155
11156         TEST_ASSERT_NOT_NULL(ut_params->op, "failed crypto process");
11157
11158         TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
11159                         "crypto op status not success");
11160
11161         plaintext = rte_pktmbuf_mtod_offset(ut_params->ibuf, uint8_t *,
11162                         ut_params->op->sym->cipher.data.offset);
11163
11164         debug_hexdump(stdout, "plaintext:", plaintext, tdata->ciphertext.len);
11165
11166         /* Validate obuf */
11167         TEST_ASSERT_BUFFERS_ARE_EQUAL(
11168                         plaintext,
11169                         tdata->plaintext.data,
11170                         tdata->plaintext.len,
11171                         "Plaintext data not as expected");
11172
11173         TEST_ASSERT_EQUAL(ut_params->op->status,
11174                         RTE_CRYPTO_OP_STATUS_SUCCESS,
11175                         "Authentication failed");
11176         return 0;
11177 }
11178
11179 static int
11180 test_AES_GCM_authenticated_decryption_sessionless_test_case_1(void)
11181 {
11182         return test_authenticated_decryption_sessionless(
11183                         &gcm_test_case_5);
11184 }
11185
11186 static int
11187 test_AES_CCM_authenticated_encryption_test_case_128_1(void)
11188 {
11189         return test_authenticated_encryption(&ccm_test_case_128_1);
11190 }
11191
11192 static int
11193 test_AES_CCM_authenticated_encryption_test_case_128_2(void)
11194 {
11195         return test_authenticated_encryption(&ccm_test_case_128_2);
11196 }
11197
11198 static int
11199 test_AES_CCM_authenticated_encryption_test_case_128_3(void)
11200 {
11201         return test_authenticated_encryption(&ccm_test_case_128_3);
11202 }
11203
11204 static int
11205 test_AES_CCM_authenticated_decryption_test_case_128_1(void)
11206 {
11207         return test_authenticated_decryption(&ccm_test_case_128_1);
11208 }
11209
11210 static int
11211 test_AES_CCM_authenticated_decryption_test_case_128_2(void)
11212 {
11213         return test_authenticated_decryption(&ccm_test_case_128_2);
11214 }
11215
11216 static int
11217 test_AES_CCM_authenticated_decryption_test_case_128_3(void)
11218 {
11219         return test_authenticated_decryption(&ccm_test_case_128_3);
11220 }
11221
11222 static int
11223 test_AES_CCM_authenticated_encryption_test_case_192_1(void)
11224 {
11225         return test_authenticated_encryption(&ccm_test_case_192_1);
11226 }
11227
11228 static int
11229 test_AES_CCM_authenticated_encryption_test_case_192_2(void)
11230 {
11231         return test_authenticated_encryption(&ccm_test_case_192_2);
11232 }
11233
11234 static int
11235 test_AES_CCM_authenticated_encryption_test_case_192_3(void)
11236 {
11237         return test_authenticated_encryption(&ccm_test_case_192_3);
11238 }
11239
11240 static int
11241 test_AES_CCM_authenticated_decryption_test_case_192_1(void)
11242 {
11243         return test_authenticated_decryption(&ccm_test_case_192_1);
11244 }
11245
11246 static int
11247 test_AES_CCM_authenticated_decryption_test_case_192_2(void)
11248 {
11249         return test_authenticated_decryption(&ccm_test_case_192_2);
11250 }
11251
11252 static int
11253 test_AES_CCM_authenticated_decryption_test_case_192_3(void)
11254 {
11255         return test_authenticated_decryption(&ccm_test_case_192_3);
11256 }
11257
11258 static int
11259 test_AES_CCM_authenticated_encryption_test_case_256_1(void)
11260 {
11261         return test_authenticated_encryption(&ccm_test_case_256_1);
11262 }
11263
11264 static int
11265 test_AES_CCM_authenticated_encryption_test_case_256_2(void)
11266 {
11267         return test_authenticated_encryption(&ccm_test_case_256_2);
11268 }
11269
11270 static int
11271 test_AES_CCM_authenticated_encryption_test_case_256_3(void)
11272 {
11273         return test_authenticated_encryption(&ccm_test_case_256_3);
11274 }
11275
11276 static int
11277 test_AES_CCM_authenticated_decryption_test_case_256_1(void)
11278 {
11279         return test_authenticated_decryption(&ccm_test_case_256_1);
11280 }
11281
11282 static int
11283 test_AES_CCM_authenticated_decryption_test_case_256_2(void)
11284 {
11285         return test_authenticated_decryption(&ccm_test_case_256_2);
11286 }
11287
11288 static int
11289 test_AES_CCM_authenticated_decryption_test_case_256_3(void)
11290 {
11291         return test_authenticated_decryption(&ccm_test_case_256_3);
11292 }
11293
11294 static int
11295 test_stats(void)
11296 {
11297         struct crypto_testsuite_params *ts_params = &testsuite_params;
11298         struct rte_cryptodev_stats stats;
11299
11300         if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
11301                 return TEST_SKIPPED;
11302
11303         /* Verify the capabilities */
11304         struct rte_cryptodev_sym_capability_idx cap_idx;
11305         cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
11306         cap_idx.algo.auth = RTE_CRYPTO_AUTH_SHA1_HMAC;
11307         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
11308                         &cap_idx) == NULL)
11309                 return TEST_SKIPPED;
11310         cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
11311         cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_AES_CBC;
11312         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
11313                         &cap_idx) == NULL)
11314                 return TEST_SKIPPED;
11315
11316         if (rte_cryptodev_stats_get(ts_params->valid_devs[0], &stats)
11317                         == -ENOTSUP)
11318                 return TEST_SKIPPED;
11319
11320         rte_cryptodev_stats_reset(ts_params->valid_devs[0]);
11321         TEST_ASSERT((rte_cryptodev_stats_get(ts_params->valid_devs[0] + 600,
11322                         &stats) == -ENODEV),
11323                 "rte_cryptodev_stats_get invalid dev failed");
11324         TEST_ASSERT((rte_cryptodev_stats_get(ts_params->valid_devs[0], 0) != 0),
11325                 "rte_cryptodev_stats_get invalid Param failed");
11326
11327         /* Test expected values */
11328         test_AES_CBC_HMAC_SHA1_encrypt_digest();
11329         TEST_ASSERT_SUCCESS(rte_cryptodev_stats_get(ts_params->valid_devs[0],
11330                         &stats),
11331                 "rte_cryptodev_stats_get failed");
11332         TEST_ASSERT((stats.enqueued_count == 1),
11333                 "rte_cryptodev_stats_get returned unexpected enqueued stat");
11334         TEST_ASSERT((stats.dequeued_count == 1),
11335                 "rte_cryptodev_stats_get returned unexpected enqueued stat");
11336         TEST_ASSERT((stats.enqueue_err_count == 0),
11337                 "rte_cryptodev_stats_get returned unexpected enqueued stat");
11338         TEST_ASSERT((stats.dequeue_err_count == 0),
11339                 "rte_cryptodev_stats_get returned unexpected enqueued stat");
11340
11341         /* invalid device but should ignore and not reset device stats*/
11342         rte_cryptodev_stats_reset(ts_params->valid_devs[0] + 300);
11343         TEST_ASSERT_SUCCESS(rte_cryptodev_stats_get(ts_params->valid_devs[0],
11344                         &stats),
11345                 "rte_cryptodev_stats_get failed");
11346         TEST_ASSERT((stats.enqueued_count == 1),
11347                 "rte_cryptodev_stats_get returned unexpected enqueued stat");
11348
11349         /* check that a valid reset clears stats */
11350         rte_cryptodev_stats_reset(ts_params->valid_devs[0]);
11351         TEST_ASSERT_SUCCESS(rte_cryptodev_stats_get(ts_params->valid_devs[0],
11352                         &stats),
11353                                           "rte_cryptodev_stats_get failed");
11354         TEST_ASSERT((stats.enqueued_count == 0),
11355                 "rte_cryptodev_stats_get returned unexpected enqueued stat");
11356         TEST_ASSERT((stats.dequeued_count == 0),
11357                 "rte_cryptodev_stats_get returned unexpected enqueued stat");
11358
11359         return TEST_SUCCESS;
11360 }
11361
11362 static int MD5_HMAC_create_session(struct crypto_testsuite_params *ts_params,
11363                                    struct crypto_unittest_params *ut_params,
11364                                    enum rte_crypto_auth_operation op,
11365                                    const struct HMAC_MD5_vector *test_case)
11366 {
11367         uint8_t key[64];
11368         int status;
11369
11370         memcpy(key, test_case->key.data, test_case->key.len);
11371
11372         ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;
11373         ut_params->auth_xform.next = NULL;
11374         ut_params->auth_xform.auth.op = op;
11375
11376         ut_params->auth_xform.auth.algo = RTE_CRYPTO_AUTH_MD5_HMAC;
11377
11378         ut_params->auth_xform.auth.digest_length = MD5_DIGEST_LEN;
11379         ut_params->auth_xform.auth.key.length = test_case->key.len;
11380         ut_params->auth_xform.auth.key.data = key;
11381
11382         ut_params->sess = rte_cryptodev_sym_session_create(
11383                         ts_params->session_mpool);
11384         TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed");
11385         if (ut_params->sess == NULL)
11386                 return TEST_FAILED;
11387
11388         status = rte_cryptodev_sym_session_init(ts_params->valid_devs[0],
11389                         ut_params->sess, &ut_params->auth_xform,
11390                         ts_params->session_priv_mpool);
11391         if (status == -ENOTSUP)
11392                 return TEST_SKIPPED;
11393
11394         ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
11395
11396         memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
11397                         rte_pktmbuf_tailroom(ut_params->ibuf));
11398
11399         return 0;
11400 }
11401
11402 static int MD5_HMAC_create_op(struct crypto_unittest_params *ut_params,
11403                               const struct HMAC_MD5_vector *test_case,
11404                               uint8_t **plaintext)
11405 {
11406         uint16_t plaintext_pad_len;
11407
11408         struct rte_crypto_sym_op *sym_op = ut_params->op->sym;
11409
11410         plaintext_pad_len = RTE_ALIGN_CEIL(test_case->plaintext.len,
11411                                 16);
11412
11413         *plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
11414                         plaintext_pad_len);
11415         memcpy(*plaintext, test_case->plaintext.data,
11416                         test_case->plaintext.len);
11417
11418         sym_op->auth.digest.data = (uint8_t *)rte_pktmbuf_append(
11419                         ut_params->ibuf, MD5_DIGEST_LEN);
11420         TEST_ASSERT_NOT_NULL(sym_op->auth.digest.data,
11421                         "no room to append digest");
11422         sym_op->auth.digest.phys_addr = rte_pktmbuf_iova_offset(
11423                         ut_params->ibuf, plaintext_pad_len);
11424
11425         if (ut_params->auth_xform.auth.op == RTE_CRYPTO_AUTH_OP_VERIFY) {
11426                 rte_memcpy(sym_op->auth.digest.data, test_case->auth_tag.data,
11427                            test_case->auth_tag.len);
11428         }
11429
11430         sym_op->auth.data.offset = 0;
11431         sym_op->auth.data.length = test_case->plaintext.len;
11432
11433         rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
11434         ut_params->op->sym->m_src = ut_params->ibuf;
11435
11436         return 0;
11437 }
11438
11439 static int
11440 test_MD5_HMAC_generate(const struct HMAC_MD5_vector *test_case)
11441 {
11442         uint16_t plaintext_pad_len;
11443         uint8_t *plaintext, *auth_tag;
11444
11445         struct crypto_testsuite_params *ts_params = &testsuite_params;
11446         struct crypto_unittest_params *ut_params = &unittest_params;
11447         struct rte_cryptodev_info dev_info;
11448
11449         rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
11450         uint64_t feat_flags = dev_info.feature_flags;
11451
11452         if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
11453                         (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
11454                 printf("Device doesn't support RAW data-path APIs.\n");
11455                 return TEST_SKIPPED;
11456         }
11457
11458         /* Verify the capabilities */
11459         struct rte_cryptodev_sym_capability_idx cap_idx;
11460         cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
11461         cap_idx.algo.auth = RTE_CRYPTO_AUTH_MD5_HMAC;
11462         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
11463                         &cap_idx) == NULL)
11464                 return TEST_SKIPPED;
11465
11466         if (MD5_HMAC_create_session(ts_params, ut_params,
11467                         RTE_CRYPTO_AUTH_OP_GENERATE, test_case))
11468                 return TEST_FAILED;
11469
11470         /* Generate Crypto op data structure */
11471         ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
11472                         RTE_CRYPTO_OP_TYPE_SYMMETRIC);
11473         TEST_ASSERT_NOT_NULL(ut_params->op,
11474                         "Failed to allocate symmetric crypto operation struct");
11475
11476         plaintext_pad_len = RTE_ALIGN_CEIL(test_case->plaintext.len,
11477                                 16);
11478
11479         if (MD5_HMAC_create_op(ut_params, test_case, &plaintext))
11480                 return TEST_FAILED;
11481
11482         if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
11483                 process_cpu_crypt_auth_op(ts_params->valid_devs[0],
11484                         ut_params->op);
11485         else if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
11486                 process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
11487                                 ut_params->op, 0, 1, 0, 0);
11488         else
11489                 TEST_ASSERT_NOT_NULL(
11490                         process_crypto_request(ts_params->valid_devs[0],
11491                                 ut_params->op),
11492                                 "failed to process sym crypto op");
11493
11494         TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
11495                         "crypto op processing failed");
11496
11497         if (ut_params->op->sym->m_dst) {
11498                 auth_tag = rte_pktmbuf_mtod_offset(ut_params->op->sym->m_dst,
11499                                 uint8_t *, plaintext_pad_len);
11500         } else {
11501                 auth_tag = plaintext + plaintext_pad_len;
11502         }
11503
11504         TEST_ASSERT_BUFFERS_ARE_EQUAL(
11505                         auth_tag,
11506                         test_case->auth_tag.data,
11507                         test_case->auth_tag.len,
11508                         "HMAC_MD5 generated tag not as expected");
11509
11510         return TEST_SUCCESS;
11511 }
11512
11513 static int
11514 test_MD5_HMAC_verify(const struct HMAC_MD5_vector *test_case)
11515 {
11516         uint8_t *plaintext;
11517
11518         struct crypto_testsuite_params *ts_params = &testsuite_params;
11519         struct crypto_unittest_params *ut_params = &unittest_params;
11520         struct rte_cryptodev_info dev_info;
11521
11522         rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
11523         uint64_t feat_flags = dev_info.feature_flags;
11524
11525         if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
11526                         (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
11527                 printf("Device doesn't support RAW data-path APIs.\n");
11528                 return TEST_SKIPPED;
11529         }
11530
11531         /* Verify the capabilities */
11532         struct rte_cryptodev_sym_capability_idx cap_idx;
11533         cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
11534         cap_idx.algo.auth = RTE_CRYPTO_AUTH_MD5_HMAC;
11535         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
11536                         &cap_idx) == NULL)
11537                 return TEST_SKIPPED;
11538
11539         if (MD5_HMAC_create_session(ts_params, ut_params,
11540                         RTE_CRYPTO_AUTH_OP_VERIFY, test_case)) {
11541                 return TEST_FAILED;
11542         }
11543
11544         /* Generate Crypto op data structure */
11545         ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
11546                         RTE_CRYPTO_OP_TYPE_SYMMETRIC);
11547         TEST_ASSERT_NOT_NULL(ut_params->op,
11548                         "Failed to allocate symmetric crypto operation struct");
11549
11550         if (MD5_HMAC_create_op(ut_params, test_case, &plaintext))
11551                 return TEST_FAILED;
11552
11553         if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
11554                 process_cpu_crypt_auth_op(ts_params->valid_devs[0],
11555                         ut_params->op);
11556         else if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
11557                 process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
11558                                 ut_params->op, 0, 1, 0, 0);
11559         else
11560                 TEST_ASSERT_NOT_NULL(
11561                         process_crypto_request(ts_params->valid_devs[0],
11562                                 ut_params->op),
11563                                 "failed to process sym crypto op");
11564
11565         TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
11566                         "HMAC_MD5 crypto op processing failed");
11567
11568         return TEST_SUCCESS;
11569 }
11570
11571 static int
11572 test_MD5_HMAC_generate_case_1(void)
11573 {
11574         return test_MD5_HMAC_generate(&HMAC_MD5_test_case_1);
11575 }
11576
11577 static int
11578 test_MD5_HMAC_verify_case_1(void)
11579 {
11580         return test_MD5_HMAC_verify(&HMAC_MD5_test_case_1);
11581 }
11582
11583 static int
11584 test_MD5_HMAC_generate_case_2(void)
11585 {
11586         return test_MD5_HMAC_generate(&HMAC_MD5_test_case_2);
11587 }
11588
11589 static int
11590 test_MD5_HMAC_verify_case_2(void)
11591 {
11592         return test_MD5_HMAC_verify(&HMAC_MD5_test_case_2);
11593 }
11594
11595 static int
11596 test_multi_session(void)
11597 {
11598         struct crypto_testsuite_params *ts_params = &testsuite_params;
11599         struct crypto_unittest_params *ut_params = &unittest_params;
11600
11601         struct rte_cryptodev_info dev_info;
11602         struct rte_cryptodev_sym_session **sessions;
11603
11604         uint16_t i;
11605         int status;
11606
11607         /* Verify the capabilities */
11608         struct rte_cryptodev_sym_capability_idx cap_idx;
11609         cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
11610         cap_idx.algo.auth = RTE_CRYPTO_AUTH_SHA512_HMAC;
11611         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
11612                         &cap_idx) == NULL)
11613                 return TEST_SKIPPED;
11614         cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
11615         cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_AES_CBC;
11616         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
11617                         &cap_idx) == NULL)
11618                 return TEST_SKIPPED;
11619
11620         test_AES_CBC_HMAC_SHA512_decrypt_create_session_params(ut_params,
11621                         aes_cbc_key, hmac_sha512_key);
11622
11623
11624         rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
11625
11626         sessions = rte_malloc(NULL,
11627                         sizeof(struct rte_cryptodev_sym_session *) *
11628                         (MAX_NB_SESSIONS + 1), 0);
11629
11630         /* Create multiple crypto sessions*/
11631         for (i = 0; i < MAX_NB_SESSIONS; i++) {
11632
11633                 sessions[i] = rte_cryptodev_sym_session_create(
11634                                 ts_params->session_mpool);
11635                 TEST_ASSERT_NOT_NULL(sessions[i],
11636                                 "Session creation failed at session number %u",
11637                                 i);
11638
11639                 status = rte_cryptodev_sym_session_init(
11640                                 ts_params->valid_devs[0],
11641                                 sessions[i], &ut_params->auth_xform,
11642                                 ts_params->session_priv_mpool);
11643                 if (status == -ENOTSUP)
11644                         return TEST_SKIPPED;
11645
11646                 /* Attempt to send a request on each session */
11647                 TEST_ASSERT_SUCCESS( test_AES_CBC_HMAC_SHA512_decrypt_perform(
11648                         sessions[i],
11649                         ut_params,
11650                         ts_params,
11651                         catch_22_quote_2_512_bytes_AES_CBC_ciphertext,
11652                         catch_22_quote_2_512_bytes_AES_CBC_HMAC_SHA512_digest,
11653                         aes_cbc_iv),
11654                         "Failed to perform decrypt on request number %u.", i);
11655                 /* free crypto operation structure */
11656                 if (ut_params->op)
11657                         rte_crypto_op_free(ut_params->op);
11658
11659                 /*
11660                  * free mbuf - both obuf and ibuf are usually the same,
11661                  * so check if they point at the same address is necessary,
11662                  * to avoid freeing the mbuf twice.
11663                  */
11664                 if (ut_params->obuf) {
11665                         rte_pktmbuf_free(ut_params->obuf);
11666                         if (ut_params->ibuf == ut_params->obuf)
11667                                 ut_params->ibuf = 0;
11668                         ut_params->obuf = 0;
11669                 }
11670                 if (ut_params->ibuf) {
11671                         rte_pktmbuf_free(ut_params->ibuf);
11672                         ut_params->ibuf = 0;
11673                 }
11674         }
11675
11676         sessions[i] = NULL;
11677         /* Next session create should fail */
11678         rte_cryptodev_sym_session_init(ts_params->valid_devs[0],
11679                         sessions[i], &ut_params->auth_xform,
11680                         ts_params->session_priv_mpool);
11681         TEST_ASSERT_NULL(sessions[i],
11682                         "Session creation succeeded unexpectedly!");
11683
11684         for (i = 0; i < MAX_NB_SESSIONS; i++) {
11685                 rte_cryptodev_sym_session_clear(ts_params->valid_devs[0],
11686                                 sessions[i]);
11687                 rte_cryptodev_sym_session_free(sessions[i]);
11688         }
11689
11690         rte_free(sessions);
11691
11692         return TEST_SUCCESS;
11693 }
11694
11695 struct multi_session_params {
11696         struct crypto_unittest_params ut_params;
11697         uint8_t *cipher_key;
11698         uint8_t *hmac_key;
11699         const uint8_t *cipher;
11700         const uint8_t *digest;
11701         uint8_t *iv;
11702 };
11703
11704 #define MB_SESSION_NUMBER 3
11705
11706 static int
11707 test_multi_session_random_usage(void)
11708 {
11709         struct crypto_testsuite_params *ts_params = &testsuite_params;
11710         struct rte_cryptodev_info dev_info;
11711         struct rte_cryptodev_sym_session **sessions;
11712         uint32_t i, j;
11713         struct multi_session_params ut_paramz[] = {
11714
11715                 {
11716                         .cipher_key = ms_aes_cbc_key0,
11717                         .hmac_key = ms_hmac_key0,
11718                         .cipher = ms_aes_cbc_cipher0,
11719                         .digest = ms_hmac_digest0,
11720                         .iv = ms_aes_cbc_iv0
11721                 },
11722                 {
11723                         .cipher_key = ms_aes_cbc_key1,
11724                         .hmac_key = ms_hmac_key1,
11725                         .cipher = ms_aes_cbc_cipher1,
11726                         .digest = ms_hmac_digest1,
11727                         .iv = ms_aes_cbc_iv1
11728                 },
11729                 {
11730                         .cipher_key = ms_aes_cbc_key2,
11731                         .hmac_key = ms_hmac_key2,
11732                         .cipher = ms_aes_cbc_cipher2,
11733                         .digest = ms_hmac_digest2,
11734                         .iv = ms_aes_cbc_iv2
11735                 },
11736
11737         };
11738         int status;
11739
11740         /* Verify the capabilities */
11741         struct rte_cryptodev_sym_capability_idx cap_idx;
11742         cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
11743         cap_idx.algo.auth = RTE_CRYPTO_AUTH_SHA512_HMAC;
11744         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
11745                         &cap_idx) == NULL)
11746                 return TEST_SKIPPED;
11747         cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
11748         cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_AES_CBC;
11749         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
11750                         &cap_idx) == NULL)
11751                 return TEST_SKIPPED;
11752
11753         rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
11754
11755         sessions = rte_malloc(NULL,
11756                         (sizeof(struct rte_cryptodev_sym_session *)
11757                                         * MAX_NB_SESSIONS) + 1, 0);
11758
11759         for (i = 0; i < MB_SESSION_NUMBER; i++) {
11760                 sessions[i] = rte_cryptodev_sym_session_create(
11761                                 ts_params->session_mpool);
11762                 TEST_ASSERT_NOT_NULL(sessions[i],
11763                                 "Session creation failed at session number %u",
11764                                 i);
11765
11766                 rte_memcpy(&ut_paramz[i].ut_params, &unittest_params,
11767                                 sizeof(struct crypto_unittest_params));
11768
11769                 test_AES_CBC_HMAC_SHA512_decrypt_create_session_params(
11770                                 &ut_paramz[i].ut_params,
11771                                 ut_paramz[i].cipher_key, ut_paramz[i].hmac_key);
11772
11773                 /* Create multiple crypto sessions*/
11774                 status = rte_cryptodev_sym_session_init(
11775                                 ts_params->valid_devs[0],
11776                                 sessions[i],
11777                                 &ut_paramz[i].ut_params.auth_xform,
11778                                 ts_params->session_priv_mpool);
11779
11780                 if (status == -ENOTSUP)
11781                         return TEST_SKIPPED;
11782
11783                 TEST_ASSERT_EQUAL(status, 0, "Session init failed");
11784         }
11785
11786         srand(time(NULL));
11787         for (i = 0; i < 40000; i++) {
11788
11789                 j = rand() % MB_SESSION_NUMBER;
11790
11791                 TEST_ASSERT_SUCCESS(
11792                         test_AES_CBC_HMAC_SHA512_decrypt_perform(
11793                                         sessions[j],
11794                                         &ut_paramz[j].ut_params,
11795                                         ts_params, ut_paramz[j].cipher,
11796                                         ut_paramz[j].digest,
11797                                         ut_paramz[j].iv),
11798                         "Failed to perform decrypt on request number %u.", i);
11799
11800                 if (ut_paramz[j].ut_params.op)
11801                         rte_crypto_op_free(ut_paramz[j].ut_params.op);
11802
11803                 /*
11804                  * free mbuf - both obuf and ibuf are usually the same,
11805                  * so check if they point at the same address is necessary,
11806                  * to avoid freeing the mbuf twice.
11807                  */
11808                 if (ut_paramz[j].ut_params.obuf) {
11809                         rte_pktmbuf_free(ut_paramz[j].ut_params.obuf);
11810                         if (ut_paramz[j].ut_params.ibuf
11811                                         == ut_paramz[j].ut_params.obuf)
11812                                 ut_paramz[j].ut_params.ibuf = 0;
11813                         ut_paramz[j].ut_params.obuf = 0;
11814                 }
11815                 if (ut_paramz[j].ut_params.ibuf) {
11816                         rte_pktmbuf_free(ut_paramz[j].ut_params.ibuf);
11817                         ut_paramz[j].ut_params.ibuf = 0;
11818                 }
11819         }
11820
11821         for (i = 0; i < MB_SESSION_NUMBER; i++) {
11822                 rte_cryptodev_sym_session_clear(ts_params->valid_devs[0],
11823                                 sessions[i]);
11824                 rte_cryptodev_sym_session_free(sessions[i]);
11825         }
11826
11827         rte_free(sessions);
11828
11829         return TEST_SUCCESS;
11830 }
11831
11832 uint8_t orig_data[] = {0xab, 0xab, 0xab, 0xab,
11833                         0xab, 0xab, 0xab, 0xab,
11834                         0xab, 0xab, 0xab, 0xab,
11835                         0xab, 0xab, 0xab, 0xab};
11836
11837 static int
11838 test_null_invalid_operation(void)
11839 {
11840         struct crypto_testsuite_params *ts_params = &testsuite_params;
11841         struct crypto_unittest_params *ut_params = &unittest_params;
11842         int ret;
11843
11844         /* This test is for NULL PMD only */
11845         if (gbl_driver_id != rte_cryptodev_driver_id_get(
11846                         RTE_STR(CRYPTODEV_NAME_NULL_PMD)))
11847                 return TEST_SKIPPED;
11848
11849         /* Setup Cipher Parameters */
11850         ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
11851         ut_params->cipher_xform.next = NULL;
11852
11853         ut_params->cipher_xform.cipher.algo = RTE_CRYPTO_CIPHER_AES_CBC;
11854         ut_params->cipher_xform.cipher.op = RTE_CRYPTO_CIPHER_OP_ENCRYPT;
11855
11856         ut_params->sess = rte_cryptodev_sym_session_create(
11857                         ts_params->session_mpool);
11858
11859         /* Create Crypto session*/
11860         ret = rte_cryptodev_sym_session_init(ts_params->valid_devs[0],
11861                         ut_params->sess, &ut_params->cipher_xform,
11862                         ts_params->session_priv_mpool);
11863         TEST_ASSERT(ret < 0,
11864                         "Session creation succeeded unexpectedly");
11865
11866
11867         /* Setup HMAC Parameters */
11868         ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;
11869         ut_params->auth_xform.next = NULL;
11870
11871         ut_params->auth_xform.auth.algo = RTE_CRYPTO_AUTH_SHA1_HMAC;
11872         ut_params->auth_xform.auth.op = RTE_CRYPTO_AUTH_OP_GENERATE;
11873
11874         ut_params->sess = rte_cryptodev_sym_session_create(
11875                         ts_params->session_mpool);
11876
11877         /* Create Crypto session*/
11878         ret = rte_cryptodev_sym_session_init(ts_params->valid_devs[0],
11879                         ut_params->sess, &ut_params->auth_xform,
11880                         ts_params->session_priv_mpool);
11881         TEST_ASSERT(ret < 0,
11882                         "Session creation succeeded unexpectedly");
11883
11884         return TEST_SUCCESS;
11885 }
11886
11887
11888 #define NULL_BURST_LENGTH (32)
11889
11890 static int
11891 test_null_burst_operation(void)
11892 {
11893         struct crypto_testsuite_params *ts_params = &testsuite_params;
11894         struct crypto_unittest_params *ut_params = &unittest_params;
11895         int status;
11896
11897         unsigned i, burst_len = NULL_BURST_LENGTH;
11898
11899         struct rte_crypto_op *burst[NULL_BURST_LENGTH] = { NULL };
11900         struct rte_crypto_op *burst_dequeued[NULL_BURST_LENGTH] = { NULL };
11901
11902         /* This test is for NULL PMD only */
11903         if (gbl_driver_id != rte_cryptodev_driver_id_get(
11904                         RTE_STR(CRYPTODEV_NAME_NULL_PMD)))
11905                 return TEST_SKIPPED;
11906
11907         /* Setup Cipher Parameters */
11908         ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
11909         ut_params->cipher_xform.next = &ut_params->auth_xform;
11910
11911         ut_params->cipher_xform.cipher.algo = RTE_CRYPTO_CIPHER_NULL;
11912         ut_params->cipher_xform.cipher.op = RTE_CRYPTO_CIPHER_OP_ENCRYPT;
11913
11914         /* Setup HMAC Parameters */
11915         ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;
11916         ut_params->auth_xform.next = NULL;
11917
11918         ut_params->auth_xform.auth.algo = RTE_CRYPTO_AUTH_NULL;
11919         ut_params->auth_xform.auth.op = RTE_CRYPTO_AUTH_OP_GENERATE;
11920
11921         ut_params->sess = rte_cryptodev_sym_session_create(
11922                         ts_params->session_mpool);
11923         TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed");
11924
11925         /* Create Crypto session*/
11926         status = rte_cryptodev_sym_session_init(ts_params->valid_devs[0],
11927                         ut_params->sess, &ut_params->cipher_xform,
11928                         ts_params->session_priv_mpool);
11929
11930         if (status == -ENOTSUP)
11931                 return TEST_SKIPPED;
11932
11933         TEST_ASSERT_EQUAL(status, 0, "Session init failed");
11934
11935         TEST_ASSERT_EQUAL(rte_crypto_op_bulk_alloc(ts_params->op_mpool,
11936                         RTE_CRYPTO_OP_TYPE_SYMMETRIC, burst, burst_len),
11937                         burst_len, "failed to generate burst of crypto ops");
11938
11939         /* Generate an operation for each mbuf in burst */
11940         for (i = 0; i < burst_len; i++) {
11941                 struct rte_mbuf *m = rte_pktmbuf_alloc(ts_params->mbuf_pool);
11942
11943                 TEST_ASSERT_NOT_NULL(m, "Failed to allocate mbuf");
11944
11945                 unsigned *data = (unsigned *)rte_pktmbuf_append(m,
11946                                 sizeof(unsigned));
11947                 *data = i;
11948
11949                 rte_crypto_op_attach_sym_session(burst[i], ut_params->sess);
11950
11951                 burst[i]->sym->m_src = m;
11952         }
11953
11954         /* Process crypto operation */
11955         TEST_ASSERT_EQUAL(rte_cryptodev_enqueue_burst(ts_params->valid_devs[0],
11956                         0, burst, burst_len),
11957                         burst_len,
11958                         "Error enqueuing burst");
11959
11960         TEST_ASSERT_EQUAL(rte_cryptodev_dequeue_burst(ts_params->valid_devs[0],
11961                         0, burst_dequeued, burst_len),
11962                         burst_len,
11963                         "Error dequeuing burst");
11964
11965
11966         for (i = 0; i < burst_len; i++) {
11967                 TEST_ASSERT_EQUAL(
11968                         *rte_pktmbuf_mtod(burst[i]->sym->m_src, uint32_t *),
11969                         *rte_pktmbuf_mtod(burst_dequeued[i]->sym->m_src,
11970                                         uint32_t *),
11971                         "data not as expected");
11972
11973                 rte_pktmbuf_free(burst[i]->sym->m_src);
11974                 rte_crypto_op_free(burst[i]);
11975         }
11976
11977         return TEST_SUCCESS;
11978 }
11979
11980 static uint16_t
11981 test_enq_callback(uint16_t dev_id, uint16_t qp_id, struct rte_crypto_op **ops,
11982                   uint16_t nb_ops, void *user_param)
11983 {
11984         RTE_SET_USED(dev_id);
11985         RTE_SET_USED(qp_id);
11986         RTE_SET_USED(ops);
11987         RTE_SET_USED(user_param);
11988
11989         printf("crypto enqueue callback called\n");
11990         return nb_ops;
11991 }
11992
11993 static uint16_t
11994 test_deq_callback(uint16_t dev_id, uint16_t qp_id, struct rte_crypto_op **ops,
11995                   uint16_t nb_ops, void *user_param)
11996 {
11997         RTE_SET_USED(dev_id);
11998         RTE_SET_USED(qp_id);
11999         RTE_SET_USED(ops);
12000         RTE_SET_USED(user_param);
12001
12002         printf("crypto dequeue callback called\n");
12003         return nb_ops;
12004 }
12005
12006 /*
12007  * Thread using enqueue/dequeue callback with RCU.
12008  */
12009 static int
12010 test_enqdeq_callback_thread(void *arg)
12011 {
12012         RTE_SET_USED(arg);
12013         /* DP thread calls rte_cryptodev_enqueue_burst()/
12014          * rte_cryptodev_dequeue_burst() and invokes callback.
12015          */
12016         test_null_burst_operation();
12017         return 0;
12018 }
12019
12020 static int
12021 test_enq_callback_setup(void)
12022 {
12023         struct crypto_testsuite_params *ts_params = &testsuite_params;
12024         struct rte_cryptodev_info dev_info;
12025         struct rte_cryptodev_qp_conf qp_conf = {
12026                 .nb_descriptors = MAX_NUM_OPS_INFLIGHT
12027         };
12028
12029         struct rte_cryptodev_cb *cb;
12030         uint16_t qp_id = 0;
12031
12032         /* Stop the device in case it's started so it can be configured */
12033         rte_cryptodev_stop(ts_params->valid_devs[0]);
12034
12035         rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
12036
12037         TEST_ASSERT_SUCCESS(rte_cryptodev_configure(ts_params->valid_devs[0],
12038                         &ts_params->conf),
12039                         "Failed to configure cryptodev %u",
12040                         ts_params->valid_devs[0]);
12041
12042         qp_conf.nb_descriptors = MAX_NUM_OPS_INFLIGHT;
12043         qp_conf.mp_session = ts_params->session_mpool;
12044         qp_conf.mp_session_private = ts_params->session_priv_mpool;
12045
12046         TEST_ASSERT_SUCCESS(rte_cryptodev_queue_pair_setup(
12047                         ts_params->valid_devs[0], qp_id, &qp_conf,
12048                         rte_cryptodev_socket_id(ts_params->valid_devs[0])),
12049                         "Failed test for "
12050                         "rte_cryptodev_queue_pair_setup: num_inflights "
12051                         "%u on qp %u on cryptodev %u",
12052                         qp_conf.nb_descriptors, qp_id,
12053                         ts_params->valid_devs[0]);
12054
12055         /* Test with invalid crypto device */
12056         cb = rte_cryptodev_add_enq_callback(RTE_CRYPTO_MAX_DEVS,
12057                         qp_id, test_enq_callback, NULL);
12058         TEST_ASSERT_NULL(cb, "Add callback on qp %u on "
12059                         "cryptodev %u did not fail",
12060                         qp_id, RTE_CRYPTO_MAX_DEVS);
12061
12062         /* Test with invalid queue pair */
12063         cb = rte_cryptodev_add_enq_callback(ts_params->valid_devs[0],
12064                         dev_info.max_nb_queue_pairs + 1,
12065                         test_enq_callback, NULL);
12066         TEST_ASSERT_NULL(cb, "Add callback on qp %u on "
12067                         "cryptodev %u did not fail",
12068                         dev_info.max_nb_queue_pairs + 1,
12069                         ts_params->valid_devs[0]);
12070
12071         /* Test with NULL callback */
12072         cb = rte_cryptodev_add_enq_callback(ts_params->valid_devs[0],
12073                         qp_id, NULL, NULL);
12074         TEST_ASSERT_NULL(cb, "Add callback on qp %u on "
12075                         "cryptodev %u did not fail",
12076                         qp_id, ts_params->valid_devs[0]);
12077
12078         /* Test with valid configuration */
12079         cb = rte_cryptodev_add_enq_callback(ts_params->valid_devs[0],
12080                         qp_id, test_enq_callback, NULL);
12081         TEST_ASSERT_NOT_NULL(cb, "Failed test to add callback on "
12082                         "qp %u on cryptodev %u",
12083                         qp_id, ts_params->valid_devs[0]);
12084
12085         rte_cryptodev_start(ts_params->valid_devs[0]);
12086
12087         /* Launch a thread */
12088         rte_eal_remote_launch(test_enqdeq_callback_thread, NULL,
12089                                 rte_get_next_lcore(-1, 1, 0));
12090
12091         /* Wait until reader exited. */
12092         rte_eal_mp_wait_lcore();
12093
12094         /* Test with invalid crypto device */
12095         TEST_ASSERT_FAIL(rte_cryptodev_remove_enq_callback(
12096                         RTE_CRYPTO_MAX_DEVS, qp_id, cb),
12097                         "Expected call to fail as crypto device is invalid");
12098
12099         /* Test with invalid queue pair */
12100         TEST_ASSERT_FAIL(rte_cryptodev_remove_enq_callback(
12101                         ts_params->valid_devs[0],
12102                         dev_info.max_nb_queue_pairs + 1, cb),
12103                         "Expected call to fail as queue pair is invalid");
12104
12105         /* Test with NULL callback */
12106         TEST_ASSERT_FAIL(rte_cryptodev_remove_enq_callback(
12107                         ts_params->valid_devs[0], qp_id, NULL),
12108                         "Expected call to fail as callback is NULL");
12109
12110         /* Test with valid configuration */
12111         TEST_ASSERT_SUCCESS(rte_cryptodev_remove_enq_callback(
12112                         ts_params->valid_devs[0], qp_id, cb),
12113                         "Failed test to remove callback on "
12114                         "qp %u on cryptodev %u",
12115                         qp_id, ts_params->valid_devs[0]);
12116
12117         return TEST_SUCCESS;
12118 }
12119
12120 static int
12121 test_deq_callback_setup(void)
12122 {
12123         struct crypto_testsuite_params *ts_params = &testsuite_params;
12124         struct rte_cryptodev_info dev_info;
12125         struct rte_cryptodev_qp_conf qp_conf = {
12126                 .nb_descriptors = MAX_NUM_OPS_INFLIGHT
12127         };
12128
12129         struct rte_cryptodev_cb *cb;
12130         uint16_t qp_id = 0;
12131
12132         /* Stop the device in case it's started so it can be configured */
12133         rte_cryptodev_stop(ts_params->valid_devs[0]);
12134
12135         rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
12136
12137         TEST_ASSERT_SUCCESS(rte_cryptodev_configure(ts_params->valid_devs[0],
12138                         &ts_params->conf),
12139                         "Failed to configure cryptodev %u",
12140                         ts_params->valid_devs[0]);
12141
12142         qp_conf.nb_descriptors = MAX_NUM_OPS_INFLIGHT;
12143         qp_conf.mp_session = ts_params->session_mpool;
12144         qp_conf.mp_session_private = ts_params->session_priv_mpool;
12145
12146         TEST_ASSERT_SUCCESS(rte_cryptodev_queue_pair_setup(
12147                         ts_params->valid_devs[0], qp_id, &qp_conf,
12148                         rte_cryptodev_socket_id(ts_params->valid_devs[0])),
12149                         "Failed test for "
12150                         "rte_cryptodev_queue_pair_setup: num_inflights "
12151                         "%u on qp %u on cryptodev %u",
12152                         qp_conf.nb_descriptors, qp_id,
12153                         ts_params->valid_devs[0]);
12154
12155         /* Test with invalid crypto device */
12156         cb = rte_cryptodev_add_deq_callback(RTE_CRYPTO_MAX_DEVS,
12157                         qp_id, test_deq_callback, NULL);
12158         TEST_ASSERT_NULL(cb, "Add callback on qp %u on "
12159                         "cryptodev %u did not fail",
12160                         qp_id, RTE_CRYPTO_MAX_DEVS);
12161
12162         /* Test with invalid queue pair */
12163         cb = rte_cryptodev_add_deq_callback(ts_params->valid_devs[0],
12164                         dev_info.max_nb_queue_pairs + 1,
12165                         test_deq_callback, NULL);
12166         TEST_ASSERT_NULL(cb, "Add callback on qp %u on "
12167                         "cryptodev %u did not fail",
12168                         dev_info.max_nb_queue_pairs + 1,
12169                         ts_params->valid_devs[0]);
12170
12171         /* Test with NULL callback */
12172         cb = rte_cryptodev_add_deq_callback(ts_params->valid_devs[0],
12173                         qp_id, NULL, NULL);
12174         TEST_ASSERT_NULL(cb, "Add callback on qp %u on "
12175                         "cryptodev %u did not fail",
12176                         qp_id, ts_params->valid_devs[0]);
12177
12178         /* Test with valid configuration */
12179         cb = rte_cryptodev_add_deq_callback(ts_params->valid_devs[0],
12180                         qp_id, test_deq_callback, NULL);
12181         TEST_ASSERT_NOT_NULL(cb, "Failed test to add callback on "
12182                         "qp %u on cryptodev %u",
12183                         qp_id, ts_params->valid_devs[0]);
12184
12185         rte_cryptodev_start(ts_params->valid_devs[0]);
12186
12187         /* Launch a thread */
12188         rte_eal_remote_launch(test_enqdeq_callback_thread, NULL,
12189                                 rte_get_next_lcore(-1, 1, 0));
12190
12191         /* Wait until reader exited. */
12192         rte_eal_mp_wait_lcore();
12193
12194         /* Test with invalid crypto device */
12195         TEST_ASSERT_FAIL(rte_cryptodev_remove_deq_callback(
12196                         RTE_CRYPTO_MAX_DEVS, qp_id, cb),
12197                         "Expected call to fail as crypto device is invalid");
12198
12199         /* Test with invalid queue pair */
12200         TEST_ASSERT_FAIL(rte_cryptodev_remove_deq_callback(
12201                         ts_params->valid_devs[0],
12202                         dev_info.max_nb_queue_pairs + 1, cb),
12203                         "Expected call to fail as queue pair is invalid");
12204
12205         /* Test with NULL callback */
12206         TEST_ASSERT_FAIL(rte_cryptodev_remove_deq_callback(
12207                         ts_params->valid_devs[0], qp_id, NULL),
12208                         "Expected call to fail as callback is NULL");
12209
12210         /* Test with valid configuration */
12211         TEST_ASSERT_SUCCESS(rte_cryptodev_remove_deq_callback(
12212                         ts_params->valid_devs[0], qp_id, cb),
12213                         "Failed test to remove callback on "
12214                         "qp %u on cryptodev %u",
12215                         qp_id, ts_params->valid_devs[0]);
12216
12217         return TEST_SUCCESS;
12218 }
12219
12220 static void
12221 generate_gmac_large_plaintext(uint8_t *data)
12222 {
12223         uint16_t i;
12224
12225         for (i = 32; i < GMAC_LARGE_PLAINTEXT_LENGTH; i += 32)
12226                 memcpy(&data[i], &data[0], 32);
12227 }
12228
12229 static int
12230 create_gmac_operation(enum rte_crypto_auth_operation op,
12231                 const struct gmac_test_data *tdata)
12232 {
12233         struct crypto_testsuite_params *ts_params = &testsuite_params;
12234         struct crypto_unittest_params *ut_params = &unittest_params;
12235         struct rte_crypto_sym_op *sym_op;
12236
12237         uint32_t plaintext_pad_len = RTE_ALIGN_CEIL(tdata->plaintext.len, 16);
12238
12239         /* Generate Crypto op data structure */
12240         ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
12241                         RTE_CRYPTO_OP_TYPE_SYMMETRIC);
12242         TEST_ASSERT_NOT_NULL(ut_params->op,
12243                         "Failed to allocate symmetric crypto operation struct");
12244
12245         sym_op = ut_params->op->sym;
12246
12247         sym_op->auth.digest.data = (uint8_t *)rte_pktmbuf_append(
12248                         ut_params->ibuf, tdata->gmac_tag.len);
12249         TEST_ASSERT_NOT_NULL(sym_op->auth.digest.data,
12250                         "no room to append digest");
12251
12252         sym_op->auth.digest.phys_addr = rte_pktmbuf_iova_offset(
12253                         ut_params->ibuf, plaintext_pad_len);
12254
12255         if (op == RTE_CRYPTO_AUTH_OP_VERIFY) {
12256                 rte_memcpy(sym_op->auth.digest.data, tdata->gmac_tag.data,
12257                                 tdata->gmac_tag.len);
12258                 debug_hexdump(stdout, "digest:",
12259                                 sym_op->auth.digest.data,
12260                                 tdata->gmac_tag.len);
12261         }
12262
12263         uint8_t *iv_ptr = rte_crypto_op_ctod_offset(ut_params->op,
12264                         uint8_t *, IV_OFFSET);
12265
12266         rte_memcpy(iv_ptr, tdata->iv.data, tdata->iv.len);
12267
12268         debug_hexdump(stdout, "iv:", iv_ptr, tdata->iv.len);
12269
12270         sym_op->cipher.data.length = 0;
12271         sym_op->cipher.data.offset = 0;
12272
12273         sym_op->auth.data.offset = 0;
12274         sym_op->auth.data.length = tdata->plaintext.len;
12275
12276         return 0;
12277 }
12278
12279 static int
12280 create_gmac_operation_sgl(enum rte_crypto_auth_operation op,
12281                 const struct gmac_test_data *tdata,
12282                 void *digest_mem, uint64_t digest_phys)
12283 {
12284         struct crypto_testsuite_params *ts_params = &testsuite_params;
12285         struct crypto_unittest_params *ut_params = &unittest_params;
12286         struct rte_crypto_sym_op *sym_op;
12287
12288         /* Generate Crypto op data structure */
12289         ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
12290                         RTE_CRYPTO_OP_TYPE_SYMMETRIC);
12291         TEST_ASSERT_NOT_NULL(ut_params->op,
12292                         "Failed to allocate symmetric crypto operation struct");
12293
12294         sym_op = ut_params->op->sym;
12295
12296         sym_op->auth.digest.data = digest_mem;
12297         TEST_ASSERT_NOT_NULL(sym_op->auth.digest.data,
12298                         "no room to append digest");
12299
12300         sym_op->auth.digest.phys_addr = digest_phys;
12301
12302         if (op == RTE_CRYPTO_AUTH_OP_VERIFY) {
12303                 rte_memcpy(sym_op->auth.digest.data, tdata->gmac_tag.data,
12304                                 tdata->gmac_tag.len);
12305                 debug_hexdump(stdout, "digest:",
12306                                 sym_op->auth.digest.data,
12307                                 tdata->gmac_tag.len);
12308         }
12309
12310         uint8_t *iv_ptr = rte_crypto_op_ctod_offset(ut_params->op,
12311                         uint8_t *, IV_OFFSET);
12312
12313         rte_memcpy(iv_ptr, tdata->iv.data, tdata->iv.len);
12314
12315         debug_hexdump(stdout, "iv:", iv_ptr, tdata->iv.len);
12316
12317         sym_op->cipher.data.length = 0;
12318         sym_op->cipher.data.offset = 0;
12319
12320         sym_op->auth.data.offset = 0;
12321         sym_op->auth.data.length = tdata->plaintext.len;
12322
12323         return 0;
12324 }
12325
12326 static int create_gmac_session(uint8_t dev_id,
12327                 const struct gmac_test_data *tdata,
12328                 enum rte_crypto_auth_operation auth_op)
12329 {
12330         uint8_t auth_key[tdata->key.len];
12331         int status;
12332
12333         struct crypto_testsuite_params *ts_params = &testsuite_params;
12334         struct crypto_unittest_params *ut_params = &unittest_params;
12335
12336         memcpy(auth_key, tdata->key.data, tdata->key.len);
12337
12338         ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;
12339         ut_params->auth_xform.next = NULL;
12340
12341         ut_params->auth_xform.auth.algo = RTE_CRYPTO_AUTH_AES_GMAC;
12342         ut_params->auth_xform.auth.op = auth_op;
12343         ut_params->auth_xform.auth.digest_length = tdata->gmac_tag.len;
12344         ut_params->auth_xform.auth.key.length = tdata->key.len;
12345         ut_params->auth_xform.auth.key.data = auth_key;
12346         ut_params->auth_xform.auth.iv.offset = IV_OFFSET;
12347         ut_params->auth_xform.auth.iv.length = tdata->iv.len;
12348
12349
12350         ut_params->sess = rte_cryptodev_sym_session_create(
12351                         ts_params->session_mpool);
12352         TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed");
12353
12354         status = rte_cryptodev_sym_session_init(dev_id, ut_params->sess,
12355                         &ut_params->auth_xform,
12356                         ts_params->session_priv_mpool);
12357
12358         return status;
12359 }
12360
12361 static int
12362 test_AES_GMAC_authentication(const struct gmac_test_data *tdata)
12363 {
12364         struct crypto_testsuite_params *ts_params = &testsuite_params;
12365         struct crypto_unittest_params *ut_params = &unittest_params;
12366         struct rte_cryptodev_info dev_info;
12367
12368         rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
12369         uint64_t feat_flags = dev_info.feature_flags;
12370
12371         if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
12372                         (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
12373                 printf("Device doesn't support RAW data-path APIs.\n");
12374                 return TEST_SKIPPED;
12375         }
12376
12377         int retval;
12378
12379         uint8_t *auth_tag, *plaintext;
12380         uint16_t plaintext_pad_len;
12381
12382         TEST_ASSERT_NOT_EQUAL(tdata->gmac_tag.len, 0,
12383                               "No GMAC length in the source data");
12384
12385         /* Verify the capabilities */
12386         struct rte_cryptodev_sym_capability_idx cap_idx;
12387         cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
12388         cap_idx.algo.auth = RTE_CRYPTO_AUTH_AES_GMAC;
12389         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
12390                         &cap_idx) == NULL)
12391                 return TEST_SKIPPED;
12392
12393         retval = create_gmac_session(ts_params->valid_devs[0],
12394                         tdata, RTE_CRYPTO_AUTH_OP_GENERATE);
12395
12396         if (retval == -ENOTSUP)
12397                 return TEST_SKIPPED;
12398         if (retval < 0)
12399                 return retval;
12400
12401         if (tdata->plaintext.len > MBUF_SIZE)
12402                 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->large_mbuf_pool);
12403         else
12404                 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
12405         TEST_ASSERT_NOT_NULL(ut_params->ibuf,
12406                         "Failed to allocate input buffer in mempool");
12407
12408         memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
12409                         rte_pktmbuf_tailroom(ut_params->ibuf));
12410
12411         plaintext_pad_len = RTE_ALIGN_CEIL(tdata->plaintext.len, 16);
12412         /*
12413          * Runtime generate the large plain text instead of use hard code
12414          * plain text vector. It is done to avoid create huge source file
12415          * with the test vector.
12416          */
12417         if (tdata->plaintext.len == GMAC_LARGE_PLAINTEXT_LENGTH)
12418                 generate_gmac_large_plaintext(tdata->plaintext.data);
12419
12420         plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
12421                                 plaintext_pad_len);
12422         TEST_ASSERT_NOT_NULL(plaintext, "no room to append plaintext");
12423
12424         memcpy(plaintext, tdata->plaintext.data, tdata->plaintext.len);
12425         debug_hexdump(stdout, "plaintext:", plaintext,
12426                         tdata->plaintext.len);
12427
12428         retval = create_gmac_operation(RTE_CRYPTO_AUTH_OP_GENERATE,
12429                         tdata);
12430
12431         if (retval < 0)
12432                 return retval;
12433
12434         rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
12435
12436         ut_params->op->sym->m_src = ut_params->ibuf;
12437
12438         if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
12439                 process_cpu_crypt_auth_op(ts_params->valid_devs[0],
12440                         ut_params->op);
12441         else if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
12442                 process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
12443                                 ut_params->op, 0, 1, 0, 0);
12444         else
12445                 TEST_ASSERT_NOT_NULL(
12446                         process_crypto_request(ts_params->valid_devs[0],
12447                         ut_params->op), "failed to process sym crypto op");
12448
12449         TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
12450                         "crypto op processing failed");
12451
12452         if (ut_params->op->sym->m_dst) {
12453                 auth_tag = rte_pktmbuf_mtod_offset(ut_params->op->sym->m_dst,
12454                                 uint8_t *, plaintext_pad_len);
12455         } else {
12456                 auth_tag = plaintext + plaintext_pad_len;
12457         }
12458
12459         debug_hexdump(stdout, "auth tag:", auth_tag, tdata->gmac_tag.len);
12460
12461         TEST_ASSERT_BUFFERS_ARE_EQUAL(
12462                         auth_tag,
12463                         tdata->gmac_tag.data,
12464                         tdata->gmac_tag.len,
12465                         "GMAC Generated auth tag not as expected");
12466
12467         return 0;
12468 }
12469
12470 static int
12471 test_AES_GMAC_authentication_test_case_1(void)
12472 {
12473         return test_AES_GMAC_authentication(&gmac_test_case_1);
12474 }
12475
12476 static int
12477 test_AES_GMAC_authentication_test_case_2(void)
12478 {
12479         return test_AES_GMAC_authentication(&gmac_test_case_2);
12480 }
12481
12482 static int
12483 test_AES_GMAC_authentication_test_case_3(void)
12484 {
12485         return test_AES_GMAC_authentication(&gmac_test_case_3);
12486 }
12487
12488 static int
12489 test_AES_GMAC_authentication_test_case_4(void)
12490 {
12491         return test_AES_GMAC_authentication(&gmac_test_case_4);
12492 }
12493
12494 static int
12495 test_AES_GMAC_authentication_verify(const struct gmac_test_data *tdata)
12496 {
12497         struct crypto_testsuite_params *ts_params = &testsuite_params;
12498         struct crypto_unittest_params *ut_params = &unittest_params;
12499         int retval;
12500         uint32_t plaintext_pad_len;
12501         uint8_t *plaintext;
12502         struct rte_cryptodev_info dev_info;
12503
12504         rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
12505         uint64_t feat_flags = dev_info.feature_flags;
12506
12507         if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
12508                         (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
12509                 printf("Device doesn't support RAW data-path APIs.\n");
12510                 return TEST_SKIPPED;
12511         }
12512
12513         TEST_ASSERT_NOT_EQUAL(tdata->gmac_tag.len, 0,
12514                               "No GMAC length in the source data");
12515
12516         /* Verify the capabilities */
12517         struct rte_cryptodev_sym_capability_idx cap_idx;
12518         cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
12519         cap_idx.algo.auth = RTE_CRYPTO_AUTH_AES_GMAC;
12520         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
12521                         &cap_idx) == NULL)
12522                 return TEST_SKIPPED;
12523
12524         retval = create_gmac_session(ts_params->valid_devs[0],
12525                         tdata, RTE_CRYPTO_AUTH_OP_VERIFY);
12526
12527         if (retval == -ENOTSUP)
12528                 return TEST_SKIPPED;
12529         if (retval < 0)
12530                 return retval;
12531
12532         if (tdata->plaintext.len > MBUF_SIZE)
12533                 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->large_mbuf_pool);
12534         else
12535                 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
12536         TEST_ASSERT_NOT_NULL(ut_params->ibuf,
12537                         "Failed to allocate input buffer in mempool");
12538
12539         memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
12540                         rte_pktmbuf_tailroom(ut_params->ibuf));
12541
12542         plaintext_pad_len = RTE_ALIGN_CEIL(tdata->plaintext.len, 16);
12543
12544         /*
12545          * Runtime generate the large plain text instead of use hard code
12546          * plain text vector. It is done to avoid create huge source file
12547          * with the test vector.
12548          */
12549         if (tdata->plaintext.len == GMAC_LARGE_PLAINTEXT_LENGTH)
12550                 generate_gmac_large_plaintext(tdata->plaintext.data);
12551
12552         plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
12553                                 plaintext_pad_len);
12554         TEST_ASSERT_NOT_NULL(plaintext, "no room to append plaintext");
12555
12556         memcpy(plaintext, tdata->plaintext.data, tdata->plaintext.len);
12557         debug_hexdump(stdout, "plaintext:", plaintext,
12558                         tdata->plaintext.len);
12559
12560         retval = create_gmac_operation(RTE_CRYPTO_AUTH_OP_VERIFY,
12561                         tdata);
12562
12563         if (retval < 0)
12564                 return retval;
12565
12566         rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
12567
12568         ut_params->op->sym->m_src = ut_params->ibuf;
12569
12570         if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
12571                 process_cpu_crypt_auth_op(ts_params->valid_devs[0],
12572                         ut_params->op);
12573         else if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
12574                 process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
12575                                 ut_params->op, 0, 1, 0, 0);
12576         else
12577                 TEST_ASSERT_NOT_NULL(
12578                         process_crypto_request(ts_params->valid_devs[0],
12579                         ut_params->op), "failed to process sym crypto op");
12580
12581         TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
12582                         "crypto op processing failed");
12583
12584         return 0;
12585
12586 }
12587
12588 static int
12589 test_AES_GMAC_authentication_verify_test_case_1(void)
12590 {
12591         return test_AES_GMAC_authentication_verify(&gmac_test_case_1);
12592 }
12593
12594 static int
12595 test_AES_GMAC_authentication_verify_test_case_2(void)
12596 {
12597         return test_AES_GMAC_authentication_verify(&gmac_test_case_2);
12598 }
12599
12600 static int
12601 test_AES_GMAC_authentication_verify_test_case_3(void)
12602 {
12603         return test_AES_GMAC_authentication_verify(&gmac_test_case_3);
12604 }
12605
12606 static int
12607 test_AES_GMAC_authentication_verify_test_case_4(void)
12608 {
12609         return test_AES_GMAC_authentication_verify(&gmac_test_case_4);
12610 }
12611
12612 static int
12613 test_AES_GMAC_authentication_SGL(const struct gmac_test_data *tdata,
12614                                 uint32_t fragsz)
12615 {
12616         struct crypto_testsuite_params *ts_params = &testsuite_params;
12617         struct crypto_unittest_params *ut_params = &unittest_params;
12618         struct rte_cryptodev_info dev_info;
12619         uint64_t feature_flags;
12620         unsigned int trn_data = 0;
12621         void *digest_mem = NULL;
12622         uint32_t segs = 1;
12623         unsigned int to_trn = 0;
12624         struct rte_mbuf *buf = NULL;
12625         uint8_t *auth_tag, *plaintext;
12626         int retval;
12627
12628         TEST_ASSERT_NOT_EQUAL(tdata->gmac_tag.len, 0,
12629                               "No GMAC length in the source data");
12630
12631         /* Verify the capabilities */
12632         struct rte_cryptodev_sym_capability_idx cap_idx;
12633         cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
12634         cap_idx.algo.auth = RTE_CRYPTO_AUTH_AES_GMAC;
12635         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
12636                         &cap_idx) == NULL)
12637                 return TEST_SKIPPED;
12638
12639         /* Check for any input SGL support */
12640         rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
12641         feature_flags = dev_info.feature_flags;
12642
12643         if ((!(feature_flags & RTE_CRYPTODEV_FF_IN_PLACE_SGL)) ||
12644                         (!(feature_flags & RTE_CRYPTODEV_FF_OOP_SGL_IN_LB_OUT)) ||
12645                         (!(feature_flags & RTE_CRYPTODEV_FF_OOP_SGL_IN_SGL_OUT)))
12646                 return TEST_SKIPPED;
12647
12648         if (fragsz > tdata->plaintext.len)
12649                 fragsz = tdata->plaintext.len;
12650
12651         uint16_t plaintext_len = fragsz;
12652
12653         retval = create_gmac_session(ts_params->valid_devs[0],
12654                         tdata, RTE_CRYPTO_AUTH_OP_GENERATE);
12655
12656         if (retval == -ENOTSUP)
12657                 return TEST_SKIPPED;
12658         if (retval < 0)
12659                 return retval;
12660
12661         ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
12662         TEST_ASSERT_NOT_NULL(ut_params->ibuf,
12663                         "Failed to allocate input buffer in mempool");
12664
12665         memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
12666                         rte_pktmbuf_tailroom(ut_params->ibuf));
12667
12668         plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
12669                                 plaintext_len);
12670         TEST_ASSERT_NOT_NULL(plaintext, "no room to append plaintext");
12671
12672         memcpy(plaintext, tdata->plaintext.data, plaintext_len);
12673
12674         trn_data += plaintext_len;
12675
12676         buf = ut_params->ibuf;
12677
12678         /*
12679          * Loop until no more fragments
12680          */
12681
12682         while (trn_data < tdata->plaintext.len) {
12683                 ++segs;
12684                 to_trn = (tdata->plaintext.len - trn_data < fragsz) ?
12685                                 (tdata->plaintext.len - trn_data) : fragsz;
12686
12687                 buf->next = rte_pktmbuf_alloc(ts_params->mbuf_pool);
12688                 buf = buf->next;
12689
12690                 memset(rte_pktmbuf_mtod(buf, uint8_t *), 0,
12691                                 rte_pktmbuf_tailroom(buf));
12692
12693                 plaintext = (uint8_t *)rte_pktmbuf_append(buf,
12694                                 to_trn);
12695
12696                 memcpy(plaintext, tdata->plaintext.data + trn_data,
12697                                 to_trn);
12698                 trn_data += to_trn;
12699                 if (trn_data  == tdata->plaintext.len)
12700                         digest_mem = (uint8_t *)rte_pktmbuf_append(buf,
12701                                         tdata->gmac_tag.len);
12702         }
12703         ut_params->ibuf->nb_segs = segs;
12704
12705         /*
12706          * Place digest at the end of the last buffer
12707          */
12708         uint64_t digest_phys = rte_pktmbuf_iova(buf) + to_trn;
12709
12710         if (!digest_mem) {
12711                 digest_mem = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
12712                                 + tdata->gmac_tag.len);
12713                 digest_phys = rte_pktmbuf_iova_offset(ut_params->ibuf,
12714                                 tdata->plaintext.len);
12715         }
12716
12717         retval = create_gmac_operation_sgl(RTE_CRYPTO_AUTH_OP_GENERATE,
12718                         tdata, digest_mem, digest_phys);
12719
12720         if (retval < 0)
12721                 return retval;
12722
12723         rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
12724
12725         ut_params->op->sym->m_src = ut_params->ibuf;
12726
12727         if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
12728                 return TEST_SKIPPED;
12729
12730         TEST_ASSERT_NOT_NULL(
12731                 process_crypto_request(ts_params->valid_devs[0],
12732                 ut_params->op), "failed to process sym crypto op");
12733
12734         TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
12735                         "crypto op processing failed");
12736
12737         auth_tag = digest_mem;
12738         debug_hexdump(stdout, "auth tag:", auth_tag, tdata->gmac_tag.len);
12739         TEST_ASSERT_BUFFERS_ARE_EQUAL(
12740                         auth_tag,
12741                         tdata->gmac_tag.data,
12742                         tdata->gmac_tag.len,
12743                         "GMAC Generated auth tag not as expected");
12744
12745         return 0;
12746 }
12747
12748 /* Segment size not multiple of block size (16B) */
12749 static int
12750 test_AES_GMAC_authentication_SGL_40B(void)
12751 {
12752         return test_AES_GMAC_authentication_SGL(&gmac_test_case_1, 40);
12753 }
12754
12755 static int
12756 test_AES_GMAC_authentication_SGL_80B(void)
12757 {
12758         return test_AES_GMAC_authentication_SGL(&gmac_test_case_1, 80);
12759 }
12760
12761 static int
12762 test_AES_GMAC_authentication_SGL_2048B(void)
12763 {
12764         return test_AES_GMAC_authentication_SGL(&gmac_test_case_5, 2048);
12765 }
12766
12767 /* Segment size not multiple of block size (16B) */
12768 static int
12769 test_AES_GMAC_authentication_SGL_2047B(void)
12770 {
12771         return test_AES_GMAC_authentication_SGL(&gmac_test_case_5, 2047);
12772 }
12773
12774 struct test_crypto_vector {
12775         enum rte_crypto_cipher_algorithm crypto_algo;
12776         unsigned int cipher_offset;
12777         unsigned int cipher_len;
12778
12779         struct {
12780                 uint8_t data[64];
12781                 unsigned int len;
12782         } cipher_key;
12783
12784         struct {
12785                 uint8_t data[64];
12786                 unsigned int len;
12787         } iv;
12788
12789         struct {
12790                 const uint8_t *data;
12791                 unsigned int len;
12792         } plaintext;
12793
12794         struct {
12795                 const uint8_t *data;
12796                 unsigned int len;
12797         } ciphertext;
12798
12799         enum rte_crypto_auth_algorithm auth_algo;
12800         unsigned int auth_offset;
12801
12802         struct {
12803                 uint8_t data[128];
12804                 unsigned int len;
12805         } auth_key;
12806
12807         struct {
12808                 const uint8_t *data;
12809                 unsigned int len;
12810         } aad;
12811
12812         struct {
12813                 uint8_t data[128];
12814                 unsigned int len;
12815         } digest;
12816 };
12817
12818 static const struct test_crypto_vector
12819 hmac_sha1_test_crypto_vector = {
12820         .auth_algo = RTE_CRYPTO_AUTH_SHA1_HMAC,
12821         .plaintext = {
12822                 .data = plaintext_hash,
12823                 .len = 512
12824         },
12825         .auth_key = {
12826                 .data = {
12827                         0xF8, 0x2A, 0xC7, 0x54, 0xDB, 0x96, 0x18, 0xAA,
12828                         0xC3, 0xA1, 0x53, 0xF6, 0x1F, 0x17, 0x60, 0xBD,
12829                         0xDE, 0xF4, 0xDE, 0xAD
12830                 },
12831                 .len = 20
12832         },
12833         .digest = {
12834                 .data = {
12835                         0xC4, 0xB7, 0x0E, 0x6B, 0xDE, 0xD1, 0xE7, 0x77,
12836                         0x7E, 0x2E, 0x8F, 0xFC, 0x48, 0x39, 0x46, 0x17,
12837                         0x3F, 0x91, 0x64, 0x59
12838                 },
12839                 .len = 20
12840         }
12841 };
12842
12843 static const struct test_crypto_vector
12844 aes128_gmac_test_vector = {
12845         .auth_algo = RTE_CRYPTO_AUTH_AES_GMAC,
12846         .plaintext = {
12847                 .data = plaintext_hash,
12848                 .len = 512
12849         },
12850         .iv = {
12851                 .data = {
12852                         0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
12853                         0x08, 0x09, 0x0A, 0x0B
12854                 },
12855                 .len = 12
12856         },
12857         .auth_key = {
12858                 .data = {
12859                         0x42, 0x1A, 0x7D, 0x3D, 0xF5, 0x82, 0x80, 0xF1,
12860                         0xF1, 0x35, 0x5C, 0x3B, 0xDD, 0x9A, 0x65, 0xBA
12861                 },
12862                 .len = 16
12863         },
12864         .digest = {
12865                 .data = {
12866                         0xCA, 0x00, 0x99, 0x8B, 0x30, 0x7E, 0x74, 0x56,
12867                         0x32, 0xA7, 0x87, 0xB5, 0xE9, 0xB2, 0x34, 0x5A
12868                 },
12869                 .len = 16
12870         }
12871 };
12872
12873 static const struct test_crypto_vector
12874 aes128cbc_hmac_sha1_test_vector = {
12875         .crypto_algo = RTE_CRYPTO_CIPHER_AES_CBC,
12876         .cipher_offset = 0,
12877         .cipher_len = 512,
12878         .cipher_key = {
12879                 .data = {
12880                         0xE4, 0x23, 0x33, 0x8A, 0x35, 0x64, 0x61, 0xE2,
12881                         0x49, 0x03, 0xDD, 0xC6, 0xB8, 0xCA, 0x55, 0x7A
12882                 },
12883                 .len = 16
12884         },
12885         .iv = {
12886                 .data = {
12887                         0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
12888                         0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F
12889                 },
12890                 .len = 16
12891         },
12892         .plaintext = {
12893                 .data = plaintext_hash,
12894                 .len = 512
12895         },
12896         .ciphertext = {
12897                 .data = ciphertext512_aes128cbc,
12898                 .len = 512
12899         },
12900         .auth_algo = RTE_CRYPTO_AUTH_SHA1_HMAC,
12901         .auth_offset = 0,
12902         .auth_key = {
12903                 .data = {
12904                         0xF8, 0x2A, 0xC7, 0x54, 0xDB, 0x96, 0x18, 0xAA,
12905                         0xC3, 0xA1, 0x53, 0xF6, 0x1F, 0x17, 0x60, 0xBD,
12906                         0xDE, 0xF4, 0xDE, 0xAD
12907                 },
12908                 .len = 20
12909         },
12910         .digest = {
12911                 .data = {
12912                         0x9A, 0x4F, 0x88, 0x1B, 0xB6, 0x8F, 0xD8, 0x60,
12913                         0x42, 0x1A, 0x7D, 0x3D, 0xF5, 0x82, 0x80, 0xF1,
12914                         0x18, 0x8C, 0x1D, 0x32
12915                 },
12916                 .len = 20
12917         }
12918 };
12919
12920 static const struct test_crypto_vector
12921 aes128cbc_hmac_sha1_aad_test_vector = {
12922         .crypto_algo = RTE_CRYPTO_CIPHER_AES_CBC,
12923         .cipher_offset = 8,
12924         .cipher_len = 496,
12925         .cipher_key = {
12926                 .data = {
12927                         0xE4, 0x23, 0x33, 0x8A, 0x35, 0x64, 0x61, 0xE2,
12928                         0x49, 0x03, 0xDD, 0xC6, 0xB8, 0xCA, 0x55, 0x7A
12929                 },
12930                 .len = 16
12931         },
12932         .iv = {
12933                 .data = {
12934                         0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
12935                         0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F
12936                 },
12937                 .len = 16
12938         },
12939         .plaintext = {
12940                 .data = plaintext_hash,
12941                 .len = 512
12942         },
12943         .ciphertext = {
12944                 .data = ciphertext512_aes128cbc_aad,
12945                 .len = 512
12946         },
12947         .auth_algo = RTE_CRYPTO_AUTH_SHA1_HMAC,
12948         .auth_offset = 0,
12949         .auth_key = {
12950                 .data = {
12951                         0xF8, 0x2A, 0xC7, 0x54, 0xDB, 0x96, 0x18, 0xAA,
12952                         0xC3, 0xA1, 0x53, 0xF6, 0x1F, 0x17, 0x60, 0xBD,
12953                         0xDE, 0xF4, 0xDE, 0xAD
12954                 },
12955                 .len = 20
12956         },
12957         .digest = {
12958                 .data = {
12959                         0x6D, 0xF3, 0x50, 0x79, 0x7A, 0x2A, 0xAC, 0x7F,
12960                         0xA6, 0xF0, 0xC6, 0x38, 0x1F, 0xA4, 0xDD, 0x9B,
12961                         0x62, 0x0F, 0xFB, 0x10
12962                 },
12963                 .len = 20
12964         }
12965 };
12966
12967 static void
12968 data_corruption(uint8_t *data)
12969 {
12970         data[0] += 1;
12971 }
12972
12973 static void
12974 tag_corruption(uint8_t *data, unsigned int tag_offset)
12975 {
12976         data[tag_offset] += 1;
12977 }
12978
12979 static int
12980 create_auth_session(struct crypto_unittest_params *ut_params,
12981                 uint8_t dev_id,
12982                 const struct test_crypto_vector *reference,
12983                 enum rte_crypto_auth_operation auth_op)
12984 {
12985         struct crypto_testsuite_params *ts_params = &testsuite_params;
12986         uint8_t auth_key[reference->auth_key.len + 1];
12987         int status;
12988
12989         memcpy(auth_key, reference->auth_key.data, reference->auth_key.len);
12990
12991         /* Setup Authentication Parameters */
12992         ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;
12993         ut_params->auth_xform.auth.op = auth_op;
12994         ut_params->auth_xform.next = NULL;
12995         ut_params->auth_xform.auth.algo = reference->auth_algo;
12996         ut_params->auth_xform.auth.key.length = reference->auth_key.len;
12997         ut_params->auth_xform.auth.key.data = auth_key;
12998         ut_params->auth_xform.auth.digest_length = reference->digest.len;
12999
13000         /* Create Crypto session*/
13001         ut_params->sess = rte_cryptodev_sym_session_create(
13002                         ts_params->session_mpool);
13003         TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed");
13004
13005         status = rte_cryptodev_sym_session_init(dev_id, ut_params->sess,
13006                                 &ut_params->auth_xform,
13007                                 ts_params->session_priv_mpool);
13008
13009         return status;
13010 }
13011
13012 static int
13013 create_auth_cipher_session(struct crypto_unittest_params *ut_params,
13014                 uint8_t dev_id,
13015                 const struct test_crypto_vector *reference,
13016                 enum rte_crypto_auth_operation auth_op,
13017                 enum rte_crypto_cipher_operation cipher_op)
13018 {
13019         struct crypto_testsuite_params *ts_params = &testsuite_params;
13020         uint8_t cipher_key[reference->cipher_key.len + 1];
13021         uint8_t auth_key[reference->auth_key.len + 1];
13022         int status;
13023
13024         memcpy(cipher_key, reference->cipher_key.data,
13025                         reference->cipher_key.len);
13026         memcpy(auth_key, reference->auth_key.data, reference->auth_key.len);
13027
13028         /* Setup Authentication Parameters */
13029         ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;
13030         ut_params->auth_xform.auth.op = auth_op;
13031         ut_params->auth_xform.auth.algo = reference->auth_algo;
13032         ut_params->auth_xform.auth.key.length = reference->auth_key.len;
13033         ut_params->auth_xform.auth.key.data = auth_key;
13034         ut_params->auth_xform.auth.digest_length = reference->digest.len;
13035
13036         if (reference->auth_algo == RTE_CRYPTO_AUTH_AES_GMAC) {
13037                 ut_params->auth_xform.auth.iv.offset = IV_OFFSET;
13038                 ut_params->auth_xform.auth.iv.length = reference->iv.len;
13039         } else {
13040                 ut_params->auth_xform.next = &ut_params->cipher_xform;
13041
13042                 /* Setup Cipher Parameters */
13043                 ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
13044                 ut_params->cipher_xform.next = NULL;
13045                 ut_params->cipher_xform.cipher.algo = reference->crypto_algo;
13046                 ut_params->cipher_xform.cipher.op = cipher_op;
13047                 ut_params->cipher_xform.cipher.key.data = cipher_key;
13048                 ut_params->cipher_xform.cipher.key.length = reference->cipher_key.len;
13049                 ut_params->cipher_xform.cipher.iv.offset = IV_OFFSET;
13050                 ut_params->cipher_xform.cipher.iv.length = reference->iv.len;
13051         }
13052
13053         /* Create Crypto session*/
13054         ut_params->sess = rte_cryptodev_sym_session_create(
13055                         ts_params->session_mpool);
13056         TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed");
13057
13058         status = rte_cryptodev_sym_session_init(dev_id, ut_params->sess,
13059                                 &ut_params->auth_xform,
13060                                 ts_params->session_priv_mpool);
13061
13062         return status;
13063 }
13064
13065 static int
13066 create_auth_operation(struct crypto_testsuite_params *ts_params,
13067                 struct crypto_unittest_params *ut_params,
13068                 const struct test_crypto_vector *reference,
13069                 unsigned int auth_generate)
13070 {
13071         /* Generate Crypto op data structure */
13072         ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
13073                         RTE_CRYPTO_OP_TYPE_SYMMETRIC);
13074         TEST_ASSERT_NOT_NULL(ut_params->op,
13075                         "Failed to allocate pktmbuf offload");
13076
13077         /* Set crypto operation data parameters */
13078         rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
13079
13080         struct rte_crypto_sym_op *sym_op = ut_params->op->sym;
13081
13082         /* set crypto operation source mbuf */
13083         sym_op->m_src = ut_params->ibuf;
13084
13085         /* digest */
13086         sym_op->auth.digest.data = (uint8_t *)rte_pktmbuf_append(
13087                         ut_params->ibuf, reference->digest.len);
13088
13089         TEST_ASSERT_NOT_NULL(sym_op->auth.digest.data,
13090                         "no room to append auth tag");
13091
13092         sym_op->auth.digest.phys_addr = rte_pktmbuf_iova_offset(
13093                         ut_params->ibuf, reference->plaintext.len);
13094
13095         if (auth_generate)
13096                 memset(sym_op->auth.digest.data, 0, reference->digest.len);
13097         else
13098                 memcpy(sym_op->auth.digest.data,
13099                                 reference->digest.data,
13100                                 reference->digest.len);
13101
13102         debug_hexdump(stdout, "digest:",
13103                         sym_op->auth.digest.data,
13104                         reference->digest.len);
13105
13106         sym_op->auth.data.length = reference->plaintext.len;
13107         sym_op->auth.data.offset = 0;
13108
13109         return 0;
13110 }
13111
13112 static int
13113 create_auth_GMAC_operation(struct crypto_testsuite_params *ts_params,
13114                 struct crypto_unittest_params *ut_params,
13115                 const struct test_crypto_vector *reference,
13116                 unsigned int auth_generate)
13117 {
13118         /* Generate Crypto op data structure */
13119         ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
13120                         RTE_CRYPTO_OP_TYPE_SYMMETRIC);
13121         TEST_ASSERT_NOT_NULL(ut_params->op,
13122                         "Failed to allocate pktmbuf offload");
13123
13124         /* Set crypto operation data parameters */
13125         rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
13126
13127         struct rte_crypto_sym_op *sym_op = ut_params->op->sym;
13128
13129         /* set crypto operation source mbuf */
13130         sym_op->m_src = ut_params->ibuf;
13131
13132         /* digest */
13133         sym_op->auth.digest.data = (uint8_t *)rte_pktmbuf_append(
13134                         ut_params->ibuf, reference->digest.len);
13135
13136         TEST_ASSERT_NOT_NULL(sym_op->auth.digest.data,
13137                         "no room to append auth tag");
13138
13139         sym_op->auth.digest.phys_addr = rte_pktmbuf_iova_offset(
13140                         ut_params->ibuf, reference->ciphertext.len);
13141
13142         if (auth_generate)
13143                 memset(sym_op->auth.digest.data, 0, reference->digest.len);
13144         else
13145                 memcpy(sym_op->auth.digest.data,
13146                                 reference->digest.data,
13147                                 reference->digest.len);
13148
13149         debug_hexdump(stdout, "digest:",
13150                         sym_op->auth.digest.data,
13151                         reference->digest.len);
13152
13153         rte_memcpy(rte_crypto_op_ctod_offset(ut_params->op, uint8_t *, IV_OFFSET),
13154                         reference->iv.data, reference->iv.len);
13155
13156         sym_op->cipher.data.length = 0;
13157         sym_op->cipher.data.offset = 0;
13158
13159         sym_op->auth.data.length = reference->plaintext.len;
13160         sym_op->auth.data.offset = 0;
13161
13162         return 0;
13163 }
13164
13165 static int
13166 create_cipher_auth_operation(struct crypto_testsuite_params *ts_params,
13167                 struct crypto_unittest_params *ut_params,
13168                 const struct test_crypto_vector *reference,
13169                 unsigned int auth_generate)
13170 {
13171         /* Generate Crypto op data structure */
13172         ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
13173                         RTE_CRYPTO_OP_TYPE_SYMMETRIC);
13174         TEST_ASSERT_NOT_NULL(ut_params->op,
13175                         "Failed to allocate pktmbuf offload");
13176
13177         /* Set crypto operation data parameters */
13178         rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
13179
13180         struct rte_crypto_sym_op *sym_op = ut_params->op->sym;
13181
13182         /* set crypto operation source mbuf */
13183         sym_op->m_src = ut_params->ibuf;
13184
13185         /* digest */
13186         sym_op->auth.digest.data = (uint8_t *)rte_pktmbuf_append(
13187                         ut_params->ibuf, reference->digest.len);
13188
13189         TEST_ASSERT_NOT_NULL(sym_op->auth.digest.data,
13190                         "no room to append auth tag");
13191
13192         sym_op->auth.digest.phys_addr = rte_pktmbuf_iova_offset(
13193                         ut_params->ibuf, reference->ciphertext.len);
13194
13195         if (auth_generate)
13196                 memset(sym_op->auth.digest.data, 0, reference->digest.len);
13197         else
13198                 memcpy(sym_op->auth.digest.data,
13199                                 reference->digest.data,
13200                                 reference->digest.len);
13201
13202         debug_hexdump(stdout, "digest:",
13203                         sym_op->auth.digest.data,
13204                         reference->digest.len);
13205
13206         rte_memcpy(rte_crypto_op_ctod_offset(ut_params->op, uint8_t *, IV_OFFSET),
13207                         reference->iv.data, reference->iv.len);
13208
13209         sym_op->cipher.data.length = reference->cipher_len;
13210         sym_op->cipher.data.offset = reference->cipher_offset;
13211
13212         sym_op->auth.data.length = reference->plaintext.len;
13213         sym_op->auth.data.offset = reference->auth_offset;
13214
13215         return 0;
13216 }
13217
13218 static int
13219 create_auth_verify_operation(struct crypto_testsuite_params *ts_params,
13220                 struct crypto_unittest_params *ut_params,
13221                 const struct test_crypto_vector *reference)
13222 {
13223         return create_auth_operation(ts_params, ut_params, reference, 0);
13224 }
13225
13226 static int
13227 create_auth_verify_GMAC_operation(
13228                 struct crypto_testsuite_params *ts_params,
13229                 struct crypto_unittest_params *ut_params,
13230                 const struct test_crypto_vector *reference)
13231 {
13232         return create_auth_GMAC_operation(ts_params, ut_params, reference, 0);
13233 }
13234
13235 static int
13236 create_cipher_auth_verify_operation(struct crypto_testsuite_params *ts_params,
13237                 struct crypto_unittest_params *ut_params,
13238                 const struct test_crypto_vector *reference)
13239 {
13240         return create_cipher_auth_operation(ts_params, ut_params, reference, 0);
13241 }
13242
13243 static int
13244 test_authentication_verify_fail_when_data_corruption(
13245                 struct crypto_testsuite_params *ts_params,
13246                 struct crypto_unittest_params *ut_params,
13247                 const struct test_crypto_vector *reference,
13248                 unsigned int data_corrupted)
13249 {
13250         int retval;
13251
13252         uint8_t *plaintext;
13253         struct rte_cryptodev_info dev_info;
13254
13255         rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
13256         uint64_t feat_flags = dev_info.feature_flags;
13257
13258         if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
13259                         (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
13260                 printf("Device doesn't support RAW data-path APIs.\n");
13261                 return TEST_SKIPPED;
13262         }
13263
13264         /* Verify the capabilities */
13265         struct rte_cryptodev_sym_capability_idx cap_idx;
13266         cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
13267         cap_idx.algo.auth = reference->auth_algo;
13268         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
13269                         &cap_idx) == NULL)
13270                 return TEST_SKIPPED;
13271
13272
13273         /* Create session */
13274         retval = create_auth_session(ut_params,
13275                         ts_params->valid_devs[0],
13276                         reference,
13277                         RTE_CRYPTO_AUTH_OP_VERIFY);
13278
13279         if (retval == -ENOTSUP)
13280                 return TEST_SKIPPED;
13281         if (retval < 0)
13282                 return retval;
13283
13284         ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
13285         TEST_ASSERT_NOT_NULL(ut_params->ibuf,
13286                         "Failed to allocate input buffer in mempool");
13287
13288         /* clear mbuf payload */
13289         memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
13290                         rte_pktmbuf_tailroom(ut_params->ibuf));
13291
13292         plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
13293                         reference->plaintext.len);
13294         TEST_ASSERT_NOT_NULL(plaintext, "no room to append plaintext");
13295         memcpy(plaintext, reference->plaintext.data, reference->plaintext.len);
13296
13297         debug_hexdump(stdout, "plaintext:", plaintext,
13298                 reference->plaintext.len);
13299
13300         /* Create operation */
13301         retval = create_auth_verify_operation(ts_params, ut_params, reference);
13302
13303         if (retval < 0)
13304                 return retval;
13305
13306         if (data_corrupted)
13307                 data_corruption(plaintext);
13308         else
13309                 tag_corruption(plaintext, reference->plaintext.len);
13310
13311         if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO) {
13312                 process_cpu_crypt_auth_op(ts_params->valid_devs[0],
13313                         ut_params->op);
13314                 TEST_ASSERT_NOT_EQUAL(ut_params->op->status,
13315                         RTE_CRYPTO_OP_STATUS_SUCCESS,
13316                         "authentication not failed");
13317         } else if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
13318                 process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
13319                                 ut_params->op, 0, 1, 0, 0);
13320         else {
13321                 ut_params->op = process_crypto_request(ts_params->valid_devs[0],
13322                         ut_params->op);
13323         }
13324         if (ut_params->op == NULL)
13325                 return 0;
13326         else if (ut_params->op->status != RTE_CRYPTO_OP_STATUS_SUCCESS)
13327                 return 0;
13328
13329         return -1;
13330 }
13331
13332 static int
13333 test_authentication_verify_GMAC_fail_when_corruption(
13334                 struct crypto_testsuite_params *ts_params,
13335                 struct crypto_unittest_params *ut_params,
13336                 const struct test_crypto_vector *reference,
13337                 unsigned int data_corrupted)
13338 {
13339         int retval;
13340         uint8_t *plaintext;
13341         struct rte_cryptodev_info dev_info;
13342
13343         rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
13344         uint64_t feat_flags = dev_info.feature_flags;
13345
13346         if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
13347                         (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
13348                 printf("Device doesn't support RAW data-path APIs.\n");
13349                 return TEST_SKIPPED;
13350         }
13351
13352         /* Verify the capabilities */
13353         struct rte_cryptodev_sym_capability_idx cap_idx;
13354         cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
13355         cap_idx.algo.auth = reference->auth_algo;
13356         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
13357                         &cap_idx) == NULL)
13358                 return TEST_SKIPPED;
13359
13360         /* Create session */
13361         retval = create_auth_cipher_session(ut_params,
13362                         ts_params->valid_devs[0],
13363                         reference,
13364                         RTE_CRYPTO_AUTH_OP_VERIFY,
13365                         RTE_CRYPTO_CIPHER_OP_DECRYPT);
13366         if (retval < 0)
13367                 return retval;
13368
13369         ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
13370         TEST_ASSERT_NOT_NULL(ut_params->ibuf,
13371                         "Failed to allocate input buffer in mempool");
13372
13373         /* clear mbuf payload */
13374         memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
13375                         rte_pktmbuf_tailroom(ut_params->ibuf));
13376
13377         plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
13378                         reference->plaintext.len);
13379         TEST_ASSERT_NOT_NULL(plaintext, "no room to append plaintext");
13380         memcpy(plaintext, reference->plaintext.data, reference->plaintext.len);
13381
13382         debug_hexdump(stdout, "plaintext:", plaintext,
13383                 reference->plaintext.len);
13384
13385         /* Create operation */
13386         retval = create_auth_verify_GMAC_operation(ts_params,
13387                         ut_params,
13388                         reference);
13389
13390         if (retval < 0)
13391                 return retval;
13392
13393         if (data_corrupted)
13394                 data_corruption(plaintext);
13395         else
13396                 tag_corruption(plaintext, reference->aad.len);
13397
13398         if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO) {
13399                 process_cpu_crypt_auth_op(ts_params->valid_devs[0],
13400                         ut_params->op);
13401                 TEST_ASSERT_NOT_EQUAL(ut_params->op->status,
13402                         RTE_CRYPTO_OP_STATUS_SUCCESS,
13403                         "authentication not failed");
13404         } else if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
13405                 process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
13406                                 ut_params->op, 0, 1, 0, 0);
13407         else {
13408                 ut_params->op = process_crypto_request(ts_params->valid_devs[0],
13409                         ut_params->op);
13410                 TEST_ASSERT_NULL(ut_params->op, "authentication not failed");
13411         }
13412
13413         return 0;
13414 }
13415
13416 static int
13417 test_authenticated_decryption_fail_when_corruption(
13418                 struct crypto_testsuite_params *ts_params,
13419                 struct crypto_unittest_params *ut_params,
13420                 const struct test_crypto_vector *reference,
13421                 unsigned int data_corrupted)
13422 {
13423         int retval;
13424
13425         uint8_t *ciphertext;
13426         struct rte_cryptodev_info dev_info;
13427
13428         rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
13429         uint64_t feat_flags = dev_info.feature_flags;
13430
13431         if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
13432                         (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
13433                 printf("Device doesn't support RAW data-path APIs.\n");
13434                 return TEST_SKIPPED;
13435         }
13436
13437         /* Verify the capabilities */
13438         struct rte_cryptodev_sym_capability_idx cap_idx;
13439         cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
13440         cap_idx.algo.auth = reference->auth_algo;
13441         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
13442                         &cap_idx) == NULL)
13443                 return TEST_SKIPPED;
13444         cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
13445         cap_idx.algo.cipher = reference->crypto_algo;
13446         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
13447                         &cap_idx) == NULL)
13448                 return TEST_SKIPPED;
13449
13450         /* Create session */
13451         retval = create_auth_cipher_session(ut_params,
13452                         ts_params->valid_devs[0],
13453                         reference,
13454                         RTE_CRYPTO_AUTH_OP_VERIFY,
13455                         RTE_CRYPTO_CIPHER_OP_DECRYPT);
13456
13457         if (retval == -ENOTSUP)
13458                 return TEST_SKIPPED;
13459         if (retval < 0)
13460                 return retval;
13461
13462         ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
13463         TEST_ASSERT_NOT_NULL(ut_params->ibuf,
13464                         "Failed to allocate input buffer in mempool");
13465
13466         /* clear mbuf payload */
13467         memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
13468                         rte_pktmbuf_tailroom(ut_params->ibuf));
13469
13470         ciphertext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
13471                         reference->ciphertext.len);
13472         TEST_ASSERT_NOT_NULL(ciphertext, "no room to append ciphertext");
13473         memcpy(ciphertext, reference->ciphertext.data,
13474                         reference->ciphertext.len);
13475
13476         /* Create operation */
13477         retval = create_cipher_auth_verify_operation(ts_params,
13478                         ut_params,
13479                         reference);
13480
13481         if (retval < 0)
13482                 return retval;
13483
13484         if (data_corrupted)
13485                 data_corruption(ciphertext);
13486         else
13487                 tag_corruption(ciphertext, reference->ciphertext.len);
13488
13489         if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO) {
13490                 process_cpu_crypt_auth_op(ts_params->valid_devs[0],
13491                         ut_params->op);
13492                 TEST_ASSERT_NOT_EQUAL(ut_params->op->status,
13493                         RTE_CRYPTO_OP_STATUS_SUCCESS,
13494                         "authentication not failed");
13495         } else if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
13496                 process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
13497                                 ut_params->op, 1, 1, 0, 0);
13498         else {
13499                 ut_params->op = process_crypto_request(ts_params->valid_devs[0],
13500                         ut_params->op);
13501                 TEST_ASSERT_NULL(ut_params->op, "authentication not failed");
13502         }
13503
13504         return 0;
13505 }
13506
13507 static int
13508 test_authenticated_encrypt_with_esn(
13509                 struct crypto_testsuite_params *ts_params,
13510                 struct crypto_unittest_params *ut_params,
13511                 const struct test_crypto_vector *reference)
13512 {
13513         int retval;
13514
13515         uint8_t *authciphertext, *plaintext, *auth_tag;
13516         uint16_t plaintext_pad_len;
13517         uint8_t cipher_key[reference->cipher_key.len + 1];
13518         uint8_t auth_key[reference->auth_key.len + 1];
13519         struct rte_cryptodev_info dev_info;
13520         int status;
13521
13522         rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
13523         uint64_t feat_flags = dev_info.feature_flags;
13524
13525         if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
13526                         (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
13527                 printf("Device doesn't support RAW data-path APIs.\n");
13528                 return TEST_SKIPPED;
13529         }
13530
13531         /* Verify the capabilities */
13532         struct rte_cryptodev_sym_capability_idx cap_idx;
13533         cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
13534         cap_idx.algo.auth = reference->auth_algo;
13535         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
13536                         &cap_idx) == NULL)
13537                 return TEST_SKIPPED;
13538         cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
13539         cap_idx.algo.cipher = reference->crypto_algo;
13540         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
13541                         &cap_idx) == NULL)
13542                 return TEST_SKIPPED;
13543
13544         /* Create session */
13545         memcpy(cipher_key, reference->cipher_key.data,
13546                         reference->cipher_key.len);
13547         memcpy(auth_key, reference->auth_key.data, reference->auth_key.len);
13548
13549         /* Setup Cipher Parameters */
13550         ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
13551         ut_params->cipher_xform.cipher.algo = reference->crypto_algo;
13552         ut_params->cipher_xform.cipher.op = RTE_CRYPTO_CIPHER_OP_ENCRYPT;
13553         ut_params->cipher_xform.cipher.key.data = cipher_key;
13554         ut_params->cipher_xform.cipher.key.length = reference->cipher_key.len;
13555         ut_params->cipher_xform.cipher.iv.offset = IV_OFFSET;
13556         ut_params->cipher_xform.cipher.iv.length = reference->iv.len;
13557
13558         ut_params->cipher_xform.next = &ut_params->auth_xform;
13559
13560         /* Setup Authentication Parameters */
13561         ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;
13562         ut_params->auth_xform.auth.op = RTE_CRYPTO_AUTH_OP_GENERATE;
13563         ut_params->auth_xform.auth.algo = reference->auth_algo;
13564         ut_params->auth_xform.auth.key.length = reference->auth_key.len;
13565         ut_params->auth_xform.auth.key.data = auth_key;
13566         ut_params->auth_xform.auth.digest_length = reference->digest.len;
13567         ut_params->auth_xform.next = NULL;
13568
13569         /* Create Crypto session*/
13570         ut_params->sess = rte_cryptodev_sym_session_create(
13571                         ts_params->session_mpool);
13572         TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed");
13573
13574         status = rte_cryptodev_sym_session_init(ts_params->valid_devs[0],
13575                                 ut_params->sess,
13576                                 &ut_params->cipher_xform,
13577                                 ts_params->session_priv_mpool);
13578
13579         if (status == -ENOTSUP)
13580                 return TEST_SKIPPED;
13581
13582         TEST_ASSERT_EQUAL(status, 0, "Session init failed");
13583
13584         ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
13585         TEST_ASSERT_NOT_NULL(ut_params->ibuf,
13586                         "Failed to allocate input buffer in mempool");
13587
13588         /* clear mbuf payload */
13589         memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
13590                         rte_pktmbuf_tailroom(ut_params->ibuf));
13591
13592         plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
13593                         reference->plaintext.len);
13594         TEST_ASSERT_NOT_NULL(plaintext, "no room to append plaintext");
13595         memcpy(plaintext, reference->plaintext.data, reference->plaintext.len);
13596
13597         /* Create operation */
13598         retval = create_cipher_auth_operation(ts_params,
13599                         ut_params,
13600                         reference, 0);
13601
13602         if (retval < 0)
13603                 return retval;
13604
13605         if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
13606                 process_cpu_crypt_auth_op(ts_params->valid_devs[0],
13607                         ut_params->op);
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, 1, 1, 0, 0);
13611         else
13612                 ut_params->op = process_crypto_request(
13613                         ts_params->valid_devs[0], ut_params->op);
13614
13615         TEST_ASSERT_NOT_NULL(ut_params->op, "no crypto operation returned");
13616
13617         TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
13618                         "crypto op processing failed");
13619
13620         plaintext_pad_len = RTE_ALIGN_CEIL(reference->plaintext.len, 16);
13621
13622         authciphertext = rte_pktmbuf_mtod_offset(ut_params->ibuf, uint8_t *,
13623                         ut_params->op->sym->auth.data.offset);
13624         auth_tag = authciphertext + plaintext_pad_len;
13625         debug_hexdump(stdout, "ciphertext:", authciphertext,
13626                         reference->ciphertext.len);
13627         debug_hexdump(stdout, "auth tag:", auth_tag, reference->digest.len);
13628
13629         /* Validate obuf */
13630         TEST_ASSERT_BUFFERS_ARE_EQUAL(
13631                         authciphertext,
13632                         reference->ciphertext.data,
13633                         reference->ciphertext.len,
13634                         "Ciphertext data not as expected");
13635
13636         TEST_ASSERT_BUFFERS_ARE_EQUAL(
13637                         auth_tag,
13638                         reference->digest.data,
13639                         reference->digest.len,
13640                         "Generated digest not as expected");
13641
13642         return TEST_SUCCESS;
13643
13644 }
13645
13646 static int
13647 test_authenticated_decrypt_with_esn(
13648                 struct crypto_testsuite_params *ts_params,
13649                 struct crypto_unittest_params *ut_params,
13650                 const struct test_crypto_vector *reference)
13651 {
13652         int retval;
13653
13654         uint8_t *ciphertext;
13655         uint8_t cipher_key[reference->cipher_key.len + 1];
13656         uint8_t auth_key[reference->auth_key.len + 1];
13657         struct rte_cryptodev_info dev_info;
13658
13659         rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
13660         uint64_t feat_flags = dev_info.feature_flags;
13661
13662         if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
13663                         (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
13664                 printf("Device doesn't support RAW data-path APIs.\n");
13665                 return TEST_SKIPPED;
13666         }
13667
13668         /* Verify the capabilities */
13669         struct rte_cryptodev_sym_capability_idx cap_idx;
13670         cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
13671         cap_idx.algo.auth = reference->auth_algo;
13672         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
13673                         &cap_idx) == NULL)
13674                 return TEST_SKIPPED;
13675         cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
13676         cap_idx.algo.cipher = reference->crypto_algo;
13677         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
13678                         &cap_idx) == NULL)
13679                 return TEST_SKIPPED;
13680
13681         /* Create session */
13682         memcpy(cipher_key, reference->cipher_key.data,
13683                         reference->cipher_key.len);
13684         memcpy(auth_key, reference->auth_key.data, reference->auth_key.len);
13685
13686         /* Setup Authentication Parameters */
13687         ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;
13688         ut_params->auth_xform.auth.op = RTE_CRYPTO_AUTH_OP_VERIFY;
13689         ut_params->auth_xform.auth.algo = reference->auth_algo;
13690         ut_params->auth_xform.auth.key.length = reference->auth_key.len;
13691         ut_params->auth_xform.auth.key.data = auth_key;
13692         ut_params->auth_xform.auth.digest_length = reference->digest.len;
13693         ut_params->auth_xform.next = &ut_params->cipher_xform;
13694
13695         /* Setup Cipher Parameters */
13696         ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
13697         ut_params->cipher_xform.next = NULL;
13698         ut_params->cipher_xform.cipher.algo = reference->crypto_algo;
13699         ut_params->cipher_xform.cipher.op = RTE_CRYPTO_CIPHER_OP_DECRYPT;
13700         ut_params->cipher_xform.cipher.key.data = cipher_key;
13701         ut_params->cipher_xform.cipher.key.length = reference->cipher_key.len;
13702         ut_params->cipher_xform.cipher.iv.offset = IV_OFFSET;
13703         ut_params->cipher_xform.cipher.iv.length = reference->iv.len;
13704
13705         /* Create Crypto session*/
13706         ut_params->sess = rte_cryptodev_sym_session_create(
13707                         ts_params->session_mpool);
13708         TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed");
13709
13710         retval = rte_cryptodev_sym_session_init(ts_params->valid_devs[0],
13711                                 ut_params->sess,
13712                                 &ut_params->auth_xform,
13713                                 ts_params->session_priv_mpool);
13714
13715         if (retval == -ENOTSUP)
13716                 return TEST_SKIPPED;
13717
13718         TEST_ASSERT_EQUAL(retval, 0, "Session init failed");
13719
13720         ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
13721         TEST_ASSERT_NOT_NULL(ut_params->ibuf,
13722                         "Failed to allocate input buffer in mempool");
13723
13724         /* clear mbuf payload */
13725         memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
13726                         rte_pktmbuf_tailroom(ut_params->ibuf));
13727
13728         ciphertext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
13729                         reference->ciphertext.len);
13730         TEST_ASSERT_NOT_NULL(ciphertext, "no room to append ciphertext");
13731         memcpy(ciphertext, reference->ciphertext.data,
13732                         reference->ciphertext.len);
13733
13734         /* Create operation */
13735         retval = create_cipher_auth_verify_operation(ts_params,
13736                         ut_params,
13737                         reference);
13738
13739         if (retval < 0)
13740                 return retval;
13741
13742         if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
13743                 process_cpu_crypt_auth_op(ts_params->valid_devs[0],
13744                         ut_params->op);
13745         else if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
13746                 process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
13747                                 ut_params->op, 1, 1, 0, 0);
13748         else
13749                 ut_params->op = process_crypto_request(ts_params->valid_devs[0],
13750                         ut_params->op);
13751
13752         TEST_ASSERT_NOT_NULL(ut_params->op, "failed crypto process");
13753         TEST_ASSERT_EQUAL(ut_params->op->status,
13754                         RTE_CRYPTO_OP_STATUS_SUCCESS,
13755                         "crypto op processing passed");
13756
13757         ut_params->obuf = ut_params->op->sym->m_src;
13758         TEST_ASSERT_NOT_NULL(ut_params->obuf, "failed to retrieve obuf");
13759
13760         return 0;
13761 }
13762
13763 static int
13764 create_aead_operation_SGL(enum rte_crypto_aead_operation op,
13765                 const struct aead_test_data *tdata,
13766                 void *digest_mem, uint64_t digest_phys)
13767 {
13768         struct crypto_testsuite_params *ts_params = &testsuite_params;
13769         struct crypto_unittest_params *ut_params = &unittest_params;
13770
13771         const unsigned int auth_tag_len = tdata->auth_tag.len;
13772         const unsigned int iv_len = tdata->iv.len;
13773         unsigned int aad_len = tdata->aad.len;
13774         unsigned int aad_len_pad = 0;
13775
13776         /* Generate Crypto op data structure */
13777         ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
13778                         RTE_CRYPTO_OP_TYPE_SYMMETRIC);
13779         TEST_ASSERT_NOT_NULL(ut_params->op,
13780                 "Failed to allocate symmetric crypto operation struct");
13781
13782         struct rte_crypto_sym_op *sym_op = ut_params->op->sym;
13783
13784         sym_op->aead.digest.data = digest_mem;
13785
13786         TEST_ASSERT_NOT_NULL(sym_op->aead.digest.data,
13787                         "no room to append digest");
13788
13789         sym_op->aead.digest.phys_addr = digest_phys;
13790
13791         if (op == RTE_CRYPTO_AEAD_OP_DECRYPT) {
13792                 rte_memcpy(sym_op->aead.digest.data, tdata->auth_tag.data,
13793                                 auth_tag_len);
13794                 debug_hexdump(stdout, "digest:",
13795                                 sym_op->aead.digest.data,
13796                                 auth_tag_len);
13797         }
13798
13799         /* Append aad data */
13800         if (tdata->algo == RTE_CRYPTO_AEAD_AES_CCM) {
13801                 uint8_t *iv_ptr = rte_crypto_op_ctod_offset(ut_params->op,
13802                                 uint8_t *, IV_OFFSET);
13803
13804                 /* Copy IV 1 byte after the IV pointer, according to the API */
13805                 rte_memcpy(iv_ptr + 1, tdata->iv.data, iv_len);
13806
13807                 aad_len = RTE_ALIGN_CEIL(aad_len + 18, 16);
13808
13809                 sym_op->aead.aad.data = (uint8_t *)rte_pktmbuf_prepend(
13810                                 ut_params->ibuf, aad_len);
13811                 TEST_ASSERT_NOT_NULL(sym_op->aead.aad.data,
13812                                 "no room to prepend aad");
13813                 sym_op->aead.aad.phys_addr = rte_pktmbuf_iova(
13814                                 ut_params->ibuf);
13815
13816                 memset(sym_op->aead.aad.data, 0, aad_len);
13817                 /* Copy AAD 18 bytes after the AAD pointer, according to the API */
13818                 rte_memcpy(sym_op->aead.aad.data, tdata->aad.data, aad_len);
13819
13820                 debug_hexdump(stdout, "iv:", iv_ptr, iv_len);
13821                 debug_hexdump(stdout, "aad:",
13822                                 sym_op->aead.aad.data, aad_len);
13823         } else {
13824                 uint8_t *iv_ptr = rte_crypto_op_ctod_offset(ut_params->op,
13825                                 uint8_t *, IV_OFFSET);
13826
13827                 rte_memcpy(iv_ptr, tdata->iv.data, iv_len);
13828
13829                 aad_len_pad = RTE_ALIGN_CEIL(aad_len, 16);
13830
13831                 sym_op->aead.aad.data = (uint8_t *)rte_pktmbuf_prepend(
13832                                 ut_params->ibuf, aad_len_pad);
13833                 TEST_ASSERT_NOT_NULL(sym_op->aead.aad.data,
13834                                 "no room to prepend aad");
13835                 sym_op->aead.aad.phys_addr = rte_pktmbuf_iova(
13836                                 ut_params->ibuf);
13837
13838                 memset(sym_op->aead.aad.data, 0, aad_len);
13839                 rte_memcpy(sym_op->aead.aad.data, tdata->aad.data, aad_len);
13840
13841                 debug_hexdump(stdout, "iv:", iv_ptr, iv_len);
13842                 debug_hexdump(stdout, "aad:",
13843                                 sym_op->aead.aad.data, aad_len);
13844         }
13845
13846         sym_op->aead.data.length = tdata->plaintext.len;
13847         sym_op->aead.data.offset = aad_len_pad;
13848
13849         return 0;
13850 }
13851
13852 #define SGL_MAX_NO      16
13853
13854 static int
13855 test_authenticated_encryption_SGL(const struct aead_test_data *tdata,
13856                 const int oop, uint32_t fragsz, uint32_t fragsz_oop)
13857 {
13858         struct crypto_testsuite_params *ts_params = &testsuite_params;
13859         struct crypto_unittest_params *ut_params = &unittest_params;
13860         struct rte_mbuf *buf, *buf_oop = NULL, *buf_last_oop = NULL;
13861         int retval;
13862         int to_trn = 0;
13863         int to_trn_tbl[SGL_MAX_NO];
13864         int segs = 1;
13865         unsigned int trn_data = 0;
13866         uint8_t *plaintext, *ciphertext, *auth_tag;
13867         struct rte_cryptodev_info dev_info;
13868
13869         /* Verify the capabilities */
13870         struct rte_cryptodev_sym_capability_idx cap_idx;
13871         cap_idx.type = RTE_CRYPTO_SYM_XFORM_AEAD;
13872         cap_idx.algo.aead = tdata->algo;
13873         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
13874                         &cap_idx) == NULL)
13875                 return TEST_SKIPPED;
13876
13877         /* OOP not supported with CPU crypto */
13878         if (oop && gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
13879                 return TEST_SKIPPED;
13880
13881         /* Detailed check for the particular SGL support flag */
13882         rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
13883         if (!oop) {
13884                 unsigned int sgl_in = fragsz < tdata->plaintext.len;
13885                 if (sgl_in && (!(dev_info.feature_flags &
13886                                 RTE_CRYPTODEV_FF_IN_PLACE_SGL)))
13887                         return TEST_SKIPPED;
13888
13889                 uint64_t feat_flags = dev_info.feature_flags;
13890
13891                 if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
13892                         (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
13893                         printf("Device doesn't support RAW data-path APIs.\n");
13894                         return TEST_SKIPPED;
13895                 }
13896         } else {
13897                 unsigned int sgl_in = fragsz < tdata->plaintext.len;
13898                 unsigned int sgl_out = (fragsz_oop ? fragsz_oop : fragsz) <
13899                                 tdata->plaintext.len;
13900                 /* Raw data path API does not support OOP */
13901                 if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
13902                         return TEST_SKIPPED;
13903                 if (sgl_in && !sgl_out) {
13904                         if (!(dev_info.feature_flags &
13905                                         RTE_CRYPTODEV_FF_OOP_SGL_IN_LB_OUT))
13906                                 return TEST_SKIPPED;
13907                 } else if (!sgl_in && sgl_out) {
13908                         if (!(dev_info.feature_flags &
13909                                         RTE_CRYPTODEV_FF_OOP_LB_IN_SGL_OUT))
13910                                 return TEST_SKIPPED;
13911                 } else if (sgl_in && sgl_out) {
13912                         if (!(dev_info.feature_flags &
13913                                         RTE_CRYPTODEV_FF_OOP_SGL_IN_SGL_OUT))
13914                                 return TEST_SKIPPED;
13915                 }
13916         }
13917
13918         if (fragsz > tdata->plaintext.len)
13919                 fragsz = tdata->plaintext.len;
13920
13921         uint16_t plaintext_len = fragsz;
13922         uint16_t frag_size_oop = fragsz_oop ? fragsz_oop : fragsz;
13923
13924         if (fragsz_oop > tdata->plaintext.len)
13925                 frag_size_oop = tdata->plaintext.len;
13926
13927         int ecx = 0;
13928         void *digest_mem = NULL;
13929
13930         uint32_t prepend_len = RTE_ALIGN_CEIL(tdata->aad.len, 16);
13931
13932         if (tdata->plaintext.len % fragsz != 0) {
13933                 if (tdata->plaintext.len / fragsz + 1 > SGL_MAX_NO)
13934                         return 1;
13935         }       else {
13936                 if (tdata->plaintext.len / fragsz > SGL_MAX_NO)
13937                         return 1;
13938         }
13939
13940         /*
13941          * For out-op-place we need to alloc another mbuf
13942          */
13943         if (oop) {
13944                 ut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
13945                 rte_pktmbuf_append(ut_params->obuf,
13946                                 frag_size_oop + prepend_len);
13947                 buf_oop = ut_params->obuf;
13948         }
13949
13950         /* Create AEAD session */
13951         retval = create_aead_session(ts_params->valid_devs[0],
13952                         tdata->algo,
13953                         RTE_CRYPTO_AEAD_OP_ENCRYPT,
13954                         tdata->key.data, tdata->key.len,
13955                         tdata->aad.len, tdata->auth_tag.len,
13956                         tdata->iv.len);
13957         if (retval < 0)
13958                 return retval;
13959
13960         ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
13961
13962         /* clear mbuf payload */
13963         memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
13964                         rte_pktmbuf_tailroom(ut_params->ibuf));
13965
13966         plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
13967                         plaintext_len);
13968
13969         memcpy(plaintext, tdata->plaintext.data, plaintext_len);
13970
13971         trn_data += plaintext_len;
13972
13973         buf = ut_params->ibuf;
13974
13975         /*
13976          * Loop until no more fragments
13977          */
13978
13979         while (trn_data < tdata->plaintext.len) {
13980                 ++segs;
13981                 to_trn = (tdata->plaintext.len - trn_data < fragsz) ?
13982                                 (tdata->plaintext.len - trn_data) : fragsz;
13983
13984                 to_trn_tbl[ecx++] = to_trn;
13985
13986                 buf->next = rte_pktmbuf_alloc(ts_params->mbuf_pool);
13987                 buf = buf->next;
13988
13989                 memset(rte_pktmbuf_mtod(buf, uint8_t *), 0,
13990                                 rte_pktmbuf_tailroom(buf));
13991
13992                 /* OOP */
13993                 if (oop && !fragsz_oop) {
13994                         buf_last_oop = buf_oop->next =
13995                                         rte_pktmbuf_alloc(ts_params->mbuf_pool);
13996                         buf_oop = buf_oop->next;
13997                         memset(rte_pktmbuf_mtod(buf_oop, uint8_t *),
13998                                         0, rte_pktmbuf_tailroom(buf_oop));
13999                         rte_pktmbuf_append(buf_oop, to_trn);
14000                 }
14001
14002                 plaintext = (uint8_t *)rte_pktmbuf_append(buf,
14003                                 to_trn);
14004
14005                 memcpy(plaintext, tdata->plaintext.data + trn_data,
14006                                 to_trn);
14007                 trn_data += to_trn;
14008                 if (trn_data  == tdata->plaintext.len) {
14009                         if (oop) {
14010                                 if (!fragsz_oop)
14011                                         digest_mem = rte_pktmbuf_append(buf_oop,
14012                                                 tdata->auth_tag.len);
14013                         } else
14014                                 digest_mem = (uint8_t *)rte_pktmbuf_append(buf,
14015                                         tdata->auth_tag.len);
14016                 }
14017         }
14018
14019         uint64_t digest_phys = 0;
14020
14021         ut_params->ibuf->nb_segs = segs;
14022
14023         segs = 1;
14024         if (fragsz_oop && oop) {
14025                 to_trn = 0;
14026                 ecx = 0;
14027
14028                 if (frag_size_oop == tdata->plaintext.len) {
14029                         digest_mem = rte_pktmbuf_append(ut_params->obuf,
14030                                 tdata->auth_tag.len);
14031
14032                         digest_phys = rte_pktmbuf_iova_offset(
14033                                         ut_params->obuf,
14034                                         tdata->plaintext.len + prepend_len);
14035                 }
14036
14037                 trn_data = frag_size_oop;
14038                 while (trn_data < tdata->plaintext.len) {
14039                         ++segs;
14040                         to_trn =
14041                                 (tdata->plaintext.len - trn_data <
14042                                                 frag_size_oop) ?
14043                                 (tdata->plaintext.len - trn_data) :
14044                                                 frag_size_oop;
14045
14046                         to_trn_tbl[ecx++] = to_trn;
14047
14048                         buf_last_oop = buf_oop->next =
14049                                         rte_pktmbuf_alloc(ts_params->mbuf_pool);
14050                         buf_oop = buf_oop->next;
14051                         memset(rte_pktmbuf_mtod(buf_oop, uint8_t *),
14052                                         0, rte_pktmbuf_tailroom(buf_oop));
14053                         rte_pktmbuf_append(buf_oop, to_trn);
14054
14055                         trn_data += to_trn;
14056
14057                         if (trn_data  == tdata->plaintext.len) {
14058                                 digest_mem = rte_pktmbuf_append(buf_oop,
14059                                         tdata->auth_tag.len);
14060                         }
14061                 }
14062
14063                 ut_params->obuf->nb_segs = segs;
14064         }
14065
14066         /*
14067          * Place digest at the end of the last buffer
14068          */
14069         if (!digest_phys)
14070                 digest_phys = rte_pktmbuf_iova(buf) + to_trn;
14071         if (oop && buf_last_oop)
14072                 digest_phys = rte_pktmbuf_iova(buf_last_oop) + to_trn;
14073
14074         if (!digest_mem && !oop) {
14075                 digest_mem = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
14076                                 + tdata->auth_tag.len);
14077                 digest_phys = rte_pktmbuf_iova_offset(ut_params->ibuf,
14078                                 tdata->plaintext.len);
14079         }
14080
14081         /* Create AEAD operation */
14082         retval = create_aead_operation_SGL(RTE_CRYPTO_AEAD_OP_ENCRYPT,
14083                         tdata, digest_mem, digest_phys);
14084
14085         if (retval < 0)
14086                 return retval;
14087
14088         rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
14089
14090         ut_params->op->sym->m_src = ut_params->ibuf;
14091         if (oop)
14092                 ut_params->op->sym->m_dst = ut_params->obuf;
14093
14094         /* Process crypto operation */
14095         if (oop == IN_PLACE &&
14096                         gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
14097                 process_cpu_aead_op(ts_params->valid_devs[0], ut_params->op);
14098         else if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
14099                 process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
14100                                 ut_params->op, 0, 0, 0, 0);
14101         else
14102                 TEST_ASSERT_NOT_NULL(
14103                         process_crypto_request(ts_params->valid_devs[0],
14104                         ut_params->op), "failed to process sym crypto op");
14105
14106         TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
14107                         "crypto op processing failed");
14108
14109
14110         ciphertext = rte_pktmbuf_mtod_offset(ut_params->op->sym->m_src,
14111                         uint8_t *, prepend_len);
14112         if (oop) {
14113                 ciphertext = rte_pktmbuf_mtod_offset(ut_params->op->sym->m_dst,
14114                                 uint8_t *, prepend_len);
14115         }
14116
14117         if (fragsz_oop)
14118                 fragsz = fragsz_oop;
14119
14120         TEST_ASSERT_BUFFERS_ARE_EQUAL(
14121                         ciphertext,
14122                         tdata->ciphertext.data,
14123                         fragsz,
14124                         "Ciphertext data not as expected");
14125
14126         buf = ut_params->op->sym->m_src->next;
14127         if (oop)
14128                 buf = ut_params->op->sym->m_dst->next;
14129
14130         unsigned int off = fragsz;
14131
14132         ecx = 0;
14133         while (buf) {
14134                 ciphertext = rte_pktmbuf_mtod(buf,
14135                                 uint8_t *);
14136
14137                 TEST_ASSERT_BUFFERS_ARE_EQUAL(
14138                                 ciphertext,
14139                                 tdata->ciphertext.data + off,
14140                                 to_trn_tbl[ecx],
14141                                 "Ciphertext data not as expected");
14142
14143                 off += to_trn_tbl[ecx++];
14144                 buf = buf->next;
14145         }
14146
14147         auth_tag = digest_mem;
14148         TEST_ASSERT_BUFFERS_ARE_EQUAL(
14149                         auth_tag,
14150                         tdata->auth_tag.data,
14151                         tdata->auth_tag.len,
14152                         "Generated auth tag not as expected");
14153
14154         return 0;
14155 }
14156
14157 static int
14158 test_AES_GCM_auth_encrypt_SGL_out_of_place_400B_400B(void)
14159 {
14160         return test_authenticated_encryption_SGL(
14161                         &gcm_test_case_SGL_1, OUT_OF_PLACE, 400, 400);
14162 }
14163
14164 static int
14165 test_AES_GCM_auth_encrypt_SGL_out_of_place_1500B_2000B(void)
14166 {
14167         return test_authenticated_encryption_SGL(
14168                         &gcm_test_case_SGL_1, OUT_OF_PLACE, 1500, 2000);
14169 }
14170
14171 static int
14172 test_AES_GCM_auth_encrypt_SGL_out_of_place_400B_1seg(void)
14173 {
14174         return test_authenticated_encryption_SGL(
14175                         &gcm_test_case_8, OUT_OF_PLACE, 400,
14176                         gcm_test_case_8.plaintext.len);
14177 }
14178
14179 static int
14180 test_AES_GCM_auth_encrypt_SGL_in_place_1500B(void)
14181 {
14182         /* This test is not for OPENSSL PMD */
14183         if (gbl_driver_id == rte_cryptodev_driver_id_get(
14184                         RTE_STR(CRYPTODEV_NAME_OPENSSL_PMD)))
14185                 return TEST_SKIPPED;
14186
14187         return test_authenticated_encryption_SGL(
14188                         &gcm_test_case_SGL_1, IN_PLACE, 1500, 0);
14189 }
14190
14191 static int
14192 test_authentication_verify_fail_when_data_corrupted(
14193                 struct crypto_testsuite_params *ts_params,
14194                 struct crypto_unittest_params *ut_params,
14195                 const struct test_crypto_vector *reference)
14196 {
14197         return test_authentication_verify_fail_when_data_corruption(
14198                         ts_params, ut_params, reference, 1);
14199 }
14200
14201 static int
14202 test_authentication_verify_fail_when_tag_corrupted(
14203                 struct crypto_testsuite_params *ts_params,
14204                 struct crypto_unittest_params *ut_params,
14205                 const struct test_crypto_vector *reference)
14206 {
14207         return test_authentication_verify_fail_when_data_corruption(
14208                         ts_params, ut_params, reference, 0);
14209 }
14210
14211 static int
14212 test_authentication_verify_GMAC_fail_when_data_corrupted(
14213                 struct crypto_testsuite_params *ts_params,
14214                 struct crypto_unittest_params *ut_params,
14215                 const struct test_crypto_vector *reference)
14216 {
14217         return test_authentication_verify_GMAC_fail_when_corruption(
14218                         ts_params, ut_params, reference, 1);
14219 }
14220
14221 static int
14222 test_authentication_verify_GMAC_fail_when_tag_corrupted(
14223                 struct crypto_testsuite_params *ts_params,
14224                 struct crypto_unittest_params *ut_params,
14225                 const struct test_crypto_vector *reference)
14226 {
14227         return test_authentication_verify_GMAC_fail_when_corruption(
14228                         ts_params, ut_params, reference, 0);
14229 }
14230
14231 static int
14232 test_authenticated_decryption_fail_when_data_corrupted(
14233                 struct crypto_testsuite_params *ts_params,
14234                 struct crypto_unittest_params *ut_params,
14235                 const struct test_crypto_vector *reference)
14236 {
14237         return test_authenticated_decryption_fail_when_corruption(
14238                         ts_params, ut_params, reference, 1);
14239 }
14240
14241 static int
14242 test_authenticated_decryption_fail_when_tag_corrupted(
14243                 struct crypto_testsuite_params *ts_params,
14244                 struct crypto_unittest_params *ut_params,
14245                 const struct test_crypto_vector *reference)
14246 {
14247         return test_authenticated_decryption_fail_when_corruption(
14248                         ts_params, ut_params, reference, 0);
14249 }
14250
14251 static int
14252 authentication_verify_HMAC_SHA1_fail_data_corrupt(void)
14253 {
14254         return test_authentication_verify_fail_when_data_corrupted(
14255                         &testsuite_params, &unittest_params,
14256                         &hmac_sha1_test_crypto_vector);
14257 }
14258
14259 static int
14260 authentication_verify_HMAC_SHA1_fail_tag_corrupt(void)
14261 {
14262         return test_authentication_verify_fail_when_tag_corrupted(
14263                         &testsuite_params, &unittest_params,
14264                         &hmac_sha1_test_crypto_vector);
14265 }
14266
14267 static int
14268 authentication_verify_AES128_GMAC_fail_data_corrupt(void)
14269 {
14270         return test_authentication_verify_GMAC_fail_when_data_corrupted(
14271                         &testsuite_params, &unittest_params,
14272                         &aes128_gmac_test_vector);
14273 }
14274
14275 static int
14276 authentication_verify_AES128_GMAC_fail_tag_corrupt(void)
14277 {
14278         return test_authentication_verify_GMAC_fail_when_tag_corrupted(
14279                         &testsuite_params, &unittest_params,
14280                         &aes128_gmac_test_vector);
14281 }
14282
14283 static int
14284 auth_decryption_AES128CBC_HMAC_SHA1_fail_data_corrupt(void)
14285 {
14286         return test_authenticated_decryption_fail_when_data_corrupted(
14287                         &testsuite_params,
14288                         &unittest_params,
14289                         &aes128cbc_hmac_sha1_test_vector);
14290 }
14291
14292 static int
14293 auth_decryption_AES128CBC_HMAC_SHA1_fail_tag_corrupt(void)
14294 {
14295         return test_authenticated_decryption_fail_when_tag_corrupted(
14296                         &testsuite_params,
14297                         &unittest_params,
14298                         &aes128cbc_hmac_sha1_test_vector);
14299 }
14300
14301 static int
14302 auth_encrypt_AES128CBC_HMAC_SHA1_esn_check(void)
14303 {
14304         return test_authenticated_encrypt_with_esn(
14305                         &testsuite_params,
14306                         &unittest_params,
14307                         &aes128cbc_hmac_sha1_aad_test_vector);
14308 }
14309
14310 static int
14311 auth_decrypt_AES128CBC_HMAC_SHA1_esn_check(void)
14312 {
14313         return test_authenticated_decrypt_with_esn(
14314                         &testsuite_params,
14315                         &unittest_params,
14316                         &aes128cbc_hmac_sha1_aad_test_vector);
14317 }
14318
14319 static int
14320 test_chacha20_poly1305_encrypt_test_case_rfc8439(void)
14321 {
14322         return test_authenticated_encryption(&chacha20_poly1305_case_rfc8439);
14323 }
14324
14325 static int
14326 test_chacha20_poly1305_decrypt_test_case_rfc8439(void)
14327 {
14328         return test_authenticated_decryption(&chacha20_poly1305_case_rfc8439);
14329 }
14330
14331 static int
14332 test_chacha20_poly1305_encrypt_SGL_out_of_place(void)
14333 {
14334         return test_authenticated_encryption_SGL(
14335                 &chacha20_poly1305_case_2, OUT_OF_PLACE, 32,
14336                 chacha20_poly1305_case_2.plaintext.len);
14337 }
14338
14339 #ifdef RTE_CRYPTO_SCHEDULER
14340
14341 /* global AESNI worker IDs for the scheduler test */
14342 uint8_t aesni_ids[2];
14343
14344 static int
14345 scheduler_testsuite_setup(void)
14346 {
14347         uint32_t i = 0;
14348         int32_t nb_devs, ret;
14349         char vdev_args[VDEV_ARGS_SIZE] = {""};
14350         char temp_str[VDEV_ARGS_SIZE] = {"mode=multi-core,"
14351                 "ordering=enable,name=cryptodev_test_scheduler,corelist="};
14352         uint16_t worker_core_count = 0;
14353         uint16_t socket_id = 0;
14354
14355         if (gbl_driver_id == rte_cryptodev_driver_id_get(
14356                         RTE_STR(CRYPTODEV_NAME_SCHEDULER_PMD))) {
14357
14358                 /* Identify the Worker Cores
14359                  * Use 2 worker cores for the device args
14360                  */
14361                 RTE_LCORE_FOREACH_WORKER(i) {
14362                         if (worker_core_count > 1)
14363                                 break;
14364                         snprintf(vdev_args, sizeof(vdev_args),
14365                                         "%s%d", temp_str, i);
14366                         strcpy(temp_str, vdev_args);
14367                         strlcat(temp_str, ";", sizeof(temp_str));
14368                         worker_core_count++;
14369                         socket_id = rte_lcore_to_socket_id(i);
14370                 }
14371                 if (worker_core_count != 2) {
14372                         RTE_LOG(ERR, USER1,
14373                                 "Cryptodev scheduler test require at least "
14374                                 "two worker cores to run. "
14375                                 "Please use the correct coremask.\n");
14376                         return TEST_FAILED;
14377                 }
14378                 strcpy(temp_str, vdev_args);
14379                 snprintf(vdev_args, sizeof(vdev_args), "%s,socket_id=%d",
14380                                 temp_str, socket_id);
14381                 RTE_LOG(DEBUG, USER1, "vdev_args: %s\n", vdev_args);
14382                 nb_devs = rte_cryptodev_device_count_by_driver(
14383                                 rte_cryptodev_driver_id_get(
14384                                 RTE_STR(CRYPTODEV_NAME_SCHEDULER_PMD)));
14385                 if (nb_devs < 1) {
14386                         ret = rte_vdev_init(
14387                                 RTE_STR(CRYPTODEV_NAME_SCHEDULER_PMD),
14388                                         vdev_args);
14389                         TEST_ASSERT(ret == 0,
14390                                 "Failed to create instance %u of pmd : %s",
14391                                 i, RTE_STR(CRYPTODEV_NAME_SCHEDULER_PMD));
14392                 }
14393         }
14394         return testsuite_setup();
14395 }
14396
14397 static int
14398 test_scheduler_attach_worker_op(void)
14399 {
14400         struct crypto_testsuite_params *ts_params = &testsuite_params;
14401         uint8_t sched_id = ts_params->valid_devs[0];
14402         uint32_t i, nb_devs_attached = 0;
14403         int ret;
14404         char vdev_name[32];
14405         unsigned int count = rte_cryptodev_count();
14406
14407         /* create 2 AESNI_MB vdevs on top of existing devices */
14408         for (i = count; i < count + 2; i++) {
14409                 snprintf(vdev_name, sizeof(vdev_name), "%s_%u",
14410                                 RTE_STR(CRYPTODEV_NAME_AESNI_MB_PMD),
14411                                 i);
14412                 ret = rte_vdev_init(vdev_name, NULL);
14413
14414                 TEST_ASSERT(ret == 0,
14415                         "Failed to create instance %u of"
14416                         " pmd : %s",
14417                         i, RTE_STR(CRYPTODEV_NAME_AESNI_MB_PMD));
14418
14419                 if (ret < 0) {
14420                         RTE_LOG(ERR, USER1,
14421                                 "Failed to create 2 AESNI MB PMDs.\n");
14422                         return TEST_SKIPPED;
14423                 }
14424         }
14425
14426         /* attach 2 AESNI_MB cdevs */
14427         for (i = count; i < count + 2; i++) {
14428                 struct rte_cryptodev_info info;
14429                 unsigned int session_size;
14430
14431                 rte_cryptodev_info_get(i, &info);
14432                 if (info.driver_id != rte_cryptodev_driver_id_get(
14433                                 RTE_STR(CRYPTODEV_NAME_AESNI_MB_PMD)))
14434                         continue;
14435
14436                 session_size = rte_cryptodev_sym_get_private_session_size(i);
14437                 /*
14438                  * Create the session mempool again, since now there are new devices
14439                  * to use the mempool.
14440                  */
14441                 if (ts_params->session_mpool) {
14442                         rte_mempool_free(ts_params->session_mpool);
14443                         ts_params->session_mpool = NULL;
14444                 }
14445                 if (ts_params->session_priv_mpool) {
14446                         rte_mempool_free(ts_params->session_priv_mpool);
14447                         ts_params->session_priv_mpool = NULL;
14448                 }
14449
14450                 if (info.sym.max_nb_sessions != 0 &&
14451                                 info.sym.max_nb_sessions < MAX_NB_SESSIONS) {
14452                         RTE_LOG(ERR, USER1,
14453                                         "Device does not support "
14454                                         "at least %u sessions\n",
14455                                         MAX_NB_SESSIONS);
14456                         return TEST_FAILED;
14457                 }
14458                 /*
14459                  * Create mempool with maximum number of sessions,
14460                  * to include the session headers
14461                  */
14462                 if (ts_params->session_mpool == NULL) {
14463                         ts_params->session_mpool =
14464                                 rte_cryptodev_sym_session_pool_create(
14465                                                 "test_sess_mp",
14466                                                 MAX_NB_SESSIONS, 0, 0, 0,
14467                                                 SOCKET_ID_ANY);
14468                         TEST_ASSERT_NOT_NULL(ts_params->session_mpool,
14469                                         "session mempool allocation failed");
14470                 }
14471
14472                 /*
14473                  * Create mempool with maximum number of sessions,
14474                  * to include device specific session private data
14475                  */
14476                 if (ts_params->session_priv_mpool == NULL) {
14477                         ts_params->session_priv_mpool = rte_mempool_create(
14478                                         "test_sess_mp_priv",
14479                                         MAX_NB_SESSIONS,
14480                                         session_size,
14481                                         0, 0, NULL, NULL, NULL,
14482                                         NULL, SOCKET_ID_ANY,
14483                                         0);
14484
14485                         TEST_ASSERT_NOT_NULL(ts_params->session_priv_mpool,
14486                                         "session mempool allocation failed");
14487                 }
14488
14489                 ts_params->qp_conf.mp_session = ts_params->session_mpool;
14490                 ts_params->qp_conf.mp_session_private =
14491                                 ts_params->session_priv_mpool;
14492
14493                 ret = rte_cryptodev_scheduler_worker_attach(sched_id,
14494                                 (uint8_t)i);
14495
14496                 TEST_ASSERT(ret == 0,
14497                         "Failed to attach device %u of pmd : %s", i,
14498                         RTE_STR(CRYPTODEV_NAME_AESNI_MB_PMD));
14499
14500                 aesni_ids[nb_devs_attached] = (uint8_t)i;
14501
14502                 nb_devs_attached++;
14503         }
14504
14505         return 0;
14506 }
14507
14508 static int
14509 test_scheduler_detach_worker_op(void)
14510 {
14511         struct crypto_testsuite_params *ts_params = &testsuite_params;
14512         uint8_t sched_id = ts_params->valid_devs[0];
14513         uint32_t i;
14514         int ret;
14515
14516         for (i = 0; i < 2; i++) {
14517                 ret = rte_cryptodev_scheduler_worker_detach(sched_id,
14518                                 aesni_ids[i]);
14519                 TEST_ASSERT(ret == 0,
14520                         "Failed to detach device %u", aesni_ids[i]);
14521         }
14522
14523         return 0;
14524 }
14525
14526 static int
14527 test_scheduler_mode_op(enum rte_cryptodev_scheduler_mode scheduler_mode)
14528 {
14529         struct crypto_testsuite_params *ts_params = &testsuite_params;
14530         uint8_t sched_id = ts_params->valid_devs[0];
14531         /* set mode */
14532         return rte_cryptodev_scheduler_mode_set(sched_id,
14533                 scheduler_mode);
14534 }
14535
14536 static int
14537 test_scheduler_mode_roundrobin_op(void)
14538 {
14539         TEST_ASSERT(test_scheduler_mode_op(CDEV_SCHED_MODE_ROUNDROBIN) ==
14540                         0, "Failed to set roundrobin mode");
14541         return 0;
14542
14543 }
14544
14545 static int
14546 test_scheduler_mode_multicore_op(void)
14547 {
14548         TEST_ASSERT(test_scheduler_mode_op(CDEV_SCHED_MODE_MULTICORE) ==
14549                         0, "Failed to set multicore mode");
14550
14551         return 0;
14552 }
14553
14554 static int
14555 test_scheduler_mode_failover_op(void)
14556 {
14557         TEST_ASSERT(test_scheduler_mode_op(CDEV_SCHED_MODE_FAILOVER) ==
14558                         0, "Failed to set failover mode");
14559
14560         return 0;
14561 }
14562
14563 static int
14564 test_scheduler_mode_pkt_size_distr_op(void)
14565 {
14566         TEST_ASSERT(test_scheduler_mode_op(CDEV_SCHED_MODE_PKT_SIZE_DISTR) ==
14567                         0, "Failed to set pktsize mode");
14568
14569         return 0;
14570 }
14571
14572 static int
14573 scheduler_multicore_testsuite_setup(void)
14574 {
14575         if (test_scheduler_attach_worker_op() < 0)
14576                 return TEST_SKIPPED;
14577         if (test_scheduler_mode_op(CDEV_SCHED_MODE_MULTICORE) < 0)
14578                 return TEST_SKIPPED;
14579         return 0;
14580 }
14581
14582 static int
14583 scheduler_roundrobin_testsuite_setup(void)
14584 {
14585         if (test_scheduler_attach_worker_op() < 0)
14586                 return TEST_SKIPPED;
14587         if (test_scheduler_mode_op(CDEV_SCHED_MODE_ROUNDROBIN) < 0)
14588                 return TEST_SKIPPED;
14589         return 0;
14590 }
14591
14592 static int
14593 scheduler_failover_testsuite_setup(void)
14594 {
14595         if (test_scheduler_attach_worker_op() < 0)
14596                 return TEST_SKIPPED;
14597         if (test_scheduler_mode_op(CDEV_SCHED_MODE_FAILOVER) < 0)
14598                 return TEST_SKIPPED;
14599         return 0;
14600 }
14601
14602 static int
14603 scheduler_pkt_size_distr_testsuite_setup(void)
14604 {
14605         if (test_scheduler_attach_worker_op() < 0)
14606                 return TEST_SKIPPED;
14607         if (test_scheduler_mode_op(CDEV_SCHED_MODE_PKT_SIZE_DISTR) < 0)
14608                 return TEST_SKIPPED;
14609         return 0;
14610 }
14611
14612 static void
14613 scheduler_mode_testsuite_teardown(void)
14614 {
14615         test_scheduler_detach_worker_op();
14616 }
14617
14618 #endif /* RTE_CRYPTO_SCHEDULER */
14619
14620 static struct unit_test_suite end_testsuite = {
14621         .suite_name = NULL,
14622         .setup = NULL,
14623         .teardown = NULL,
14624         .unit_test_suites = NULL
14625 };
14626
14627 #ifdef RTE_LIB_SECURITY
14628 static struct unit_test_suite ipsec_proto_testsuite  = {
14629         .suite_name = "IPsec Proto Unit Test Suite",
14630         .setup = ipsec_proto_testsuite_setup,
14631         .unit_test_cases = {
14632                 TEST_CASE_NAMED_WITH_DATA(
14633                         "Outbound known vector (ESP tunnel mode IPv4 AES-GCM 128)",
14634                         ut_setup_security, ut_teardown,
14635                         test_ipsec_proto_known_vec, &pkt_aes_128_gcm),
14636                 TEST_CASE_NAMED_WITH_DATA(
14637                         "Outbound known vector (ESP tunnel mode IPv4 AES-GCM 192)",
14638                         ut_setup_security, ut_teardown,
14639                         test_ipsec_proto_known_vec, &pkt_aes_192_gcm),
14640                 TEST_CASE_NAMED_WITH_DATA(
14641                         "Outbound known vector (ESP tunnel mode IPv4 AES-GCM 256)",
14642                         ut_setup_security, ut_teardown,
14643                         test_ipsec_proto_known_vec, &pkt_aes_256_gcm),
14644                 TEST_CASE_NAMED_WITH_DATA(
14645                         "Outbound known vector (ESP tunnel mode IPv4 AES-CBC 128 HMAC-SHA256 [16B ICV])",
14646                         ut_setup_security, ut_teardown,
14647                         test_ipsec_proto_known_vec,
14648                         &pkt_aes_128_cbc_hmac_sha256),
14649                 TEST_CASE_NAMED_WITH_DATA(
14650                         "Outbound known vector (ESP tunnel mode IPv4 AES-CBC 128 HMAC-SHA384 [24B ICV])",
14651                         ut_setup_security, ut_teardown,
14652                         test_ipsec_proto_known_vec,
14653                         &pkt_aes_128_cbc_hmac_sha384),
14654                 TEST_CASE_NAMED_WITH_DATA(
14655                         "Outbound known vector (ESP tunnel mode IPv4 AES-CBC 128 HMAC-SHA512 [32B ICV])",
14656                         ut_setup_security, ut_teardown,
14657                         test_ipsec_proto_known_vec,
14658                         &pkt_aes_128_cbc_hmac_sha512),
14659                 TEST_CASE_NAMED_WITH_DATA(
14660                         "Outbound known vector (ESP tunnel mode IPv6 AES-GCM 128)",
14661                         ut_setup_security, ut_teardown,
14662                         test_ipsec_proto_known_vec, &pkt_aes_256_gcm_v6),
14663                 TEST_CASE_NAMED_WITH_DATA(
14664                         "Outbound known vector (ESP tunnel mode IPv6 AES-CBC 128 HMAC-SHA256 [16B ICV])",
14665                         ut_setup_security, ut_teardown,
14666                         test_ipsec_proto_known_vec,
14667                         &pkt_aes_128_cbc_hmac_sha256_v6),
14668                 TEST_CASE_NAMED_WITH_DATA(
14669                         "Outbound known vector (ESP tunnel mode IPv4 NULL AES-XCBC-MAC [12B ICV])",
14670                         ut_setup_security, ut_teardown,
14671                         test_ipsec_proto_known_vec,
14672                         &pkt_null_aes_xcbc),
14673                 TEST_CASE_NAMED_WITH_DATA(
14674                         "Outbound fragmented packet",
14675                         ut_setup_security, ut_teardown,
14676                         test_ipsec_proto_known_vec_fragmented,
14677                         &pkt_aes_128_gcm_frag),
14678                 TEST_CASE_NAMED_WITH_DATA(
14679                         "Inbound known vector (ESP tunnel mode IPv4 AES-GCM 128)",
14680                         ut_setup_security, ut_teardown,
14681                         test_ipsec_proto_known_vec_inb, &pkt_aes_128_gcm),
14682                 TEST_CASE_NAMED_WITH_DATA(
14683                         "Inbound known vector (ESP tunnel mode IPv4 AES-GCM 192)",
14684                         ut_setup_security, ut_teardown,
14685                         test_ipsec_proto_known_vec_inb, &pkt_aes_192_gcm),
14686                 TEST_CASE_NAMED_WITH_DATA(
14687                         "Inbound known vector (ESP tunnel mode IPv4 AES-GCM 256)",
14688                         ut_setup_security, ut_teardown,
14689                         test_ipsec_proto_known_vec_inb, &pkt_aes_256_gcm),
14690                 TEST_CASE_NAMED_WITH_DATA(
14691                         "Inbound known vector (ESP tunnel mode IPv4 AES-CBC 128)",
14692                         ut_setup_security, ut_teardown,
14693                         test_ipsec_proto_known_vec_inb, &pkt_aes_128_cbc_null),
14694                 TEST_CASE_NAMED_WITH_DATA(
14695                         "Inbound known vector (ESP tunnel mode IPv4 AES-CBC 128 HMAC-SHA256 [16B ICV])",
14696                         ut_setup_security, ut_teardown,
14697                         test_ipsec_proto_known_vec_inb,
14698                         &pkt_aes_128_cbc_hmac_sha256),
14699                 TEST_CASE_NAMED_WITH_DATA(
14700                         "Inbound known vector (ESP tunnel mode IPv4 AES-CBC 128 HMAC-SHA384 [24B ICV])",
14701                         ut_setup_security, ut_teardown,
14702                         test_ipsec_proto_known_vec_inb,
14703                         &pkt_aes_128_cbc_hmac_sha384),
14704                 TEST_CASE_NAMED_WITH_DATA(
14705                         "Inbound known vector (ESP tunnel mode IPv4 AES-CBC 128 HMAC-SHA512 [32B ICV])",
14706                         ut_setup_security, ut_teardown,
14707                         test_ipsec_proto_known_vec_inb,
14708                         &pkt_aes_128_cbc_hmac_sha512),
14709                 TEST_CASE_NAMED_WITH_DATA(
14710                         "Inbound known vector (ESP tunnel mode IPv6 AES-GCM 128)",
14711                         ut_setup_security, ut_teardown,
14712                         test_ipsec_proto_known_vec_inb, &pkt_aes_256_gcm_v6),
14713                 TEST_CASE_NAMED_WITH_DATA(
14714                         "Inbound known vector (ESP tunnel mode IPv6 AES-CBC 128 HMAC-SHA256 [16B ICV])",
14715                         ut_setup_security, ut_teardown,
14716                         test_ipsec_proto_known_vec_inb,
14717                         &pkt_aes_128_cbc_hmac_sha256_v6),
14718                 TEST_CASE_NAMED_WITH_DATA(
14719                         "Inbound known vector (ESP tunnel mode IPv4 NULL AES-XCBC-MAC [12B ICV])",
14720                         ut_setup_security, ut_teardown,
14721                         test_ipsec_proto_known_vec_inb,
14722                         &pkt_null_aes_xcbc),
14723                 TEST_CASE_NAMED_ST(
14724                         "Combined test alg list",
14725                         ut_setup_security, ut_teardown,
14726                         test_ipsec_proto_display_list),
14727                 TEST_CASE_NAMED_ST(
14728                         "IV generation",
14729                         ut_setup_security, ut_teardown,
14730                         test_ipsec_proto_iv_gen),
14731                 TEST_CASE_NAMED_ST(
14732                         "UDP encapsulation",
14733                         ut_setup_security, ut_teardown,
14734                         test_ipsec_proto_udp_encap),
14735                 TEST_CASE_NAMED_ST(
14736                         "UDP encapsulation ports verification test",
14737                         ut_setup_security, ut_teardown,
14738                         test_ipsec_proto_udp_ports_verify),
14739                 TEST_CASE_NAMED_ST(
14740                         "SA expiry packets soft",
14741                         ut_setup_security, ut_teardown,
14742                         test_ipsec_proto_sa_exp_pkts_soft),
14743                 TEST_CASE_NAMED_ST(
14744                         "SA expiry packets hard",
14745                         ut_setup_security, ut_teardown,
14746                         test_ipsec_proto_sa_exp_pkts_hard),
14747                 TEST_CASE_NAMED_ST(
14748                         "Negative test: ICV corruption",
14749                         ut_setup_security, ut_teardown,
14750                         test_ipsec_proto_err_icv_corrupt),
14751                 TEST_CASE_NAMED_ST(
14752                         "Tunnel dst addr verification",
14753                         ut_setup_security, ut_teardown,
14754                         test_ipsec_proto_tunnel_dst_addr_verify),
14755                 TEST_CASE_NAMED_ST(
14756                         "Tunnel src and dst addr verification",
14757                         ut_setup_security, ut_teardown,
14758                         test_ipsec_proto_tunnel_src_dst_addr_verify),
14759                 TEST_CASE_NAMED_ST(
14760                         "Inner IP checksum",
14761                         ut_setup_security, ut_teardown,
14762                         test_ipsec_proto_inner_ip_csum),
14763                 TEST_CASE_NAMED_ST(
14764                         "Inner L4 checksum",
14765                         ut_setup_security, ut_teardown,
14766                         test_ipsec_proto_inner_l4_csum),
14767                 TEST_CASE_NAMED_ST(
14768                         "Tunnel IPv4 in IPv4",
14769                         ut_setup_security, ut_teardown,
14770                         test_ipsec_proto_tunnel_v4_in_v4),
14771                 TEST_CASE_NAMED_ST(
14772                         "Tunnel IPv6 in IPv6",
14773                         ut_setup_security, ut_teardown,
14774                         test_ipsec_proto_tunnel_v6_in_v6),
14775                 TEST_CASE_NAMED_ST(
14776                         "Tunnel IPv4 in IPv6",
14777                         ut_setup_security, ut_teardown,
14778                         test_ipsec_proto_tunnel_v4_in_v6),
14779                 TEST_CASE_NAMED_ST(
14780                         "Tunnel IPv6 in IPv4",
14781                         ut_setup_security, ut_teardown,
14782                         test_ipsec_proto_tunnel_v6_in_v4),
14783                 TEST_CASE_NAMED_ST(
14784                         "Transport IPv4",
14785                         ut_setup_security, ut_teardown,
14786                         test_ipsec_proto_transport_v4),
14787                 TEST_CASE_NAMED_ST(
14788                         "Statistics: success",
14789                         ut_setup_security, ut_teardown,
14790                         test_ipsec_proto_stats),
14791                 TEST_CASE_NAMED_ST(
14792                         "Fragmented packet",
14793                         ut_setup_security, ut_teardown,
14794                         test_ipsec_proto_pkt_fragment),
14795                 TEST_CASE_NAMED_ST(
14796                         "Tunnel header copy DF (inner 0)",
14797                         ut_setup_security, ut_teardown,
14798                         test_ipsec_proto_copy_df_inner_0),
14799                 TEST_CASE_NAMED_ST(
14800                         "Tunnel header copy DF (inner 1)",
14801                         ut_setup_security, ut_teardown,
14802                         test_ipsec_proto_copy_df_inner_1),
14803                 TEST_CASE_NAMED_ST(
14804                         "Tunnel header set DF 0 (inner 1)",
14805                         ut_setup_security, ut_teardown,
14806                         test_ipsec_proto_set_df_0_inner_1),
14807                 TEST_CASE_NAMED_ST(
14808                         "Tunnel header set DF 1 (inner 0)",
14809                         ut_setup_security, ut_teardown,
14810                         test_ipsec_proto_set_df_1_inner_0),
14811                 TEST_CASES_END() /**< NULL terminate unit test array */
14812         }
14813 };
14814
14815 static struct unit_test_suite pdcp_proto_testsuite  = {
14816         .suite_name = "PDCP Proto Unit Test Suite",
14817         .setup = pdcp_proto_testsuite_setup,
14818         .unit_test_cases = {
14819                 TEST_CASE_ST(ut_setup_security, ut_teardown,
14820                         test_PDCP_PROTO_all),
14821                 TEST_CASES_END() /**< NULL terminate unit test array */
14822         }
14823 };
14824
14825 #define ADD_UPLINK_TESTCASE(data)                                               \
14826         TEST_CASE_NAMED_WITH_DATA(data.test_descr_uplink, ut_setup_security,    \
14827         ut_teardown, test_docsis_proto_uplink, (const void *) &data),           \
14828
14829 #define ADD_DOWNLINK_TESTCASE(data)                                             \
14830         TEST_CASE_NAMED_WITH_DATA(data.test_descr_downlink, ut_setup_security,  \
14831         ut_teardown, test_docsis_proto_downlink, (const void *) &data),         \
14832
14833 static struct unit_test_suite docsis_proto_testsuite  = {
14834         .suite_name = "DOCSIS Proto Unit Test Suite",
14835         .setup = docsis_proto_testsuite_setup,
14836         .unit_test_cases = {
14837                 /* Uplink */
14838                 ADD_UPLINK_TESTCASE(docsis_test_case_1)
14839                 ADD_UPLINK_TESTCASE(docsis_test_case_2)
14840                 ADD_UPLINK_TESTCASE(docsis_test_case_3)
14841                 ADD_UPLINK_TESTCASE(docsis_test_case_4)
14842                 ADD_UPLINK_TESTCASE(docsis_test_case_5)
14843                 ADD_UPLINK_TESTCASE(docsis_test_case_6)
14844                 ADD_UPLINK_TESTCASE(docsis_test_case_7)
14845                 ADD_UPLINK_TESTCASE(docsis_test_case_8)
14846                 ADD_UPLINK_TESTCASE(docsis_test_case_9)
14847                 ADD_UPLINK_TESTCASE(docsis_test_case_10)
14848                 ADD_UPLINK_TESTCASE(docsis_test_case_11)
14849                 ADD_UPLINK_TESTCASE(docsis_test_case_12)
14850                 ADD_UPLINK_TESTCASE(docsis_test_case_13)
14851                 ADD_UPLINK_TESTCASE(docsis_test_case_14)
14852                 ADD_UPLINK_TESTCASE(docsis_test_case_15)
14853                 ADD_UPLINK_TESTCASE(docsis_test_case_16)
14854                 ADD_UPLINK_TESTCASE(docsis_test_case_17)
14855                 ADD_UPLINK_TESTCASE(docsis_test_case_18)
14856                 ADD_UPLINK_TESTCASE(docsis_test_case_19)
14857                 ADD_UPLINK_TESTCASE(docsis_test_case_20)
14858                 ADD_UPLINK_TESTCASE(docsis_test_case_21)
14859                 ADD_UPLINK_TESTCASE(docsis_test_case_22)
14860                 ADD_UPLINK_TESTCASE(docsis_test_case_23)
14861                 ADD_UPLINK_TESTCASE(docsis_test_case_24)
14862                 ADD_UPLINK_TESTCASE(docsis_test_case_25)
14863                 ADD_UPLINK_TESTCASE(docsis_test_case_26)
14864                 /* Downlink */
14865                 ADD_DOWNLINK_TESTCASE(docsis_test_case_1)
14866                 ADD_DOWNLINK_TESTCASE(docsis_test_case_2)
14867                 ADD_DOWNLINK_TESTCASE(docsis_test_case_3)
14868                 ADD_DOWNLINK_TESTCASE(docsis_test_case_4)
14869                 ADD_DOWNLINK_TESTCASE(docsis_test_case_5)
14870                 ADD_DOWNLINK_TESTCASE(docsis_test_case_6)
14871                 ADD_DOWNLINK_TESTCASE(docsis_test_case_7)
14872                 ADD_DOWNLINK_TESTCASE(docsis_test_case_8)
14873                 ADD_DOWNLINK_TESTCASE(docsis_test_case_9)
14874                 ADD_DOWNLINK_TESTCASE(docsis_test_case_10)
14875                 ADD_DOWNLINK_TESTCASE(docsis_test_case_11)
14876                 ADD_DOWNLINK_TESTCASE(docsis_test_case_12)
14877                 ADD_DOWNLINK_TESTCASE(docsis_test_case_13)
14878                 ADD_DOWNLINK_TESTCASE(docsis_test_case_14)
14879                 ADD_DOWNLINK_TESTCASE(docsis_test_case_15)
14880                 ADD_DOWNLINK_TESTCASE(docsis_test_case_16)
14881                 ADD_DOWNLINK_TESTCASE(docsis_test_case_17)
14882                 ADD_DOWNLINK_TESTCASE(docsis_test_case_18)
14883                 ADD_DOWNLINK_TESTCASE(docsis_test_case_19)
14884                 ADD_DOWNLINK_TESTCASE(docsis_test_case_20)
14885                 ADD_DOWNLINK_TESTCASE(docsis_test_case_21)
14886                 ADD_DOWNLINK_TESTCASE(docsis_test_case_22)
14887                 ADD_DOWNLINK_TESTCASE(docsis_test_case_23)
14888                 ADD_DOWNLINK_TESTCASE(docsis_test_case_24)
14889                 ADD_DOWNLINK_TESTCASE(docsis_test_case_25)
14890                 ADD_DOWNLINK_TESTCASE(docsis_test_case_26)
14891                 TEST_CASES_END() /**< NULL terminate unit test array */
14892         }
14893 };
14894 #endif
14895
14896 static struct unit_test_suite cryptodev_gen_testsuite  = {
14897         .suite_name = "Crypto General Unit Test Suite",
14898         .setup = crypto_gen_testsuite_setup,
14899         .unit_test_cases = {
14900                 TEST_CASE_ST(ut_setup, ut_teardown,
14901                                 test_device_configure_invalid_dev_id),
14902                 TEST_CASE_ST(ut_setup, ut_teardown,
14903                                 test_queue_pair_descriptor_setup),
14904                 TEST_CASE_ST(ut_setup, ut_teardown,
14905                                 test_device_configure_invalid_queue_pair_ids),
14906                 TEST_CASE_ST(ut_setup, ut_teardown, test_stats),
14907                 TEST_CASE_ST(ut_setup, ut_teardown, test_enq_callback_setup),
14908                 TEST_CASE_ST(ut_setup, ut_teardown, test_deq_callback_setup),
14909                 TEST_CASES_END() /**< NULL terminate unit test array */
14910         }
14911 };
14912
14913 static struct unit_test_suite cryptodev_negative_hmac_sha1_testsuite = {
14914         .suite_name = "Negative HMAC SHA1 Unit Test Suite",
14915         .setup = negative_hmac_sha1_testsuite_setup,
14916         .unit_test_cases = {
14917                 /** Negative tests */
14918                 TEST_CASE_ST(ut_setup, ut_teardown,
14919                         authentication_verify_HMAC_SHA1_fail_data_corrupt),
14920                 TEST_CASE_ST(ut_setup, ut_teardown,
14921                         authentication_verify_HMAC_SHA1_fail_tag_corrupt),
14922                 TEST_CASE_ST(ut_setup, ut_teardown,
14923                         auth_decryption_AES128CBC_HMAC_SHA1_fail_data_corrupt),
14924                 TEST_CASE_ST(ut_setup, ut_teardown,
14925                         auth_decryption_AES128CBC_HMAC_SHA1_fail_tag_corrupt),
14926
14927                 TEST_CASES_END() /**< NULL terminate unit test array */
14928         }
14929 };
14930
14931 static struct unit_test_suite cryptodev_multi_session_testsuite = {
14932         .suite_name = "Multi Session Unit Test Suite",
14933         .setup = multi_session_testsuite_setup,
14934         .unit_test_cases = {
14935                 TEST_CASE_ST(ut_setup, ut_teardown, test_multi_session),
14936                 TEST_CASE_ST(ut_setup, ut_teardown,
14937                                 test_multi_session_random_usage),
14938
14939                 TEST_CASES_END() /**< NULL terminate unit test array */
14940         }
14941 };
14942
14943 static struct unit_test_suite cryptodev_null_testsuite  = {
14944         .suite_name = "NULL Test Suite",
14945         .setup = null_testsuite_setup,
14946         .unit_test_cases = {
14947                 TEST_CASE_ST(ut_setup, ut_teardown,
14948                         test_null_invalid_operation),
14949                 TEST_CASE_ST(ut_setup, ut_teardown, test_null_burst_operation),
14950                 TEST_CASES_END()
14951         }
14952 };
14953
14954 static struct unit_test_suite cryptodev_aes_ccm_auth_testsuite  = {
14955         .suite_name = "AES CCM Authenticated Test Suite",
14956         .setup = aes_ccm_auth_testsuite_setup,
14957         .unit_test_cases = {
14958                 /** AES CCM Authenticated Encryption 128 bits key*/
14959                 TEST_CASE_ST(ut_setup, ut_teardown,
14960                         test_AES_CCM_authenticated_encryption_test_case_128_1),
14961                 TEST_CASE_ST(ut_setup, ut_teardown,
14962                         test_AES_CCM_authenticated_encryption_test_case_128_2),
14963                 TEST_CASE_ST(ut_setup, ut_teardown,
14964                         test_AES_CCM_authenticated_encryption_test_case_128_3),
14965
14966                 /** AES CCM Authenticated Decryption 128 bits key*/
14967                 TEST_CASE_ST(ut_setup, ut_teardown,
14968                         test_AES_CCM_authenticated_decryption_test_case_128_1),
14969                 TEST_CASE_ST(ut_setup, ut_teardown,
14970                         test_AES_CCM_authenticated_decryption_test_case_128_2),
14971                 TEST_CASE_ST(ut_setup, ut_teardown,
14972                         test_AES_CCM_authenticated_decryption_test_case_128_3),
14973
14974                 /** AES CCM Authenticated Encryption 192 bits key */
14975                 TEST_CASE_ST(ut_setup, ut_teardown,
14976                         test_AES_CCM_authenticated_encryption_test_case_192_1),
14977                 TEST_CASE_ST(ut_setup, ut_teardown,
14978                         test_AES_CCM_authenticated_encryption_test_case_192_2),
14979                 TEST_CASE_ST(ut_setup, ut_teardown,
14980                         test_AES_CCM_authenticated_encryption_test_case_192_3),
14981
14982                 /** AES CCM Authenticated Decryption 192 bits key*/
14983                 TEST_CASE_ST(ut_setup, ut_teardown,
14984                         test_AES_CCM_authenticated_decryption_test_case_192_1),
14985                 TEST_CASE_ST(ut_setup, ut_teardown,
14986                         test_AES_CCM_authenticated_decryption_test_case_192_2),
14987                 TEST_CASE_ST(ut_setup, ut_teardown,
14988                         test_AES_CCM_authenticated_decryption_test_case_192_3),
14989
14990                 /** AES CCM Authenticated Encryption 256 bits key */
14991                 TEST_CASE_ST(ut_setup, ut_teardown,
14992                         test_AES_CCM_authenticated_encryption_test_case_256_1),
14993                 TEST_CASE_ST(ut_setup, ut_teardown,
14994                         test_AES_CCM_authenticated_encryption_test_case_256_2),
14995                 TEST_CASE_ST(ut_setup, ut_teardown,
14996                         test_AES_CCM_authenticated_encryption_test_case_256_3),
14997
14998                 /** AES CCM Authenticated Decryption 256 bits key*/
14999                 TEST_CASE_ST(ut_setup, ut_teardown,
15000                         test_AES_CCM_authenticated_decryption_test_case_256_1),
15001                 TEST_CASE_ST(ut_setup, ut_teardown,
15002                         test_AES_CCM_authenticated_decryption_test_case_256_2),
15003                 TEST_CASE_ST(ut_setup, ut_teardown,
15004                         test_AES_CCM_authenticated_decryption_test_case_256_3),
15005                 TEST_CASES_END()
15006         }
15007 };
15008
15009 static struct unit_test_suite cryptodev_aes_gcm_auth_testsuite  = {
15010         .suite_name = "AES GCM Authenticated Test Suite",
15011         .setup = aes_gcm_auth_testsuite_setup,
15012         .unit_test_cases = {
15013                 /** AES GCM Authenticated Encryption */
15014                 TEST_CASE_ST(ut_setup, ut_teardown,
15015                         test_AES_GCM_auth_encrypt_SGL_in_place_1500B),
15016                 TEST_CASE_ST(ut_setup, ut_teardown,
15017                         test_AES_GCM_auth_encrypt_SGL_out_of_place_400B_400B),
15018                 TEST_CASE_ST(ut_setup, ut_teardown,
15019                         test_AES_GCM_auth_encrypt_SGL_out_of_place_1500B_2000B),
15020                 TEST_CASE_ST(ut_setup, ut_teardown,
15021                         test_AES_GCM_auth_encrypt_SGL_out_of_place_400B_1seg),
15022                 TEST_CASE_ST(ut_setup, ut_teardown,
15023                         test_AES_GCM_authenticated_encryption_test_case_1),
15024                 TEST_CASE_ST(ut_setup, ut_teardown,
15025                         test_AES_GCM_authenticated_encryption_test_case_2),
15026                 TEST_CASE_ST(ut_setup, ut_teardown,
15027                         test_AES_GCM_authenticated_encryption_test_case_3),
15028                 TEST_CASE_ST(ut_setup, ut_teardown,
15029                         test_AES_GCM_authenticated_encryption_test_case_4),
15030                 TEST_CASE_ST(ut_setup, ut_teardown,
15031                         test_AES_GCM_authenticated_encryption_test_case_5),
15032                 TEST_CASE_ST(ut_setup, ut_teardown,
15033                         test_AES_GCM_authenticated_encryption_test_case_6),
15034                 TEST_CASE_ST(ut_setup, ut_teardown,
15035                         test_AES_GCM_authenticated_encryption_test_case_7),
15036                 TEST_CASE_ST(ut_setup, ut_teardown,
15037                         test_AES_GCM_authenticated_encryption_test_case_8),
15038                 TEST_CASE_ST(ut_setup, ut_teardown,
15039                         test_AES_GCM_J0_authenticated_encryption_test_case_1),
15040
15041                 /** AES GCM Authenticated Decryption */
15042                 TEST_CASE_ST(ut_setup, ut_teardown,
15043                         test_AES_GCM_authenticated_decryption_test_case_1),
15044                 TEST_CASE_ST(ut_setup, ut_teardown,
15045                         test_AES_GCM_authenticated_decryption_test_case_2),
15046                 TEST_CASE_ST(ut_setup, ut_teardown,
15047                         test_AES_GCM_authenticated_decryption_test_case_3),
15048                 TEST_CASE_ST(ut_setup, ut_teardown,
15049                         test_AES_GCM_authenticated_decryption_test_case_4),
15050                 TEST_CASE_ST(ut_setup, ut_teardown,
15051                         test_AES_GCM_authenticated_decryption_test_case_5),
15052                 TEST_CASE_ST(ut_setup, ut_teardown,
15053                         test_AES_GCM_authenticated_decryption_test_case_6),
15054                 TEST_CASE_ST(ut_setup, ut_teardown,
15055                         test_AES_GCM_authenticated_decryption_test_case_7),
15056                 TEST_CASE_ST(ut_setup, ut_teardown,
15057                         test_AES_GCM_authenticated_decryption_test_case_8),
15058                 TEST_CASE_ST(ut_setup, ut_teardown,
15059                         test_AES_GCM_J0_authenticated_decryption_test_case_1),
15060
15061                 /** AES GCM Authenticated Encryption 192 bits key */
15062                 TEST_CASE_ST(ut_setup, ut_teardown,
15063                         test_AES_GCM_auth_encryption_test_case_192_1),
15064                 TEST_CASE_ST(ut_setup, ut_teardown,
15065                         test_AES_GCM_auth_encryption_test_case_192_2),
15066                 TEST_CASE_ST(ut_setup, ut_teardown,
15067                         test_AES_GCM_auth_encryption_test_case_192_3),
15068                 TEST_CASE_ST(ut_setup, ut_teardown,
15069                         test_AES_GCM_auth_encryption_test_case_192_4),
15070                 TEST_CASE_ST(ut_setup, ut_teardown,
15071                         test_AES_GCM_auth_encryption_test_case_192_5),
15072                 TEST_CASE_ST(ut_setup, ut_teardown,
15073                         test_AES_GCM_auth_encryption_test_case_192_6),
15074                 TEST_CASE_ST(ut_setup, ut_teardown,
15075                         test_AES_GCM_auth_encryption_test_case_192_7),
15076
15077                 /** AES GCM Authenticated Decryption 192 bits key */
15078                 TEST_CASE_ST(ut_setup, ut_teardown,
15079                         test_AES_GCM_auth_decryption_test_case_192_1),
15080                 TEST_CASE_ST(ut_setup, ut_teardown,
15081                         test_AES_GCM_auth_decryption_test_case_192_2),
15082                 TEST_CASE_ST(ut_setup, ut_teardown,
15083                         test_AES_GCM_auth_decryption_test_case_192_3),
15084                 TEST_CASE_ST(ut_setup, ut_teardown,
15085                         test_AES_GCM_auth_decryption_test_case_192_4),
15086                 TEST_CASE_ST(ut_setup, ut_teardown,
15087                         test_AES_GCM_auth_decryption_test_case_192_5),
15088                 TEST_CASE_ST(ut_setup, ut_teardown,
15089                         test_AES_GCM_auth_decryption_test_case_192_6),
15090                 TEST_CASE_ST(ut_setup, ut_teardown,
15091                         test_AES_GCM_auth_decryption_test_case_192_7),
15092
15093                 /** AES GCM Authenticated Encryption 256 bits key */
15094                 TEST_CASE_ST(ut_setup, ut_teardown,
15095                         test_AES_GCM_auth_encryption_test_case_256_1),
15096                 TEST_CASE_ST(ut_setup, ut_teardown,
15097                         test_AES_GCM_auth_encryption_test_case_256_2),
15098                 TEST_CASE_ST(ut_setup, ut_teardown,
15099                         test_AES_GCM_auth_encryption_test_case_256_3),
15100                 TEST_CASE_ST(ut_setup, ut_teardown,
15101                         test_AES_GCM_auth_encryption_test_case_256_4),
15102                 TEST_CASE_ST(ut_setup, ut_teardown,
15103                         test_AES_GCM_auth_encryption_test_case_256_5),
15104                 TEST_CASE_ST(ut_setup, ut_teardown,
15105                         test_AES_GCM_auth_encryption_test_case_256_6),
15106                 TEST_CASE_ST(ut_setup, ut_teardown,
15107                         test_AES_GCM_auth_encryption_test_case_256_7),
15108
15109                 /** AES GCM Authenticated Decryption 256 bits key */
15110                 TEST_CASE_ST(ut_setup, ut_teardown,
15111                         test_AES_GCM_auth_decryption_test_case_256_1),
15112                 TEST_CASE_ST(ut_setup, ut_teardown,
15113                         test_AES_GCM_auth_decryption_test_case_256_2),
15114                 TEST_CASE_ST(ut_setup, ut_teardown,
15115                         test_AES_GCM_auth_decryption_test_case_256_3),
15116                 TEST_CASE_ST(ut_setup, ut_teardown,
15117                         test_AES_GCM_auth_decryption_test_case_256_4),
15118                 TEST_CASE_ST(ut_setup, ut_teardown,
15119                         test_AES_GCM_auth_decryption_test_case_256_5),
15120                 TEST_CASE_ST(ut_setup, ut_teardown,
15121                         test_AES_GCM_auth_decryption_test_case_256_6),
15122                 TEST_CASE_ST(ut_setup, ut_teardown,
15123                         test_AES_GCM_auth_decryption_test_case_256_7),
15124
15125                 /** AES GCM Authenticated Encryption big aad size */
15126                 TEST_CASE_ST(ut_setup, ut_teardown,
15127                         test_AES_GCM_auth_encryption_test_case_aad_1),
15128                 TEST_CASE_ST(ut_setup, ut_teardown,
15129                         test_AES_GCM_auth_encryption_test_case_aad_2),
15130
15131                 /** AES GCM Authenticated Decryption big aad size */
15132                 TEST_CASE_ST(ut_setup, ut_teardown,
15133                         test_AES_GCM_auth_decryption_test_case_aad_1),
15134                 TEST_CASE_ST(ut_setup, ut_teardown,
15135                         test_AES_GCM_auth_decryption_test_case_aad_2),
15136
15137                 /** Out of place tests */
15138                 TEST_CASE_ST(ut_setup, ut_teardown,
15139                         test_AES_GCM_authenticated_encryption_oop_test_case_1),
15140                 TEST_CASE_ST(ut_setup, ut_teardown,
15141                         test_AES_GCM_authenticated_decryption_oop_test_case_1),
15142
15143                 /** Session-less tests */
15144                 TEST_CASE_ST(ut_setup, ut_teardown,
15145                         test_AES_GCM_authenticated_encryption_sessionless_test_case_1),
15146                 TEST_CASE_ST(ut_setup, ut_teardown,
15147                         test_AES_GCM_authenticated_decryption_sessionless_test_case_1),
15148
15149                 TEST_CASES_END()
15150         }
15151 };
15152
15153 static struct unit_test_suite cryptodev_aes_gmac_auth_testsuite  = {
15154         .suite_name = "AES GMAC Authentication Test Suite",
15155         .setup = aes_gmac_auth_testsuite_setup,
15156         .unit_test_cases = {
15157                 TEST_CASE_ST(ut_setup, ut_teardown,
15158                         test_AES_GMAC_authentication_test_case_1),
15159                 TEST_CASE_ST(ut_setup, ut_teardown,
15160                         test_AES_GMAC_authentication_verify_test_case_1),
15161                 TEST_CASE_ST(ut_setup, ut_teardown,
15162                         test_AES_GMAC_authentication_test_case_2),
15163                 TEST_CASE_ST(ut_setup, ut_teardown,
15164                         test_AES_GMAC_authentication_verify_test_case_2),
15165                 TEST_CASE_ST(ut_setup, ut_teardown,
15166                         test_AES_GMAC_authentication_test_case_3),
15167                 TEST_CASE_ST(ut_setup, ut_teardown,
15168                         test_AES_GMAC_authentication_verify_test_case_3),
15169                 TEST_CASE_ST(ut_setup, ut_teardown,
15170                         test_AES_GMAC_authentication_test_case_4),
15171                 TEST_CASE_ST(ut_setup, ut_teardown,
15172                         test_AES_GMAC_authentication_verify_test_case_4),
15173                 TEST_CASE_ST(ut_setup, ut_teardown,
15174                         test_AES_GMAC_authentication_SGL_40B),
15175                 TEST_CASE_ST(ut_setup, ut_teardown,
15176                         test_AES_GMAC_authentication_SGL_80B),
15177                 TEST_CASE_ST(ut_setup, ut_teardown,
15178                         test_AES_GMAC_authentication_SGL_2048B),
15179                 TEST_CASE_ST(ut_setup, ut_teardown,
15180                         test_AES_GMAC_authentication_SGL_2047B),
15181
15182                 TEST_CASES_END()
15183         }
15184 };
15185
15186 static struct unit_test_suite cryptodev_chacha20_poly1305_testsuite  = {
15187         .suite_name = "Chacha20-Poly1305 Test Suite",
15188         .setup = chacha20_poly1305_testsuite_setup,
15189         .unit_test_cases = {
15190                 TEST_CASE_ST(ut_setup, ut_teardown,
15191                         test_chacha20_poly1305_encrypt_test_case_rfc8439),
15192                 TEST_CASE_ST(ut_setup, ut_teardown,
15193                         test_chacha20_poly1305_decrypt_test_case_rfc8439),
15194                 TEST_CASE_ST(ut_setup, ut_teardown,
15195                         test_chacha20_poly1305_encrypt_SGL_out_of_place),
15196                 TEST_CASES_END()
15197         }
15198 };
15199
15200 static struct unit_test_suite cryptodev_snow3g_testsuite  = {
15201         .suite_name = "SNOW 3G Test Suite",
15202         .setup = snow3g_testsuite_setup,
15203         .unit_test_cases = {
15204                 /** SNOW 3G encrypt only (UEA2) */
15205                 TEST_CASE_ST(ut_setup, ut_teardown,
15206                         test_snow3g_encryption_test_case_1),
15207                 TEST_CASE_ST(ut_setup, ut_teardown,
15208                         test_snow3g_encryption_test_case_2),
15209                 TEST_CASE_ST(ut_setup, ut_teardown,
15210                         test_snow3g_encryption_test_case_3),
15211                 TEST_CASE_ST(ut_setup, ut_teardown,
15212                         test_snow3g_encryption_test_case_4),
15213                 TEST_CASE_ST(ut_setup, ut_teardown,
15214                         test_snow3g_encryption_test_case_5),
15215
15216                 TEST_CASE_ST(ut_setup, ut_teardown,
15217                         test_snow3g_encryption_test_case_1_oop),
15218                 TEST_CASE_ST(ut_setup, ut_teardown,
15219                         test_snow3g_encryption_test_case_1_oop_sgl),
15220                 TEST_CASE_ST(ut_setup, ut_teardown,
15221                         test_snow3g_encryption_test_case_1_offset_oop),
15222                 TEST_CASE_ST(ut_setup, ut_teardown,
15223                         test_snow3g_decryption_test_case_1_oop),
15224
15225                 /** SNOW 3G generate auth, then encrypt (UEA2) */
15226                 TEST_CASE_ST(ut_setup, ut_teardown,
15227                         test_snow3g_auth_cipher_test_case_1),
15228                 TEST_CASE_ST(ut_setup, ut_teardown,
15229                         test_snow3g_auth_cipher_test_case_2),
15230                 TEST_CASE_ST(ut_setup, ut_teardown,
15231                         test_snow3g_auth_cipher_test_case_2_oop),
15232                 TEST_CASE_ST(ut_setup, ut_teardown,
15233                         test_snow3g_auth_cipher_part_digest_enc),
15234                 TEST_CASE_ST(ut_setup, ut_teardown,
15235                         test_snow3g_auth_cipher_part_digest_enc_oop),
15236                 TEST_CASE_ST(ut_setup, ut_teardown,
15237                         test_snow3g_auth_cipher_test_case_3_sgl),
15238                 TEST_CASE_ST(ut_setup, ut_teardown,
15239                         test_snow3g_auth_cipher_test_case_3_oop_sgl),
15240                 TEST_CASE_ST(ut_setup, ut_teardown,
15241                         test_snow3g_auth_cipher_part_digest_enc_sgl),
15242                 TEST_CASE_ST(ut_setup, ut_teardown,
15243                         test_snow3g_auth_cipher_part_digest_enc_oop_sgl),
15244
15245                 /** SNOW 3G decrypt (UEA2), then verify auth */
15246                 TEST_CASE_ST(ut_setup, ut_teardown,
15247                         test_snow3g_auth_cipher_verify_test_case_1),
15248                 TEST_CASE_ST(ut_setup, ut_teardown,
15249                         test_snow3g_auth_cipher_verify_test_case_2),
15250                 TEST_CASE_ST(ut_setup, ut_teardown,
15251                         test_snow3g_auth_cipher_verify_test_case_2_oop),
15252                 TEST_CASE_ST(ut_setup, ut_teardown,
15253                         test_snow3g_auth_cipher_verify_part_digest_enc),
15254                 TEST_CASE_ST(ut_setup, ut_teardown,
15255                         test_snow3g_auth_cipher_verify_part_digest_enc_oop),
15256                 TEST_CASE_ST(ut_setup, ut_teardown,
15257                         test_snow3g_auth_cipher_verify_test_case_3_sgl),
15258                 TEST_CASE_ST(ut_setup, ut_teardown,
15259                         test_snow3g_auth_cipher_verify_test_case_3_oop_sgl),
15260                 TEST_CASE_ST(ut_setup, ut_teardown,
15261                         test_snow3g_auth_cipher_verify_part_digest_enc_sgl),
15262                 TEST_CASE_ST(ut_setup, ut_teardown,
15263                         test_snow3g_auth_cipher_verify_part_digest_enc_oop_sgl),
15264
15265                 /** SNOW 3G decrypt only (UEA2) */
15266                 TEST_CASE_ST(ut_setup, ut_teardown,
15267                         test_snow3g_decryption_test_case_1),
15268                 TEST_CASE_ST(ut_setup, ut_teardown,
15269                         test_snow3g_decryption_test_case_2),
15270                 TEST_CASE_ST(ut_setup, ut_teardown,
15271                         test_snow3g_decryption_test_case_3),
15272                 TEST_CASE_ST(ut_setup, ut_teardown,
15273                         test_snow3g_decryption_test_case_4),
15274                 TEST_CASE_ST(ut_setup, ut_teardown,
15275                         test_snow3g_decryption_test_case_5),
15276                 TEST_CASE_ST(ut_setup, ut_teardown,
15277                         test_snow3g_decryption_with_digest_test_case_1),
15278                 TEST_CASE_ST(ut_setup, ut_teardown,
15279                         test_snow3g_hash_generate_test_case_1),
15280                 TEST_CASE_ST(ut_setup, ut_teardown,
15281                         test_snow3g_hash_generate_test_case_2),
15282                 TEST_CASE_ST(ut_setup, ut_teardown,
15283                         test_snow3g_hash_generate_test_case_3),
15284
15285                 /* Tests with buffers which length is not byte-aligned */
15286                 TEST_CASE_ST(ut_setup, ut_teardown,
15287                         test_snow3g_hash_generate_test_case_4),
15288                 TEST_CASE_ST(ut_setup, ut_teardown,
15289                         test_snow3g_hash_generate_test_case_5),
15290                 TEST_CASE_ST(ut_setup, ut_teardown,
15291                         test_snow3g_hash_generate_test_case_6),
15292                 TEST_CASE_ST(ut_setup, ut_teardown,
15293                         test_snow3g_hash_verify_test_case_1),
15294                 TEST_CASE_ST(ut_setup, ut_teardown,
15295                         test_snow3g_hash_verify_test_case_2),
15296                 TEST_CASE_ST(ut_setup, ut_teardown,
15297                         test_snow3g_hash_verify_test_case_3),
15298
15299                 /* Tests with buffers which length is not byte-aligned */
15300                 TEST_CASE_ST(ut_setup, ut_teardown,
15301                         test_snow3g_hash_verify_test_case_4),
15302                 TEST_CASE_ST(ut_setup, ut_teardown,
15303                         test_snow3g_hash_verify_test_case_5),
15304                 TEST_CASE_ST(ut_setup, ut_teardown,
15305                         test_snow3g_hash_verify_test_case_6),
15306                 TEST_CASE_ST(ut_setup, ut_teardown,
15307                         test_snow3g_cipher_auth_test_case_1),
15308                 TEST_CASE_ST(ut_setup, ut_teardown,
15309                         test_snow3g_auth_cipher_with_digest_test_case_1),
15310                 TEST_CASES_END()
15311         }
15312 };
15313
15314 static struct unit_test_suite cryptodev_zuc_testsuite  = {
15315         .suite_name = "ZUC Test Suite",
15316         .setup = zuc_testsuite_setup,
15317         .unit_test_cases = {
15318                 /** ZUC encrypt only (EEA3) */
15319                 TEST_CASE_ST(ut_setup, ut_teardown,
15320                         test_zuc_encryption_test_case_1),
15321                 TEST_CASE_ST(ut_setup, ut_teardown,
15322                         test_zuc_encryption_test_case_2),
15323                 TEST_CASE_ST(ut_setup, ut_teardown,
15324                         test_zuc_encryption_test_case_3),
15325                 TEST_CASE_ST(ut_setup, ut_teardown,
15326                         test_zuc_encryption_test_case_4),
15327                 TEST_CASE_ST(ut_setup, ut_teardown,
15328                         test_zuc_encryption_test_case_5),
15329                 TEST_CASE_ST(ut_setup, ut_teardown,
15330                         test_zuc_encryption_test_case_6_sgl),
15331
15332                 /** ZUC authenticate (EIA3) */
15333                 TEST_CASE_ST(ut_setup, ut_teardown,
15334                         test_zuc_hash_generate_test_case_1),
15335                 TEST_CASE_ST(ut_setup, ut_teardown,
15336                         test_zuc_hash_generate_test_case_2),
15337                 TEST_CASE_ST(ut_setup, ut_teardown,
15338                         test_zuc_hash_generate_test_case_3),
15339                 TEST_CASE_ST(ut_setup, ut_teardown,
15340                         test_zuc_hash_generate_test_case_4),
15341                 TEST_CASE_ST(ut_setup, ut_teardown,
15342                         test_zuc_hash_generate_test_case_5),
15343                 TEST_CASE_ST(ut_setup, ut_teardown,
15344                         test_zuc_hash_generate_test_case_6),
15345                 TEST_CASE_ST(ut_setup, ut_teardown,
15346                         test_zuc_hash_generate_test_case_7),
15347                 TEST_CASE_ST(ut_setup, ut_teardown,
15348                         test_zuc_hash_generate_test_case_8),
15349                 TEST_CASE_ST(ut_setup, ut_teardown,
15350                         test_zuc_hash_generate_test_case_9),
15351                 TEST_CASE_ST(ut_setup, ut_teardown,
15352                         test_zuc_hash_generate_test_case_10),
15353                 TEST_CASE_ST(ut_setup, ut_teardown,
15354                         test_zuc_hash_generate_test_case_11),
15355
15356
15357                 /** ZUC alg-chain (EEA3/EIA3) */
15358                 TEST_CASE_ST(ut_setup, ut_teardown,
15359                         test_zuc_cipher_auth_test_case_1),
15360                 TEST_CASE_ST(ut_setup, ut_teardown,
15361                         test_zuc_cipher_auth_test_case_2),
15362
15363                 /** ZUC generate auth, then encrypt (EEA3) */
15364                 TEST_CASE_ST(ut_setup, ut_teardown,
15365                         test_zuc_auth_cipher_test_case_1),
15366                 TEST_CASE_ST(ut_setup, ut_teardown,
15367                         test_zuc_auth_cipher_test_case_1_oop),
15368                 TEST_CASE_ST(ut_setup, ut_teardown,
15369                         test_zuc_auth_cipher_test_case_1_sgl),
15370                 TEST_CASE_ST(ut_setup, ut_teardown,
15371                         test_zuc_auth_cipher_test_case_1_oop_sgl),
15372
15373                 /** ZUC decrypt (EEA3), then verify auth */
15374                 TEST_CASE_ST(ut_setup, ut_teardown,
15375                         test_zuc_auth_cipher_verify_test_case_1),
15376                 TEST_CASE_ST(ut_setup, ut_teardown,
15377                         test_zuc_auth_cipher_verify_test_case_1_oop),
15378                 TEST_CASE_ST(ut_setup, ut_teardown,
15379                         test_zuc_auth_cipher_verify_test_case_1_sgl),
15380                 TEST_CASE_ST(ut_setup, ut_teardown,
15381                         test_zuc_auth_cipher_verify_test_case_1_oop_sgl),
15382
15383                 /** ZUC-256 encrypt only **/
15384                 TEST_CASE_ST(ut_setup, ut_teardown,
15385                         test_zuc256_encryption_test_case_1),
15386                 TEST_CASE_ST(ut_setup, ut_teardown,
15387                         test_zuc256_encryption_test_case_2),
15388
15389                 /** ZUC-256 authentication only **/
15390                 TEST_CASE_ST(ut_setup, ut_teardown,
15391                         test_zuc256_authentication_test_case_1),
15392                 TEST_CASE_ST(ut_setup, ut_teardown,
15393                         test_zuc256_authentication_test_case_2),
15394
15395                 TEST_CASES_END()
15396         }
15397 };
15398
15399 static struct unit_test_suite cryptodev_hmac_md5_auth_testsuite  = {
15400         .suite_name = "HMAC_MD5 Authentication Test Suite",
15401         .setup = hmac_md5_auth_testsuite_setup,
15402         .unit_test_cases = {
15403                 TEST_CASE_ST(ut_setup, ut_teardown,
15404                         test_MD5_HMAC_generate_case_1),
15405                 TEST_CASE_ST(ut_setup, ut_teardown,
15406                         test_MD5_HMAC_verify_case_1),
15407                 TEST_CASE_ST(ut_setup, ut_teardown,
15408                         test_MD5_HMAC_generate_case_2),
15409                 TEST_CASE_ST(ut_setup, ut_teardown,
15410                         test_MD5_HMAC_verify_case_2),
15411                 TEST_CASES_END()
15412         }
15413 };
15414
15415 static struct unit_test_suite cryptodev_kasumi_testsuite  = {
15416         .suite_name = "Kasumi Test Suite",
15417         .setup = kasumi_testsuite_setup,
15418         .unit_test_cases = {
15419                 /** KASUMI hash only (UIA1) */
15420                 TEST_CASE_ST(ut_setup, ut_teardown,
15421                         test_kasumi_hash_generate_test_case_1),
15422                 TEST_CASE_ST(ut_setup, ut_teardown,
15423                         test_kasumi_hash_generate_test_case_2),
15424                 TEST_CASE_ST(ut_setup, ut_teardown,
15425                         test_kasumi_hash_generate_test_case_3),
15426                 TEST_CASE_ST(ut_setup, ut_teardown,
15427                         test_kasumi_hash_generate_test_case_4),
15428                 TEST_CASE_ST(ut_setup, ut_teardown,
15429                         test_kasumi_hash_generate_test_case_5),
15430                 TEST_CASE_ST(ut_setup, ut_teardown,
15431                         test_kasumi_hash_generate_test_case_6),
15432
15433                 TEST_CASE_ST(ut_setup, ut_teardown,
15434                         test_kasumi_hash_verify_test_case_1),
15435                 TEST_CASE_ST(ut_setup, ut_teardown,
15436                         test_kasumi_hash_verify_test_case_2),
15437                 TEST_CASE_ST(ut_setup, ut_teardown,
15438                         test_kasumi_hash_verify_test_case_3),
15439                 TEST_CASE_ST(ut_setup, ut_teardown,
15440                         test_kasumi_hash_verify_test_case_4),
15441                 TEST_CASE_ST(ut_setup, ut_teardown,
15442                         test_kasumi_hash_verify_test_case_5),
15443
15444                 /** KASUMI encrypt only (UEA1) */
15445                 TEST_CASE_ST(ut_setup, ut_teardown,
15446                         test_kasumi_encryption_test_case_1),
15447                 TEST_CASE_ST(ut_setup, ut_teardown,
15448                         test_kasumi_encryption_test_case_1_sgl),
15449                 TEST_CASE_ST(ut_setup, ut_teardown,
15450                         test_kasumi_encryption_test_case_1_oop),
15451                 TEST_CASE_ST(ut_setup, ut_teardown,
15452                         test_kasumi_encryption_test_case_1_oop_sgl),
15453                 TEST_CASE_ST(ut_setup, ut_teardown,
15454                         test_kasumi_encryption_test_case_2),
15455                 TEST_CASE_ST(ut_setup, ut_teardown,
15456                         test_kasumi_encryption_test_case_3),
15457                 TEST_CASE_ST(ut_setup, ut_teardown,
15458                         test_kasumi_encryption_test_case_4),
15459                 TEST_CASE_ST(ut_setup, ut_teardown,
15460                         test_kasumi_encryption_test_case_5),
15461
15462                 /** KASUMI decrypt only (UEA1) */
15463                 TEST_CASE_ST(ut_setup, ut_teardown,
15464                         test_kasumi_decryption_test_case_1),
15465                 TEST_CASE_ST(ut_setup, ut_teardown,
15466                         test_kasumi_decryption_test_case_2),
15467                 TEST_CASE_ST(ut_setup, ut_teardown,
15468                         test_kasumi_decryption_test_case_3),
15469                 TEST_CASE_ST(ut_setup, ut_teardown,
15470                         test_kasumi_decryption_test_case_4),
15471                 TEST_CASE_ST(ut_setup, ut_teardown,
15472                         test_kasumi_decryption_test_case_5),
15473                 TEST_CASE_ST(ut_setup, ut_teardown,
15474                         test_kasumi_decryption_test_case_1_oop),
15475                 TEST_CASE_ST(ut_setup, ut_teardown,
15476                         test_kasumi_cipher_auth_test_case_1),
15477
15478                 /** KASUMI generate auth, then encrypt (F8) */
15479                 TEST_CASE_ST(ut_setup, ut_teardown,
15480                         test_kasumi_auth_cipher_test_case_1),
15481                 TEST_CASE_ST(ut_setup, ut_teardown,
15482                         test_kasumi_auth_cipher_test_case_2),
15483                 TEST_CASE_ST(ut_setup, ut_teardown,
15484                         test_kasumi_auth_cipher_test_case_2_oop),
15485                 TEST_CASE_ST(ut_setup, ut_teardown,
15486                         test_kasumi_auth_cipher_test_case_2_sgl),
15487                 TEST_CASE_ST(ut_setup, ut_teardown,
15488                         test_kasumi_auth_cipher_test_case_2_oop_sgl),
15489
15490                 /** KASUMI decrypt (F8), then verify auth */
15491                 TEST_CASE_ST(ut_setup, ut_teardown,
15492                         test_kasumi_auth_cipher_verify_test_case_1),
15493                 TEST_CASE_ST(ut_setup, ut_teardown,
15494                         test_kasumi_auth_cipher_verify_test_case_2),
15495                 TEST_CASE_ST(ut_setup, ut_teardown,
15496                         test_kasumi_auth_cipher_verify_test_case_2_oop),
15497                 TEST_CASE_ST(ut_setup, ut_teardown,
15498                         test_kasumi_auth_cipher_verify_test_case_2_sgl),
15499                 TEST_CASE_ST(ut_setup, ut_teardown,
15500                         test_kasumi_auth_cipher_verify_test_case_2_oop_sgl),
15501
15502                 TEST_CASES_END()
15503         }
15504 };
15505
15506 static struct unit_test_suite cryptodev_esn_testsuite  = {
15507         .suite_name = "ESN Test Suite",
15508         .setup = esn_testsuite_setup,
15509         .unit_test_cases = {
15510                 TEST_CASE_ST(ut_setup, ut_teardown,
15511                         auth_encrypt_AES128CBC_HMAC_SHA1_esn_check),
15512                 TEST_CASE_ST(ut_setup, ut_teardown,
15513                         auth_decrypt_AES128CBC_HMAC_SHA1_esn_check),
15514                 TEST_CASES_END()
15515         }
15516 };
15517
15518 static struct unit_test_suite cryptodev_negative_aes_gcm_testsuite  = {
15519         .suite_name = "Negative AES GCM Test Suite",
15520         .setup = negative_aes_gcm_testsuite_setup,
15521         .unit_test_cases = {
15522                 TEST_CASE_ST(ut_setup, ut_teardown,
15523                         test_AES_GCM_auth_encryption_fail_iv_corrupt),
15524                 TEST_CASE_ST(ut_setup, ut_teardown,
15525                         test_AES_GCM_auth_encryption_fail_in_data_corrupt),
15526                 TEST_CASE_ST(ut_setup, ut_teardown,
15527                         test_AES_GCM_auth_encryption_fail_out_data_corrupt),
15528                 TEST_CASE_ST(ut_setup, ut_teardown,
15529                         test_AES_GCM_auth_encryption_fail_aad_len_corrupt),
15530                 TEST_CASE_ST(ut_setup, ut_teardown,
15531                         test_AES_GCM_auth_encryption_fail_aad_corrupt),
15532                 TEST_CASE_ST(ut_setup, ut_teardown,
15533                         test_AES_GCM_auth_encryption_fail_tag_corrupt),
15534                 TEST_CASE_ST(ut_setup, ut_teardown,
15535                         test_AES_GCM_auth_decryption_fail_iv_corrupt),
15536                 TEST_CASE_ST(ut_setup, ut_teardown,
15537                         test_AES_GCM_auth_decryption_fail_in_data_corrupt),
15538                 TEST_CASE_ST(ut_setup, ut_teardown,
15539                         test_AES_GCM_auth_decryption_fail_out_data_corrupt),
15540                 TEST_CASE_ST(ut_setup, ut_teardown,
15541                         test_AES_GCM_auth_decryption_fail_aad_len_corrupt),
15542                 TEST_CASE_ST(ut_setup, ut_teardown,
15543                         test_AES_GCM_auth_decryption_fail_aad_corrupt),
15544                 TEST_CASE_ST(ut_setup, ut_teardown,
15545                         test_AES_GCM_auth_decryption_fail_tag_corrupt),
15546
15547                 TEST_CASES_END()
15548         }
15549 };
15550
15551 static struct unit_test_suite cryptodev_negative_aes_gmac_testsuite  = {
15552         .suite_name = "Negative AES GMAC Test Suite",
15553         .setup = negative_aes_gmac_testsuite_setup,
15554         .unit_test_cases = {
15555                 TEST_CASE_ST(ut_setup, ut_teardown,
15556                         authentication_verify_AES128_GMAC_fail_data_corrupt),
15557                 TEST_CASE_ST(ut_setup, ut_teardown,
15558                         authentication_verify_AES128_GMAC_fail_tag_corrupt),
15559
15560                 TEST_CASES_END()
15561         }
15562 };
15563
15564 static struct unit_test_suite cryptodev_mixed_cipher_hash_testsuite  = {
15565         .suite_name = "Mixed CIPHER + HASH algorithms Test Suite",
15566         .setup = mixed_cipher_hash_testsuite_setup,
15567         .unit_test_cases = {
15568                 /** AUTH AES CMAC + CIPHER AES CTR */
15569                 TEST_CASE_ST(ut_setup, ut_teardown,
15570                         test_aes_cmac_aes_ctr_digest_enc_test_case_1),
15571                 TEST_CASE_ST(ut_setup, ut_teardown,
15572                         test_aes_cmac_aes_ctr_digest_enc_test_case_1_oop),
15573                 TEST_CASE_ST(ut_setup, ut_teardown,
15574                         test_aes_cmac_aes_ctr_digest_enc_test_case_1_sgl),
15575                 TEST_CASE_ST(ut_setup, ut_teardown,
15576                         test_aes_cmac_aes_ctr_digest_enc_test_case_1_oop_sgl),
15577                 TEST_CASE_ST(ut_setup, ut_teardown,
15578                         test_verify_aes_cmac_aes_ctr_digest_enc_test_case_1),
15579                 TEST_CASE_ST(ut_setup, ut_teardown,
15580                         test_verify_aes_cmac_aes_ctr_digest_enc_test_case_1_oop),
15581                 TEST_CASE_ST(ut_setup, ut_teardown,
15582                         test_verify_aes_cmac_aes_ctr_digest_enc_test_case_1_sgl),
15583                 TEST_CASE_ST(ut_setup, ut_teardown,
15584                         test_verify_aes_cmac_aes_ctr_digest_enc_test_case_1_oop_sgl),
15585
15586                 /** AUTH ZUC + CIPHER SNOW3G */
15587                 TEST_CASE_ST(ut_setup, ut_teardown,
15588                         test_auth_zuc_cipher_snow_test_case_1),
15589                 TEST_CASE_ST(ut_setup, ut_teardown,
15590                         test_verify_auth_zuc_cipher_snow_test_case_1),
15591                 /** AUTH AES CMAC + CIPHER SNOW3G */
15592                 TEST_CASE_ST(ut_setup, ut_teardown,
15593                         test_auth_aes_cmac_cipher_snow_test_case_1),
15594                 TEST_CASE_ST(ut_setup, ut_teardown,
15595                         test_verify_auth_aes_cmac_cipher_snow_test_case_1),
15596                 /** AUTH ZUC + CIPHER AES CTR */
15597                 TEST_CASE_ST(ut_setup, ut_teardown,
15598                         test_auth_zuc_cipher_aes_ctr_test_case_1),
15599                 TEST_CASE_ST(ut_setup, ut_teardown,
15600                         test_verify_auth_zuc_cipher_aes_ctr_test_case_1),
15601                 /** AUTH SNOW3G + CIPHER AES CTR */
15602                 TEST_CASE_ST(ut_setup, ut_teardown,
15603                         test_auth_snow_cipher_aes_ctr_test_case_1),
15604                 TEST_CASE_ST(ut_setup, ut_teardown,
15605                         test_verify_auth_snow_cipher_aes_ctr_test_case_1),
15606                 /** AUTH SNOW3G + CIPHER ZUC */
15607                 TEST_CASE_ST(ut_setup, ut_teardown,
15608                         test_auth_snow_cipher_zuc_test_case_1),
15609                 TEST_CASE_ST(ut_setup, ut_teardown,
15610                         test_verify_auth_snow_cipher_zuc_test_case_1),
15611                 /** AUTH AES CMAC + CIPHER ZUC */
15612                 TEST_CASE_ST(ut_setup, ut_teardown,
15613                         test_auth_aes_cmac_cipher_zuc_test_case_1),
15614                 TEST_CASE_ST(ut_setup, ut_teardown,
15615                         test_verify_auth_aes_cmac_cipher_zuc_test_case_1),
15616
15617                 /** AUTH NULL + CIPHER SNOW3G */
15618                 TEST_CASE_ST(ut_setup, ut_teardown,
15619                         test_auth_null_cipher_snow_test_case_1),
15620                 TEST_CASE_ST(ut_setup, ut_teardown,
15621                         test_verify_auth_null_cipher_snow_test_case_1),
15622                 /** AUTH NULL + CIPHER ZUC */
15623                 TEST_CASE_ST(ut_setup, ut_teardown,
15624                         test_auth_null_cipher_zuc_test_case_1),
15625                 TEST_CASE_ST(ut_setup, ut_teardown,
15626                         test_verify_auth_null_cipher_zuc_test_case_1),
15627                 /** AUTH SNOW3G + CIPHER NULL */
15628                 TEST_CASE_ST(ut_setup, ut_teardown,
15629                         test_auth_snow_cipher_null_test_case_1),
15630                 TEST_CASE_ST(ut_setup, ut_teardown,
15631                         test_verify_auth_snow_cipher_null_test_case_1),
15632                 /** AUTH ZUC + CIPHER NULL */
15633                 TEST_CASE_ST(ut_setup, ut_teardown,
15634                         test_auth_zuc_cipher_null_test_case_1),
15635                 TEST_CASE_ST(ut_setup, ut_teardown,
15636                         test_verify_auth_zuc_cipher_null_test_case_1),
15637                 /** AUTH NULL + CIPHER AES CTR */
15638                 TEST_CASE_ST(ut_setup, ut_teardown,
15639                         test_auth_null_cipher_aes_ctr_test_case_1),
15640                 TEST_CASE_ST(ut_setup, ut_teardown,
15641                         test_verify_auth_null_cipher_aes_ctr_test_case_1),
15642                 /** AUTH AES CMAC + CIPHER NULL */
15643                 TEST_CASE_ST(ut_setup, ut_teardown,
15644                         test_auth_aes_cmac_cipher_null_test_case_1),
15645                 TEST_CASE_ST(ut_setup, ut_teardown,
15646                         test_verify_auth_aes_cmac_cipher_null_test_case_1),
15647                 TEST_CASES_END()
15648         }
15649 };
15650
15651 static int
15652 run_cryptodev_testsuite(const char *pmd_name)
15653 {
15654         uint8_t ret, j, i = 0, blk_start_idx = 0;
15655         const enum blockcipher_test_type blk_suites[] = {
15656                 BLKCIPHER_AES_CHAIN_TYPE,
15657                 BLKCIPHER_AES_CIPHERONLY_TYPE,
15658                 BLKCIPHER_AES_DOCSIS_TYPE,
15659                 BLKCIPHER_3DES_CHAIN_TYPE,
15660                 BLKCIPHER_3DES_CIPHERONLY_TYPE,
15661                 BLKCIPHER_DES_CIPHERONLY_TYPE,
15662                 BLKCIPHER_DES_DOCSIS_TYPE,
15663                 BLKCIPHER_AUTHONLY_TYPE};
15664         struct unit_test_suite *static_suites[] = {
15665                 &cryptodev_multi_session_testsuite,
15666                 &cryptodev_null_testsuite,
15667                 &cryptodev_aes_ccm_auth_testsuite,
15668                 &cryptodev_aes_gcm_auth_testsuite,
15669                 &cryptodev_aes_gmac_auth_testsuite,
15670                 &cryptodev_snow3g_testsuite,
15671                 &cryptodev_chacha20_poly1305_testsuite,
15672                 &cryptodev_zuc_testsuite,
15673                 &cryptodev_hmac_md5_auth_testsuite,
15674                 &cryptodev_kasumi_testsuite,
15675                 &cryptodev_esn_testsuite,
15676                 &cryptodev_negative_aes_gcm_testsuite,
15677                 &cryptodev_negative_aes_gmac_testsuite,
15678                 &cryptodev_mixed_cipher_hash_testsuite,
15679                 &cryptodev_negative_hmac_sha1_testsuite,
15680                 &cryptodev_gen_testsuite,
15681 #ifdef RTE_LIB_SECURITY
15682                 &ipsec_proto_testsuite,
15683                 &pdcp_proto_testsuite,
15684                 &docsis_proto_testsuite,
15685 #endif
15686                 &end_testsuite
15687         };
15688         static struct unit_test_suite ts = {
15689                 .suite_name = "Cryptodev Unit Test Suite",
15690                 .setup = testsuite_setup,
15691                 .teardown = testsuite_teardown,
15692                 .unit_test_cases = {TEST_CASES_END()}
15693         };
15694
15695         gbl_driver_id = rte_cryptodev_driver_id_get(pmd_name);
15696
15697         if (gbl_driver_id == -1) {
15698                 RTE_LOG(ERR, USER1, "%s PMD must be loaded.\n", pmd_name);
15699                 return TEST_SKIPPED;
15700         }
15701
15702         ts.unit_test_suites = malloc(sizeof(struct unit_test_suite *) *
15703                         (RTE_DIM(blk_suites) + RTE_DIM(static_suites)));
15704
15705         ADD_BLOCKCIPHER_TESTSUITE(i, ts, blk_suites, RTE_DIM(blk_suites));
15706         ADD_STATIC_TESTSUITE(i, ts, static_suites, RTE_DIM(static_suites));
15707         ret = unit_test_suite_runner(&ts);
15708
15709         FREE_BLOCKCIPHER_TESTSUITE(blk_start_idx, ts, RTE_DIM(blk_suites));
15710         free(ts.unit_test_suites);
15711         return ret;
15712 }
15713
15714 static int
15715 require_feature_flag(const char *pmd_name, uint64_t flag, const char *flag_name)
15716 {
15717         struct rte_cryptodev_info dev_info;
15718         uint8_t i, nb_devs;
15719         int driver_id;
15720
15721         driver_id = rte_cryptodev_driver_id_get(pmd_name);
15722         if (driver_id == -1) {
15723                 RTE_LOG(WARNING, USER1, "%s PMD must be loaded.\n", pmd_name);
15724                 return TEST_SKIPPED;
15725         }
15726
15727         nb_devs = rte_cryptodev_count();
15728         if (nb_devs < 1) {
15729                 RTE_LOG(WARNING, USER1, "No crypto devices found?\n");
15730                 return TEST_SKIPPED;
15731         }
15732
15733         for (i = 0; i < nb_devs; i++) {
15734                 rte_cryptodev_info_get(i, &dev_info);
15735                 if (dev_info.driver_id == driver_id) {
15736                         if (!(dev_info.feature_flags & flag)) {
15737                                 RTE_LOG(INFO, USER1, "%s not supported\n",
15738                                                 flag_name);
15739                                 return TEST_SKIPPED;
15740                         }
15741                         return 0; /* found */
15742                 }
15743         }
15744
15745         RTE_LOG(INFO, USER1, "%s not supported\n", flag_name);
15746         return TEST_SKIPPED;
15747 }
15748
15749 static int
15750 test_cryptodev_qat(void)
15751 {
15752         return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_QAT_SYM_PMD));
15753 }
15754
15755 static int
15756 test_cryptodev_virtio(void)
15757 {
15758         return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_VIRTIO_PMD));
15759 }
15760
15761 static int
15762 test_cryptodev_aesni_mb(void)
15763 {
15764         return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_AESNI_MB_PMD));
15765 }
15766
15767 static int
15768 test_cryptodev_cpu_aesni_mb(void)
15769 {
15770         int32_t rc;
15771         enum rte_security_session_action_type at = gbl_action_type;
15772         gbl_action_type = RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO;
15773         rc = run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_AESNI_MB_PMD));
15774         gbl_action_type = at;
15775         return rc;
15776 }
15777
15778 static int
15779 test_cryptodev_chacha_poly_mb(void)
15780 {
15781         int32_t rc;
15782         enum rte_security_session_action_type at = gbl_action_type;
15783         rc = run_cryptodev_testsuite(
15784                         RTE_STR(CRYPTODEV_NAME_CHACHA20_POLY1305_PMD));
15785         gbl_action_type = at;
15786         return rc;
15787 }
15788
15789 static int
15790 test_cryptodev_openssl(void)
15791 {
15792         return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_OPENSSL_PMD));
15793 }
15794
15795 static int
15796 test_cryptodev_aesni_gcm(void)
15797 {
15798         return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_AESNI_GCM_PMD));
15799 }
15800
15801 static int
15802 test_cryptodev_cpu_aesni_gcm(void)
15803 {
15804         int32_t rc;
15805         enum rte_security_session_action_type at = gbl_action_type;
15806         gbl_action_type = RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO;
15807         rc  = run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_AESNI_GCM_PMD));
15808         gbl_action_type = at;
15809         return rc;
15810 }
15811
15812 static int
15813 test_cryptodev_mlx5(void)
15814 {
15815         return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_MLX5_PMD));
15816 }
15817
15818 static int
15819 test_cryptodev_null(void)
15820 {
15821         return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_NULL_PMD));
15822 }
15823
15824 static int
15825 test_cryptodev_sw_snow3g(void)
15826 {
15827         return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_SNOW3G_PMD));
15828 }
15829
15830 static int
15831 test_cryptodev_sw_kasumi(void)
15832 {
15833         return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_KASUMI_PMD));
15834 }
15835
15836 static int
15837 test_cryptodev_sw_zuc(void)
15838 {
15839         return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_ZUC_PMD));
15840 }
15841
15842 static int
15843 test_cryptodev_armv8(void)
15844 {
15845         return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_ARMV8_PMD));
15846 }
15847
15848 static int
15849 test_cryptodev_mrvl(void)
15850 {
15851         return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_MVSAM_PMD));
15852 }
15853
15854 #ifdef RTE_CRYPTO_SCHEDULER
15855
15856 static int
15857 test_cryptodev_scheduler(void)
15858 {
15859         uint8_t ret, sched_i, j, i = 0, blk_start_idx = 0;
15860         const enum blockcipher_test_type blk_suites[] = {
15861                 BLKCIPHER_AES_CHAIN_TYPE,
15862                 BLKCIPHER_AES_CIPHERONLY_TYPE,
15863                 BLKCIPHER_AUTHONLY_TYPE
15864         };
15865         static struct unit_test_suite scheduler_multicore = {
15866                 .suite_name = "Scheduler Multicore Unit Test Suite",
15867                 .setup = scheduler_multicore_testsuite_setup,
15868                 .teardown = scheduler_mode_testsuite_teardown,
15869                 .unit_test_cases = {TEST_CASES_END()}
15870         };
15871         static struct unit_test_suite scheduler_round_robin = {
15872                 .suite_name = "Scheduler Round Robin Unit Test Suite",
15873                 .setup = scheduler_roundrobin_testsuite_setup,
15874                 .teardown = scheduler_mode_testsuite_teardown,
15875                 .unit_test_cases = {TEST_CASES_END()}
15876         };
15877         static struct unit_test_suite scheduler_failover = {
15878                 .suite_name = "Scheduler Failover Unit Test Suite",
15879                 .setup = scheduler_failover_testsuite_setup,
15880                 .teardown = scheduler_mode_testsuite_teardown,
15881                 .unit_test_cases = {TEST_CASES_END()}
15882         };
15883         static struct unit_test_suite scheduler_pkt_size_distr = {
15884                 .suite_name = "Scheduler Pkt Size Distr Unit Test Suite",
15885                 .setup = scheduler_pkt_size_distr_testsuite_setup,
15886                 .teardown = scheduler_mode_testsuite_teardown,
15887                 .unit_test_cases = {TEST_CASES_END()}
15888         };
15889         struct unit_test_suite *sched_mode_suites[] = {
15890                 &scheduler_multicore,
15891                 &scheduler_round_robin,
15892                 &scheduler_failover,
15893                 &scheduler_pkt_size_distr
15894         };
15895         static struct unit_test_suite scheduler_config = {
15896                 .suite_name = "Crypto Device Scheduler Config Unit Test Suite",
15897                 .unit_test_cases = {
15898                         TEST_CASE(test_scheduler_attach_worker_op),
15899                         TEST_CASE(test_scheduler_mode_multicore_op),
15900                         TEST_CASE(test_scheduler_mode_roundrobin_op),
15901                         TEST_CASE(test_scheduler_mode_failover_op),
15902                         TEST_CASE(test_scheduler_mode_pkt_size_distr_op),
15903                         TEST_CASE(test_scheduler_detach_worker_op),
15904
15905                         TEST_CASES_END() /**< NULL terminate array */
15906                 }
15907         };
15908         struct unit_test_suite *static_suites[] = {
15909                 &scheduler_config,
15910                 &end_testsuite
15911         };
15912         static struct unit_test_suite ts = {
15913                 .suite_name = "Scheduler Unit Test Suite",
15914                 .setup = scheduler_testsuite_setup,
15915                 .teardown = testsuite_teardown,
15916                 .unit_test_cases = {TEST_CASES_END()}
15917         };
15918
15919         gbl_driver_id = rte_cryptodev_driver_id_get(
15920                         RTE_STR(CRYPTODEV_NAME_SCHEDULER_PMD));
15921
15922         if (gbl_driver_id == -1) {
15923                 RTE_LOG(ERR, USER1, "SCHEDULER PMD must be loaded.\n");
15924                 return TEST_SKIPPED;
15925         }
15926
15927         if (rte_cryptodev_driver_id_get(
15928                                 RTE_STR(CRYPTODEV_NAME_AESNI_MB_PMD)) == -1) {
15929                 RTE_LOG(ERR, USER1, "AESNI MB PMD must be loaded.\n");
15930                 return TEST_SKIPPED;
15931         }
15932
15933         for (sched_i = 0; sched_i < RTE_DIM(sched_mode_suites); sched_i++) {
15934                 uint8_t blk_i = 0;
15935                 sched_mode_suites[sched_i]->unit_test_suites = malloc(sizeof
15936                                 (struct unit_test_suite *) *
15937                                 (RTE_DIM(blk_suites) + 1));
15938                 ADD_BLOCKCIPHER_TESTSUITE(blk_i, (*sched_mode_suites[sched_i]),
15939                                 blk_suites, RTE_DIM(blk_suites));
15940                 sched_mode_suites[sched_i]->unit_test_suites[blk_i] = &end_testsuite;
15941         }
15942
15943         ts.unit_test_suites = malloc(sizeof(struct unit_test_suite *) *
15944                         (RTE_DIM(static_suites) + RTE_DIM(sched_mode_suites)));
15945         ADD_STATIC_TESTSUITE(i, ts, sched_mode_suites,
15946                         RTE_DIM(sched_mode_suites));
15947         ADD_STATIC_TESTSUITE(i, ts, static_suites, RTE_DIM(static_suites));
15948         ret = unit_test_suite_runner(&ts);
15949
15950         for (sched_i = 0; sched_i < RTE_DIM(sched_mode_suites); sched_i++) {
15951                 FREE_BLOCKCIPHER_TESTSUITE(blk_start_idx,
15952                                 (*sched_mode_suites[sched_i]),
15953                                 RTE_DIM(blk_suites));
15954                 free(sched_mode_suites[sched_i]->unit_test_suites);
15955         }
15956         free(ts.unit_test_suites);
15957         return ret;
15958 }
15959
15960 REGISTER_TEST_COMMAND(cryptodev_scheduler_autotest, test_cryptodev_scheduler);
15961
15962 #endif
15963
15964 static int
15965 test_cryptodev_dpaa2_sec(void)
15966 {
15967         return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_DPAA2_SEC_PMD));
15968 }
15969
15970 static int
15971 test_cryptodev_dpaa_sec(void)
15972 {
15973         return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_DPAA_SEC_PMD));
15974 }
15975
15976 static int
15977 test_cryptodev_ccp(void)
15978 {
15979         return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_CCP_PMD));
15980 }
15981
15982 static int
15983 test_cryptodev_octeontx(void)
15984 {
15985         return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_OCTEONTX_SYM_PMD));
15986 }
15987
15988 static int
15989 test_cryptodev_caam_jr(void)
15990 {
15991         return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_CAAM_JR_PMD));
15992 }
15993
15994 static int
15995 test_cryptodev_nitrox(void)
15996 {
15997         return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_NITROX_PMD));
15998 }
15999
16000 static int
16001 test_cryptodev_bcmfs(void)
16002 {
16003         return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_BCMFS_PMD));
16004 }
16005
16006 static int
16007 test_cryptodev_qat_raw_api(void)
16008 {
16009         static const char *pmd_name = RTE_STR(CRYPTODEV_NAME_QAT_SYM_PMD);
16010         int ret;
16011
16012         ret = require_feature_flag(pmd_name, RTE_CRYPTODEV_FF_SYM_RAW_DP,
16013                         "RAW API");
16014         if (ret)
16015                 return ret;
16016
16017         global_api_test_type = CRYPTODEV_RAW_API_TEST;
16018         ret = run_cryptodev_testsuite(pmd_name);
16019         global_api_test_type = CRYPTODEV_API_TEST;
16020
16021         return ret;
16022 }
16023
16024 static int
16025 test_cryptodev_cn9k(void)
16026 {
16027         return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_CN9K_PMD));
16028 }
16029
16030 static int
16031 test_cryptodev_cn10k(void)
16032 {
16033         return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_CN10K_PMD));
16034 }
16035
16036 static int
16037 test_cryptodev_dpaa2_sec_raw_api(void)
16038 {
16039         static const char *pmd_name = RTE_STR(CRYPTODEV_NAME_DPAA2_SEC_PMD);
16040         int ret;
16041
16042         ret = require_feature_flag(pmd_name, RTE_CRYPTODEV_FF_SYM_RAW_DP,
16043                         "RAW API");
16044         if (ret)
16045                 return ret;
16046
16047         global_api_test_type = CRYPTODEV_RAW_API_TEST;
16048         ret = run_cryptodev_testsuite(pmd_name);
16049         global_api_test_type = CRYPTODEV_API_TEST;
16050
16051         return ret;
16052 }
16053
16054 static int
16055 test_cryptodev_dpaa_sec_raw_api(void)
16056 {
16057         static const char *pmd_name = RTE_STR(CRYPTODEV_NAME_DPAA2_SEC_PMD);
16058         int ret;
16059
16060         ret = require_feature_flag(pmd_name, RTE_CRYPTODEV_FF_SYM_RAW_DP,
16061                         "RAW API");
16062         if (ret)
16063                 return ret;
16064
16065         global_api_test_type = CRYPTODEV_RAW_API_TEST;
16066         ret = run_cryptodev_testsuite(pmd_name);
16067         global_api_test_type = CRYPTODEV_API_TEST;
16068
16069         return ret;
16070 }
16071
16072 REGISTER_TEST_COMMAND(cryptodev_dpaa2_sec_raw_api_autotest,
16073                 test_cryptodev_dpaa2_sec_raw_api);
16074 REGISTER_TEST_COMMAND(cryptodev_dpaa_sec_raw_api_autotest,
16075                 test_cryptodev_dpaa_sec_raw_api);
16076 REGISTER_TEST_COMMAND(cryptodev_qat_raw_api_autotest,
16077                 test_cryptodev_qat_raw_api);
16078 REGISTER_TEST_COMMAND(cryptodev_qat_autotest, test_cryptodev_qat);
16079 REGISTER_TEST_COMMAND(cryptodev_aesni_mb_autotest, test_cryptodev_aesni_mb);
16080 REGISTER_TEST_COMMAND(cryptodev_cpu_aesni_mb_autotest,
16081         test_cryptodev_cpu_aesni_mb);
16082 REGISTER_TEST_COMMAND(cryptodev_chacha_poly_mb_autotest,
16083         test_cryptodev_chacha_poly_mb);
16084 REGISTER_TEST_COMMAND(cryptodev_openssl_autotest, test_cryptodev_openssl);
16085 REGISTER_TEST_COMMAND(cryptodev_aesni_gcm_autotest, test_cryptodev_aesni_gcm);
16086 REGISTER_TEST_COMMAND(cryptodev_cpu_aesni_gcm_autotest,
16087         test_cryptodev_cpu_aesni_gcm);
16088 REGISTER_TEST_COMMAND(cryptodev_mlx5_autotest, test_cryptodev_mlx5);
16089 REGISTER_TEST_COMMAND(cryptodev_null_autotest, test_cryptodev_null);
16090 REGISTER_TEST_COMMAND(cryptodev_sw_snow3g_autotest, test_cryptodev_sw_snow3g);
16091 REGISTER_TEST_COMMAND(cryptodev_sw_kasumi_autotest, test_cryptodev_sw_kasumi);
16092 REGISTER_TEST_COMMAND(cryptodev_sw_zuc_autotest, test_cryptodev_sw_zuc);
16093 REGISTER_TEST_COMMAND(cryptodev_sw_armv8_autotest, test_cryptodev_armv8);
16094 REGISTER_TEST_COMMAND(cryptodev_sw_mvsam_autotest, test_cryptodev_mrvl);
16095 REGISTER_TEST_COMMAND(cryptodev_dpaa2_sec_autotest, test_cryptodev_dpaa2_sec);
16096 REGISTER_TEST_COMMAND(cryptodev_dpaa_sec_autotest, test_cryptodev_dpaa_sec);
16097 REGISTER_TEST_COMMAND(cryptodev_ccp_autotest, test_cryptodev_ccp);
16098 REGISTER_TEST_COMMAND(cryptodev_virtio_autotest, test_cryptodev_virtio);
16099 REGISTER_TEST_COMMAND(cryptodev_octeontx_autotest, test_cryptodev_octeontx);
16100 REGISTER_TEST_COMMAND(cryptodev_caam_jr_autotest, test_cryptodev_caam_jr);
16101 REGISTER_TEST_COMMAND(cryptodev_nitrox_autotest, test_cryptodev_nitrox);
16102 REGISTER_TEST_COMMAND(cryptodev_bcmfs_autotest, test_cryptodev_bcmfs);
16103 REGISTER_TEST_COMMAND(cryptodev_cn9k_autotest, test_cryptodev_cn9k);
16104 REGISTER_TEST_COMMAND(cryptodev_cn10k_autotest, test_cryptodev_cn10k);
16105
16106 #endif /* !RTE_EXEC_ENV_WINDOWS */