bpf: allow self-xor operation
[dpdk.git] / app / test / test_cryptodev.c
1 /* SPDX-License-Identifier: BSD-3-Clause
2  * Copyright(c) 2015-2020 Intel Corporation
3  * Copyright 2020 NXP
4  */
5
6 #include <time.h>
7
8 #include <rte_common.h>
9 #include <rte_hexdump.h>
10 #include <rte_mbuf.h>
11 #include <rte_malloc.h>
12 #include <rte_memcpy.h>
13 #include <rte_pause.h>
14 #include <rte_bus_vdev.h>
15 #include <rte_ether.h>
16
17 #include <rte_crypto.h>
18 #include <rte_cryptodev.h>
19 #include <rte_ip.h>
20 #include <rte_string_fns.h>
21 #include <rte_tcp.h>
22 #include <rte_udp.h>
23
24 #ifdef RTE_CRYPTO_SCHEDULER
25 #include <rte_cryptodev_scheduler.h>
26 #include <rte_cryptodev_scheduler_operations.h>
27 #endif
28
29 #include <rte_lcore.h>
30
31 #include "test.h"
32 #include "test_cryptodev.h"
33
34 #include "test_cryptodev_blockcipher.h"
35 #include "test_cryptodev_aes_test_vectors.h"
36 #include "test_cryptodev_des_test_vectors.h"
37 #include "test_cryptodev_hash_test_vectors.h"
38 #include "test_cryptodev_kasumi_test_vectors.h"
39 #include "test_cryptodev_kasumi_hash_test_vectors.h"
40 #include "test_cryptodev_snow3g_test_vectors.h"
41 #include "test_cryptodev_snow3g_hash_test_vectors.h"
42 #include "test_cryptodev_zuc_test_vectors.h"
43 #include "test_cryptodev_aead_test_vectors.h"
44 #include "test_cryptodev_hmac_test_vectors.h"
45 #include "test_cryptodev_mixed_test_vectors.h"
46 #ifdef RTE_LIB_SECURITY
47 #include "test_cryptodev_security_ipsec.h"
48 #include "test_cryptodev_security_ipsec_test_vectors.h"
49 #include "test_cryptodev_security_pdcp_test_vectors.h"
50 #include "test_cryptodev_security_pdcp_sdap_test_vectors.h"
51 #include "test_cryptodev_security_pdcp_test_func.h"
52 #include "test_cryptodev_security_docsis_test_vectors.h"
53
54 #define SDAP_DISABLED   0
55 #define SDAP_ENABLED    1
56 #endif
57
58 #define VDEV_ARGS_SIZE 100
59 #define MAX_NB_SESSIONS 4
60
61 #define MAX_DRV_SERVICE_CTX_SIZE 256
62
63 #define MAX_RAW_DEQUEUE_COUNT   65535
64
65 #define IN_PLACE 0
66 #define OUT_OF_PLACE 1
67
68 static int gbl_driver_id;
69
70 static enum rte_security_session_action_type gbl_action_type =
71         RTE_SECURITY_ACTION_TYPE_NONE;
72
73 enum cryptodev_api_test_type global_api_test_type = CRYPTODEV_API_TEST;
74
75 struct crypto_unittest_params {
76         struct rte_crypto_sym_xform cipher_xform;
77         struct rte_crypto_sym_xform auth_xform;
78         struct rte_crypto_sym_xform aead_xform;
79 #ifdef RTE_LIB_SECURITY
80         struct rte_security_docsis_xform docsis_xform;
81 #endif
82
83         union {
84                 struct rte_cryptodev_sym_session *sess;
85 #ifdef RTE_LIB_SECURITY
86                 struct rte_security_session *sec_session;
87 #endif
88         };
89 #ifdef RTE_LIB_SECURITY
90         enum rte_security_session_action_type type;
91 #endif
92         struct rte_crypto_op *op;
93
94         struct rte_mbuf *obuf, *ibuf;
95
96         uint8_t *digest;
97 };
98
99 #define ALIGN_POW2_ROUNDUP(num, align) \
100         (((num) + (align) - 1) & ~((align) - 1))
101
102 #define ADD_STATIC_TESTSUITE(index, parent_ts, child_ts, num_child_ts)  \
103         for (j = 0; j < num_child_ts; index++, j++)                     \
104                 parent_ts.unit_test_suites[index] = child_ts[j]
105
106 #define ADD_BLOCKCIPHER_TESTSUITE(index, parent_ts, blk_types, num_blk_types)   \
107         for (j = 0; j < num_blk_types; index++, j++)                            \
108                 parent_ts.unit_test_suites[index] =                             \
109                                 build_blockcipher_test_suite(blk_types[j])
110
111 #define FREE_BLOCKCIPHER_TESTSUITE(index, parent_ts, num_blk_types)             \
112         for (j = index; j < index + num_blk_types; j++)                         \
113                 free_blockcipher_test_suite(parent_ts.unit_test_suites[j])
114
115 /*
116  * Forward declarations.
117  */
118 static int
119 test_AES_CBC_HMAC_SHA512_decrypt_create_session_params(
120                 struct crypto_unittest_params *ut_params, uint8_t *cipher_key,
121                 uint8_t *hmac_key);
122
123 static int
124 test_AES_CBC_HMAC_SHA512_decrypt_perform(struct rte_cryptodev_sym_session *sess,
125                 struct crypto_unittest_params *ut_params,
126                 struct crypto_testsuite_params *ts_param,
127                 const uint8_t *cipher,
128                 const uint8_t *digest,
129                 const uint8_t *iv);
130
131 static int
132 security_proto_supported(enum rte_security_session_action_type action,
133         enum rte_security_session_protocol proto);
134
135 static int
136 dev_configure_and_start(uint64_t ff_disable);
137
138 static struct rte_mbuf *
139 setup_test_string(struct rte_mempool *mpool,
140                 const char *string, size_t len, uint8_t blocksize)
141 {
142         struct rte_mbuf *m = rte_pktmbuf_alloc(mpool);
143         size_t t_len = len - (blocksize ? (len % blocksize) : 0);
144
145         if (m) {
146                 char *dst;
147
148                 memset(m->buf_addr, 0, m->buf_len);
149                 dst = rte_pktmbuf_append(m, t_len);
150                 if (!dst) {
151                         rte_pktmbuf_free(m);
152                         return NULL;
153                 }
154                 if (string != NULL)
155                         rte_memcpy(dst, string, t_len);
156                 else
157                         memset(dst, 0, t_len);
158         }
159
160         return m;
161 }
162
163 /* Get number of bytes in X bits (rounding up) */
164 static uint32_t
165 ceil_byte_length(uint32_t num_bits)
166 {
167         if (num_bits % 8)
168                 return ((num_bits >> 3) + 1);
169         else
170                 return (num_bits >> 3);
171 }
172
173 static void
174 post_process_raw_dp_op(void *user_data, uint32_t index __rte_unused,
175                 uint8_t is_op_success)
176 {
177         struct rte_crypto_op *op = user_data;
178         op->status = is_op_success ? RTE_CRYPTO_OP_STATUS_SUCCESS :
179                         RTE_CRYPTO_OP_STATUS_ERROR;
180 }
181
182 void
183 process_sym_raw_dp_op(uint8_t dev_id, uint16_t qp_id,
184                 struct rte_crypto_op *op, uint8_t is_cipher, uint8_t is_auth,
185                 uint8_t len_in_bits, uint8_t cipher_iv_len)
186 {
187         struct rte_crypto_sym_op *sop = op->sym;
188         struct rte_crypto_op *ret_op = NULL;
189         struct rte_crypto_vec data_vec[UINT8_MAX], dest_data_vec[UINT8_MAX];
190         struct rte_crypto_va_iova_ptr cipher_iv, digest, aad_auth_iv;
191         union rte_crypto_sym_ofs ofs;
192         struct rte_crypto_sym_vec vec;
193         struct rte_crypto_sgl sgl, dest_sgl;
194         uint32_t max_len;
195         union rte_cryptodev_session_ctx sess;
196         uint32_t count = 0;
197         struct rte_crypto_raw_dp_ctx *ctx;
198         uint32_t cipher_offset = 0, cipher_len = 0, auth_offset = 0,
199                         auth_len = 0;
200         int32_t n;
201         uint32_t n_success;
202         int ctx_service_size;
203         int32_t status = 0;
204         int enqueue_status, dequeue_status;
205
206         ctx_service_size = rte_cryptodev_get_raw_dp_ctx_size(dev_id);
207         if (ctx_service_size < 0) {
208                 op->status = RTE_CRYPTO_OP_STATUS_ERROR;
209                 return;
210         }
211
212         ctx = malloc(ctx_service_size);
213         if (!ctx) {
214                 op->status = RTE_CRYPTO_OP_STATUS_ERROR;
215                 return;
216         }
217
218         /* Both are enums, setting crypto_sess will suit any session type */
219         sess.crypto_sess = op->sym->session;
220
221         if (rte_cryptodev_configure_raw_dp_ctx(dev_id, qp_id, ctx,
222                         op->sess_type, sess, 0) < 0) {
223                 op->status = RTE_CRYPTO_OP_STATUS_ERROR;
224                 goto exit;
225         }
226
227         cipher_iv.iova = 0;
228         cipher_iv.va = NULL;
229         aad_auth_iv.iova = 0;
230         aad_auth_iv.va = NULL;
231         digest.iova = 0;
232         digest.va = NULL;
233         sgl.vec = data_vec;
234         vec.num = 1;
235         vec.src_sgl = &sgl;
236         vec.iv = &cipher_iv;
237         vec.digest = &digest;
238         vec.aad = &aad_auth_iv;
239         vec.status = &status;
240
241         ofs.raw = 0;
242
243         if (is_cipher && is_auth) {
244                 cipher_offset = sop->cipher.data.offset;
245                 cipher_len = sop->cipher.data.length;
246                 auth_offset = sop->auth.data.offset;
247                 auth_len = sop->auth.data.length;
248                 max_len = RTE_MAX(cipher_offset + cipher_len,
249                                 auth_offset + auth_len);
250                 if (len_in_bits) {
251                         max_len = max_len >> 3;
252                         cipher_offset = cipher_offset >> 3;
253                         auth_offset = auth_offset >> 3;
254                         cipher_len = cipher_len >> 3;
255                         auth_len = auth_len >> 3;
256                 }
257                 ofs.ofs.cipher.head = cipher_offset;
258                 ofs.ofs.cipher.tail = max_len - cipher_offset - cipher_len;
259                 ofs.ofs.auth.head = auth_offset;
260                 ofs.ofs.auth.tail = max_len - auth_offset - auth_len;
261                 cipher_iv.va = rte_crypto_op_ctod_offset(op, void *, IV_OFFSET);
262                 cipher_iv.iova = rte_crypto_op_ctophys_offset(op, IV_OFFSET);
263                 aad_auth_iv.va = rte_crypto_op_ctod_offset(
264                                 op, void *, IV_OFFSET + cipher_iv_len);
265                 aad_auth_iv.iova = rte_crypto_op_ctophys_offset(op, IV_OFFSET +
266                                 cipher_iv_len);
267                 digest.va = (void *)sop->auth.digest.data;
268                 digest.iova = sop->auth.digest.phys_addr;
269
270         } else if (is_cipher) {
271                 cipher_offset = sop->cipher.data.offset;
272                 cipher_len = sop->cipher.data.length;
273                 max_len = cipher_len + cipher_offset;
274                 if (len_in_bits) {
275                         max_len = max_len >> 3;
276                         cipher_offset = cipher_offset >> 3;
277                         cipher_len = cipher_len >> 3;
278                 }
279                 ofs.ofs.cipher.head = cipher_offset;
280                 ofs.ofs.cipher.tail = max_len - cipher_offset - cipher_len;
281                 cipher_iv.va = rte_crypto_op_ctod_offset(op, void *, IV_OFFSET);
282                 cipher_iv.iova = rte_crypto_op_ctophys_offset(op, IV_OFFSET);
283
284         } else if (is_auth) {
285                 auth_offset = sop->auth.data.offset;
286                 auth_len = sop->auth.data.length;
287                 max_len = auth_len + auth_offset;
288                 if (len_in_bits) {
289                         max_len = max_len >> 3;
290                         auth_offset = auth_offset >> 3;
291                         auth_len = auth_len >> 3;
292                 }
293                 ofs.ofs.auth.head = auth_offset;
294                 ofs.ofs.auth.tail = max_len - auth_offset - auth_len;
295                 aad_auth_iv.va = rte_crypto_op_ctod_offset(
296                                 op, void *, IV_OFFSET + cipher_iv_len);
297                 aad_auth_iv.iova = rte_crypto_op_ctophys_offset(op, IV_OFFSET +
298                                 cipher_iv_len);
299                 digest.va = (void *)sop->auth.digest.data;
300                 digest.iova = sop->auth.digest.phys_addr;
301
302         } else { /* aead */
303                 cipher_offset = sop->aead.data.offset;
304                 cipher_len = sop->aead.data.length;
305                 max_len = cipher_len + cipher_offset;
306                 if (len_in_bits) {
307                         max_len = max_len >> 3;
308                         cipher_offset = cipher_offset >> 3;
309                         cipher_len = cipher_len >> 3;
310                 }
311                 ofs.ofs.cipher.head = cipher_offset;
312                 ofs.ofs.cipher.tail = max_len - cipher_offset - cipher_len;
313                 cipher_iv.va = rte_crypto_op_ctod_offset(op, void *, IV_OFFSET);
314                 cipher_iv.iova = rte_crypto_op_ctophys_offset(op, IV_OFFSET);
315                 aad_auth_iv.va = (void *)sop->aead.aad.data;
316                 aad_auth_iv.iova = sop->aead.aad.phys_addr;
317                 digest.va = (void *)sop->aead.digest.data;
318                 digest.iova = sop->aead.digest.phys_addr;
319         }
320
321         n = rte_crypto_mbuf_to_vec(sop->m_src, 0, max_len,
322                         data_vec, RTE_DIM(data_vec));
323         if (n < 0 || n > sop->m_src->nb_segs) {
324                 op->status = RTE_CRYPTO_OP_STATUS_ERROR;
325                 goto exit;
326         }
327
328         sgl.num = n;
329         /* Out of place */
330         if (sop->m_dst != NULL) {
331                 dest_sgl.vec = dest_data_vec;
332                 vec.dest_sgl = &dest_sgl;
333                 n = rte_crypto_mbuf_to_vec(sop->m_dst, 0, max_len,
334                                 dest_data_vec, RTE_DIM(dest_data_vec));
335                 if (n < 0 || n > sop->m_dst->nb_segs) {
336                         op->status = RTE_CRYPTO_OP_STATUS_ERROR;
337                         goto exit;
338                 }
339                 dest_sgl.num = n;
340         } else
341                 vec.dest_sgl = NULL;
342
343         if (rte_cryptodev_raw_enqueue_burst(ctx, &vec, ofs, (void **)&op,
344                         &enqueue_status) < 1) {
345                 op->status = RTE_CRYPTO_OP_STATUS_ERROR;
346                 goto exit;
347         }
348
349         if (enqueue_status == 0) {
350                 status = rte_cryptodev_raw_enqueue_done(ctx, 1);
351                 if (status < 0) {
352                         op->status = RTE_CRYPTO_OP_STATUS_ERROR;
353                         goto exit;
354                 }
355         } else if (enqueue_status < 0) {
356                 op->status = RTE_CRYPTO_OP_STATUS_ERROR;
357                 goto exit;
358         }
359
360         n = n_success = 0;
361         while (count++ < MAX_RAW_DEQUEUE_COUNT && n == 0) {
362                 n = rte_cryptodev_raw_dequeue_burst(ctx,
363                         NULL, 1, post_process_raw_dp_op,
364                                 (void **)&ret_op, 0, &n_success,
365                                 &dequeue_status);
366                 if (dequeue_status < 0) {
367                         op->status = RTE_CRYPTO_OP_STATUS_ERROR;
368                         goto exit;
369                 }
370                 if (n == 0)
371                         rte_pause();
372         }
373
374         if (n == 1 && dequeue_status == 0) {
375                 if (rte_cryptodev_raw_dequeue_done(ctx, 1) < 0) {
376                         op->status = RTE_CRYPTO_OP_STATUS_ERROR;
377                         goto exit;
378                 }
379         }
380
381         op->status = (count == MAX_RAW_DEQUEUE_COUNT + 1 || ret_op != op ||
382                         ret_op->status == RTE_CRYPTO_OP_STATUS_ERROR ||
383                         n_success < 1) ? RTE_CRYPTO_OP_STATUS_ERROR :
384                                         RTE_CRYPTO_OP_STATUS_SUCCESS;
385
386 exit:
387         free(ctx);
388 }
389
390 static void
391 process_cpu_aead_op(uint8_t dev_id, struct rte_crypto_op *op)
392 {
393         int32_t n, st;
394         struct rte_crypto_sym_op *sop;
395         union rte_crypto_sym_ofs ofs;
396         struct rte_crypto_sgl sgl;
397         struct rte_crypto_sym_vec symvec;
398         struct rte_crypto_va_iova_ptr iv_ptr, aad_ptr, digest_ptr;
399         struct rte_crypto_vec vec[UINT8_MAX];
400
401         sop = op->sym;
402
403         n = rte_crypto_mbuf_to_vec(sop->m_src, sop->aead.data.offset,
404                 sop->aead.data.length, vec, RTE_DIM(vec));
405
406         if (n < 0 || n != sop->m_src->nb_segs) {
407                 op->status = RTE_CRYPTO_OP_STATUS_ERROR;
408                 return;
409         }
410
411         sgl.vec = vec;
412         sgl.num = n;
413         symvec.src_sgl = &sgl;
414         symvec.iv = &iv_ptr;
415         symvec.digest = &digest_ptr;
416         symvec.aad = &aad_ptr;
417         symvec.status = &st;
418         symvec.num = 1;
419
420         /* for CPU crypto the IOVA address is not required */
421         iv_ptr.va = rte_crypto_op_ctod_offset(op, void *, IV_OFFSET);
422         digest_ptr.va = (void *)sop->aead.digest.data;
423         aad_ptr.va = (void *)sop->aead.aad.data;
424
425         ofs.raw = 0;
426
427         n = rte_cryptodev_sym_cpu_crypto_process(dev_id, sop->session, ofs,
428                 &symvec);
429
430         if (n != 1)
431                 op->status = RTE_CRYPTO_OP_STATUS_AUTH_FAILED;
432         else
433                 op->status = RTE_CRYPTO_OP_STATUS_SUCCESS;
434 }
435
436 static void
437 process_cpu_crypt_auth_op(uint8_t dev_id, struct rte_crypto_op *op)
438 {
439         int32_t n, st;
440         struct rte_crypto_sym_op *sop;
441         union rte_crypto_sym_ofs ofs;
442         struct rte_crypto_sgl sgl;
443         struct rte_crypto_sym_vec symvec;
444         struct rte_crypto_va_iova_ptr iv_ptr, digest_ptr;
445         struct rte_crypto_vec vec[UINT8_MAX];
446
447         sop = op->sym;
448
449         n = rte_crypto_mbuf_to_vec(sop->m_src, sop->auth.data.offset,
450                 sop->auth.data.length, vec, RTE_DIM(vec));
451
452         if (n < 0 || n != sop->m_src->nb_segs) {
453                 op->status = RTE_CRYPTO_OP_STATUS_ERROR;
454                 return;
455         }
456
457         sgl.vec = vec;
458         sgl.num = n;
459         symvec.src_sgl = &sgl;
460         symvec.iv = &iv_ptr;
461         symvec.digest = &digest_ptr;
462         symvec.status = &st;
463         symvec.num = 1;
464
465         iv_ptr.va = rte_crypto_op_ctod_offset(op, void *, IV_OFFSET);
466         digest_ptr.va = (void *)sop->auth.digest.data;
467
468         ofs.raw = 0;
469         ofs.ofs.cipher.head = sop->cipher.data.offset - sop->auth.data.offset;
470         ofs.ofs.cipher.tail = (sop->auth.data.offset + sop->auth.data.length) -
471                 (sop->cipher.data.offset + sop->cipher.data.length);
472
473         n = rte_cryptodev_sym_cpu_crypto_process(dev_id, sop->session, ofs,
474                 &symvec);
475
476         if (n != 1)
477                 op->status = RTE_CRYPTO_OP_STATUS_AUTH_FAILED;
478         else
479                 op->status = RTE_CRYPTO_OP_STATUS_SUCCESS;
480 }
481
482 static struct rte_crypto_op *
483 process_crypto_request(uint8_t dev_id, struct rte_crypto_op *op)
484 {
485
486         RTE_VERIFY(gbl_action_type != RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO);
487
488         if (rte_cryptodev_enqueue_burst(dev_id, 0, &op, 1) != 1) {
489                 RTE_LOG(ERR, USER1, "Error sending packet for encryption\n");
490                 return NULL;
491         }
492
493         op = NULL;
494
495         while (rte_cryptodev_dequeue_burst(dev_id, 0, &op, 1) == 0)
496                 rte_pause();
497
498         if (op->status != RTE_CRYPTO_OP_STATUS_SUCCESS) {
499                 RTE_LOG(DEBUG, USER1, "Operation status %d\n", op->status);
500                 return NULL;
501         }
502
503         return op;
504 }
505
506 static struct crypto_testsuite_params testsuite_params = { NULL };
507 struct crypto_testsuite_params *p_testsuite_params = &testsuite_params;
508 static struct crypto_unittest_params unittest_params;
509
510 static int
511 testsuite_setup(void)
512 {
513         struct crypto_testsuite_params *ts_params = &testsuite_params;
514         struct rte_cryptodev_info info;
515         uint32_t i = 0, nb_devs, dev_id;
516         uint16_t qp_id;
517
518         memset(ts_params, 0, sizeof(*ts_params));
519
520         ts_params->mbuf_pool = rte_mempool_lookup("CRYPTO_MBUFPOOL");
521         if (ts_params->mbuf_pool == NULL) {
522                 /* Not already created so create */
523                 ts_params->mbuf_pool = rte_pktmbuf_pool_create(
524                                 "CRYPTO_MBUFPOOL",
525                                 NUM_MBUFS, MBUF_CACHE_SIZE, 0, MBUF_SIZE,
526                                 rte_socket_id());
527                 if (ts_params->mbuf_pool == NULL) {
528                         RTE_LOG(ERR, USER1, "Can't create CRYPTO_MBUFPOOL\n");
529                         return TEST_FAILED;
530                 }
531         }
532
533         ts_params->large_mbuf_pool = rte_mempool_lookup(
534                         "CRYPTO_LARGE_MBUFPOOL");
535         if (ts_params->large_mbuf_pool == NULL) {
536                 /* Not already created so create */
537                 ts_params->large_mbuf_pool = rte_pktmbuf_pool_create(
538                                 "CRYPTO_LARGE_MBUFPOOL",
539                                 1, 0, 0, UINT16_MAX,
540                                 rte_socket_id());
541                 if (ts_params->large_mbuf_pool == NULL) {
542                         RTE_LOG(ERR, USER1,
543                                 "Can't create CRYPTO_LARGE_MBUFPOOL\n");
544                         return TEST_FAILED;
545                 }
546         }
547
548         ts_params->op_mpool = rte_crypto_op_pool_create(
549                         "MBUF_CRYPTO_SYM_OP_POOL",
550                         RTE_CRYPTO_OP_TYPE_SYMMETRIC,
551                         NUM_MBUFS, MBUF_CACHE_SIZE,
552                         DEFAULT_NUM_XFORMS *
553                         sizeof(struct rte_crypto_sym_xform) +
554                         MAXIMUM_IV_LENGTH,
555                         rte_socket_id());
556         if (ts_params->op_mpool == NULL) {
557                 RTE_LOG(ERR, USER1, "Can't create CRYPTO_OP_POOL\n");
558                 return TEST_FAILED;
559         }
560
561         nb_devs = rte_cryptodev_count();
562         if (nb_devs < 1) {
563                 RTE_LOG(WARNING, USER1, "No crypto devices found?\n");
564                 return TEST_SKIPPED;
565         }
566
567         if (rte_cryptodev_device_count_by_driver(gbl_driver_id) < 1) {
568                 RTE_LOG(WARNING, USER1, "No %s devices found?\n",
569                                 rte_cryptodev_driver_name_get(gbl_driver_id));
570                 return TEST_SKIPPED;
571         }
572
573         /* Create list of valid crypto devs */
574         for (i = 0; i < nb_devs; i++) {
575                 rte_cryptodev_info_get(i, &info);
576                 if (info.driver_id == gbl_driver_id)
577                         ts_params->valid_devs[ts_params->valid_dev_count++] = i;
578         }
579
580         if (ts_params->valid_dev_count < 1)
581                 return TEST_FAILED;
582
583         /* Set up all the qps on the first of the valid devices found */
584
585         dev_id = ts_params->valid_devs[0];
586
587         rte_cryptodev_info_get(dev_id, &info);
588
589         ts_params->conf.nb_queue_pairs = info.max_nb_queue_pairs;
590         ts_params->conf.socket_id = SOCKET_ID_ANY;
591         ts_params->conf.ff_disable = RTE_CRYPTODEV_FF_SECURITY;
592
593         unsigned int session_size =
594                 rte_cryptodev_sym_get_private_session_size(dev_id);
595
596 #ifdef RTE_LIB_SECURITY
597         unsigned int security_session_size = rte_security_session_get_size(
598                         rte_cryptodev_get_sec_ctx(dev_id));
599
600         if (session_size < security_session_size)
601                 session_size = security_session_size;
602 #endif
603         /*
604          * Create mempool with maximum number of sessions.
605          */
606         if (info.sym.max_nb_sessions != 0 &&
607                         info.sym.max_nb_sessions < MAX_NB_SESSIONS) {
608                 RTE_LOG(ERR, USER1, "Device does not support "
609                                 "at least %u sessions\n",
610                                 MAX_NB_SESSIONS);
611                 return TEST_FAILED;
612         }
613
614         ts_params->session_mpool = rte_cryptodev_sym_session_pool_create(
615                         "test_sess_mp", MAX_NB_SESSIONS, 0, 0, 0,
616                         SOCKET_ID_ANY);
617         TEST_ASSERT_NOT_NULL(ts_params->session_mpool,
618                         "session mempool allocation failed");
619
620         ts_params->session_priv_mpool = rte_mempool_create(
621                         "test_sess_mp_priv",
622                         MAX_NB_SESSIONS,
623                         session_size,
624                         0, 0, NULL, NULL, NULL,
625                         NULL, SOCKET_ID_ANY,
626                         0);
627         TEST_ASSERT_NOT_NULL(ts_params->session_priv_mpool,
628                         "session mempool allocation failed");
629
630
631
632         TEST_ASSERT_SUCCESS(rte_cryptodev_configure(dev_id,
633                         &ts_params->conf),
634                         "Failed to configure cryptodev %u with %u qps",
635                         dev_id, ts_params->conf.nb_queue_pairs);
636
637         ts_params->qp_conf.nb_descriptors = MAX_NUM_OPS_INFLIGHT;
638         ts_params->qp_conf.mp_session = ts_params->session_mpool;
639         ts_params->qp_conf.mp_session_private = ts_params->session_priv_mpool;
640
641         for (qp_id = 0; qp_id < info.max_nb_queue_pairs; qp_id++) {
642                 TEST_ASSERT_SUCCESS(rte_cryptodev_queue_pair_setup(
643                         dev_id, qp_id, &ts_params->qp_conf,
644                         rte_cryptodev_socket_id(dev_id)),
645                         "Failed to setup queue pair %u on cryptodev %u",
646                         qp_id, dev_id);
647         }
648
649         return TEST_SUCCESS;
650 }
651
652 static void
653 testsuite_teardown(void)
654 {
655         struct crypto_testsuite_params *ts_params = &testsuite_params;
656         int res;
657
658         if (ts_params->mbuf_pool != NULL) {
659                 RTE_LOG(DEBUG, USER1, "CRYPTO_MBUFPOOL count %u\n",
660                 rte_mempool_avail_count(ts_params->mbuf_pool));
661         }
662
663         if (ts_params->op_mpool != NULL) {
664                 RTE_LOG(DEBUG, USER1, "CRYPTO_OP_POOL count %u\n",
665                 rte_mempool_avail_count(ts_params->op_mpool));
666         }
667
668         /* Free session mempools */
669         if (ts_params->session_priv_mpool != NULL) {
670                 rte_mempool_free(ts_params->session_priv_mpool);
671                 ts_params->session_priv_mpool = NULL;
672         }
673
674         if (ts_params->session_mpool != NULL) {
675                 rte_mempool_free(ts_params->session_mpool);
676                 ts_params->session_mpool = NULL;
677         }
678
679         res = rte_cryptodev_close(ts_params->valid_devs[0]);
680         if (res)
681                 RTE_LOG(ERR, USER1, "Crypto device close error %d\n", res);
682 }
683
684 static int
685 check_capabilities_supported(enum rte_crypto_sym_xform_type type,
686                 const int *algs, uint16_t num_algs)
687 {
688         uint8_t dev_id = testsuite_params.valid_devs[0];
689         bool some_alg_supported = FALSE;
690         uint16_t i;
691
692         for (i = 0; i < num_algs && !some_alg_supported; i++) {
693                 struct rte_cryptodev_sym_capability_idx alg = {
694                         type, {algs[i]}
695                 };
696                 if (rte_cryptodev_sym_capability_get(dev_id,
697                                 &alg) != NULL)
698                         some_alg_supported = TRUE;
699         }
700         if (!some_alg_supported)
701                 return TEST_SKIPPED;
702
703         return 0;
704 }
705
706 int
707 check_cipher_capabilities_supported(const enum rte_crypto_cipher_algorithm *ciphers,
708                 uint16_t num_ciphers)
709 {
710         return check_capabilities_supported(RTE_CRYPTO_SYM_XFORM_CIPHER,
711                         (const int *) ciphers, num_ciphers);
712 }
713
714 int
715 check_auth_capabilities_supported(const enum rte_crypto_auth_algorithm *auths,
716                 uint16_t num_auths)
717 {
718         return check_capabilities_supported(RTE_CRYPTO_SYM_XFORM_AUTH,
719                         (const int *) auths, num_auths);
720 }
721
722 int
723 check_aead_capabilities_supported(const enum rte_crypto_aead_algorithm *aeads,
724                 uint16_t num_aeads)
725 {
726         return check_capabilities_supported(RTE_CRYPTO_SYM_XFORM_AEAD,
727                         (const int *) aeads, num_aeads);
728 }
729
730 static int
731 null_testsuite_setup(void)
732 {
733         struct crypto_testsuite_params *ts_params = &testsuite_params;
734         uint8_t dev_id = ts_params->valid_devs[0];
735         struct rte_cryptodev_info dev_info;
736         const enum rte_crypto_cipher_algorithm ciphers[] = {
737                 RTE_CRYPTO_CIPHER_NULL
738         };
739         const enum rte_crypto_auth_algorithm auths[] = {
740                 RTE_CRYPTO_AUTH_NULL
741         };
742
743         rte_cryptodev_info_get(dev_id, &dev_info);
744
745         if (!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYMMETRIC_CRYPTO)) {
746                 RTE_LOG(INFO, USER1, "Feature flag requirements for NULL "
747                                 "testsuite not met\n");
748                 return TEST_SKIPPED;
749         }
750
751         if (check_cipher_capabilities_supported(ciphers, RTE_DIM(ciphers)) != 0
752                         && check_auth_capabilities_supported(auths,
753                         RTE_DIM(auths)) != 0) {
754                 RTE_LOG(INFO, USER1, "Capability requirements for NULL "
755                                 "testsuite not met\n");
756                 return TEST_SKIPPED;
757         }
758
759         return 0;
760 }
761
762 static int
763 crypto_gen_testsuite_setup(void)
764 {
765         struct crypto_testsuite_params *ts_params = &testsuite_params;
766         uint8_t dev_id = ts_params->valid_devs[0];
767         struct rte_cryptodev_info dev_info;
768
769         rte_cryptodev_info_get(dev_id, &dev_info);
770
771         if (!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYMMETRIC_CRYPTO)) {
772                 RTE_LOG(INFO, USER1, "Feature flag requirements for Crypto Gen "
773                                 "testsuite not met\n");
774                 return TEST_SKIPPED;
775         }
776
777         return 0;
778 }
779
780 #ifdef RTE_LIB_SECURITY
781 static int
782 ipsec_proto_testsuite_setup(void)
783 {
784         struct crypto_testsuite_params *ts_params = &testsuite_params;
785         struct crypto_unittest_params *ut_params = &unittest_params;
786         struct rte_cryptodev_info dev_info;
787         int ret = 0;
788
789         rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
790
791         if (!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SECURITY)) {
792                 RTE_LOG(INFO, USER1, "Feature flag requirements for IPsec Proto "
793                                 "testsuite not met\n");
794                 return TEST_SKIPPED;
795         }
796
797         /* Reconfigure to enable security */
798         ret = dev_configure_and_start(0);
799         if (ret != TEST_SUCCESS)
800                 return ret;
801
802         /* Set action type */
803         ut_params->type = RTE_SECURITY_ACTION_TYPE_LOOKASIDE_PROTOCOL;
804
805         if (security_proto_supported(
806                         RTE_SECURITY_ACTION_TYPE_LOOKASIDE_PROTOCOL,
807                         RTE_SECURITY_PROTOCOL_IPSEC) < 0) {
808                 RTE_LOG(INFO, USER1, "Capability requirements for IPsec Proto "
809                                 "test not met\n");
810                 ret = TEST_SKIPPED;
811         }
812
813         /*
814          * Stop the device. Device would be started again by individual test
815          * case setup routine.
816          */
817         rte_cryptodev_stop(ts_params->valid_devs[0]);
818
819         return ret;
820 }
821
822 static int
823 pdcp_proto_testsuite_setup(void)
824 {
825         struct crypto_testsuite_params *ts_params = &testsuite_params;
826         uint8_t dev_id = ts_params->valid_devs[0];
827         struct rte_cryptodev_info dev_info;
828         const enum rte_crypto_cipher_algorithm ciphers[] = {
829                 RTE_CRYPTO_CIPHER_NULL,
830                 RTE_CRYPTO_CIPHER_AES_CTR,
831                 RTE_CRYPTO_CIPHER_ZUC_EEA3,
832                 RTE_CRYPTO_CIPHER_SNOW3G_UEA2
833         };
834         const enum rte_crypto_auth_algorithm auths[] = {
835                 RTE_CRYPTO_AUTH_NULL,
836                 RTE_CRYPTO_AUTH_SNOW3G_UIA2,
837                 RTE_CRYPTO_AUTH_AES_CMAC,
838                 RTE_CRYPTO_AUTH_ZUC_EIA3
839         };
840
841         rte_cryptodev_info_get(dev_id, &dev_info);
842
843         if (!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYMMETRIC_CRYPTO) ||
844                         !(dev_info.feature_flags &
845                         RTE_CRYPTODEV_FF_SECURITY)) {
846                 RTE_LOG(INFO, USER1, "Feature flag requirements for PDCP Proto "
847                                 "testsuite not met\n");
848                 return TEST_SKIPPED;
849         }
850
851         if (check_cipher_capabilities_supported(ciphers, RTE_DIM(ciphers)) != 0
852                         && check_auth_capabilities_supported(auths,
853                         RTE_DIM(auths)) != 0) {
854                 RTE_LOG(INFO, USER1, "Capability requirements for PDCP Proto "
855                                 "testsuite not met\n");
856                 return TEST_SKIPPED;
857         }
858
859         return 0;
860 }
861
862 static int
863 docsis_proto_testsuite_setup(void)
864 {
865         struct crypto_testsuite_params *ts_params = &testsuite_params;
866         uint8_t dev_id = ts_params->valid_devs[0];
867         struct rte_cryptodev_info dev_info;
868         const enum rte_crypto_cipher_algorithm ciphers[] = {
869                 RTE_CRYPTO_CIPHER_AES_DOCSISBPI
870         };
871
872         rte_cryptodev_info_get(dev_id, &dev_info);
873
874         if (!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYMMETRIC_CRYPTO) ||
875                         !(dev_info.feature_flags &
876                         RTE_CRYPTODEV_FF_SECURITY)) {
877                 RTE_LOG(INFO, USER1, "Feature flag requirements for Docsis "
878                                 "Proto testsuite not met\n");
879                 return TEST_SKIPPED;
880         }
881
882         if (check_cipher_capabilities_supported(ciphers, RTE_DIM(ciphers)) != 0) {
883                 RTE_LOG(INFO, USER1, "Capability requirements for Docsis Proto "
884                                 "testsuite not met\n");
885                 return TEST_SKIPPED;
886         }
887
888         return 0;
889 }
890 #endif
891
892 static int
893 aes_ccm_auth_testsuite_setup(void)
894 {
895         struct crypto_testsuite_params *ts_params = &testsuite_params;
896         uint8_t dev_id = ts_params->valid_devs[0];
897         struct rte_cryptodev_info dev_info;
898         const enum rte_crypto_aead_algorithm aeads[] = {
899                 RTE_CRYPTO_AEAD_AES_CCM
900         };
901
902         rte_cryptodev_info_get(dev_id, &dev_info);
903
904         if (!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYMMETRIC_CRYPTO) ||
905                         ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
906                         !(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
907                 RTE_LOG(INFO, USER1, "Feature flag requirements for AES CCM "
908                                 "testsuite not met\n");
909                 return TEST_SKIPPED;
910         }
911
912         if (check_aead_capabilities_supported(aeads, RTE_DIM(aeads)) != 0) {
913                 RTE_LOG(INFO, USER1, "Capability requirements for AES CCM "
914                                 "testsuite not met\n");
915                 return TEST_SKIPPED;
916         }
917
918         return 0;
919 }
920
921 static int
922 aes_gcm_auth_testsuite_setup(void)
923 {
924         struct crypto_testsuite_params *ts_params = &testsuite_params;
925         uint8_t dev_id = ts_params->valid_devs[0];
926         struct rte_cryptodev_info dev_info;
927         const enum rte_crypto_aead_algorithm aeads[] = {
928                 RTE_CRYPTO_AEAD_AES_GCM
929         };
930
931         rte_cryptodev_info_get(dev_id, &dev_info);
932
933         if (!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYMMETRIC_CRYPTO)) {
934                 RTE_LOG(INFO, USER1, "Feature flag requirements for AES GCM "
935                                 "testsuite not met\n");
936                 return TEST_SKIPPED;
937         }
938
939         if (check_aead_capabilities_supported(aeads, RTE_DIM(aeads)) != 0) {
940                 RTE_LOG(INFO, USER1, "Capability requirements for AES GCM "
941                                 "testsuite not met\n");
942                 return TEST_SKIPPED;
943         }
944
945         return 0;
946 }
947
948 static int
949 aes_gmac_auth_testsuite_setup(void)
950 {
951         struct crypto_testsuite_params *ts_params = &testsuite_params;
952         uint8_t dev_id = ts_params->valid_devs[0];
953         struct rte_cryptodev_info dev_info;
954         const enum rte_crypto_auth_algorithm auths[] = {
955                 RTE_CRYPTO_AUTH_AES_GMAC
956         };
957
958         rte_cryptodev_info_get(dev_id, &dev_info);
959
960         if (!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYMMETRIC_CRYPTO) ||
961                         ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
962                         !(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
963                 RTE_LOG(INFO, USER1, "Feature flag requirements for AES GMAC "
964                                 "testsuite not met\n");
965                 return TEST_SKIPPED;
966         }
967
968         if (check_auth_capabilities_supported(auths, RTE_DIM(auths)) != 0) {
969                 RTE_LOG(INFO, USER1, "Capability requirements for AES GMAC "
970                                 "testsuite not met\n");
971                 return TEST_SKIPPED;
972         }
973
974         return 0;
975 }
976
977 static int
978 chacha20_poly1305_testsuite_setup(void)
979 {
980         struct crypto_testsuite_params *ts_params = &testsuite_params;
981         uint8_t dev_id = ts_params->valid_devs[0];
982         struct rte_cryptodev_info dev_info;
983         const enum rte_crypto_aead_algorithm aeads[] = {
984                 RTE_CRYPTO_AEAD_CHACHA20_POLY1305
985         };
986
987         rte_cryptodev_info_get(dev_id, &dev_info);
988
989         if (!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYMMETRIC_CRYPTO) ||
990                         ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
991                         !(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
992                 RTE_LOG(INFO, USER1, "Feature flag requirements for "
993                                 "Chacha20-Poly1305 testsuite not met\n");
994                 return TEST_SKIPPED;
995         }
996
997         if (check_aead_capabilities_supported(aeads, RTE_DIM(aeads)) != 0) {
998                 RTE_LOG(INFO, USER1, "Capability requirements for "
999                                 "Chacha20-Poly1305 testsuite not met\n");
1000                 return TEST_SKIPPED;
1001         }
1002
1003         return 0;
1004 }
1005
1006 static int
1007 snow3g_testsuite_setup(void)
1008 {
1009         struct crypto_testsuite_params *ts_params = &testsuite_params;
1010         uint8_t dev_id = ts_params->valid_devs[0];
1011         struct rte_cryptodev_info dev_info;
1012         const enum rte_crypto_cipher_algorithm ciphers[] = {
1013                 RTE_CRYPTO_CIPHER_SNOW3G_UEA2
1014
1015         };
1016         const enum rte_crypto_auth_algorithm auths[] = {
1017                 RTE_CRYPTO_AUTH_SNOW3G_UIA2
1018         };
1019
1020         rte_cryptodev_info_get(dev_id, &dev_info);
1021
1022         if (!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYMMETRIC_CRYPTO)) {
1023                 RTE_LOG(INFO, USER1, "Feature flag requirements for Snow3G "
1024                                 "testsuite not met\n");
1025                 return TEST_SKIPPED;
1026         }
1027
1028         if (check_cipher_capabilities_supported(ciphers, RTE_DIM(ciphers)) != 0
1029                         && check_auth_capabilities_supported(auths,
1030                         RTE_DIM(auths)) != 0) {
1031                 RTE_LOG(INFO, USER1, "Capability requirements for Snow3G "
1032                                 "testsuite not met\n");
1033                 return TEST_SKIPPED;
1034         }
1035
1036         return 0;
1037 }
1038
1039 static int
1040 zuc_testsuite_setup(void)
1041 {
1042         struct crypto_testsuite_params *ts_params = &testsuite_params;
1043         uint8_t dev_id = ts_params->valid_devs[0];
1044         struct rte_cryptodev_info dev_info;
1045         const enum rte_crypto_cipher_algorithm ciphers[] = {
1046                 RTE_CRYPTO_CIPHER_ZUC_EEA3
1047         };
1048         const enum rte_crypto_auth_algorithm auths[] = {
1049                 RTE_CRYPTO_AUTH_ZUC_EIA3
1050         };
1051
1052         rte_cryptodev_info_get(dev_id, &dev_info);
1053
1054         if (!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYMMETRIC_CRYPTO)) {
1055                 RTE_LOG(INFO, USER1, "Feature flag requirements for ZUC "
1056                                 "testsuite not met\n");
1057                 return TEST_SKIPPED;
1058         }
1059
1060         if (check_cipher_capabilities_supported(ciphers, RTE_DIM(ciphers)) != 0
1061                         && check_auth_capabilities_supported(auths,
1062                         RTE_DIM(auths)) != 0) {
1063                 RTE_LOG(INFO, USER1, "Capability requirements for ZUC "
1064                                 "testsuite not met\n");
1065                 return TEST_SKIPPED;
1066         }
1067
1068         return 0;
1069 }
1070
1071 static int
1072 hmac_md5_auth_testsuite_setup(void)
1073 {
1074         struct crypto_testsuite_params *ts_params = &testsuite_params;
1075         uint8_t dev_id = ts_params->valid_devs[0];
1076         struct rte_cryptodev_info dev_info;
1077         const enum rte_crypto_auth_algorithm auths[] = {
1078                 RTE_CRYPTO_AUTH_MD5_HMAC
1079         };
1080
1081         rte_cryptodev_info_get(dev_id, &dev_info);
1082
1083         if (!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYMMETRIC_CRYPTO) ||
1084                         ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
1085                         !(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
1086                 RTE_LOG(INFO, USER1, "Feature flag requirements for HMAC MD5 "
1087                                 "Auth testsuite not met\n");
1088                 return TEST_SKIPPED;
1089         }
1090
1091         if (check_auth_capabilities_supported(auths, RTE_DIM(auths)) != 0) {
1092                 RTE_LOG(INFO, USER1, "Capability requirements for HMAC MD5 "
1093                                 "testsuite not met\n");
1094                 return TEST_SKIPPED;
1095         }
1096
1097         return 0;
1098 }
1099
1100 static int
1101 kasumi_testsuite_setup(void)
1102 {
1103         struct crypto_testsuite_params *ts_params = &testsuite_params;
1104         uint8_t dev_id = ts_params->valid_devs[0];
1105         struct rte_cryptodev_info dev_info;
1106         const enum rte_crypto_cipher_algorithm ciphers[] = {
1107                 RTE_CRYPTO_CIPHER_KASUMI_F8
1108         };
1109         const enum rte_crypto_auth_algorithm auths[] = {
1110                 RTE_CRYPTO_AUTH_KASUMI_F9
1111         };
1112
1113         rte_cryptodev_info_get(dev_id, &dev_info);
1114
1115         if (!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYMMETRIC_CRYPTO) ||
1116                         ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
1117                         !(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
1118                 RTE_LOG(INFO, USER1, "Feature flag requirements for Kasumi "
1119                                 "testsuite not met\n");
1120                 return TEST_SKIPPED;
1121         }
1122
1123         if (check_cipher_capabilities_supported(ciphers, RTE_DIM(ciphers)) != 0
1124                         && check_auth_capabilities_supported(auths,
1125                         RTE_DIM(auths)) != 0) {
1126                 RTE_LOG(INFO, USER1, "Capability requirements for Kasumi "
1127                                 "testsuite not met\n");
1128                 return TEST_SKIPPED;
1129         }
1130
1131         return 0;
1132 }
1133
1134 static int
1135 negative_aes_gcm_testsuite_setup(void)
1136 {
1137         struct crypto_testsuite_params *ts_params = &testsuite_params;
1138         uint8_t dev_id = ts_params->valid_devs[0];
1139         struct rte_cryptodev_info dev_info;
1140         const enum rte_crypto_aead_algorithm aeads[] = {
1141                 RTE_CRYPTO_AEAD_AES_GCM
1142         };
1143
1144         rte_cryptodev_info_get(dev_id, &dev_info);
1145
1146         if (!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYMMETRIC_CRYPTO) ||
1147                         ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
1148                         !(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
1149                 RTE_LOG(INFO, USER1, "Feature flag requirements for Negative "
1150                                 "AES GCM testsuite not met\n");
1151                 return TEST_SKIPPED;
1152         }
1153
1154         if (check_aead_capabilities_supported(aeads, RTE_DIM(aeads)) != 0) {
1155                 RTE_LOG(INFO, USER1, "Capability requirements for Negative "
1156                                 "AES GCM testsuite not met\n");
1157                 return TEST_SKIPPED;
1158         }
1159
1160         return 0;
1161 }
1162
1163 static int
1164 negative_aes_gmac_testsuite_setup(void)
1165 {
1166         struct crypto_testsuite_params *ts_params = &testsuite_params;
1167         uint8_t dev_id = ts_params->valid_devs[0];
1168         struct rte_cryptodev_info dev_info;
1169         const enum rte_crypto_auth_algorithm auths[] = {
1170                 RTE_CRYPTO_AUTH_AES_GMAC
1171         };
1172
1173         rte_cryptodev_info_get(dev_id, &dev_info);
1174
1175         if (!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYMMETRIC_CRYPTO) ||
1176                         ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
1177                         !(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
1178                 RTE_LOG(INFO, USER1, "Feature flag requirements for Negative "
1179                                 "AES GMAC testsuite not met\n");
1180                 return TEST_SKIPPED;
1181         }
1182
1183         if (check_auth_capabilities_supported(auths, RTE_DIM(auths)) != 0) {
1184                 RTE_LOG(INFO, USER1, "Capability requirements for Negative "
1185                                 "AES GMAC testsuite not met\n");
1186                 return TEST_SKIPPED;
1187         }
1188
1189         return 0;
1190 }
1191
1192 static int
1193 mixed_cipher_hash_testsuite_setup(void)
1194 {
1195         struct crypto_testsuite_params *ts_params = &testsuite_params;
1196         uint8_t dev_id = ts_params->valid_devs[0];
1197         struct rte_cryptodev_info dev_info;
1198         uint64_t feat_flags;
1199         const enum rte_crypto_cipher_algorithm ciphers[] = {
1200                 RTE_CRYPTO_CIPHER_NULL,
1201                 RTE_CRYPTO_CIPHER_AES_CTR,
1202                 RTE_CRYPTO_CIPHER_ZUC_EEA3,
1203                 RTE_CRYPTO_CIPHER_SNOW3G_UEA2
1204         };
1205         const enum rte_crypto_auth_algorithm auths[] = {
1206                 RTE_CRYPTO_AUTH_NULL,
1207                 RTE_CRYPTO_AUTH_SNOW3G_UIA2,
1208                 RTE_CRYPTO_AUTH_AES_CMAC,
1209                 RTE_CRYPTO_AUTH_ZUC_EIA3
1210         };
1211
1212         rte_cryptodev_info_get(dev_id, &dev_info);
1213         feat_flags = dev_info.feature_flags;
1214
1215         if (!(feat_flags & RTE_CRYPTODEV_FF_SYMMETRIC_CRYPTO) ||
1216                         (global_api_test_type == CRYPTODEV_RAW_API_TEST)) {
1217                 RTE_LOG(INFO, USER1, "Feature flag requirements for Mixed "
1218                                 "Cipher Hash testsuite not met\n");
1219                 return TEST_SKIPPED;
1220         }
1221
1222         if (check_cipher_capabilities_supported(ciphers, RTE_DIM(ciphers)) != 0
1223                         && check_auth_capabilities_supported(auths,
1224                         RTE_DIM(auths)) != 0) {
1225                 RTE_LOG(INFO, USER1, "Capability requirements for Mixed "
1226                                 "Cipher Hash testsuite not met\n");
1227                 return TEST_SKIPPED;
1228         }
1229
1230         return 0;
1231 }
1232
1233 static int
1234 esn_testsuite_setup(void)
1235 {
1236         struct crypto_testsuite_params *ts_params = &testsuite_params;
1237         uint8_t dev_id = ts_params->valid_devs[0];
1238         struct rte_cryptodev_info dev_info;
1239         const enum rte_crypto_cipher_algorithm ciphers[] = {
1240                 RTE_CRYPTO_CIPHER_AES_CBC
1241         };
1242         const enum rte_crypto_auth_algorithm auths[] = {
1243                 RTE_CRYPTO_AUTH_SHA1_HMAC
1244         };
1245
1246         rte_cryptodev_info_get(dev_id, &dev_info);
1247
1248         if (!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYMMETRIC_CRYPTO) ||
1249                         ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
1250                         !(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
1251                 RTE_LOG(INFO, USER1, "Feature flag requirements for ESN "
1252                                 "testsuite not met\n");
1253                 return TEST_SKIPPED;
1254         }
1255
1256         if (check_cipher_capabilities_supported(ciphers, RTE_DIM(ciphers)) != 0
1257                         && check_auth_capabilities_supported(auths,
1258                         RTE_DIM(auths)) != 0) {
1259                 RTE_LOG(INFO, USER1, "Capability requirements for ESN "
1260                                 "testsuite not met\n");
1261                 return TEST_SKIPPED;
1262         }
1263
1264         return 0;
1265 }
1266
1267 static int
1268 multi_session_testsuite_setup(void)
1269 {
1270         struct crypto_testsuite_params *ts_params = &testsuite_params;
1271         uint8_t dev_id = ts_params->valid_devs[0];
1272         struct rte_cryptodev_info dev_info;
1273         const enum rte_crypto_cipher_algorithm ciphers[] = {
1274                 RTE_CRYPTO_CIPHER_AES_CBC
1275         };
1276         const enum rte_crypto_auth_algorithm auths[] = {
1277                 RTE_CRYPTO_AUTH_SHA512_HMAC
1278         };
1279
1280         rte_cryptodev_info_get(dev_id, &dev_info);
1281
1282         if (!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYMMETRIC_CRYPTO)) {
1283                 RTE_LOG(INFO, USER1, "Feature flag requirements for Multi "
1284                                 "Session testsuite not met\n");
1285                 return TEST_SKIPPED;
1286         }
1287
1288         if (check_cipher_capabilities_supported(ciphers, RTE_DIM(ciphers)) != 0
1289                         && check_auth_capabilities_supported(auths,
1290                         RTE_DIM(auths)) != 0) {
1291                 RTE_LOG(INFO, USER1, "Capability requirements for Multi "
1292                                 "Session testsuite not met\n");
1293                 return TEST_SKIPPED;
1294         }
1295
1296         return 0;
1297 }
1298
1299 static int
1300 negative_hmac_sha1_testsuite_setup(void)
1301 {
1302         struct crypto_testsuite_params *ts_params = &testsuite_params;
1303         uint8_t dev_id = ts_params->valid_devs[0];
1304         struct rte_cryptodev_info dev_info;
1305         const enum rte_crypto_cipher_algorithm ciphers[] = {
1306                 RTE_CRYPTO_CIPHER_AES_CBC
1307         };
1308         const enum rte_crypto_auth_algorithm auths[] = {
1309                 RTE_CRYPTO_AUTH_SHA1_HMAC
1310         };
1311
1312         rte_cryptodev_info_get(dev_id, &dev_info);
1313
1314         if (!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYMMETRIC_CRYPTO) ||
1315                         ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
1316                         !(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
1317                 RTE_LOG(INFO, USER1, "Feature flag requirements for Negative "
1318                                 "HMAC SHA1 testsuite not met\n");
1319                 return TEST_SKIPPED;
1320         }
1321
1322         if (check_cipher_capabilities_supported(ciphers, RTE_DIM(ciphers)) != 0
1323                         && check_auth_capabilities_supported(auths,
1324                         RTE_DIM(auths)) != 0) {
1325                 RTE_LOG(INFO, USER1, "Capability requirements for Negative "
1326                                 "HMAC SHA1 testsuite not met\n");
1327                 return TEST_SKIPPED;
1328         }
1329
1330         return 0;
1331 }
1332
1333 static int
1334 dev_configure_and_start(uint64_t ff_disable)
1335 {
1336         struct crypto_testsuite_params *ts_params = &testsuite_params;
1337         struct crypto_unittest_params *ut_params = &unittest_params;
1338
1339         uint16_t qp_id;
1340
1341         /* Clear unit test parameters before running test */
1342         memset(ut_params, 0, sizeof(*ut_params));
1343
1344         /* Reconfigure device to default parameters */
1345         ts_params->conf.socket_id = SOCKET_ID_ANY;
1346         ts_params->conf.ff_disable = ff_disable;
1347         ts_params->qp_conf.nb_descriptors = MAX_NUM_OPS_INFLIGHT;
1348         ts_params->qp_conf.mp_session = ts_params->session_mpool;
1349         ts_params->qp_conf.mp_session_private = ts_params->session_priv_mpool;
1350
1351         TEST_ASSERT_SUCCESS(rte_cryptodev_configure(ts_params->valid_devs[0],
1352                         &ts_params->conf),
1353                         "Failed to configure cryptodev %u",
1354                         ts_params->valid_devs[0]);
1355
1356         for (qp_id = 0; qp_id < ts_params->conf.nb_queue_pairs ; qp_id++) {
1357                 TEST_ASSERT_SUCCESS(rte_cryptodev_queue_pair_setup(
1358                         ts_params->valid_devs[0], qp_id,
1359                         &ts_params->qp_conf,
1360                         rte_cryptodev_socket_id(ts_params->valid_devs[0])),
1361                         "Failed to setup queue pair %u on cryptodev %u",
1362                         qp_id, ts_params->valid_devs[0]);
1363         }
1364
1365
1366         rte_cryptodev_stats_reset(ts_params->valid_devs[0]);
1367
1368         /* Start the device */
1369         TEST_ASSERT_SUCCESS(rte_cryptodev_start(ts_params->valid_devs[0]),
1370                         "Failed to start cryptodev %u",
1371                         ts_params->valid_devs[0]);
1372
1373         return TEST_SUCCESS;
1374 }
1375
1376 int
1377 ut_setup(void)
1378 {
1379         /* Configure and start the device with security feature disabled */
1380         return dev_configure_and_start(RTE_CRYPTODEV_FF_SECURITY);
1381 }
1382
1383 static int
1384 ut_setup_security(void)
1385 {
1386         /* Configure and start the device with no features disabled */
1387         return dev_configure_and_start(0);
1388 }
1389
1390 void
1391 ut_teardown(void)
1392 {
1393         struct crypto_testsuite_params *ts_params = &testsuite_params;
1394         struct crypto_unittest_params *ut_params = &unittest_params;
1395         struct rte_cryptodev_stats stats;
1396
1397         /* free crypto session structure */
1398 #ifdef RTE_LIB_SECURITY
1399         if (ut_params->type == RTE_SECURITY_ACTION_TYPE_LOOKASIDE_PROTOCOL) {
1400                 if (ut_params->sec_session) {
1401                         rte_security_session_destroy(rte_cryptodev_get_sec_ctx
1402                                                 (ts_params->valid_devs[0]),
1403                                                 ut_params->sec_session);
1404                         ut_params->sec_session = NULL;
1405                 }
1406         } else
1407 #endif
1408         {
1409                 if (ut_params->sess) {
1410                         rte_cryptodev_sym_session_clear(
1411                                         ts_params->valid_devs[0],
1412                                         ut_params->sess);
1413                         rte_cryptodev_sym_session_free(ut_params->sess);
1414                         ut_params->sess = NULL;
1415                 }
1416         }
1417
1418         /* free crypto operation structure */
1419         if (ut_params->op)
1420                 rte_crypto_op_free(ut_params->op);
1421
1422         /*
1423          * free mbuf - both obuf and ibuf are usually the same,
1424          * so check if they point at the same address is necessary,
1425          * to avoid freeing the mbuf twice.
1426          */
1427         if (ut_params->obuf) {
1428                 rte_pktmbuf_free(ut_params->obuf);
1429                 if (ut_params->ibuf == ut_params->obuf)
1430                         ut_params->ibuf = 0;
1431                 ut_params->obuf = 0;
1432         }
1433         if (ut_params->ibuf) {
1434                 rte_pktmbuf_free(ut_params->ibuf);
1435                 ut_params->ibuf = 0;
1436         }
1437
1438         if (ts_params->mbuf_pool != NULL)
1439                 RTE_LOG(DEBUG, USER1, "CRYPTO_MBUFPOOL count %u\n",
1440                         rte_mempool_avail_count(ts_params->mbuf_pool));
1441
1442         rte_cryptodev_stats_get(ts_params->valid_devs[0], &stats);
1443
1444         /* Stop the device */
1445         rte_cryptodev_stop(ts_params->valid_devs[0]);
1446 }
1447
1448 static int
1449 test_device_configure_invalid_dev_id(void)
1450 {
1451         struct crypto_testsuite_params *ts_params = &testsuite_params;
1452         uint16_t dev_id, num_devs = 0;
1453
1454         TEST_ASSERT((num_devs = rte_cryptodev_count()) >= 1,
1455                         "Need at least %d devices for test", 1);
1456
1457         /* valid dev_id values */
1458         dev_id = ts_params->valid_devs[0];
1459
1460         /* Stop the device in case it's started so it can be configured */
1461         rte_cryptodev_stop(dev_id);
1462
1463         TEST_ASSERT_SUCCESS(rte_cryptodev_configure(dev_id, &ts_params->conf),
1464                         "Failed test for rte_cryptodev_configure: "
1465                         "invalid dev_num %u", dev_id);
1466
1467         /* invalid dev_id values */
1468         dev_id = num_devs;
1469
1470         TEST_ASSERT_FAIL(rte_cryptodev_configure(dev_id, &ts_params->conf),
1471                         "Failed test for rte_cryptodev_configure: "
1472                         "invalid dev_num %u", dev_id);
1473
1474         dev_id = 0xff;
1475
1476         TEST_ASSERT_FAIL(rte_cryptodev_configure(dev_id, &ts_params->conf),
1477                         "Failed test for rte_cryptodev_configure:"
1478                         "invalid dev_num %u", dev_id);
1479
1480         return TEST_SUCCESS;
1481 }
1482
1483 static int
1484 test_device_configure_invalid_queue_pair_ids(void)
1485 {
1486         struct crypto_testsuite_params *ts_params = &testsuite_params;
1487         uint16_t orig_nb_qps = ts_params->conf.nb_queue_pairs;
1488
1489         /* Stop the device in case it's started so it can be configured */
1490         rte_cryptodev_stop(ts_params->valid_devs[0]);
1491
1492         /* valid - max value queue pairs */
1493         ts_params->conf.nb_queue_pairs = orig_nb_qps;
1494
1495         TEST_ASSERT_SUCCESS(rte_cryptodev_configure(ts_params->valid_devs[0],
1496                         &ts_params->conf),
1497                         "Failed to configure cryptodev: dev_id %u, qp_id %u",
1498                         ts_params->valid_devs[0], ts_params->conf.nb_queue_pairs);
1499
1500         /* valid - one queue pairs */
1501         ts_params->conf.nb_queue_pairs = 1;
1502
1503         TEST_ASSERT_SUCCESS(rte_cryptodev_configure(ts_params->valid_devs[0],
1504                         &ts_params->conf),
1505                         "Failed to configure cryptodev: dev_id %u, qp_id %u",
1506                         ts_params->valid_devs[0],
1507                         ts_params->conf.nb_queue_pairs);
1508
1509
1510         /* invalid - zero queue pairs */
1511         ts_params->conf.nb_queue_pairs = 0;
1512
1513         TEST_ASSERT_FAIL(rte_cryptodev_configure(ts_params->valid_devs[0],
1514                         &ts_params->conf),
1515                         "Failed test for rte_cryptodev_configure, dev_id %u,"
1516                         " invalid qps: %u",
1517                         ts_params->valid_devs[0],
1518                         ts_params->conf.nb_queue_pairs);
1519
1520
1521         /* invalid - max value supported by field queue pairs */
1522         ts_params->conf.nb_queue_pairs = UINT16_MAX;
1523
1524         TEST_ASSERT_FAIL(rte_cryptodev_configure(ts_params->valid_devs[0],
1525                         &ts_params->conf),
1526                         "Failed test for rte_cryptodev_configure, dev_id %u,"
1527                         " invalid qps: %u",
1528                         ts_params->valid_devs[0],
1529                         ts_params->conf.nb_queue_pairs);
1530
1531
1532         /* invalid - max value + 1 queue pairs */
1533         ts_params->conf.nb_queue_pairs = orig_nb_qps + 1;
1534
1535         TEST_ASSERT_FAIL(rte_cryptodev_configure(ts_params->valid_devs[0],
1536                         &ts_params->conf),
1537                         "Failed test for rte_cryptodev_configure, dev_id %u,"
1538                         " invalid qps: %u",
1539                         ts_params->valid_devs[0],
1540                         ts_params->conf.nb_queue_pairs);
1541
1542         /* revert to original testsuite value */
1543         ts_params->conf.nb_queue_pairs = orig_nb_qps;
1544
1545         return TEST_SUCCESS;
1546 }
1547
1548 static int
1549 test_queue_pair_descriptor_setup(void)
1550 {
1551         struct crypto_testsuite_params *ts_params = &testsuite_params;
1552         struct rte_cryptodev_qp_conf qp_conf = {
1553                 .nb_descriptors = MAX_NUM_OPS_INFLIGHT
1554         };
1555         uint16_t qp_id;
1556
1557         /* Stop the device in case it's started so it can be configured */
1558         rte_cryptodev_stop(ts_params->valid_devs[0]);
1559
1560         TEST_ASSERT_SUCCESS(rte_cryptodev_configure(ts_params->valid_devs[0],
1561                         &ts_params->conf),
1562                         "Failed to configure cryptodev %u",
1563                         ts_params->valid_devs[0]);
1564
1565         /*
1566          * Test various ring sizes on this device. memzones can't be
1567          * freed so are re-used if ring is released and re-created.
1568          */
1569         qp_conf.nb_descriptors = MIN_NUM_OPS_INFLIGHT; /* min size*/
1570         qp_conf.mp_session = ts_params->session_mpool;
1571         qp_conf.mp_session_private = ts_params->session_priv_mpool;
1572
1573         for (qp_id = 0; qp_id < ts_params->conf.nb_queue_pairs; qp_id++) {
1574                 TEST_ASSERT_SUCCESS(rte_cryptodev_queue_pair_setup(
1575                                 ts_params->valid_devs[0], qp_id, &qp_conf,
1576                                 rte_cryptodev_socket_id(
1577                                                 ts_params->valid_devs[0])),
1578                                 "Failed test for "
1579                                 "rte_cryptodev_queue_pair_setup: num_inflights "
1580                                 "%u on qp %u on cryptodev %u",
1581                                 qp_conf.nb_descriptors, qp_id,
1582                                 ts_params->valid_devs[0]);
1583         }
1584
1585         qp_conf.nb_descriptors = (uint32_t)(MAX_NUM_OPS_INFLIGHT / 2);
1586
1587         for (qp_id = 0; qp_id < ts_params->conf.nb_queue_pairs; qp_id++) {
1588                 TEST_ASSERT_SUCCESS(rte_cryptodev_queue_pair_setup(
1589                                 ts_params->valid_devs[0], qp_id, &qp_conf,
1590                                 rte_cryptodev_socket_id(
1591                                                 ts_params->valid_devs[0])),
1592                                 "Failed test for"
1593                                 " rte_cryptodev_queue_pair_setup: num_inflights"
1594                                 " %u on qp %u on cryptodev %u",
1595                                 qp_conf.nb_descriptors, qp_id,
1596                                 ts_params->valid_devs[0]);
1597         }
1598
1599         qp_conf.nb_descriptors = MAX_NUM_OPS_INFLIGHT; /* valid */
1600
1601         for (qp_id = 0; qp_id < ts_params->conf.nb_queue_pairs; qp_id++) {
1602                 TEST_ASSERT_SUCCESS(rte_cryptodev_queue_pair_setup(
1603                                 ts_params->valid_devs[0], qp_id, &qp_conf,
1604                                 rte_cryptodev_socket_id(
1605                                                 ts_params->valid_devs[0])),
1606                                 "Failed test for "
1607                                 "rte_cryptodev_queue_pair_setup: num_inflights"
1608                                 " %u on qp %u on cryptodev %u",
1609                                 qp_conf.nb_descriptors, qp_id,
1610                                 ts_params->valid_devs[0]);
1611         }
1612
1613         qp_conf.nb_descriptors = DEFAULT_NUM_OPS_INFLIGHT;
1614
1615         for (qp_id = 0; qp_id < ts_params->conf.nb_queue_pairs; qp_id++) {
1616                 TEST_ASSERT_SUCCESS(rte_cryptodev_queue_pair_setup(
1617                                 ts_params->valid_devs[0], qp_id, &qp_conf,
1618                                 rte_cryptodev_socket_id(
1619                                                 ts_params->valid_devs[0])),
1620                                 "Failed test for"
1621                                 " rte_cryptodev_queue_pair_setup:"
1622                                 "num_inflights %u on qp %u on cryptodev %u",
1623                                 qp_conf.nb_descriptors, qp_id,
1624                                 ts_params->valid_devs[0]);
1625         }
1626
1627         /* test invalid queue pair id */
1628         qp_conf.nb_descriptors = DEFAULT_NUM_OPS_INFLIGHT;      /*valid */
1629
1630         qp_id = ts_params->conf.nb_queue_pairs;         /*invalid */
1631
1632         TEST_ASSERT_FAIL(rte_cryptodev_queue_pair_setup(
1633                         ts_params->valid_devs[0],
1634                         qp_id, &qp_conf,
1635                         rte_cryptodev_socket_id(ts_params->valid_devs[0])),
1636                         "Failed test for rte_cryptodev_queue_pair_setup:"
1637                         "invalid qp %u on cryptodev %u",
1638                         qp_id, ts_params->valid_devs[0]);
1639
1640         qp_id = 0xffff; /*invalid*/
1641
1642         TEST_ASSERT_FAIL(rte_cryptodev_queue_pair_setup(
1643                         ts_params->valid_devs[0],
1644                         qp_id, &qp_conf,
1645                         rte_cryptodev_socket_id(ts_params->valid_devs[0])),
1646                         "Failed test for rte_cryptodev_queue_pair_setup:"
1647                         "invalid qp %u on cryptodev %u",
1648                         qp_id, ts_params->valid_devs[0]);
1649
1650         return TEST_SUCCESS;
1651 }
1652
1653 /* ***** Plaintext data for tests ***** */
1654
1655 const char catch_22_quote_1[] =
1656                 "There was only one catch and that was Catch-22, which "
1657                 "specified that a concern for one's safety in the face of "
1658                 "dangers that were real and immediate was the process of a "
1659                 "rational mind. Orr was crazy and could be grounded. All he "
1660                 "had to do was ask; and as soon as he did, he would no longer "
1661                 "be crazy and would have to fly more missions. Orr would be "
1662                 "crazy to fly more missions and sane if he didn't, but if he "
1663                 "was sane he had to fly them. If he flew them he was crazy "
1664                 "and didn't have to; but if he didn't want to he was sane and "
1665                 "had to. Yossarian was moved very deeply by the absolute "
1666                 "simplicity of this clause of Catch-22 and let out a "
1667                 "respectful whistle. \"That's some catch, that Catch-22\", he "
1668                 "observed. \"It's the best there is,\" Doc Daneeka agreed.";
1669
1670 const char catch_22_quote[] =
1671                 "What a lousy earth! He wondered how many people were "
1672                 "destitute that same night even in his own prosperous country, "
1673                 "how many homes were shanties, how many husbands were drunk "
1674                 "and wives socked, and how many children were bullied, abused, "
1675                 "or abandoned. How many families hungered for food they could "
1676                 "not afford to buy? How many hearts were broken? How many "
1677                 "suicides would take place that same night, how many people "
1678                 "would go insane? How many cockroaches and landlords would "
1679                 "triumph? How many winners were losers, successes failures, "
1680                 "and rich men poor men? How many wise guys were stupid? How "
1681                 "many happy endings were unhappy endings? How many honest men "
1682                 "were liars, brave men cowards, loyal men traitors, how many "
1683                 "sainted men were corrupt, how many people in positions of "
1684                 "trust had sold their souls to bodyguards, how many had never "
1685                 "had souls? How many straight-and-narrow paths were crooked "
1686                 "paths? How many best families were worst families and how "
1687                 "many good people were bad people? When you added them all up "
1688                 "and then subtracted, you might be left with only the children, "
1689                 "and perhaps with Albert Einstein and an old violinist or "
1690                 "sculptor somewhere.";
1691
1692 #define QUOTE_480_BYTES         (480)
1693 #define QUOTE_512_BYTES         (512)
1694 #define QUOTE_768_BYTES         (768)
1695 #define QUOTE_1024_BYTES        (1024)
1696
1697
1698
1699 /* ***** SHA1 Hash Tests ***** */
1700
1701 #define HMAC_KEY_LENGTH_SHA1    (DIGEST_BYTE_LENGTH_SHA1)
1702
1703 static uint8_t hmac_sha1_key[] = {
1704         0xF8, 0x2A, 0xC7, 0x54, 0xDB, 0x96, 0x18, 0xAA,
1705         0xC3, 0xA1, 0x53, 0xF6, 0x1F, 0x17, 0x60, 0xBD,
1706         0xDE, 0xF4, 0xDE, 0xAD };
1707
1708 /* ***** SHA224 Hash Tests ***** */
1709
1710 #define HMAC_KEY_LENGTH_SHA224  (DIGEST_BYTE_LENGTH_SHA224)
1711
1712
1713 /* ***** AES-CBC Cipher Tests ***** */
1714
1715 #define CIPHER_KEY_LENGTH_AES_CBC       (16)
1716 #define CIPHER_IV_LENGTH_AES_CBC        (CIPHER_KEY_LENGTH_AES_CBC)
1717
1718 static uint8_t aes_cbc_key[] = {
1719         0xE4, 0x23, 0x33, 0x8A, 0x35, 0x64, 0x61, 0xE2,
1720         0x49, 0x03, 0xDD, 0xC6, 0xB8, 0xCA, 0x55, 0x7A };
1721
1722 static uint8_t aes_cbc_iv[] = {
1723         0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
1724         0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f };
1725
1726
1727 /* ***** AES-CBC / HMAC-SHA1 Hash Tests ***** */
1728
1729 static const uint8_t catch_22_quote_2_512_bytes_AES_CBC_ciphertext[] = {
1730         0x8B, 0x4D, 0xDA, 0x1B, 0xCF, 0x04, 0xA0, 0x31,
1731         0xB4, 0xBF, 0xBD, 0x68, 0x43, 0x20, 0x7E, 0x76,
1732         0xB1, 0x96, 0x8B, 0xA2, 0x7C, 0xA2, 0x83, 0x9E,
1733         0x39, 0x5A, 0x2F, 0x7E, 0x92, 0xB4, 0x48, 0x1A,
1734         0x3F, 0x6B, 0x5D, 0xDF, 0x52, 0x85, 0x5F, 0x8E,
1735         0x42, 0x3C, 0xFB, 0xE9, 0x1A, 0x24, 0xD6, 0x08,
1736         0xDD, 0xFD, 0x16, 0xFB, 0xE9, 0x55, 0xEF, 0xF0,
1737         0xA0, 0x8D, 0x13, 0xAB, 0x81, 0xC6, 0x90, 0x01,
1738         0xB5, 0x18, 0x84, 0xB3, 0xF6, 0xE6, 0x11, 0x57,
1739         0xD6, 0x71, 0xC6, 0x3C, 0x3F, 0x2F, 0x33, 0xEE,
1740         0x24, 0x42, 0x6E, 0xAC, 0x0B, 0xCA, 0xEC, 0xF9,
1741         0x84, 0xF8, 0x22, 0xAA, 0x60, 0xF0, 0x32, 0xA9,
1742         0x75, 0x75, 0x3B, 0xCB, 0x70, 0x21, 0x0A, 0x8D,
1743         0x0F, 0xE0, 0xC4, 0x78, 0x2B, 0xF8, 0x97, 0xE3,
1744         0xE4, 0x26, 0x4B, 0x29, 0xDA, 0x88, 0xCD, 0x46,
1745         0xEC, 0xAA, 0xF9, 0x7F, 0xF1, 0x15, 0xEA, 0xC3,
1746         0x87, 0xE6, 0x31, 0xF2, 0xCF, 0xDE, 0x4D, 0x80,
1747         0x70, 0x91, 0x7E, 0x0C, 0xF7, 0x26, 0x3A, 0x92,
1748         0x4F, 0x18, 0x83, 0xC0, 0x8F, 0x59, 0x01, 0xA5,
1749         0x88, 0xD1, 0xDB, 0x26, 0x71, 0x27, 0x16, 0xF5,
1750         0xEE, 0x10, 0x82, 0xAC, 0x68, 0x26, 0x9B, 0xE2,
1751         0x6D, 0xD8, 0x9A, 0x80, 0xDF, 0x04, 0x31, 0xD5,
1752         0xF1, 0x35, 0x5C, 0x3B, 0xDD, 0x9A, 0x65, 0xBA,
1753         0x58, 0x34, 0x85, 0x61, 0x1C, 0x42, 0x10, 0x76,
1754         0x73, 0x02, 0x42, 0xC9, 0x23, 0x18, 0x8E, 0xB4,
1755         0x6F, 0xB4, 0xA3, 0x54, 0x6E, 0x88, 0x3B, 0x62,
1756         0x7C, 0x02, 0x8D, 0x4C, 0x9F, 0xC8, 0x45, 0xF4,
1757         0xC9, 0xDE, 0x4F, 0xEB, 0x22, 0x83, 0x1B, 0xE4,
1758         0x49, 0x37, 0xE4, 0xAD, 0xE7, 0xCD, 0x21, 0x54,
1759         0xBC, 0x1C, 0xC2, 0x04, 0x97, 0xB4, 0x10, 0x61,
1760         0xF0, 0xE4, 0xEF, 0x27, 0x63, 0x3A, 0xDA, 0x91,
1761         0x41, 0x25, 0x62, 0x1C, 0x5C, 0xB6, 0x38, 0x4A,
1762         0x88, 0x71, 0x59, 0x5A, 0x8D, 0xA0, 0x09, 0xAF,
1763         0x72, 0x94, 0xD7, 0x79, 0x5C, 0x60, 0x7C, 0x8F,
1764         0x4C, 0xF5, 0xD9, 0xA1, 0x39, 0x6D, 0x81, 0x28,
1765         0xEF, 0x13, 0x28, 0xDF, 0xF5, 0x3E, 0xF7, 0x8E,
1766         0x09, 0x9C, 0x78, 0x18, 0x79, 0xB8, 0x68, 0xD7,
1767         0xA8, 0x29, 0x62, 0xAD, 0xDE, 0xE1, 0x61, 0x76,
1768         0x1B, 0x05, 0x16, 0xCD, 0xBF, 0x02, 0x8E, 0xA6,
1769         0x43, 0x6E, 0x92, 0x55, 0x4F, 0x60, 0x9C, 0x03,
1770         0xB8, 0x4F, 0xA3, 0x02, 0xAC, 0xA8, 0xA7, 0x0C,
1771         0x1E, 0xB5, 0x6B, 0xF8, 0xC8, 0x4D, 0xDE, 0xD2,
1772         0xB0, 0x29, 0x6E, 0x40, 0xE6, 0xD6, 0xC9, 0xE6,
1773         0xB9, 0x0F, 0xB6, 0x63, 0xF5, 0xAA, 0x2B, 0x96,
1774         0xA7, 0x16, 0xAC, 0x4E, 0x0A, 0x33, 0x1C, 0xA6,
1775         0xE6, 0xBD, 0x8A, 0xCF, 0x40, 0xA9, 0xB2, 0xFA,
1776         0x63, 0x27, 0xFD, 0x9B, 0xD9, 0xFC, 0xD5, 0x87,
1777         0x8D, 0x4C, 0xB6, 0xA4, 0xCB, 0xE7, 0x74, 0x55,
1778         0xF4, 0xFB, 0x41, 0x25, 0xB5, 0x4B, 0x0A, 0x1B,
1779         0xB1, 0xD6, 0xB7, 0xD9, 0x47, 0x2A, 0xC3, 0x98,
1780         0x6A, 0xC4, 0x03, 0x73, 0x1F, 0x93, 0x6E, 0x53,
1781         0x19, 0x25, 0x64, 0x15, 0x83, 0xF9, 0x73, 0x2A,
1782         0x74, 0xB4, 0x93, 0x69, 0xC4, 0x72, 0xFC, 0x26,
1783         0xA2, 0x9F, 0x43, 0x45, 0xDD, 0xB9, 0xEF, 0x36,
1784         0xC8, 0x3A, 0xCD, 0x99, 0x9B, 0x54, 0x1A, 0x36,
1785         0xC1, 0x59, 0xF8, 0x98, 0xA8, 0xCC, 0x28, 0x0D,
1786         0x73, 0x4C, 0xEE, 0x98, 0xCB, 0x7C, 0x58, 0x7E,
1787         0x20, 0x75, 0x1E, 0xB7, 0xC9, 0xF8, 0xF2, 0x0E,
1788         0x63, 0x9E, 0x05, 0x78, 0x1A, 0xB6, 0xA8, 0x7A,
1789         0xF9, 0x98, 0x6A, 0xA6, 0x46, 0x84, 0x2E, 0xF6,
1790         0x4B, 0xDC, 0x9B, 0x8F, 0x9B, 0x8F, 0xEE, 0xB4,
1791         0xAA, 0x3F, 0xEE, 0xC0, 0x37, 0x27, 0x76, 0xC7,
1792         0x95, 0xBB, 0x26, 0x74, 0x69, 0x12, 0x7F, 0xF1,
1793         0xBB, 0xFF, 0xAE, 0xB5, 0x99, 0x6E, 0xCB, 0x0C
1794 };
1795
1796 static const uint8_t catch_22_quote_2_512_bytes_AES_CBC_HMAC_SHA1_digest[] = {
1797         0x9a, 0x4f, 0x88, 0x1b, 0xb6, 0x8f, 0xd8, 0x60,
1798         0x42, 0x1a, 0x7d, 0x3d, 0xf5, 0x82, 0x80, 0xf1,
1799         0x18, 0x8c, 0x1d, 0x32
1800 };
1801
1802
1803 /* Multisession Vector context Test */
1804 /*Begin Session 0 */
1805 static uint8_t ms_aes_cbc_key0[] = {
1806         0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7,
1807         0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff
1808 };
1809
1810 static uint8_t ms_aes_cbc_iv0[] = {
1811         0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7,
1812         0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff
1813 };
1814
1815 static const uint8_t ms_aes_cbc_cipher0[] = {
1816                 0x3C, 0xE4, 0xEE, 0x42, 0xB6, 0x9B, 0xC3, 0x38,
1817                 0x5F, 0xAD, 0x54, 0xDC, 0xA8, 0x32, 0x81, 0xDC,
1818                 0x7A, 0x6F, 0x85, 0x58, 0x07, 0x35, 0xED, 0xEB,
1819                 0xAD, 0x79, 0x79, 0x96, 0xD3, 0x0E, 0xA6, 0xD9,
1820                 0xAA, 0x86, 0xA4, 0x8F, 0xB5, 0xD6, 0x6E, 0x6D,
1821                 0x0C, 0x91, 0x2F, 0xC4, 0x67, 0x98, 0x0E, 0xC4,
1822                 0x8D, 0x83, 0x68, 0x69, 0xC4, 0xD3, 0x94, 0x34,
1823                 0xC4, 0x5D, 0x60, 0x55, 0x22, 0x87, 0x8F, 0x6F,
1824                 0x17, 0x8E, 0x75, 0xE4, 0x02, 0xF5, 0x1B, 0x99,
1825                 0xC8, 0x39, 0xA9, 0xAB, 0x23, 0x91, 0x12, 0xED,
1826                 0x08, 0xE7, 0xD9, 0x25, 0x89, 0x24, 0x4F, 0x8D,
1827                 0x68, 0xF3, 0x10, 0x39, 0x0A, 0xEE, 0x45, 0x24,
1828                 0xDF, 0x7A, 0x9D, 0x00, 0x25, 0xE5, 0x35, 0x71,
1829                 0x4E, 0x40, 0x59, 0x6F, 0x0A, 0x13, 0xB3, 0x72,
1830                 0x1D, 0x98, 0x63, 0x94, 0x89, 0xA5, 0x39, 0x8E,
1831                 0xD3, 0x9C, 0x8A, 0x7F, 0x71, 0x2F, 0xC7, 0xCD,
1832                 0x81, 0x05, 0xDC, 0xC0, 0x8D, 0xCE, 0x6D, 0x18,
1833                 0x30, 0xC4, 0x72, 0x51, 0xF0, 0x27, 0xC8, 0xF6,
1834                 0x60, 0x5B, 0x7C, 0xB2, 0xE3, 0x49, 0x0C, 0x29,
1835                 0xC6, 0x9F, 0x39, 0x57, 0x80, 0x55, 0x24, 0x2C,
1836                 0x9B, 0x0F, 0x5A, 0xB3, 0x89, 0x55, 0x31, 0x96,
1837                 0x0D, 0xCD, 0xF6, 0x51, 0x03, 0x2D, 0x89, 0x26,
1838                 0x74, 0x44, 0xD6, 0xE8, 0xDC, 0xEA, 0x44, 0x55,
1839                 0x64, 0x71, 0x9C, 0x9F, 0x5D, 0xBA, 0x39, 0x46,
1840                 0xA8, 0x17, 0xA1, 0x9C, 0x52, 0x9D, 0xBC, 0x6B,
1841                 0x4A, 0x98, 0xE6, 0xEA, 0x33, 0xEC, 0x58, 0xB4,
1842                 0x43, 0xF0, 0x32, 0x45, 0xA4, 0xC1, 0x55, 0xB7,
1843                 0x5D, 0xB5, 0x59, 0xB2, 0xE3, 0x96, 0xFF, 0xA5,
1844                 0xAF, 0xE1, 0x86, 0x1B, 0x42, 0xE6, 0x3B, 0xA0,
1845                 0x90, 0x4A, 0xE8, 0x8C, 0x21, 0x7F, 0x36, 0x1E,
1846                 0x5B, 0x65, 0x25, 0xD1, 0xC1, 0x5A, 0xCA, 0x3D,
1847                 0x10, 0xED, 0x2D, 0x79, 0xD0, 0x0F, 0x58, 0x44,
1848                 0x69, 0x81, 0xF5, 0xD4, 0xC9, 0x0F, 0x90, 0x76,
1849                 0x1F, 0x54, 0xD2, 0xD5, 0x97, 0xCE, 0x2C, 0xE3,
1850                 0xEF, 0xF4, 0xB7, 0xC6, 0x3A, 0x87, 0x7F, 0x83,
1851                 0x2A, 0xAF, 0xCD, 0x90, 0x12, 0xA7, 0x7D, 0x85,
1852                 0x1D, 0x62, 0xD3, 0x85, 0x25, 0x05, 0xDB, 0x45,
1853                 0x92, 0xA3, 0xF6, 0xA2, 0xA8, 0x41, 0xE4, 0x25,
1854                 0x86, 0x87, 0x67, 0x24, 0xEC, 0x89, 0x23, 0x2A,
1855                 0x9B, 0x20, 0x4D, 0x93, 0xEE, 0xE2, 0x2E, 0xC1,
1856                 0x0B, 0x15, 0x33, 0xCF, 0x00, 0xD1, 0x1A, 0xDA,
1857                 0x93, 0xFD, 0x28, 0x21, 0x5B, 0xCF, 0xD1, 0xF3,
1858                 0x5A, 0x81, 0xBA, 0x82, 0x5E, 0x2F, 0x61, 0xB4,
1859                 0x05, 0x71, 0xB5, 0xF4, 0x39, 0x3C, 0x1F, 0x60,
1860                 0x00, 0x7A, 0xC4, 0xF8, 0x35, 0x20, 0x6C, 0x3A,
1861                 0xCC, 0x03, 0x8F, 0x7B, 0xA2, 0xB6, 0x65, 0x8A,
1862                 0xB6, 0x5F, 0xFD, 0x25, 0xD3, 0x5F, 0x92, 0xF9,
1863                 0xAE, 0x17, 0x9B, 0x5E, 0x6E, 0x9A, 0xE4, 0x55,
1864                 0x10, 0x25, 0x07, 0xA4, 0xAF, 0x21, 0x69, 0x13,
1865                 0xD8, 0xFA, 0x31, 0xED, 0xF7, 0xA7, 0xA7, 0x3B,
1866                 0xB8, 0x96, 0x8E, 0x10, 0x86, 0x74, 0xD8, 0xB1,
1867                 0x34, 0x9E, 0x9B, 0x6A, 0x26, 0xA8, 0xD4, 0xD0,
1868                 0xB5, 0xF6, 0xDE, 0xE7, 0xCA, 0x06, 0xDC, 0xA3,
1869                 0x6F, 0xEE, 0x6B, 0x1E, 0xB5, 0x30, 0x99, 0x23,
1870                 0xF9, 0x76, 0xF0, 0xA0, 0xCF, 0x3B, 0x94, 0x7B,
1871                 0x19, 0x8D, 0xA5, 0x0C, 0x18, 0xA6, 0x1D, 0x07,
1872                 0x89, 0xBE, 0x5B, 0x61, 0xE5, 0xF1, 0x42, 0xDB,
1873                 0xD4, 0x2E, 0x02, 0x1F, 0xCE, 0xEF, 0x92, 0xB1,
1874                 0x1B, 0x56, 0x50, 0xF2, 0x16, 0xE5, 0xE7, 0x4F,
1875                 0xFD, 0xBB, 0x3E, 0xD2, 0xFC, 0x3C, 0xC6, 0x0F,
1876                 0xF9, 0x12, 0x4E, 0xCB, 0x1E, 0x0C, 0x15, 0x84,
1877                 0x2A, 0x14, 0x8A, 0x02, 0xE4, 0x7E, 0x95, 0x5B,
1878                 0x86, 0xDB, 0x9B, 0x62, 0x5B, 0x19, 0xD2, 0x17,
1879                 0xFA, 0x13, 0xBB, 0x6B, 0x3F, 0x45, 0x9F, 0xBF
1880 };
1881
1882
1883 static  uint8_t ms_hmac_key0[] = {
1884                 0xFF, 0x1A, 0x7D, 0x3D, 0xF5, 0x82, 0x80, 0xF1,
1885                 0xF1, 0x35, 0x5C, 0x3B, 0xDD, 0x9A, 0x65, 0xBA,
1886                 0x58, 0x34, 0x85, 0x65, 0x1C, 0x42, 0x50, 0x76,
1887                 0x9A, 0xAF, 0x88, 0x1B, 0xB6, 0x8F, 0xF8, 0x60,
1888                 0xA2, 0x5A, 0x7F, 0x3F, 0xF4, 0x72, 0x70, 0xF1,
1889                 0xF5, 0x35, 0x4C, 0x3B, 0xDD, 0x90, 0x65, 0xB0,
1890                 0x47, 0x3A, 0x75, 0x61, 0x5C, 0xA2, 0x10, 0x76,
1891                 0x9A, 0xAF, 0x77, 0x5B, 0xB6, 0x7F, 0xF7, 0x60
1892 };
1893
1894 static const uint8_t ms_hmac_digest0[] = {
1895                 0x43, 0x52, 0xED, 0x34, 0xAB, 0x36, 0xB2, 0x51,
1896                 0xFB, 0xA3, 0xA6, 0x7C, 0x38, 0xFC, 0x42, 0x8F,
1897                 0x57, 0x64, 0xAB, 0x81, 0xA7, 0x89, 0xB7, 0x6C,
1898                 0xA0, 0xDC, 0xB9, 0x4D, 0xC4, 0x30, 0xF9, 0xD4,
1899                 0x10, 0x82, 0x55, 0xD0, 0xAB, 0x32, 0xFB, 0x56,
1900                 0x0D, 0xE4, 0x68, 0x3D, 0x76, 0xD0, 0x7B, 0xE4,
1901                 0xA6, 0x2C, 0x34, 0x9E, 0x8C, 0x41, 0xF8, 0x23,
1902                 0x28, 0x1B, 0x3A, 0x90, 0x26, 0x34, 0x47, 0x90
1903                 };
1904
1905 /* End Session 0 */
1906 /* Begin session 1 */
1907
1908 static  uint8_t ms_aes_cbc_key1[] = {
1909                 0xf1, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7,
1910                 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff
1911 };
1912
1913 static  uint8_t ms_aes_cbc_iv1[] = {
1914         0xf1, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7,
1915         0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff
1916 };
1917
1918 static const uint8_t ms_aes_cbc_cipher1[] = {
1919                 0x5A, 0x7A, 0x67, 0x5D, 0xB8, 0xE1, 0xDC, 0x71,
1920                 0x39, 0xA8, 0x74, 0x93, 0x9C, 0x4C, 0xFE, 0x23,
1921                 0x61, 0xCD, 0xA4, 0xB3, 0xD9, 0xCE, 0x99, 0x09,
1922                 0x2A, 0x23, 0xF3, 0x29, 0xBF, 0x4C, 0xB4, 0x6A,
1923                 0x1B, 0x6B, 0x73, 0x4D, 0x48, 0x0C, 0xCF, 0x6C,
1924                 0x5E, 0x34, 0x9E, 0x7F, 0xBC, 0x8F, 0xCC, 0x8F,
1925                 0x75, 0x1D, 0x3D, 0x77, 0x10, 0x76, 0xC8, 0xB9,
1926                 0x99, 0x6F, 0xD6, 0x56, 0x75, 0xA9, 0xB2, 0x66,
1927                 0xC2, 0x24, 0x2B, 0x9C, 0xFE, 0x40, 0x8E, 0x43,
1928                 0x20, 0x97, 0x1B, 0xFA, 0xD0, 0xCF, 0x04, 0xAB,
1929                 0xBB, 0xF6, 0x5D, 0xF5, 0xA0, 0x19, 0x7C, 0x23,
1930                 0x5D, 0x80, 0x8C, 0x49, 0xF6, 0x76, 0x88, 0x29,
1931                 0x27, 0x4C, 0x59, 0x2B, 0x43, 0xA6, 0xB2, 0x26,
1932                 0x27, 0x78, 0xBE, 0x1B, 0xE1, 0x4F, 0x5A, 0x1F,
1933                 0xFC, 0x68, 0x08, 0xE7, 0xC4, 0xD1, 0x34, 0x68,
1934                 0xB7, 0x13, 0x14, 0x41, 0x62, 0x6B, 0x1F, 0x77,
1935                 0x0C, 0x68, 0x1D, 0x0D, 0xED, 0x89, 0xAA, 0xD8,
1936                 0x97, 0x02, 0xBA, 0x5E, 0xD4, 0x84, 0x25, 0x97,
1937                 0x03, 0xA5, 0xA6, 0x13, 0x66, 0x02, 0xF4, 0xC3,
1938                 0xF3, 0xD3, 0xCC, 0x95, 0xC3, 0x87, 0x46, 0x90,
1939                 0x1F, 0x6E, 0x14, 0xA8, 0x00, 0xF2, 0x6F, 0xD5,
1940                 0xA1, 0xAD, 0xD5, 0x40, 0xA2, 0x0F, 0x32, 0x7E,
1941                 0x99, 0xA3, 0xF5, 0x53, 0xC3, 0x26, 0xA1, 0x45,
1942                 0x01, 0x88, 0x57, 0x84, 0x3E, 0x7B, 0x4E, 0x0B,
1943                 0x3C, 0xB5, 0x3E, 0x9E, 0xE9, 0x78, 0x77, 0xC5,
1944                 0xC0, 0x89, 0xA8, 0xF8, 0xF1, 0xA5, 0x2D, 0x5D,
1945                 0xF9, 0xC6, 0xFB, 0xCB, 0x05, 0x23, 0xBD, 0x6E,
1946                 0x5E, 0x14, 0xC6, 0x57, 0x73, 0xCF, 0x98, 0xBD,
1947                 0x10, 0x8B, 0x18, 0xA6, 0x01, 0x5B, 0x13, 0xAE,
1948                 0x8E, 0xDE, 0x1F, 0xB5, 0xB7, 0x40, 0x6C, 0xC1,
1949                 0x1E, 0xA1, 0x19, 0x20, 0x9E, 0x95, 0xE0, 0x2F,
1950                 0x1C, 0xF5, 0xD9, 0xD0, 0x2B, 0x1E, 0x82, 0x25,
1951                 0x62, 0xB4, 0xEB, 0xA1, 0x1F, 0xCE, 0x44, 0xA1,
1952                 0xCB, 0x92, 0x01, 0x6B, 0xE4, 0x26, 0x23, 0xE3,
1953                 0xC5, 0x67, 0x35, 0x55, 0xDA, 0xE5, 0x27, 0xEE,
1954                 0x8D, 0x12, 0x84, 0xB7, 0xBA, 0xA7, 0x1C, 0xD6,
1955                 0x32, 0x3F, 0x67, 0xED, 0xFB, 0x5B, 0x8B, 0x52,
1956                 0x46, 0x8C, 0xF9, 0x69, 0xCD, 0xAE, 0x79, 0xAA,
1957                 0x37, 0x78, 0x49, 0xEB, 0xC6, 0x8E, 0x76, 0x63,
1958                 0x84, 0xFF, 0x9D, 0x22, 0x99, 0x51, 0xB7, 0x5E,
1959                 0x83, 0x4C, 0x8B, 0xDF, 0x5A, 0x07, 0xCC, 0xBA,
1960                 0x42, 0xA5, 0x98, 0xB6, 0x47, 0x0E, 0x66, 0xEB,
1961                 0x23, 0x0E, 0xBA, 0x44, 0xA8, 0xAA, 0x20, 0x71,
1962                 0x79, 0x9C, 0x77, 0x5F, 0xF5, 0xFE, 0xEC, 0xEF,
1963                 0xC6, 0x64, 0x3D, 0x84, 0xD0, 0x2B, 0xA7, 0x0A,
1964                 0xC3, 0x72, 0x5B, 0x9C, 0xFA, 0xA8, 0x87, 0x95,
1965                 0x94, 0x11, 0x38, 0xA7, 0x1E, 0x58, 0xE3, 0x73,
1966                 0xC6, 0xC9, 0xD1, 0x7B, 0x92, 0xDB, 0x0F, 0x49,
1967                 0x74, 0xC2, 0xA2, 0x0E, 0x35, 0x57, 0xAC, 0xDB,
1968                 0x9A, 0x1C, 0xCF, 0x5A, 0x32, 0x3E, 0x26, 0x9B,
1969                 0xEC, 0xB3, 0xEF, 0x9C, 0xFE, 0xBE, 0x52, 0xAC,
1970                 0xB1, 0x29, 0xDD, 0xFD, 0x07, 0xE2, 0xEE, 0xED,
1971                 0xE4, 0x46, 0x37, 0xFE, 0xD1, 0xDC, 0xCD, 0x02,
1972                 0xF9, 0x31, 0xB0, 0xFB, 0x36, 0xB7, 0x34, 0xA4,
1973                 0x76, 0xE8, 0x57, 0xBF, 0x99, 0x92, 0xC7, 0xAF,
1974                 0x98, 0x10, 0xE2, 0x70, 0xCA, 0xC9, 0x2B, 0x82,
1975                 0x06, 0x96, 0x88, 0x0D, 0xB3, 0xAC, 0x9E, 0x6D,
1976                 0x43, 0xBC, 0x5B, 0x31, 0xCF, 0x65, 0x8D, 0xA6,
1977                 0xC7, 0xFE, 0x73, 0xE1, 0x54, 0xF7, 0x10, 0xF9,
1978                 0x86, 0xF7, 0xDF, 0xA1, 0xA1, 0xD8, 0xAE, 0x35,
1979                 0xB3, 0x90, 0xDC, 0x6F, 0x43, 0x7A, 0x8B, 0xE0,
1980                 0xFE, 0x8F, 0x33, 0x4D, 0x29, 0x6C, 0x45, 0x53,
1981                 0x73, 0xDD, 0x21, 0x0B, 0x85, 0x30, 0xB5, 0xA5,
1982                 0xF3, 0x5D, 0xEC, 0x79, 0x61, 0x9D, 0x9E, 0xB3
1983
1984 };
1985
1986 static uint8_t ms_hmac_key1[] = {
1987                 0xFE, 0x1A, 0x7D, 0x3D, 0xF5, 0x82, 0x80, 0xF1,
1988                 0xF1, 0x35, 0x5C, 0x3B, 0xDD, 0x9A, 0x65, 0xBA,
1989                 0x58, 0x34, 0x85, 0x65, 0x1C, 0x42, 0x50, 0x76,
1990                 0x9A, 0xAF, 0x88, 0x1B, 0xB6, 0x8F, 0xF8, 0x60,
1991                 0xA2, 0x5A, 0x7F, 0x3F, 0xF4, 0x72, 0x70, 0xF1,
1992                 0xF5, 0x35, 0x4C, 0x3B, 0xDD, 0x90, 0x65, 0xB0,
1993                 0x47, 0x3A, 0x75, 0x61, 0x5C, 0xA2, 0x10, 0x76,
1994                 0x9A, 0xAF, 0x77, 0x5B, 0xB6, 0x7F, 0xF7, 0x60
1995 };
1996
1997 static const uint8_t ms_hmac_digest1[] = {
1998                 0xCE, 0x6E, 0x5F, 0x77, 0x96, 0x9A, 0xB1, 0x69,
1999                 0x2D, 0x5E, 0xF3, 0x2F, 0x32, 0x10, 0xCB, 0x50,
2000                 0x0E, 0x09, 0x56, 0x25, 0x07, 0x34, 0xC9, 0x20,
2001                 0xEC, 0x13, 0x43, 0x23, 0x5C, 0x08, 0x8B, 0xCD,
2002                 0xDC, 0x86, 0x8C, 0xEE, 0x0A, 0x95, 0x2E, 0xB9,
2003                 0x8C, 0x7B, 0x02, 0x7A, 0xD4, 0xE1, 0x49, 0xB4,
2004                 0x45, 0xB5, 0x52, 0x37, 0xC6, 0xFF, 0xFE, 0xAA,
2005                 0x0A, 0x87, 0xB8, 0x51, 0xF9, 0x2A, 0x01, 0x8F
2006 };
2007 /* End Session 1  */
2008 /* Begin Session 2 */
2009 static  uint8_t ms_aes_cbc_key2[] = {
2010                 0xff, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7,
2011                 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff
2012 };
2013
2014 static  uint8_t ms_aes_cbc_iv2[] = {
2015                 0xff, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7,
2016                 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff
2017 };
2018
2019 static const uint8_t ms_aes_cbc_cipher2[] = {
2020                 0xBB, 0x3C, 0x68, 0x25, 0xFD, 0xB6, 0xA2, 0x91,
2021                 0x20, 0x56, 0xF6, 0x30, 0x35, 0xFC, 0x9E, 0x97,
2022                 0xF2, 0x90, 0xFC, 0x7E, 0x3E, 0x0A, 0x75, 0xC8,
2023                 0x4C, 0xF2, 0x2D, 0xAC, 0xD3, 0x93, 0xF0, 0xC5,
2024                 0x14, 0x88, 0x8A, 0x23, 0xC2, 0x59, 0x9A, 0x98,
2025                 0x4B, 0xD5, 0x2C, 0xDA, 0x43, 0xA9, 0x34, 0x69,
2026                 0x7C, 0x6D, 0xDB, 0xDC, 0xCB, 0xC0, 0xA0, 0x09,
2027                 0xA7, 0x86, 0x16, 0x4B, 0xBF, 0xA8, 0xB6, 0xCF,
2028                 0x7F, 0x74, 0x1F, 0x22, 0xF0, 0xF6, 0xBB, 0x44,
2029                 0x8B, 0x4C, 0x9E, 0x23, 0xF8, 0x9F, 0xFC, 0x5B,
2030                 0x9E, 0x9C, 0x2A, 0x79, 0x30, 0x8F, 0xBF, 0xA9,
2031                 0x68, 0xA1, 0x20, 0x71, 0x7C, 0x77, 0x22, 0x34,
2032                 0x07, 0xCD, 0xC6, 0xF6, 0x50, 0x0A, 0x08, 0x99,
2033                 0x17, 0x98, 0xE3, 0x93, 0x8A, 0xB0, 0xEE, 0xDF,
2034                 0xC2, 0xBA, 0x3B, 0x44, 0x73, 0xDF, 0xDD, 0xDC,
2035                 0x14, 0x4D, 0x3B, 0xBB, 0x5E, 0x58, 0xC1, 0x26,
2036                 0xA7, 0xAE, 0x47, 0xF3, 0x24, 0x6D, 0x4F, 0xD3,
2037                 0x6E, 0x3E, 0x33, 0xE6, 0x7F, 0xCA, 0x50, 0xAF,
2038                 0x5D, 0x3D, 0xA0, 0xDD, 0xC9, 0xF3, 0x30, 0xD3,
2039                 0x6E, 0x8B, 0x2E, 0x12, 0x24, 0x34, 0xF0, 0xD3,
2040                 0xC7, 0x8D, 0x23, 0x29, 0xAA, 0x05, 0xE1, 0xFA,
2041                 0x2E, 0xF6, 0x8D, 0x37, 0x86, 0xC0, 0x6D, 0x13,
2042                 0x2D, 0x98, 0xF3, 0x52, 0x39, 0x22, 0xCE, 0x38,
2043                 0xC2, 0x1A, 0x72, 0xED, 0xFB, 0xCC, 0xE4, 0x71,
2044                 0x5A, 0x0C, 0x0D, 0x09, 0xF8, 0xE8, 0x1B, 0xBC,
2045                 0x53, 0xC8, 0xD8, 0x8F, 0xE5, 0x98, 0x5A, 0xB1,
2046                 0x06, 0xA6, 0x5B, 0xE6, 0xA2, 0x88, 0x21, 0x9E,
2047                 0x36, 0xC0, 0x34, 0xF9, 0xFB, 0x3B, 0x0A, 0x22,
2048                 0x00, 0x00, 0x39, 0x48, 0x8D, 0x23, 0x74, 0x62,
2049                 0x72, 0x91, 0xE6, 0x36, 0xAA, 0x77, 0x9C, 0x72,
2050                 0x9D, 0xA8, 0xC3, 0xA9, 0xD5, 0x44, 0x72, 0xA6,
2051                 0xB9, 0x28, 0x8F, 0x64, 0x4C, 0x8A, 0x64, 0xE6,
2052                 0x4E, 0xFA, 0xEF, 0x87, 0xDE, 0x7B, 0x22, 0x44,
2053                 0xB0, 0xDF, 0x2E, 0x5F, 0x0B, 0xA5, 0xF2, 0x24,
2054                 0x07, 0x5C, 0x2D, 0x39, 0xB7, 0x3D, 0x8A, 0xE5,
2055                 0x0E, 0x9D, 0x4E, 0x50, 0xED, 0x03, 0x99, 0x8E,
2056                 0xF0, 0x06, 0x55, 0x4E, 0xA2, 0x24, 0xE7, 0x17,
2057                 0x46, 0xDF, 0x6C, 0xCD, 0xC6, 0x44, 0xE8, 0xF9,
2058                 0xB9, 0x1B, 0x36, 0xF6, 0x7F, 0x10, 0xA4, 0x7D,
2059                 0x90, 0xBD, 0xE4, 0xAA, 0xD6, 0x9E, 0x18, 0x9D,
2060                 0x22, 0x35, 0xD6, 0x55, 0x54, 0xAA, 0xF7, 0x22,
2061                 0xA3, 0x3E, 0xEF, 0xC8, 0xA2, 0x34, 0x8D, 0xA9,
2062                 0x37, 0x63, 0xA6, 0xC3, 0x57, 0xCB, 0x0C, 0x49,
2063                 0x7D, 0x02, 0xBE, 0xAA, 0x13, 0x75, 0xB7, 0x4E,
2064                 0x52, 0x62, 0xA5, 0xC2, 0x33, 0xC7, 0x6C, 0x1B,
2065                 0xF6, 0x34, 0xF6, 0x09, 0xA5, 0x0C, 0xC7, 0xA2,
2066                 0x61, 0x48, 0x62, 0x7D, 0x17, 0x15, 0xE3, 0x95,
2067                 0xC8, 0x63, 0xD2, 0xA4, 0x43, 0xA9, 0x49, 0x07,
2068                 0xB2, 0x3B, 0x2B, 0x62, 0x7D, 0xCB, 0x51, 0xB3,
2069                 0x25, 0x33, 0x47, 0x0E, 0x14, 0x67, 0xDC, 0x6A,
2070                 0x9B, 0x51, 0xAC, 0x9D, 0x8F, 0xA2, 0x2B, 0x57,
2071                 0x8C, 0x5C, 0x5F, 0x76, 0x23, 0x92, 0x0F, 0x84,
2072                 0x46, 0x0E, 0x40, 0x85, 0x38, 0x60, 0xFA, 0x61,
2073                 0x20, 0xC5, 0xE3, 0xF1, 0x70, 0xAC, 0x1B, 0xBF,
2074                 0xC4, 0x2B, 0xC5, 0x67, 0xD1, 0x43, 0xC5, 0x17,
2075                 0x74, 0x71, 0x69, 0x6F, 0x82, 0x89, 0x19, 0x8A,
2076                 0x70, 0x43, 0x92, 0x01, 0xC4, 0x63, 0x7E, 0xB1,
2077                 0x59, 0x4E, 0xCD, 0xEA, 0x93, 0xA4, 0x52, 0x53,
2078                 0x9B, 0x61, 0x5B, 0xD2, 0x3E, 0x19, 0x39, 0xB7,
2079                 0x32, 0xEA, 0x8E, 0xF8, 0x1D, 0x76, 0x5C, 0xB2,
2080                 0x73, 0x2D, 0x91, 0xC0, 0x18, 0xED, 0x25, 0x2A,
2081                 0x53, 0x64, 0xF0, 0x92, 0x31, 0x55, 0x21, 0xA8,
2082                 0x24, 0xA9, 0xD1, 0x02, 0xF6, 0x6C, 0x2B, 0x70,
2083                 0xA9, 0x59, 0xC1, 0xD6, 0xC3, 0x57, 0x5B, 0x92
2084 };
2085
2086 static  uint8_t ms_hmac_key2[] = {
2087                 0xFC, 0x1A, 0x7D, 0x3D, 0xF5, 0x82, 0x80, 0xF1,
2088                 0xF1, 0x35, 0x5C, 0x3B, 0xDD, 0x9A, 0x65, 0xBA,
2089                 0x58, 0x34, 0x85, 0x65, 0x1C, 0x42, 0x50, 0x76,
2090                 0x9A, 0xAF, 0x88, 0x1B, 0xB6, 0x8F, 0xF8, 0x60,
2091                 0xA2, 0x5A, 0x7F, 0x3F, 0xF4, 0x72, 0x70, 0xF1,
2092                 0xF5, 0x35, 0x4C, 0x3B, 0xDD, 0x90, 0x65, 0xB0,
2093                 0x47, 0x3A, 0x75, 0x61, 0x5C, 0xA2, 0x10, 0x76,
2094                 0x9A, 0xAF, 0x77, 0x5B, 0xB6, 0x7F, 0xF7, 0x60
2095 };
2096
2097 static const uint8_t ms_hmac_digest2[] = {
2098                 0xA5, 0x0F, 0x9C, 0xFB, 0x08, 0x62, 0x59, 0xFF,
2099                 0x80, 0x2F, 0xEB, 0x4B, 0xE1, 0x46, 0x21, 0xD6,
2100                 0x02, 0x98, 0xF2, 0x8E, 0xF4, 0xEC, 0xD4, 0x77,
2101                 0x86, 0x4C, 0x31, 0x28, 0xC8, 0x25, 0x80, 0x27,
2102                 0x3A, 0x72, 0x5D, 0x6A, 0x56, 0x8A, 0xD3, 0x82,
2103                 0xB0, 0xEC, 0x31, 0x6D, 0x8B, 0x6B, 0xB4, 0x24,
2104                 0xE7, 0x62, 0xC1, 0x52, 0xBC, 0x14, 0x1B, 0x8E,
2105                 0xEC, 0x9A, 0xF1, 0x47, 0x80, 0xD2, 0xB0, 0x59
2106 };
2107
2108 /* End Session 2 */
2109
2110
2111 static int
2112 test_AES_CBC_HMAC_SHA1_encrypt_digest(void)
2113 {
2114         struct crypto_testsuite_params *ts_params = &testsuite_params;
2115         struct crypto_unittest_params *ut_params = &unittest_params;
2116
2117         /* Verify the capabilities */
2118         struct rte_cryptodev_sym_capability_idx cap_idx;
2119         cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
2120         cap_idx.algo.auth = RTE_CRYPTO_AUTH_SHA1_HMAC;
2121         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
2122                         &cap_idx) == NULL)
2123                 return TEST_SKIPPED;
2124         cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
2125         cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_AES_CBC;
2126         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
2127                         &cap_idx) == NULL)
2128                 return TEST_SKIPPED;
2129
2130         /* Generate test mbuf data and space for digest */
2131         ut_params->ibuf = setup_test_string(ts_params->mbuf_pool,
2132                         catch_22_quote, QUOTE_512_BYTES, 0);
2133
2134         ut_params->digest = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
2135                         DIGEST_BYTE_LENGTH_SHA1);
2136         TEST_ASSERT_NOT_NULL(ut_params->digest, "no room to append digest");
2137
2138         /* Setup Cipher Parameters */
2139         ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
2140         ut_params->cipher_xform.next = &ut_params->auth_xform;
2141
2142         ut_params->cipher_xform.cipher.algo = RTE_CRYPTO_CIPHER_AES_CBC;
2143         ut_params->cipher_xform.cipher.op = RTE_CRYPTO_CIPHER_OP_ENCRYPT;
2144         ut_params->cipher_xform.cipher.key.data = aes_cbc_key;
2145         ut_params->cipher_xform.cipher.key.length = CIPHER_KEY_LENGTH_AES_CBC;
2146         ut_params->cipher_xform.cipher.iv.offset = IV_OFFSET;
2147         ut_params->cipher_xform.cipher.iv.length = CIPHER_IV_LENGTH_AES_CBC;
2148
2149         /* Setup HMAC Parameters */
2150         ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;
2151
2152         ut_params->auth_xform.next = NULL;
2153
2154         ut_params->auth_xform.auth.op = RTE_CRYPTO_AUTH_OP_GENERATE;
2155         ut_params->auth_xform.auth.algo = RTE_CRYPTO_AUTH_SHA1_HMAC;
2156         ut_params->auth_xform.auth.key.length = HMAC_KEY_LENGTH_SHA1;
2157         ut_params->auth_xform.auth.key.data = hmac_sha1_key;
2158         ut_params->auth_xform.auth.digest_length = DIGEST_BYTE_LENGTH_SHA1;
2159
2160         ut_params->sess = rte_cryptodev_sym_session_create(
2161                         ts_params->session_mpool);
2162
2163         /* Create crypto session*/
2164         rte_cryptodev_sym_session_init(ts_params->valid_devs[0],
2165                         ut_params->sess, &ut_params->cipher_xform,
2166                         ts_params->session_priv_mpool);
2167         TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed");
2168
2169         /* Generate crypto op data structure */
2170         ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
2171                         RTE_CRYPTO_OP_TYPE_SYMMETRIC);
2172         TEST_ASSERT_NOT_NULL(ut_params->op,
2173                         "Failed to allocate symmetric crypto operation struct");
2174
2175         rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
2176
2177         struct rte_crypto_sym_op *sym_op = ut_params->op->sym;
2178
2179         /* set crypto operation source mbuf */
2180         sym_op->m_src = ut_params->ibuf;
2181
2182         /* Set crypto operation authentication parameters */
2183         sym_op->auth.digest.data = ut_params->digest;
2184         sym_op->auth.digest.phys_addr = rte_pktmbuf_iova_offset(
2185                         ut_params->ibuf, QUOTE_512_BYTES);
2186
2187         sym_op->auth.data.offset = 0;
2188         sym_op->auth.data.length = QUOTE_512_BYTES;
2189
2190         /* Copy IV at the end of the crypto operation */
2191         rte_memcpy(rte_crypto_op_ctod_offset(ut_params->op, uint8_t *, IV_OFFSET),
2192                         aes_cbc_iv, CIPHER_IV_LENGTH_AES_CBC);
2193
2194         /* Set crypto operation cipher parameters */
2195         sym_op->cipher.data.offset = 0;
2196         sym_op->cipher.data.length = QUOTE_512_BYTES;
2197
2198         /* Process crypto operation */
2199         if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
2200                 process_cpu_crypt_auth_op(ts_params->valid_devs[0],
2201                         ut_params->op);
2202         else
2203                 TEST_ASSERT_NOT_NULL(
2204                         process_crypto_request(ts_params->valid_devs[0],
2205                                 ut_params->op),
2206                                 "failed to process sym crypto op");
2207
2208         TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
2209                         "crypto op processing failed");
2210
2211         /* Validate obuf */
2212         uint8_t *ciphertext = rte_pktmbuf_mtod(ut_params->op->sym->m_src,
2213                         uint8_t *);
2214
2215         TEST_ASSERT_BUFFERS_ARE_EQUAL(ciphertext,
2216                         catch_22_quote_2_512_bytes_AES_CBC_ciphertext,
2217                         QUOTE_512_BYTES,
2218                         "ciphertext data not as expected");
2219
2220         uint8_t *digest = ciphertext + QUOTE_512_BYTES;
2221
2222         TEST_ASSERT_BUFFERS_ARE_EQUAL(digest,
2223                         catch_22_quote_2_512_bytes_AES_CBC_HMAC_SHA1_digest,
2224                         gbl_driver_id == rte_cryptodev_driver_id_get(
2225                                         RTE_STR(CRYPTODEV_NAME_AESNI_MB_PMD)) ?
2226                                         TRUNCATED_DIGEST_BYTE_LENGTH_SHA1 :
2227                                         DIGEST_BYTE_LENGTH_SHA1,
2228                         "Generated digest data not as expected");
2229
2230         return TEST_SUCCESS;
2231 }
2232
2233 /* ***** AES-CBC / HMAC-SHA512 Hash Tests ***** */
2234
2235 #define HMAC_KEY_LENGTH_SHA512  (DIGEST_BYTE_LENGTH_SHA512)
2236
2237 static uint8_t hmac_sha512_key[] = {
2238         0x42, 0x1a, 0x7d, 0x3d, 0xf5, 0x82, 0x80, 0xf1,
2239         0xF1, 0x35, 0x5C, 0x3B, 0xDD, 0x9A, 0x65, 0xBA,
2240         0x58, 0x34, 0x85, 0x65, 0x1C, 0x42, 0x50, 0x76,
2241         0x9a, 0xaf, 0x88, 0x1b, 0xb6, 0x8f, 0xf8, 0x60,
2242         0xa2, 0x5a, 0x7f, 0x3f, 0xf4, 0x72, 0x70, 0xf1,
2243         0xF5, 0x35, 0x4C, 0x3B, 0xDD, 0x90, 0x65, 0xB0,
2244         0x47, 0x3a, 0x75, 0x61, 0x5C, 0xa2, 0x10, 0x76,
2245         0x9a, 0xaf, 0x77, 0x5b, 0xb6, 0x7f, 0xf7, 0x60 };
2246
2247 static const uint8_t catch_22_quote_2_512_bytes_AES_CBC_HMAC_SHA512_digest[] = {
2248         0x5D, 0x54, 0x66, 0xC1, 0x6E, 0xBC, 0x04, 0xB8,
2249         0x46, 0xB8, 0x08, 0x6E, 0xE0, 0xF0, 0x43, 0x48,
2250         0x37, 0x96, 0x9C, 0xC6, 0x9C, 0xC2, 0x1E, 0xE8,
2251         0xF2, 0x0C, 0x0B, 0xEF, 0x86, 0xA2, 0xE3, 0x70,
2252         0x95, 0xC8, 0xB3, 0x06, 0x47, 0xA9, 0x90, 0xE8,
2253         0xA0, 0xC6, 0x72, 0x69, 0x05, 0xC0, 0x0D, 0x0E,
2254         0x21, 0x96, 0x65, 0x93, 0x74, 0x43, 0x2A, 0x1D,
2255         0x2E, 0xBF, 0xC2, 0xC2, 0xEE, 0xCC, 0x2F, 0x0A };
2256
2257
2258
2259 static int
2260 test_AES_CBC_HMAC_SHA512_decrypt_create_session_params(
2261                 struct crypto_unittest_params *ut_params,
2262                 uint8_t *cipher_key,
2263                 uint8_t *hmac_key);
2264
2265 static int
2266 test_AES_CBC_HMAC_SHA512_decrypt_perform(struct rte_cryptodev_sym_session *sess,
2267                 struct crypto_unittest_params *ut_params,
2268                 struct crypto_testsuite_params *ts_params,
2269                 const uint8_t *cipher,
2270                 const uint8_t *digest,
2271                 const uint8_t *iv);
2272
2273
2274 static int
2275 test_AES_CBC_HMAC_SHA512_decrypt_create_session_params(
2276                 struct crypto_unittest_params *ut_params,
2277                 uint8_t *cipher_key,
2278                 uint8_t *hmac_key)
2279 {
2280
2281         /* Setup Cipher Parameters */
2282         ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
2283         ut_params->cipher_xform.next = NULL;
2284
2285         ut_params->cipher_xform.cipher.algo = RTE_CRYPTO_CIPHER_AES_CBC;
2286         ut_params->cipher_xform.cipher.op = RTE_CRYPTO_CIPHER_OP_DECRYPT;
2287         ut_params->cipher_xform.cipher.key.data = cipher_key;
2288         ut_params->cipher_xform.cipher.key.length = CIPHER_KEY_LENGTH_AES_CBC;
2289         ut_params->cipher_xform.cipher.iv.offset = IV_OFFSET;
2290         ut_params->cipher_xform.cipher.iv.length = CIPHER_IV_LENGTH_AES_CBC;
2291
2292         /* Setup HMAC Parameters */
2293         ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;
2294         ut_params->auth_xform.next = &ut_params->cipher_xform;
2295
2296         ut_params->auth_xform.auth.op = RTE_CRYPTO_AUTH_OP_VERIFY;
2297         ut_params->auth_xform.auth.algo = RTE_CRYPTO_AUTH_SHA512_HMAC;
2298         ut_params->auth_xform.auth.key.data = hmac_key;
2299         ut_params->auth_xform.auth.key.length = HMAC_KEY_LENGTH_SHA512;
2300         ut_params->auth_xform.auth.digest_length = DIGEST_BYTE_LENGTH_SHA512;
2301
2302         return TEST_SUCCESS;
2303 }
2304
2305
2306 static int
2307 test_AES_CBC_HMAC_SHA512_decrypt_perform(struct rte_cryptodev_sym_session *sess,
2308                 struct crypto_unittest_params *ut_params,
2309                 struct crypto_testsuite_params *ts_params,
2310                 const uint8_t *cipher,
2311                 const uint8_t *digest,
2312                 const uint8_t *iv)
2313 {
2314         /* Generate test mbuf data and digest */
2315         ut_params->ibuf = setup_test_string(ts_params->mbuf_pool,
2316                         (const char *)
2317                         cipher,
2318                         QUOTE_512_BYTES, 0);
2319
2320         ut_params->digest = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
2321                         DIGEST_BYTE_LENGTH_SHA512);
2322         TEST_ASSERT_NOT_NULL(ut_params->digest, "no room to append digest");
2323
2324         rte_memcpy(ut_params->digest,
2325                         digest,
2326                         DIGEST_BYTE_LENGTH_SHA512);
2327
2328         /* Generate Crypto op data structure */
2329         ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
2330                         RTE_CRYPTO_OP_TYPE_SYMMETRIC);
2331         TEST_ASSERT_NOT_NULL(ut_params->op,
2332                         "Failed to allocate symmetric crypto operation struct");
2333
2334         rte_crypto_op_attach_sym_session(ut_params->op, sess);
2335
2336         struct rte_crypto_sym_op *sym_op = ut_params->op->sym;
2337
2338         /* set crypto operation source mbuf */
2339         sym_op->m_src = ut_params->ibuf;
2340
2341         sym_op->auth.digest.data = ut_params->digest;
2342         sym_op->auth.digest.phys_addr = rte_pktmbuf_iova_offset(
2343                         ut_params->ibuf, QUOTE_512_BYTES);
2344
2345         sym_op->auth.data.offset = 0;
2346         sym_op->auth.data.length = QUOTE_512_BYTES;
2347
2348         /* Copy IV at the end of the crypto operation */
2349         rte_memcpy(rte_crypto_op_ctod_offset(ut_params->op, uint8_t *, IV_OFFSET),
2350                         iv, CIPHER_IV_LENGTH_AES_CBC);
2351
2352         sym_op->cipher.data.offset = 0;
2353         sym_op->cipher.data.length = QUOTE_512_BYTES;
2354
2355         /* Process crypto operation */
2356         if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
2357                 process_cpu_crypt_auth_op(ts_params->valid_devs[0],
2358                         ut_params->op);
2359         else if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
2360                 process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
2361                                 ut_params->op, 1, 1, 0, 0);
2362         else
2363                 TEST_ASSERT_NOT_NULL(
2364                                 process_crypto_request(ts_params->valid_devs[0],
2365                                         ut_params->op),
2366                                         "failed to process sym crypto op");
2367
2368         TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
2369                         "crypto op processing failed");
2370
2371         ut_params->obuf = ut_params->op->sym->m_src;
2372
2373         /* Validate obuf */
2374         TEST_ASSERT_BUFFERS_ARE_EQUAL(
2375                         rte_pktmbuf_mtod(ut_params->obuf, uint8_t *),
2376                         catch_22_quote,
2377                         QUOTE_512_BYTES,
2378                         "Plaintext data not as expected");
2379
2380         /* Validate obuf */
2381         TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
2382                         "Digest verification failed");
2383
2384         return TEST_SUCCESS;
2385 }
2386
2387 /* ***** SNOW 3G Tests ***** */
2388 static int
2389 create_wireless_algo_hash_session(uint8_t dev_id,
2390         const uint8_t *key, const uint8_t key_len,
2391         const uint8_t iv_len, const uint8_t auth_len,
2392         enum rte_crypto_auth_operation op,
2393         enum rte_crypto_auth_algorithm algo)
2394 {
2395         uint8_t hash_key[key_len];
2396         int status;
2397
2398         struct crypto_testsuite_params *ts_params = &testsuite_params;
2399         struct crypto_unittest_params *ut_params = &unittest_params;
2400
2401         memcpy(hash_key, key, key_len);
2402
2403         debug_hexdump(stdout, "key:", key, key_len);
2404
2405         /* Setup Authentication Parameters */
2406         ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;
2407         ut_params->auth_xform.next = NULL;
2408
2409         ut_params->auth_xform.auth.op = op;
2410         ut_params->auth_xform.auth.algo = algo;
2411         ut_params->auth_xform.auth.key.length = key_len;
2412         ut_params->auth_xform.auth.key.data = hash_key;
2413         ut_params->auth_xform.auth.digest_length = auth_len;
2414         ut_params->auth_xform.auth.iv.offset = IV_OFFSET;
2415         ut_params->auth_xform.auth.iv.length = iv_len;
2416         ut_params->sess = rte_cryptodev_sym_session_create(
2417                         ts_params->session_mpool);
2418
2419         status = rte_cryptodev_sym_session_init(dev_id, ut_params->sess,
2420                         &ut_params->auth_xform,
2421                         ts_params->session_priv_mpool);
2422         if (status == -ENOTSUP)
2423                 return TEST_SKIPPED;
2424
2425         TEST_ASSERT_EQUAL(status, 0, "session init failed");
2426         TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed");
2427         return 0;
2428 }
2429
2430 static int
2431 create_wireless_algo_cipher_session(uint8_t dev_id,
2432                         enum rte_crypto_cipher_operation op,
2433                         enum rte_crypto_cipher_algorithm algo,
2434                         const uint8_t *key, const uint8_t key_len,
2435                         uint8_t iv_len)
2436 {
2437         uint8_t cipher_key[key_len];
2438         int status;
2439         struct crypto_testsuite_params *ts_params = &testsuite_params;
2440         struct crypto_unittest_params *ut_params = &unittest_params;
2441
2442         memcpy(cipher_key, key, key_len);
2443
2444         /* Setup Cipher Parameters */
2445         ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
2446         ut_params->cipher_xform.next = NULL;
2447
2448         ut_params->cipher_xform.cipher.algo = algo;
2449         ut_params->cipher_xform.cipher.op = op;
2450         ut_params->cipher_xform.cipher.key.data = cipher_key;
2451         ut_params->cipher_xform.cipher.key.length = key_len;
2452         ut_params->cipher_xform.cipher.iv.offset = IV_OFFSET;
2453         ut_params->cipher_xform.cipher.iv.length = iv_len;
2454
2455         debug_hexdump(stdout, "key:", key, key_len);
2456
2457         /* Create Crypto session */
2458         ut_params->sess = rte_cryptodev_sym_session_create(
2459                         ts_params->session_mpool);
2460
2461         status = rte_cryptodev_sym_session_init(dev_id, ut_params->sess,
2462                         &ut_params->cipher_xform,
2463                         ts_params->session_priv_mpool);
2464         if (status == -ENOTSUP)
2465                 return TEST_SKIPPED;
2466
2467         TEST_ASSERT_EQUAL(status, 0, "session init failed");
2468         TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed");
2469         return 0;
2470 }
2471
2472 static int
2473 create_wireless_algo_cipher_operation(const uint8_t *iv, uint8_t iv_len,
2474                         unsigned int cipher_len,
2475                         unsigned int cipher_offset)
2476 {
2477         struct crypto_testsuite_params *ts_params = &testsuite_params;
2478         struct crypto_unittest_params *ut_params = &unittest_params;
2479
2480         /* Generate Crypto op data structure */
2481         ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
2482                                 RTE_CRYPTO_OP_TYPE_SYMMETRIC);
2483         TEST_ASSERT_NOT_NULL(ut_params->op,
2484                                 "Failed to allocate pktmbuf offload");
2485
2486         /* Set crypto operation data parameters */
2487         rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
2488
2489         struct rte_crypto_sym_op *sym_op = ut_params->op->sym;
2490
2491         /* set crypto operation source mbuf */
2492         sym_op->m_src = ut_params->ibuf;
2493
2494         /* iv */
2495         rte_memcpy(rte_crypto_op_ctod_offset(ut_params->op, uint8_t *, IV_OFFSET),
2496                         iv, iv_len);
2497         sym_op->cipher.data.length = cipher_len;
2498         sym_op->cipher.data.offset = cipher_offset;
2499         return 0;
2500 }
2501
2502 static int
2503 create_wireless_algo_cipher_operation_oop(const uint8_t *iv, uint8_t iv_len,
2504                         unsigned int cipher_len,
2505                         unsigned int cipher_offset)
2506 {
2507         struct crypto_testsuite_params *ts_params = &testsuite_params;
2508         struct crypto_unittest_params *ut_params = &unittest_params;
2509
2510         /* Generate Crypto op data structure */
2511         ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
2512                                 RTE_CRYPTO_OP_TYPE_SYMMETRIC);
2513         TEST_ASSERT_NOT_NULL(ut_params->op,
2514                                 "Failed to allocate pktmbuf offload");
2515
2516         /* Set crypto operation data parameters */
2517         rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
2518
2519         struct rte_crypto_sym_op *sym_op = ut_params->op->sym;
2520
2521         /* set crypto operation source mbuf */
2522         sym_op->m_src = ut_params->ibuf;
2523         sym_op->m_dst = ut_params->obuf;
2524
2525         /* iv */
2526         rte_memcpy(rte_crypto_op_ctod_offset(ut_params->op, uint8_t *, IV_OFFSET),
2527                         iv, iv_len);
2528         sym_op->cipher.data.length = cipher_len;
2529         sym_op->cipher.data.offset = cipher_offset;
2530         return 0;
2531 }
2532
2533 static int
2534 create_wireless_algo_cipher_auth_session(uint8_t dev_id,
2535                 enum rte_crypto_cipher_operation cipher_op,
2536                 enum rte_crypto_auth_operation auth_op,
2537                 enum rte_crypto_auth_algorithm auth_algo,
2538                 enum rte_crypto_cipher_algorithm cipher_algo,
2539                 const uint8_t *key, uint8_t key_len,
2540                 uint8_t auth_iv_len, uint8_t auth_len,
2541                 uint8_t cipher_iv_len)
2542
2543 {
2544         uint8_t cipher_auth_key[key_len];
2545         int status;
2546
2547         struct crypto_testsuite_params *ts_params = &testsuite_params;
2548         struct crypto_unittest_params *ut_params = &unittest_params;
2549
2550         memcpy(cipher_auth_key, key, key_len);
2551
2552         /* Setup Authentication Parameters */
2553         ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;
2554         ut_params->auth_xform.next = NULL;
2555
2556         ut_params->auth_xform.auth.op = auth_op;
2557         ut_params->auth_xform.auth.algo = auth_algo;
2558         ut_params->auth_xform.auth.key.length = key_len;
2559         /* Hash key = cipher key */
2560         ut_params->auth_xform.auth.key.data = cipher_auth_key;
2561         ut_params->auth_xform.auth.digest_length = auth_len;
2562         /* Auth IV will be after cipher IV */
2563         ut_params->auth_xform.auth.iv.offset = IV_OFFSET + cipher_iv_len;
2564         ut_params->auth_xform.auth.iv.length = auth_iv_len;
2565
2566         /* Setup Cipher Parameters */
2567         ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
2568         ut_params->cipher_xform.next = &ut_params->auth_xform;
2569
2570         ut_params->cipher_xform.cipher.algo = cipher_algo;
2571         ut_params->cipher_xform.cipher.op = cipher_op;
2572         ut_params->cipher_xform.cipher.key.data = cipher_auth_key;
2573         ut_params->cipher_xform.cipher.key.length = key_len;
2574         ut_params->cipher_xform.cipher.iv.offset = IV_OFFSET;
2575         ut_params->cipher_xform.cipher.iv.length = cipher_iv_len;
2576
2577         debug_hexdump(stdout, "key:", key, key_len);
2578
2579         /* Create Crypto session*/
2580         ut_params->sess = rte_cryptodev_sym_session_create(
2581                         ts_params->session_mpool);
2582         TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed");
2583
2584         status = rte_cryptodev_sym_session_init(dev_id, ut_params->sess,
2585                         &ut_params->cipher_xform,
2586                         ts_params->session_priv_mpool);
2587         if (status == -ENOTSUP)
2588                 return TEST_SKIPPED;
2589
2590         TEST_ASSERT_EQUAL(status, 0, "session init failed");
2591         return 0;
2592 }
2593
2594 static int
2595 create_wireless_cipher_auth_session(uint8_t dev_id,
2596                 enum rte_crypto_cipher_operation cipher_op,
2597                 enum rte_crypto_auth_operation auth_op,
2598                 enum rte_crypto_auth_algorithm auth_algo,
2599                 enum rte_crypto_cipher_algorithm cipher_algo,
2600                 const struct wireless_test_data *tdata)
2601 {
2602         const uint8_t key_len = tdata->key.len;
2603         uint8_t cipher_auth_key[key_len];
2604         int status;
2605
2606         struct crypto_testsuite_params *ts_params = &testsuite_params;
2607         struct crypto_unittest_params *ut_params = &unittest_params;
2608         const uint8_t *key = tdata->key.data;
2609         const uint8_t auth_len = tdata->digest.len;
2610         uint8_t cipher_iv_len = tdata->cipher_iv.len;
2611         uint8_t auth_iv_len = tdata->auth_iv.len;
2612
2613         memcpy(cipher_auth_key, key, key_len);
2614
2615         /* Setup Authentication Parameters */
2616         ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;
2617         ut_params->auth_xform.next = NULL;
2618
2619         ut_params->auth_xform.auth.op = auth_op;
2620         ut_params->auth_xform.auth.algo = auth_algo;
2621         ut_params->auth_xform.auth.key.length = key_len;
2622         /* Hash key = cipher key */
2623         ut_params->auth_xform.auth.key.data = cipher_auth_key;
2624         ut_params->auth_xform.auth.digest_length = auth_len;
2625         /* Auth IV will be after cipher IV */
2626         ut_params->auth_xform.auth.iv.offset = IV_OFFSET + cipher_iv_len;
2627         ut_params->auth_xform.auth.iv.length = auth_iv_len;
2628
2629         /* Setup Cipher Parameters */
2630         ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
2631         ut_params->cipher_xform.next = &ut_params->auth_xform;
2632
2633         ut_params->cipher_xform.cipher.algo = cipher_algo;
2634         ut_params->cipher_xform.cipher.op = cipher_op;
2635         ut_params->cipher_xform.cipher.key.data = cipher_auth_key;
2636         ut_params->cipher_xform.cipher.key.length = key_len;
2637         ut_params->cipher_xform.cipher.iv.offset = IV_OFFSET;
2638         ut_params->cipher_xform.cipher.iv.length = cipher_iv_len;
2639
2640
2641         debug_hexdump(stdout, "key:", key, key_len);
2642
2643         /* Create Crypto session*/
2644         ut_params->sess = rte_cryptodev_sym_session_create(
2645                         ts_params->session_mpool);
2646
2647         status = rte_cryptodev_sym_session_init(dev_id, ut_params->sess,
2648                         &ut_params->cipher_xform,
2649                         ts_params->session_priv_mpool);
2650         if (status == -ENOTSUP)
2651                 return TEST_SKIPPED;
2652
2653         TEST_ASSERT_EQUAL(status, 0, "session init failed");
2654         TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed");
2655         return 0;
2656 }
2657
2658 static int
2659 create_zuc_cipher_auth_encrypt_generate_session(uint8_t dev_id,
2660                 const struct wireless_test_data *tdata)
2661 {
2662         return create_wireless_cipher_auth_session(dev_id,
2663                 RTE_CRYPTO_CIPHER_OP_ENCRYPT,
2664                 RTE_CRYPTO_AUTH_OP_GENERATE, RTE_CRYPTO_AUTH_ZUC_EIA3,
2665                 RTE_CRYPTO_CIPHER_ZUC_EEA3, tdata);
2666 }
2667
2668 static int
2669 create_wireless_algo_auth_cipher_session(uint8_t dev_id,
2670                 enum rte_crypto_cipher_operation cipher_op,
2671                 enum rte_crypto_auth_operation auth_op,
2672                 enum rte_crypto_auth_algorithm auth_algo,
2673                 enum rte_crypto_cipher_algorithm cipher_algo,
2674                 const uint8_t *key, const uint8_t key_len,
2675                 uint8_t auth_iv_len, uint8_t auth_len,
2676                 uint8_t cipher_iv_len)
2677 {
2678         uint8_t auth_cipher_key[key_len];
2679         int status;
2680         struct crypto_testsuite_params *ts_params = &testsuite_params;
2681         struct crypto_unittest_params *ut_params = &unittest_params;
2682
2683         memcpy(auth_cipher_key, key, key_len);
2684
2685         /* Setup Authentication Parameters */
2686         ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;
2687         ut_params->auth_xform.auth.op = auth_op;
2688         ut_params->auth_xform.next = &ut_params->cipher_xform;
2689         ut_params->auth_xform.auth.algo = auth_algo;
2690         ut_params->auth_xform.auth.key.length = key_len;
2691         ut_params->auth_xform.auth.key.data = auth_cipher_key;
2692         ut_params->auth_xform.auth.digest_length = auth_len;
2693         /* Auth IV will be after cipher IV */
2694         ut_params->auth_xform.auth.iv.offset = IV_OFFSET + cipher_iv_len;
2695         ut_params->auth_xform.auth.iv.length = auth_iv_len;
2696
2697         /* Setup Cipher Parameters */
2698         ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
2699         ut_params->cipher_xform.next = NULL;
2700         ut_params->cipher_xform.cipher.algo = cipher_algo;
2701         ut_params->cipher_xform.cipher.op = cipher_op;
2702         ut_params->cipher_xform.cipher.key.data = auth_cipher_key;
2703         ut_params->cipher_xform.cipher.key.length = key_len;
2704         ut_params->cipher_xform.cipher.iv.offset = IV_OFFSET;
2705         ut_params->cipher_xform.cipher.iv.length = cipher_iv_len;
2706
2707         debug_hexdump(stdout, "key:", key, key_len);
2708
2709         /* Create Crypto session*/
2710         ut_params->sess = rte_cryptodev_sym_session_create(
2711                         ts_params->session_mpool);
2712         TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed");
2713
2714         if (cipher_op == RTE_CRYPTO_CIPHER_OP_DECRYPT) {
2715                 ut_params->auth_xform.next = NULL;
2716                 ut_params->cipher_xform.next = &ut_params->auth_xform;
2717                 status = rte_cryptodev_sym_session_init(dev_id, ut_params->sess,
2718                                 &ut_params->cipher_xform,
2719                                 ts_params->session_priv_mpool);
2720
2721         } else
2722                 status = rte_cryptodev_sym_session_init(dev_id, ut_params->sess,
2723                                 &ut_params->auth_xform,
2724                                 ts_params->session_priv_mpool);
2725
2726         if (status == -ENOTSUP)
2727                 return TEST_SKIPPED;
2728
2729         TEST_ASSERT_EQUAL(status, 0, "session init failed");
2730
2731         return 0;
2732 }
2733
2734 static int
2735 create_wireless_algo_hash_operation(const uint8_t *auth_tag,
2736                 unsigned int auth_tag_len,
2737                 const uint8_t *iv, unsigned int iv_len,
2738                 unsigned int data_pad_len,
2739                 enum rte_crypto_auth_operation op,
2740                 unsigned int auth_len, unsigned int auth_offset)
2741 {
2742         struct crypto_testsuite_params *ts_params = &testsuite_params;
2743
2744         struct crypto_unittest_params *ut_params = &unittest_params;
2745
2746         /* Generate Crypto op data structure */
2747         ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
2748                         RTE_CRYPTO_OP_TYPE_SYMMETRIC);
2749         TEST_ASSERT_NOT_NULL(ut_params->op,
2750                 "Failed to allocate pktmbuf offload");
2751
2752         /* Set crypto operation data parameters */
2753         rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
2754
2755         struct rte_crypto_sym_op *sym_op = ut_params->op->sym;
2756
2757         /* set crypto operation source mbuf */
2758         sym_op->m_src = ut_params->ibuf;
2759
2760         /* iv */
2761         rte_memcpy(rte_crypto_op_ctod_offset(ut_params->op, uint8_t *, IV_OFFSET),
2762                         iv, iv_len);
2763         /* digest */
2764         sym_op->auth.digest.data = (uint8_t *)rte_pktmbuf_append(
2765                                         ut_params->ibuf, auth_tag_len);
2766
2767         TEST_ASSERT_NOT_NULL(sym_op->auth.digest.data,
2768                                 "no room to append auth tag");
2769         ut_params->digest = sym_op->auth.digest.data;
2770         sym_op->auth.digest.phys_addr = rte_pktmbuf_iova_offset(
2771                         ut_params->ibuf, data_pad_len);
2772         if (op == RTE_CRYPTO_AUTH_OP_GENERATE)
2773                 memset(sym_op->auth.digest.data, 0, auth_tag_len);
2774         else
2775                 rte_memcpy(sym_op->auth.digest.data, auth_tag, auth_tag_len);
2776
2777         debug_hexdump(stdout, "digest:",
2778                 sym_op->auth.digest.data,
2779                 auth_tag_len);
2780
2781         sym_op->auth.data.length = auth_len;
2782         sym_op->auth.data.offset = auth_offset;
2783
2784         return 0;
2785 }
2786
2787 static int
2788 create_wireless_cipher_hash_operation(const struct wireless_test_data *tdata,
2789         enum rte_crypto_auth_operation op)
2790 {
2791         struct crypto_testsuite_params *ts_params = &testsuite_params;
2792         struct crypto_unittest_params *ut_params = &unittest_params;
2793
2794         const uint8_t *auth_tag = tdata->digest.data;
2795         const unsigned int auth_tag_len = tdata->digest.len;
2796         unsigned int plaintext_len = ceil_byte_length(tdata->plaintext.len);
2797         unsigned int data_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16);
2798
2799         const uint8_t *cipher_iv = tdata->cipher_iv.data;
2800         const uint8_t cipher_iv_len = tdata->cipher_iv.len;
2801         const uint8_t *auth_iv = tdata->auth_iv.data;
2802         const uint8_t auth_iv_len = tdata->auth_iv.len;
2803         const unsigned int cipher_len = tdata->validCipherLenInBits.len;
2804         const unsigned int auth_len = tdata->validAuthLenInBits.len;
2805
2806         /* Generate Crypto op data structure */
2807         ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
2808                         RTE_CRYPTO_OP_TYPE_SYMMETRIC);
2809         TEST_ASSERT_NOT_NULL(ut_params->op,
2810                         "Failed to allocate pktmbuf offload");
2811         /* Set crypto operation data parameters */
2812         rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
2813
2814         struct rte_crypto_sym_op *sym_op = ut_params->op->sym;
2815
2816         /* set crypto operation source mbuf */
2817         sym_op->m_src = ut_params->ibuf;
2818
2819         /* digest */
2820         sym_op->auth.digest.data = (uint8_t *)rte_pktmbuf_append(
2821                         ut_params->ibuf, auth_tag_len);
2822
2823         TEST_ASSERT_NOT_NULL(sym_op->auth.digest.data,
2824                         "no room to append auth tag");
2825         ut_params->digest = sym_op->auth.digest.data;
2826         sym_op->auth.digest.phys_addr = rte_pktmbuf_iova_offset(
2827                         ut_params->ibuf, data_pad_len);
2828         if (op == RTE_CRYPTO_AUTH_OP_GENERATE)
2829                 memset(sym_op->auth.digest.data, 0, auth_tag_len);
2830         else
2831                 rte_memcpy(sym_op->auth.digest.data, auth_tag, auth_tag_len);
2832
2833         debug_hexdump(stdout, "digest:",
2834                 sym_op->auth.digest.data,
2835                 auth_tag_len);
2836
2837         /* Copy cipher and auth IVs at the end of the crypto operation */
2838         uint8_t *iv_ptr = rte_crypto_op_ctod_offset(ut_params->op, uint8_t *,
2839                                                 IV_OFFSET);
2840         rte_memcpy(iv_ptr, cipher_iv, cipher_iv_len);
2841         iv_ptr += cipher_iv_len;
2842         rte_memcpy(iv_ptr, auth_iv, auth_iv_len);
2843
2844         sym_op->cipher.data.length = cipher_len;
2845         sym_op->cipher.data.offset = 0;
2846         sym_op->auth.data.length = auth_len;
2847         sym_op->auth.data.offset = 0;
2848
2849         return 0;
2850 }
2851
2852 static int
2853 create_zuc_cipher_hash_generate_operation(
2854                 const struct wireless_test_data *tdata)
2855 {
2856         return create_wireless_cipher_hash_operation(tdata,
2857                 RTE_CRYPTO_AUTH_OP_GENERATE);
2858 }
2859
2860 static int
2861 create_wireless_algo_cipher_hash_operation(const uint8_t *auth_tag,
2862                 const unsigned auth_tag_len,
2863                 const uint8_t *auth_iv, uint8_t auth_iv_len,
2864                 unsigned data_pad_len,
2865                 enum rte_crypto_auth_operation op,
2866                 const uint8_t *cipher_iv, uint8_t cipher_iv_len,
2867                 const unsigned cipher_len, const unsigned cipher_offset,
2868                 const unsigned auth_len, const unsigned auth_offset)
2869 {
2870         struct crypto_testsuite_params *ts_params = &testsuite_params;
2871         struct crypto_unittest_params *ut_params = &unittest_params;
2872
2873         enum rte_crypto_cipher_algorithm cipher_algo =
2874                         ut_params->cipher_xform.cipher.algo;
2875         enum rte_crypto_auth_algorithm auth_algo =
2876                         ut_params->auth_xform.auth.algo;
2877
2878         /* Generate Crypto op data structure */
2879         ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
2880                         RTE_CRYPTO_OP_TYPE_SYMMETRIC);
2881         TEST_ASSERT_NOT_NULL(ut_params->op,
2882                         "Failed to allocate pktmbuf offload");
2883         /* Set crypto operation data parameters */
2884         rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
2885
2886         struct rte_crypto_sym_op *sym_op = ut_params->op->sym;
2887
2888         /* set crypto operation source mbuf */
2889         sym_op->m_src = ut_params->ibuf;
2890
2891         /* digest */
2892         sym_op->auth.digest.data = (uint8_t *)rte_pktmbuf_append(
2893                         ut_params->ibuf, auth_tag_len);
2894
2895         TEST_ASSERT_NOT_NULL(sym_op->auth.digest.data,
2896                         "no room to append auth tag");
2897         ut_params->digest = sym_op->auth.digest.data;
2898
2899         if (rte_pktmbuf_is_contiguous(ut_params->ibuf)) {
2900                 sym_op->auth.digest.phys_addr = rte_pktmbuf_iova_offset(
2901                                 ut_params->ibuf, data_pad_len);
2902         } else {
2903                 struct rte_mbuf *m = ut_params->ibuf;
2904                 unsigned int offset = data_pad_len;
2905
2906                 while (offset > m->data_len && m->next != NULL) {
2907                         offset -= m->data_len;
2908                         m = m->next;
2909                 }
2910                 sym_op->auth.digest.phys_addr = rte_pktmbuf_iova_offset(
2911                         m, offset);
2912         }
2913
2914         if (op == RTE_CRYPTO_AUTH_OP_GENERATE)
2915                 memset(sym_op->auth.digest.data, 0, auth_tag_len);
2916         else
2917                 rte_memcpy(sym_op->auth.digest.data, auth_tag, auth_tag_len);
2918
2919         debug_hexdump(stdout, "digest:",
2920                 sym_op->auth.digest.data,
2921                 auth_tag_len);
2922
2923         /* Copy cipher and auth IVs at the end of the crypto operation */
2924         uint8_t *iv_ptr = rte_crypto_op_ctod_offset(ut_params->op, uint8_t *,
2925                                                 IV_OFFSET);
2926         rte_memcpy(iv_ptr, cipher_iv, cipher_iv_len);
2927         iv_ptr += cipher_iv_len;
2928         rte_memcpy(iv_ptr, auth_iv, auth_iv_len);
2929
2930         if (cipher_algo == RTE_CRYPTO_CIPHER_SNOW3G_UEA2 ||
2931                 cipher_algo == RTE_CRYPTO_CIPHER_KASUMI_F8 ||
2932                 cipher_algo == RTE_CRYPTO_CIPHER_ZUC_EEA3) {
2933                 sym_op->cipher.data.length = cipher_len;
2934                 sym_op->cipher.data.offset = cipher_offset;
2935         } else {
2936                 sym_op->cipher.data.length = cipher_len >> 3;
2937                 sym_op->cipher.data.offset = cipher_offset >> 3;
2938         }
2939
2940         if (auth_algo == RTE_CRYPTO_AUTH_SNOW3G_UIA2 ||
2941                 auth_algo == RTE_CRYPTO_AUTH_KASUMI_F9 ||
2942                 auth_algo == RTE_CRYPTO_AUTH_ZUC_EIA3) {
2943                 sym_op->auth.data.length = auth_len;
2944                 sym_op->auth.data.offset = auth_offset;
2945         } else {
2946                 sym_op->auth.data.length = auth_len >> 3;
2947                 sym_op->auth.data.offset = auth_offset >> 3;
2948         }
2949
2950         return 0;
2951 }
2952
2953 static int
2954 create_wireless_algo_auth_cipher_operation(
2955                 const uint8_t *auth_tag, unsigned int auth_tag_len,
2956                 const uint8_t *cipher_iv, uint8_t cipher_iv_len,
2957                 const uint8_t *auth_iv, uint8_t auth_iv_len,
2958                 unsigned int data_pad_len,
2959                 unsigned int cipher_len, unsigned int cipher_offset,
2960                 unsigned int auth_len, unsigned int auth_offset,
2961                 uint8_t op_mode, uint8_t do_sgl, uint8_t verify)
2962 {
2963         struct crypto_testsuite_params *ts_params = &testsuite_params;
2964         struct crypto_unittest_params *ut_params = &unittest_params;
2965
2966         enum rte_crypto_cipher_algorithm cipher_algo =
2967                         ut_params->cipher_xform.cipher.algo;
2968         enum rte_crypto_auth_algorithm auth_algo =
2969                         ut_params->auth_xform.auth.algo;
2970
2971         /* Generate Crypto op data structure */
2972         ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
2973                         RTE_CRYPTO_OP_TYPE_SYMMETRIC);
2974         TEST_ASSERT_NOT_NULL(ut_params->op,
2975                         "Failed to allocate pktmbuf offload");
2976
2977         /* Set crypto operation data parameters */
2978         rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
2979
2980         struct rte_crypto_sym_op *sym_op = ut_params->op->sym;
2981
2982         /* set crypto operation mbufs */
2983         sym_op->m_src = ut_params->ibuf;
2984         if (op_mode == OUT_OF_PLACE)
2985                 sym_op->m_dst = ut_params->obuf;
2986
2987         /* digest */
2988         if (!do_sgl) {
2989                 sym_op->auth.digest.data = rte_pktmbuf_mtod_offset(
2990                         (op_mode == IN_PLACE ?
2991                                 ut_params->ibuf : ut_params->obuf),
2992                         uint8_t *, data_pad_len);
2993                 sym_op->auth.digest.phys_addr = rte_pktmbuf_iova_offset(
2994                         (op_mode == IN_PLACE ?
2995                                 ut_params->ibuf : ut_params->obuf),
2996                         data_pad_len);
2997                 memset(sym_op->auth.digest.data, 0, auth_tag_len);
2998         } else {
2999                 uint16_t remaining_off = (auth_offset >> 3) + (auth_len >> 3);
3000                 struct rte_mbuf *sgl_buf = (op_mode == IN_PLACE ?
3001                                 sym_op->m_src : sym_op->m_dst);
3002                 while (remaining_off >= rte_pktmbuf_data_len(sgl_buf)) {
3003                         remaining_off -= rte_pktmbuf_data_len(sgl_buf);
3004                         sgl_buf = sgl_buf->next;
3005                 }
3006                 sym_op->auth.digest.data = rte_pktmbuf_mtod_offset(sgl_buf,
3007                                 uint8_t *, remaining_off);
3008                 sym_op->auth.digest.phys_addr = rte_pktmbuf_iova_offset(sgl_buf,
3009                                 remaining_off);
3010                 memset(sym_op->auth.digest.data, 0, remaining_off);
3011                 while (sgl_buf->next != NULL) {
3012                         memset(rte_pktmbuf_mtod(sgl_buf, uint8_t *),
3013                                 0, rte_pktmbuf_data_len(sgl_buf));
3014                         sgl_buf = sgl_buf->next;
3015                 }
3016         }
3017
3018         /* Copy digest for the verification */
3019         if (verify)
3020                 memcpy(sym_op->auth.digest.data, auth_tag, auth_tag_len);
3021
3022         /* Copy cipher and auth IVs at the end of the crypto operation */
3023         uint8_t *iv_ptr = rte_crypto_op_ctod_offset(
3024                         ut_params->op, uint8_t *, IV_OFFSET);
3025
3026         rte_memcpy(iv_ptr, cipher_iv, cipher_iv_len);
3027         iv_ptr += cipher_iv_len;
3028         rte_memcpy(iv_ptr, auth_iv, auth_iv_len);
3029
3030         /* Only copy over the offset data needed from src to dst in OOP,
3031          * if the auth and cipher offsets are not aligned
3032          */
3033         if (op_mode == OUT_OF_PLACE) {
3034                 if (cipher_offset > auth_offset)
3035                         rte_memcpy(
3036                                 rte_pktmbuf_mtod_offset(
3037                                         sym_op->m_dst,
3038                                         uint8_t *, auth_offset >> 3),
3039                                 rte_pktmbuf_mtod_offset(
3040                                         sym_op->m_src,
3041                                         uint8_t *, auth_offset >> 3),
3042                                 ((cipher_offset >> 3) - (auth_offset >> 3)));
3043         }
3044
3045         if (cipher_algo == RTE_CRYPTO_CIPHER_SNOW3G_UEA2 ||
3046                 cipher_algo == RTE_CRYPTO_CIPHER_KASUMI_F8 ||
3047                 cipher_algo == RTE_CRYPTO_CIPHER_ZUC_EEA3) {
3048                 sym_op->cipher.data.length = cipher_len;
3049                 sym_op->cipher.data.offset = cipher_offset;
3050         } else {
3051                 sym_op->cipher.data.length = cipher_len >> 3;
3052                 sym_op->cipher.data.offset = cipher_offset >> 3;
3053         }
3054
3055         if (auth_algo == RTE_CRYPTO_AUTH_SNOW3G_UIA2 ||
3056                 auth_algo == RTE_CRYPTO_AUTH_KASUMI_F9 ||
3057                 auth_algo == RTE_CRYPTO_AUTH_ZUC_EIA3) {
3058                 sym_op->auth.data.length = auth_len;
3059                 sym_op->auth.data.offset = auth_offset;
3060         } else {
3061                 sym_op->auth.data.length = auth_len >> 3;
3062                 sym_op->auth.data.offset = auth_offset >> 3;
3063         }
3064
3065         return 0;
3066 }
3067
3068 static int
3069 test_snow3g_authentication(const struct snow3g_hash_test_data *tdata)
3070 {
3071         struct crypto_testsuite_params *ts_params = &testsuite_params;
3072         struct crypto_unittest_params *ut_params = &unittest_params;
3073
3074         int retval;
3075         unsigned plaintext_pad_len;
3076         unsigned plaintext_len;
3077         uint8_t *plaintext;
3078         struct rte_cryptodev_info dev_info;
3079
3080         rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
3081         uint64_t feat_flags = dev_info.feature_flags;
3082
3083         if (!(feat_flags & RTE_CRYPTODEV_FF_NON_BYTE_ALIGNED_DATA) &&
3084                         ((tdata->validAuthLenInBits.len % 8) != 0)) {
3085                 printf("Device doesn't support NON-Byte Aligned Data.\n");
3086                 return TEST_SKIPPED;
3087         }
3088
3089         if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
3090                         (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
3091                 printf("Device doesn't support RAW data-path APIs.\n");
3092                 return TEST_SKIPPED;
3093         }
3094
3095         if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
3096                 return TEST_SKIPPED;
3097
3098         /* Verify the capabilities */
3099         struct rte_cryptodev_sym_capability_idx cap_idx;
3100         cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
3101         cap_idx.algo.auth = RTE_CRYPTO_AUTH_SNOW3G_UIA2;
3102         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
3103                         &cap_idx) == NULL)
3104                 return TEST_SKIPPED;
3105
3106         /* Create SNOW 3G session */
3107         retval = create_wireless_algo_hash_session(ts_params->valid_devs[0],
3108                         tdata->key.data, tdata->key.len,
3109                         tdata->auth_iv.len, tdata->digest.len,
3110                         RTE_CRYPTO_AUTH_OP_GENERATE,
3111                         RTE_CRYPTO_AUTH_SNOW3G_UIA2);
3112         if (retval < 0)
3113                 return retval;
3114
3115         /* alloc mbuf and set payload */
3116         ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
3117
3118         memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
3119         rte_pktmbuf_tailroom(ut_params->ibuf));
3120
3121         plaintext_len = ceil_byte_length(tdata->plaintext.len);
3122         /* Append data which is padded to a multiple of */
3123         /* the algorithms block size */
3124         plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16);
3125         plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
3126                                 plaintext_pad_len);
3127         memcpy(plaintext, tdata->plaintext.data, plaintext_len);
3128
3129         /* Create SNOW 3G operation */
3130         retval = create_wireless_algo_hash_operation(NULL, tdata->digest.len,
3131                         tdata->auth_iv.data, tdata->auth_iv.len,
3132                         plaintext_pad_len, RTE_CRYPTO_AUTH_OP_GENERATE,
3133                         tdata->validAuthLenInBits.len,
3134                         0);
3135         if (retval < 0)
3136                 return retval;
3137
3138         if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
3139                 process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
3140                                 ut_params->op, 0, 1, 1, 0);
3141         else
3142                 ut_params->op = process_crypto_request(ts_params->valid_devs[0],
3143                                 ut_params->op);
3144         ut_params->obuf = ut_params->op->sym->m_src;
3145         TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
3146         ut_params->digest = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *)
3147                         + plaintext_pad_len;
3148
3149         /* Validate obuf */
3150         TEST_ASSERT_BUFFERS_ARE_EQUAL(
3151         ut_params->digest,
3152         tdata->digest.data,
3153         DIGEST_BYTE_LENGTH_SNOW3G_UIA2,
3154         "SNOW 3G Generated auth tag not as expected");
3155
3156         return 0;
3157 }
3158
3159 static int
3160 test_snow3g_authentication_verify(const struct snow3g_hash_test_data *tdata)
3161 {
3162         struct crypto_testsuite_params *ts_params = &testsuite_params;
3163         struct crypto_unittest_params *ut_params = &unittest_params;
3164
3165         int retval;
3166         unsigned plaintext_pad_len;
3167         unsigned plaintext_len;
3168         uint8_t *plaintext;
3169         struct rte_cryptodev_info dev_info;
3170
3171         rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
3172         uint64_t feat_flags = dev_info.feature_flags;
3173
3174         if (!(feat_flags & RTE_CRYPTODEV_FF_NON_BYTE_ALIGNED_DATA) &&
3175                         ((tdata->validAuthLenInBits.len % 8) != 0)) {
3176                 printf("Device doesn't support NON-Byte Aligned Data.\n");
3177                 return TEST_SKIPPED;
3178         }
3179
3180         if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
3181                         (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
3182                 printf("Device doesn't support RAW data-path APIs.\n");
3183                 return TEST_SKIPPED;
3184         }
3185
3186         if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
3187                 return TEST_SKIPPED;
3188
3189         /* Verify the capabilities */
3190         struct rte_cryptodev_sym_capability_idx cap_idx;
3191         cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
3192         cap_idx.algo.auth = RTE_CRYPTO_AUTH_SNOW3G_UIA2;
3193         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
3194                         &cap_idx) == NULL)
3195                 return TEST_SKIPPED;
3196
3197         /* Create SNOW 3G session */
3198         retval = create_wireless_algo_hash_session(ts_params->valid_devs[0],
3199                                 tdata->key.data, tdata->key.len,
3200                                 tdata->auth_iv.len, tdata->digest.len,
3201                                 RTE_CRYPTO_AUTH_OP_VERIFY,
3202                                 RTE_CRYPTO_AUTH_SNOW3G_UIA2);
3203         if (retval < 0)
3204                 return retval;
3205         /* alloc mbuf and set payload */
3206         ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
3207
3208         memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
3209         rte_pktmbuf_tailroom(ut_params->ibuf));
3210
3211         plaintext_len = ceil_byte_length(tdata->plaintext.len);
3212         /* Append data which is padded to a multiple of */
3213         /* the algorithms block size */
3214         plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16);
3215         plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
3216                                 plaintext_pad_len);
3217         memcpy(plaintext, tdata->plaintext.data, plaintext_len);
3218
3219         /* Create SNOW 3G operation */
3220         retval = create_wireless_algo_hash_operation(tdata->digest.data,
3221                         tdata->digest.len,
3222                         tdata->auth_iv.data, tdata->auth_iv.len,
3223                         plaintext_pad_len,
3224                         RTE_CRYPTO_AUTH_OP_VERIFY,
3225                         tdata->validAuthLenInBits.len,
3226                         0);
3227         if (retval < 0)
3228                 return retval;
3229
3230         if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
3231                 process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
3232                                 ut_params->op, 0, 1, 1, 0);
3233         else
3234                 ut_params->op = process_crypto_request(ts_params->valid_devs[0],
3235                                 ut_params->op);
3236         TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
3237         ut_params->obuf = ut_params->op->sym->m_src;
3238         ut_params->digest = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *)
3239                                 + plaintext_pad_len;
3240
3241         /* Validate obuf */
3242         if (ut_params->op->status == RTE_CRYPTO_OP_STATUS_SUCCESS)
3243                 return 0;
3244         else
3245                 return -1;
3246
3247         return 0;
3248 }
3249
3250 static int
3251 test_kasumi_authentication(const struct kasumi_hash_test_data *tdata)
3252 {
3253         struct crypto_testsuite_params *ts_params = &testsuite_params;
3254         struct crypto_unittest_params *ut_params = &unittest_params;
3255
3256         int retval;
3257         unsigned plaintext_pad_len;
3258         unsigned plaintext_len;
3259         uint8_t *plaintext;
3260         struct rte_cryptodev_info dev_info;
3261
3262         rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
3263         uint64_t feat_flags = dev_info.feature_flags;
3264
3265         if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
3266                         (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
3267                 printf("Device doesn't support RAW data-path APIs.\n");
3268                 return TEST_SKIPPED;
3269         }
3270
3271         if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
3272                 return TEST_SKIPPED;
3273
3274         /* Verify the capabilities */
3275         struct rte_cryptodev_sym_capability_idx cap_idx;
3276         cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
3277         cap_idx.algo.auth = RTE_CRYPTO_AUTH_KASUMI_F9;
3278         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
3279                         &cap_idx) == NULL)
3280                 return TEST_SKIPPED;
3281
3282         /* Create KASUMI session */
3283         retval = create_wireless_algo_hash_session(ts_params->valid_devs[0],
3284                         tdata->key.data, tdata->key.len,
3285                         0, tdata->digest.len,
3286                         RTE_CRYPTO_AUTH_OP_GENERATE,
3287                         RTE_CRYPTO_AUTH_KASUMI_F9);
3288         if (retval < 0)
3289                 return retval;
3290
3291         /* alloc mbuf and set payload */
3292         ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
3293
3294         memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
3295         rte_pktmbuf_tailroom(ut_params->ibuf));
3296
3297         plaintext_len = ceil_byte_length(tdata->plaintext.len);
3298         /* Append data which is padded to a multiple of */
3299         /* the algorithms block size */
3300         plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 8);
3301         plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
3302                                 plaintext_pad_len);
3303         memcpy(plaintext, tdata->plaintext.data, plaintext_len);
3304
3305         /* Create KASUMI operation */
3306         retval = create_wireless_algo_hash_operation(NULL, tdata->digest.len,
3307                         NULL, 0,
3308                         plaintext_pad_len, RTE_CRYPTO_AUTH_OP_GENERATE,
3309                         tdata->plaintext.len,
3310                         0);
3311         if (retval < 0)
3312                 return retval;
3313
3314         if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
3315                 process_cpu_crypt_auth_op(ts_params->valid_devs[0],
3316                         ut_params->op);
3317         else if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
3318                 process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
3319                                 ut_params->op, 0, 1, 1, 0);
3320         else
3321                 ut_params->op = process_crypto_request(ts_params->valid_devs[0],
3322                         ut_params->op);
3323
3324         ut_params->obuf = ut_params->op->sym->m_src;
3325         TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
3326         ut_params->digest = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *)
3327                         + plaintext_pad_len;
3328
3329         /* Validate obuf */
3330         TEST_ASSERT_BUFFERS_ARE_EQUAL(
3331         ut_params->digest,
3332         tdata->digest.data,
3333         DIGEST_BYTE_LENGTH_KASUMI_F9,
3334         "KASUMI Generated auth tag not as expected");
3335
3336         return 0;
3337 }
3338
3339 static int
3340 test_kasumi_authentication_verify(const struct kasumi_hash_test_data *tdata)
3341 {
3342         struct crypto_testsuite_params *ts_params = &testsuite_params;
3343         struct crypto_unittest_params *ut_params = &unittest_params;
3344
3345         int retval;
3346         unsigned plaintext_pad_len;
3347         unsigned plaintext_len;
3348         uint8_t *plaintext;
3349         struct rte_cryptodev_info dev_info;
3350
3351         rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
3352         uint64_t feat_flags = dev_info.feature_flags;
3353
3354         if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
3355                         (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
3356                 printf("Device doesn't support RAW data-path APIs.\n");
3357                 return TEST_SKIPPED;
3358         }
3359
3360         if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
3361                 return TEST_SKIPPED;
3362
3363         /* Verify the capabilities */
3364         struct rte_cryptodev_sym_capability_idx cap_idx;
3365         cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
3366         cap_idx.algo.auth = RTE_CRYPTO_AUTH_KASUMI_F9;
3367         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
3368                         &cap_idx) == NULL)
3369                 return TEST_SKIPPED;
3370
3371         /* Create KASUMI session */
3372         retval = create_wireless_algo_hash_session(ts_params->valid_devs[0],
3373                                 tdata->key.data, tdata->key.len,
3374                                 0, tdata->digest.len,
3375                                 RTE_CRYPTO_AUTH_OP_VERIFY,
3376                                 RTE_CRYPTO_AUTH_KASUMI_F9);
3377         if (retval < 0)
3378                 return retval;
3379         /* alloc mbuf and set payload */
3380         ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
3381
3382         memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
3383         rte_pktmbuf_tailroom(ut_params->ibuf));
3384
3385         plaintext_len = ceil_byte_length(tdata->plaintext.len);
3386         /* Append data which is padded to a multiple */
3387         /* of the algorithms block size */
3388         plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 8);
3389         plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
3390                                 plaintext_pad_len);
3391         memcpy(plaintext, tdata->plaintext.data, plaintext_len);
3392
3393         /* Create KASUMI operation */
3394         retval = create_wireless_algo_hash_operation(tdata->digest.data,
3395                         tdata->digest.len,
3396                         NULL, 0,
3397                         plaintext_pad_len,
3398                         RTE_CRYPTO_AUTH_OP_VERIFY,
3399                         tdata->plaintext.len,
3400                         0);
3401         if (retval < 0)
3402                 return retval;
3403
3404         if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
3405                 process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
3406                                 ut_params->op, 0, 1, 1, 0);
3407         else
3408                 ut_params->op = process_crypto_request(ts_params->valid_devs[0],
3409                                 ut_params->op);
3410         TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
3411         ut_params->obuf = ut_params->op->sym->m_src;
3412         ut_params->digest = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *)
3413                                 + plaintext_pad_len;
3414
3415         /* Validate obuf */
3416         if (ut_params->op->status == RTE_CRYPTO_OP_STATUS_SUCCESS)
3417                 return 0;
3418         else
3419                 return -1;
3420
3421         return 0;
3422 }
3423
3424 static int
3425 test_snow3g_hash_generate_test_case_1(void)
3426 {
3427         return test_snow3g_authentication(&snow3g_hash_test_case_1);
3428 }
3429
3430 static int
3431 test_snow3g_hash_generate_test_case_2(void)
3432 {
3433         return test_snow3g_authentication(&snow3g_hash_test_case_2);
3434 }
3435
3436 static int
3437 test_snow3g_hash_generate_test_case_3(void)
3438 {
3439         return test_snow3g_authentication(&snow3g_hash_test_case_3);
3440 }
3441
3442 static int
3443 test_snow3g_hash_generate_test_case_4(void)
3444 {
3445         return test_snow3g_authentication(&snow3g_hash_test_case_4);
3446 }
3447
3448 static int
3449 test_snow3g_hash_generate_test_case_5(void)
3450 {
3451         return test_snow3g_authentication(&snow3g_hash_test_case_5);
3452 }
3453
3454 static int
3455 test_snow3g_hash_generate_test_case_6(void)
3456 {
3457         return test_snow3g_authentication(&snow3g_hash_test_case_6);
3458 }
3459
3460 static int
3461 test_snow3g_hash_verify_test_case_1(void)
3462 {
3463         return test_snow3g_authentication_verify(&snow3g_hash_test_case_1);
3464
3465 }
3466
3467 static int
3468 test_snow3g_hash_verify_test_case_2(void)
3469 {
3470         return test_snow3g_authentication_verify(&snow3g_hash_test_case_2);
3471 }
3472
3473 static int
3474 test_snow3g_hash_verify_test_case_3(void)
3475 {
3476         return test_snow3g_authentication_verify(&snow3g_hash_test_case_3);
3477 }
3478
3479 static int
3480 test_snow3g_hash_verify_test_case_4(void)
3481 {
3482         return test_snow3g_authentication_verify(&snow3g_hash_test_case_4);
3483 }
3484
3485 static int
3486 test_snow3g_hash_verify_test_case_5(void)
3487 {
3488         return test_snow3g_authentication_verify(&snow3g_hash_test_case_5);
3489 }
3490
3491 static int
3492 test_snow3g_hash_verify_test_case_6(void)
3493 {
3494         return test_snow3g_authentication_verify(&snow3g_hash_test_case_6);
3495 }
3496
3497 static int
3498 test_kasumi_hash_generate_test_case_1(void)
3499 {
3500         return test_kasumi_authentication(&kasumi_hash_test_case_1);
3501 }
3502
3503 static int
3504 test_kasumi_hash_generate_test_case_2(void)
3505 {
3506         return test_kasumi_authentication(&kasumi_hash_test_case_2);
3507 }
3508
3509 static int
3510 test_kasumi_hash_generate_test_case_3(void)
3511 {
3512         return test_kasumi_authentication(&kasumi_hash_test_case_3);
3513 }
3514
3515 static int
3516 test_kasumi_hash_generate_test_case_4(void)
3517 {
3518         return test_kasumi_authentication(&kasumi_hash_test_case_4);
3519 }
3520
3521 static int
3522 test_kasumi_hash_generate_test_case_5(void)
3523 {
3524         return test_kasumi_authentication(&kasumi_hash_test_case_5);
3525 }
3526
3527 static int
3528 test_kasumi_hash_generate_test_case_6(void)
3529 {
3530         return test_kasumi_authentication(&kasumi_hash_test_case_6);
3531 }
3532
3533 static int
3534 test_kasumi_hash_verify_test_case_1(void)
3535 {
3536         return test_kasumi_authentication_verify(&kasumi_hash_test_case_1);
3537 }
3538
3539 static int
3540 test_kasumi_hash_verify_test_case_2(void)
3541 {
3542         return test_kasumi_authentication_verify(&kasumi_hash_test_case_2);
3543 }
3544
3545 static int
3546 test_kasumi_hash_verify_test_case_3(void)
3547 {
3548         return test_kasumi_authentication_verify(&kasumi_hash_test_case_3);
3549 }
3550
3551 static int
3552 test_kasumi_hash_verify_test_case_4(void)
3553 {
3554         return test_kasumi_authentication_verify(&kasumi_hash_test_case_4);
3555 }
3556
3557 static int
3558 test_kasumi_hash_verify_test_case_5(void)
3559 {
3560         return test_kasumi_authentication_verify(&kasumi_hash_test_case_5);
3561 }
3562
3563 static int
3564 test_kasumi_encryption(const struct kasumi_test_data *tdata)
3565 {
3566         struct crypto_testsuite_params *ts_params = &testsuite_params;
3567         struct crypto_unittest_params *ut_params = &unittest_params;
3568
3569         int retval;
3570         uint8_t *plaintext, *ciphertext;
3571         unsigned plaintext_pad_len;
3572         unsigned plaintext_len;
3573         struct rte_cryptodev_info dev_info;
3574
3575         rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
3576         uint64_t feat_flags = dev_info.feature_flags;
3577
3578         if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
3579                         (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
3580                 printf("Device doesn't support RAW data-path APIs.\n");
3581                 return TEST_SKIPPED;
3582         }
3583
3584         if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
3585                 return TEST_SKIPPED;
3586
3587         /* Verify the capabilities */
3588         struct rte_cryptodev_sym_capability_idx cap_idx;
3589         cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
3590         cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_KASUMI_F8;
3591         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
3592                         &cap_idx) == NULL)
3593                 return TEST_SKIPPED;
3594
3595         /* Create KASUMI session */
3596         retval = create_wireless_algo_cipher_session(ts_params->valid_devs[0],
3597                                         RTE_CRYPTO_CIPHER_OP_ENCRYPT,
3598                                         RTE_CRYPTO_CIPHER_KASUMI_F8,
3599                                         tdata->key.data, tdata->key.len,
3600                                         tdata->cipher_iv.len);
3601         if (retval < 0)
3602                 return retval;
3603
3604         ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
3605
3606         /* Clear mbuf payload */
3607         memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
3608                rte_pktmbuf_tailroom(ut_params->ibuf));
3609
3610         plaintext_len = ceil_byte_length(tdata->plaintext.len);
3611         /* Append data which is padded to a multiple */
3612         /* of the algorithms block size */
3613         plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 8);
3614         plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
3615                                 plaintext_pad_len);
3616         memcpy(plaintext, tdata->plaintext.data, plaintext_len);
3617
3618         debug_hexdump(stdout, "plaintext:", plaintext, plaintext_len);
3619
3620         /* Create KASUMI operation */
3621         retval = create_wireless_algo_cipher_operation(tdata->cipher_iv.data,
3622                                 tdata->cipher_iv.len,
3623                                 RTE_ALIGN_CEIL(tdata->validCipherLenInBits.len, 8),
3624                                 tdata->validCipherOffsetInBits.len);
3625         if (retval < 0)
3626                 return retval;
3627
3628         if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
3629                 process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
3630                                 ut_params->op, 1, 0, 1, tdata->cipher_iv.len);
3631         else
3632                 ut_params->op = process_crypto_request(ts_params->valid_devs[0],
3633                                 ut_params->op);
3634         TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
3635
3636         ut_params->obuf = ut_params->op->sym->m_dst;
3637         if (ut_params->obuf)
3638                 ciphertext = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *);
3639         else
3640                 ciphertext = plaintext + (tdata->validCipherOffsetInBits.len >> 3);
3641
3642         debug_hexdump(stdout, "ciphertext:", ciphertext, plaintext_len);
3643
3644         const uint8_t *reference_ciphertext = tdata->ciphertext.data +
3645                                 (tdata->validCipherOffsetInBits.len >> 3);
3646         /* Validate obuf */
3647         TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
3648                 ciphertext,
3649                 reference_ciphertext,
3650                 tdata->validCipherLenInBits.len,
3651                 "KASUMI Ciphertext data not as expected");
3652         return 0;
3653 }
3654
3655 static int
3656 test_kasumi_encryption_sgl(const struct kasumi_test_data *tdata)
3657 {
3658         struct crypto_testsuite_params *ts_params = &testsuite_params;
3659         struct crypto_unittest_params *ut_params = &unittest_params;
3660
3661         int retval;
3662
3663         unsigned int plaintext_pad_len;
3664         unsigned int plaintext_len;
3665
3666         uint8_t buffer[10000];
3667         const uint8_t *ciphertext;
3668
3669         struct rte_cryptodev_info dev_info;
3670
3671         /* Verify the capabilities */
3672         struct rte_cryptodev_sym_capability_idx cap_idx;
3673         cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
3674         cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_KASUMI_F8;
3675         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
3676                         &cap_idx) == NULL)
3677                 return TEST_SKIPPED;
3678
3679         rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
3680
3681         uint64_t feat_flags = dev_info.feature_flags;
3682
3683         if (!(feat_flags & RTE_CRYPTODEV_FF_IN_PLACE_SGL)) {
3684                 printf("Device doesn't support in-place scatter-gather. "
3685                                 "Test Skipped.\n");
3686                 return TEST_SKIPPED;
3687         }
3688
3689         if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
3690                         (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
3691                 printf("Device doesn't support RAW data-path APIs.\n");
3692                 return TEST_SKIPPED;
3693         }
3694
3695         if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
3696                 return TEST_SKIPPED;
3697
3698         /* Create KASUMI session */
3699         retval = create_wireless_algo_cipher_session(ts_params->valid_devs[0],
3700                                         RTE_CRYPTO_CIPHER_OP_ENCRYPT,
3701                                         RTE_CRYPTO_CIPHER_KASUMI_F8,
3702                                         tdata->key.data, tdata->key.len,
3703                                         tdata->cipher_iv.len);
3704         if (retval < 0)
3705                 return retval;
3706
3707         plaintext_len = ceil_byte_length(tdata->plaintext.len);
3708
3709
3710         /* Append data which is padded to a multiple */
3711         /* of the algorithms block size */
3712         plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 8);
3713
3714         ut_params->ibuf = create_segmented_mbuf(ts_params->mbuf_pool,
3715                         plaintext_pad_len, 10, 0);
3716
3717         pktmbuf_write(ut_params->ibuf, 0, plaintext_len, tdata->plaintext.data);
3718
3719         /* Create KASUMI operation */
3720         retval = create_wireless_algo_cipher_operation(tdata->cipher_iv.data,
3721                                 tdata->cipher_iv.len,
3722                                 RTE_ALIGN_CEIL(tdata->validCipherLenInBits.len, 8),
3723                                 tdata->validCipherOffsetInBits.len);
3724         if (retval < 0)
3725                 return retval;
3726
3727         if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
3728                 process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
3729                                 ut_params->op, 1, 0, 1, tdata->cipher_iv.len);
3730         else
3731                 ut_params->op = process_crypto_request(ts_params->valid_devs[0],
3732                                                 ut_params->op);
3733         TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
3734
3735         ut_params->obuf = ut_params->op->sym->m_dst;
3736
3737         if (ut_params->obuf)
3738                 ciphertext = rte_pktmbuf_read(ut_params->obuf, 0,
3739                                 plaintext_len, buffer);
3740         else
3741                 ciphertext = rte_pktmbuf_read(ut_params->ibuf,
3742                                 tdata->validCipherOffsetInBits.len >> 3,
3743                                 plaintext_len, buffer);
3744
3745         /* Validate obuf */
3746         debug_hexdump(stdout, "ciphertext:", ciphertext, plaintext_len);
3747
3748         const uint8_t *reference_ciphertext = tdata->ciphertext.data +
3749                                 (tdata->validCipherOffsetInBits.len >> 3);
3750         /* Validate obuf */
3751         TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
3752                 ciphertext,
3753                 reference_ciphertext,
3754                 tdata->validCipherLenInBits.len,
3755                 "KASUMI Ciphertext data not as expected");
3756         return 0;
3757 }
3758
3759 static int
3760 test_kasumi_encryption_oop(const struct kasumi_test_data *tdata)
3761 {
3762         struct crypto_testsuite_params *ts_params = &testsuite_params;
3763         struct crypto_unittest_params *ut_params = &unittest_params;
3764
3765         int retval;
3766         uint8_t *plaintext, *ciphertext;
3767         unsigned plaintext_pad_len;
3768         unsigned plaintext_len;
3769
3770         /* Verify the capabilities */
3771         struct rte_cryptodev_sym_capability_idx cap_idx;
3772         cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
3773         cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_KASUMI_F8;
3774         /* Data-path service does not support OOP */
3775         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
3776                         &cap_idx) == NULL)
3777                 return TEST_SKIPPED;
3778
3779         if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
3780                 return TEST_SKIPPED;
3781
3782         if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
3783                 return TEST_SKIPPED;
3784
3785         /* Create KASUMI session */
3786         retval = create_wireless_algo_cipher_session(ts_params->valid_devs[0],
3787                                         RTE_CRYPTO_CIPHER_OP_ENCRYPT,
3788                                         RTE_CRYPTO_CIPHER_KASUMI_F8,
3789                                         tdata->key.data, tdata->key.len,
3790                                         tdata->cipher_iv.len);
3791         if (retval < 0)
3792                 return retval;
3793
3794         ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
3795         ut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
3796
3797         /* Clear mbuf payload */
3798         memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
3799                rte_pktmbuf_tailroom(ut_params->ibuf));
3800
3801         plaintext_len = ceil_byte_length(tdata->plaintext.len);
3802         /* Append data which is padded to a multiple */
3803         /* of the algorithms block size */
3804         plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 8);
3805         plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
3806                                 plaintext_pad_len);
3807         rte_pktmbuf_append(ut_params->obuf, plaintext_pad_len);
3808         memcpy(plaintext, tdata->plaintext.data, plaintext_len);
3809
3810         debug_hexdump(stdout, "plaintext:", plaintext, plaintext_len);
3811
3812         /* Create KASUMI operation */
3813         retval = create_wireless_algo_cipher_operation_oop(tdata->cipher_iv.data,
3814                                 tdata->cipher_iv.len,
3815                                 RTE_ALIGN_CEIL(tdata->validCipherLenInBits.len, 8),
3816                                 tdata->validCipherOffsetInBits.len);
3817         if (retval < 0)
3818                 return retval;
3819
3820         ut_params->op = process_crypto_request(ts_params->valid_devs[0],
3821                                                 ut_params->op);
3822         TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
3823
3824         ut_params->obuf = ut_params->op->sym->m_dst;
3825         if (ut_params->obuf)
3826                 ciphertext = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *);
3827         else
3828                 ciphertext = plaintext + (tdata->validCipherOffsetInBits.len >> 3);
3829
3830         debug_hexdump(stdout, "ciphertext:", ciphertext, plaintext_len);
3831
3832         const uint8_t *reference_ciphertext = tdata->ciphertext.data +
3833                                 (tdata->validCipherOffsetInBits.len >> 3);
3834         /* Validate obuf */
3835         TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
3836                 ciphertext,
3837                 reference_ciphertext,
3838                 tdata->validCipherLenInBits.len,
3839                 "KASUMI Ciphertext data not as expected");
3840         return 0;
3841 }
3842
3843 static int
3844 test_kasumi_encryption_oop_sgl(const struct kasumi_test_data *tdata)
3845 {
3846         struct crypto_testsuite_params *ts_params = &testsuite_params;
3847         struct crypto_unittest_params *ut_params = &unittest_params;
3848
3849         int retval;
3850         unsigned int plaintext_pad_len;
3851         unsigned int plaintext_len;
3852
3853         const uint8_t *ciphertext;
3854         uint8_t buffer[2048];
3855
3856         struct rte_cryptodev_info dev_info;
3857
3858         /* Verify the capabilities */
3859         struct rte_cryptodev_sym_capability_idx cap_idx;
3860         cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
3861         cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_KASUMI_F8;
3862         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
3863                         &cap_idx) == NULL)
3864                 return TEST_SKIPPED;
3865
3866         if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
3867                 return TEST_SKIPPED;
3868
3869         if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
3870                 return TEST_SKIPPED;
3871
3872         rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
3873
3874         uint64_t feat_flags = dev_info.feature_flags;
3875         if (!(feat_flags & RTE_CRYPTODEV_FF_OOP_SGL_IN_SGL_OUT)) {
3876                 printf("Device doesn't support out-of-place scatter-gather "
3877                                 "in both input and output mbufs. "
3878                                 "Test Skipped.\n");
3879                 return TEST_SKIPPED;
3880         }
3881
3882         /* Create KASUMI session */
3883         retval = create_wireless_algo_cipher_session(ts_params->valid_devs[0],
3884                                         RTE_CRYPTO_CIPHER_OP_ENCRYPT,
3885                                         RTE_CRYPTO_CIPHER_KASUMI_F8,
3886                                         tdata->key.data, tdata->key.len,
3887                                         tdata->cipher_iv.len);
3888         if (retval < 0)
3889                 return retval;
3890
3891         plaintext_len = ceil_byte_length(tdata->plaintext.len);
3892         /* Append data which is padded to a multiple */
3893         /* of the algorithms block size */
3894         plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 8);
3895
3896         ut_params->ibuf = create_segmented_mbuf(ts_params->mbuf_pool,
3897                         plaintext_pad_len, 10, 0);
3898         ut_params->obuf = create_segmented_mbuf(ts_params->mbuf_pool,
3899                         plaintext_pad_len, 3, 0);
3900
3901         /* Append data which is padded to a multiple */
3902         /* of the algorithms block size */
3903         pktmbuf_write(ut_params->ibuf, 0, plaintext_len, tdata->plaintext.data);
3904
3905         /* Create KASUMI operation */
3906         retval = create_wireless_algo_cipher_operation_oop(tdata->cipher_iv.data,
3907                                 tdata->cipher_iv.len,
3908                                 RTE_ALIGN_CEIL(tdata->validCipherLenInBits.len, 8),
3909                                 tdata->validCipherOffsetInBits.len);
3910         if (retval < 0)
3911                 return retval;
3912
3913         ut_params->op = process_crypto_request(ts_params->valid_devs[0],
3914                                                 ut_params->op);
3915         TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
3916
3917         ut_params->obuf = ut_params->op->sym->m_dst;
3918         if (ut_params->obuf)
3919                 ciphertext = rte_pktmbuf_read(ut_params->obuf, 0,
3920                                 plaintext_pad_len, buffer);
3921         else
3922                 ciphertext = rte_pktmbuf_read(ut_params->ibuf,
3923                                 tdata->validCipherOffsetInBits.len >> 3,
3924                                 plaintext_pad_len, buffer);
3925
3926         const uint8_t *reference_ciphertext = tdata->ciphertext.data +
3927                                 (tdata->validCipherOffsetInBits.len >> 3);
3928         /* Validate obuf */
3929         TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
3930                 ciphertext,
3931                 reference_ciphertext,
3932                 tdata->validCipherLenInBits.len,
3933                 "KASUMI Ciphertext data not as expected");
3934         return 0;
3935 }
3936
3937
3938 static int
3939 test_kasumi_decryption_oop(const struct kasumi_test_data *tdata)
3940 {
3941         struct crypto_testsuite_params *ts_params = &testsuite_params;
3942         struct crypto_unittest_params *ut_params = &unittest_params;
3943
3944         int retval;
3945         uint8_t *ciphertext, *plaintext;
3946         unsigned ciphertext_pad_len;
3947         unsigned ciphertext_len;
3948
3949         /* Verify the capabilities */
3950         struct rte_cryptodev_sym_capability_idx cap_idx;
3951         cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
3952         cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_KASUMI_F8;
3953         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
3954                         &cap_idx) == NULL)
3955                 return TEST_SKIPPED;
3956
3957         if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
3958                 return TEST_SKIPPED;
3959
3960         if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
3961                 return TEST_SKIPPED;
3962
3963         /* Create KASUMI session */
3964         retval = create_wireless_algo_cipher_session(ts_params->valid_devs[0],
3965                                         RTE_CRYPTO_CIPHER_OP_DECRYPT,
3966                                         RTE_CRYPTO_CIPHER_KASUMI_F8,
3967                                         tdata->key.data, tdata->key.len,
3968                                         tdata->cipher_iv.len);
3969         if (retval < 0)
3970                 return retval;
3971
3972         ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
3973         ut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
3974
3975         /* Clear mbuf payload */
3976         memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
3977                rte_pktmbuf_tailroom(ut_params->ibuf));
3978
3979         ciphertext_len = ceil_byte_length(tdata->ciphertext.len);
3980         /* Append data which is padded to a multiple */
3981         /* of the algorithms block size */
3982         ciphertext_pad_len = RTE_ALIGN_CEIL(ciphertext_len, 8);
3983         ciphertext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
3984                                 ciphertext_pad_len);
3985         rte_pktmbuf_append(ut_params->obuf, ciphertext_pad_len);
3986         memcpy(ciphertext, tdata->ciphertext.data, ciphertext_len);
3987
3988         debug_hexdump(stdout, "ciphertext:", ciphertext, ciphertext_len);
3989
3990         /* Create KASUMI operation */
3991         retval = create_wireless_algo_cipher_operation_oop(tdata->cipher_iv.data,
3992                                 tdata->cipher_iv.len,
3993                                 RTE_ALIGN_CEIL(tdata->validCipherLenInBits.len, 8),
3994                                 tdata->validCipherOffsetInBits.len);
3995         if (retval < 0)
3996                 return retval;
3997
3998         ut_params->op = process_crypto_request(ts_params->valid_devs[0],
3999                                                 ut_params->op);
4000         TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
4001
4002         ut_params->obuf = ut_params->op->sym->m_dst;
4003         if (ut_params->obuf)
4004                 plaintext = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *);
4005         else
4006                 plaintext = ciphertext + (tdata->validCipherOffsetInBits.len >> 3);
4007
4008         debug_hexdump(stdout, "plaintext:", plaintext, ciphertext_len);
4009
4010         const uint8_t *reference_plaintext = tdata->plaintext.data +
4011                                 (tdata->validCipherOffsetInBits.len >> 3);
4012         /* Validate obuf */
4013         TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
4014                 plaintext,
4015                 reference_plaintext,
4016                 tdata->validCipherLenInBits.len,
4017                 "KASUMI Plaintext data not as expected");
4018         return 0;
4019 }
4020
4021 static int
4022 test_kasumi_decryption(const struct kasumi_test_data *tdata)
4023 {
4024         struct crypto_testsuite_params *ts_params = &testsuite_params;
4025         struct crypto_unittest_params *ut_params = &unittest_params;
4026
4027         int retval;
4028         uint8_t *ciphertext, *plaintext;
4029         unsigned ciphertext_pad_len;
4030         unsigned ciphertext_len;
4031         struct rte_cryptodev_info dev_info;
4032
4033         rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
4034         uint64_t feat_flags = dev_info.feature_flags;
4035
4036         if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
4037                         (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
4038                 printf("Device doesn't support RAW data-path APIs.\n");
4039                 return TEST_SKIPPED;
4040         }
4041
4042         if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
4043                 return TEST_SKIPPED;
4044
4045         /* Verify the capabilities */
4046         struct rte_cryptodev_sym_capability_idx cap_idx;
4047         cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
4048         cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_KASUMI_F8;
4049         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
4050                         &cap_idx) == NULL)
4051                 return TEST_SKIPPED;
4052
4053         /* Create KASUMI session */
4054         retval = create_wireless_algo_cipher_session(ts_params->valid_devs[0],
4055                                         RTE_CRYPTO_CIPHER_OP_DECRYPT,
4056                                         RTE_CRYPTO_CIPHER_KASUMI_F8,
4057                                         tdata->key.data, tdata->key.len,
4058                                         tdata->cipher_iv.len);
4059         if (retval < 0)
4060                 return retval;
4061
4062         ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
4063
4064         /* Clear mbuf payload */
4065         memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
4066                rte_pktmbuf_tailroom(ut_params->ibuf));
4067
4068         ciphertext_len = ceil_byte_length(tdata->ciphertext.len);
4069         /* Append data which is padded to a multiple */
4070         /* of the algorithms block size */
4071         ciphertext_pad_len = RTE_ALIGN_CEIL(ciphertext_len, 8);
4072         ciphertext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
4073                                 ciphertext_pad_len);
4074         memcpy(ciphertext, tdata->ciphertext.data, ciphertext_len);
4075
4076         debug_hexdump(stdout, "ciphertext:", ciphertext, ciphertext_len);
4077
4078         /* Create KASUMI operation */
4079         retval = create_wireless_algo_cipher_operation(tdata->cipher_iv.data,
4080                                         tdata->cipher_iv.len,
4081                                         tdata->ciphertext.len,
4082                                         tdata->validCipherOffsetInBits.len);
4083         if (retval < 0)
4084                 return retval;
4085
4086         if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
4087                 process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
4088                                 ut_params->op, 1, 0, 1, 0);
4089         else
4090                 ut_params->op = process_crypto_request(ts_params->valid_devs[0],
4091                                                 ut_params->op);
4092         TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
4093
4094         ut_params->obuf = ut_params->op->sym->m_dst;
4095         if (ut_params->obuf)
4096                 plaintext = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *);
4097         else
4098                 plaintext = ciphertext + (tdata->validCipherOffsetInBits.len >> 3);
4099
4100         debug_hexdump(stdout, "plaintext:", plaintext, ciphertext_len);
4101
4102         const uint8_t *reference_plaintext = tdata->plaintext.data +
4103                                 (tdata->validCipherOffsetInBits.len >> 3);
4104         /* Validate obuf */
4105         TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
4106                 plaintext,
4107                 reference_plaintext,
4108                 tdata->validCipherLenInBits.len,
4109                 "KASUMI Plaintext data not as expected");
4110         return 0;
4111 }
4112
4113 static int
4114 test_snow3g_encryption(const struct snow3g_test_data *tdata)
4115 {
4116         struct crypto_testsuite_params *ts_params = &testsuite_params;
4117         struct crypto_unittest_params *ut_params = &unittest_params;
4118
4119         int retval;
4120         uint8_t *plaintext, *ciphertext;
4121         unsigned plaintext_pad_len;
4122         unsigned plaintext_len;
4123         struct rte_cryptodev_info dev_info;
4124
4125         rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
4126         uint64_t feat_flags = dev_info.feature_flags;
4127
4128         if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
4129                         (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
4130                 printf("Device doesn't support RAW data-path APIs.\n");
4131                 return TEST_SKIPPED;
4132         }
4133
4134         if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
4135                 return TEST_SKIPPED;
4136
4137         /* Verify the capabilities */
4138         struct rte_cryptodev_sym_capability_idx cap_idx;
4139         cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
4140         cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_SNOW3G_UEA2;
4141         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
4142                         &cap_idx) == NULL)
4143                 return TEST_SKIPPED;
4144
4145         /* Create SNOW 3G session */
4146         retval = create_wireless_algo_cipher_session(ts_params->valid_devs[0],
4147                                         RTE_CRYPTO_CIPHER_OP_ENCRYPT,
4148                                         RTE_CRYPTO_CIPHER_SNOW3G_UEA2,
4149                                         tdata->key.data, tdata->key.len,
4150                                         tdata->cipher_iv.len);
4151         if (retval < 0)
4152                 return retval;
4153
4154         ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
4155
4156         /* Clear mbuf payload */
4157         memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
4158                rte_pktmbuf_tailroom(ut_params->ibuf));
4159
4160         plaintext_len = ceil_byte_length(tdata->plaintext.len);
4161         /* Append data which is padded to a multiple of */
4162         /* the algorithms block size */
4163         plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16);
4164         plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
4165                                 plaintext_pad_len);
4166         memcpy(plaintext, tdata->plaintext.data, plaintext_len);
4167
4168         debug_hexdump(stdout, "plaintext:", plaintext, plaintext_len);
4169
4170         /* Create SNOW 3G operation */
4171         retval = create_wireless_algo_cipher_operation(tdata->cipher_iv.data,
4172                                         tdata->cipher_iv.len,
4173                                         tdata->validCipherLenInBits.len,
4174                                         0);
4175         if (retval < 0)
4176                 return retval;
4177
4178         if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
4179                 process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
4180                                 ut_params->op, 1, 0, 1, tdata->cipher_iv.len);
4181         else
4182                 ut_params->op = process_crypto_request(ts_params->valid_devs[0],
4183                                                 ut_params->op);
4184         TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
4185
4186         ut_params->obuf = ut_params->op->sym->m_dst;
4187         if (ut_params->obuf)
4188                 ciphertext = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *);
4189         else
4190                 ciphertext = plaintext;
4191
4192         debug_hexdump(stdout, "ciphertext:", ciphertext, plaintext_len);
4193
4194         /* Validate obuf */
4195         TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
4196                 ciphertext,
4197                 tdata->ciphertext.data,
4198                 tdata->validDataLenInBits.len,
4199                 "SNOW 3G Ciphertext data not as expected");
4200         return 0;
4201 }
4202
4203
4204 static int
4205 test_snow3g_encryption_oop(const struct snow3g_test_data *tdata)
4206 {
4207         struct crypto_testsuite_params *ts_params = &testsuite_params;
4208         struct crypto_unittest_params *ut_params = &unittest_params;
4209         uint8_t *plaintext, *ciphertext;
4210
4211         int retval;
4212         unsigned plaintext_pad_len;
4213         unsigned plaintext_len;
4214         struct rte_cryptodev_info dev_info;
4215
4216         rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
4217         uint64_t feat_flags = dev_info.feature_flags;
4218
4219         if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
4220                         (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
4221                 printf("Device does not support RAW data-path APIs.\n");
4222                 return -ENOTSUP;
4223         }
4224
4225         /* Verify the capabilities */
4226         struct rte_cryptodev_sym_capability_idx cap_idx;
4227         cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
4228         cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_SNOW3G_UEA2;
4229         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
4230                         &cap_idx) == NULL)
4231                 return TEST_SKIPPED;
4232
4233         if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
4234                 return TEST_SKIPPED;
4235
4236         if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
4237                 return TEST_SKIPPED;
4238
4239         /* Create SNOW 3G session */
4240         retval = create_wireless_algo_cipher_session(ts_params->valid_devs[0],
4241                                         RTE_CRYPTO_CIPHER_OP_ENCRYPT,
4242                                         RTE_CRYPTO_CIPHER_SNOW3G_UEA2,
4243                                         tdata->key.data, tdata->key.len,
4244                                         tdata->cipher_iv.len);
4245         if (retval < 0)
4246                 return retval;
4247
4248         ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
4249         ut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
4250
4251         TEST_ASSERT_NOT_NULL(ut_params->ibuf,
4252                         "Failed to allocate input buffer in mempool");
4253         TEST_ASSERT_NOT_NULL(ut_params->obuf,
4254                         "Failed to allocate output buffer in mempool");
4255
4256         /* Clear mbuf payload */
4257         memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
4258                rte_pktmbuf_tailroom(ut_params->ibuf));
4259
4260         plaintext_len = ceil_byte_length(tdata->plaintext.len);
4261         /* Append data which is padded to a multiple of */
4262         /* the algorithms block size */
4263         plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16);
4264         plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
4265                                 plaintext_pad_len);
4266         rte_pktmbuf_append(ut_params->obuf, plaintext_pad_len);
4267         memcpy(plaintext, tdata->plaintext.data, plaintext_len);
4268
4269         debug_hexdump(stdout, "plaintext:", plaintext, plaintext_len);
4270
4271         /* Create SNOW 3G operation */
4272         retval = create_wireless_algo_cipher_operation_oop(tdata->cipher_iv.data,
4273                                         tdata->cipher_iv.len,
4274                                         tdata->validCipherLenInBits.len,
4275                                         0);
4276         if (retval < 0)
4277                 return retval;
4278
4279         if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
4280                 process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
4281                         ut_params->op, 1, 0, 1, tdata->cipher_iv.len);
4282         else
4283                 ut_params->op = process_crypto_request(ts_params->valid_devs[0],
4284                                                 ut_params->op);
4285         TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
4286
4287         ut_params->obuf = ut_params->op->sym->m_dst;
4288         if (ut_params->obuf)
4289                 ciphertext = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *);
4290         else
4291                 ciphertext = plaintext;
4292
4293         debug_hexdump(stdout, "ciphertext:", ciphertext, plaintext_len);
4294
4295         /* Validate obuf */
4296         TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
4297                 ciphertext,
4298                 tdata->ciphertext.data,
4299                 tdata->validDataLenInBits.len,
4300                 "SNOW 3G Ciphertext data not as expected");
4301         return 0;
4302 }
4303
4304 static int
4305 test_snow3g_encryption_oop_sgl(const struct snow3g_test_data *tdata)
4306 {
4307         struct crypto_testsuite_params *ts_params = &testsuite_params;
4308         struct crypto_unittest_params *ut_params = &unittest_params;
4309
4310         int retval;
4311         unsigned int plaintext_pad_len;
4312         unsigned int plaintext_len;
4313         uint8_t buffer[10000];
4314         const uint8_t *ciphertext;
4315
4316         struct rte_cryptodev_info dev_info;
4317
4318         /* Verify the capabilities */
4319         struct rte_cryptodev_sym_capability_idx cap_idx;
4320         cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
4321         cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_SNOW3G_UEA2;
4322         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
4323                         &cap_idx) == NULL)
4324                 return TEST_SKIPPED;
4325
4326         if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
4327                 return TEST_SKIPPED;
4328
4329         if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
4330                 return TEST_SKIPPED;
4331
4332         rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
4333
4334         uint64_t feat_flags = dev_info.feature_flags;
4335
4336         if (!(feat_flags & RTE_CRYPTODEV_FF_OOP_SGL_IN_SGL_OUT)) {
4337                 printf("Device doesn't support out-of-place scatter-gather "
4338                                 "in both input and output mbufs. "
4339                                 "Test Skipped.\n");
4340                 return TEST_SKIPPED;
4341         }
4342
4343         if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
4344                         (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
4345                 printf("Device does not support RAW data-path APIs.\n");
4346                 return -ENOTSUP;
4347         }
4348
4349         /* Create SNOW 3G session */
4350         retval = create_wireless_algo_cipher_session(ts_params->valid_devs[0],
4351                                         RTE_CRYPTO_CIPHER_OP_ENCRYPT,
4352                                         RTE_CRYPTO_CIPHER_SNOW3G_UEA2,
4353                                         tdata->key.data, tdata->key.len,
4354                                         tdata->cipher_iv.len);
4355         if (retval < 0)
4356                 return retval;
4357
4358         plaintext_len = ceil_byte_length(tdata->plaintext.len);
4359         /* Append data which is padded to a multiple of */
4360         /* the algorithms block size */
4361         plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16);
4362
4363         ut_params->ibuf = create_segmented_mbuf(ts_params->mbuf_pool,
4364                         plaintext_pad_len, 10, 0);
4365         ut_params->obuf = create_segmented_mbuf(ts_params->mbuf_pool,
4366                         plaintext_pad_len, 3, 0);
4367
4368         TEST_ASSERT_NOT_NULL(ut_params->ibuf,
4369                         "Failed to allocate input buffer in mempool");
4370         TEST_ASSERT_NOT_NULL(ut_params->obuf,
4371                         "Failed to allocate output buffer in mempool");
4372
4373         pktmbuf_write(ut_params->ibuf, 0, plaintext_len, tdata->plaintext.data);
4374
4375         /* Create SNOW 3G operation */
4376         retval = create_wireless_algo_cipher_operation_oop(tdata->cipher_iv.data,
4377                                         tdata->cipher_iv.len,
4378                                         tdata->validCipherLenInBits.len,
4379                                         0);
4380         if (retval < 0)
4381                 return retval;
4382
4383         if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
4384                 process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
4385                         ut_params->op, 1, 0, 1, tdata->cipher_iv.len);
4386         else
4387                 ut_params->op = process_crypto_request(ts_params->valid_devs[0],
4388                                                 ut_params->op);
4389         TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
4390
4391         ut_params->obuf = ut_params->op->sym->m_dst;
4392         if (ut_params->obuf)
4393                 ciphertext = rte_pktmbuf_read(ut_params->obuf, 0,
4394                                 plaintext_len, buffer);
4395         else
4396                 ciphertext = rte_pktmbuf_read(ut_params->ibuf, 0,
4397                                 plaintext_len, buffer);
4398
4399         debug_hexdump(stdout, "ciphertext:", ciphertext, plaintext_len);
4400
4401         /* Validate obuf */
4402         TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
4403                 ciphertext,
4404                 tdata->ciphertext.data,
4405                 tdata->validDataLenInBits.len,
4406                 "SNOW 3G Ciphertext data not as expected");
4407
4408         return 0;
4409 }
4410
4411 /* Shift right a buffer by "offset" bits, "offset" < 8 */
4412 static void
4413 buffer_shift_right(uint8_t *buffer, uint32_t length, uint8_t offset)
4414 {
4415         uint8_t curr_byte, prev_byte;
4416         uint32_t length_in_bytes = ceil_byte_length(length + offset);
4417         uint8_t lower_byte_mask = (1 << offset) - 1;
4418         unsigned i;
4419
4420         prev_byte = buffer[0];
4421         buffer[0] >>= offset;
4422
4423         for (i = 1; i < length_in_bytes; i++) {
4424                 curr_byte = buffer[i];
4425                 buffer[i] = ((prev_byte & lower_byte_mask) << (8 - offset)) |
4426                                 (curr_byte >> offset);
4427                 prev_byte = curr_byte;
4428         }
4429 }
4430
4431 static int
4432 test_snow3g_encryption_offset_oop(const struct snow3g_test_data *tdata)
4433 {
4434         struct crypto_testsuite_params *ts_params = &testsuite_params;
4435         struct crypto_unittest_params *ut_params = &unittest_params;
4436         uint8_t *plaintext, *ciphertext;
4437         int retval;
4438         uint32_t plaintext_len;
4439         uint32_t plaintext_pad_len;
4440         uint8_t extra_offset = 4;
4441         uint8_t *expected_ciphertext_shifted;
4442         struct rte_cryptodev_info dev_info;
4443
4444         rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
4445         uint64_t feat_flags = dev_info.feature_flags;
4446
4447         if (!(feat_flags & RTE_CRYPTODEV_FF_NON_BYTE_ALIGNED_DATA) &&
4448                         ((tdata->validDataLenInBits.len % 8) != 0)) {
4449                 printf("Device doesn't support NON-Byte Aligned Data.\n");
4450                 return TEST_SKIPPED;
4451         }
4452
4453         /* Verify the capabilities */
4454         struct rte_cryptodev_sym_capability_idx cap_idx;
4455         cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
4456         cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_SNOW3G_UEA2;
4457         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
4458                         &cap_idx) == NULL)
4459                 return TEST_SKIPPED;
4460
4461         if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
4462                 return TEST_SKIPPED;
4463
4464         if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
4465                 return TEST_SKIPPED;
4466
4467         /* Create SNOW 3G session */
4468         retval = create_wireless_algo_cipher_session(ts_params->valid_devs[0],
4469                                         RTE_CRYPTO_CIPHER_OP_ENCRYPT,
4470                                         RTE_CRYPTO_CIPHER_SNOW3G_UEA2,
4471                                         tdata->key.data, tdata->key.len,
4472                                         tdata->cipher_iv.len);
4473         if (retval < 0)
4474                 return retval;
4475
4476         ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
4477         ut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
4478
4479         TEST_ASSERT_NOT_NULL(ut_params->ibuf,
4480                         "Failed to allocate input buffer in mempool");
4481         TEST_ASSERT_NOT_NULL(ut_params->obuf,
4482                         "Failed to allocate output buffer in mempool");
4483
4484         /* Clear mbuf payload */
4485         memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
4486                rte_pktmbuf_tailroom(ut_params->ibuf));
4487
4488         plaintext_len = ceil_byte_length(tdata->plaintext.len + extra_offset);
4489         /*
4490          * Append data which is padded to a
4491          * multiple of the algorithms block size
4492          */
4493         plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16);
4494
4495         plaintext = (uint8_t *) rte_pktmbuf_append(ut_params->ibuf,
4496                                                 plaintext_pad_len);
4497
4498         rte_pktmbuf_append(ut_params->obuf, plaintext_pad_len);
4499
4500         memcpy(plaintext, tdata->plaintext.data, (tdata->plaintext.len >> 3));
4501         buffer_shift_right(plaintext, tdata->plaintext.len, extra_offset);
4502
4503 #ifdef RTE_APP_TEST_DEBUG
4504         rte_hexdump(stdout, "plaintext:", plaintext, tdata->plaintext.len);
4505 #endif
4506         /* Create SNOW 3G operation */
4507         retval = create_wireless_algo_cipher_operation_oop(tdata->cipher_iv.data,
4508                                         tdata->cipher_iv.len,
4509                                         tdata->validCipherLenInBits.len,
4510                                         extra_offset);
4511         if (retval < 0)
4512                 return retval;
4513
4514         if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
4515                 process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
4516                         ut_params->op, 1, 0, 1, tdata->cipher_iv.len);
4517         else
4518                 ut_params->op = process_crypto_request(ts_params->valid_devs[0],
4519                                                 ut_params->op);
4520         TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
4521
4522         ut_params->obuf = ut_params->op->sym->m_dst;
4523         if (ut_params->obuf)
4524                 ciphertext = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *);
4525         else
4526                 ciphertext = plaintext;
4527
4528 #ifdef RTE_APP_TEST_DEBUG
4529         rte_hexdump(stdout, "ciphertext:", ciphertext, plaintext_len);
4530 #endif
4531
4532         expected_ciphertext_shifted = rte_malloc(NULL, plaintext_len, 8);
4533
4534         TEST_ASSERT_NOT_NULL(expected_ciphertext_shifted,
4535                         "failed to reserve memory for ciphertext shifted\n");
4536
4537         memcpy(expected_ciphertext_shifted, tdata->ciphertext.data,
4538                         ceil_byte_length(tdata->ciphertext.len));
4539         buffer_shift_right(expected_ciphertext_shifted, tdata->ciphertext.len,
4540                         extra_offset);
4541         /* Validate obuf */
4542         TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT_OFFSET(
4543                 ciphertext,
4544                 expected_ciphertext_shifted,
4545                 tdata->validDataLenInBits.len,
4546                 extra_offset,
4547                 "SNOW 3G Ciphertext data not as expected");
4548         return 0;
4549 }
4550
4551 static int test_snow3g_decryption(const struct snow3g_test_data *tdata)
4552 {
4553         struct crypto_testsuite_params *ts_params = &testsuite_params;
4554         struct crypto_unittest_params *ut_params = &unittest_params;
4555
4556         int retval;
4557
4558         uint8_t *plaintext, *ciphertext;
4559         unsigned ciphertext_pad_len;
4560         unsigned ciphertext_len;
4561         struct rte_cryptodev_info dev_info;
4562
4563         rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
4564         uint64_t feat_flags = dev_info.feature_flags;
4565
4566         if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
4567                         (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
4568                 printf("Device doesn't support RAW data-path APIs.\n");
4569                 return TEST_SKIPPED;
4570         }
4571
4572         if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
4573                 return TEST_SKIPPED;
4574
4575         /* Verify the capabilities */
4576         struct rte_cryptodev_sym_capability_idx cap_idx;
4577         cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
4578         cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_SNOW3G_UEA2;
4579         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
4580                         &cap_idx) == NULL)
4581                 return TEST_SKIPPED;
4582
4583         /* Create SNOW 3G session */
4584         retval = create_wireless_algo_cipher_session(ts_params->valid_devs[0],
4585                                         RTE_CRYPTO_CIPHER_OP_DECRYPT,
4586                                         RTE_CRYPTO_CIPHER_SNOW3G_UEA2,
4587                                         tdata->key.data, tdata->key.len,
4588                                         tdata->cipher_iv.len);
4589         if (retval < 0)
4590                 return retval;
4591
4592         ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
4593
4594         /* Clear mbuf payload */
4595         memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
4596                rte_pktmbuf_tailroom(ut_params->ibuf));
4597
4598         ciphertext_len = ceil_byte_length(tdata->ciphertext.len);
4599         /* Append data which is padded to a multiple of */
4600         /* the algorithms block size */
4601         ciphertext_pad_len = RTE_ALIGN_CEIL(ciphertext_len, 16);
4602         ciphertext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
4603                                 ciphertext_pad_len);
4604         memcpy(ciphertext, tdata->ciphertext.data, ciphertext_len);
4605
4606         debug_hexdump(stdout, "ciphertext:", ciphertext, ciphertext_len);
4607
4608         /* Create SNOW 3G operation */
4609         retval = create_wireless_algo_cipher_operation(tdata->cipher_iv.data,
4610                                         tdata->cipher_iv.len,
4611                                         tdata->validCipherLenInBits.len,
4612                                         tdata->cipher.offset_bits);
4613         if (retval < 0)
4614                 return retval;
4615
4616         if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
4617                 process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
4618                                 ut_params->op, 1, 0, 1, tdata->cipher_iv.len);
4619         else
4620                 ut_params->op = process_crypto_request(ts_params->valid_devs[0],
4621                                                 ut_params->op);
4622         TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
4623         ut_params->obuf = ut_params->op->sym->m_dst;
4624         if (ut_params->obuf)
4625                 plaintext = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *);
4626         else
4627                 plaintext = ciphertext;
4628
4629         debug_hexdump(stdout, "plaintext:", plaintext, ciphertext_len);
4630
4631         /* Validate obuf */
4632         TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(plaintext,
4633                                 tdata->plaintext.data,
4634                                 tdata->validDataLenInBits.len,
4635                                 "SNOW 3G Plaintext data not as expected");
4636         return 0;
4637 }
4638
4639 static int test_snow3g_decryption_oop(const struct snow3g_test_data *tdata)
4640 {
4641         struct crypto_testsuite_params *ts_params = &testsuite_params;
4642         struct crypto_unittest_params *ut_params = &unittest_params;
4643
4644         int retval;
4645
4646         uint8_t *plaintext, *ciphertext;
4647         unsigned ciphertext_pad_len;
4648         unsigned ciphertext_len;
4649         struct rte_cryptodev_info dev_info;
4650
4651         rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
4652         uint64_t feat_flags = dev_info.feature_flags;
4653
4654         if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
4655                         (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
4656                 printf("Device does not support RAW data-path APIs.\n");
4657                 return -ENOTSUP;
4658         }
4659         /* Verify the capabilities */
4660         struct rte_cryptodev_sym_capability_idx cap_idx;
4661         cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
4662         cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_SNOW3G_UEA2;
4663         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
4664                         &cap_idx) == NULL)
4665                 return TEST_SKIPPED;
4666
4667         if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
4668                 return TEST_SKIPPED;
4669
4670         if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
4671                 return TEST_SKIPPED;
4672
4673         /* Create SNOW 3G session */
4674         retval = create_wireless_algo_cipher_session(ts_params->valid_devs[0],
4675                                         RTE_CRYPTO_CIPHER_OP_DECRYPT,
4676                                         RTE_CRYPTO_CIPHER_SNOW3G_UEA2,
4677                                         tdata->key.data, tdata->key.len,
4678                                         tdata->cipher_iv.len);
4679         if (retval < 0)
4680                 return retval;
4681
4682         ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
4683         ut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
4684
4685         TEST_ASSERT_NOT_NULL(ut_params->ibuf,
4686                         "Failed to allocate input buffer");
4687         TEST_ASSERT_NOT_NULL(ut_params->obuf,
4688                         "Failed to allocate output buffer");
4689
4690         /* Clear mbuf payload */
4691         memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
4692                rte_pktmbuf_tailroom(ut_params->ibuf));
4693
4694         memset(rte_pktmbuf_mtod(ut_params->obuf, uint8_t *), 0,
4695                        rte_pktmbuf_tailroom(ut_params->obuf));
4696
4697         ciphertext_len = ceil_byte_length(tdata->ciphertext.len);
4698         /* Append data which is padded to a multiple of */
4699         /* the algorithms block size */
4700         ciphertext_pad_len = RTE_ALIGN_CEIL(ciphertext_len, 16);
4701         ciphertext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
4702                                 ciphertext_pad_len);
4703         rte_pktmbuf_append(ut_params->obuf, ciphertext_pad_len);
4704         memcpy(ciphertext, tdata->ciphertext.data, ciphertext_len);
4705
4706         debug_hexdump(stdout, "ciphertext:", ciphertext, ciphertext_len);
4707
4708         /* Create SNOW 3G operation */
4709         retval = create_wireless_algo_cipher_operation_oop(tdata->cipher_iv.data,
4710                                         tdata->cipher_iv.len,
4711                                         tdata->validCipherLenInBits.len,
4712                                         0);
4713         if (retval < 0)
4714                 return retval;
4715
4716         if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
4717                 process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
4718                         ut_params->op, 1, 0, 1, tdata->cipher_iv.len);
4719         else
4720                 ut_params->op = process_crypto_request(ts_params->valid_devs[0],
4721                                                 ut_params->op);
4722         TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
4723         ut_params->obuf = ut_params->op->sym->m_dst;
4724         if (ut_params->obuf)
4725                 plaintext = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *);
4726         else
4727                 plaintext = ciphertext;
4728
4729         debug_hexdump(stdout, "plaintext:", plaintext, ciphertext_len);
4730
4731         /* Validate obuf */
4732         TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(plaintext,
4733                                 tdata->plaintext.data,
4734                                 tdata->validDataLenInBits.len,
4735                                 "SNOW 3G Plaintext data not as expected");
4736         return 0;
4737 }
4738
4739 static int
4740 test_zuc_cipher_auth(const struct wireless_test_data *tdata)
4741 {
4742         struct crypto_testsuite_params *ts_params = &testsuite_params;
4743         struct crypto_unittest_params *ut_params = &unittest_params;
4744
4745         int retval;
4746
4747         uint8_t *plaintext, *ciphertext;
4748         unsigned int plaintext_pad_len;
4749         unsigned int plaintext_len;
4750
4751         struct rte_cryptodev_info dev_info;
4752         struct rte_cryptodev_sym_capability_idx cap_idx;
4753
4754         rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
4755         uint64_t feat_flags = dev_info.feature_flags;
4756
4757         if (!(feat_flags & RTE_CRYPTODEV_FF_NON_BYTE_ALIGNED_DATA) &&
4758                         ((tdata->validAuthLenInBits.len % 8 != 0) ||
4759                         (tdata->validDataLenInBits.len % 8 != 0))) {
4760                 printf("Device doesn't support NON-Byte Aligned Data.\n");
4761                 return TEST_SKIPPED;
4762         }
4763
4764         if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
4765                         (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
4766                 printf("Device doesn't support RAW data-path APIs.\n");
4767                 return TEST_SKIPPED;
4768         }
4769
4770         if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
4771                 return TEST_SKIPPED;
4772
4773         /* Check if device supports ZUC EEA3 */
4774         cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
4775         cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_ZUC_EEA3;
4776
4777         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
4778                         &cap_idx) == NULL)
4779                 return TEST_SKIPPED;
4780
4781         /* Check if device supports ZUC EIA3 */
4782         cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
4783         cap_idx.algo.auth = RTE_CRYPTO_AUTH_ZUC_EIA3;
4784
4785         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
4786                         &cap_idx) == NULL)
4787                 return TEST_SKIPPED;
4788
4789         /* Create ZUC session */
4790         retval = create_zuc_cipher_auth_encrypt_generate_session(
4791                         ts_params->valid_devs[0],
4792                         tdata);
4793         if (retval != 0)
4794                 return retval;
4795         ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
4796
4797         /* clear mbuf payload */
4798         memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
4799                         rte_pktmbuf_tailroom(ut_params->ibuf));
4800
4801         plaintext_len = ceil_byte_length(tdata->plaintext.len);
4802         /* Append data which is padded to a multiple of */
4803         /* the algorithms block size */
4804         plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16);
4805         plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
4806                                 plaintext_pad_len);
4807         memcpy(plaintext, tdata->plaintext.data, plaintext_len);
4808
4809         debug_hexdump(stdout, "plaintext:", plaintext, plaintext_len);
4810
4811         /* Create ZUC operation */
4812         retval = create_zuc_cipher_hash_generate_operation(tdata);
4813         if (retval < 0)
4814                 return retval;
4815
4816         if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
4817                 process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
4818                                 ut_params->op, 1, 1, 1, tdata->cipher_iv.len);
4819         else
4820                 ut_params->op = process_crypto_request(ts_params->valid_devs[0],
4821                         ut_params->op);
4822         TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
4823         ut_params->obuf = ut_params->op->sym->m_src;
4824         if (ut_params->obuf)
4825                 ciphertext = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *);
4826         else
4827                 ciphertext = plaintext;
4828
4829         debug_hexdump(stdout, "ciphertext:", ciphertext, plaintext_len);
4830         /* Validate obuf */
4831         TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
4832                         ciphertext,
4833                         tdata->ciphertext.data,
4834                         tdata->validDataLenInBits.len,
4835                         "ZUC Ciphertext data not as expected");
4836
4837         ut_params->digest = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *)
4838             + plaintext_pad_len;
4839
4840         /* Validate obuf */
4841         TEST_ASSERT_BUFFERS_ARE_EQUAL(
4842                         ut_params->digest,
4843                         tdata->digest.data,
4844                         4,
4845                         "ZUC Generated auth tag not as expected");
4846         return 0;
4847 }
4848
4849 static int
4850 test_snow3g_cipher_auth(const struct snow3g_test_data *tdata)
4851 {
4852         struct crypto_testsuite_params *ts_params = &testsuite_params;
4853         struct crypto_unittest_params *ut_params = &unittest_params;
4854
4855         int retval;
4856
4857         uint8_t *plaintext, *ciphertext;
4858         unsigned plaintext_pad_len;
4859         unsigned plaintext_len;
4860         struct rte_cryptodev_info dev_info;
4861
4862         rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
4863         uint64_t feat_flags = dev_info.feature_flags;
4864
4865         if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
4866                         (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
4867                 printf("Device doesn't support RAW data-path APIs.\n");
4868                 return TEST_SKIPPED;
4869         }
4870
4871         if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
4872                 return TEST_SKIPPED;
4873
4874         /* Verify the capabilities */
4875         struct rte_cryptodev_sym_capability_idx cap_idx;
4876         cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
4877         cap_idx.algo.auth = RTE_CRYPTO_AUTH_SNOW3G_UIA2;
4878         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
4879                         &cap_idx) == NULL)
4880                 return TEST_SKIPPED;
4881         cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
4882         cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_SNOW3G_UEA2;
4883         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
4884                         &cap_idx) == NULL)
4885                 return TEST_SKIPPED;
4886
4887         /* Create SNOW 3G session */
4888         retval = create_wireless_algo_cipher_auth_session(ts_params->valid_devs[0],
4889                         RTE_CRYPTO_CIPHER_OP_ENCRYPT,
4890                         RTE_CRYPTO_AUTH_OP_GENERATE,
4891                         RTE_CRYPTO_AUTH_SNOW3G_UIA2,
4892                         RTE_CRYPTO_CIPHER_SNOW3G_UEA2,
4893                         tdata->key.data, tdata->key.len,
4894                         tdata->auth_iv.len, tdata->digest.len,
4895                         tdata->cipher_iv.len);
4896         if (retval != 0)
4897                 return retval;
4898         ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
4899
4900         /* clear mbuf payload */
4901         memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
4902                         rte_pktmbuf_tailroom(ut_params->ibuf));
4903
4904         plaintext_len = ceil_byte_length(tdata->plaintext.len);
4905         /* Append data which is padded to a multiple of */
4906         /* the algorithms block size */
4907         plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16);
4908         plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
4909                                 plaintext_pad_len);
4910         memcpy(plaintext, tdata->plaintext.data, plaintext_len);
4911
4912         debug_hexdump(stdout, "plaintext:", plaintext, plaintext_len);
4913
4914         /* Create SNOW 3G operation */
4915         retval = create_wireless_algo_cipher_hash_operation(tdata->digest.data,
4916                         tdata->digest.len, tdata->auth_iv.data,
4917                         tdata->auth_iv.len,
4918                         plaintext_pad_len, RTE_CRYPTO_AUTH_OP_GENERATE,
4919                         tdata->cipher_iv.data, tdata->cipher_iv.len,
4920                         tdata->validCipherLenInBits.len,
4921                         0,
4922                         tdata->validAuthLenInBits.len,
4923                         0
4924                         );
4925         if (retval < 0)
4926                 return retval;
4927
4928         if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
4929                 process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
4930                                 ut_params->op, 1, 1, 1, tdata->cipher_iv.len);
4931         else
4932                 ut_params->op = process_crypto_request(ts_params->valid_devs[0],
4933                         ut_params->op);
4934         TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
4935         ut_params->obuf = ut_params->op->sym->m_src;
4936         if (ut_params->obuf)
4937                 ciphertext = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *);
4938         else
4939                 ciphertext = plaintext;
4940
4941         debug_hexdump(stdout, "ciphertext:", ciphertext, plaintext_len);
4942         /* Validate obuf */
4943         TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
4944                         ciphertext,
4945                         tdata->ciphertext.data,
4946                         tdata->validDataLenInBits.len,
4947                         "SNOW 3G Ciphertext data not as expected");
4948
4949         ut_params->digest = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *)
4950             + plaintext_pad_len;
4951
4952         /* Validate obuf */
4953         TEST_ASSERT_BUFFERS_ARE_EQUAL(
4954                         ut_params->digest,
4955                         tdata->digest.data,
4956                         DIGEST_BYTE_LENGTH_SNOW3G_UIA2,
4957                         "SNOW 3G Generated auth tag not as expected");
4958         return 0;
4959 }
4960
4961 static int
4962 test_snow3g_auth_cipher(const struct snow3g_test_data *tdata,
4963         uint8_t op_mode, uint8_t verify)
4964 {
4965         struct crypto_testsuite_params *ts_params = &testsuite_params;
4966         struct crypto_unittest_params *ut_params = &unittest_params;
4967
4968         int retval;
4969
4970         uint8_t *plaintext = NULL, *ciphertext = NULL;
4971         unsigned int plaintext_pad_len;
4972         unsigned int plaintext_len;
4973         unsigned int ciphertext_pad_len;
4974         unsigned int ciphertext_len;
4975
4976         struct rte_cryptodev_info dev_info;
4977
4978         /* Verify the capabilities */
4979         struct rte_cryptodev_sym_capability_idx cap_idx;
4980         cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
4981         cap_idx.algo.auth = RTE_CRYPTO_AUTH_SNOW3G_UIA2;
4982         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
4983                         &cap_idx) == NULL)
4984                 return TEST_SKIPPED;
4985         cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
4986         cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_SNOW3G_UEA2;
4987         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
4988                         &cap_idx) == NULL)
4989                 return TEST_SKIPPED;
4990
4991         if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
4992                 return TEST_SKIPPED;
4993
4994         rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
4995
4996         uint64_t feat_flags = dev_info.feature_flags;
4997
4998         if (op_mode == OUT_OF_PLACE) {
4999                 if (!(feat_flags & RTE_CRYPTODEV_FF_DIGEST_ENCRYPTED)) {
5000                         printf("Device doesn't support digest encrypted.\n");
5001                         return TEST_SKIPPED;
5002                 }
5003                 if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
5004                         return TEST_SKIPPED;
5005         }
5006
5007         if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
5008                         (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
5009                 printf("Device doesn't support RAW data-path APIs.\n");
5010                 return TEST_SKIPPED;
5011         }
5012
5013         /* Create SNOW 3G session */
5014         retval = create_wireless_algo_auth_cipher_session(
5015                         ts_params->valid_devs[0],
5016                         (verify ? RTE_CRYPTO_CIPHER_OP_DECRYPT
5017                                         : RTE_CRYPTO_CIPHER_OP_ENCRYPT),
5018                         (verify ? RTE_CRYPTO_AUTH_OP_VERIFY
5019                                         : RTE_CRYPTO_AUTH_OP_GENERATE),
5020                         RTE_CRYPTO_AUTH_SNOW3G_UIA2,
5021                         RTE_CRYPTO_CIPHER_SNOW3G_UEA2,
5022                         tdata->key.data, tdata->key.len,
5023                         tdata->auth_iv.len, tdata->digest.len,
5024                         tdata->cipher_iv.len);
5025         if (retval != 0)
5026                 return retval;
5027
5028         ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
5029         if (op_mode == OUT_OF_PLACE)
5030                 ut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
5031
5032         /* clear mbuf payload */
5033         memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
5034                 rte_pktmbuf_tailroom(ut_params->ibuf));
5035         if (op_mode == OUT_OF_PLACE)
5036                 memset(rte_pktmbuf_mtod(ut_params->obuf, uint8_t *), 0,
5037                         rte_pktmbuf_tailroom(ut_params->obuf));
5038
5039         ciphertext_len = ceil_byte_length(tdata->ciphertext.len);
5040         plaintext_len = ceil_byte_length(tdata->plaintext.len);
5041         ciphertext_pad_len = RTE_ALIGN_CEIL(ciphertext_len, 16);
5042         plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16);
5043
5044         if (verify) {
5045                 ciphertext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
5046                                         ciphertext_pad_len);
5047                 memcpy(ciphertext, tdata->ciphertext.data, ciphertext_len);
5048                 if (op_mode == OUT_OF_PLACE)
5049                         rte_pktmbuf_append(ut_params->obuf, ciphertext_pad_len);
5050                 debug_hexdump(stdout, "ciphertext:", ciphertext,
5051                         ciphertext_len);
5052         } else {
5053                 plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
5054                                         plaintext_pad_len);
5055                 memcpy(plaintext, tdata->plaintext.data, plaintext_len);
5056                 if (op_mode == OUT_OF_PLACE)
5057                         rte_pktmbuf_append(ut_params->obuf, plaintext_pad_len);
5058                 debug_hexdump(stdout, "plaintext:", plaintext, plaintext_len);
5059         }
5060
5061         /* Create SNOW 3G operation */
5062         retval = create_wireless_algo_auth_cipher_operation(
5063                 tdata->digest.data, tdata->digest.len,
5064                 tdata->cipher_iv.data, tdata->cipher_iv.len,
5065                 tdata->auth_iv.data, tdata->auth_iv.len,
5066                 (tdata->digest.offset_bytes == 0 ?
5067                 (verify ? ciphertext_pad_len : plaintext_pad_len)
5068                         : tdata->digest.offset_bytes),
5069                 tdata->validCipherLenInBits.len,
5070                 tdata->cipher.offset_bits,
5071                 tdata->validAuthLenInBits.len,
5072                 tdata->auth.offset_bits,
5073                 op_mode, 0, verify);
5074
5075         if (retval < 0)
5076                 return retval;
5077
5078         if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
5079                 process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
5080                                 ut_params->op, 1, 1, 1, tdata->cipher_iv.len);
5081         else
5082                 ut_params->op = process_crypto_request(ts_params->valid_devs[0],
5083                         ut_params->op);
5084
5085         TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
5086
5087         ut_params->obuf = (op_mode == IN_PLACE ?
5088                 ut_params->op->sym->m_src : ut_params->op->sym->m_dst);
5089
5090         if (verify) {
5091                 if (ut_params->obuf)
5092                         plaintext = rte_pktmbuf_mtod(ut_params->obuf,
5093                                                         uint8_t *);
5094                 else
5095                         plaintext = ciphertext +
5096                                 (tdata->cipher.offset_bits >> 3);
5097
5098                 debug_hexdump(stdout, "plaintext:", plaintext,
5099                         (tdata->plaintext.len >> 3) - tdata->digest.len);
5100                 debug_hexdump(stdout, "plaintext expected:",
5101                         tdata->plaintext.data,
5102                         (tdata->plaintext.len >> 3) - tdata->digest.len);
5103         } else {
5104                 if (ut_params->obuf)
5105                         ciphertext = rte_pktmbuf_mtod(ut_params->obuf,
5106                                                         uint8_t *);
5107                 else
5108                         ciphertext = plaintext;
5109
5110                 debug_hexdump(stdout, "ciphertext:", ciphertext,
5111                         ciphertext_len);
5112                 debug_hexdump(stdout, "ciphertext expected:",
5113                         tdata->ciphertext.data, tdata->ciphertext.len >> 3);
5114
5115                 ut_params->digest = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *)
5116                         + (tdata->digest.offset_bytes == 0 ?
5117                 plaintext_pad_len : tdata->digest.offset_bytes);
5118
5119                 debug_hexdump(stdout, "digest:", ut_params->digest,
5120                         tdata->digest.len);
5121                 debug_hexdump(stdout, "digest expected:", tdata->digest.data,
5122                                 tdata->digest.len);
5123         }
5124
5125         /* Validate obuf */
5126         if (verify) {
5127                 TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT_OFFSET(
5128                         plaintext,
5129                         tdata->plaintext.data,
5130                         (tdata->plaintext.len - tdata->cipher.offset_bits -
5131                          (tdata->digest.len << 3)),
5132                         tdata->cipher.offset_bits,
5133                         "SNOW 3G Plaintext data not as expected");
5134         } else {
5135                 TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT_OFFSET(
5136                         ciphertext,
5137                         tdata->ciphertext.data,
5138                         (tdata->validDataLenInBits.len -
5139                          tdata->cipher.offset_bits),
5140                         tdata->cipher.offset_bits,
5141                         "SNOW 3G Ciphertext data not as expected");
5142
5143                 TEST_ASSERT_BUFFERS_ARE_EQUAL(
5144                         ut_params->digest,
5145                         tdata->digest.data,
5146                         DIGEST_BYTE_LENGTH_SNOW3G_UIA2,
5147                         "SNOW 3G Generated auth tag not as expected");
5148         }
5149         return 0;
5150 }
5151
5152 static int
5153 test_snow3g_auth_cipher_sgl(const struct snow3g_test_data *tdata,
5154         uint8_t op_mode, uint8_t verify)
5155 {
5156         struct crypto_testsuite_params *ts_params = &testsuite_params;
5157         struct crypto_unittest_params *ut_params = &unittest_params;
5158
5159         int retval;
5160
5161         const uint8_t *plaintext = NULL;
5162         const uint8_t *ciphertext = NULL;
5163         const uint8_t *digest = NULL;
5164         unsigned int plaintext_pad_len;
5165         unsigned int plaintext_len;
5166         unsigned int ciphertext_pad_len;
5167         unsigned int ciphertext_len;
5168         uint8_t buffer[10000];
5169         uint8_t digest_buffer[10000];
5170
5171         struct rte_cryptodev_info dev_info;
5172
5173         /* Verify the capabilities */
5174         struct rte_cryptodev_sym_capability_idx cap_idx;
5175         cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
5176         cap_idx.algo.auth = RTE_CRYPTO_AUTH_SNOW3G_UIA2;
5177         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
5178                         &cap_idx) == NULL)
5179                 return TEST_SKIPPED;
5180         cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
5181         cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_SNOW3G_UEA2;
5182         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
5183                         &cap_idx) == NULL)
5184                 return TEST_SKIPPED;
5185
5186         if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
5187                 return TEST_SKIPPED;
5188
5189         rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
5190
5191         uint64_t feat_flags = dev_info.feature_flags;
5192
5193         if (op_mode == IN_PLACE) {
5194                 if (!(feat_flags & RTE_CRYPTODEV_FF_IN_PLACE_SGL)) {
5195                         printf("Device doesn't support in-place scatter-gather "
5196                                         "in both input and output mbufs.\n");
5197                         return TEST_SKIPPED;
5198                 }
5199                 if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
5200                         (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
5201                         printf("Device doesn't support RAW data-path APIs.\n");
5202                         return TEST_SKIPPED;
5203                 }
5204         } else {
5205                 if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
5206                         return TEST_SKIPPED;
5207                 if (!(feat_flags & RTE_CRYPTODEV_FF_OOP_SGL_IN_SGL_OUT)) {
5208                         printf("Device doesn't support out-of-place scatter-gather "
5209                                         "in both input and output mbufs.\n");
5210                         return TEST_SKIPPED;
5211                 }
5212                 if (!(feat_flags & RTE_CRYPTODEV_FF_DIGEST_ENCRYPTED)) {
5213                         printf("Device doesn't support digest encrypted.\n");
5214                         return TEST_SKIPPED;
5215                 }
5216         }
5217
5218         /* Create SNOW 3G session */
5219         retval = create_wireless_algo_auth_cipher_session(
5220                         ts_params->valid_devs[0],
5221                         (verify ? RTE_CRYPTO_CIPHER_OP_DECRYPT
5222                                         : RTE_CRYPTO_CIPHER_OP_ENCRYPT),
5223                         (verify ? RTE_CRYPTO_AUTH_OP_VERIFY
5224                                         : RTE_CRYPTO_AUTH_OP_GENERATE),
5225                         RTE_CRYPTO_AUTH_SNOW3G_UIA2,
5226                         RTE_CRYPTO_CIPHER_SNOW3G_UEA2,
5227                         tdata->key.data, tdata->key.len,
5228                         tdata->auth_iv.len, tdata->digest.len,
5229                         tdata->cipher_iv.len);
5230
5231         if (retval != 0)
5232                 return retval;
5233
5234         ciphertext_len = ceil_byte_length(tdata->ciphertext.len);
5235         plaintext_len = ceil_byte_length(tdata->plaintext.len);
5236         ciphertext_pad_len = RTE_ALIGN_CEIL(ciphertext_len, 16);
5237         plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16);
5238
5239         ut_params->ibuf = create_segmented_mbuf(ts_params->mbuf_pool,
5240                         plaintext_pad_len, 15, 0);
5241         TEST_ASSERT_NOT_NULL(ut_params->ibuf,
5242                         "Failed to allocate input buffer in mempool");
5243
5244         if (op_mode == OUT_OF_PLACE) {
5245                 ut_params->obuf = create_segmented_mbuf(ts_params->mbuf_pool,
5246                                 plaintext_pad_len, 15, 0);
5247                 TEST_ASSERT_NOT_NULL(ut_params->obuf,
5248                                 "Failed to allocate output buffer in mempool");
5249         }
5250
5251         if (verify) {
5252                 pktmbuf_write(ut_params->ibuf, 0, ciphertext_len,
5253                         tdata->ciphertext.data);
5254                 ciphertext = rte_pktmbuf_read(ut_params->ibuf, 0,
5255                                         ciphertext_len, buffer);
5256                 debug_hexdump(stdout, "ciphertext:", ciphertext,
5257                         ciphertext_len);
5258         } else {
5259                 pktmbuf_write(ut_params->ibuf, 0, plaintext_len,
5260                         tdata->plaintext.data);
5261                 plaintext = rte_pktmbuf_read(ut_params->ibuf, 0,
5262                                         plaintext_len, buffer);
5263                 debug_hexdump(stdout, "plaintext:", plaintext,
5264                         plaintext_len);
5265         }
5266         memset(buffer, 0, sizeof(buffer));
5267
5268         /* Create SNOW 3G operation */
5269         retval = create_wireless_algo_auth_cipher_operation(
5270                 tdata->digest.data, tdata->digest.len,
5271                 tdata->cipher_iv.data, tdata->cipher_iv.len,
5272                 tdata->auth_iv.data, tdata->auth_iv.len,
5273                 (tdata->digest.offset_bytes == 0 ?
5274                 (verify ? ciphertext_pad_len : plaintext_pad_len)
5275                         : tdata->digest.offset_bytes),
5276                 tdata->validCipherLenInBits.len,
5277                 tdata->cipher.offset_bits,
5278                 tdata->validAuthLenInBits.len,
5279                 tdata->auth.offset_bits,
5280                 op_mode, 1, verify);
5281
5282         if (retval < 0)
5283                 return retval;
5284
5285         if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
5286                 process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
5287                                 ut_params->op, 1, 1, 1, tdata->cipher_iv.len);
5288         else
5289                 ut_params->op = process_crypto_request(ts_params->valid_devs[0],
5290                         ut_params->op);
5291
5292         TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
5293
5294         ut_params->obuf = (op_mode == IN_PLACE ?
5295                 ut_params->op->sym->m_src : ut_params->op->sym->m_dst);
5296
5297         if (verify) {
5298                 if (ut_params->obuf)
5299                         plaintext = rte_pktmbuf_read(ut_params->obuf, 0,
5300                                         plaintext_len, buffer);
5301                 else
5302                         plaintext = rte_pktmbuf_read(ut_params->ibuf, 0,
5303                                         plaintext_len, buffer);
5304
5305                 debug_hexdump(stdout, "plaintext:", plaintext,
5306                         (tdata->plaintext.len >> 3) - tdata->digest.len);
5307                 debug_hexdump(stdout, "plaintext expected:",
5308                         tdata->plaintext.data,
5309                         (tdata->plaintext.len >> 3) - tdata->digest.len);
5310         } else {
5311                 if (ut_params->obuf)
5312                         ciphertext = rte_pktmbuf_read(ut_params->obuf, 0,
5313                                         ciphertext_len, buffer);
5314                 else
5315                         ciphertext = rte_pktmbuf_read(ut_params->ibuf, 0,
5316                                         ciphertext_len, buffer);
5317
5318                 debug_hexdump(stdout, "ciphertext:", ciphertext,
5319                         ciphertext_len);
5320                 debug_hexdump(stdout, "ciphertext expected:",
5321                         tdata->ciphertext.data, tdata->ciphertext.len >> 3);
5322
5323                 if (ut_params->obuf)
5324                         digest = rte_pktmbuf_read(ut_params->obuf,
5325                                 (tdata->digest.offset_bytes == 0 ?
5326                                 plaintext_pad_len : tdata->digest.offset_bytes),
5327                                 tdata->digest.len, digest_buffer);
5328                 else
5329                         digest = rte_pktmbuf_read(ut_params->ibuf,
5330                                 (tdata->digest.offset_bytes == 0 ?
5331                                 plaintext_pad_len : tdata->digest.offset_bytes),
5332                                 tdata->digest.len, digest_buffer);
5333
5334                 debug_hexdump(stdout, "digest:", digest,
5335                         tdata->digest.len);
5336                 debug_hexdump(stdout, "digest expected:",
5337                         tdata->digest.data, tdata->digest.len);
5338         }
5339
5340         /* Validate obuf */
5341         if (verify) {
5342                 TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT_OFFSET(
5343                         plaintext,
5344                         tdata->plaintext.data,
5345                         (tdata->plaintext.len - tdata->cipher.offset_bits -
5346                          (tdata->digest.len << 3)),
5347                         tdata->cipher.offset_bits,
5348                         "SNOW 3G Plaintext data not as expected");
5349         } else {
5350                 TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT_OFFSET(
5351                         ciphertext,
5352                         tdata->ciphertext.data,
5353                         (tdata->validDataLenInBits.len -
5354                          tdata->cipher.offset_bits),
5355                         tdata->cipher.offset_bits,
5356                         "SNOW 3G Ciphertext data not as expected");
5357
5358                 TEST_ASSERT_BUFFERS_ARE_EQUAL(
5359                         digest,
5360                         tdata->digest.data,
5361                         DIGEST_BYTE_LENGTH_SNOW3G_UIA2,
5362                         "SNOW 3G Generated auth tag not as expected");
5363         }
5364         return 0;
5365 }
5366
5367 static int
5368 test_kasumi_auth_cipher(const struct kasumi_test_data *tdata,
5369         uint8_t op_mode, uint8_t verify)
5370 {
5371         struct crypto_testsuite_params *ts_params = &testsuite_params;
5372         struct crypto_unittest_params *ut_params = &unittest_params;
5373
5374         int retval;
5375
5376         uint8_t *plaintext = NULL, *ciphertext = NULL;
5377         unsigned int plaintext_pad_len;
5378         unsigned int plaintext_len;
5379         unsigned int ciphertext_pad_len;
5380         unsigned int ciphertext_len;
5381
5382         struct rte_cryptodev_info dev_info;
5383
5384         /* Verify the capabilities */
5385         struct rte_cryptodev_sym_capability_idx cap_idx;
5386         cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
5387         cap_idx.algo.auth = RTE_CRYPTO_AUTH_KASUMI_F9;
5388         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
5389                         &cap_idx) == NULL)
5390                 return TEST_SKIPPED;
5391         cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
5392         cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_KASUMI_F8;
5393         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
5394                         &cap_idx) == NULL)
5395                 return TEST_SKIPPED;
5396
5397         rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
5398
5399         uint64_t feat_flags = dev_info.feature_flags;
5400
5401         if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
5402                         (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
5403                 printf("Device doesn't support RAW data-path APIs.\n");
5404                 return TEST_SKIPPED;
5405         }
5406
5407         if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
5408                 return TEST_SKIPPED;
5409
5410         if (op_mode == OUT_OF_PLACE) {
5411                 if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
5412                         return TEST_SKIPPED;
5413                 if (!(feat_flags & RTE_CRYPTODEV_FF_DIGEST_ENCRYPTED)) {
5414                         printf("Device doesn't support digest encrypted.\n");
5415                         return TEST_SKIPPED;
5416                 }
5417         }
5418
5419         /* Create KASUMI session */
5420         retval = create_wireless_algo_auth_cipher_session(
5421                         ts_params->valid_devs[0],
5422                         (verify ? RTE_CRYPTO_CIPHER_OP_DECRYPT
5423                                         : RTE_CRYPTO_CIPHER_OP_ENCRYPT),
5424                         (verify ? RTE_CRYPTO_AUTH_OP_VERIFY
5425                                         : RTE_CRYPTO_AUTH_OP_GENERATE),
5426                         RTE_CRYPTO_AUTH_KASUMI_F9,
5427                         RTE_CRYPTO_CIPHER_KASUMI_F8,
5428                         tdata->key.data, tdata->key.len,
5429                         0, tdata->digest.len,
5430                         tdata->cipher_iv.len);
5431
5432         if (retval != 0)
5433                 return retval;
5434
5435         ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
5436         if (op_mode == OUT_OF_PLACE)
5437                 ut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
5438
5439         /* clear mbuf payload */
5440         memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
5441                 rte_pktmbuf_tailroom(ut_params->ibuf));
5442         if (op_mode == OUT_OF_PLACE)
5443                 memset(rte_pktmbuf_mtod(ut_params->obuf, uint8_t *), 0,
5444                         rte_pktmbuf_tailroom(ut_params->obuf));
5445
5446         ciphertext_len = ceil_byte_length(tdata->ciphertext.len);
5447         plaintext_len = ceil_byte_length(tdata->plaintext.len);
5448         ciphertext_pad_len = RTE_ALIGN_CEIL(ciphertext_len, 16);
5449         plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16);
5450
5451         if (verify) {
5452                 ciphertext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
5453                                         ciphertext_pad_len);
5454                 memcpy(ciphertext, tdata->ciphertext.data, ciphertext_len);
5455                 if (op_mode == OUT_OF_PLACE)
5456                         rte_pktmbuf_append(ut_params->obuf, ciphertext_pad_len);
5457                 debug_hexdump(stdout, "ciphertext:", ciphertext,
5458                         ciphertext_len);
5459         } else {
5460                 plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
5461                                         plaintext_pad_len);
5462                 memcpy(plaintext, tdata->plaintext.data, plaintext_len);
5463                 if (op_mode == OUT_OF_PLACE)
5464                         rte_pktmbuf_append(ut_params->obuf, plaintext_pad_len);
5465                 debug_hexdump(stdout, "plaintext:", plaintext,
5466                         plaintext_len);
5467         }
5468
5469         /* Create KASUMI operation */
5470         retval = create_wireless_algo_auth_cipher_operation(
5471                 tdata->digest.data, tdata->digest.len,
5472                 tdata->cipher_iv.data, tdata->cipher_iv.len,
5473                 NULL, 0,
5474                 (tdata->digest.offset_bytes == 0 ?
5475                 (verify ? ciphertext_pad_len : plaintext_pad_len)
5476                         : tdata->digest.offset_bytes),
5477                 tdata->validCipherLenInBits.len,
5478                 tdata->validCipherOffsetInBits.len,
5479                 tdata->validAuthLenInBits.len,
5480                 0,
5481                 op_mode, 0, verify);
5482
5483         if (retval < 0)
5484                 return retval;
5485
5486         if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
5487                 process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
5488                                 ut_params->op, 1, 1, 1, tdata->cipher_iv.len);
5489         else
5490                 ut_params->op = process_crypto_request(ts_params->valid_devs[0],
5491                         ut_params->op);
5492
5493         TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
5494
5495         ut_params->obuf = (op_mode == IN_PLACE ?
5496                 ut_params->op->sym->m_src : ut_params->op->sym->m_dst);
5497
5498
5499         if (verify) {
5500                 if (ut_params->obuf)
5501                         plaintext = rte_pktmbuf_mtod(ut_params->obuf,
5502                                                         uint8_t *);
5503                 else
5504                         plaintext = ciphertext;
5505
5506                 debug_hexdump(stdout, "plaintext:", plaintext,
5507                         (tdata->plaintext.len >> 3) - tdata->digest.len);
5508                 debug_hexdump(stdout, "plaintext expected:",
5509                         tdata->plaintext.data,
5510                         (tdata->plaintext.len >> 3) - tdata->digest.len);
5511         } else {
5512                 if (ut_params->obuf)
5513                         ciphertext = rte_pktmbuf_mtod(ut_params->obuf,
5514                                                         uint8_t *);
5515                 else
5516                         ciphertext = plaintext;
5517
5518                 debug_hexdump(stdout, "ciphertext:", ciphertext,
5519                         ciphertext_len);
5520                 debug_hexdump(stdout, "ciphertext expected:",
5521                         tdata->ciphertext.data, tdata->ciphertext.len >> 3);
5522
5523                 ut_params->digest = rte_pktmbuf_mtod(
5524                         ut_params->obuf, uint8_t *) +
5525                         (tdata->digest.offset_bytes == 0 ?
5526                         plaintext_pad_len : tdata->digest.offset_bytes);
5527
5528                 debug_hexdump(stdout, "digest:", ut_params->digest,
5529                         tdata->digest.len);
5530                 debug_hexdump(stdout, "digest expected:",
5531                         tdata->digest.data, tdata->digest.len);
5532         }
5533
5534         /* Validate obuf */
5535         if (verify) {
5536                 TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
5537                         plaintext,
5538                         tdata->plaintext.data,
5539                         tdata->plaintext.len >> 3,
5540                         "KASUMI Plaintext data not as expected");
5541         } else {
5542                 TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
5543                         ciphertext,
5544                         tdata->ciphertext.data,
5545                         tdata->ciphertext.len >> 3,
5546                         "KASUMI Ciphertext data not as expected");
5547
5548                 TEST_ASSERT_BUFFERS_ARE_EQUAL(
5549                         ut_params->digest,
5550                         tdata->digest.data,
5551                         DIGEST_BYTE_LENGTH_KASUMI_F9,
5552                         "KASUMI Generated auth tag not as expected");
5553         }
5554         return 0;
5555 }
5556
5557 static int
5558 test_kasumi_auth_cipher_sgl(const struct kasumi_test_data *tdata,
5559         uint8_t op_mode, uint8_t verify)
5560 {
5561         struct crypto_testsuite_params *ts_params = &testsuite_params;
5562         struct crypto_unittest_params *ut_params = &unittest_params;
5563
5564         int retval;
5565
5566         const uint8_t *plaintext = NULL;
5567         const uint8_t *ciphertext = NULL;
5568         const uint8_t *digest = NULL;
5569         unsigned int plaintext_pad_len;
5570         unsigned int plaintext_len;
5571         unsigned int ciphertext_pad_len;
5572         unsigned int ciphertext_len;
5573         uint8_t buffer[10000];
5574         uint8_t digest_buffer[10000];
5575
5576         struct rte_cryptodev_info dev_info;
5577
5578         /* Verify the capabilities */
5579         struct rte_cryptodev_sym_capability_idx cap_idx;
5580         cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
5581         cap_idx.algo.auth = RTE_CRYPTO_AUTH_KASUMI_F9;
5582         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
5583                         &cap_idx) == NULL)
5584                 return TEST_SKIPPED;
5585         cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
5586         cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_KASUMI_F8;
5587         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
5588                         &cap_idx) == NULL)
5589                 return TEST_SKIPPED;
5590
5591         if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
5592                 return TEST_SKIPPED;
5593
5594         rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
5595
5596         uint64_t feat_flags = dev_info.feature_flags;
5597
5598         if (op_mode == IN_PLACE) {
5599                 if (!(feat_flags & RTE_CRYPTODEV_FF_IN_PLACE_SGL)) {
5600                         printf("Device doesn't support in-place scatter-gather "
5601                                         "in both input and output mbufs.\n");
5602                         return TEST_SKIPPED;
5603                 }
5604                 if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
5605                         (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
5606                         printf("Device doesn't support RAW data-path APIs.\n");
5607                         return TEST_SKIPPED;
5608                 }
5609         } else {
5610                 if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
5611                         return TEST_SKIPPED;
5612                 if (!(feat_flags & RTE_CRYPTODEV_FF_OOP_SGL_IN_SGL_OUT)) {
5613                         printf("Device doesn't support out-of-place scatter-gather "
5614                                         "in both input and output mbufs.\n");
5615                         return TEST_SKIPPED;
5616                 }
5617                 if (!(feat_flags & RTE_CRYPTODEV_FF_DIGEST_ENCRYPTED)) {
5618                         printf("Device doesn't support digest encrypted.\n");
5619                         return TEST_SKIPPED;
5620                 }
5621         }
5622
5623         /* Create KASUMI session */
5624         retval = create_wireless_algo_auth_cipher_session(
5625                         ts_params->valid_devs[0],
5626                         (verify ? RTE_CRYPTO_CIPHER_OP_DECRYPT
5627                                         : RTE_CRYPTO_CIPHER_OP_ENCRYPT),
5628                         (verify ? RTE_CRYPTO_AUTH_OP_VERIFY
5629                                         : RTE_CRYPTO_AUTH_OP_GENERATE),
5630                         RTE_CRYPTO_AUTH_KASUMI_F9,
5631                         RTE_CRYPTO_CIPHER_KASUMI_F8,
5632                         tdata->key.data, tdata->key.len,
5633                         0, tdata->digest.len,
5634                         tdata->cipher_iv.len);
5635
5636         if (retval != 0)
5637                 return retval;
5638
5639         ciphertext_len = ceil_byte_length(tdata->ciphertext.len);
5640         plaintext_len = ceil_byte_length(tdata->plaintext.len);
5641         ciphertext_pad_len = RTE_ALIGN_CEIL(ciphertext_len, 16);
5642         plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16);
5643
5644         ut_params->ibuf = create_segmented_mbuf(ts_params->mbuf_pool,
5645                         plaintext_pad_len, 15, 0);
5646         TEST_ASSERT_NOT_NULL(ut_params->ibuf,
5647                         "Failed to allocate input buffer in mempool");
5648
5649         if (op_mode == OUT_OF_PLACE) {
5650                 ut_params->obuf = create_segmented_mbuf(ts_params->mbuf_pool,
5651                                 plaintext_pad_len, 15, 0);
5652                 TEST_ASSERT_NOT_NULL(ut_params->obuf,
5653                                 "Failed to allocate output buffer in mempool");
5654         }
5655
5656         if (verify) {
5657                 pktmbuf_write(ut_params->ibuf, 0, ciphertext_len,
5658                         tdata->ciphertext.data);
5659                 ciphertext = rte_pktmbuf_read(ut_params->ibuf, 0,
5660                                         ciphertext_len, buffer);
5661                 debug_hexdump(stdout, "ciphertext:", ciphertext,
5662                         ciphertext_len);
5663         } else {
5664                 pktmbuf_write(ut_params->ibuf, 0, plaintext_len,
5665                         tdata->plaintext.data);
5666                 plaintext = rte_pktmbuf_read(ut_params->ibuf, 0,
5667                                         plaintext_len, buffer);
5668                 debug_hexdump(stdout, "plaintext:", plaintext,
5669                         plaintext_len);
5670         }
5671         memset(buffer, 0, sizeof(buffer));
5672
5673         /* Create KASUMI operation */
5674         retval = create_wireless_algo_auth_cipher_operation(
5675                 tdata->digest.data, tdata->digest.len,
5676                 tdata->cipher_iv.data, tdata->cipher_iv.len,
5677                 NULL, 0,
5678                 (tdata->digest.offset_bytes == 0 ?
5679                 (verify ? ciphertext_pad_len : plaintext_pad_len)
5680                         : tdata->digest.offset_bytes),
5681                 tdata->validCipherLenInBits.len,
5682                 tdata->validCipherOffsetInBits.len,
5683                 tdata->validAuthLenInBits.len,
5684                 0,
5685                 op_mode, 1, verify);
5686
5687         if (retval < 0)
5688                 return retval;
5689
5690         if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
5691                 process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
5692                                 ut_params->op, 1, 1, 1, tdata->cipher_iv.len);
5693         else
5694                 ut_params->op = process_crypto_request(ts_params->valid_devs[0],
5695                         ut_params->op);
5696
5697         TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
5698
5699         ut_params->obuf = (op_mode == IN_PLACE ?
5700                 ut_params->op->sym->m_src : ut_params->op->sym->m_dst);
5701
5702         if (verify) {
5703                 if (ut_params->obuf)
5704                         plaintext = rte_pktmbuf_read(ut_params->obuf, 0,
5705                                         plaintext_len, buffer);
5706                 else
5707                         plaintext = rte_pktmbuf_read(ut_params->ibuf, 0,
5708                                         plaintext_len, buffer);
5709
5710                 debug_hexdump(stdout, "plaintext:", plaintext,
5711                         (tdata->plaintext.len >> 3) - tdata->digest.len);
5712                 debug_hexdump(stdout, "plaintext expected:",
5713                         tdata->plaintext.data,
5714                         (tdata->plaintext.len >> 3) - tdata->digest.len);
5715         } else {
5716                 if (ut_params->obuf)
5717                         ciphertext = rte_pktmbuf_read(ut_params->obuf, 0,
5718                                         ciphertext_len, buffer);
5719                 else
5720                         ciphertext = rte_pktmbuf_read(ut_params->ibuf, 0,
5721                                         ciphertext_len, buffer);
5722
5723                 debug_hexdump(stdout, "ciphertext:", ciphertext,
5724                         ciphertext_len);
5725                 debug_hexdump(stdout, "ciphertext expected:",
5726                         tdata->ciphertext.data, tdata->ciphertext.len >> 3);
5727
5728                 if (ut_params->obuf)
5729                         digest = rte_pktmbuf_read(ut_params->obuf,
5730                                 (tdata->digest.offset_bytes == 0 ?
5731                                 plaintext_pad_len : tdata->digest.offset_bytes),
5732                                 tdata->digest.len, digest_buffer);
5733                 else
5734                         digest = rte_pktmbuf_read(ut_params->ibuf,
5735                                 (tdata->digest.offset_bytes == 0 ?
5736                                 plaintext_pad_len : tdata->digest.offset_bytes),
5737                                 tdata->digest.len, digest_buffer);
5738
5739                 debug_hexdump(stdout, "digest:", digest,
5740                         tdata->digest.len);
5741                 debug_hexdump(stdout, "digest expected:",
5742                         tdata->digest.data, tdata->digest.len);
5743         }
5744
5745         /* Validate obuf */
5746         if (verify) {
5747                 TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
5748                         plaintext,
5749                         tdata->plaintext.data,
5750                         tdata->plaintext.len >> 3,
5751                         "KASUMI Plaintext data not as expected");
5752         } else {
5753                 TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
5754                         ciphertext,
5755                         tdata->ciphertext.data,
5756                         tdata->validDataLenInBits.len,
5757                         "KASUMI Ciphertext data not as expected");
5758
5759                 TEST_ASSERT_BUFFERS_ARE_EQUAL(
5760                         digest,
5761                         tdata->digest.data,
5762                         DIGEST_BYTE_LENGTH_KASUMI_F9,
5763                         "KASUMI Generated auth tag not as expected");
5764         }
5765         return 0;
5766 }
5767
5768 static int
5769 test_kasumi_cipher_auth(const struct kasumi_test_data *tdata)
5770 {
5771         struct crypto_testsuite_params *ts_params = &testsuite_params;
5772         struct crypto_unittest_params *ut_params = &unittest_params;
5773
5774         int retval;
5775
5776         uint8_t *plaintext, *ciphertext;
5777         unsigned plaintext_pad_len;
5778         unsigned plaintext_len;
5779         struct rte_cryptodev_info dev_info;
5780
5781         rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
5782         uint64_t feat_flags = dev_info.feature_flags;
5783
5784         if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
5785                         (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
5786                 printf("Device doesn't support RAW data-path APIs.\n");
5787                 return TEST_SKIPPED;
5788         }
5789
5790         if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
5791                 return TEST_SKIPPED;
5792
5793         /* Verify the capabilities */
5794         struct rte_cryptodev_sym_capability_idx cap_idx;
5795         cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
5796         cap_idx.algo.auth = RTE_CRYPTO_AUTH_KASUMI_F9;
5797         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
5798                         &cap_idx) == NULL)
5799                 return TEST_SKIPPED;
5800         cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
5801         cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_KASUMI_F8;
5802         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
5803                         &cap_idx) == NULL)
5804                 return TEST_SKIPPED;
5805
5806         /* Create KASUMI session */
5807         retval = create_wireless_algo_cipher_auth_session(
5808                         ts_params->valid_devs[0],
5809                         RTE_CRYPTO_CIPHER_OP_ENCRYPT,
5810                         RTE_CRYPTO_AUTH_OP_GENERATE,
5811                         RTE_CRYPTO_AUTH_KASUMI_F9,
5812                         RTE_CRYPTO_CIPHER_KASUMI_F8,
5813                         tdata->key.data, tdata->key.len,
5814                         0, tdata->digest.len,
5815                         tdata->cipher_iv.len);
5816         if (retval != 0)
5817                 return retval;
5818
5819         ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
5820
5821         /* clear mbuf payload */
5822         memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
5823                         rte_pktmbuf_tailroom(ut_params->ibuf));
5824
5825         plaintext_len = ceil_byte_length(tdata->plaintext.len);
5826         /* Append data which is padded to a multiple of */
5827         /* the algorithms block size */
5828         plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16);
5829         plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
5830                                 plaintext_pad_len);
5831         memcpy(plaintext, tdata->plaintext.data, plaintext_len);
5832
5833         debug_hexdump(stdout, "plaintext:", plaintext, plaintext_len);
5834
5835         /* Create KASUMI operation */
5836         retval = create_wireless_algo_cipher_hash_operation(tdata->digest.data,
5837                                 tdata->digest.len, NULL, 0,
5838                                 plaintext_pad_len, RTE_CRYPTO_AUTH_OP_GENERATE,
5839                                 tdata->cipher_iv.data, tdata->cipher_iv.len,
5840                                 RTE_ALIGN_CEIL(tdata->validCipherLenInBits.len, 8),
5841                                 tdata->validCipherOffsetInBits.len,
5842                                 tdata->validAuthLenInBits.len,
5843                                 0
5844                                 );
5845         if (retval < 0)
5846                 return retval;
5847
5848         if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
5849                 process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
5850                                 ut_params->op, 1, 1, 1, tdata->cipher_iv.len);
5851         else
5852                 ut_params->op = process_crypto_request(ts_params->valid_devs[0],
5853                         ut_params->op);
5854         TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
5855
5856         if (ut_params->op->sym->m_dst)
5857                 ut_params->obuf = ut_params->op->sym->m_dst;
5858         else
5859                 ut_params->obuf = ut_params->op->sym->m_src;
5860
5861         ciphertext = rte_pktmbuf_mtod_offset(ut_params->obuf, uint8_t *,
5862                                 tdata->validCipherOffsetInBits.len >> 3);
5863
5864         ut_params->digest = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *)
5865                         + plaintext_pad_len;
5866
5867         const uint8_t *reference_ciphertext = tdata->ciphertext.data +
5868                                 (tdata->validCipherOffsetInBits.len >> 3);
5869         /* Validate obuf */
5870         TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
5871                 ciphertext,
5872                 reference_ciphertext,
5873                 tdata->validCipherLenInBits.len,
5874                 "KASUMI Ciphertext data not as expected");
5875
5876         /* Validate obuf */
5877         TEST_ASSERT_BUFFERS_ARE_EQUAL(
5878                 ut_params->digest,
5879                 tdata->digest.data,
5880                 DIGEST_BYTE_LENGTH_SNOW3G_UIA2,
5881                 "KASUMI Generated auth tag not as expected");
5882         return 0;
5883 }
5884
5885 static int
5886 test_zuc_encryption(const struct wireless_test_data *tdata)
5887 {
5888         struct crypto_testsuite_params *ts_params = &testsuite_params;
5889         struct crypto_unittest_params *ut_params = &unittest_params;
5890
5891         int retval;
5892         uint8_t *plaintext, *ciphertext;
5893         unsigned plaintext_pad_len;
5894         unsigned plaintext_len;
5895         struct rte_cryptodev_info dev_info;
5896
5897         rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
5898         uint64_t feat_flags = dev_info.feature_flags;
5899
5900         if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
5901                         (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
5902                 printf("Device doesn't support RAW data-path APIs.\n");
5903                 return TEST_SKIPPED;
5904         }
5905
5906         if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
5907                 return TEST_SKIPPED;
5908
5909         struct rte_cryptodev_sym_capability_idx cap_idx;
5910
5911         /* Check if device supports ZUC EEA3 */
5912         cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
5913         cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_ZUC_EEA3;
5914
5915         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
5916                         &cap_idx) == NULL)
5917                 return TEST_SKIPPED;
5918
5919         /* Create ZUC session */
5920         retval = create_wireless_algo_cipher_session(ts_params->valid_devs[0],
5921                                         RTE_CRYPTO_CIPHER_OP_ENCRYPT,
5922                                         RTE_CRYPTO_CIPHER_ZUC_EEA3,
5923                                         tdata->key.data, tdata->key.len,
5924                                         tdata->cipher_iv.len);
5925         if (retval != 0)
5926                 return retval;
5927
5928         ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
5929
5930         /* Clear mbuf payload */
5931         memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
5932                rte_pktmbuf_tailroom(ut_params->ibuf));
5933
5934         plaintext_len = ceil_byte_length(tdata->plaintext.len);
5935         /* Append data which is padded to a multiple */
5936         /* of the algorithms block size */
5937         plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 8);
5938         plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
5939                                 plaintext_pad_len);
5940         memcpy(plaintext, tdata->plaintext.data, plaintext_len);
5941
5942         debug_hexdump(stdout, "plaintext:", plaintext, plaintext_len);
5943
5944         /* Create ZUC operation */
5945         retval = create_wireless_algo_cipher_operation(tdata->cipher_iv.data,
5946                                         tdata->cipher_iv.len,
5947                                         tdata->plaintext.len,
5948                                         0);
5949         if (retval < 0)
5950                 return retval;
5951
5952         if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
5953                 process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
5954                                 ut_params->op, 1, 0, 1, tdata->cipher_iv.len);
5955         else
5956                 ut_params->op = process_crypto_request(ts_params->valid_devs[0],
5957                                                 ut_params->op);
5958         TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
5959
5960         ut_params->obuf = ut_params->op->sym->m_dst;
5961         if (ut_params->obuf)
5962                 ciphertext = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *);
5963         else
5964                 ciphertext = plaintext;
5965
5966         debug_hexdump(stdout, "ciphertext:", ciphertext, plaintext_len);
5967
5968         /* Validate obuf */
5969         TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
5970                 ciphertext,
5971                 tdata->ciphertext.data,
5972                 tdata->validCipherLenInBits.len,
5973                 "ZUC Ciphertext data not as expected");
5974         return 0;
5975 }
5976
5977 static int
5978 test_zuc_encryption_sgl(const struct wireless_test_data *tdata)
5979 {
5980         struct crypto_testsuite_params *ts_params = &testsuite_params;
5981         struct crypto_unittest_params *ut_params = &unittest_params;
5982
5983         int retval;
5984
5985         unsigned int plaintext_pad_len;
5986         unsigned int plaintext_len;
5987         const uint8_t *ciphertext;
5988         uint8_t ciphertext_buffer[2048];
5989         struct rte_cryptodev_info dev_info;
5990
5991         struct rte_cryptodev_sym_capability_idx cap_idx;
5992
5993         /* Check if device supports ZUC EEA3 */
5994         cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
5995         cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_ZUC_EEA3;
5996
5997         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
5998                         &cap_idx) == NULL)
5999                 return TEST_SKIPPED;
6000
6001         if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
6002                 return TEST_SKIPPED;
6003
6004         rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
6005
6006         uint64_t feat_flags = dev_info.feature_flags;
6007
6008         if (!(feat_flags & RTE_CRYPTODEV_FF_IN_PLACE_SGL)) {
6009                 printf("Device doesn't support in-place scatter-gather. "
6010                                 "Test Skipped.\n");
6011                 return TEST_SKIPPED;
6012         }
6013
6014         if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
6015                         (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
6016                 printf("Device doesn't support RAW data-path APIs.\n");
6017                 return TEST_SKIPPED;
6018         }
6019
6020         plaintext_len = ceil_byte_length(tdata->plaintext.len);
6021
6022         /* Append data which is padded to a multiple */
6023         /* of the algorithms block size */
6024         plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 8);
6025
6026         ut_params->ibuf = create_segmented_mbuf(ts_params->mbuf_pool,
6027                         plaintext_pad_len, 10, 0);
6028
6029         pktmbuf_write(ut_params->ibuf, 0, plaintext_len,
6030                         tdata->plaintext.data);
6031
6032         /* Create ZUC session */
6033         retval = create_wireless_algo_cipher_session(ts_params->valid_devs[0],
6034                         RTE_CRYPTO_CIPHER_OP_ENCRYPT,
6035                         RTE_CRYPTO_CIPHER_ZUC_EEA3,
6036                         tdata->key.data, tdata->key.len,
6037                         tdata->cipher_iv.len);
6038         if (retval < 0)
6039                 return retval;
6040
6041         /* Clear mbuf payload */
6042
6043         pktmbuf_write(ut_params->ibuf, 0, plaintext_len, tdata->plaintext.data);
6044
6045         /* Create ZUC operation */
6046         retval = create_wireless_algo_cipher_operation(tdata->cipher_iv.data,
6047                         tdata->cipher_iv.len, tdata->plaintext.len,
6048                         0);
6049         if (retval < 0)
6050                 return retval;
6051
6052         if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
6053                 process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
6054                                 ut_params->op, 1, 0, 1, tdata->cipher_iv.len);
6055         else
6056                 ut_params->op = process_crypto_request(ts_params->valid_devs[0],
6057                                                 ut_params->op);
6058         TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
6059
6060         ut_params->obuf = ut_params->op->sym->m_dst;
6061         if (ut_params->obuf)
6062                 ciphertext = rte_pktmbuf_read(ut_params->obuf,
6063                         0, plaintext_len, ciphertext_buffer);
6064         else
6065                 ciphertext = rte_pktmbuf_read(ut_params->ibuf,
6066                         0, plaintext_len, ciphertext_buffer);
6067
6068         /* Validate obuf */
6069         debug_hexdump(stdout, "ciphertext:", ciphertext, plaintext_len);
6070
6071         /* Validate obuf */
6072         TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
6073                 ciphertext,
6074                 tdata->ciphertext.data,
6075                 tdata->validCipherLenInBits.len,
6076                 "ZUC Ciphertext data not as expected");
6077
6078         return 0;
6079 }
6080
6081 static int
6082 test_zuc_authentication(const struct wireless_test_data *tdata)
6083 {
6084         struct crypto_testsuite_params *ts_params = &testsuite_params;
6085         struct crypto_unittest_params *ut_params = &unittest_params;
6086
6087         int retval;
6088         unsigned plaintext_pad_len;
6089         unsigned plaintext_len;
6090         uint8_t *plaintext;
6091
6092         struct rte_cryptodev_sym_capability_idx cap_idx;
6093         struct rte_cryptodev_info dev_info;
6094
6095         rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
6096         uint64_t feat_flags = dev_info.feature_flags;
6097
6098         if (!(feat_flags & RTE_CRYPTODEV_FF_NON_BYTE_ALIGNED_DATA) &&
6099                         (tdata->validAuthLenInBits.len % 8 != 0)) {
6100                 printf("Device doesn't support NON-Byte Aligned Data.\n");
6101                 return TEST_SKIPPED;
6102         }
6103
6104         if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
6105                         (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
6106                 printf("Device doesn't support RAW data-path APIs.\n");
6107                 return TEST_SKIPPED;
6108         }
6109
6110         if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
6111                 return TEST_SKIPPED;
6112
6113         /* Check if device supports ZUC EIA3 */
6114         cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
6115         cap_idx.algo.auth = RTE_CRYPTO_AUTH_ZUC_EIA3;
6116
6117         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
6118                         &cap_idx) == NULL)
6119                 return TEST_SKIPPED;
6120
6121         /* Create ZUC session */
6122         retval = create_wireless_algo_hash_session(ts_params->valid_devs[0],
6123                         tdata->key.data, tdata->key.len,
6124                         tdata->auth_iv.len, tdata->digest.len,
6125                         RTE_CRYPTO_AUTH_OP_GENERATE,
6126                         RTE_CRYPTO_AUTH_ZUC_EIA3);
6127         if (retval != 0)
6128                 return retval;
6129
6130         /* alloc mbuf and set payload */
6131         ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
6132
6133         memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
6134         rte_pktmbuf_tailroom(ut_params->ibuf));
6135
6136         plaintext_len = ceil_byte_length(tdata->plaintext.len);
6137         /* Append data which is padded to a multiple of */
6138         /* the algorithms block size */
6139         plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 8);
6140         plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
6141                                 plaintext_pad_len);
6142         memcpy(plaintext, tdata->plaintext.data, plaintext_len);
6143
6144         /* Create ZUC operation */
6145         retval = create_wireless_algo_hash_operation(NULL, tdata->digest.len,
6146                         tdata->auth_iv.data, tdata->auth_iv.len,
6147                         plaintext_pad_len, RTE_CRYPTO_AUTH_OP_GENERATE,
6148                         tdata->validAuthLenInBits.len,
6149                         0);
6150         if (retval < 0)
6151                 return retval;
6152
6153         if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
6154                 process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
6155                                 ut_params->op, 0, 1, 1, 0);
6156         else
6157                 ut_params->op = process_crypto_request(ts_params->valid_devs[0],
6158                                 ut_params->op);
6159         ut_params->obuf = ut_params->op->sym->m_src;
6160         TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
6161         ut_params->digest = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *)
6162                         + plaintext_pad_len;
6163
6164         /* Validate obuf */
6165         TEST_ASSERT_BUFFERS_ARE_EQUAL(
6166         ut_params->digest,
6167         tdata->digest.data,
6168         tdata->digest.len,
6169         "ZUC Generated auth tag not as expected");
6170
6171         return 0;
6172 }
6173
6174 static int
6175 test_zuc_auth_cipher(const struct wireless_test_data *tdata,
6176         uint8_t op_mode, uint8_t verify)
6177 {
6178         struct crypto_testsuite_params *ts_params = &testsuite_params;
6179         struct crypto_unittest_params *ut_params = &unittest_params;
6180
6181         int retval;
6182
6183         uint8_t *plaintext = NULL, *ciphertext = NULL;
6184         unsigned int plaintext_pad_len;
6185         unsigned int plaintext_len;
6186         unsigned int ciphertext_pad_len;
6187         unsigned int ciphertext_len;
6188
6189         struct rte_cryptodev_info dev_info;
6190         struct rte_cryptodev_sym_capability_idx cap_idx;
6191
6192         /* Check if device supports ZUC EIA3 */
6193         cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
6194         cap_idx.algo.auth = RTE_CRYPTO_AUTH_ZUC_EIA3;
6195
6196         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
6197                         &cap_idx) == NULL)
6198                 return TEST_SKIPPED;
6199
6200         rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
6201
6202         uint64_t feat_flags = dev_info.feature_flags;
6203
6204         if (!(feat_flags & RTE_CRYPTODEV_FF_DIGEST_ENCRYPTED)) {
6205                 printf("Device doesn't support digest encrypted.\n");
6206                 return TEST_SKIPPED;
6207         }
6208         if (op_mode == IN_PLACE) {
6209                 if (!(feat_flags & RTE_CRYPTODEV_FF_IN_PLACE_SGL)) {
6210                         printf("Device doesn't support in-place scatter-gather "
6211                                         "in both input and output mbufs.\n");
6212                         return TEST_SKIPPED;
6213                 }
6214
6215                 if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
6216                         (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
6217                         printf("Device doesn't support RAW data-path APIs.\n");
6218                         return TEST_SKIPPED;
6219                 }
6220         } else {
6221                 if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
6222                         return TEST_SKIPPED;
6223                 if (!(feat_flags & RTE_CRYPTODEV_FF_OOP_SGL_IN_SGL_OUT)) {
6224                         printf("Device doesn't support out-of-place scatter-gather "
6225                                         "in both input and output mbufs.\n");
6226                         return TEST_SKIPPED;
6227                 }
6228         }
6229
6230         /* Create ZUC session */
6231         retval = create_wireless_algo_auth_cipher_session(
6232                         ts_params->valid_devs[0],
6233                         (verify ? RTE_CRYPTO_CIPHER_OP_DECRYPT
6234                                         : RTE_CRYPTO_CIPHER_OP_ENCRYPT),
6235                         (verify ? RTE_CRYPTO_AUTH_OP_VERIFY
6236                                         : RTE_CRYPTO_AUTH_OP_GENERATE),
6237                         RTE_CRYPTO_AUTH_ZUC_EIA3,
6238                         RTE_CRYPTO_CIPHER_ZUC_EEA3,
6239                         tdata->key.data, tdata->key.len,
6240                         tdata->auth_iv.len, tdata->digest.len,
6241                         tdata->cipher_iv.len);
6242
6243         if (retval != 0)
6244                 return retval;
6245
6246         ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
6247         if (op_mode == OUT_OF_PLACE)
6248                 ut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
6249
6250         /* clear mbuf payload */
6251         memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
6252                 rte_pktmbuf_tailroom(ut_params->ibuf));
6253         if (op_mode == OUT_OF_PLACE)
6254                 memset(rte_pktmbuf_mtod(ut_params->obuf, uint8_t *), 0,
6255                         rte_pktmbuf_tailroom(ut_params->obuf));
6256
6257         ciphertext_len = ceil_byte_length(tdata->ciphertext.len);
6258         plaintext_len = ceil_byte_length(tdata->plaintext.len);
6259         ciphertext_pad_len = RTE_ALIGN_CEIL(ciphertext_len, 16);
6260         plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16);
6261
6262         if (verify) {
6263                 ciphertext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
6264                                         ciphertext_pad_len);
6265                 memcpy(ciphertext, tdata->ciphertext.data, ciphertext_len);
6266                 if (op_mode == OUT_OF_PLACE)
6267                         rte_pktmbuf_append(ut_params->obuf, ciphertext_pad_len);
6268                 debug_hexdump(stdout, "ciphertext:", ciphertext,
6269                         ciphertext_len);
6270         } else {
6271                 plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
6272                                         plaintext_pad_len);
6273                 memcpy(plaintext, tdata->plaintext.data, plaintext_len);
6274                 if (op_mode == OUT_OF_PLACE)
6275                         rte_pktmbuf_append(ut_params->obuf, plaintext_pad_len);
6276                 debug_hexdump(stdout, "plaintext:", plaintext,
6277                         plaintext_len);
6278         }
6279
6280         /* Create ZUC operation */
6281         retval = create_wireless_algo_auth_cipher_operation(
6282                 tdata->digest.data, tdata->digest.len,
6283                 tdata->cipher_iv.data, tdata->cipher_iv.len,
6284                 tdata->auth_iv.data, tdata->auth_iv.len,
6285                 (tdata->digest.offset_bytes == 0 ?
6286                 (verify ? ciphertext_pad_len : plaintext_pad_len)
6287                         : tdata->digest.offset_bytes),
6288                 tdata->validCipherLenInBits.len,
6289                 tdata->validCipherOffsetInBits.len,
6290                 tdata->validAuthLenInBits.len,
6291                 0,
6292                 op_mode, 0, verify);
6293
6294         if (retval < 0)
6295                 return retval;
6296
6297         if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
6298                 process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
6299                                 ut_params->op, 1, 1, 1, tdata->cipher_iv.len);
6300         else
6301                 ut_params->op = process_crypto_request(ts_params->valid_devs[0],
6302                         ut_params->op);
6303
6304         TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
6305
6306         ut_params->obuf = (op_mode == IN_PLACE ?
6307                 ut_params->op->sym->m_src : ut_params->op->sym->m_dst);
6308
6309
6310         if (verify) {
6311                 if (ut_params->obuf)
6312                         plaintext = rte_pktmbuf_mtod(ut_params->obuf,
6313                                                         uint8_t *);
6314                 else
6315                         plaintext = ciphertext;
6316
6317                 debug_hexdump(stdout, "plaintext:", plaintext,
6318                         (tdata->plaintext.len >> 3) - tdata->digest.len);
6319                 debug_hexdump(stdout, "plaintext expected:",
6320                         tdata->plaintext.data,
6321                         (tdata->plaintext.len >> 3) - tdata->digest.len);
6322         } else {
6323                 if (ut_params->obuf)
6324                         ciphertext = rte_pktmbuf_mtod(ut_params->obuf,
6325                                                         uint8_t *);
6326                 else
6327                         ciphertext = plaintext;
6328
6329                 debug_hexdump(stdout, "ciphertext:", ciphertext,
6330                         ciphertext_len);
6331                 debug_hexdump(stdout, "ciphertext expected:",
6332                         tdata->ciphertext.data, tdata->ciphertext.len >> 3);
6333
6334                 ut_params->digest = rte_pktmbuf_mtod(
6335                         ut_params->obuf, uint8_t *) +
6336                         (tdata->digest.offset_bytes == 0 ?
6337                         plaintext_pad_len : tdata->digest.offset_bytes);
6338
6339                 debug_hexdump(stdout, "digest:", ut_params->digest,
6340                         tdata->digest.len);
6341                 debug_hexdump(stdout, "digest expected:",
6342                         tdata->digest.data, tdata->digest.len);
6343         }
6344
6345         /* Validate obuf */
6346         if (verify) {
6347                 TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
6348                         plaintext,
6349                         tdata->plaintext.data,
6350                         tdata->plaintext.len >> 3,
6351                         "ZUC Plaintext data not as expected");
6352         } else {
6353                 TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
6354                         ciphertext,
6355                         tdata->ciphertext.data,
6356                         tdata->ciphertext.len >> 3,
6357                         "ZUC Ciphertext data not as expected");
6358
6359                 TEST_ASSERT_BUFFERS_ARE_EQUAL(
6360                         ut_params->digest,
6361                         tdata->digest.data,
6362                         DIGEST_BYTE_LENGTH_KASUMI_F9,
6363                         "ZUC Generated auth tag not as expected");
6364         }
6365         return 0;
6366 }
6367
6368 static int
6369 test_zuc_auth_cipher_sgl(const struct wireless_test_data *tdata,
6370         uint8_t op_mode, uint8_t verify)
6371 {
6372         struct crypto_testsuite_params *ts_params = &testsuite_params;
6373         struct crypto_unittest_params *ut_params = &unittest_params;
6374
6375         int retval;
6376
6377         const uint8_t *plaintext = NULL;
6378         const uint8_t *ciphertext = NULL;
6379         const uint8_t *digest = NULL;
6380         unsigned int plaintext_pad_len;
6381         unsigned int plaintext_len;
6382         unsigned int ciphertext_pad_len;
6383         unsigned int ciphertext_len;
6384         uint8_t buffer[10000];
6385         uint8_t digest_buffer[10000];
6386
6387         struct rte_cryptodev_info dev_info;
6388         struct rte_cryptodev_sym_capability_idx cap_idx;
6389
6390         /* Check if device supports ZUC EIA3 */
6391         cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
6392         cap_idx.algo.auth = RTE_CRYPTO_AUTH_ZUC_EIA3;
6393
6394         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
6395                         &cap_idx) == NULL)
6396                 return TEST_SKIPPED;
6397
6398         rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
6399
6400         uint64_t feat_flags = dev_info.feature_flags;
6401
6402         if (op_mode == IN_PLACE) {
6403                 if (!(feat_flags & RTE_CRYPTODEV_FF_IN_PLACE_SGL)) {
6404                         printf("Device doesn't support in-place scatter-gather "
6405                                         "in both input and output mbufs.\n");
6406                         return TEST_SKIPPED;
6407                 }
6408
6409                 if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
6410                         (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
6411                         printf("Device doesn't support RAW data-path APIs.\n");
6412                         return TEST_SKIPPED;
6413                 }
6414         } else {
6415                 if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
6416                         return TEST_SKIPPED;
6417                 if (!(feat_flags & RTE_CRYPTODEV_FF_OOP_SGL_IN_SGL_OUT)) {
6418                         printf("Device doesn't support out-of-place scatter-gather "
6419                                         "in both input and output mbufs.\n");
6420                         return TEST_SKIPPED;
6421                 }
6422                 if (!(feat_flags & RTE_CRYPTODEV_FF_DIGEST_ENCRYPTED)) {
6423                         printf("Device doesn't support digest encrypted.\n");
6424                         return TEST_SKIPPED;
6425                 }
6426         }
6427
6428         /* Create ZUC session */
6429         retval = create_wireless_algo_auth_cipher_session(
6430                         ts_params->valid_devs[0],
6431                         (verify ? RTE_CRYPTO_CIPHER_OP_DECRYPT
6432                                         : RTE_CRYPTO_CIPHER_OP_ENCRYPT),
6433                         (verify ? RTE_CRYPTO_AUTH_OP_VERIFY
6434                                         : RTE_CRYPTO_AUTH_OP_GENERATE),
6435                         RTE_CRYPTO_AUTH_ZUC_EIA3,
6436                         RTE_CRYPTO_CIPHER_ZUC_EEA3,
6437                         tdata->key.data, tdata->key.len,
6438                         tdata->auth_iv.len, tdata->digest.len,
6439                         tdata->cipher_iv.len);
6440
6441         if (retval != 0)
6442                 return retval;
6443
6444         ciphertext_len = ceil_byte_length(tdata->ciphertext.len);
6445         plaintext_len = ceil_byte_length(tdata->plaintext.len);
6446         ciphertext_pad_len = RTE_ALIGN_CEIL(ciphertext_len, 16);
6447         plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16);
6448
6449         ut_params->ibuf = create_segmented_mbuf(ts_params->mbuf_pool,
6450                         plaintext_pad_len, 15, 0);
6451         TEST_ASSERT_NOT_NULL(ut_params->ibuf,
6452                         "Failed to allocate input buffer in mempool");
6453
6454         if (op_mode == OUT_OF_PLACE) {
6455                 ut_params->obuf = create_segmented_mbuf(ts_params->mbuf_pool,
6456                                 plaintext_pad_len, 15, 0);
6457                 TEST_ASSERT_NOT_NULL(ut_params->obuf,
6458                                 "Failed to allocate output buffer in mempool");
6459         }
6460
6461         if (verify) {
6462                 pktmbuf_write(ut_params->ibuf, 0, ciphertext_len,
6463                         tdata->ciphertext.data);
6464                 ciphertext = rte_pktmbuf_read(ut_params->ibuf, 0,
6465                                         ciphertext_len, buffer);
6466                 debug_hexdump(stdout, "ciphertext:", ciphertext,
6467                         ciphertext_len);
6468         } else {
6469                 pktmbuf_write(ut_params->ibuf, 0, plaintext_len,
6470                         tdata->plaintext.data);
6471                 plaintext = rte_pktmbuf_read(ut_params->ibuf, 0,
6472                                         plaintext_len, buffer);
6473                 debug_hexdump(stdout, "plaintext:", plaintext,
6474                         plaintext_len);
6475         }
6476         memset(buffer, 0, sizeof(buffer));
6477
6478         /* Create ZUC operation */
6479         retval = create_wireless_algo_auth_cipher_operation(
6480                 tdata->digest.data, tdata->digest.len,
6481                 tdata->cipher_iv.data, tdata->cipher_iv.len,
6482                 NULL, 0,
6483                 (tdata->digest.offset_bytes == 0 ?
6484                 (verify ? ciphertext_pad_len : plaintext_pad_len)
6485                         : tdata->digest.offset_bytes),
6486                 tdata->validCipherLenInBits.len,
6487                 tdata->validCipherOffsetInBits.len,
6488                 tdata->validAuthLenInBits.len,
6489                 0,
6490                 op_mode, 1, verify);
6491
6492         if (retval < 0)
6493                 return retval;
6494
6495         if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
6496                 process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
6497                                 ut_params->op, 1, 1, 1, tdata->cipher_iv.len);
6498         else
6499                 ut_params->op = process_crypto_request(ts_params->valid_devs[0],
6500                         ut_params->op);
6501
6502         TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
6503
6504         ut_params->obuf = (op_mode == IN_PLACE ?
6505                 ut_params->op->sym->m_src : ut_params->op->sym->m_dst);
6506
6507         if (verify) {
6508                 if (ut_params->obuf)
6509                         plaintext = rte_pktmbuf_read(ut_params->obuf, 0,
6510                                         plaintext_len, buffer);
6511                 else
6512                         plaintext = rte_pktmbuf_read(ut_params->ibuf, 0,
6513                                         plaintext_len, buffer);
6514
6515                 debug_hexdump(stdout, "plaintext:", plaintext,
6516                         (tdata->plaintext.len >> 3) - tdata->digest.len);
6517                 debug_hexdump(stdout, "plaintext expected:",
6518                         tdata->plaintext.data,
6519                         (tdata->plaintext.len >> 3) - tdata->digest.len);
6520         } else {
6521                 if (ut_params->obuf)
6522                         ciphertext = rte_pktmbuf_read(ut_params->obuf, 0,
6523                                         ciphertext_len, buffer);
6524                 else
6525                         ciphertext = rte_pktmbuf_read(ut_params->ibuf, 0,
6526                                         ciphertext_len, buffer);
6527
6528                 debug_hexdump(stdout, "ciphertext:", ciphertext,
6529                         ciphertext_len);
6530                 debug_hexdump(stdout, "ciphertext expected:",
6531                         tdata->ciphertext.data, tdata->ciphertext.len >> 3);
6532
6533                 if (ut_params->obuf)
6534                         digest = rte_pktmbuf_read(ut_params->obuf,
6535                                 (tdata->digest.offset_bytes == 0 ?
6536                                 plaintext_pad_len : tdata->digest.offset_bytes),
6537                                 tdata->digest.len, digest_buffer);
6538                 else
6539                         digest = rte_pktmbuf_read(ut_params->ibuf,
6540                                 (tdata->digest.offset_bytes == 0 ?
6541                                 plaintext_pad_len : tdata->digest.offset_bytes),
6542                                 tdata->digest.len, digest_buffer);
6543
6544                 debug_hexdump(stdout, "digest:", digest,
6545                         tdata->digest.len);
6546                 debug_hexdump(stdout, "digest expected:",
6547                         tdata->digest.data, tdata->digest.len);
6548         }
6549
6550         /* Validate obuf */
6551         if (verify) {
6552                 TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
6553                         plaintext,
6554                         tdata->plaintext.data,
6555                         tdata->plaintext.len >> 3,
6556                         "ZUC Plaintext data not as expected");
6557         } else {
6558                 TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
6559                         ciphertext,
6560                         tdata->ciphertext.data,
6561                         tdata->validDataLenInBits.len,
6562                         "ZUC Ciphertext data not as expected");
6563
6564                 TEST_ASSERT_BUFFERS_ARE_EQUAL(
6565                         digest,
6566                         tdata->digest.data,
6567                         DIGEST_BYTE_LENGTH_KASUMI_F9,
6568                         "ZUC Generated auth tag not as expected");
6569         }
6570         return 0;
6571 }
6572
6573 static int
6574 test_kasumi_encryption_test_case_1(void)
6575 {
6576         return test_kasumi_encryption(&kasumi_test_case_1);
6577 }
6578
6579 static int
6580 test_kasumi_encryption_test_case_1_sgl(void)
6581 {
6582         return test_kasumi_encryption_sgl(&kasumi_test_case_1);
6583 }
6584
6585 static int
6586 test_kasumi_encryption_test_case_1_oop(void)
6587 {
6588         return test_kasumi_encryption_oop(&kasumi_test_case_1);
6589 }
6590
6591 static int
6592 test_kasumi_encryption_test_case_1_oop_sgl(void)
6593 {
6594         return test_kasumi_encryption_oop_sgl(&kasumi_test_case_1);
6595 }
6596
6597 static int
6598 test_kasumi_encryption_test_case_2(void)
6599 {
6600         return test_kasumi_encryption(&kasumi_test_case_2);
6601 }
6602
6603 static int
6604 test_kasumi_encryption_test_case_3(void)
6605 {
6606         return test_kasumi_encryption(&kasumi_test_case_3);
6607 }
6608
6609 static int
6610 test_kasumi_encryption_test_case_4(void)
6611 {
6612         return test_kasumi_encryption(&kasumi_test_case_4);
6613 }
6614
6615 static int
6616 test_kasumi_encryption_test_case_5(void)
6617 {
6618         return test_kasumi_encryption(&kasumi_test_case_5);
6619 }
6620
6621 static int
6622 test_kasumi_decryption_test_case_1(void)
6623 {
6624         return test_kasumi_decryption(&kasumi_test_case_1);
6625 }
6626
6627 static int
6628 test_kasumi_decryption_test_case_1_oop(void)
6629 {
6630         return test_kasumi_decryption_oop(&kasumi_test_case_1);
6631 }
6632
6633 static int
6634 test_kasumi_decryption_test_case_2(void)
6635 {
6636         return test_kasumi_decryption(&kasumi_test_case_2);
6637 }
6638
6639 static int
6640 test_kasumi_decryption_test_case_3(void)
6641 {
6642         /* rte_crypto_mbuf_to_vec does not support incomplete mbuf build */
6643         if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
6644                 return TEST_SKIPPED;
6645         return test_kasumi_decryption(&kasumi_test_case_3);
6646 }
6647
6648 static int
6649 test_kasumi_decryption_test_case_4(void)
6650 {
6651         return test_kasumi_decryption(&kasumi_test_case_4);
6652 }
6653
6654 static int
6655 test_kasumi_decryption_test_case_5(void)
6656 {
6657         return test_kasumi_decryption(&kasumi_test_case_5);
6658 }
6659 static int
6660 test_snow3g_encryption_test_case_1(void)
6661 {
6662         return test_snow3g_encryption(&snow3g_test_case_1);
6663 }
6664
6665 static int
6666 test_snow3g_encryption_test_case_1_oop(void)
6667 {
6668         return test_snow3g_encryption_oop(&snow3g_test_case_1);
6669 }
6670
6671 static int
6672 test_snow3g_encryption_test_case_1_oop_sgl(void)
6673 {
6674         return test_snow3g_encryption_oop_sgl(&snow3g_test_case_1);
6675 }
6676
6677
6678 static int
6679 test_snow3g_encryption_test_case_1_offset_oop(void)
6680 {
6681         return test_snow3g_encryption_offset_oop(&snow3g_test_case_1);
6682 }
6683
6684 static int
6685 test_snow3g_encryption_test_case_2(void)
6686 {
6687         return test_snow3g_encryption(&snow3g_test_case_2);
6688 }
6689
6690 static int
6691 test_snow3g_encryption_test_case_3(void)
6692 {
6693         return test_snow3g_encryption(&snow3g_test_case_3);
6694 }
6695
6696 static int
6697 test_snow3g_encryption_test_case_4(void)
6698 {
6699         return test_snow3g_encryption(&snow3g_test_case_4);
6700 }
6701
6702 static int
6703 test_snow3g_encryption_test_case_5(void)
6704 {
6705         return test_snow3g_encryption(&snow3g_test_case_5);
6706 }
6707
6708 static int
6709 test_snow3g_decryption_test_case_1(void)
6710 {
6711         return test_snow3g_decryption(&snow3g_test_case_1);
6712 }
6713
6714 static int
6715 test_snow3g_decryption_test_case_1_oop(void)
6716 {
6717         return test_snow3g_decryption_oop(&snow3g_test_case_1);
6718 }
6719
6720 static int
6721 test_snow3g_decryption_test_case_2(void)
6722 {
6723         return test_snow3g_decryption(&snow3g_test_case_2);
6724 }
6725
6726 static int
6727 test_snow3g_decryption_test_case_3(void)
6728 {
6729         return test_snow3g_decryption(&snow3g_test_case_3);
6730 }
6731
6732 static int
6733 test_snow3g_decryption_test_case_4(void)
6734 {
6735         return test_snow3g_decryption(&snow3g_test_case_4);
6736 }
6737
6738 static int
6739 test_snow3g_decryption_test_case_5(void)
6740 {
6741         return test_snow3g_decryption(&snow3g_test_case_5);
6742 }
6743
6744 /*
6745  * Function prepares snow3g_hash_test_data from snow3g_test_data.
6746  * Pattern digest from snow3g_test_data must be allocated as
6747  * 4 last bytes in plaintext.
6748  */
6749 static void
6750 snow3g_hash_test_vector_setup(const struct snow3g_test_data *pattern,
6751                 struct snow3g_hash_test_data *output)
6752 {
6753         if ((pattern != NULL) && (output != NULL)) {
6754                 output->key.len = pattern->key.len;
6755
6756                 memcpy(output->key.data,
6757                 pattern->key.data, pattern->key.len);
6758
6759                 output->auth_iv.len = pattern->auth_iv.len;
6760
6761                 memcpy(output->auth_iv.data,
6762                 pattern->auth_iv.data, pattern->auth_iv.len);
6763
6764                 output->plaintext.len = pattern->plaintext.len;
6765
6766                 memcpy(output->plaintext.data,
6767                 pattern->plaintext.data, pattern->plaintext.len >> 3);
6768
6769                 output->digest.len = pattern->digest.len;
6770
6771                 memcpy(output->digest.data,
6772                 &pattern->plaintext.data[pattern->digest.offset_bytes],
6773                 pattern->digest.len);
6774
6775                 output->validAuthLenInBits.len =
6776                 pattern->validAuthLenInBits.len;
6777         }
6778 }
6779
6780 /*
6781  * Test case verify computed cipher and digest from snow3g_test_case_7 data.
6782  */
6783 static int
6784 test_snow3g_decryption_with_digest_test_case_1(void)
6785 {
6786         struct snow3g_hash_test_data snow3g_hash_data;
6787         struct rte_cryptodev_info dev_info;
6788         struct crypto_testsuite_params *ts_params = &testsuite_params;
6789
6790         rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
6791         uint64_t feat_flags = dev_info.feature_flags;
6792
6793         if (!(feat_flags & RTE_CRYPTODEV_FF_DIGEST_ENCRYPTED)) {
6794                 printf("Device doesn't support encrypted digest operations.\n");
6795                 return TEST_SKIPPED;
6796         }
6797
6798         /*
6799          * Function prepare data for hash veryfication test case.
6800          * Digest is allocated in 4 last bytes in plaintext, pattern.
6801          */
6802         snow3g_hash_test_vector_setup(&snow3g_test_case_7, &snow3g_hash_data);
6803
6804         return test_snow3g_decryption(&snow3g_test_case_7) &
6805                         test_snow3g_authentication_verify(&snow3g_hash_data);
6806 }
6807
6808 static int
6809 test_snow3g_cipher_auth_test_case_1(void)
6810 {
6811         return test_snow3g_cipher_auth(&snow3g_test_case_3);
6812 }
6813
6814 static int
6815 test_snow3g_auth_cipher_test_case_1(void)
6816 {
6817         return test_snow3g_auth_cipher(
6818                 &snow3g_auth_cipher_test_case_1, IN_PLACE, 0);
6819 }
6820
6821 static int
6822 test_snow3g_auth_cipher_test_case_2(void)
6823 {
6824         return test_snow3g_auth_cipher(
6825                 &snow3g_auth_cipher_test_case_2, IN_PLACE, 0);
6826 }
6827
6828 static int
6829 test_snow3g_auth_cipher_test_case_2_oop(void)
6830 {
6831         return test_snow3g_auth_cipher(
6832                 &snow3g_auth_cipher_test_case_2, OUT_OF_PLACE, 0);
6833 }
6834
6835 static int
6836 test_snow3g_auth_cipher_part_digest_enc(void)
6837 {
6838         return test_snow3g_auth_cipher(
6839                 &snow3g_auth_cipher_partial_digest_encryption,
6840                         IN_PLACE, 0);
6841 }
6842
6843 static int
6844 test_snow3g_auth_cipher_part_digest_enc_oop(void)
6845 {
6846         return test_snow3g_auth_cipher(
6847                 &snow3g_auth_cipher_partial_digest_encryption,
6848                         OUT_OF_PLACE, 0);
6849 }
6850
6851 static int
6852 test_snow3g_auth_cipher_test_case_3_sgl(void)
6853 {
6854         /* rte_crypto_mbuf_to_vec does not support incomplete mbuf build */
6855         if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
6856                 return TEST_SKIPPED;
6857         return test_snow3g_auth_cipher_sgl(
6858                 &snow3g_auth_cipher_test_case_3, IN_PLACE, 0);
6859 }
6860
6861 static int
6862 test_snow3g_auth_cipher_test_case_3_oop_sgl(void)
6863 {
6864         return test_snow3g_auth_cipher_sgl(
6865                 &snow3g_auth_cipher_test_case_3, OUT_OF_PLACE, 0);
6866 }
6867
6868 static int
6869 test_snow3g_auth_cipher_part_digest_enc_sgl(void)
6870 {
6871         /* rte_crypto_mbuf_to_vec does not support incomplete mbuf build */
6872         if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
6873                 return TEST_SKIPPED;
6874         return test_snow3g_auth_cipher_sgl(
6875                 &snow3g_auth_cipher_partial_digest_encryption,
6876                         IN_PLACE, 0);
6877 }
6878
6879 static int
6880 test_snow3g_auth_cipher_part_digest_enc_oop_sgl(void)
6881 {
6882         return test_snow3g_auth_cipher_sgl(
6883                 &snow3g_auth_cipher_partial_digest_encryption,
6884                         OUT_OF_PLACE, 0);
6885 }
6886
6887 static int
6888 test_snow3g_auth_cipher_verify_test_case_1(void)
6889 {
6890         return test_snow3g_auth_cipher(
6891                 &snow3g_auth_cipher_test_case_1, IN_PLACE, 1);
6892 }
6893
6894 static int
6895 test_snow3g_auth_cipher_verify_test_case_2(void)
6896 {
6897         return test_snow3g_auth_cipher(
6898                 &snow3g_auth_cipher_test_case_2, IN_PLACE, 1);
6899 }
6900
6901 static int
6902 test_snow3g_auth_cipher_verify_test_case_2_oop(void)
6903 {
6904         return test_snow3g_auth_cipher(
6905                 &snow3g_auth_cipher_test_case_2, OUT_OF_PLACE, 1);
6906 }
6907
6908 static int
6909 test_snow3g_auth_cipher_verify_part_digest_enc(void)
6910 {
6911         return test_snow3g_auth_cipher(
6912                 &snow3g_auth_cipher_partial_digest_encryption,
6913                         IN_PLACE, 1);
6914 }
6915
6916 static int
6917 test_snow3g_auth_cipher_verify_part_digest_enc_oop(void)
6918 {
6919         return test_snow3g_auth_cipher(
6920                 &snow3g_auth_cipher_partial_digest_encryption,
6921                         OUT_OF_PLACE, 1);
6922 }
6923
6924 static int
6925 test_snow3g_auth_cipher_verify_test_case_3_sgl(void)
6926 {
6927         return test_snow3g_auth_cipher_sgl(
6928                 &snow3g_auth_cipher_test_case_3, IN_PLACE, 1);
6929 }
6930
6931 static int
6932 test_snow3g_auth_cipher_verify_test_case_3_oop_sgl(void)
6933 {
6934         return test_snow3g_auth_cipher_sgl(
6935                 &snow3g_auth_cipher_test_case_3, OUT_OF_PLACE, 1);
6936 }
6937
6938 static int
6939 test_snow3g_auth_cipher_verify_part_digest_enc_sgl(void)
6940 {
6941         return test_snow3g_auth_cipher_sgl(
6942                 &snow3g_auth_cipher_partial_digest_encryption,
6943                         IN_PLACE, 1);
6944 }
6945
6946 static int
6947 test_snow3g_auth_cipher_verify_part_digest_enc_oop_sgl(void)
6948 {
6949         return test_snow3g_auth_cipher_sgl(
6950                 &snow3g_auth_cipher_partial_digest_encryption,
6951                         OUT_OF_PLACE, 1);
6952 }
6953
6954 static int
6955 test_snow3g_auth_cipher_with_digest_test_case_1(void)
6956 {
6957         return test_snow3g_auth_cipher(
6958                 &snow3g_test_case_7, IN_PLACE, 0);
6959 }
6960
6961 static int
6962 test_kasumi_auth_cipher_test_case_1(void)
6963 {
6964         return test_kasumi_auth_cipher(
6965                 &kasumi_test_case_3, IN_PLACE, 0);
6966 }
6967
6968 static int
6969 test_kasumi_auth_cipher_test_case_2(void)
6970 {
6971         return test_kasumi_auth_cipher(
6972                 &kasumi_auth_cipher_test_case_2, IN_PLACE, 0);
6973 }
6974
6975 static int
6976 test_kasumi_auth_cipher_test_case_2_oop(void)
6977 {
6978         return test_kasumi_auth_cipher(
6979                 &kasumi_auth_cipher_test_case_2, OUT_OF_PLACE, 0);
6980 }
6981
6982 static int
6983 test_kasumi_auth_cipher_test_case_2_sgl(void)
6984 {
6985         return test_kasumi_auth_cipher_sgl(
6986                 &kasumi_auth_cipher_test_case_2, IN_PLACE, 0);
6987 }
6988
6989 static int
6990 test_kasumi_auth_cipher_test_case_2_oop_sgl(void)
6991 {
6992         return test_kasumi_auth_cipher_sgl(
6993                 &kasumi_auth_cipher_test_case_2, OUT_OF_PLACE, 0);
6994 }
6995
6996 static int
6997 test_kasumi_auth_cipher_verify_test_case_1(void)
6998 {
6999         return test_kasumi_auth_cipher(
7000                 &kasumi_test_case_3, IN_PLACE, 1);
7001 }
7002
7003 static int
7004 test_kasumi_auth_cipher_verify_test_case_2(void)
7005 {
7006         return test_kasumi_auth_cipher(
7007                 &kasumi_auth_cipher_test_case_2, IN_PLACE, 1);
7008 }
7009
7010 static int
7011 test_kasumi_auth_cipher_verify_test_case_2_oop(void)
7012 {
7013         return test_kasumi_auth_cipher(
7014                 &kasumi_auth_cipher_test_case_2, OUT_OF_PLACE, 1);
7015 }
7016
7017 static int
7018 test_kasumi_auth_cipher_verify_test_case_2_sgl(void)
7019 {
7020         return test_kasumi_auth_cipher_sgl(
7021                 &kasumi_auth_cipher_test_case_2, IN_PLACE, 1);
7022 }
7023
7024 static int
7025 test_kasumi_auth_cipher_verify_test_case_2_oop_sgl(void)
7026 {
7027         return test_kasumi_auth_cipher_sgl(
7028                 &kasumi_auth_cipher_test_case_2, OUT_OF_PLACE, 1);
7029 }
7030
7031 static int
7032 test_kasumi_cipher_auth_test_case_1(void)
7033 {
7034         return test_kasumi_cipher_auth(&kasumi_test_case_6);
7035 }
7036
7037 static int
7038 test_zuc_encryption_test_case_1(void)
7039 {
7040         return test_zuc_encryption(&zuc_test_case_cipher_193b);
7041 }
7042
7043 static int
7044 test_zuc_encryption_test_case_2(void)
7045 {
7046         return test_zuc_encryption(&zuc_test_case_cipher_800b);
7047 }
7048
7049 static int
7050 test_zuc_encryption_test_case_3(void)
7051 {
7052         return test_zuc_encryption(&zuc_test_case_cipher_1570b);
7053 }
7054
7055 static int
7056 test_zuc_encryption_test_case_4(void)
7057 {
7058         return test_zuc_encryption(&zuc_test_case_cipher_2798b);
7059 }
7060
7061 static int
7062 test_zuc_encryption_test_case_5(void)
7063 {
7064         return test_zuc_encryption(&zuc_test_case_cipher_4019b);
7065 }
7066
7067 static int
7068 test_zuc_encryption_test_case_6_sgl(void)
7069 {
7070         return test_zuc_encryption_sgl(&zuc_test_case_cipher_193b);
7071 }
7072
7073 static int
7074 test_zuc_encryption_test_case_7(void)
7075 {
7076         return test_zuc_encryption(&zuc_test_case_cipher_800b_key_256b);
7077 }
7078
7079 static int
7080 test_zuc_hash_generate_test_case_1(void)
7081 {
7082         return test_zuc_authentication(&zuc_test_case_auth_1b);
7083 }
7084
7085 static int
7086 test_zuc_hash_generate_test_case_2(void)
7087 {
7088         return test_zuc_authentication(&zuc_test_case_auth_90b);
7089 }
7090
7091 static int
7092 test_zuc_hash_generate_test_case_3(void)
7093 {
7094         return test_zuc_authentication(&zuc_test_case_auth_577b);
7095 }
7096
7097 static int
7098 test_zuc_hash_generate_test_case_4(void)
7099 {
7100         return test_zuc_authentication(&zuc_test_case_auth_2079b);
7101 }
7102
7103 static int
7104 test_zuc_hash_generate_test_case_5(void)
7105 {
7106         return test_zuc_authentication(&zuc_test_auth_5670b);
7107 }
7108
7109 static int
7110 test_zuc_hash_generate_test_case_6(void)
7111 {
7112         return test_zuc_authentication(&zuc_test_case_auth_128b);
7113 }
7114
7115 static int
7116 test_zuc_hash_generate_test_case_7(void)
7117 {
7118         return test_zuc_authentication(&zuc_test_case_auth_2080b);
7119 }
7120
7121 static int
7122 test_zuc_hash_generate_test_case_8(void)
7123 {
7124         return test_zuc_authentication(&zuc_test_case_auth_584b);
7125 }
7126
7127 static int
7128 test_zuc_hash_generate_test_case_9(void)
7129 {
7130         return test_zuc_authentication(&zuc_test_case_auth_584b_mac_64b);
7131 }
7132
7133 static int
7134 test_zuc_hash_generate_test_case_10(void)
7135 {
7136         return test_zuc_authentication(&zuc_test_case_auth_2080b_mac_128b);
7137 }
7138
7139 static int
7140 test_zuc_cipher_auth_test_case_1(void)
7141 {
7142         return test_zuc_cipher_auth(&zuc_test_case_cipher_200b_auth_200b);
7143 }
7144
7145 static int
7146 test_zuc_cipher_auth_test_case_2(void)
7147 {
7148         return test_zuc_cipher_auth(&zuc_test_case_cipher_800b_auth_120b);
7149 }
7150
7151 static int
7152 test_zuc_auth_cipher_test_case_1(void)
7153 {
7154         return test_zuc_auth_cipher(
7155                 &zuc_auth_cipher_test_case_1, IN_PLACE, 0);
7156 }
7157
7158 static int
7159 test_zuc_auth_cipher_test_case_1_oop(void)
7160 {
7161         return test_zuc_auth_cipher(
7162                 &zuc_auth_cipher_test_case_1, OUT_OF_PLACE, 0);
7163 }
7164
7165 static int
7166 test_zuc_auth_cipher_test_case_1_sgl(void)
7167 {
7168         return test_zuc_auth_cipher_sgl(
7169                 &zuc_auth_cipher_test_case_1, IN_PLACE, 0);
7170 }
7171
7172 static int
7173 test_zuc_auth_cipher_test_case_1_oop_sgl(void)
7174 {
7175         return test_zuc_auth_cipher_sgl(
7176                 &zuc_auth_cipher_test_case_1, OUT_OF_PLACE, 0);
7177 }
7178
7179 static int
7180 test_zuc_auth_cipher_verify_test_case_1(void)
7181 {
7182         return test_zuc_auth_cipher(
7183                 &zuc_auth_cipher_test_case_1, IN_PLACE, 1);
7184 }
7185
7186 static int
7187 test_zuc_auth_cipher_verify_test_case_1_oop(void)
7188 {
7189         return test_zuc_auth_cipher(
7190                 &zuc_auth_cipher_test_case_1, OUT_OF_PLACE, 1);
7191 }
7192
7193 static int
7194 test_zuc_auth_cipher_verify_test_case_1_sgl(void)
7195 {
7196         return test_zuc_auth_cipher_sgl(
7197                 &zuc_auth_cipher_test_case_1, IN_PLACE, 1);
7198 }
7199
7200 static int
7201 test_zuc_auth_cipher_verify_test_case_1_oop_sgl(void)
7202 {
7203         return test_zuc_auth_cipher_sgl(
7204                 &zuc_auth_cipher_test_case_1, OUT_OF_PLACE, 1);
7205 }
7206
7207 static int
7208 test_mixed_check_if_unsupported(const struct mixed_cipher_auth_test_data *tdata)
7209 {
7210         uint8_t dev_id = testsuite_params.valid_devs[0];
7211
7212         struct rte_cryptodev_sym_capability_idx cap_idx;
7213
7214         /* Check if device supports particular cipher algorithm */
7215         cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
7216         cap_idx.algo.cipher = tdata->cipher_algo;
7217         if (rte_cryptodev_sym_capability_get(dev_id, &cap_idx) == NULL)
7218                 return TEST_SKIPPED;
7219
7220         /* Check if device supports particular hash algorithm */
7221         cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
7222         cap_idx.algo.auth = tdata->auth_algo;
7223         if (rte_cryptodev_sym_capability_get(dev_id, &cap_idx) == NULL)
7224                 return TEST_SKIPPED;
7225
7226         return 0;
7227 }
7228
7229 static int
7230 test_mixed_auth_cipher(const struct mixed_cipher_auth_test_data *tdata,
7231         uint8_t op_mode, uint8_t verify)
7232 {
7233         struct crypto_testsuite_params *ts_params = &testsuite_params;
7234         struct crypto_unittest_params *ut_params = &unittest_params;
7235
7236         int retval;
7237
7238         uint8_t *plaintext = NULL, *ciphertext = NULL;
7239         unsigned int plaintext_pad_len;
7240         unsigned int plaintext_len;
7241         unsigned int ciphertext_pad_len;
7242         unsigned int ciphertext_len;
7243
7244         struct rte_cryptodev_info dev_info;
7245         struct rte_crypto_op *op;
7246
7247         /* Check if device supports particular algorithms separately */
7248         if (test_mixed_check_if_unsupported(tdata))
7249                 return TEST_SKIPPED;
7250         if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
7251                 return TEST_SKIPPED;
7252
7253         rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
7254
7255         uint64_t feat_flags = dev_info.feature_flags;
7256
7257         if (!(feat_flags & RTE_CRYPTODEV_FF_DIGEST_ENCRYPTED)) {
7258                 printf("Device doesn't support digest encrypted.\n");
7259                 return TEST_SKIPPED;
7260         }
7261
7262         /* Create the session */
7263         if (verify)
7264                 retval = create_wireless_algo_cipher_auth_session(
7265                                 ts_params->valid_devs[0],
7266                                 RTE_CRYPTO_CIPHER_OP_DECRYPT,
7267                                 RTE_CRYPTO_AUTH_OP_VERIFY,
7268                                 tdata->auth_algo,
7269                                 tdata->cipher_algo,
7270                                 tdata->auth_key.data, tdata->auth_key.len,
7271                                 tdata->auth_iv.len, tdata->digest_enc.len,
7272                                 tdata->cipher_iv.len);
7273         else
7274                 retval = create_wireless_algo_auth_cipher_session(
7275                                 ts_params->valid_devs[0],
7276                                 RTE_CRYPTO_CIPHER_OP_ENCRYPT,
7277                                 RTE_CRYPTO_AUTH_OP_GENERATE,
7278                                 tdata->auth_algo,
7279                                 tdata->cipher_algo,
7280                                 tdata->auth_key.data, tdata->auth_key.len,
7281                                 tdata->auth_iv.len, tdata->digest_enc.len,
7282                                 tdata->cipher_iv.len);
7283         if (retval != 0)
7284                 return retval;
7285
7286         ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
7287         if (op_mode == OUT_OF_PLACE)
7288                 ut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
7289
7290         /* clear mbuf payload */
7291         memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
7292                 rte_pktmbuf_tailroom(ut_params->ibuf));
7293         if (op_mode == OUT_OF_PLACE) {
7294
7295                 memset(rte_pktmbuf_mtod(ut_params->obuf, uint8_t *), 0,
7296                                 rte_pktmbuf_tailroom(ut_params->obuf));
7297         }
7298
7299         ciphertext_len = ceil_byte_length(tdata->ciphertext.len_bits);
7300         plaintext_len = ceil_byte_length(tdata->plaintext.len_bits);
7301         ciphertext_pad_len = RTE_ALIGN_CEIL(ciphertext_len, 16);
7302         plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16);
7303
7304         if (verify) {
7305                 ciphertext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
7306                                 ciphertext_pad_len);
7307                 memcpy(ciphertext, tdata->ciphertext.data, ciphertext_len);
7308                 if (op_mode == OUT_OF_PLACE)
7309                         rte_pktmbuf_append(ut_params->obuf, ciphertext_pad_len);
7310                 debug_hexdump(stdout, "ciphertext:", ciphertext,
7311                                 ciphertext_len);
7312         } else {
7313                 plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
7314                                 plaintext_pad_len);
7315                 memcpy(plaintext, tdata->plaintext.data, plaintext_len);
7316                 if (op_mode == OUT_OF_PLACE)
7317                         rte_pktmbuf_append(ut_params->obuf, plaintext_pad_len);
7318                 debug_hexdump(stdout, "plaintext:", plaintext, plaintext_len);
7319         }
7320
7321         /* Create the operation */
7322         retval = create_wireless_algo_auth_cipher_operation(
7323                         tdata->digest_enc.data, tdata->digest_enc.len,
7324                         tdata->cipher_iv.data, tdata->cipher_iv.len,
7325                         tdata->auth_iv.data, tdata->auth_iv.len,
7326                         (tdata->digest_enc.offset == 0 ?
7327                                 plaintext_pad_len
7328                                 : tdata->digest_enc.offset),
7329                         tdata->validCipherLen.len_bits,
7330                         tdata->cipher.offset_bits,
7331                         tdata->validAuthLen.len_bits,
7332                         tdata->auth.offset_bits,
7333                         op_mode, 0, verify);
7334
7335         if (retval < 0)
7336                 return retval;
7337
7338         op = process_crypto_request(ts_params->valid_devs[0], ut_params->op);
7339
7340         /* Check if the op failed because the device doesn't */
7341         /* support this particular combination of algorithms */
7342         if (op == NULL && ut_params->op->status ==
7343                         RTE_CRYPTO_OP_STATUS_INVALID_SESSION) {
7344                 printf("Device doesn't support this mixed combination. "
7345                                 "Test Skipped.\n");
7346                 return TEST_SKIPPED;
7347         }
7348         ut_params->op = op;
7349
7350         TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
7351
7352         ut_params->obuf = (op_mode == IN_PLACE ?
7353                         ut_params->op->sym->m_src : ut_params->op->sym->m_dst);
7354
7355         if (verify) {
7356                 if (ut_params->obuf)
7357                         plaintext = rte_pktmbuf_mtod(ut_params->obuf,
7358                                                         uint8_t *);
7359                 else
7360                         plaintext = ciphertext +
7361                                         (tdata->cipher.offset_bits >> 3);
7362
7363                 debug_hexdump(stdout, "plaintext:", plaintext,
7364                                 tdata->plaintext.len_bits >> 3);
7365                 debug_hexdump(stdout, "plaintext expected:",
7366                                 tdata->plaintext.data,
7367                                 tdata->plaintext.len_bits >> 3);
7368         } else {
7369                 if (ut_params->obuf)
7370                         ciphertext = rte_pktmbuf_mtod(ut_params->obuf,
7371                                         uint8_t *);
7372                 else
7373                         ciphertext = plaintext;
7374
7375                 debug_hexdump(stdout, "ciphertext:", ciphertext,
7376                                 ciphertext_len);
7377                 debug_hexdump(stdout, "ciphertext expected:",
7378                                 tdata->ciphertext.data,
7379                                 tdata->ciphertext.len_bits >> 3);
7380
7381                 ut_params->digest = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *)
7382                                 + (tdata->digest_enc.offset == 0 ?
7383                 plaintext_pad_len : tdata->digest_enc.offset);
7384
7385                 debug_hexdump(stdout, "digest:", ut_params->digest,
7386                                 tdata->digest_enc.len);
7387                 debug_hexdump(stdout, "digest expected:",
7388                                 tdata->digest_enc.data,
7389                                 tdata->digest_enc.len);
7390         }
7391
7392         /* Validate obuf */
7393         if (verify) {
7394                 TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
7395                                 plaintext,
7396                                 tdata->plaintext.data,
7397                                 tdata->plaintext.len_bits >> 3,
7398                                 "Plaintext data not as expected");
7399         } else {
7400                 TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
7401                                 ciphertext,
7402                                 tdata->ciphertext.data,
7403                                 tdata->validDataLen.len_bits,
7404                                 "Ciphertext data not as expected");
7405
7406                 TEST_ASSERT_BUFFERS_ARE_EQUAL(
7407                                 ut_params->digest,
7408                                 tdata->digest_enc.data,
7409                                 DIGEST_BYTE_LENGTH_SNOW3G_UIA2,
7410                                 "Generated auth tag not as expected");
7411         }
7412
7413         TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
7414                         "crypto op processing failed");
7415
7416         return 0;
7417 }
7418
7419 static int
7420 test_mixed_auth_cipher_sgl(const struct mixed_cipher_auth_test_data *tdata,
7421         uint8_t op_mode, uint8_t verify)
7422 {
7423         struct crypto_testsuite_params *ts_params = &testsuite_params;
7424         struct crypto_unittest_params *ut_params = &unittest_params;
7425
7426         int retval;
7427
7428         const uint8_t *plaintext = NULL;
7429         const uint8_t *ciphertext = NULL;
7430         const uint8_t *digest = NULL;
7431         unsigned int plaintext_pad_len;
7432         unsigned int plaintext_len;
7433         unsigned int ciphertext_pad_len;
7434         unsigned int ciphertext_len;
7435         uint8_t buffer[10000];
7436         uint8_t digest_buffer[10000];
7437
7438         struct rte_cryptodev_info dev_info;
7439         struct rte_crypto_op *op;
7440
7441         /* Check if device supports particular algorithms */
7442         if (test_mixed_check_if_unsupported(tdata))
7443                 return TEST_SKIPPED;
7444         if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
7445                 return TEST_SKIPPED;
7446
7447         rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
7448
7449         uint64_t feat_flags = dev_info.feature_flags;
7450
7451         if (op_mode == IN_PLACE) {
7452                 if (!(feat_flags & RTE_CRYPTODEV_FF_IN_PLACE_SGL)) {
7453                         printf("Device doesn't support in-place scatter-gather "
7454                                         "in both input and output mbufs.\n");
7455                         return TEST_SKIPPED;
7456                 }
7457         } else {
7458                 if (!(feat_flags & RTE_CRYPTODEV_FF_OOP_SGL_IN_SGL_OUT)) {
7459                         printf("Device doesn't support out-of-place scatter-gather "
7460                                         "in both input and output mbufs.\n");
7461                         return TEST_SKIPPED;
7462                 }
7463                 if (!(feat_flags & RTE_CRYPTODEV_FF_DIGEST_ENCRYPTED)) {
7464                         printf("Device doesn't support digest encrypted.\n");
7465                         return TEST_SKIPPED;
7466                 }
7467         }
7468
7469         /* Create the session */
7470         if (verify)
7471                 retval = create_wireless_algo_cipher_auth_session(
7472                                 ts_params->valid_devs[0],
7473                                 RTE_CRYPTO_CIPHER_OP_DECRYPT,
7474                                 RTE_CRYPTO_AUTH_OP_VERIFY,
7475                                 tdata->auth_algo,
7476                                 tdata->cipher_algo,
7477                                 tdata->auth_key.data, tdata->auth_key.len,
7478                                 tdata->auth_iv.len, tdata->digest_enc.len,
7479                                 tdata->cipher_iv.len);
7480         else
7481                 retval = create_wireless_algo_auth_cipher_session(
7482                                 ts_params->valid_devs[0],
7483                                 RTE_CRYPTO_CIPHER_OP_ENCRYPT,
7484                                 RTE_CRYPTO_AUTH_OP_GENERATE,
7485                                 tdata->auth_algo,
7486                                 tdata->cipher_algo,
7487                                 tdata->auth_key.data, tdata->auth_key.len,
7488                                 tdata->auth_iv.len, tdata->digest_enc.len,
7489                                 tdata->cipher_iv.len);
7490         if (retval != 0)
7491                 return retval;
7492
7493         ciphertext_len = ceil_byte_length(tdata->ciphertext.len_bits);
7494         plaintext_len = ceil_byte_length(tdata->plaintext.len_bits);
7495         ciphertext_pad_len = RTE_ALIGN_CEIL(ciphertext_len, 16);
7496         plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16);
7497
7498         ut_params->ibuf = create_segmented_mbuf(ts_params->mbuf_pool,
7499                         ciphertext_pad_len, 15, 0);
7500         TEST_ASSERT_NOT_NULL(ut_params->ibuf,
7501                         "Failed to allocate input buffer in mempool");
7502
7503         if (op_mode == OUT_OF_PLACE) {
7504                 ut_params->obuf = create_segmented_mbuf(ts_params->mbuf_pool,
7505                                 plaintext_pad_len, 15, 0);
7506                 TEST_ASSERT_NOT_NULL(ut_params->obuf,
7507                                 "Failed to allocate output buffer in mempool");
7508         }
7509
7510         if (verify) {
7511                 pktmbuf_write(ut_params->ibuf, 0, ciphertext_len,
7512                         tdata->ciphertext.data);
7513                 ciphertext = rte_pktmbuf_read(ut_params->ibuf, 0,
7514                                         ciphertext_len, buffer);
7515                 debug_hexdump(stdout, "ciphertext:", ciphertext,
7516                         ciphertext_len);
7517         } else {
7518                 pktmbuf_write(ut_params->ibuf, 0, plaintext_len,
7519                         tdata->plaintext.data);
7520                 plaintext = rte_pktmbuf_read(ut_params->ibuf, 0,
7521                                         plaintext_len, buffer);
7522                 debug_hexdump(stdout, "plaintext:", plaintext,
7523                         plaintext_len);
7524         }
7525         memset(buffer, 0, sizeof(buffer));
7526
7527         /* Create the operation */
7528         retval = create_wireless_algo_auth_cipher_operation(
7529                         tdata->digest_enc.data, tdata->digest_enc.len,
7530                         tdata->cipher_iv.data, tdata->cipher_iv.len,
7531                         tdata->auth_iv.data, tdata->auth_iv.len,
7532                         (tdata->digest_enc.offset == 0 ?
7533                                 plaintext_pad_len
7534                                 : tdata->digest_enc.offset),
7535                         tdata->validCipherLen.len_bits,
7536                         tdata->cipher.offset_bits,
7537                         tdata->validAuthLen.len_bits,
7538                         tdata->auth.offset_bits,
7539                         op_mode, 1, verify);
7540
7541         if (retval < 0)
7542                 return retval;
7543
7544         op = process_crypto_request(ts_params->valid_devs[0], ut_params->op);
7545
7546         /* Check if the op failed because the device doesn't */
7547         /* support this particular combination of algorithms */
7548         if (op == NULL && ut_params->op->status ==
7549                         RTE_CRYPTO_OP_STATUS_INVALID_SESSION) {
7550                 printf("Device doesn't support this mixed combination. "
7551                                 "Test Skipped.\n");
7552                 return TEST_SKIPPED;
7553         }
7554         ut_params->op = op;
7555
7556         TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
7557
7558         ut_params->obuf = (op_mode == IN_PLACE ?
7559                         ut_params->op->sym->m_src : ut_params->op->sym->m_dst);
7560
7561         if (verify) {
7562                 if (ut_params->obuf)
7563                         plaintext = rte_pktmbuf_read(ut_params->obuf, 0,
7564                                         plaintext_len, buffer);
7565                 else
7566                         plaintext = rte_pktmbuf_read(ut_params->ibuf, 0,
7567                                         plaintext_len, buffer);
7568
7569                 debug_hexdump(stdout, "plaintext:", plaintext,
7570                                 (tdata->plaintext.len_bits >> 3) -
7571                                 tdata->digest_enc.len);
7572                 debug_hexdump(stdout, "plaintext expected:",
7573                                 tdata->plaintext.data,
7574                                 (tdata->plaintext.len_bits >> 3) -
7575                                 tdata->digest_enc.len);
7576         } else {
7577                 if (ut_params->obuf)
7578                         ciphertext = rte_pktmbuf_read(ut_params->obuf, 0,
7579                                         ciphertext_len, buffer);
7580                 else
7581                         ciphertext = rte_pktmbuf_read(ut_params->ibuf, 0,
7582                                         ciphertext_len, buffer);
7583
7584                 debug_hexdump(stdout, "ciphertext:", ciphertext,
7585                         ciphertext_len);
7586                 debug_hexdump(stdout, "ciphertext expected:",
7587                         tdata->ciphertext.data,
7588                         tdata->ciphertext.len_bits >> 3);
7589
7590                 if (ut_params->obuf)
7591                         digest = rte_pktmbuf_read(ut_params->obuf,
7592                                         (tdata->digest_enc.offset == 0 ?
7593                                                 plaintext_pad_len :
7594                                                 tdata->digest_enc.offset),
7595                                         tdata->digest_enc.len, digest_buffer);
7596                 else
7597                         digest = rte_pktmbuf_read(ut_params->ibuf,
7598                                         (tdata->digest_enc.offset == 0 ?
7599                                                 plaintext_pad_len :
7600                                                 tdata->digest_enc.offset),
7601                                         tdata->digest_enc.len, digest_buffer);
7602
7603                 debug_hexdump(stdout, "digest:", digest,
7604                                 tdata->digest_enc.len);
7605                 debug_hexdump(stdout, "digest expected:",
7606                                 tdata->digest_enc.data, tdata->digest_enc.len);
7607         }
7608
7609         /* Validate obuf */
7610         if (verify) {
7611                 TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
7612                                 plaintext,
7613                                 tdata->plaintext.data,
7614                                 tdata->plaintext.len_bits >> 3,
7615                                 "Plaintext data not as expected");
7616         } else {
7617                 TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
7618                                 ciphertext,
7619                                 tdata->ciphertext.data,
7620                                 tdata->validDataLen.len_bits,
7621                                 "Ciphertext data not as expected");
7622                 TEST_ASSERT_BUFFERS_ARE_EQUAL(
7623                                 digest,
7624                                 tdata->digest_enc.data,
7625                                 tdata->digest_enc.len,
7626                                 "Generated auth tag not as expected");
7627         }
7628
7629         TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
7630                         "crypto op processing failed");
7631
7632         return 0;
7633 }
7634
7635 /** AUTH AES CMAC + CIPHER AES CTR */
7636
7637 static int
7638 test_aes_cmac_aes_ctr_digest_enc_test_case_1(void)
7639 {
7640         return test_mixed_auth_cipher(
7641                 &auth_aes_cmac_cipher_aes_ctr_test_case_1, IN_PLACE, 0);
7642 }
7643
7644 static int
7645 test_aes_cmac_aes_ctr_digest_enc_test_case_1_oop(void)
7646 {
7647         return test_mixed_auth_cipher(
7648                 &auth_aes_cmac_cipher_aes_ctr_test_case_1, OUT_OF_PLACE, 0);
7649 }
7650
7651 static int
7652 test_aes_cmac_aes_ctr_digest_enc_test_case_1_sgl(void)
7653 {
7654         return test_mixed_auth_cipher_sgl(
7655                 &auth_aes_cmac_cipher_aes_ctr_test_case_1, IN_PLACE, 0);
7656 }
7657
7658 static int
7659 test_aes_cmac_aes_ctr_digest_enc_test_case_1_oop_sgl(void)
7660 {
7661         return test_mixed_auth_cipher_sgl(
7662                 &auth_aes_cmac_cipher_aes_ctr_test_case_1, OUT_OF_PLACE, 0);
7663 }
7664
7665 static int
7666 test_verify_aes_cmac_aes_ctr_digest_enc_test_case_1(void)
7667 {
7668         return test_mixed_auth_cipher(
7669                 &auth_aes_cmac_cipher_aes_ctr_test_case_1, IN_PLACE, 1);
7670 }
7671
7672 static int
7673 test_verify_aes_cmac_aes_ctr_digest_enc_test_case_1_oop(void)
7674 {
7675         return test_mixed_auth_cipher(
7676                 &auth_aes_cmac_cipher_aes_ctr_test_case_1, OUT_OF_PLACE, 1);
7677 }
7678
7679 static int
7680 test_verify_aes_cmac_aes_ctr_digest_enc_test_case_1_sgl(void)
7681 {
7682         return test_mixed_auth_cipher_sgl(
7683                 &auth_aes_cmac_cipher_aes_ctr_test_case_1, IN_PLACE, 1);
7684 }
7685
7686 static int
7687 test_verify_aes_cmac_aes_ctr_digest_enc_test_case_1_oop_sgl(void)
7688 {
7689         return test_mixed_auth_cipher_sgl(
7690                 &auth_aes_cmac_cipher_aes_ctr_test_case_1, OUT_OF_PLACE, 1);
7691 }
7692
7693 /** MIXED AUTH + CIPHER */
7694
7695 static int
7696 test_auth_zuc_cipher_snow_test_case_1(void)
7697 {
7698         return test_mixed_auth_cipher(
7699                 &auth_zuc_cipher_snow_test_case_1, OUT_OF_PLACE, 0);
7700 }
7701
7702 static int
7703 test_verify_auth_zuc_cipher_snow_test_case_1(void)
7704 {
7705         return test_mixed_auth_cipher(
7706                 &auth_zuc_cipher_snow_test_case_1, OUT_OF_PLACE, 1);
7707 }
7708
7709 static int
7710 test_auth_aes_cmac_cipher_snow_test_case_1(void)
7711 {
7712         return test_mixed_auth_cipher(
7713                 &auth_aes_cmac_cipher_snow_test_case_1, OUT_OF_PLACE, 0);
7714 }
7715
7716 static int
7717 test_verify_auth_aes_cmac_cipher_snow_test_case_1(void)
7718 {
7719         return test_mixed_auth_cipher(
7720                 &auth_aes_cmac_cipher_snow_test_case_1, OUT_OF_PLACE, 1);
7721 }
7722
7723 static int
7724 test_auth_zuc_cipher_aes_ctr_test_case_1(void)
7725 {
7726         return test_mixed_auth_cipher(
7727                 &auth_zuc_cipher_aes_ctr_test_case_1, OUT_OF_PLACE, 0);
7728 }
7729
7730 static int
7731 test_verify_auth_zuc_cipher_aes_ctr_test_case_1(void)
7732 {
7733         return test_mixed_auth_cipher(
7734                 &auth_zuc_cipher_aes_ctr_test_case_1, OUT_OF_PLACE, 1);
7735 }
7736
7737 static int
7738 test_auth_snow_cipher_aes_ctr_test_case_1(void)
7739 {
7740         return test_mixed_auth_cipher(
7741                 &auth_snow_cipher_aes_ctr_test_case_1, OUT_OF_PLACE, 0);
7742 }
7743
7744 static int
7745 test_verify_auth_snow_cipher_aes_ctr_test_case_1(void)
7746 {
7747         return test_mixed_auth_cipher(
7748                 &auth_snow_cipher_aes_ctr_test_case_1, OUT_OF_PLACE, 1);
7749 }
7750
7751 static int
7752 test_auth_snow_cipher_zuc_test_case_1(void)
7753 {
7754         return test_mixed_auth_cipher(
7755                 &auth_snow_cipher_zuc_test_case_1, OUT_OF_PLACE, 0);
7756 }
7757
7758 static int
7759 test_verify_auth_snow_cipher_zuc_test_case_1(void)
7760 {
7761         return test_mixed_auth_cipher(
7762                 &auth_snow_cipher_zuc_test_case_1, OUT_OF_PLACE, 1);
7763 }
7764
7765 static int
7766 test_auth_aes_cmac_cipher_zuc_test_case_1(void)
7767 {
7768         return test_mixed_auth_cipher(
7769                 &auth_aes_cmac_cipher_zuc_test_case_1, OUT_OF_PLACE, 0);
7770 }
7771
7772 static int
7773 test_verify_auth_aes_cmac_cipher_zuc_test_case_1(void)
7774 {
7775         return test_mixed_auth_cipher(
7776                 &auth_aes_cmac_cipher_zuc_test_case_1, OUT_OF_PLACE, 1);
7777 }
7778
7779 static int
7780 test_auth_null_cipher_snow_test_case_1(void)
7781 {
7782         return test_mixed_auth_cipher(
7783                 &auth_null_cipher_snow_test_case_1, OUT_OF_PLACE, 0);
7784 }
7785
7786 static int
7787 test_verify_auth_null_cipher_snow_test_case_1(void)
7788 {
7789         return test_mixed_auth_cipher(
7790                 &auth_null_cipher_snow_test_case_1, OUT_OF_PLACE, 1);
7791 }
7792
7793 static int
7794 test_auth_null_cipher_zuc_test_case_1(void)
7795 {
7796         return test_mixed_auth_cipher(
7797                 &auth_null_cipher_zuc_test_case_1, OUT_OF_PLACE, 0);
7798 }
7799
7800 static int
7801 test_verify_auth_null_cipher_zuc_test_case_1(void)
7802 {
7803         return test_mixed_auth_cipher(
7804                 &auth_null_cipher_zuc_test_case_1, OUT_OF_PLACE, 1);
7805 }
7806
7807 static int
7808 test_auth_snow_cipher_null_test_case_1(void)
7809 {
7810         return test_mixed_auth_cipher(
7811                 &auth_snow_cipher_null_test_case_1, OUT_OF_PLACE, 0);
7812 }
7813
7814 static int
7815 test_verify_auth_snow_cipher_null_test_case_1(void)
7816 {
7817         return test_mixed_auth_cipher(
7818                 &auth_snow_cipher_null_test_case_1, OUT_OF_PLACE, 1);
7819 }
7820
7821 static int
7822 test_auth_zuc_cipher_null_test_case_1(void)
7823 {
7824         return test_mixed_auth_cipher(
7825                 &auth_zuc_cipher_null_test_case_1, OUT_OF_PLACE, 0);
7826 }
7827
7828 static int
7829 test_verify_auth_zuc_cipher_null_test_case_1(void)
7830 {
7831         return test_mixed_auth_cipher(
7832                 &auth_zuc_cipher_null_test_case_1, OUT_OF_PLACE, 1);
7833 }
7834
7835 static int
7836 test_auth_null_cipher_aes_ctr_test_case_1(void)
7837 {
7838         return test_mixed_auth_cipher(
7839                 &auth_null_cipher_aes_ctr_test_case_1, OUT_OF_PLACE, 0);
7840 }
7841
7842 static int
7843 test_verify_auth_null_cipher_aes_ctr_test_case_1(void)
7844 {
7845         return test_mixed_auth_cipher(
7846                 &auth_null_cipher_aes_ctr_test_case_1, OUT_OF_PLACE, 1);
7847 }
7848
7849 static int
7850 test_auth_aes_cmac_cipher_null_test_case_1(void)
7851 {
7852         return test_mixed_auth_cipher(
7853                 &auth_aes_cmac_cipher_null_test_case_1, OUT_OF_PLACE, 0);
7854 }
7855
7856 static int
7857 test_verify_auth_aes_cmac_cipher_null_test_case_1(void)
7858 {
7859         return test_mixed_auth_cipher(
7860                 &auth_aes_cmac_cipher_null_test_case_1, OUT_OF_PLACE, 1);
7861 }
7862
7863 /* ***** AEAD algorithm Tests ***** */
7864
7865 static int
7866 create_aead_session(uint8_t dev_id, enum rte_crypto_aead_algorithm algo,
7867                 enum rte_crypto_aead_operation op,
7868                 const uint8_t *key, const uint8_t key_len,
7869                 const uint16_t aad_len, const uint8_t auth_len,
7870                 uint8_t iv_len)
7871 {
7872         uint8_t aead_key[key_len];
7873
7874         struct crypto_testsuite_params *ts_params = &testsuite_params;
7875         struct crypto_unittest_params *ut_params = &unittest_params;
7876
7877         memcpy(aead_key, key, key_len);
7878
7879         /* Setup AEAD Parameters */
7880         ut_params->aead_xform.type = RTE_CRYPTO_SYM_XFORM_AEAD;
7881         ut_params->aead_xform.next = NULL;
7882         ut_params->aead_xform.aead.algo = algo;
7883         ut_params->aead_xform.aead.op = op;
7884         ut_params->aead_xform.aead.key.data = aead_key;
7885         ut_params->aead_xform.aead.key.length = key_len;
7886         ut_params->aead_xform.aead.iv.offset = IV_OFFSET;
7887         ut_params->aead_xform.aead.iv.length = iv_len;
7888         ut_params->aead_xform.aead.digest_length = auth_len;
7889         ut_params->aead_xform.aead.aad_length = aad_len;
7890
7891         debug_hexdump(stdout, "key:", key, key_len);
7892
7893         /* Create Crypto session*/
7894         ut_params->sess = rte_cryptodev_sym_session_create(
7895                         ts_params->session_mpool);
7896
7897         rte_cryptodev_sym_session_init(dev_id, ut_params->sess,
7898                         &ut_params->aead_xform,
7899                         ts_params->session_priv_mpool);
7900
7901         TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed");
7902
7903         return 0;
7904 }
7905
7906 static int
7907 create_aead_xform(struct rte_crypto_op *op,
7908                 enum rte_crypto_aead_algorithm algo,
7909                 enum rte_crypto_aead_operation aead_op,
7910                 uint8_t *key, const uint8_t key_len,
7911                 const uint8_t aad_len, const uint8_t auth_len,
7912                 uint8_t iv_len)
7913 {
7914         TEST_ASSERT_NOT_NULL(rte_crypto_op_sym_xforms_alloc(op, 1),
7915                         "failed to allocate space for crypto transform");
7916
7917         struct rte_crypto_sym_op *sym_op = op->sym;
7918
7919         /* Setup AEAD Parameters */
7920         sym_op->xform->type = RTE_CRYPTO_SYM_XFORM_AEAD;
7921         sym_op->xform->next = NULL;
7922         sym_op->xform->aead.algo = algo;
7923         sym_op->xform->aead.op = aead_op;
7924         sym_op->xform->aead.key.data = key;
7925         sym_op->xform->aead.key.length = key_len;
7926         sym_op->xform->aead.iv.offset = IV_OFFSET;
7927         sym_op->xform->aead.iv.length = iv_len;
7928         sym_op->xform->aead.digest_length = auth_len;
7929         sym_op->xform->aead.aad_length = aad_len;
7930
7931         debug_hexdump(stdout, "key:", key, key_len);
7932
7933         return 0;
7934 }
7935
7936 static int
7937 create_aead_operation(enum rte_crypto_aead_operation op,
7938                 const struct aead_test_data *tdata)
7939 {
7940         struct crypto_testsuite_params *ts_params = &testsuite_params;
7941         struct crypto_unittest_params *ut_params = &unittest_params;
7942
7943         uint8_t *plaintext, *ciphertext;
7944         unsigned int aad_pad_len, plaintext_pad_len;
7945
7946         /* Generate Crypto op data structure */
7947         ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
7948                         RTE_CRYPTO_OP_TYPE_SYMMETRIC);
7949         TEST_ASSERT_NOT_NULL(ut_params->op,
7950                         "Failed to allocate symmetric crypto operation struct");
7951
7952         struct rte_crypto_sym_op *sym_op = ut_params->op->sym;
7953
7954         /* Append aad data */
7955         if (tdata->algo == RTE_CRYPTO_AEAD_AES_CCM) {
7956                 aad_pad_len = RTE_ALIGN_CEIL(tdata->aad.len + 18, 16);
7957                 sym_op->aead.aad.data = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
7958                                 aad_pad_len);
7959                 TEST_ASSERT_NOT_NULL(sym_op->aead.aad.data,
7960                                 "no room to append aad");
7961
7962                 sym_op->aead.aad.phys_addr =
7963                                 rte_pktmbuf_iova(ut_params->ibuf);
7964                 /* Copy AAD 18 bytes after the AAD pointer, according to the API */
7965                 memcpy(sym_op->aead.aad.data + 18, tdata->aad.data, tdata->aad.len);
7966                 debug_hexdump(stdout, "aad:", sym_op->aead.aad.data,
7967                         tdata->aad.len);
7968
7969                 /* Append IV at the end of the crypto operation*/
7970                 uint8_t *iv_ptr = rte_crypto_op_ctod_offset(ut_params->op,
7971                                 uint8_t *, IV_OFFSET);
7972
7973                 /* Copy IV 1 byte after the IV pointer, according to the API */
7974                 rte_memcpy(iv_ptr + 1, tdata->iv.data, tdata->iv.len);
7975                 debug_hexdump(stdout, "iv:", iv_ptr,
7976                         tdata->iv.len);
7977         } else {
7978                 aad_pad_len = RTE_ALIGN_CEIL(tdata->aad.len, 16);
7979                 sym_op->aead.aad.data = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
7980                                 aad_pad_len);
7981                 TEST_ASSERT_NOT_NULL(sym_op->aead.aad.data,
7982                                 "no room to append aad");
7983
7984                 sym_op->aead.aad.phys_addr =
7985                                 rte_pktmbuf_iova(ut_params->ibuf);
7986                 memcpy(sym_op->aead.aad.data, tdata->aad.data, tdata->aad.len);
7987                 debug_hexdump(stdout, "aad:", sym_op->aead.aad.data,
7988                         tdata->aad.len);
7989
7990                 /* Append IV at the end of the crypto operation*/
7991                 uint8_t *iv_ptr = rte_crypto_op_ctod_offset(ut_params->op,
7992                                 uint8_t *, IV_OFFSET);
7993
7994                 if (tdata->iv.len == 0) {
7995                         rte_memcpy(iv_ptr, tdata->iv.data, AES_GCM_J0_LENGTH);
7996                         debug_hexdump(stdout, "iv:", iv_ptr,
7997                                 AES_GCM_J0_LENGTH);
7998                 } else {
7999                         rte_memcpy(iv_ptr, tdata->iv.data, tdata->iv.len);
8000                         debug_hexdump(stdout, "iv:", iv_ptr,
8001                                 tdata->iv.len);
8002                 }
8003         }
8004
8005         /* Append plaintext/ciphertext */
8006         if (op == RTE_CRYPTO_AEAD_OP_ENCRYPT) {
8007                 plaintext_pad_len = RTE_ALIGN_CEIL(tdata->plaintext.len, 16);
8008                 plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
8009                                 plaintext_pad_len);
8010                 TEST_ASSERT_NOT_NULL(plaintext, "no room to append plaintext");
8011
8012                 memcpy(plaintext, tdata->plaintext.data, tdata->plaintext.len);
8013                 debug_hexdump(stdout, "plaintext:", plaintext,
8014                                 tdata->plaintext.len);
8015
8016                 if (ut_params->obuf) {
8017                         ciphertext = (uint8_t *)rte_pktmbuf_append(
8018                                         ut_params->obuf,
8019                                         plaintext_pad_len + aad_pad_len);
8020                         TEST_ASSERT_NOT_NULL(ciphertext,
8021                                         "no room to append ciphertext");
8022
8023                         memset(ciphertext + aad_pad_len, 0,
8024                                         tdata->ciphertext.len);
8025                 }
8026         } else {
8027                 plaintext_pad_len = RTE_ALIGN_CEIL(tdata->ciphertext.len, 16);
8028                 ciphertext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
8029                                 plaintext_pad_len);
8030                 TEST_ASSERT_NOT_NULL(ciphertext,
8031                                 "no room to append ciphertext");
8032
8033                 memcpy(ciphertext, tdata->ciphertext.data,
8034                                 tdata->ciphertext.len);
8035                 debug_hexdump(stdout, "ciphertext:", ciphertext,
8036                                 tdata->ciphertext.len);
8037
8038                 if (ut_params->obuf) {
8039                         plaintext = (uint8_t *)rte_pktmbuf_append(
8040                                         ut_params->obuf,
8041                                         plaintext_pad_len + aad_pad_len);
8042                         TEST_ASSERT_NOT_NULL(plaintext,
8043                                         "no room to append plaintext");
8044
8045                         memset(plaintext + aad_pad_len, 0,
8046                                         tdata->plaintext.len);
8047                 }
8048         }
8049
8050         /* Append digest data */
8051         if (op == RTE_CRYPTO_AEAD_OP_ENCRYPT) {
8052                 sym_op->aead.digest.data = (uint8_t *)rte_pktmbuf_append(
8053                                 ut_params->obuf ? ut_params->obuf :
8054                                                 ut_params->ibuf,
8055                                                 tdata->auth_tag.len);
8056                 TEST_ASSERT_NOT_NULL(sym_op->aead.digest.data,
8057                                 "no room to append digest");
8058                 memset(sym_op->aead.digest.data, 0, tdata->auth_tag.len);
8059                 sym_op->aead.digest.phys_addr = rte_pktmbuf_iova_offset(
8060                                 ut_params->obuf ? ut_params->obuf :
8061                                                 ut_params->ibuf,
8062                                                 plaintext_pad_len +
8063                                                 aad_pad_len);
8064         } else {
8065                 sym_op->aead.digest.data = (uint8_t *)rte_pktmbuf_append(
8066                                 ut_params->ibuf, tdata->auth_tag.len);
8067                 TEST_ASSERT_NOT_NULL(sym_op->aead.digest.data,
8068                                 "no room to append digest");
8069                 sym_op->aead.digest.phys_addr = rte_pktmbuf_iova_offset(
8070                                 ut_params->ibuf,
8071                                 plaintext_pad_len + aad_pad_len);
8072
8073                 rte_memcpy(sym_op->aead.digest.data, tdata->auth_tag.data,
8074                         tdata->auth_tag.len);
8075                 debug_hexdump(stdout, "digest:",
8076                         sym_op->aead.digest.data,
8077                         tdata->auth_tag.len);
8078         }
8079
8080         sym_op->aead.data.length = tdata->plaintext.len;
8081         sym_op->aead.data.offset = aad_pad_len;
8082
8083         return 0;
8084 }
8085
8086 static int
8087 test_authenticated_encryption(const struct aead_test_data *tdata)
8088 {
8089         struct crypto_testsuite_params *ts_params = &testsuite_params;
8090         struct crypto_unittest_params *ut_params = &unittest_params;
8091
8092         int retval;
8093         uint8_t *ciphertext, *auth_tag;
8094         uint16_t plaintext_pad_len;
8095         uint32_t i;
8096         struct rte_cryptodev_info dev_info;
8097
8098         rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
8099         uint64_t feat_flags = dev_info.feature_flags;
8100
8101         if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
8102                         (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
8103                 printf("Device doesn't support RAW data-path APIs.\n");
8104                 return TEST_SKIPPED;
8105         }
8106
8107         /* Verify the capabilities */
8108         struct rte_cryptodev_sym_capability_idx cap_idx;
8109         const struct rte_cryptodev_symmetric_capability *capability;
8110         cap_idx.type = RTE_CRYPTO_SYM_XFORM_AEAD;
8111         cap_idx.algo.aead = tdata->algo;
8112         capability = rte_cryptodev_sym_capability_get(
8113                         ts_params->valid_devs[0], &cap_idx);
8114         if (capability == NULL)
8115                 return TEST_SKIPPED;
8116         if (rte_cryptodev_sym_capability_check_aead(
8117                         capability, tdata->key.len, tdata->auth_tag.len,
8118                         tdata->aad.len, tdata->iv.len))
8119                 return TEST_SKIPPED;
8120
8121         /* Create AEAD session */
8122         retval = create_aead_session(ts_params->valid_devs[0],
8123                         tdata->algo,
8124                         RTE_CRYPTO_AEAD_OP_ENCRYPT,
8125                         tdata->key.data, tdata->key.len,
8126                         tdata->aad.len, tdata->auth_tag.len,
8127                         tdata->iv.len);
8128         if (retval < 0)
8129                 return retval;
8130
8131         if (tdata->aad.len > MBUF_SIZE) {
8132                 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->large_mbuf_pool);
8133                 /* Populate full size of add data */
8134                 for (i = 32; i < MAX_AAD_LENGTH; i += 32)
8135                         memcpy(&tdata->aad.data[i], &tdata->aad.data[0], 32);
8136         } else
8137                 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
8138
8139         /* clear mbuf payload */
8140         memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
8141                         rte_pktmbuf_tailroom(ut_params->ibuf));
8142
8143         /* Create AEAD operation */
8144         retval = create_aead_operation(RTE_CRYPTO_AEAD_OP_ENCRYPT, tdata);
8145         if (retval < 0)
8146                 return retval;
8147
8148         rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
8149
8150         ut_params->op->sym->m_src = ut_params->ibuf;
8151
8152         /* Process crypto operation */
8153         if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
8154                 process_cpu_aead_op(ts_params->valid_devs[0], ut_params->op);
8155         else if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
8156                 process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
8157                                 ut_params->op, 0, 0, 0, 0);
8158         else
8159                 TEST_ASSERT_NOT_NULL(
8160                         process_crypto_request(ts_params->valid_devs[0],
8161                         ut_params->op), "failed to process sym crypto op");
8162
8163         TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
8164                         "crypto op processing failed");
8165
8166         plaintext_pad_len = RTE_ALIGN_CEIL(tdata->plaintext.len, 16);
8167
8168         if (ut_params->op->sym->m_dst) {
8169                 ciphertext = rte_pktmbuf_mtod(ut_params->op->sym->m_dst,
8170                                 uint8_t *);
8171                 auth_tag = rte_pktmbuf_mtod_offset(ut_params->op->sym->m_dst,
8172                                 uint8_t *, plaintext_pad_len);
8173         } else {
8174                 ciphertext = rte_pktmbuf_mtod_offset(ut_params->op->sym->m_src,
8175                                 uint8_t *,
8176                                 ut_params->op->sym->cipher.data.offset);
8177                 auth_tag = ciphertext + plaintext_pad_len;
8178         }
8179
8180         debug_hexdump(stdout, "ciphertext:", ciphertext, tdata->ciphertext.len);
8181         debug_hexdump(stdout, "auth tag:", auth_tag, tdata->auth_tag.len);
8182
8183         /* Validate obuf */
8184         TEST_ASSERT_BUFFERS_ARE_EQUAL(
8185                         ciphertext,
8186                         tdata->ciphertext.data,
8187                         tdata->ciphertext.len,
8188                         "Ciphertext data not as expected");
8189
8190         TEST_ASSERT_BUFFERS_ARE_EQUAL(
8191                         auth_tag,
8192                         tdata->auth_tag.data,
8193                         tdata->auth_tag.len,
8194                         "Generated auth tag not as expected");
8195
8196         return 0;
8197
8198 }
8199
8200 #ifdef RTE_LIB_SECURITY
8201 static int
8202 security_proto_supported(enum rte_security_session_action_type action,
8203         enum rte_security_session_protocol proto)
8204 {
8205         struct crypto_testsuite_params *ts_params = &testsuite_params;
8206
8207         const struct rte_security_capability *capabilities;
8208         const struct rte_security_capability *capability;
8209         uint16_t i = 0;
8210
8211         struct rte_security_ctx *ctx = (struct rte_security_ctx *)
8212                                 rte_cryptodev_get_sec_ctx(
8213                                 ts_params->valid_devs[0]);
8214
8215
8216         capabilities = rte_security_capabilities_get(ctx);
8217
8218         if (capabilities == NULL)
8219                 return -ENOTSUP;
8220
8221         while ((capability = &capabilities[i++])->action !=
8222                         RTE_SECURITY_ACTION_TYPE_NONE) {
8223                 if (capability->action == action &&
8224                                 capability->protocol == proto)
8225                         return 0;
8226         }
8227
8228         return -ENOTSUP;
8229 }
8230
8231 /* Basic algorithm run function for async inplace mode.
8232  * Creates a session from input parameters and runs one operation
8233  * on input_vec. Checks the output of the crypto operation against
8234  * output_vec.
8235  */
8236 static int test_pdcp_proto(int i, int oop, enum rte_crypto_cipher_operation opc,
8237                            enum rte_crypto_auth_operation opa,
8238                            const uint8_t *input_vec, unsigned int input_vec_len,
8239                            const uint8_t *output_vec,
8240                            unsigned int output_vec_len,
8241                            enum rte_crypto_cipher_algorithm cipher_alg,
8242                            const uint8_t *cipher_key, uint32_t cipher_key_len,
8243                            enum rte_crypto_auth_algorithm auth_alg,
8244                            const uint8_t *auth_key, uint32_t auth_key_len,
8245                            uint8_t bearer, enum rte_security_pdcp_domain domain,
8246                            uint8_t packet_direction, uint8_t sn_size,
8247                            uint32_t hfn, uint32_t hfn_threshold, uint8_t sdap)
8248 {
8249         struct crypto_testsuite_params *ts_params = &testsuite_params;
8250         struct crypto_unittest_params *ut_params = &unittest_params;
8251         uint8_t *plaintext;
8252         int ret = TEST_SUCCESS;
8253         struct rte_security_ctx *ctx = (struct rte_security_ctx *)
8254                                 rte_cryptodev_get_sec_ctx(
8255                                 ts_params->valid_devs[0]);
8256
8257         /* Verify the capabilities */
8258         struct rte_security_capability_idx sec_cap_idx;
8259
8260         sec_cap_idx.action = ut_params->type;
8261         sec_cap_idx.protocol = RTE_SECURITY_PROTOCOL_PDCP;
8262         sec_cap_idx.pdcp.domain = domain;
8263         if (rte_security_capability_get(ctx, &sec_cap_idx) == NULL)
8264                 return TEST_SKIPPED;
8265
8266         /* Generate test mbuf data */
8267         ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
8268
8269         /* clear mbuf payload */
8270         memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
8271                         rte_pktmbuf_tailroom(ut_params->ibuf));
8272
8273         plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
8274                                                   input_vec_len);
8275         memcpy(plaintext, input_vec, input_vec_len);
8276
8277         /* Out of place support */
8278         if (oop) {
8279                 /*
8280                  * For out-op-place we need to alloc another mbuf
8281                  */
8282                 ut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
8283                 rte_pktmbuf_append(ut_params->obuf, output_vec_len);
8284         }
8285
8286         /* Setup Cipher Parameters */
8287         ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
8288         ut_params->cipher_xform.cipher.algo = cipher_alg;
8289         ut_params->cipher_xform.cipher.op = opc;
8290         ut_params->cipher_xform.cipher.key.data = cipher_key;
8291         ut_params->cipher_xform.cipher.key.length = cipher_key_len;
8292         ut_params->cipher_xform.cipher.iv.length =
8293                                 packet_direction ? 4 : 0;
8294         ut_params->cipher_xform.cipher.iv.offset = IV_OFFSET;
8295
8296         /* Setup HMAC Parameters if ICV header is required */
8297         if (auth_alg != 0) {
8298                 ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;
8299                 ut_params->auth_xform.next = NULL;
8300                 ut_params->auth_xform.auth.algo = auth_alg;
8301                 ut_params->auth_xform.auth.op = opa;
8302                 ut_params->auth_xform.auth.key.data = auth_key;
8303                 ut_params->auth_xform.auth.key.length = auth_key_len;
8304
8305                 ut_params->cipher_xform.next = &ut_params->auth_xform;
8306         } else {
8307                 ut_params->cipher_xform.next = NULL;
8308         }
8309
8310         struct rte_security_session_conf sess_conf = {
8311                 .action_type = ut_params->type,
8312                 .protocol = RTE_SECURITY_PROTOCOL_PDCP,
8313                 {.pdcp = {
8314                         .bearer = bearer,
8315                         .domain = domain,
8316                         .pkt_dir = packet_direction,
8317                         .sn_size = sn_size,
8318                         .hfn = packet_direction ? 0 : hfn,
8319                         /**
8320                          * hfn can be set as pdcp_test_hfn[i]
8321                          * if hfn_ovrd is not set. Here, PDCP
8322                          * packet direction is just used to
8323                          * run half of the cases with session
8324                          * HFN and other half with per packet
8325                          * HFN.
8326                          */
8327                         .hfn_threshold = hfn_threshold,
8328                         .hfn_ovrd = packet_direction ? 1 : 0,
8329                         .sdap_enabled = sdap,
8330                 } },
8331                 .crypto_xform = &ut_params->cipher_xform
8332         };
8333
8334         /* Create security session */
8335         ut_params->sec_session = rte_security_session_create(ctx,
8336                                 &sess_conf, ts_params->session_mpool,
8337                                 ts_params->session_priv_mpool);
8338
8339         if (!ut_params->sec_session) {
8340                 printf("TestCase %s()-%d line %d failed %s: ",
8341                         __func__, i, __LINE__, "Failed to allocate session");
8342                 ret = TEST_FAILED;
8343                 goto on_err;
8344         }
8345
8346         /* Generate crypto op data structure */
8347         ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
8348                         RTE_CRYPTO_OP_TYPE_SYMMETRIC);
8349         if (!ut_params->op) {
8350                 printf("TestCase %s()-%d line %d failed %s: ",
8351                         __func__, i, __LINE__,
8352                         "Failed to allocate symmetric crypto operation struct");
8353                 ret = TEST_FAILED;
8354                 goto on_err;
8355         }
8356
8357         uint32_t *per_pkt_hfn = rte_crypto_op_ctod_offset(ut_params->op,
8358                                         uint32_t *, IV_OFFSET);
8359         *per_pkt_hfn = packet_direction ? hfn : 0;
8360
8361         rte_security_attach_session(ut_params->op, ut_params->sec_session);
8362
8363         /* set crypto operation source mbuf */
8364         ut_params->op->sym->m_src = ut_params->ibuf;
8365         if (oop)
8366                 ut_params->op->sym->m_dst = ut_params->obuf;
8367
8368         /* Process crypto operation */
8369         if (process_crypto_request(ts_params->valid_devs[0], ut_params->op)
8370                 == NULL) {
8371                 printf("TestCase %s()-%d line %d failed %s: ",
8372                         __func__, i, __LINE__,
8373                         "failed to process sym crypto op");
8374                 ret = TEST_FAILED;
8375                 goto on_err;
8376         }
8377
8378         if (ut_params->op->status != RTE_CRYPTO_OP_STATUS_SUCCESS) {
8379                 printf("TestCase %s()-%d line %d failed %s: ",
8380                         __func__, i, __LINE__, "crypto op processing failed");
8381                 ret = TEST_FAILED;
8382                 goto on_err;
8383         }
8384
8385         /* Validate obuf */
8386         uint8_t *ciphertext = rte_pktmbuf_mtod(ut_params->op->sym->m_src,
8387                         uint8_t *);
8388         if (oop) {
8389                 ciphertext = rte_pktmbuf_mtod(ut_params->op->sym->m_dst,
8390                                 uint8_t *);
8391         }
8392
8393         if (memcmp(ciphertext, output_vec, output_vec_len)) {
8394                 printf("\n=======PDCP TestCase #%d failed: Data Mismatch ", i);
8395                 rte_hexdump(stdout, "encrypted", ciphertext, output_vec_len);
8396                 rte_hexdump(stdout, "reference", output_vec, output_vec_len);
8397                 ret = TEST_FAILED;
8398                 goto on_err;
8399         }
8400
8401 on_err:
8402         rte_crypto_op_free(ut_params->op);
8403         ut_params->op = NULL;
8404
8405         if (ut_params->sec_session)
8406                 rte_security_session_destroy(ctx, ut_params->sec_session);
8407         ut_params->sec_session = NULL;
8408
8409         rte_pktmbuf_free(ut_params->ibuf);
8410         ut_params->ibuf = NULL;
8411         if (oop) {
8412                 rte_pktmbuf_free(ut_params->obuf);
8413                 ut_params->obuf = NULL;
8414         }
8415
8416         return ret;
8417 }
8418
8419 static int
8420 test_pdcp_proto_SGL(int i, int oop,
8421         enum rte_crypto_cipher_operation opc,
8422         enum rte_crypto_auth_operation opa,
8423         uint8_t *input_vec,
8424         unsigned int input_vec_len,
8425         uint8_t *output_vec,
8426         unsigned int output_vec_len,
8427         uint32_t fragsz,
8428         uint32_t fragsz_oop)
8429 {
8430         struct crypto_testsuite_params *ts_params = &testsuite_params;
8431         struct crypto_unittest_params *ut_params = &unittest_params;
8432         uint8_t *plaintext;
8433         struct rte_mbuf *buf, *buf_oop = NULL;
8434         int ret = TEST_SUCCESS;
8435         int to_trn = 0;
8436         int to_trn_tbl[16];
8437         int segs = 1;
8438         unsigned int trn_data = 0;
8439         struct rte_cryptodev_info dev_info;
8440         uint64_t feat_flags;
8441         struct rte_security_ctx *ctx = (struct rte_security_ctx *)
8442                                 rte_cryptodev_get_sec_ctx(
8443                                 ts_params->valid_devs[0]);
8444         struct rte_mbuf *temp_mbuf;
8445
8446         rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
8447         feat_flags = dev_info.feature_flags;
8448
8449         if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
8450                         (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
8451                 printf("Device does not support RAW data-path APIs.\n");
8452                 return -ENOTSUP;
8453         }
8454         /* Verify the capabilities */
8455         struct rte_security_capability_idx sec_cap_idx;
8456
8457         sec_cap_idx.action = ut_params->type;
8458         sec_cap_idx.protocol = RTE_SECURITY_PROTOCOL_PDCP;
8459         sec_cap_idx.pdcp.domain = pdcp_test_params[i].domain;
8460         if (rte_security_capability_get(ctx, &sec_cap_idx) == NULL)
8461                 return TEST_SKIPPED;
8462
8463         if (fragsz > input_vec_len)
8464                 fragsz = input_vec_len;
8465
8466         uint16_t plaintext_len = fragsz;
8467         uint16_t frag_size_oop = fragsz_oop ? fragsz_oop : fragsz;
8468
8469         if (fragsz_oop > output_vec_len)
8470                 frag_size_oop = output_vec_len;
8471
8472         int ecx = 0;
8473         if (input_vec_len % fragsz != 0) {
8474                 if (input_vec_len / fragsz + 1 > 16)
8475                         return 1;
8476         } else if (input_vec_len / fragsz > 16)
8477                 return 1;
8478
8479         /* Out of place support */
8480         if (oop) {
8481                 /*
8482                  * For out-op-place we need to alloc another mbuf
8483                  */
8484                 ut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
8485                 rte_pktmbuf_append(ut_params->obuf, frag_size_oop);
8486                 buf_oop = ut_params->obuf;
8487         }
8488
8489         /* Generate test mbuf data */
8490         ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
8491
8492         /* clear mbuf payload */
8493         memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
8494                         rte_pktmbuf_tailroom(ut_params->ibuf));
8495
8496         plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
8497                                                   plaintext_len);
8498         memcpy(plaintext, input_vec, plaintext_len);
8499         trn_data += plaintext_len;
8500
8501         buf = ut_params->ibuf;
8502
8503         /*
8504          * Loop until no more fragments
8505          */
8506
8507         while (trn_data < input_vec_len) {
8508                 ++segs;
8509                 to_trn = (input_vec_len - trn_data < fragsz) ?
8510                                 (input_vec_len - trn_data) : fragsz;
8511
8512                 to_trn_tbl[ecx++] = to_trn;
8513
8514                 buf->next = rte_pktmbuf_alloc(ts_params->mbuf_pool);
8515                 buf = buf->next;
8516
8517                 memset(rte_pktmbuf_mtod(buf, uint8_t *), 0,
8518                                 rte_pktmbuf_tailroom(buf));
8519
8520                 /* OOP */
8521                 if (oop && !fragsz_oop) {
8522                         buf_oop->next =
8523                                         rte_pktmbuf_alloc(ts_params->mbuf_pool);
8524                         buf_oop = buf_oop->next;
8525                         memset(rte_pktmbuf_mtod(buf_oop, uint8_t *),
8526                                         0, rte_pktmbuf_tailroom(buf_oop));
8527                         rte_pktmbuf_append(buf_oop, to_trn);
8528                 }
8529
8530                 plaintext = (uint8_t *)rte_pktmbuf_append(buf,
8531                                 to_trn);
8532
8533                 memcpy(plaintext, input_vec + trn_data, to_trn);
8534                 trn_data += to_trn;
8535         }
8536
8537         ut_params->ibuf->nb_segs = segs;
8538
8539         segs = 1;
8540         if (fragsz_oop && oop) {
8541                 to_trn = 0;
8542                 ecx = 0;
8543
8544                 trn_data = frag_size_oop;
8545                 while (trn_data < output_vec_len) {
8546                         ++segs;
8547                         to_trn =
8548                                 (output_vec_len - trn_data <
8549                                                 frag_size_oop) ?
8550                                 (output_vec_len - trn_data) :
8551                                                 frag_size_oop;
8552
8553                         to_trn_tbl[ecx++] = to_trn;
8554
8555                         buf_oop->next =
8556                                 rte_pktmbuf_alloc(ts_params->mbuf_pool);
8557                         buf_oop = buf_oop->next;
8558                         memset(rte_pktmbuf_mtod(buf_oop, uint8_t *),
8559                                         0, rte_pktmbuf_tailroom(buf_oop));
8560                         rte_pktmbuf_append(buf_oop, to_trn);
8561
8562                         trn_data += to_trn;
8563                 }
8564                 ut_params->obuf->nb_segs = segs;
8565         }
8566
8567         /* Setup Cipher Parameters */
8568         ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
8569         ut_params->cipher_xform.cipher.algo = pdcp_test_params[i].cipher_alg;
8570         ut_params->cipher_xform.cipher.op = opc;
8571         ut_params->cipher_xform.cipher.key.data = pdcp_test_crypto_key[i];
8572         ut_params->cipher_xform.cipher.key.length =
8573                                         pdcp_test_params[i].cipher_key_len;
8574         ut_params->cipher_xform.cipher.iv.length = 0;
8575
8576         /* Setup HMAC Parameters if ICV header is required */
8577         if (pdcp_test_params[i].auth_alg != 0) {
8578                 ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;
8579                 ut_params->auth_xform.next = NULL;
8580                 ut_params->auth_xform.auth.algo = pdcp_test_params[i].auth_alg;
8581                 ut_params->auth_xform.auth.op = opa;
8582                 ut_params->auth_xform.auth.key.data = pdcp_test_auth_key[i];
8583                 ut_params->auth_xform.auth.key.length =
8584                                         pdcp_test_params[i].auth_key_len;
8585
8586                 ut_params->cipher_xform.next = &ut_params->auth_xform;
8587         } else {
8588                 ut_params->cipher_xform.next = NULL;
8589         }
8590
8591         struct rte_security_session_conf sess_conf = {
8592                 .action_type = ut_params->type,
8593                 .protocol = RTE_SECURITY_PROTOCOL_PDCP,
8594                 {.pdcp = {
8595                         .bearer = pdcp_test_bearer[i],
8596                         .domain = pdcp_test_params[i].domain,
8597                         .pkt_dir = pdcp_test_packet_direction[i],
8598                         .sn_size = pdcp_test_data_sn_size[i],
8599                         .hfn = pdcp_test_hfn[i],
8600                         .hfn_threshold = pdcp_test_hfn_threshold[i],
8601                         .hfn_ovrd = 0,
8602                 } },
8603                 .crypto_xform = &ut_params->cipher_xform
8604         };
8605
8606         /* Create security session */
8607         ut_params->sec_session = rte_security_session_create(ctx,
8608                                 &sess_conf, ts_params->session_mpool,
8609                                 ts_params->session_priv_mpool);
8610
8611         if (!ut_params->sec_session) {
8612                 printf("TestCase %s()-%d line %d failed %s: ",
8613                         __func__, i, __LINE__, "Failed to allocate session");
8614                 ret = TEST_FAILED;
8615                 goto on_err;
8616         }
8617
8618         /* Generate crypto op data structure */
8619         ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
8620                         RTE_CRYPTO_OP_TYPE_SYMMETRIC);
8621         if (!ut_params->op) {
8622                 printf("TestCase %s()-%d line %d failed %s: ",
8623                         __func__, i, __LINE__,
8624                         "Failed to allocate symmetric crypto operation struct");
8625                 ret = TEST_FAILED;
8626                 goto on_err;
8627         }
8628
8629         rte_security_attach_session(ut_params->op, ut_params->sec_session);
8630
8631         /* set crypto operation source mbuf */
8632         ut_params->op->sym->m_src = ut_params->ibuf;
8633         if (oop)
8634                 ut_params->op->sym->m_dst = ut_params->obuf;
8635
8636         /* Process crypto operation */
8637         temp_mbuf = ut_params->op->sym->m_src;
8638         if (global_api_test_type == CRYPTODEV_RAW_API_TEST) {
8639                 /* filling lengths */
8640                 while (temp_mbuf) {
8641                         ut_params->op->sym->cipher.data.length
8642                                 += temp_mbuf->pkt_len;
8643                         ut_params->op->sym->auth.data.length
8644                                 += temp_mbuf->pkt_len;
8645                         temp_mbuf = temp_mbuf->next;
8646                 }
8647                 process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
8648                         ut_params->op, 1, 1, 0, 0);
8649         } else {
8650                 ut_params->op = process_crypto_request(ts_params->valid_devs[0],
8651                                                         ut_params->op);
8652         }
8653         if (ut_params->op == NULL) {
8654                 printf("TestCase %s()-%d line %d failed %s: ",
8655                         __func__, i, __LINE__,
8656                         "failed to process sym crypto op");
8657                 ret = TEST_FAILED;
8658                 goto on_err;
8659         }
8660
8661         if (ut_params->op->status != RTE_CRYPTO_OP_STATUS_SUCCESS) {
8662                 printf("TestCase %s()-%d line %d failed %s: ",
8663                         __func__, i, __LINE__, "crypto op processing failed");
8664                 ret = TEST_FAILED;
8665                 goto on_err;
8666         }
8667
8668         /* Validate obuf */
8669         uint8_t *ciphertext = rte_pktmbuf_mtod(ut_params->op->sym->m_src,
8670                         uint8_t *);
8671         if (oop) {
8672                 ciphertext = rte_pktmbuf_mtod(ut_params->op->sym->m_dst,
8673                                 uint8_t *);
8674         }
8675         if (fragsz_oop)
8676                 fragsz = frag_size_oop;
8677         if (memcmp(ciphertext, output_vec, fragsz)) {
8678                 printf("\n=======PDCP TestCase #%d failed: Data Mismatch ", i);
8679                 rte_hexdump(stdout, "encrypted", ciphertext, fragsz);
8680                 rte_hexdump(stdout, "reference", output_vec, fragsz);
8681                 ret = TEST_FAILED;
8682                 goto on_err;
8683         }
8684
8685         buf = ut_params->op->sym->m_src->next;
8686         if (oop)
8687                 buf = ut_params->op->sym->m_dst->next;
8688
8689         unsigned int off = fragsz;
8690
8691         ecx = 0;
8692         while (buf) {
8693                 ciphertext = rte_pktmbuf_mtod(buf,
8694                                 uint8_t *);
8695                 if (memcmp(ciphertext, output_vec + off, to_trn_tbl[ecx])) {
8696                         printf("\n=======PDCP TestCase #%d failed: Data Mismatch ", i);
8697                         rte_hexdump(stdout, "encrypted", ciphertext, to_trn_tbl[ecx]);
8698                         rte_hexdump(stdout, "reference", output_vec + off,
8699                                         to_trn_tbl[ecx]);
8700                         ret = TEST_FAILED;
8701                         goto on_err;
8702                 }
8703                 off += to_trn_tbl[ecx++];
8704                 buf = buf->next;
8705         }
8706 on_err:
8707         rte_crypto_op_free(ut_params->op);
8708         ut_params->op = NULL;
8709
8710         if (ut_params->sec_session)
8711                 rte_security_session_destroy(ctx, ut_params->sec_session);
8712         ut_params->sec_session = NULL;
8713
8714         rte_pktmbuf_free(ut_params->ibuf);
8715         ut_params->ibuf = NULL;
8716         if (oop) {
8717                 rte_pktmbuf_free(ut_params->obuf);
8718                 ut_params->obuf = NULL;
8719         }
8720
8721         return ret;
8722 }
8723
8724 int
8725 test_pdcp_proto_cplane_encap(int i)
8726 {
8727         return test_pdcp_proto(
8728                 i, 0, RTE_CRYPTO_CIPHER_OP_ENCRYPT, RTE_CRYPTO_AUTH_OP_GENERATE,
8729                 pdcp_test_data_in[i], pdcp_test_data_in_len[i],
8730                 pdcp_test_data_out[i], pdcp_test_data_in_len[i] + 4,
8731                 pdcp_test_params[i].cipher_alg, pdcp_test_crypto_key[i],
8732                 pdcp_test_params[i].cipher_key_len,
8733                 pdcp_test_params[i].auth_alg, pdcp_test_auth_key[i],
8734                 pdcp_test_params[i].auth_key_len, pdcp_test_bearer[i],
8735                 pdcp_test_params[i].domain, pdcp_test_packet_direction[i],
8736                 pdcp_test_data_sn_size[i], pdcp_test_hfn[i],
8737                 pdcp_test_hfn_threshold[i], SDAP_DISABLED);
8738 }
8739
8740 int
8741 test_pdcp_proto_uplane_encap(int i)
8742 {
8743         return test_pdcp_proto(
8744                 i, 0, RTE_CRYPTO_CIPHER_OP_ENCRYPT, RTE_CRYPTO_AUTH_OP_GENERATE,
8745                 pdcp_test_data_in[i], pdcp_test_data_in_len[i],
8746                 pdcp_test_data_out[i], pdcp_test_data_in_len[i],
8747                 pdcp_test_params[i].cipher_alg, pdcp_test_crypto_key[i],
8748                 pdcp_test_params[i].cipher_key_len,
8749                 pdcp_test_params[i].auth_alg, pdcp_test_auth_key[i],
8750                 pdcp_test_params[i].auth_key_len, pdcp_test_bearer[i],
8751                 pdcp_test_params[i].domain, pdcp_test_packet_direction[i],
8752                 pdcp_test_data_sn_size[i], pdcp_test_hfn[i],
8753                 pdcp_test_hfn_threshold[i], SDAP_DISABLED);
8754 }
8755
8756 int
8757 test_pdcp_proto_uplane_encap_with_int(int i)
8758 {
8759         return test_pdcp_proto(
8760                 i, 0, RTE_CRYPTO_CIPHER_OP_ENCRYPT, RTE_CRYPTO_AUTH_OP_GENERATE,
8761                 pdcp_test_data_in[i], pdcp_test_data_in_len[i],
8762                 pdcp_test_data_out[i], pdcp_test_data_in_len[i] + 4,
8763                 pdcp_test_params[i].cipher_alg, pdcp_test_crypto_key[i],
8764                 pdcp_test_params[i].cipher_key_len,
8765                 pdcp_test_params[i].auth_alg, pdcp_test_auth_key[i],
8766                 pdcp_test_params[i].auth_key_len, pdcp_test_bearer[i],
8767                 pdcp_test_params[i].domain, pdcp_test_packet_direction[i],
8768                 pdcp_test_data_sn_size[i], pdcp_test_hfn[i],
8769                 pdcp_test_hfn_threshold[i], SDAP_DISABLED);
8770 }
8771
8772 int
8773 test_pdcp_proto_cplane_decap(int i)
8774 {
8775         return test_pdcp_proto(
8776                 i, 0, RTE_CRYPTO_CIPHER_OP_DECRYPT, RTE_CRYPTO_AUTH_OP_VERIFY,
8777                 pdcp_test_data_out[i], pdcp_test_data_in_len[i] + 4,
8778                 pdcp_test_data_in[i], pdcp_test_data_in_len[i],
8779                 pdcp_test_params[i].cipher_alg, pdcp_test_crypto_key[i],
8780                 pdcp_test_params[i].cipher_key_len,
8781                 pdcp_test_params[i].auth_alg, pdcp_test_auth_key[i],
8782                 pdcp_test_params[i].auth_key_len, pdcp_test_bearer[i],
8783                 pdcp_test_params[i].domain, pdcp_test_packet_direction[i],
8784                 pdcp_test_data_sn_size[i], pdcp_test_hfn[i],
8785                 pdcp_test_hfn_threshold[i], SDAP_DISABLED);
8786 }
8787
8788 int
8789 test_pdcp_proto_uplane_decap(int i)
8790 {
8791         return test_pdcp_proto(
8792                 i, 0, RTE_CRYPTO_CIPHER_OP_DECRYPT, RTE_CRYPTO_AUTH_OP_VERIFY,
8793                 pdcp_test_data_out[i], pdcp_test_data_in_len[i],
8794                 pdcp_test_data_in[i], pdcp_test_data_in_len[i],
8795                 pdcp_test_params[i].cipher_alg, pdcp_test_crypto_key[i],
8796                 pdcp_test_params[i].cipher_key_len,
8797                 pdcp_test_params[i].auth_alg, pdcp_test_auth_key[i],
8798                 pdcp_test_params[i].auth_key_len, pdcp_test_bearer[i],
8799                 pdcp_test_params[i].domain, pdcp_test_packet_direction[i],
8800                 pdcp_test_data_sn_size[i], pdcp_test_hfn[i],
8801                 pdcp_test_hfn_threshold[i], SDAP_DISABLED);
8802 }
8803
8804 int
8805 test_pdcp_proto_uplane_decap_with_int(int i)
8806 {
8807         return test_pdcp_proto(
8808                 i, 0, RTE_CRYPTO_CIPHER_OP_DECRYPT, RTE_CRYPTO_AUTH_OP_VERIFY,
8809                 pdcp_test_data_out[i], pdcp_test_data_in_len[i] + 4,
8810                 pdcp_test_data_in[i], pdcp_test_data_in_len[i],
8811                 pdcp_test_params[i].cipher_alg, pdcp_test_crypto_key[i],
8812                 pdcp_test_params[i].cipher_key_len,
8813                 pdcp_test_params[i].auth_alg, pdcp_test_auth_key[i],
8814                 pdcp_test_params[i].auth_key_len, pdcp_test_bearer[i],
8815                 pdcp_test_params[i].domain, pdcp_test_packet_direction[i],
8816                 pdcp_test_data_sn_size[i], pdcp_test_hfn[i],
8817                 pdcp_test_hfn_threshold[i], SDAP_DISABLED);
8818 }
8819
8820 static int
8821 test_PDCP_PROTO_SGL_in_place_32B(void)
8822 {
8823         /* i can be used for running any PDCP case
8824          * In this case it is uplane 12-bit AES-SNOW DL encap
8825          */
8826         int i = PDCP_UPLANE_12BIT_OFFSET + AES_ENC + SNOW_AUTH + DOWNLINK;
8827         return test_pdcp_proto_SGL(i, IN_PLACE,
8828                         RTE_CRYPTO_CIPHER_OP_ENCRYPT,
8829                         RTE_CRYPTO_AUTH_OP_GENERATE,
8830                         pdcp_test_data_in[i],
8831                         pdcp_test_data_in_len[i],
8832                         pdcp_test_data_out[i],
8833                         pdcp_test_data_in_len[i]+4,
8834                         32, 0);
8835 }
8836 static int
8837 test_PDCP_PROTO_SGL_oop_32B_128B(void)
8838 {
8839         /* i can be used for running any PDCP case
8840          * In this case it is uplane 18-bit NULL-NULL DL encap
8841          */
8842         int i = PDCP_UPLANE_18BIT_OFFSET + NULL_ENC + NULL_AUTH + DOWNLINK;
8843         return test_pdcp_proto_SGL(i, OUT_OF_PLACE,
8844                         RTE_CRYPTO_CIPHER_OP_ENCRYPT,
8845                         RTE_CRYPTO_AUTH_OP_GENERATE,
8846                         pdcp_test_data_in[i],
8847                         pdcp_test_data_in_len[i],
8848                         pdcp_test_data_out[i],
8849                         pdcp_test_data_in_len[i]+4,
8850                         32, 128);
8851 }
8852 static int
8853 test_PDCP_PROTO_SGL_oop_32B_40B(void)
8854 {
8855         /* i can be used for running any PDCP case
8856          * In this case it is uplane 18-bit AES DL encap
8857          */
8858         int i = PDCP_UPLANE_OFFSET + AES_ENC + EIGHTEEN_BIT_SEQ_NUM_OFFSET
8859                         + DOWNLINK;
8860         return test_pdcp_proto_SGL(i, OUT_OF_PLACE,
8861                         RTE_CRYPTO_CIPHER_OP_ENCRYPT,
8862                         RTE_CRYPTO_AUTH_OP_GENERATE,
8863                         pdcp_test_data_in[i],
8864                         pdcp_test_data_in_len[i],
8865                         pdcp_test_data_out[i],
8866                         pdcp_test_data_in_len[i],
8867                         32, 40);
8868 }
8869 static int
8870 test_PDCP_PROTO_SGL_oop_128B_32B(void)
8871 {
8872         /* i can be used for running any PDCP case
8873          * In this case it is cplane 12-bit AES-ZUC DL encap
8874          */
8875         int i = PDCP_CPLANE_LONG_SN_OFFSET + AES_ENC + ZUC_AUTH + DOWNLINK;
8876         return test_pdcp_proto_SGL(i, OUT_OF_PLACE,
8877                         RTE_CRYPTO_CIPHER_OP_ENCRYPT,
8878                         RTE_CRYPTO_AUTH_OP_GENERATE,
8879                         pdcp_test_data_in[i],
8880                         pdcp_test_data_in_len[i],
8881                         pdcp_test_data_out[i],
8882                         pdcp_test_data_in_len[i]+4,
8883                         128, 32);
8884 }
8885
8886 static int
8887 test_PDCP_SDAP_PROTO_encap_all(void)
8888 {
8889         int i = 0, size = 0;
8890         int err, all_err = TEST_SUCCESS;
8891         const struct pdcp_sdap_test *cur_test;
8892
8893         size = RTE_DIM(list_pdcp_sdap_tests);
8894
8895         for (i = 0; i < size; i++) {
8896                 cur_test = &list_pdcp_sdap_tests[i];
8897                 err = test_pdcp_proto(
8898                         i, 0, RTE_CRYPTO_CIPHER_OP_ENCRYPT,
8899                         RTE_CRYPTO_AUTH_OP_GENERATE, cur_test->data_in,
8900                         cur_test->in_len, cur_test->data_out,
8901                         cur_test->in_len + ((cur_test->auth_key) ? 4 : 0),
8902                         cur_test->param.cipher_alg, cur_test->cipher_key,
8903                         cur_test->param.cipher_key_len,
8904                         cur_test->param.auth_alg,
8905                         cur_test->auth_key, cur_test->param.auth_key_len,
8906                         cur_test->bearer, cur_test->param.domain,
8907                         cur_test->packet_direction, cur_test->sn_size,
8908                         cur_test->hfn,
8909                         cur_test->hfn_threshold, SDAP_ENABLED);
8910                 if (err) {
8911                         printf("\t%d) %s: Encapsulation failed\n",
8912                                         cur_test->test_idx,
8913                                         cur_test->param.name);
8914                         err = TEST_FAILED;
8915                 } else {
8916                         printf("\t%d) %s: Encap PASS\n", cur_test->test_idx,
8917                                         cur_test->param.name);
8918                         err = TEST_SUCCESS;
8919                 }
8920                 all_err += err;
8921         }
8922
8923         printf("Success: %d, Failure: %d\n", size + all_err, -all_err);
8924
8925         return (all_err == TEST_SUCCESS) ? TEST_SUCCESS : TEST_FAILED;
8926 }
8927
8928 static int
8929 test_PDCP_PROTO_short_mac(void)
8930 {
8931         int i = 0, size = 0;
8932         int err, all_err = TEST_SUCCESS;
8933         const struct pdcp_short_mac_test *cur_test;
8934
8935         size = RTE_DIM(list_pdcp_smac_tests);
8936
8937         for (i = 0; i < size; i++) {
8938                 cur_test = &list_pdcp_smac_tests[i];
8939                 err = test_pdcp_proto(
8940                         i, 0, RTE_CRYPTO_CIPHER_OP_ENCRYPT,
8941                         RTE_CRYPTO_AUTH_OP_GENERATE, cur_test->data_in,
8942                         cur_test->in_len, cur_test->data_out,
8943                         cur_test->in_len + ((cur_test->auth_key) ? 4 : 0),
8944                         RTE_CRYPTO_CIPHER_NULL, NULL,
8945                         0, cur_test->param.auth_alg,
8946                         cur_test->auth_key, cur_test->param.auth_key_len,
8947                         0, cur_test->param.domain, 0, 0,
8948                         0, 0, 0);
8949                 if (err) {
8950                         printf("\t%d) %s: Short MAC test failed\n",
8951                                         cur_test->test_idx,
8952                                         cur_test->param.name);
8953                         err = TEST_FAILED;
8954                 } else {
8955                         printf("\t%d) %s: Short MAC test PASS\n",
8956                                         cur_test->test_idx,
8957                                         cur_test->param.name);
8958                         rte_hexdump(stdout, "MAC I",
8959                                     cur_test->data_out + cur_test->in_len + 2,
8960                                     2);
8961                         err = TEST_SUCCESS;
8962                 }
8963                 all_err += err;
8964         }
8965
8966         printf("Success: %d, Failure: %d\n", size + all_err, -all_err);
8967
8968         return (all_err == TEST_SUCCESS) ? TEST_SUCCESS : TEST_FAILED;
8969
8970 }
8971
8972 static int
8973 test_PDCP_SDAP_PROTO_decap_all(void)
8974 {
8975         int i = 0, size = 0;
8976         int err, all_err = TEST_SUCCESS;
8977         const struct pdcp_sdap_test *cur_test;
8978
8979         size = RTE_DIM(list_pdcp_sdap_tests);
8980
8981         for (i = 0; i < size; i++) {
8982                 cur_test = &list_pdcp_sdap_tests[i];
8983                 err = test_pdcp_proto(
8984                         i, 0, RTE_CRYPTO_CIPHER_OP_DECRYPT,
8985                         RTE_CRYPTO_AUTH_OP_VERIFY,
8986                         cur_test->data_out,
8987                         cur_test->in_len + ((cur_test->auth_key) ? 4 : 0),
8988                         cur_test->data_in, cur_test->in_len,
8989                         cur_test->param.cipher_alg,
8990                         cur_test->cipher_key, cur_test->param.cipher_key_len,
8991                         cur_test->param.auth_alg, cur_test->auth_key,
8992                         cur_test->param.auth_key_len, cur_test->bearer,
8993                         cur_test->param.domain, cur_test->packet_direction,
8994                         cur_test->sn_size, cur_test->hfn,
8995                         cur_test->hfn_threshold, SDAP_ENABLED);
8996                 if (err) {
8997                         printf("\t%d) %s: Decapsulation failed\n",
8998                                         cur_test->test_idx,
8999                                         cur_test->param.name);
9000                         err = TEST_FAILED;
9001                 } else {
9002                         printf("\t%d) %s: Decap PASS\n", cur_test->test_idx,
9003                                         cur_test->param.name);
9004                         err = TEST_SUCCESS;
9005                 }
9006                 all_err += err;
9007         }
9008
9009         printf("Success: %d, Failure: %d\n", size + all_err, -all_err);
9010
9011         return (all_err == TEST_SUCCESS) ? TEST_SUCCESS : TEST_FAILED;
9012 }
9013
9014 static int
9015 test_ipsec_proto_process(const struct ipsec_test_data td[],
9016                          struct ipsec_test_data res_d[],
9017                          int nb_td,
9018                          bool silent,
9019                          const struct ipsec_test_flags *flags)
9020 {
9021         struct crypto_testsuite_params *ts_params = &testsuite_params;
9022         struct crypto_unittest_params *ut_params = &unittest_params;
9023         struct rte_security_capability_idx sec_cap_idx;
9024         const struct rte_security_capability *sec_cap;
9025         struct rte_security_ipsec_xform ipsec_xform;
9026         uint8_t dev_id = ts_params->valid_devs[0];
9027         enum rte_security_ipsec_sa_direction dir;
9028         struct ipsec_test_data *res_d_tmp = NULL;
9029         uint32_t src = RTE_IPV4(192, 168, 1, 0);
9030         uint32_t dst = RTE_IPV4(192, 168, 1, 1);
9031         int salt_len, i, ret = TEST_SUCCESS;
9032         struct rte_security_ctx *ctx;
9033         uint8_t *input_text;
9034         uint32_t verify;
9035
9036         ut_params->type = RTE_SECURITY_ACTION_TYPE_LOOKASIDE_PROTOCOL;
9037         gbl_action_type = RTE_SECURITY_ACTION_TYPE_LOOKASIDE_PROTOCOL;
9038
9039         /* Use first test data to create session */
9040
9041         /* Copy IPsec xform */
9042         memcpy(&ipsec_xform, &td[0].ipsec_xform, sizeof(ipsec_xform));
9043
9044         dir = ipsec_xform.direction;
9045         verify = flags->tunnel_hdr_verify;
9046
9047         if ((dir == RTE_SECURITY_IPSEC_SA_DIR_INGRESS) && verify) {
9048                 if (verify == RTE_SECURITY_IPSEC_TUNNEL_VERIFY_SRC_DST_ADDR)
9049                         src += 1;
9050                 else if (verify == RTE_SECURITY_IPSEC_TUNNEL_VERIFY_DST_ADDR)
9051                         dst += 1;
9052         }
9053
9054         memcpy(&ipsec_xform.tunnel.ipv4.src_ip, &src, sizeof(src));
9055         memcpy(&ipsec_xform.tunnel.ipv4.dst_ip, &dst, sizeof(dst));
9056
9057         ctx = rte_cryptodev_get_sec_ctx(dev_id);
9058
9059         sec_cap_idx.action = ut_params->type;
9060         sec_cap_idx.protocol = RTE_SECURITY_PROTOCOL_IPSEC;
9061         sec_cap_idx.ipsec.proto = ipsec_xform.proto;
9062         sec_cap_idx.ipsec.mode = ipsec_xform.mode;
9063         sec_cap_idx.ipsec.direction = ipsec_xform.direction;
9064
9065         if (flags->udp_encap)
9066                 ipsec_xform.options.udp_encap = 1;
9067
9068         sec_cap = rte_security_capability_get(ctx, &sec_cap_idx);
9069         if (sec_cap == NULL)
9070                 return TEST_SKIPPED;
9071
9072         /* Copy cipher session parameters */
9073         if (td[0].aead) {
9074                 memcpy(&ut_params->aead_xform, &td[0].xform.aead,
9075                        sizeof(ut_params->aead_xform));
9076                 ut_params->aead_xform.aead.key.data = td[0].key.data;
9077                 ut_params->aead_xform.aead.iv.offset = IV_OFFSET;
9078
9079                 /* Verify crypto capabilities */
9080                 if (test_ipsec_crypto_caps_aead_verify(
9081                                 sec_cap,
9082                                 &ut_params->aead_xform) != 0) {
9083                         if (!silent)
9084                                 RTE_LOG(INFO, USER1,
9085                                         "Crypto capabilities not supported\n");
9086                         return TEST_SKIPPED;
9087                 }
9088         } else {
9089                 /* Only AEAD supported now */
9090                 return TEST_SKIPPED;
9091         }
9092
9093         if (test_ipsec_sec_caps_verify(&ipsec_xform, sec_cap, silent) != 0)
9094                 return TEST_SKIPPED;
9095
9096         salt_len = RTE_MIN(sizeof(ipsec_xform.salt), td[0].salt.len);
9097         memcpy(&ipsec_xform.salt, td[0].salt.data, salt_len);
9098
9099         struct rte_security_session_conf sess_conf = {
9100                 .action_type = ut_params->type,
9101                 .protocol = RTE_SECURITY_PROTOCOL_IPSEC,
9102                 .ipsec = ipsec_xform,
9103                 .crypto_xform = &ut_params->aead_xform,
9104         };
9105
9106         /* Create security session */
9107         ut_params->sec_session = rte_security_session_create(ctx, &sess_conf,
9108                                         ts_params->session_mpool,
9109                                         ts_params->session_priv_mpool);
9110
9111         if (ut_params->sec_session == NULL)
9112                 return TEST_SKIPPED;
9113
9114         for (i = 0; i < nb_td; i++) {
9115                 /* Setup source mbuf payload */
9116                 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
9117                 memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
9118                                 rte_pktmbuf_tailroom(ut_params->ibuf));
9119
9120                 input_text = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
9121                                 td[i].input_text.len);
9122
9123                 memcpy(input_text, td[i].input_text.data,
9124                        td[i].input_text.len);
9125
9126                 /* Generate crypto op data structure */
9127                 ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
9128                                         RTE_CRYPTO_OP_TYPE_SYMMETRIC);
9129                 if (!ut_params->op) {
9130                         printf("TestCase %s line %d: %s\n",
9131                                 __func__, __LINE__,
9132                                 "failed to allocate crypto op");
9133                         ret = TEST_FAILED;
9134                         goto crypto_op_free;
9135                 }
9136
9137                 /* Attach session to operation */
9138                 rte_security_attach_session(ut_params->op,
9139                                             ut_params->sec_session);
9140
9141                 /* Set crypto operation mbufs */
9142                 ut_params->op->sym->m_src = ut_params->ibuf;
9143                 ut_params->op->sym->m_dst = NULL;
9144
9145                 /* Copy IV in crypto operation when IV generation is disabled */
9146                 if (dir == RTE_SECURITY_IPSEC_SA_DIR_EGRESS &&
9147                     ipsec_xform.options.iv_gen_disable == 1) {
9148                         uint8_t *iv = rte_crypto_op_ctod_offset(ut_params->op,
9149                                                                 uint8_t *,
9150                                                                 IV_OFFSET);
9151                         int len;
9152
9153                         if (td[i].aead)
9154                                 len = td[i].xform.aead.aead.iv.length;
9155                         else
9156                                 len = td[i].xform.chain.cipher.cipher.iv.length;
9157
9158                         memcpy(iv, td[i].iv.data, len);
9159                 }
9160
9161                 /* Process crypto operation */
9162                 process_crypto_request(dev_id, ut_params->op);
9163
9164                 ret = test_ipsec_status_check(ut_params->op, flags, dir, i + 1);
9165                 if (ret != TEST_SUCCESS)
9166                         goto crypto_op_free;
9167
9168                 if (res_d != NULL)
9169                         res_d_tmp = &res_d[i];
9170
9171                 ret = test_ipsec_post_process(ut_params->ibuf, &td[i],
9172                                               res_d_tmp, silent, flags);
9173                 if (ret != TEST_SUCCESS)
9174                         goto crypto_op_free;
9175
9176                 rte_crypto_op_free(ut_params->op);
9177                 ut_params->op = NULL;
9178
9179                 rte_pktmbuf_free(ut_params->ibuf);
9180                 ut_params->ibuf = NULL;
9181         }
9182
9183 crypto_op_free:
9184         rte_crypto_op_free(ut_params->op);
9185         ut_params->op = NULL;
9186
9187         rte_pktmbuf_free(ut_params->ibuf);
9188         ut_params->ibuf = NULL;
9189
9190         if (ut_params->sec_session)
9191                 rte_security_session_destroy(ctx, ut_params->sec_session);
9192         ut_params->sec_session = NULL;
9193
9194         return ret;
9195 }
9196
9197 static int
9198 test_ipsec_proto_known_vec(const void *test_data)
9199 {
9200         struct ipsec_test_data td_outb;
9201         struct ipsec_test_flags flags;
9202
9203         memset(&flags, 0, sizeof(flags));
9204
9205         memcpy(&td_outb, test_data, sizeof(td_outb));
9206
9207         /* Disable IV gen to be able to test with known vectors */
9208         td_outb.ipsec_xform.options.iv_gen_disable = 1;
9209
9210         return test_ipsec_proto_process(&td_outb, NULL, 1, false, &flags);
9211 }
9212
9213 static int
9214 test_ipsec_proto_known_vec_inb(const void *td_outb)
9215 {
9216         struct ipsec_test_flags flags;
9217         struct ipsec_test_data td_inb;
9218
9219         memset(&flags, 0, sizeof(flags));
9220
9221         test_ipsec_td_in_from_out(td_outb, &td_inb);
9222
9223         return test_ipsec_proto_process(&td_inb, NULL, 1, false, &flags);
9224 }
9225
9226 static int
9227 test_ipsec_proto_all(const struct ipsec_test_flags *flags)
9228 {
9229         struct ipsec_test_data td_outb[IPSEC_TEST_PACKETS_MAX];
9230         struct ipsec_test_data td_inb[IPSEC_TEST_PACKETS_MAX];
9231         unsigned int i, nb_pkts = 1, pass_cnt = 0;
9232         int ret;
9233
9234         if (flags->iv_gen ||
9235             flags->sa_expiry_pkts_soft ||
9236             flags->sa_expiry_pkts_hard)
9237                 nb_pkts = IPSEC_TEST_PACKETS_MAX;
9238
9239         for (i = 0; i < RTE_DIM(aead_list); i++) {
9240                 test_ipsec_td_prepare(&aead_list[i],
9241                                       NULL,
9242                                       flags,
9243                                       td_outb,
9244                                       nb_pkts);
9245
9246                 ret = test_ipsec_proto_process(td_outb, td_inb, nb_pkts, true,
9247                                                flags);
9248                 if (ret == TEST_SKIPPED)
9249                         continue;
9250
9251                 if (ret == TEST_FAILED)
9252                         return TEST_FAILED;
9253
9254                 test_ipsec_td_update(td_inb, td_outb, nb_pkts, flags);
9255
9256                 ret = test_ipsec_proto_process(td_inb, NULL, nb_pkts, true,
9257                                                flags);
9258                 if (ret == TEST_SKIPPED)
9259                         continue;
9260
9261                 if (ret == TEST_FAILED)
9262                         return TEST_FAILED;
9263
9264                 if (flags->display_alg)
9265                         test_ipsec_display_alg(&aead_list[i], NULL);
9266
9267                 pass_cnt++;
9268         }
9269
9270         if (pass_cnt > 0)
9271                 return TEST_SUCCESS;
9272         else
9273                 return TEST_SKIPPED;
9274 }
9275
9276 static int
9277 test_ipsec_proto_display_list(const void *data __rte_unused)
9278 {
9279         struct ipsec_test_flags flags;
9280
9281         memset(&flags, 0, sizeof(flags));
9282
9283         flags.display_alg = true;
9284
9285         return test_ipsec_proto_all(&flags);
9286 }
9287
9288 static int
9289 test_ipsec_proto_iv_gen(const void *data __rte_unused)
9290 {
9291         struct ipsec_test_flags flags;
9292
9293         memset(&flags, 0, sizeof(flags));
9294
9295         flags.iv_gen = true;
9296
9297         return test_ipsec_proto_all(&flags);
9298 }
9299
9300 static int
9301 test_ipsec_proto_sa_exp_pkts_soft(const void *data __rte_unused)
9302 {
9303         struct ipsec_test_flags flags;
9304
9305         memset(&flags, 0, sizeof(flags));
9306
9307         flags.sa_expiry_pkts_soft = true;
9308
9309         return test_ipsec_proto_all(&flags);
9310 }
9311
9312 static int
9313 test_ipsec_proto_sa_exp_pkts_hard(const void *data __rte_unused)
9314 {
9315         struct ipsec_test_flags flags;
9316
9317         memset(&flags, 0, sizeof(flags));
9318
9319         flags.sa_expiry_pkts_hard = true;
9320
9321         return test_ipsec_proto_all(&flags);
9322 }
9323
9324 static int
9325 test_ipsec_proto_err_icv_corrupt(const void *data __rte_unused)
9326 {
9327         struct ipsec_test_flags flags;
9328
9329         memset(&flags, 0, sizeof(flags));
9330
9331         flags.icv_corrupt = true;
9332
9333         return test_ipsec_proto_all(&flags);
9334 }
9335
9336 static int
9337 test_ipsec_proto_udp_encap(const void *data __rte_unused)
9338 {
9339         struct ipsec_test_flags flags;
9340
9341         memset(&flags, 0, sizeof(flags));
9342
9343         flags.udp_encap = true;
9344
9345         return test_ipsec_proto_all(&flags);
9346 }
9347
9348 static int
9349 test_ipsec_proto_tunnel_src_dst_addr_verify(const void *data __rte_unused)
9350 {
9351         struct ipsec_test_flags flags;
9352
9353         memset(&flags, 0, sizeof(flags));
9354
9355         flags.tunnel_hdr_verify = RTE_SECURITY_IPSEC_TUNNEL_VERIFY_SRC_DST_ADDR;
9356
9357         return test_ipsec_proto_all(&flags);
9358 }
9359
9360 static int
9361 test_ipsec_proto_tunnel_dst_addr_verify(const void *data __rte_unused)
9362 {
9363         struct ipsec_test_flags flags;
9364
9365         memset(&flags, 0, sizeof(flags));
9366
9367         flags.tunnel_hdr_verify = RTE_SECURITY_IPSEC_TUNNEL_VERIFY_DST_ADDR;
9368
9369         return test_ipsec_proto_all(&flags);
9370 }
9371
9372 static int
9373 test_ipsec_proto_udp_ports_verify(const void *data __rte_unused)
9374 {
9375         struct ipsec_test_flags flags;
9376
9377         memset(&flags, 0, sizeof(flags));
9378
9379         flags.udp_encap = true;
9380         flags.udp_ports_verify = true;
9381
9382         return test_ipsec_proto_all(&flags);
9383 }
9384
9385 static int
9386 test_ipsec_proto_inner_ip_csum(const void *data __rte_unused)
9387 {
9388         struct ipsec_test_flags flags;
9389
9390         memset(&flags, 0, sizeof(flags));
9391
9392         flags.ip_csum = true;
9393
9394         return test_ipsec_proto_all(&flags);
9395 }
9396
9397 static int
9398 test_ipsec_proto_inner_l4_csum(const void *data __rte_unused)
9399 {
9400         struct ipsec_test_flags flags;
9401
9402         memset(&flags, 0, sizeof(flags));
9403
9404         flags.l4_csum = true;
9405
9406         return test_ipsec_proto_all(&flags);
9407 }
9408
9409 static int
9410 test_PDCP_PROTO_all(void)
9411 {
9412         struct crypto_testsuite_params *ts_params = &testsuite_params;
9413         struct crypto_unittest_params *ut_params = &unittest_params;
9414         struct rte_cryptodev_info dev_info;
9415         int status;
9416
9417         rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
9418         uint64_t feat_flags = dev_info.feature_flags;
9419
9420         if (!(feat_flags & RTE_CRYPTODEV_FF_SECURITY))
9421                 return TEST_SKIPPED;
9422
9423         /* Set action type */
9424         ut_params->type = gbl_action_type == RTE_SECURITY_ACTION_TYPE_NONE ?
9425                 RTE_SECURITY_ACTION_TYPE_LOOKASIDE_PROTOCOL :
9426                 gbl_action_type;
9427
9428         if (security_proto_supported(ut_params->type,
9429                         RTE_SECURITY_PROTOCOL_PDCP) < 0)
9430                 return TEST_SKIPPED;
9431
9432         status = test_PDCP_PROTO_cplane_encap_all();
9433         status += test_PDCP_PROTO_cplane_decap_all();
9434         status += test_PDCP_PROTO_uplane_encap_all();
9435         status += test_PDCP_PROTO_uplane_decap_all();
9436         status += test_PDCP_PROTO_SGL_in_place_32B();
9437         status += test_PDCP_PROTO_SGL_oop_32B_128B();
9438         status += test_PDCP_PROTO_SGL_oop_32B_40B();
9439         status += test_PDCP_PROTO_SGL_oop_128B_32B();
9440         status += test_PDCP_SDAP_PROTO_encap_all();
9441         status += test_PDCP_SDAP_PROTO_decap_all();
9442         status += test_PDCP_PROTO_short_mac();
9443
9444         if (status)
9445                 return TEST_FAILED;
9446         else
9447                 return TEST_SUCCESS;
9448 }
9449
9450 static int
9451 test_docsis_proto_uplink(int i, struct docsis_test_data *d_td)
9452 {
9453         struct crypto_testsuite_params *ts_params = &testsuite_params;
9454         struct crypto_unittest_params *ut_params = &unittest_params;
9455         uint8_t *plaintext, *ciphertext;
9456         uint8_t *iv_ptr;
9457         int32_t cipher_len, crc_len;
9458         uint32_t crc_data_len;
9459         int ret = TEST_SUCCESS;
9460
9461         struct rte_security_ctx *ctx = (struct rte_security_ctx *)
9462                                         rte_cryptodev_get_sec_ctx(
9463                                                 ts_params->valid_devs[0]);
9464
9465         /* Verify the capabilities */
9466         struct rte_security_capability_idx sec_cap_idx;
9467         const struct rte_security_capability *sec_cap;
9468         const struct rte_cryptodev_capabilities *crypto_cap;
9469         const struct rte_cryptodev_symmetric_capability *sym_cap;
9470         int j = 0;
9471
9472         sec_cap_idx.action = ut_params->type;
9473         sec_cap_idx.protocol = RTE_SECURITY_PROTOCOL_DOCSIS;
9474         sec_cap_idx.docsis.direction = RTE_SECURITY_DOCSIS_UPLINK;
9475
9476         sec_cap = rte_security_capability_get(ctx, &sec_cap_idx);
9477         if (sec_cap == NULL)
9478                 return TEST_SKIPPED;
9479
9480         while ((crypto_cap = &sec_cap->crypto_capabilities[j++])->op !=
9481                         RTE_CRYPTO_OP_TYPE_UNDEFINED) {
9482                 if (crypto_cap->op == RTE_CRYPTO_OP_TYPE_SYMMETRIC &&
9483                                 crypto_cap->sym.xform_type ==
9484                                         RTE_CRYPTO_SYM_XFORM_CIPHER &&
9485                                 crypto_cap->sym.cipher.algo ==
9486                                         RTE_CRYPTO_CIPHER_AES_DOCSISBPI) {
9487                         sym_cap = &crypto_cap->sym;
9488                         if (rte_cryptodev_sym_capability_check_cipher(sym_cap,
9489                                                 d_td->key.len,
9490                                                 d_td->iv.len) == 0)
9491                                 break;
9492                 }
9493         }
9494
9495         if (crypto_cap->op == RTE_CRYPTO_OP_TYPE_UNDEFINED)
9496                 return TEST_SKIPPED;
9497
9498         /* Setup source mbuf payload */
9499         ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
9500         memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
9501                         rte_pktmbuf_tailroom(ut_params->ibuf));
9502
9503         ciphertext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
9504                         d_td->ciphertext.len);
9505
9506         memcpy(ciphertext, d_td->ciphertext.data, d_td->ciphertext.len);
9507
9508         /* Setup cipher session parameters */
9509         ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
9510         ut_params->cipher_xform.cipher.algo = RTE_CRYPTO_CIPHER_AES_DOCSISBPI;
9511         ut_params->cipher_xform.cipher.op = RTE_CRYPTO_CIPHER_OP_DECRYPT;
9512         ut_params->cipher_xform.cipher.key.data = d_td->key.data;
9513         ut_params->cipher_xform.cipher.key.length = d_td->key.len;
9514         ut_params->cipher_xform.cipher.iv.length = d_td->iv.len;
9515         ut_params->cipher_xform.cipher.iv.offset = IV_OFFSET;
9516         ut_params->cipher_xform.next = NULL;
9517
9518         /* Setup DOCSIS session parameters */
9519         ut_params->docsis_xform.direction = RTE_SECURITY_DOCSIS_UPLINK;
9520
9521         struct rte_security_session_conf sess_conf = {
9522                 .action_type = ut_params->type,
9523                 .protocol = RTE_SECURITY_PROTOCOL_DOCSIS,
9524                 .docsis = ut_params->docsis_xform,
9525                 .crypto_xform = &ut_params->cipher_xform,
9526         };
9527
9528         /* Create security session */
9529         ut_params->sec_session = rte_security_session_create(ctx, &sess_conf,
9530                                         ts_params->session_mpool,
9531                                         ts_params->session_priv_mpool);
9532
9533         if (!ut_params->sec_session) {
9534                 printf("TestCase %s(%d) line %d: %s\n",
9535                         __func__, i, __LINE__, "failed to allocate session");
9536                 ret = TEST_FAILED;
9537                 goto on_err;
9538         }
9539
9540         /* Generate crypto op data structure */
9541         ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
9542                                 RTE_CRYPTO_OP_TYPE_SYMMETRIC);
9543         if (!ut_params->op) {
9544                 printf("TestCase %s(%d) line %d: %s\n",
9545                         __func__, i, __LINE__,
9546                         "failed to allocate symmetric crypto operation");
9547                 ret = TEST_FAILED;
9548                 goto on_err;
9549         }
9550
9551         /* Setup CRC operation parameters */
9552         crc_len = d_td->ciphertext.no_crc == false ?
9553                         (d_td->ciphertext.len -
9554                                 d_td->ciphertext.crc_offset -
9555                                 RTE_ETHER_CRC_LEN) :
9556                         0;
9557         crc_len = crc_len > 0 ? crc_len : 0;
9558         crc_data_len = crc_len == 0 ? 0 : RTE_ETHER_CRC_LEN;
9559         ut_params->op->sym->auth.data.length = crc_len;
9560         ut_params->op->sym->auth.data.offset = d_td->ciphertext.crc_offset;
9561
9562         /* Setup cipher operation parameters */
9563         cipher_len = d_td->ciphertext.no_cipher == false ?
9564                         (d_td->ciphertext.len -
9565                                 d_td->ciphertext.cipher_offset) :
9566                         0;
9567         cipher_len = cipher_len > 0 ? cipher_len : 0;
9568         ut_params->op->sym->cipher.data.length = cipher_len;
9569         ut_params->op->sym->cipher.data.offset = d_td->ciphertext.cipher_offset;
9570
9571         /* Setup cipher IV */
9572         iv_ptr = (uint8_t *)ut_params->op + IV_OFFSET;
9573         rte_memcpy(iv_ptr, d_td->iv.data, d_td->iv.len);
9574
9575         /* Attach session to operation */
9576         rte_security_attach_session(ut_params->op, ut_params->sec_session);
9577
9578         /* Set crypto operation mbufs */
9579         ut_params->op->sym->m_src = ut_params->ibuf;
9580         ut_params->op->sym->m_dst = NULL;
9581
9582         /* Process crypto operation */
9583         if (process_crypto_request(ts_params->valid_devs[0], ut_params->op) ==
9584                         NULL) {
9585                 printf("TestCase %s(%d) line %d: %s\n",
9586                         __func__, i, __LINE__,
9587                         "failed to process security crypto op");
9588                 ret = TEST_FAILED;
9589                 goto on_err;
9590         }
9591
9592         if (ut_params->op->status != RTE_CRYPTO_OP_STATUS_SUCCESS) {
9593                 printf("TestCase %s(%d) line %d: %s\n",
9594                         __func__, i, __LINE__, "crypto op processing failed");
9595                 ret = TEST_FAILED;
9596                 goto on_err;
9597         }
9598
9599         /* Validate plaintext */
9600         plaintext = ciphertext;
9601
9602         if (memcmp(plaintext, d_td->plaintext.data,
9603                         d_td->plaintext.len - crc_data_len)) {
9604                 printf("TestCase %s(%d) line %d: %s\n",
9605                         __func__, i, __LINE__, "plaintext not as expected\n");
9606                 rte_hexdump(stdout, "expected", d_td->plaintext.data,
9607                                 d_td->plaintext.len);
9608                 rte_hexdump(stdout, "actual", plaintext, d_td->plaintext.len);
9609                 ret = TEST_FAILED;
9610                 goto on_err;
9611         }
9612
9613 on_err:
9614         rte_crypto_op_free(ut_params->op);
9615         ut_params->op = NULL;
9616
9617         if (ut_params->sec_session)
9618                 rte_security_session_destroy(ctx, ut_params->sec_session);
9619         ut_params->sec_session = NULL;
9620
9621         rte_pktmbuf_free(ut_params->ibuf);
9622         ut_params->ibuf = NULL;
9623
9624         return ret;
9625 }
9626
9627 static int
9628 test_docsis_proto_downlink(int i, struct docsis_test_data *d_td)
9629 {
9630         struct crypto_testsuite_params *ts_params = &testsuite_params;
9631         struct crypto_unittest_params *ut_params = &unittest_params;
9632         uint8_t *plaintext, *ciphertext;
9633         uint8_t *iv_ptr;
9634         int32_t cipher_len, crc_len;
9635         int ret = TEST_SUCCESS;
9636
9637         struct rte_security_ctx *ctx = (struct rte_security_ctx *)
9638                                         rte_cryptodev_get_sec_ctx(
9639                                                 ts_params->valid_devs[0]);
9640
9641         /* Verify the capabilities */
9642         struct rte_security_capability_idx sec_cap_idx;
9643         const struct rte_security_capability *sec_cap;
9644         const struct rte_cryptodev_capabilities *crypto_cap;
9645         const struct rte_cryptodev_symmetric_capability *sym_cap;
9646         int j = 0;
9647
9648         sec_cap_idx.action = ut_params->type;
9649         sec_cap_idx.protocol = RTE_SECURITY_PROTOCOL_DOCSIS;
9650         sec_cap_idx.docsis.direction = RTE_SECURITY_DOCSIS_DOWNLINK;
9651
9652         sec_cap = rte_security_capability_get(ctx, &sec_cap_idx);
9653         if (sec_cap == NULL)
9654                 return TEST_SKIPPED;
9655
9656         while ((crypto_cap = &sec_cap->crypto_capabilities[j++])->op !=
9657                         RTE_CRYPTO_OP_TYPE_UNDEFINED) {
9658                 if (crypto_cap->op == RTE_CRYPTO_OP_TYPE_SYMMETRIC &&
9659                                 crypto_cap->sym.xform_type ==
9660                                         RTE_CRYPTO_SYM_XFORM_CIPHER &&
9661                                 crypto_cap->sym.cipher.algo ==
9662                                         RTE_CRYPTO_CIPHER_AES_DOCSISBPI) {
9663                         sym_cap = &crypto_cap->sym;
9664                         if (rte_cryptodev_sym_capability_check_cipher(sym_cap,
9665                                                 d_td->key.len,
9666                                                 d_td->iv.len) == 0)
9667                                 break;
9668                 }
9669         }
9670
9671         if (crypto_cap->op == RTE_CRYPTO_OP_TYPE_UNDEFINED)
9672                 return TEST_SKIPPED;
9673
9674         /* Setup source mbuf payload */
9675         ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
9676         memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
9677                         rte_pktmbuf_tailroom(ut_params->ibuf));
9678
9679         plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
9680                         d_td->plaintext.len);
9681
9682         memcpy(plaintext, d_td->plaintext.data, d_td->plaintext.len);
9683
9684         /* Setup cipher session parameters */
9685         ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
9686         ut_params->cipher_xform.cipher.algo = RTE_CRYPTO_CIPHER_AES_DOCSISBPI;
9687         ut_params->cipher_xform.cipher.op = RTE_CRYPTO_CIPHER_OP_ENCRYPT;
9688         ut_params->cipher_xform.cipher.key.data = d_td->key.data;
9689         ut_params->cipher_xform.cipher.key.length = d_td->key.len;
9690         ut_params->cipher_xform.cipher.iv.length = d_td->iv.len;
9691         ut_params->cipher_xform.cipher.iv.offset = IV_OFFSET;
9692         ut_params->cipher_xform.next = NULL;
9693
9694         /* Setup DOCSIS session parameters */
9695         ut_params->docsis_xform.direction = RTE_SECURITY_DOCSIS_DOWNLINK;
9696
9697         struct rte_security_session_conf sess_conf = {
9698                 .action_type = ut_params->type,
9699                 .protocol = RTE_SECURITY_PROTOCOL_DOCSIS,
9700                 .docsis = ut_params->docsis_xform,
9701                 .crypto_xform = &ut_params->cipher_xform,
9702         };
9703
9704         /* Create security session */
9705         ut_params->sec_session = rte_security_session_create(ctx, &sess_conf,
9706                                         ts_params->session_mpool,
9707                                         ts_params->session_priv_mpool);
9708
9709         if (!ut_params->sec_session) {
9710                 printf("TestCase %s(%d) line %d: %s\n",
9711                         __func__, i, __LINE__, "failed to allocate session");
9712                 ret = TEST_FAILED;
9713                 goto on_err;
9714         }
9715
9716         /* Generate crypto op data structure */
9717         ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
9718                                 RTE_CRYPTO_OP_TYPE_SYMMETRIC);
9719         if (!ut_params->op) {
9720                 printf("TestCase %s(%d) line %d: %s\n",
9721                         __func__, i, __LINE__,
9722                         "failed to allocate security crypto operation");
9723                 ret = TEST_FAILED;
9724                 goto on_err;
9725         }
9726
9727         /* Setup CRC operation parameters */
9728         crc_len = d_td->plaintext.no_crc == false ?
9729                         (d_td->plaintext.len -
9730                                 d_td->plaintext.crc_offset -
9731                                 RTE_ETHER_CRC_LEN) :
9732                         0;
9733         crc_len = crc_len > 0 ? crc_len : 0;
9734         ut_params->op->sym->auth.data.length = crc_len;
9735         ut_params->op->sym->auth.data.offset = d_td->plaintext.crc_offset;
9736
9737         /* Setup cipher operation parameters */
9738         cipher_len = d_td->plaintext.no_cipher == false ?
9739                         (d_td->plaintext.len -
9740                                 d_td->plaintext.cipher_offset) :
9741                         0;
9742         cipher_len = cipher_len > 0 ? cipher_len : 0;
9743         ut_params->op->sym->cipher.data.length = cipher_len;
9744         ut_params->op->sym->cipher.data.offset = d_td->plaintext.cipher_offset;
9745
9746         /* Setup cipher IV */
9747         iv_ptr = (uint8_t *)ut_params->op + IV_OFFSET;
9748         rte_memcpy(iv_ptr, d_td->iv.data, d_td->iv.len);
9749
9750         /* Attach session to operation */
9751         rte_security_attach_session(ut_params->op, ut_params->sec_session);
9752
9753         /* Set crypto operation mbufs */
9754         ut_params->op->sym->m_src = ut_params->ibuf;
9755         ut_params->op->sym->m_dst = NULL;
9756
9757         /* Process crypto operation */
9758         if (process_crypto_request(ts_params->valid_devs[0], ut_params->op) ==
9759                         NULL) {
9760                 printf("TestCase %s(%d) line %d: %s\n",
9761                         __func__, i, __LINE__,
9762                         "failed to process security crypto op");
9763                 ret = TEST_FAILED;
9764                 goto on_err;
9765         }
9766
9767         if (ut_params->op->status != RTE_CRYPTO_OP_STATUS_SUCCESS) {
9768                 printf("TestCase %s(%d) line %d: %s\n",
9769                         __func__, i, __LINE__, "crypto op processing failed");
9770                 ret = TEST_FAILED;
9771                 goto on_err;
9772         }
9773
9774         /* Validate ciphertext */
9775         ciphertext = plaintext;
9776
9777         if (memcmp(ciphertext, d_td->ciphertext.data, d_td->ciphertext.len)) {
9778                 printf("TestCase %s(%d) line %d: %s\n",
9779                         __func__, i, __LINE__, "ciphertext not as expected\n");
9780                 rte_hexdump(stdout, "expected", d_td->ciphertext.data,
9781                                 d_td->ciphertext.len);
9782                 rte_hexdump(stdout, "actual", ciphertext, d_td->ciphertext.len);
9783                 ret = TEST_FAILED;
9784                 goto on_err;
9785         }
9786
9787 on_err:
9788         rte_crypto_op_free(ut_params->op);
9789         ut_params->op = NULL;
9790
9791         if (ut_params->sec_session)
9792                 rte_security_session_destroy(ctx, ut_params->sec_session);
9793         ut_params->sec_session = NULL;
9794
9795         rte_pktmbuf_free(ut_params->ibuf);
9796         ut_params->ibuf = NULL;
9797
9798         return ret;
9799 }
9800
9801 #define TEST_DOCSIS_COUNT(func) do {                    \
9802         int ret = func;                                 \
9803         if (ret == TEST_SUCCESS)  {                     \
9804                 printf("\t%2d)", n++);                  \
9805                 printf("+++++ PASSED:" #func"\n");      \
9806                 p++;                                    \
9807         } else if (ret == TEST_SKIPPED) {               \
9808                 printf("\t%2d)", n++);                  \
9809                 printf("~~~~~ SKIPPED:" #func"\n");     \
9810                 s++;                                    \
9811         } else {                                        \
9812                 printf("\t%2d)", n++);                  \
9813                 printf("----- FAILED:" #func"\n");      \
9814                 f++;                                    \
9815         }                                               \
9816 } while (0)
9817
9818 static int
9819 test_DOCSIS_PROTO_uplink_all(void)
9820 {
9821         int p = 0, s = 0, f = 0, n = 0;
9822
9823         TEST_DOCSIS_COUNT(test_docsis_proto_uplink(1, &docsis_test_case_1));
9824         TEST_DOCSIS_COUNT(test_docsis_proto_uplink(2, &docsis_test_case_2));
9825         TEST_DOCSIS_COUNT(test_docsis_proto_uplink(3, &docsis_test_case_3));
9826         TEST_DOCSIS_COUNT(test_docsis_proto_uplink(4, &docsis_test_case_4));
9827         TEST_DOCSIS_COUNT(test_docsis_proto_uplink(5, &docsis_test_case_5));
9828         TEST_DOCSIS_COUNT(test_docsis_proto_uplink(6, &docsis_test_case_6));
9829         TEST_DOCSIS_COUNT(test_docsis_proto_uplink(7, &docsis_test_case_7));
9830         TEST_DOCSIS_COUNT(test_docsis_proto_uplink(8, &docsis_test_case_8));
9831         TEST_DOCSIS_COUNT(test_docsis_proto_uplink(9, &docsis_test_case_9));
9832         TEST_DOCSIS_COUNT(test_docsis_proto_uplink(10, &docsis_test_case_10));
9833         TEST_DOCSIS_COUNT(test_docsis_proto_uplink(11, &docsis_test_case_11));
9834         TEST_DOCSIS_COUNT(test_docsis_proto_uplink(12, &docsis_test_case_12));
9835         TEST_DOCSIS_COUNT(test_docsis_proto_uplink(13, &docsis_test_case_13));
9836         TEST_DOCSIS_COUNT(test_docsis_proto_uplink(14, &docsis_test_case_14));
9837         TEST_DOCSIS_COUNT(test_docsis_proto_uplink(15, &docsis_test_case_15));
9838         TEST_DOCSIS_COUNT(test_docsis_proto_uplink(16, &docsis_test_case_16));
9839         TEST_DOCSIS_COUNT(test_docsis_proto_uplink(17, &docsis_test_case_17));
9840         TEST_DOCSIS_COUNT(test_docsis_proto_uplink(18, &docsis_test_case_18));
9841         TEST_DOCSIS_COUNT(test_docsis_proto_uplink(19, &docsis_test_case_19));
9842         TEST_DOCSIS_COUNT(test_docsis_proto_uplink(20, &docsis_test_case_20));
9843         TEST_DOCSIS_COUNT(test_docsis_proto_uplink(21, &docsis_test_case_21));
9844         TEST_DOCSIS_COUNT(test_docsis_proto_uplink(22, &docsis_test_case_22));
9845         TEST_DOCSIS_COUNT(test_docsis_proto_uplink(23, &docsis_test_case_23));
9846         TEST_DOCSIS_COUNT(test_docsis_proto_uplink(24, &docsis_test_case_24));
9847         TEST_DOCSIS_COUNT(test_docsis_proto_uplink(25, &docsis_test_case_25));
9848         TEST_DOCSIS_COUNT(test_docsis_proto_uplink(26, &docsis_test_case_26));
9849
9850         if (f)
9851                 printf("## %s: %d passed out of %d (%d skipped)\n",
9852                         __func__, p, n, s);
9853
9854         return f;
9855 };
9856
9857 static int
9858 test_DOCSIS_PROTO_downlink_all(void)
9859 {
9860         int p = 0, s = 0, f = 0, n = 0;
9861
9862         TEST_DOCSIS_COUNT(test_docsis_proto_downlink(1, &docsis_test_case_1));
9863         TEST_DOCSIS_COUNT(test_docsis_proto_downlink(2, &docsis_test_case_2));
9864         TEST_DOCSIS_COUNT(test_docsis_proto_downlink(3, &docsis_test_case_3));
9865         TEST_DOCSIS_COUNT(test_docsis_proto_downlink(4, &docsis_test_case_4));
9866         TEST_DOCSIS_COUNT(test_docsis_proto_downlink(5, &docsis_test_case_5));
9867         TEST_DOCSIS_COUNT(test_docsis_proto_downlink(6, &docsis_test_case_6));
9868         TEST_DOCSIS_COUNT(test_docsis_proto_downlink(7, &docsis_test_case_7));
9869         TEST_DOCSIS_COUNT(test_docsis_proto_downlink(8, &docsis_test_case_8));
9870         TEST_DOCSIS_COUNT(test_docsis_proto_downlink(9, &docsis_test_case_9));
9871         TEST_DOCSIS_COUNT(test_docsis_proto_downlink(10, &docsis_test_case_10));
9872         TEST_DOCSIS_COUNT(test_docsis_proto_downlink(11, &docsis_test_case_11));
9873         TEST_DOCSIS_COUNT(test_docsis_proto_downlink(12, &docsis_test_case_12));
9874         TEST_DOCSIS_COUNT(test_docsis_proto_downlink(13, &docsis_test_case_13));
9875         TEST_DOCSIS_COUNT(test_docsis_proto_downlink(14, &docsis_test_case_14));
9876         TEST_DOCSIS_COUNT(test_docsis_proto_downlink(15, &docsis_test_case_15));
9877         TEST_DOCSIS_COUNT(test_docsis_proto_downlink(16, &docsis_test_case_16));
9878         TEST_DOCSIS_COUNT(test_docsis_proto_downlink(17, &docsis_test_case_17));
9879         TEST_DOCSIS_COUNT(test_docsis_proto_downlink(18, &docsis_test_case_18));
9880         TEST_DOCSIS_COUNT(test_docsis_proto_downlink(19, &docsis_test_case_19));
9881         TEST_DOCSIS_COUNT(test_docsis_proto_downlink(20, &docsis_test_case_20));
9882         TEST_DOCSIS_COUNT(test_docsis_proto_downlink(21, &docsis_test_case_21));
9883         TEST_DOCSIS_COUNT(test_docsis_proto_downlink(22, &docsis_test_case_22));
9884         TEST_DOCSIS_COUNT(test_docsis_proto_downlink(23, &docsis_test_case_23));
9885         TEST_DOCSIS_COUNT(test_docsis_proto_downlink(24, &docsis_test_case_24));
9886         TEST_DOCSIS_COUNT(test_docsis_proto_downlink(25, &docsis_test_case_25));
9887         TEST_DOCSIS_COUNT(test_docsis_proto_downlink(26, &docsis_test_case_26));
9888
9889         if (f)
9890                 printf("## %s: %d passed out of %d (%d skipped)\n",
9891                         __func__, p, n, s);
9892
9893         return f;
9894 };
9895
9896 static int
9897 test_DOCSIS_PROTO_all(void)
9898 {
9899         struct crypto_testsuite_params *ts_params = &testsuite_params;
9900         struct crypto_unittest_params *ut_params = &unittest_params;
9901         struct rte_cryptodev_info dev_info;
9902         int status;
9903
9904         rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
9905         uint64_t feat_flags = dev_info.feature_flags;
9906
9907         if (!(feat_flags & RTE_CRYPTODEV_FF_SECURITY))
9908                 return TEST_SKIPPED;
9909
9910         /* Set action type */
9911         ut_params->type = gbl_action_type == RTE_SECURITY_ACTION_TYPE_NONE ?
9912                 RTE_SECURITY_ACTION_TYPE_LOOKASIDE_PROTOCOL :
9913                 gbl_action_type;
9914
9915         if (security_proto_supported(ut_params->type,
9916                         RTE_SECURITY_PROTOCOL_DOCSIS) < 0)
9917                 return TEST_SKIPPED;
9918
9919         status = test_DOCSIS_PROTO_uplink_all();
9920         status += test_DOCSIS_PROTO_downlink_all();
9921
9922         if (status)
9923                 return TEST_FAILED;
9924         else
9925                 return TEST_SUCCESS;
9926 }
9927 #endif
9928
9929 static int
9930 test_AES_GCM_authenticated_encryption_test_case_1(void)
9931 {
9932         return test_authenticated_encryption(&gcm_test_case_1);
9933 }
9934
9935 static int
9936 test_AES_GCM_authenticated_encryption_test_case_2(void)
9937 {
9938         return test_authenticated_encryption(&gcm_test_case_2);
9939 }
9940
9941 static int
9942 test_AES_GCM_authenticated_encryption_test_case_3(void)
9943 {
9944         return test_authenticated_encryption(&gcm_test_case_3);
9945 }
9946
9947 static int
9948 test_AES_GCM_authenticated_encryption_test_case_4(void)
9949 {
9950         return test_authenticated_encryption(&gcm_test_case_4);
9951 }
9952
9953 static int
9954 test_AES_GCM_authenticated_encryption_test_case_5(void)
9955 {
9956         return test_authenticated_encryption(&gcm_test_case_5);
9957 }
9958
9959 static int
9960 test_AES_GCM_authenticated_encryption_test_case_6(void)
9961 {
9962         return test_authenticated_encryption(&gcm_test_case_6);
9963 }
9964
9965 static int
9966 test_AES_GCM_authenticated_encryption_test_case_7(void)
9967 {
9968         return test_authenticated_encryption(&gcm_test_case_7);
9969 }
9970
9971 static int
9972 test_AES_GCM_authenticated_encryption_test_case_8(void)
9973 {
9974         return test_authenticated_encryption(&gcm_test_case_8);
9975 }
9976
9977 static int
9978 test_AES_GCM_J0_authenticated_encryption_test_case_1(void)
9979 {
9980         return test_authenticated_encryption(&gcm_J0_test_case_1);
9981 }
9982
9983 static int
9984 test_AES_GCM_auth_encryption_test_case_192_1(void)
9985 {
9986         return test_authenticated_encryption(&gcm_test_case_192_1);
9987 }
9988
9989 static int
9990 test_AES_GCM_auth_encryption_test_case_192_2(void)
9991 {
9992         return test_authenticated_encryption(&gcm_test_case_192_2);
9993 }
9994
9995 static int
9996 test_AES_GCM_auth_encryption_test_case_192_3(void)
9997 {
9998         return test_authenticated_encryption(&gcm_test_case_192_3);
9999 }
10000
10001 static int
10002 test_AES_GCM_auth_encryption_test_case_192_4(void)
10003 {
10004         return test_authenticated_encryption(&gcm_test_case_192_4);
10005 }
10006
10007 static int
10008 test_AES_GCM_auth_encryption_test_case_192_5(void)
10009 {
10010         return test_authenticated_encryption(&gcm_test_case_192_5);
10011 }
10012
10013 static int
10014 test_AES_GCM_auth_encryption_test_case_192_6(void)
10015 {
10016         return test_authenticated_encryption(&gcm_test_case_192_6);
10017 }
10018
10019 static int
10020 test_AES_GCM_auth_encryption_test_case_192_7(void)
10021 {
10022         return test_authenticated_encryption(&gcm_test_case_192_7);
10023 }
10024
10025 static int
10026 test_AES_GCM_auth_encryption_test_case_256_1(void)
10027 {
10028         return test_authenticated_encryption(&gcm_test_case_256_1);
10029 }
10030
10031 static int
10032 test_AES_GCM_auth_encryption_test_case_256_2(void)
10033 {
10034         return test_authenticated_encryption(&gcm_test_case_256_2);
10035 }
10036
10037 static int
10038 test_AES_GCM_auth_encryption_test_case_256_3(void)
10039 {
10040         return test_authenticated_encryption(&gcm_test_case_256_3);
10041 }
10042
10043 static int
10044 test_AES_GCM_auth_encryption_test_case_256_4(void)
10045 {
10046         return test_authenticated_encryption(&gcm_test_case_256_4);
10047 }
10048
10049 static int
10050 test_AES_GCM_auth_encryption_test_case_256_5(void)
10051 {
10052         return test_authenticated_encryption(&gcm_test_case_256_5);
10053 }
10054
10055 static int
10056 test_AES_GCM_auth_encryption_test_case_256_6(void)
10057 {
10058         return test_authenticated_encryption(&gcm_test_case_256_6);
10059 }
10060
10061 static int
10062 test_AES_GCM_auth_encryption_test_case_256_7(void)
10063 {
10064         return test_authenticated_encryption(&gcm_test_case_256_7);
10065 }
10066
10067 static int
10068 test_AES_GCM_auth_encryption_test_case_aad_1(void)
10069 {
10070         return test_authenticated_encryption(&gcm_test_case_aad_1);
10071 }
10072
10073 static int
10074 test_AES_GCM_auth_encryption_test_case_aad_2(void)
10075 {
10076         return test_authenticated_encryption(&gcm_test_case_aad_2);
10077 }
10078
10079 static int
10080 test_AES_GCM_auth_encryption_fail_iv_corrupt(void)
10081 {
10082         struct aead_test_data tdata;
10083         int res;
10084
10085         RTE_LOG(INFO, USER1, "This is a negative test, errors are expected\n");
10086         memcpy(&tdata, &gcm_test_case_7, sizeof(struct aead_test_data));
10087         tdata.iv.data[0] += 1;
10088         res = test_authenticated_encryption(&tdata);
10089         if (res == TEST_SKIPPED)
10090                 return res;
10091         TEST_ASSERT_EQUAL(res, TEST_FAILED, "encryption not failed");
10092         return TEST_SUCCESS;
10093 }
10094
10095 static int
10096 test_AES_GCM_auth_encryption_fail_in_data_corrupt(void)
10097 {
10098         struct aead_test_data tdata;
10099         int res;
10100
10101         RTE_LOG(INFO, USER1, "This is a negative test, errors are expected\n");
10102         memcpy(&tdata, &gcm_test_case_7, sizeof(struct aead_test_data));
10103         tdata.plaintext.data[0] += 1;
10104         res = test_authenticated_encryption(&tdata);
10105         if (res == TEST_SKIPPED)
10106                 return res;
10107         TEST_ASSERT_EQUAL(res, TEST_FAILED, "encryption not failed");
10108         return TEST_SUCCESS;
10109 }
10110
10111 static int
10112 test_AES_GCM_auth_encryption_fail_out_data_corrupt(void)
10113 {
10114         struct aead_test_data tdata;
10115         int res;
10116
10117         RTE_LOG(INFO, USER1, "This is a negative test, errors are expected\n");
10118         memcpy(&tdata, &gcm_test_case_7, sizeof(struct aead_test_data));
10119         tdata.ciphertext.data[0] += 1;
10120         res = test_authenticated_encryption(&tdata);
10121         if (res == TEST_SKIPPED)
10122                 return res;
10123         TEST_ASSERT_EQUAL(res, TEST_FAILED, "encryption not failed");
10124         return TEST_SUCCESS;
10125 }
10126
10127 static int
10128 test_AES_GCM_auth_encryption_fail_aad_len_corrupt(void)
10129 {
10130         struct aead_test_data tdata;
10131         int res;
10132
10133         RTE_LOG(INFO, USER1, "This is a negative test, errors are expected\n");
10134         memcpy(&tdata, &gcm_test_case_7, sizeof(struct aead_test_data));
10135         tdata.aad.len += 1;
10136         res = test_authenticated_encryption(&tdata);
10137         if (res == TEST_SKIPPED)
10138                 return res;
10139         TEST_ASSERT_EQUAL(res, TEST_FAILED, "encryption not failed");
10140         return TEST_SUCCESS;
10141 }
10142
10143 static int
10144 test_AES_GCM_auth_encryption_fail_aad_corrupt(void)
10145 {
10146         struct aead_test_data tdata;
10147         uint8_t aad[gcm_test_case_7.aad.len];
10148         int res;
10149
10150         RTE_LOG(INFO, USER1, "This is a negative test, errors are expected\n");
10151         memcpy(&tdata, &gcm_test_case_7, sizeof(struct aead_test_data));
10152         memcpy(aad, gcm_test_case_7.aad.data, gcm_test_case_7.aad.len);
10153         aad[0] += 1;
10154         tdata.aad.data = aad;
10155         res = test_authenticated_encryption(&tdata);
10156         if (res == TEST_SKIPPED)
10157                 return res;
10158         TEST_ASSERT_EQUAL(res, TEST_FAILED, "encryption not failed");
10159         return TEST_SUCCESS;
10160 }
10161
10162 static int
10163 test_AES_GCM_auth_encryption_fail_tag_corrupt(void)
10164 {
10165         struct aead_test_data tdata;
10166         int res;
10167
10168         RTE_LOG(INFO, USER1, "This is a negative test, errors are expected\n");
10169         memcpy(&tdata, &gcm_test_case_7, sizeof(struct aead_test_data));
10170         tdata.auth_tag.data[0] += 1;
10171         res = test_authenticated_encryption(&tdata);
10172         if (res == TEST_SKIPPED)
10173                 return res;
10174         TEST_ASSERT_EQUAL(res, TEST_FAILED, "encryption not failed");
10175         return TEST_SUCCESS;
10176 }
10177
10178 static int
10179 test_authenticated_decryption(const struct aead_test_data *tdata)
10180 {
10181         struct crypto_testsuite_params *ts_params = &testsuite_params;
10182         struct crypto_unittest_params *ut_params = &unittest_params;
10183
10184         int retval;
10185         uint8_t *plaintext;
10186         uint32_t i;
10187         struct rte_cryptodev_info dev_info;
10188
10189         rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
10190         uint64_t feat_flags = dev_info.feature_flags;
10191
10192         if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
10193                         (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
10194                 printf("Device doesn't support RAW data-path APIs.\n");
10195                 return TEST_SKIPPED;
10196         }
10197
10198         /* Verify the capabilities */
10199         struct rte_cryptodev_sym_capability_idx cap_idx;
10200         const struct rte_cryptodev_symmetric_capability *capability;
10201         cap_idx.type = RTE_CRYPTO_SYM_XFORM_AEAD;
10202         cap_idx.algo.aead = tdata->algo;
10203         capability = rte_cryptodev_sym_capability_get(
10204                         ts_params->valid_devs[0], &cap_idx);
10205         if (capability == NULL)
10206                 return TEST_SKIPPED;
10207         if (rte_cryptodev_sym_capability_check_aead(
10208                         capability, tdata->key.len, tdata->auth_tag.len,
10209                         tdata->aad.len, tdata->iv.len))
10210                 return TEST_SKIPPED;
10211
10212         /* Create AEAD session */
10213         retval = create_aead_session(ts_params->valid_devs[0],
10214                         tdata->algo,
10215                         RTE_CRYPTO_AEAD_OP_DECRYPT,
10216                         tdata->key.data, tdata->key.len,
10217                         tdata->aad.len, tdata->auth_tag.len,
10218                         tdata->iv.len);
10219         if (retval < 0)
10220                 return retval;
10221
10222         /* alloc mbuf and set payload */
10223         if (tdata->aad.len > MBUF_SIZE) {
10224                 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->large_mbuf_pool);
10225                 /* Populate full size of add data */
10226                 for (i = 32; i < MAX_AAD_LENGTH; i += 32)
10227                         memcpy(&tdata->aad.data[i], &tdata->aad.data[0], 32);
10228         } else
10229                 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
10230
10231         memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
10232                         rte_pktmbuf_tailroom(ut_params->ibuf));
10233
10234         /* Create AEAD operation */
10235         retval = create_aead_operation(RTE_CRYPTO_AEAD_OP_DECRYPT, tdata);
10236         if (retval < 0)
10237                 return retval;
10238
10239         rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
10240
10241         ut_params->op->sym->m_src = ut_params->ibuf;
10242
10243         /* Process crypto operation */
10244         if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
10245                 process_cpu_aead_op(ts_params->valid_devs[0], ut_params->op);
10246         else if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
10247                 process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
10248                                 ut_params->op, 0, 0, 0, 0);
10249         else
10250                 TEST_ASSERT_NOT_NULL(
10251                         process_crypto_request(ts_params->valid_devs[0],
10252                         ut_params->op), "failed to process sym crypto op");
10253
10254         TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
10255                         "crypto op processing failed");
10256
10257         if (ut_params->op->sym->m_dst)
10258                 plaintext = rte_pktmbuf_mtod(ut_params->op->sym->m_dst,
10259                                 uint8_t *);
10260         else
10261                 plaintext = rte_pktmbuf_mtod_offset(ut_params->op->sym->m_src,
10262                                 uint8_t *,
10263                                 ut_params->op->sym->cipher.data.offset);
10264
10265         debug_hexdump(stdout, "plaintext:", plaintext, tdata->ciphertext.len);
10266
10267         /* Validate obuf */
10268         TEST_ASSERT_BUFFERS_ARE_EQUAL(
10269                         plaintext,
10270                         tdata->plaintext.data,
10271                         tdata->plaintext.len,
10272                         "Plaintext data not as expected");
10273
10274         TEST_ASSERT_EQUAL(ut_params->op->status,
10275                         RTE_CRYPTO_OP_STATUS_SUCCESS,
10276                         "Authentication failed");
10277
10278         return 0;
10279 }
10280
10281 static int
10282 test_AES_GCM_authenticated_decryption_test_case_1(void)
10283 {
10284         return test_authenticated_decryption(&gcm_test_case_1);
10285 }
10286
10287 static int
10288 test_AES_GCM_authenticated_decryption_test_case_2(void)
10289 {
10290         return test_authenticated_decryption(&gcm_test_case_2);
10291 }
10292
10293 static int
10294 test_AES_GCM_authenticated_decryption_test_case_3(void)
10295 {
10296         return test_authenticated_decryption(&gcm_test_case_3);
10297 }
10298
10299 static int
10300 test_AES_GCM_authenticated_decryption_test_case_4(void)
10301 {
10302         return test_authenticated_decryption(&gcm_test_case_4);
10303 }
10304
10305 static int
10306 test_AES_GCM_authenticated_decryption_test_case_5(void)
10307 {
10308         return test_authenticated_decryption(&gcm_test_case_5);
10309 }
10310
10311 static int
10312 test_AES_GCM_authenticated_decryption_test_case_6(void)
10313 {
10314         return test_authenticated_decryption(&gcm_test_case_6);
10315 }
10316
10317 static int
10318 test_AES_GCM_authenticated_decryption_test_case_7(void)
10319 {
10320         return test_authenticated_decryption(&gcm_test_case_7);
10321 }
10322
10323 static int
10324 test_AES_GCM_authenticated_decryption_test_case_8(void)
10325 {
10326         return test_authenticated_decryption(&gcm_test_case_8);
10327 }
10328
10329 static int
10330 test_AES_GCM_J0_authenticated_decryption_test_case_1(void)
10331 {
10332         return test_authenticated_decryption(&gcm_J0_test_case_1);
10333 }
10334
10335 static int
10336 test_AES_GCM_auth_decryption_test_case_192_1(void)
10337 {
10338         return test_authenticated_decryption(&gcm_test_case_192_1);
10339 }
10340
10341 static int
10342 test_AES_GCM_auth_decryption_test_case_192_2(void)
10343 {
10344         return test_authenticated_decryption(&gcm_test_case_192_2);
10345 }
10346
10347 static int
10348 test_AES_GCM_auth_decryption_test_case_192_3(void)
10349 {
10350         return test_authenticated_decryption(&gcm_test_case_192_3);
10351 }
10352
10353 static int
10354 test_AES_GCM_auth_decryption_test_case_192_4(void)
10355 {
10356         return test_authenticated_decryption(&gcm_test_case_192_4);
10357 }
10358
10359 static int
10360 test_AES_GCM_auth_decryption_test_case_192_5(void)
10361 {
10362         return test_authenticated_decryption(&gcm_test_case_192_5);
10363 }
10364
10365 static int
10366 test_AES_GCM_auth_decryption_test_case_192_6(void)
10367 {
10368         return test_authenticated_decryption(&gcm_test_case_192_6);
10369 }
10370
10371 static int
10372 test_AES_GCM_auth_decryption_test_case_192_7(void)
10373 {
10374         return test_authenticated_decryption(&gcm_test_case_192_7);
10375 }
10376
10377 static int
10378 test_AES_GCM_auth_decryption_test_case_256_1(void)
10379 {
10380         return test_authenticated_decryption(&gcm_test_case_256_1);
10381 }
10382
10383 static int
10384 test_AES_GCM_auth_decryption_test_case_256_2(void)
10385 {
10386         return test_authenticated_decryption(&gcm_test_case_256_2);
10387 }
10388
10389 static int
10390 test_AES_GCM_auth_decryption_test_case_256_3(void)
10391 {
10392         return test_authenticated_decryption(&gcm_test_case_256_3);
10393 }
10394
10395 static int
10396 test_AES_GCM_auth_decryption_test_case_256_4(void)
10397 {
10398         return test_authenticated_decryption(&gcm_test_case_256_4);
10399 }
10400
10401 static int
10402 test_AES_GCM_auth_decryption_test_case_256_5(void)
10403 {
10404         return test_authenticated_decryption(&gcm_test_case_256_5);
10405 }
10406
10407 static int
10408 test_AES_GCM_auth_decryption_test_case_256_6(void)
10409 {
10410         return test_authenticated_decryption(&gcm_test_case_256_6);
10411 }
10412
10413 static int
10414 test_AES_GCM_auth_decryption_test_case_256_7(void)
10415 {
10416         return test_authenticated_decryption(&gcm_test_case_256_7);
10417 }
10418
10419 static int
10420 test_AES_GCM_auth_decryption_test_case_aad_1(void)
10421 {
10422         return test_authenticated_decryption(&gcm_test_case_aad_1);
10423 }
10424
10425 static int
10426 test_AES_GCM_auth_decryption_test_case_aad_2(void)
10427 {
10428         return test_authenticated_decryption(&gcm_test_case_aad_2);
10429 }
10430
10431 static int
10432 test_AES_GCM_auth_decryption_fail_iv_corrupt(void)
10433 {
10434         struct aead_test_data tdata;
10435         int res;
10436
10437         memcpy(&tdata, &gcm_test_case_7, sizeof(struct aead_test_data));
10438         tdata.iv.data[0] += 1;
10439         res = test_authenticated_decryption(&tdata);
10440         if (res == TEST_SKIPPED)
10441                 return res;
10442         TEST_ASSERT_EQUAL(res, TEST_FAILED, "decryption not failed");
10443         return TEST_SUCCESS;
10444 }
10445
10446 static int
10447 test_AES_GCM_auth_decryption_fail_in_data_corrupt(void)
10448 {
10449         struct aead_test_data tdata;
10450         int res;
10451
10452         RTE_LOG(INFO, USER1, "This is a negative test, errors are expected\n");
10453         memcpy(&tdata, &gcm_test_case_7, sizeof(struct aead_test_data));
10454         tdata.plaintext.data[0] += 1;
10455         res = test_authenticated_decryption(&tdata);
10456         if (res == TEST_SKIPPED)
10457                 return res;
10458         TEST_ASSERT_EQUAL(res, TEST_FAILED, "decryption not failed");
10459         return TEST_SUCCESS;
10460 }
10461
10462 static int
10463 test_AES_GCM_auth_decryption_fail_out_data_corrupt(void)
10464 {
10465         struct aead_test_data tdata;
10466         int res;
10467
10468         memcpy(&tdata, &gcm_test_case_7, sizeof(struct aead_test_data));
10469         tdata.ciphertext.data[0] += 1;
10470         res = test_authenticated_decryption(&tdata);
10471         if (res == TEST_SKIPPED)
10472                 return res;
10473         TEST_ASSERT_EQUAL(res, TEST_FAILED, "decryption not failed");
10474         return TEST_SUCCESS;
10475 }
10476
10477 static int
10478 test_AES_GCM_auth_decryption_fail_aad_len_corrupt(void)
10479 {
10480         struct aead_test_data tdata;
10481         int res;
10482
10483         memcpy(&tdata, &gcm_test_case_7, sizeof(struct aead_test_data));
10484         tdata.aad.len += 1;
10485         res = test_authenticated_decryption(&tdata);
10486         if (res == TEST_SKIPPED)
10487                 return res;
10488         TEST_ASSERT_EQUAL(res, TEST_FAILED, "decryption not failed");
10489         return TEST_SUCCESS;
10490 }
10491
10492 static int
10493 test_AES_GCM_auth_decryption_fail_aad_corrupt(void)
10494 {
10495         struct aead_test_data tdata;
10496         uint8_t aad[gcm_test_case_7.aad.len];
10497         int res;
10498
10499         memcpy(&tdata, &gcm_test_case_7, sizeof(struct aead_test_data));
10500         memcpy(aad, gcm_test_case_7.aad.data, gcm_test_case_7.aad.len);
10501         aad[0] += 1;
10502         tdata.aad.data = aad;
10503         res = test_authenticated_decryption(&tdata);
10504         if (res == TEST_SKIPPED)
10505                 return res;
10506         TEST_ASSERT_EQUAL(res, TEST_FAILED, "decryption not failed");
10507         return TEST_SUCCESS;
10508 }
10509
10510 static int
10511 test_AES_GCM_auth_decryption_fail_tag_corrupt(void)
10512 {
10513         struct aead_test_data tdata;
10514         int res;
10515
10516         memcpy(&tdata, &gcm_test_case_7, sizeof(struct aead_test_data));
10517         tdata.auth_tag.data[0] += 1;
10518         res = test_authenticated_decryption(&tdata);
10519         if (res == TEST_SKIPPED)
10520                 return res;
10521         TEST_ASSERT_EQUAL(res, TEST_FAILED, "authentication not failed");
10522         return TEST_SUCCESS;
10523 }
10524
10525 static int
10526 test_authenticated_encryption_oop(const struct aead_test_data *tdata)
10527 {
10528         struct crypto_testsuite_params *ts_params = &testsuite_params;
10529         struct crypto_unittest_params *ut_params = &unittest_params;
10530
10531         int retval;
10532         uint8_t *ciphertext, *auth_tag;
10533         uint16_t plaintext_pad_len;
10534         struct rte_cryptodev_info dev_info;
10535
10536         /* Verify the capabilities */
10537         struct rte_cryptodev_sym_capability_idx cap_idx;
10538         cap_idx.type = RTE_CRYPTO_SYM_XFORM_AEAD;
10539         cap_idx.algo.aead = tdata->algo;
10540         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
10541                         &cap_idx) == NULL)
10542                 return TEST_SKIPPED;
10543
10544         rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
10545         uint64_t feat_flags = dev_info.feature_flags;
10546
10547         if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
10548                         (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP)))
10549                 return TEST_SKIPPED;
10550
10551         /* not supported with CPU crypto */
10552         if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
10553                 return TEST_SKIPPED;
10554
10555         /* Create AEAD session */
10556         retval = create_aead_session(ts_params->valid_devs[0],
10557                         tdata->algo,
10558                         RTE_CRYPTO_AEAD_OP_ENCRYPT,
10559                         tdata->key.data, tdata->key.len,
10560                         tdata->aad.len, tdata->auth_tag.len,
10561                         tdata->iv.len);
10562         if (retval < 0)
10563                 return retval;
10564
10565         ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
10566         ut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
10567
10568         /* clear mbuf payload */
10569         memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
10570                         rte_pktmbuf_tailroom(ut_params->ibuf));
10571         memset(rte_pktmbuf_mtod(ut_params->obuf, uint8_t *), 0,
10572                         rte_pktmbuf_tailroom(ut_params->obuf));
10573
10574         /* Create AEAD operation */
10575         retval = create_aead_operation(RTE_CRYPTO_AEAD_OP_ENCRYPT, tdata);
10576         if (retval < 0)
10577                 return retval;
10578
10579         rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
10580
10581         ut_params->op->sym->m_src = ut_params->ibuf;
10582         ut_params->op->sym->m_dst = ut_params->obuf;
10583
10584         /* Process crypto operation */
10585         if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
10586                 process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
10587                         ut_params->op, 0, 0, 0, 0);
10588         else
10589                 TEST_ASSERT_NOT_NULL(process_crypto_request(ts_params->valid_devs[0],
10590                         ut_params->op), "failed to process sym crypto op");
10591
10592         TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
10593                         "crypto op processing failed");
10594
10595         plaintext_pad_len = RTE_ALIGN_CEIL(tdata->plaintext.len, 16);
10596
10597         ciphertext = rte_pktmbuf_mtod_offset(ut_params->obuf, uint8_t *,
10598                         ut_params->op->sym->cipher.data.offset);
10599         auth_tag = ciphertext + plaintext_pad_len;
10600
10601         debug_hexdump(stdout, "ciphertext:", ciphertext, tdata->ciphertext.len);
10602         debug_hexdump(stdout, "auth tag:", auth_tag, tdata->auth_tag.len);
10603
10604         /* Validate obuf */
10605         TEST_ASSERT_BUFFERS_ARE_EQUAL(
10606                         ciphertext,
10607                         tdata->ciphertext.data,
10608                         tdata->ciphertext.len,
10609                         "Ciphertext data not as expected");
10610
10611         TEST_ASSERT_BUFFERS_ARE_EQUAL(
10612                         auth_tag,
10613                         tdata->auth_tag.data,
10614                         tdata->auth_tag.len,
10615                         "Generated auth tag not as expected");
10616
10617         return 0;
10618
10619 }
10620
10621 static int
10622 test_AES_GCM_authenticated_encryption_oop_test_case_1(void)
10623 {
10624         return test_authenticated_encryption_oop(&gcm_test_case_5);
10625 }
10626
10627 static int
10628 test_authenticated_decryption_oop(const struct aead_test_data *tdata)
10629 {
10630         struct crypto_testsuite_params *ts_params = &testsuite_params;
10631         struct crypto_unittest_params *ut_params = &unittest_params;
10632
10633         int retval;
10634         uint8_t *plaintext;
10635         struct rte_cryptodev_info dev_info;
10636
10637         rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
10638         uint64_t feat_flags = dev_info.feature_flags;
10639
10640         /* Verify the capabilities */
10641         struct rte_cryptodev_sym_capability_idx cap_idx;
10642         cap_idx.type = RTE_CRYPTO_SYM_XFORM_AEAD;
10643         cap_idx.algo.aead = tdata->algo;
10644         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
10645                         &cap_idx) == NULL)
10646                 return TEST_SKIPPED;
10647
10648         /* not supported with CPU crypto and raw data-path APIs*/
10649         if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO ||
10650                         global_api_test_type == CRYPTODEV_RAW_API_TEST)
10651                 return TEST_SKIPPED;
10652
10653         if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
10654                         (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
10655                 printf("Device does not support RAW data-path APIs.\n");
10656                 return TEST_SKIPPED;
10657         }
10658
10659         /* Create AEAD session */
10660         retval = create_aead_session(ts_params->valid_devs[0],
10661                         tdata->algo,
10662                         RTE_CRYPTO_AEAD_OP_DECRYPT,
10663                         tdata->key.data, tdata->key.len,
10664                         tdata->aad.len, tdata->auth_tag.len,
10665                         tdata->iv.len);
10666         if (retval < 0)
10667                 return retval;
10668
10669         /* alloc mbuf and set payload */
10670         ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
10671         ut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
10672
10673         memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
10674                         rte_pktmbuf_tailroom(ut_params->ibuf));
10675         memset(rte_pktmbuf_mtod(ut_params->obuf, uint8_t *), 0,
10676                         rte_pktmbuf_tailroom(ut_params->obuf));
10677
10678         /* Create AEAD operation */
10679         retval = create_aead_operation(RTE_CRYPTO_AEAD_OP_DECRYPT, tdata);
10680         if (retval < 0)
10681                 return retval;
10682
10683         rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
10684
10685         ut_params->op->sym->m_src = ut_params->ibuf;
10686         ut_params->op->sym->m_dst = ut_params->obuf;
10687
10688         /* Process crypto operation */
10689         if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
10690                 process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
10691                                 ut_params->op, 0, 0, 0, 0);
10692         else
10693                 TEST_ASSERT_NOT_NULL(process_crypto_request(ts_params->valid_devs[0],
10694                         ut_params->op), "failed to process sym crypto op");
10695
10696         TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
10697                         "crypto op processing failed");
10698
10699         plaintext = rte_pktmbuf_mtod_offset(ut_params->obuf, uint8_t *,
10700                         ut_params->op->sym->cipher.data.offset);
10701
10702         debug_hexdump(stdout, "plaintext:", plaintext, tdata->ciphertext.len);
10703
10704         /* Validate obuf */
10705         TEST_ASSERT_BUFFERS_ARE_EQUAL(
10706                         plaintext,
10707                         tdata->plaintext.data,
10708                         tdata->plaintext.len,
10709                         "Plaintext data not as expected");
10710
10711         TEST_ASSERT_EQUAL(ut_params->op->status,
10712                         RTE_CRYPTO_OP_STATUS_SUCCESS,
10713                         "Authentication failed");
10714         return 0;
10715 }
10716
10717 static int
10718 test_AES_GCM_authenticated_decryption_oop_test_case_1(void)
10719 {
10720         return test_authenticated_decryption_oop(&gcm_test_case_5);
10721 }
10722
10723 static int
10724 test_authenticated_encryption_sessionless(
10725                 const struct aead_test_data *tdata)
10726 {
10727         struct crypto_testsuite_params *ts_params = &testsuite_params;
10728         struct crypto_unittest_params *ut_params = &unittest_params;
10729
10730         int retval;
10731         uint8_t *ciphertext, *auth_tag;
10732         uint16_t plaintext_pad_len;
10733         uint8_t key[tdata->key.len + 1];
10734         struct rte_cryptodev_info dev_info;
10735
10736         rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
10737         uint64_t feat_flags = dev_info.feature_flags;
10738
10739         if (!(feat_flags & RTE_CRYPTODEV_FF_SYM_SESSIONLESS)) {
10740                 printf("Device doesn't support Sessionless ops.\n");
10741                 return TEST_SKIPPED;
10742         }
10743
10744         /* not supported with CPU crypto */
10745         if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
10746                 return TEST_SKIPPED;
10747
10748         /* Verify the capabilities */
10749         struct rte_cryptodev_sym_capability_idx cap_idx;
10750         cap_idx.type = RTE_CRYPTO_SYM_XFORM_AEAD;
10751         cap_idx.algo.aead = tdata->algo;
10752         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
10753                         &cap_idx) == NULL)
10754                 return TEST_SKIPPED;
10755
10756         ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
10757
10758         /* clear mbuf payload */
10759         memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
10760                         rte_pktmbuf_tailroom(ut_params->ibuf));
10761
10762         /* Create AEAD operation */
10763         retval = create_aead_operation(RTE_CRYPTO_AEAD_OP_ENCRYPT, tdata);
10764         if (retval < 0)
10765                 return retval;
10766
10767         /* Create GCM xform */
10768         memcpy(key, tdata->key.data, tdata->key.len);
10769         retval = create_aead_xform(ut_params->op,
10770                         tdata->algo,
10771                         RTE_CRYPTO_AEAD_OP_ENCRYPT,
10772                         key, tdata->key.len,
10773                         tdata->aad.len, tdata->auth_tag.len,
10774                         tdata->iv.len);
10775         if (retval < 0)
10776                 return retval;
10777
10778         ut_params->op->sym->m_src = ut_params->ibuf;
10779
10780         TEST_ASSERT_EQUAL(ut_params->op->sess_type,
10781                         RTE_CRYPTO_OP_SESSIONLESS,
10782                         "crypto op session type not sessionless");
10783
10784         /* Process crypto operation */
10785         TEST_ASSERT_NOT_NULL(process_crypto_request(ts_params->valid_devs[0],
10786                         ut_params->op), "failed to process sym crypto op");
10787
10788         TEST_ASSERT_NOT_NULL(ut_params->op, "failed crypto process");
10789
10790         TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
10791                         "crypto op status not success");
10792
10793         plaintext_pad_len = RTE_ALIGN_CEIL(tdata->plaintext.len, 16);
10794
10795         ciphertext = rte_pktmbuf_mtod_offset(ut_params->ibuf, uint8_t *,
10796                         ut_params->op->sym->cipher.data.offset);
10797         auth_tag = ciphertext + plaintext_pad_len;
10798
10799         debug_hexdump(stdout, "ciphertext:", ciphertext, tdata->ciphertext.len);
10800         debug_hexdump(stdout, "auth tag:", auth_tag, tdata->auth_tag.len);
10801
10802         /* Validate obuf */
10803         TEST_ASSERT_BUFFERS_ARE_EQUAL(
10804                         ciphertext,
10805                         tdata->ciphertext.data,
10806                         tdata->ciphertext.len,
10807                         "Ciphertext data not as expected");
10808
10809         TEST_ASSERT_BUFFERS_ARE_EQUAL(
10810                         auth_tag,
10811                         tdata->auth_tag.data,
10812                         tdata->auth_tag.len,
10813                         "Generated auth tag not as expected");
10814
10815         return 0;
10816
10817 }
10818
10819 static int
10820 test_AES_GCM_authenticated_encryption_sessionless_test_case_1(void)
10821 {
10822         return test_authenticated_encryption_sessionless(
10823                         &gcm_test_case_5);
10824 }
10825
10826 static int
10827 test_authenticated_decryption_sessionless(
10828                 const struct aead_test_data *tdata)
10829 {
10830         struct crypto_testsuite_params *ts_params = &testsuite_params;
10831         struct crypto_unittest_params *ut_params = &unittest_params;
10832
10833         int retval;
10834         uint8_t *plaintext;
10835         uint8_t key[tdata->key.len + 1];
10836         struct rte_cryptodev_info dev_info;
10837
10838         rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
10839         uint64_t feat_flags = dev_info.feature_flags;
10840
10841         if (!(feat_flags & RTE_CRYPTODEV_FF_SYM_SESSIONLESS)) {
10842                 printf("Device doesn't support Sessionless ops.\n");
10843                 return TEST_SKIPPED;
10844         }
10845
10846         if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
10847                         (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
10848                 printf("Device doesn't support RAW data-path APIs.\n");
10849                 return TEST_SKIPPED;
10850         }
10851
10852         /* not supported with CPU crypto */
10853         if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
10854                 return TEST_SKIPPED;
10855
10856         /* Verify the capabilities */
10857         struct rte_cryptodev_sym_capability_idx cap_idx;
10858         cap_idx.type = RTE_CRYPTO_SYM_XFORM_AEAD;
10859         cap_idx.algo.aead = tdata->algo;
10860         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
10861                         &cap_idx) == NULL)
10862                 return TEST_SKIPPED;
10863
10864         /* alloc mbuf and set payload */
10865         ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
10866
10867         memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
10868                         rte_pktmbuf_tailroom(ut_params->ibuf));
10869
10870         /* Create AEAD operation */
10871         retval = create_aead_operation(RTE_CRYPTO_AEAD_OP_DECRYPT, tdata);
10872         if (retval < 0)
10873                 return retval;
10874
10875         /* Create AEAD xform */
10876         memcpy(key, tdata->key.data, tdata->key.len);
10877         retval = create_aead_xform(ut_params->op,
10878                         tdata->algo,
10879                         RTE_CRYPTO_AEAD_OP_DECRYPT,
10880                         key, tdata->key.len,
10881                         tdata->aad.len, tdata->auth_tag.len,
10882                         tdata->iv.len);
10883         if (retval < 0)
10884                 return retval;
10885
10886         ut_params->op->sym->m_src = ut_params->ibuf;
10887
10888         TEST_ASSERT_EQUAL(ut_params->op->sess_type,
10889                         RTE_CRYPTO_OP_SESSIONLESS,
10890                         "crypto op session type not sessionless");
10891
10892         /* Process crypto operation */
10893         if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
10894                 process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
10895                                 ut_params->op, 0, 0, 0, 0);
10896         else
10897                 TEST_ASSERT_NOT_NULL(process_crypto_request(
10898                         ts_params->valid_devs[0], ut_params->op),
10899                                 "failed to process sym crypto op");
10900
10901         TEST_ASSERT_NOT_NULL(ut_params->op, "failed crypto process");
10902
10903         TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
10904                         "crypto op status not success");
10905
10906         plaintext = rte_pktmbuf_mtod_offset(ut_params->ibuf, uint8_t *,
10907                         ut_params->op->sym->cipher.data.offset);
10908
10909         debug_hexdump(stdout, "plaintext:", plaintext, tdata->ciphertext.len);
10910
10911         /* Validate obuf */
10912         TEST_ASSERT_BUFFERS_ARE_EQUAL(
10913                         plaintext,
10914                         tdata->plaintext.data,
10915                         tdata->plaintext.len,
10916                         "Plaintext data not as expected");
10917
10918         TEST_ASSERT_EQUAL(ut_params->op->status,
10919                         RTE_CRYPTO_OP_STATUS_SUCCESS,
10920                         "Authentication failed");
10921         return 0;
10922 }
10923
10924 static int
10925 test_AES_GCM_authenticated_decryption_sessionless_test_case_1(void)
10926 {
10927         return test_authenticated_decryption_sessionless(
10928                         &gcm_test_case_5);
10929 }
10930
10931 static int
10932 test_AES_CCM_authenticated_encryption_test_case_128_1(void)
10933 {
10934         return test_authenticated_encryption(&ccm_test_case_128_1);
10935 }
10936
10937 static int
10938 test_AES_CCM_authenticated_encryption_test_case_128_2(void)
10939 {
10940         return test_authenticated_encryption(&ccm_test_case_128_2);
10941 }
10942
10943 static int
10944 test_AES_CCM_authenticated_encryption_test_case_128_3(void)
10945 {
10946         return test_authenticated_encryption(&ccm_test_case_128_3);
10947 }
10948
10949 static int
10950 test_AES_CCM_authenticated_decryption_test_case_128_1(void)
10951 {
10952         return test_authenticated_decryption(&ccm_test_case_128_1);
10953 }
10954
10955 static int
10956 test_AES_CCM_authenticated_decryption_test_case_128_2(void)
10957 {
10958         return test_authenticated_decryption(&ccm_test_case_128_2);
10959 }
10960
10961 static int
10962 test_AES_CCM_authenticated_decryption_test_case_128_3(void)
10963 {
10964         return test_authenticated_decryption(&ccm_test_case_128_3);
10965 }
10966
10967 static int
10968 test_AES_CCM_authenticated_encryption_test_case_192_1(void)
10969 {
10970         return test_authenticated_encryption(&ccm_test_case_192_1);
10971 }
10972
10973 static int
10974 test_AES_CCM_authenticated_encryption_test_case_192_2(void)
10975 {
10976         return test_authenticated_encryption(&ccm_test_case_192_2);
10977 }
10978
10979 static int
10980 test_AES_CCM_authenticated_encryption_test_case_192_3(void)
10981 {
10982         return test_authenticated_encryption(&ccm_test_case_192_3);
10983 }
10984
10985 static int
10986 test_AES_CCM_authenticated_decryption_test_case_192_1(void)
10987 {
10988         return test_authenticated_decryption(&ccm_test_case_192_1);
10989 }
10990
10991 static int
10992 test_AES_CCM_authenticated_decryption_test_case_192_2(void)
10993 {
10994         return test_authenticated_decryption(&ccm_test_case_192_2);
10995 }
10996
10997 static int
10998 test_AES_CCM_authenticated_decryption_test_case_192_3(void)
10999 {
11000         return test_authenticated_decryption(&ccm_test_case_192_3);
11001 }
11002
11003 static int
11004 test_AES_CCM_authenticated_encryption_test_case_256_1(void)
11005 {
11006         return test_authenticated_encryption(&ccm_test_case_256_1);
11007 }
11008
11009 static int
11010 test_AES_CCM_authenticated_encryption_test_case_256_2(void)
11011 {
11012         return test_authenticated_encryption(&ccm_test_case_256_2);
11013 }
11014
11015 static int
11016 test_AES_CCM_authenticated_encryption_test_case_256_3(void)
11017 {
11018         return test_authenticated_encryption(&ccm_test_case_256_3);
11019 }
11020
11021 static int
11022 test_AES_CCM_authenticated_decryption_test_case_256_1(void)
11023 {
11024         return test_authenticated_decryption(&ccm_test_case_256_1);
11025 }
11026
11027 static int
11028 test_AES_CCM_authenticated_decryption_test_case_256_2(void)
11029 {
11030         return test_authenticated_decryption(&ccm_test_case_256_2);
11031 }
11032
11033 static int
11034 test_AES_CCM_authenticated_decryption_test_case_256_3(void)
11035 {
11036         return test_authenticated_decryption(&ccm_test_case_256_3);
11037 }
11038
11039 static int
11040 test_stats(void)
11041 {
11042         struct crypto_testsuite_params *ts_params = &testsuite_params;
11043         struct rte_cryptodev_stats stats;
11044
11045         if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
11046                 return TEST_SKIPPED;
11047
11048         /* Verify the capabilities */
11049         struct rte_cryptodev_sym_capability_idx cap_idx;
11050         cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
11051         cap_idx.algo.auth = RTE_CRYPTO_AUTH_SHA1_HMAC;
11052         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
11053                         &cap_idx) == NULL)
11054                 return TEST_SKIPPED;
11055         cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
11056         cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_AES_CBC;
11057         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
11058                         &cap_idx) == NULL)
11059                 return TEST_SKIPPED;
11060
11061         if (rte_cryptodev_stats_get(ts_params->valid_devs[0], &stats)
11062                         == -ENOTSUP)
11063                 return TEST_SKIPPED;
11064
11065         rte_cryptodev_stats_reset(ts_params->valid_devs[0]);
11066         TEST_ASSERT((rte_cryptodev_stats_get(ts_params->valid_devs[0] + 600,
11067                         &stats) == -ENODEV),
11068                 "rte_cryptodev_stats_get invalid dev failed");
11069         TEST_ASSERT((rte_cryptodev_stats_get(ts_params->valid_devs[0], 0) != 0),
11070                 "rte_cryptodev_stats_get invalid Param failed");
11071
11072         /* Test expected values */
11073         test_AES_CBC_HMAC_SHA1_encrypt_digest();
11074         TEST_ASSERT_SUCCESS(rte_cryptodev_stats_get(ts_params->valid_devs[0],
11075                         &stats),
11076                 "rte_cryptodev_stats_get failed");
11077         TEST_ASSERT((stats.enqueued_count == 1),
11078                 "rte_cryptodev_stats_get returned unexpected enqueued stat");
11079         TEST_ASSERT((stats.dequeued_count == 1),
11080                 "rte_cryptodev_stats_get returned unexpected enqueued stat");
11081         TEST_ASSERT((stats.enqueue_err_count == 0),
11082                 "rte_cryptodev_stats_get returned unexpected enqueued stat");
11083         TEST_ASSERT((stats.dequeue_err_count == 0),
11084                 "rte_cryptodev_stats_get returned unexpected enqueued stat");
11085
11086         /* invalid device but should ignore and not reset device stats*/
11087         rte_cryptodev_stats_reset(ts_params->valid_devs[0] + 300);
11088         TEST_ASSERT_SUCCESS(rte_cryptodev_stats_get(ts_params->valid_devs[0],
11089                         &stats),
11090                 "rte_cryptodev_stats_get failed");
11091         TEST_ASSERT((stats.enqueued_count == 1),
11092                 "rte_cryptodev_stats_get returned unexpected enqueued stat");
11093
11094         /* check that a valid reset clears stats */
11095         rte_cryptodev_stats_reset(ts_params->valid_devs[0]);
11096         TEST_ASSERT_SUCCESS(rte_cryptodev_stats_get(ts_params->valid_devs[0],
11097                         &stats),
11098                                           "rte_cryptodev_stats_get failed");
11099         TEST_ASSERT((stats.enqueued_count == 0),
11100                 "rte_cryptodev_stats_get returned unexpected enqueued stat");
11101         TEST_ASSERT((stats.dequeued_count == 0),
11102                 "rte_cryptodev_stats_get returned unexpected enqueued stat");
11103
11104         return TEST_SUCCESS;
11105 }
11106
11107 static int MD5_HMAC_create_session(struct crypto_testsuite_params *ts_params,
11108                                    struct crypto_unittest_params *ut_params,
11109                                    enum rte_crypto_auth_operation op,
11110                                    const struct HMAC_MD5_vector *test_case)
11111 {
11112         uint8_t key[64];
11113
11114         memcpy(key, test_case->key.data, test_case->key.len);
11115
11116         ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;
11117         ut_params->auth_xform.next = NULL;
11118         ut_params->auth_xform.auth.op = op;
11119
11120         ut_params->auth_xform.auth.algo = RTE_CRYPTO_AUTH_MD5_HMAC;
11121
11122         ut_params->auth_xform.auth.digest_length = MD5_DIGEST_LEN;
11123         ut_params->auth_xform.auth.key.length = test_case->key.len;
11124         ut_params->auth_xform.auth.key.data = key;
11125
11126         ut_params->sess = rte_cryptodev_sym_session_create(
11127                         ts_params->session_mpool);
11128
11129         rte_cryptodev_sym_session_init(ts_params->valid_devs[0],
11130                         ut_params->sess, &ut_params->auth_xform,
11131                         ts_params->session_priv_mpool);
11132
11133         if (ut_params->sess == NULL)
11134                 return TEST_FAILED;
11135
11136         ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
11137
11138         memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
11139                         rte_pktmbuf_tailroom(ut_params->ibuf));
11140
11141         return 0;
11142 }
11143
11144 static int MD5_HMAC_create_op(struct crypto_unittest_params *ut_params,
11145                               const struct HMAC_MD5_vector *test_case,
11146                               uint8_t **plaintext)
11147 {
11148         uint16_t plaintext_pad_len;
11149
11150         struct rte_crypto_sym_op *sym_op = ut_params->op->sym;
11151
11152         plaintext_pad_len = RTE_ALIGN_CEIL(test_case->plaintext.len,
11153                                 16);
11154
11155         *plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
11156                         plaintext_pad_len);
11157         memcpy(*plaintext, test_case->plaintext.data,
11158                         test_case->plaintext.len);
11159
11160         sym_op->auth.digest.data = (uint8_t *)rte_pktmbuf_append(
11161                         ut_params->ibuf, MD5_DIGEST_LEN);
11162         TEST_ASSERT_NOT_NULL(sym_op->auth.digest.data,
11163                         "no room to append digest");
11164         sym_op->auth.digest.phys_addr = rte_pktmbuf_iova_offset(
11165                         ut_params->ibuf, plaintext_pad_len);
11166
11167         if (ut_params->auth_xform.auth.op == RTE_CRYPTO_AUTH_OP_VERIFY) {
11168                 rte_memcpy(sym_op->auth.digest.data, test_case->auth_tag.data,
11169                            test_case->auth_tag.len);
11170         }
11171
11172         sym_op->auth.data.offset = 0;
11173         sym_op->auth.data.length = test_case->plaintext.len;
11174
11175         rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
11176         ut_params->op->sym->m_src = ut_params->ibuf;
11177
11178         return 0;
11179 }
11180
11181 static int
11182 test_MD5_HMAC_generate(const struct HMAC_MD5_vector *test_case)
11183 {
11184         uint16_t plaintext_pad_len;
11185         uint8_t *plaintext, *auth_tag;
11186
11187         struct crypto_testsuite_params *ts_params = &testsuite_params;
11188         struct crypto_unittest_params *ut_params = &unittest_params;
11189         struct rte_cryptodev_info dev_info;
11190
11191         rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
11192         uint64_t feat_flags = dev_info.feature_flags;
11193
11194         if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
11195                         (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
11196                 printf("Device doesn't support RAW data-path APIs.\n");
11197                 return TEST_SKIPPED;
11198         }
11199
11200         /* Verify the capabilities */
11201         struct rte_cryptodev_sym_capability_idx cap_idx;
11202         cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
11203         cap_idx.algo.auth = RTE_CRYPTO_AUTH_MD5_HMAC;
11204         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
11205                         &cap_idx) == NULL)
11206                 return TEST_SKIPPED;
11207
11208         if (MD5_HMAC_create_session(ts_params, ut_params,
11209                         RTE_CRYPTO_AUTH_OP_GENERATE, test_case))
11210                 return TEST_FAILED;
11211
11212         /* Generate Crypto op data structure */
11213         ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
11214                         RTE_CRYPTO_OP_TYPE_SYMMETRIC);
11215         TEST_ASSERT_NOT_NULL(ut_params->op,
11216                         "Failed to allocate symmetric crypto operation struct");
11217
11218         plaintext_pad_len = RTE_ALIGN_CEIL(test_case->plaintext.len,
11219                                 16);
11220
11221         if (MD5_HMAC_create_op(ut_params, test_case, &plaintext))
11222                 return TEST_FAILED;
11223
11224         if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
11225                 process_cpu_crypt_auth_op(ts_params->valid_devs[0],
11226                         ut_params->op);
11227         else if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
11228                 process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
11229                                 ut_params->op, 0, 1, 0, 0);
11230         else
11231                 TEST_ASSERT_NOT_NULL(
11232                         process_crypto_request(ts_params->valid_devs[0],
11233                                 ut_params->op),
11234                                 "failed to process sym crypto op");
11235
11236         TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
11237                         "crypto op processing failed");
11238
11239         if (ut_params->op->sym->m_dst) {
11240                 auth_tag = rte_pktmbuf_mtod_offset(ut_params->op->sym->m_dst,
11241                                 uint8_t *, plaintext_pad_len);
11242         } else {
11243                 auth_tag = plaintext + plaintext_pad_len;
11244         }
11245
11246         TEST_ASSERT_BUFFERS_ARE_EQUAL(
11247                         auth_tag,
11248                         test_case->auth_tag.data,
11249                         test_case->auth_tag.len,
11250                         "HMAC_MD5 generated tag not as expected");
11251
11252         return TEST_SUCCESS;
11253 }
11254
11255 static int
11256 test_MD5_HMAC_verify(const struct HMAC_MD5_vector *test_case)
11257 {
11258         uint8_t *plaintext;
11259
11260         struct crypto_testsuite_params *ts_params = &testsuite_params;
11261         struct crypto_unittest_params *ut_params = &unittest_params;
11262         struct rte_cryptodev_info dev_info;
11263
11264         rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
11265         uint64_t feat_flags = dev_info.feature_flags;
11266
11267         if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
11268                         (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
11269                 printf("Device doesn't support RAW data-path APIs.\n");
11270                 return TEST_SKIPPED;
11271         }
11272
11273         /* Verify the capabilities */
11274         struct rte_cryptodev_sym_capability_idx cap_idx;
11275         cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
11276         cap_idx.algo.auth = RTE_CRYPTO_AUTH_MD5_HMAC;
11277         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
11278                         &cap_idx) == NULL)
11279                 return TEST_SKIPPED;
11280
11281         if (MD5_HMAC_create_session(ts_params, ut_params,
11282                         RTE_CRYPTO_AUTH_OP_VERIFY, test_case)) {
11283                 return TEST_FAILED;
11284         }
11285
11286         /* Generate Crypto op data structure */
11287         ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
11288                         RTE_CRYPTO_OP_TYPE_SYMMETRIC);
11289         TEST_ASSERT_NOT_NULL(ut_params->op,
11290                         "Failed to allocate symmetric crypto operation struct");
11291
11292         if (MD5_HMAC_create_op(ut_params, test_case, &plaintext))
11293                 return TEST_FAILED;
11294
11295         if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
11296                 process_cpu_crypt_auth_op(ts_params->valid_devs[0],
11297                         ut_params->op);
11298         else if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
11299                 process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
11300                                 ut_params->op, 0, 1, 0, 0);
11301         else
11302                 TEST_ASSERT_NOT_NULL(
11303                         process_crypto_request(ts_params->valid_devs[0],
11304                                 ut_params->op),
11305                                 "failed to process sym crypto op");
11306
11307         TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
11308                         "HMAC_MD5 crypto op processing failed");
11309
11310         return TEST_SUCCESS;
11311 }
11312
11313 static int
11314 test_MD5_HMAC_generate_case_1(void)
11315 {
11316         return test_MD5_HMAC_generate(&HMAC_MD5_test_case_1);
11317 }
11318
11319 static int
11320 test_MD5_HMAC_verify_case_1(void)
11321 {
11322         return test_MD5_HMAC_verify(&HMAC_MD5_test_case_1);
11323 }
11324
11325 static int
11326 test_MD5_HMAC_generate_case_2(void)
11327 {
11328         return test_MD5_HMAC_generate(&HMAC_MD5_test_case_2);
11329 }
11330
11331 static int
11332 test_MD5_HMAC_verify_case_2(void)
11333 {
11334         return test_MD5_HMAC_verify(&HMAC_MD5_test_case_2);
11335 }
11336
11337 static int
11338 test_multi_session(void)
11339 {
11340         struct crypto_testsuite_params *ts_params = &testsuite_params;
11341         struct crypto_unittest_params *ut_params = &unittest_params;
11342
11343         struct rte_cryptodev_info dev_info;
11344         struct rte_cryptodev_sym_session **sessions;
11345
11346         uint16_t i;
11347
11348         /* Verify the capabilities */
11349         struct rte_cryptodev_sym_capability_idx cap_idx;
11350         cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
11351         cap_idx.algo.auth = RTE_CRYPTO_AUTH_SHA512_HMAC;
11352         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
11353                         &cap_idx) == NULL)
11354                 return TEST_SKIPPED;
11355         cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
11356         cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_AES_CBC;
11357         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
11358                         &cap_idx) == NULL)
11359                 return TEST_SKIPPED;
11360
11361         test_AES_CBC_HMAC_SHA512_decrypt_create_session_params(ut_params,
11362                         aes_cbc_key, hmac_sha512_key);
11363
11364
11365         rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
11366
11367         sessions = rte_malloc(NULL,
11368                         sizeof(struct rte_cryptodev_sym_session *) *
11369                         (MAX_NB_SESSIONS + 1), 0);
11370
11371         /* Create multiple crypto sessions*/
11372         for (i = 0; i < MAX_NB_SESSIONS; i++) {
11373
11374                 sessions[i] = rte_cryptodev_sym_session_create(
11375                                 ts_params->session_mpool);
11376
11377                 rte_cryptodev_sym_session_init(ts_params->valid_devs[0],
11378                                 sessions[i], &ut_params->auth_xform,
11379                                 ts_params->session_priv_mpool);
11380                 TEST_ASSERT_NOT_NULL(sessions[i],
11381                                 "Session creation failed at session number %u",
11382                                 i);
11383
11384                 /* Attempt to send a request on each session */
11385                 TEST_ASSERT_SUCCESS( test_AES_CBC_HMAC_SHA512_decrypt_perform(
11386                         sessions[i],
11387                         ut_params,
11388                         ts_params,
11389                         catch_22_quote_2_512_bytes_AES_CBC_ciphertext,
11390                         catch_22_quote_2_512_bytes_AES_CBC_HMAC_SHA512_digest,
11391                         aes_cbc_iv),
11392                         "Failed to perform decrypt on request number %u.", i);
11393                 /* free crypto operation structure */
11394                 if (ut_params->op)
11395                         rte_crypto_op_free(ut_params->op);
11396
11397                 /*
11398                  * free mbuf - both obuf and ibuf are usually the same,
11399                  * so check if they point at the same address is necessary,
11400                  * to avoid freeing the mbuf twice.
11401                  */
11402                 if (ut_params->obuf) {
11403                         rte_pktmbuf_free(ut_params->obuf);
11404                         if (ut_params->ibuf == ut_params->obuf)
11405                                 ut_params->ibuf = 0;
11406                         ut_params->obuf = 0;
11407                 }
11408                 if (ut_params->ibuf) {
11409                         rte_pktmbuf_free(ut_params->ibuf);
11410                         ut_params->ibuf = 0;
11411                 }
11412         }
11413
11414         sessions[i] = NULL;
11415         /* Next session create should fail */
11416         rte_cryptodev_sym_session_init(ts_params->valid_devs[0],
11417                         sessions[i], &ut_params->auth_xform,
11418                         ts_params->session_priv_mpool);
11419         TEST_ASSERT_NULL(sessions[i],
11420                         "Session creation succeeded unexpectedly!");
11421
11422         for (i = 0; i < MAX_NB_SESSIONS; i++) {
11423                 rte_cryptodev_sym_session_clear(ts_params->valid_devs[0],
11424                                 sessions[i]);
11425                 rte_cryptodev_sym_session_free(sessions[i]);
11426         }
11427
11428         rte_free(sessions);
11429
11430         return TEST_SUCCESS;
11431 }
11432
11433 struct multi_session_params {
11434         struct crypto_unittest_params ut_params;
11435         uint8_t *cipher_key;
11436         uint8_t *hmac_key;
11437         const uint8_t *cipher;
11438         const uint8_t *digest;
11439         uint8_t *iv;
11440 };
11441
11442 #define MB_SESSION_NUMBER 3
11443
11444 static int
11445 test_multi_session_random_usage(void)
11446 {
11447         struct crypto_testsuite_params *ts_params = &testsuite_params;
11448         struct rte_cryptodev_info dev_info;
11449         struct rte_cryptodev_sym_session **sessions;
11450         uint32_t i, j;
11451         struct multi_session_params ut_paramz[] = {
11452
11453                 {
11454                         .cipher_key = ms_aes_cbc_key0,
11455                         .hmac_key = ms_hmac_key0,
11456                         .cipher = ms_aes_cbc_cipher0,
11457                         .digest = ms_hmac_digest0,
11458                         .iv = ms_aes_cbc_iv0
11459                 },
11460                 {
11461                         .cipher_key = ms_aes_cbc_key1,
11462                         .hmac_key = ms_hmac_key1,
11463                         .cipher = ms_aes_cbc_cipher1,
11464                         .digest = ms_hmac_digest1,
11465                         .iv = ms_aes_cbc_iv1
11466                 },
11467                 {
11468                         .cipher_key = ms_aes_cbc_key2,
11469                         .hmac_key = ms_hmac_key2,
11470                         .cipher = ms_aes_cbc_cipher2,
11471                         .digest = ms_hmac_digest2,
11472                         .iv = ms_aes_cbc_iv2
11473                 },
11474
11475         };
11476
11477         /* Verify the capabilities */
11478         struct rte_cryptodev_sym_capability_idx cap_idx;
11479         cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
11480         cap_idx.algo.auth = RTE_CRYPTO_AUTH_SHA512_HMAC;
11481         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
11482                         &cap_idx) == NULL)
11483                 return TEST_SKIPPED;
11484         cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
11485         cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_AES_CBC;
11486         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
11487                         &cap_idx) == NULL)
11488                 return TEST_SKIPPED;
11489
11490         rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
11491
11492         sessions = rte_malloc(NULL,
11493                         (sizeof(struct rte_cryptodev_sym_session *)
11494                                         * MAX_NB_SESSIONS) + 1, 0);
11495
11496         for (i = 0; i < MB_SESSION_NUMBER; i++) {
11497                 sessions[i] = rte_cryptodev_sym_session_create(
11498                                 ts_params->session_mpool);
11499
11500                 rte_memcpy(&ut_paramz[i].ut_params, &unittest_params,
11501                                 sizeof(struct crypto_unittest_params));
11502
11503                 test_AES_CBC_HMAC_SHA512_decrypt_create_session_params(
11504                                 &ut_paramz[i].ut_params,
11505                                 ut_paramz[i].cipher_key, ut_paramz[i].hmac_key);
11506
11507                 /* Create multiple crypto sessions*/
11508                 rte_cryptodev_sym_session_init(
11509                                 ts_params->valid_devs[0],
11510                                 sessions[i],
11511                                 &ut_paramz[i].ut_params.auth_xform,
11512                                 ts_params->session_priv_mpool);
11513
11514                 TEST_ASSERT_NOT_NULL(sessions[i],
11515                                 "Session creation failed at session number %u",
11516                                 i);
11517
11518         }
11519
11520         srand(time(NULL));
11521         for (i = 0; i < 40000; i++) {
11522
11523                 j = rand() % MB_SESSION_NUMBER;
11524
11525                 TEST_ASSERT_SUCCESS(
11526                         test_AES_CBC_HMAC_SHA512_decrypt_perform(
11527                                         sessions[j],
11528                                         &ut_paramz[j].ut_params,
11529                                         ts_params, ut_paramz[j].cipher,
11530                                         ut_paramz[j].digest,
11531                                         ut_paramz[j].iv),
11532                         "Failed to perform decrypt on request number %u.", i);
11533
11534                 if (ut_paramz[j].ut_params.op)
11535                         rte_crypto_op_free(ut_paramz[j].ut_params.op);
11536
11537                 /*
11538                  * free mbuf - both obuf and ibuf are usually the same,
11539                  * so check if they point at the same address is necessary,
11540                  * to avoid freeing the mbuf twice.
11541                  */
11542                 if (ut_paramz[j].ut_params.obuf) {
11543                         rte_pktmbuf_free(ut_paramz[j].ut_params.obuf);
11544                         if (ut_paramz[j].ut_params.ibuf
11545                                         == ut_paramz[j].ut_params.obuf)
11546                                 ut_paramz[j].ut_params.ibuf = 0;
11547                         ut_paramz[j].ut_params.obuf = 0;
11548                 }
11549                 if (ut_paramz[j].ut_params.ibuf) {
11550                         rte_pktmbuf_free(ut_paramz[j].ut_params.ibuf);
11551                         ut_paramz[j].ut_params.ibuf = 0;
11552                 }
11553         }
11554
11555         for (i = 0; i < MB_SESSION_NUMBER; i++) {
11556                 rte_cryptodev_sym_session_clear(ts_params->valid_devs[0],
11557                                 sessions[i]);
11558                 rte_cryptodev_sym_session_free(sessions[i]);
11559         }
11560
11561         rte_free(sessions);
11562
11563         return TEST_SUCCESS;
11564 }
11565
11566 uint8_t orig_data[] = {0xab, 0xab, 0xab, 0xab,
11567                         0xab, 0xab, 0xab, 0xab,
11568                         0xab, 0xab, 0xab, 0xab,
11569                         0xab, 0xab, 0xab, 0xab};
11570
11571 static int
11572 test_null_invalid_operation(void)
11573 {
11574         struct crypto_testsuite_params *ts_params = &testsuite_params;
11575         struct crypto_unittest_params *ut_params = &unittest_params;
11576         int ret;
11577
11578         /* This test is for NULL PMD only */
11579         if (gbl_driver_id != rte_cryptodev_driver_id_get(
11580                         RTE_STR(CRYPTODEV_NAME_NULL_PMD)))
11581                 return TEST_SKIPPED;
11582
11583         /* Setup Cipher Parameters */
11584         ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
11585         ut_params->cipher_xform.next = NULL;
11586
11587         ut_params->cipher_xform.cipher.algo = RTE_CRYPTO_CIPHER_AES_CBC;
11588         ut_params->cipher_xform.cipher.op = RTE_CRYPTO_CIPHER_OP_ENCRYPT;
11589
11590         ut_params->sess = rte_cryptodev_sym_session_create(
11591                         ts_params->session_mpool);
11592
11593         /* Create Crypto session*/
11594         ret = rte_cryptodev_sym_session_init(ts_params->valid_devs[0],
11595                         ut_params->sess, &ut_params->cipher_xform,
11596                         ts_params->session_priv_mpool);
11597         TEST_ASSERT(ret < 0,
11598                         "Session creation succeeded unexpectedly");
11599
11600
11601         /* Setup HMAC Parameters */
11602         ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;
11603         ut_params->auth_xform.next = NULL;
11604
11605         ut_params->auth_xform.auth.algo = RTE_CRYPTO_AUTH_SHA1_HMAC;
11606         ut_params->auth_xform.auth.op = RTE_CRYPTO_AUTH_OP_GENERATE;
11607
11608         ut_params->sess = rte_cryptodev_sym_session_create(
11609                         ts_params->session_mpool);
11610
11611         /* Create Crypto session*/
11612         ret = rte_cryptodev_sym_session_init(ts_params->valid_devs[0],
11613                         ut_params->sess, &ut_params->auth_xform,
11614                         ts_params->session_priv_mpool);
11615         TEST_ASSERT(ret < 0,
11616                         "Session creation succeeded unexpectedly");
11617
11618         return TEST_SUCCESS;
11619 }
11620
11621
11622 #define NULL_BURST_LENGTH (32)
11623
11624 static int
11625 test_null_burst_operation(void)
11626 {
11627         struct crypto_testsuite_params *ts_params = &testsuite_params;
11628         struct crypto_unittest_params *ut_params = &unittest_params;
11629
11630         unsigned i, burst_len = NULL_BURST_LENGTH;
11631
11632         struct rte_crypto_op *burst[NULL_BURST_LENGTH] = { NULL };
11633         struct rte_crypto_op *burst_dequeued[NULL_BURST_LENGTH] = { NULL };
11634
11635         /* This test is for NULL PMD only */
11636         if (gbl_driver_id != rte_cryptodev_driver_id_get(
11637                         RTE_STR(CRYPTODEV_NAME_NULL_PMD)))
11638                 return TEST_SKIPPED;
11639
11640         /* Setup Cipher Parameters */
11641         ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
11642         ut_params->cipher_xform.next = &ut_params->auth_xform;
11643
11644         ut_params->cipher_xform.cipher.algo = RTE_CRYPTO_CIPHER_NULL;
11645         ut_params->cipher_xform.cipher.op = RTE_CRYPTO_CIPHER_OP_ENCRYPT;
11646
11647         /* Setup HMAC Parameters */
11648         ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;
11649         ut_params->auth_xform.next = NULL;
11650
11651         ut_params->auth_xform.auth.algo = RTE_CRYPTO_AUTH_NULL;
11652         ut_params->auth_xform.auth.op = RTE_CRYPTO_AUTH_OP_GENERATE;
11653
11654         ut_params->sess = rte_cryptodev_sym_session_create(
11655                         ts_params->session_mpool);
11656
11657         /* Create Crypto session*/
11658         rte_cryptodev_sym_session_init(ts_params->valid_devs[0],
11659                         ut_params->sess, &ut_params->cipher_xform,
11660                         ts_params->session_priv_mpool);
11661         TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed");
11662
11663         TEST_ASSERT_EQUAL(rte_crypto_op_bulk_alloc(ts_params->op_mpool,
11664                         RTE_CRYPTO_OP_TYPE_SYMMETRIC, burst, burst_len),
11665                         burst_len, "failed to generate burst of crypto ops");
11666
11667         /* Generate an operation for each mbuf in burst */
11668         for (i = 0; i < burst_len; i++) {
11669                 struct rte_mbuf *m = rte_pktmbuf_alloc(ts_params->mbuf_pool);
11670
11671                 TEST_ASSERT_NOT_NULL(m, "Failed to allocate mbuf");
11672
11673                 unsigned *data = (unsigned *)rte_pktmbuf_append(m,
11674                                 sizeof(unsigned));
11675                 *data = i;
11676
11677                 rte_crypto_op_attach_sym_session(burst[i], ut_params->sess);
11678
11679                 burst[i]->sym->m_src = m;
11680         }
11681
11682         /* Process crypto operation */
11683         TEST_ASSERT_EQUAL(rte_cryptodev_enqueue_burst(ts_params->valid_devs[0],
11684                         0, burst, burst_len),
11685                         burst_len,
11686                         "Error enqueuing burst");
11687
11688         TEST_ASSERT_EQUAL(rte_cryptodev_dequeue_burst(ts_params->valid_devs[0],
11689                         0, burst_dequeued, burst_len),
11690                         burst_len,
11691                         "Error dequeuing burst");
11692
11693
11694         for (i = 0; i < burst_len; i++) {
11695                 TEST_ASSERT_EQUAL(
11696                         *rte_pktmbuf_mtod(burst[i]->sym->m_src, uint32_t *),
11697                         *rte_pktmbuf_mtod(burst_dequeued[i]->sym->m_src,
11698                                         uint32_t *),
11699                         "data not as expected");
11700
11701                 rte_pktmbuf_free(burst[i]->sym->m_src);
11702                 rte_crypto_op_free(burst[i]);
11703         }
11704
11705         return TEST_SUCCESS;
11706 }
11707
11708 static uint16_t
11709 test_enq_callback(uint16_t dev_id, uint16_t qp_id, struct rte_crypto_op **ops,
11710                   uint16_t nb_ops, void *user_param)
11711 {
11712         RTE_SET_USED(dev_id);
11713         RTE_SET_USED(qp_id);
11714         RTE_SET_USED(ops);
11715         RTE_SET_USED(user_param);
11716
11717         printf("crypto enqueue callback called\n");
11718         return nb_ops;
11719 }
11720
11721 static uint16_t
11722 test_deq_callback(uint16_t dev_id, uint16_t qp_id, struct rte_crypto_op **ops,
11723                   uint16_t nb_ops, void *user_param)
11724 {
11725         RTE_SET_USED(dev_id);
11726         RTE_SET_USED(qp_id);
11727         RTE_SET_USED(ops);
11728         RTE_SET_USED(user_param);
11729
11730         printf("crypto dequeue callback called\n");
11731         return nb_ops;
11732 }
11733
11734 /*
11735  * Thread using enqueue/dequeue callback with RCU.
11736  */
11737 static int
11738 test_enqdeq_callback_thread(void *arg)
11739 {
11740         RTE_SET_USED(arg);
11741         /* DP thread calls rte_cryptodev_enqueue_burst()/
11742          * rte_cryptodev_dequeue_burst() and invokes callback.
11743          */
11744         test_null_burst_operation();
11745         return 0;
11746 }
11747
11748 static int
11749 test_enq_callback_setup(void)
11750 {
11751         struct crypto_testsuite_params *ts_params = &testsuite_params;
11752         struct rte_cryptodev_info dev_info;
11753         struct rte_cryptodev_qp_conf qp_conf = {
11754                 .nb_descriptors = MAX_NUM_OPS_INFLIGHT
11755         };
11756
11757         struct rte_cryptodev_cb *cb;
11758         uint16_t qp_id = 0;
11759
11760         /* Stop the device in case it's started so it can be configured */
11761         rte_cryptodev_stop(ts_params->valid_devs[0]);
11762
11763         rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
11764
11765         TEST_ASSERT_SUCCESS(rte_cryptodev_configure(ts_params->valid_devs[0],
11766                         &ts_params->conf),
11767                         "Failed to configure cryptodev %u",
11768                         ts_params->valid_devs[0]);
11769
11770         qp_conf.nb_descriptors = MAX_NUM_OPS_INFLIGHT;
11771         qp_conf.mp_session = ts_params->session_mpool;
11772         qp_conf.mp_session_private = ts_params->session_priv_mpool;
11773
11774         TEST_ASSERT_SUCCESS(rte_cryptodev_queue_pair_setup(
11775                         ts_params->valid_devs[0], qp_id, &qp_conf,
11776                         rte_cryptodev_socket_id(ts_params->valid_devs[0])),
11777                         "Failed test for "
11778                         "rte_cryptodev_queue_pair_setup: num_inflights "
11779                         "%u on qp %u on cryptodev %u",
11780                         qp_conf.nb_descriptors, qp_id,
11781                         ts_params->valid_devs[0]);
11782
11783         /* Test with invalid crypto device */
11784         cb = rte_cryptodev_add_enq_callback(RTE_CRYPTO_MAX_DEVS,
11785                         qp_id, test_enq_callback, NULL);
11786         TEST_ASSERT_NULL(cb, "Add callback on qp %u on "
11787                         "cryptodev %u did not fail",
11788                         qp_id, RTE_CRYPTO_MAX_DEVS);
11789
11790         /* Test with invalid queue pair */
11791         cb = rte_cryptodev_add_enq_callback(ts_params->valid_devs[0],
11792                         dev_info.max_nb_queue_pairs + 1,
11793                         test_enq_callback, NULL);
11794         TEST_ASSERT_NULL(cb, "Add callback on qp %u on "
11795                         "cryptodev %u did not fail",
11796                         dev_info.max_nb_queue_pairs + 1,
11797                         ts_params->valid_devs[0]);
11798
11799         /* Test with NULL callback */
11800         cb = rte_cryptodev_add_enq_callback(ts_params->valid_devs[0],
11801                         qp_id, NULL, NULL);
11802         TEST_ASSERT_NULL(cb, "Add callback on qp %u on "
11803                         "cryptodev %u did not fail",
11804                         qp_id, ts_params->valid_devs[0]);
11805
11806         /* Test with valid configuration */
11807         cb = rte_cryptodev_add_enq_callback(ts_params->valid_devs[0],
11808                         qp_id, test_enq_callback, NULL);
11809         TEST_ASSERT_NOT_NULL(cb, "Failed test to add callback on "
11810                         "qp %u on cryptodev %u",
11811                         qp_id, ts_params->valid_devs[0]);
11812
11813         rte_cryptodev_start(ts_params->valid_devs[0]);
11814
11815         /* Launch a thread */
11816         rte_eal_remote_launch(test_enqdeq_callback_thread, NULL,
11817                                 rte_get_next_lcore(-1, 1, 0));
11818
11819         /* Wait until reader exited. */
11820         rte_eal_mp_wait_lcore();
11821
11822         /* Test with invalid crypto device */
11823         TEST_ASSERT_FAIL(rte_cryptodev_remove_enq_callback(
11824                         RTE_CRYPTO_MAX_DEVS, qp_id, cb),
11825                         "Expected call to fail as crypto device is invalid");
11826
11827         /* Test with invalid queue pair */
11828         TEST_ASSERT_FAIL(rte_cryptodev_remove_enq_callback(
11829                         ts_params->valid_devs[0],
11830                         dev_info.max_nb_queue_pairs + 1, cb),
11831                         "Expected call to fail as queue pair is invalid");
11832
11833         /* Test with NULL callback */
11834         TEST_ASSERT_FAIL(rte_cryptodev_remove_enq_callback(
11835                         ts_params->valid_devs[0], qp_id, NULL),
11836                         "Expected call to fail as callback is NULL");
11837
11838         /* Test with valid configuration */
11839         TEST_ASSERT_SUCCESS(rte_cryptodev_remove_enq_callback(
11840                         ts_params->valid_devs[0], qp_id, cb),
11841                         "Failed test to remove callback on "
11842                         "qp %u on cryptodev %u",
11843                         qp_id, ts_params->valid_devs[0]);
11844
11845         return TEST_SUCCESS;
11846 }
11847
11848 static int
11849 test_deq_callback_setup(void)
11850 {
11851         struct crypto_testsuite_params *ts_params = &testsuite_params;
11852         struct rte_cryptodev_info dev_info;
11853         struct rte_cryptodev_qp_conf qp_conf = {
11854                 .nb_descriptors = MAX_NUM_OPS_INFLIGHT
11855         };
11856
11857         struct rte_cryptodev_cb *cb;
11858         uint16_t qp_id = 0;
11859
11860         /* Stop the device in case it's started so it can be configured */
11861         rte_cryptodev_stop(ts_params->valid_devs[0]);
11862
11863         rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
11864
11865         TEST_ASSERT_SUCCESS(rte_cryptodev_configure(ts_params->valid_devs[0],
11866                         &ts_params->conf),
11867                         "Failed to configure cryptodev %u",
11868                         ts_params->valid_devs[0]);
11869
11870         qp_conf.nb_descriptors = MAX_NUM_OPS_INFLIGHT;
11871         qp_conf.mp_session = ts_params->session_mpool;
11872         qp_conf.mp_session_private = ts_params->session_priv_mpool;
11873
11874         TEST_ASSERT_SUCCESS(rte_cryptodev_queue_pair_setup(
11875                         ts_params->valid_devs[0], qp_id, &qp_conf,
11876                         rte_cryptodev_socket_id(ts_params->valid_devs[0])),
11877                         "Failed test for "
11878                         "rte_cryptodev_queue_pair_setup: num_inflights "
11879                         "%u on qp %u on cryptodev %u",
11880                         qp_conf.nb_descriptors, qp_id,
11881                         ts_params->valid_devs[0]);
11882
11883         /* Test with invalid crypto device */
11884         cb = rte_cryptodev_add_deq_callback(RTE_CRYPTO_MAX_DEVS,
11885                         qp_id, test_deq_callback, NULL);
11886         TEST_ASSERT_NULL(cb, "Add callback on qp %u on "
11887                         "cryptodev %u did not fail",
11888                         qp_id, RTE_CRYPTO_MAX_DEVS);
11889
11890         /* Test with invalid queue pair */
11891         cb = rte_cryptodev_add_deq_callback(ts_params->valid_devs[0],
11892                         dev_info.max_nb_queue_pairs + 1,
11893                         test_deq_callback, NULL);
11894         TEST_ASSERT_NULL(cb, "Add callback on qp %u on "
11895                         "cryptodev %u did not fail",
11896                         dev_info.max_nb_queue_pairs + 1,
11897                         ts_params->valid_devs[0]);
11898
11899         /* Test with NULL callback */
11900         cb = rte_cryptodev_add_deq_callback(ts_params->valid_devs[0],
11901                         qp_id, NULL, NULL);
11902         TEST_ASSERT_NULL(cb, "Add callback on qp %u on "
11903                         "cryptodev %u did not fail",
11904                         qp_id, ts_params->valid_devs[0]);
11905
11906         /* Test with valid configuration */
11907         cb = rte_cryptodev_add_deq_callback(ts_params->valid_devs[0],
11908                         qp_id, test_deq_callback, NULL);
11909         TEST_ASSERT_NOT_NULL(cb, "Failed test to add callback on "
11910                         "qp %u on cryptodev %u",
11911                         qp_id, ts_params->valid_devs[0]);
11912
11913         rte_cryptodev_start(ts_params->valid_devs[0]);
11914
11915         /* Launch a thread */
11916         rte_eal_remote_launch(test_enqdeq_callback_thread, NULL,
11917                                 rte_get_next_lcore(-1, 1, 0));
11918
11919         /* Wait until reader exited. */
11920         rte_eal_mp_wait_lcore();
11921
11922         /* Test with invalid crypto device */
11923         TEST_ASSERT_FAIL(rte_cryptodev_remove_deq_callback(
11924                         RTE_CRYPTO_MAX_DEVS, qp_id, cb),
11925                         "Expected call to fail as crypto device is invalid");
11926
11927         /* Test with invalid queue pair */
11928         TEST_ASSERT_FAIL(rte_cryptodev_remove_deq_callback(
11929                         ts_params->valid_devs[0],
11930                         dev_info.max_nb_queue_pairs + 1, cb),
11931                         "Expected call to fail as queue pair is invalid");
11932
11933         /* Test with NULL callback */
11934         TEST_ASSERT_FAIL(rte_cryptodev_remove_deq_callback(
11935                         ts_params->valid_devs[0], qp_id, NULL),
11936                         "Expected call to fail as callback is NULL");
11937
11938         /* Test with valid configuration */
11939         TEST_ASSERT_SUCCESS(rte_cryptodev_remove_deq_callback(
11940                         ts_params->valid_devs[0], qp_id, cb),
11941                         "Failed test to remove callback on "
11942                         "qp %u on cryptodev %u",
11943                         qp_id, ts_params->valid_devs[0]);
11944
11945         return TEST_SUCCESS;
11946 }
11947
11948 static void
11949 generate_gmac_large_plaintext(uint8_t *data)
11950 {
11951         uint16_t i;
11952
11953         for (i = 32; i < GMAC_LARGE_PLAINTEXT_LENGTH; i += 32)
11954                 memcpy(&data[i], &data[0], 32);
11955 }
11956
11957 static int
11958 create_gmac_operation(enum rte_crypto_auth_operation op,
11959                 const struct gmac_test_data *tdata)
11960 {
11961         struct crypto_testsuite_params *ts_params = &testsuite_params;
11962         struct crypto_unittest_params *ut_params = &unittest_params;
11963         struct rte_crypto_sym_op *sym_op;
11964
11965         uint32_t plaintext_pad_len = RTE_ALIGN_CEIL(tdata->plaintext.len, 16);
11966
11967         /* Generate Crypto op data structure */
11968         ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
11969                         RTE_CRYPTO_OP_TYPE_SYMMETRIC);
11970         TEST_ASSERT_NOT_NULL(ut_params->op,
11971                         "Failed to allocate symmetric crypto operation struct");
11972
11973         sym_op = ut_params->op->sym;
11974
11975         sym_op->auth.digest.data = (uint8_t *)rte_pktmbuf_append(
11976                         ut_params->ibuf, tdata->gmac_tag.len);
11977         TEST_ASSERT_NOT_NULL(sym_op->auth.digest.data,
11978                         "no room to append digest");
11979
11980         sym_op->auth.digest.phys_addr = rte_pktmbuf_iova_offset(
11981                         ut_params->ibuf, plaintext_pad_len);
11982
11983         if (op == RTE_CRYPTO_AUTH_OP_VERIFY) {
11984                 rte_memcpy(sym_op->auth.digest.data, tdata->gmac_tag.data,
11985                                 tdata->gmac_tag.len);
11986                 debug_hexdump(stdout, "digest:",
11987                                 sym_op->auth.digest.data,
11988                                 tdata->gmac_tag.len);
11989         }
11990
11991         uint8_t *iv_ptr = rte_crypto_op_ctod_offset(ut_params->op,
11992                         uint8_t *, IV_OFFSET);
11993
11994         rte_memcpy(iv_ptr, tdata->iv.data, tdata->iv.len);
11995
11996         debug_hexdump(stdout, "iv:", iv_ptr, tdata->iv.len);
11997
11998         sym_op->cipher.data.length = 0;
11999         sym_op->cipher.data.offset = 0;
12000
12001         sym_op->auth.data.offset = 0;
12002         sym_op->auth.data.length = tdata->plaintext.len;
12003
12004         return 0;
12005 }
12006
12007 static int
12008 create_gmac_operation_sgl(enum rte_crypto_auth_operation op,
12009                 const struct gmac_test_data *tdata,
12010                 void *digest_mem, uint64_t digest_phys)
12011 {
12012         struct crypto_testsuite_params *ts_params = &testsuite_params;
12013         struct crypto_unittest_params *ut_params = &unittest_params;
12014         struct rte_crypto_sym_op *sym_op;
12015
12016         /* Generate Crypto op data structure */
12017         ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
12018                         RTE_CRYPTO_OP_TYPE_SYMMETRIC);
12019         TEST_ASSERT_NOT_NULL(ut_params->op,
12020                         "Failed to allocate symmetric crypto operation struct");
12021
12022         sym_op = ut_params->op->sym;
12023
12024         sym_op->auth.digest.data = digest_mem;
12025         TEST_ASSERT_NOT_NULL(sym_op->auth.digest.data,
12026                         "no room to append digest");
12027
12028         sym_op->auth.digest.phys_addr = digest_phys;
12029
12030         if (op == RTE_CRYPTO_AUTH_OP_VERIFY) {
12031                 rte_memcpy(sym_op->auth.digest.data, tdata->gmac_tag.data,
12032                                 tdata->gmac_tag.len);
12033                 debug_hexdump(stdout, "digest:",
12034                                 sym_op->auth.digest.data,
12035                                 tdata->gmac_tag.len);
12036         }
12037
12038         uint8_t *iv_ptr = rte_crypto_op_ctod_offset(ut_params->op,
12039                         uint8_t *, IV_OFFSET);
12040
12041         rte_memcpy(iv_ptr, tdata->iv.data, tdata->iv.len);
12042
12043         debug_hexdump(stdout, "iv:", iv_ptr, tdata->iv.len);
12044
12045         sym_op->cipher.data.length = 0;
12046         sym_op->cipher.data.offset = 0;
12047
12048         sym_op->auth.data.offset = 0;
12049         sym_op->auth.data.length = tdata->plaintext.len;
12050
12051         return 0;
12052 }
12053
12054 static int create_gmac_session(uint8_t dev_id,
12055                 const struct gmac_test_data *tdata,
12056                 enum rte_crypto_auth_operation auth_op)
12057 {
12058         uint8_t auth_key[tdata->key.len];
12059
12060         struct crypto_testsuite_params *ts_params = &testsuite_params;
12061         struct crypto_unittest_params *ut_params = &unittest_params;
12062
12063         memcpy(auth_key, tdata->key.data, tdata->key.len);
12064
12065         ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;
12066         ut_params->auth_xform.next = NULL;
12067
12068         ut_params->auth_xform.auth.algo = RTE_CRYPTO_AUTH_AES_GMAC;
12069         ut_params->auth_xform.auth.op = auth_op;
12070         ut_params->auth_xform.auth.digest_length = tdata->gmac_tag.len;
12071         ut_params->auth_xform.auth.key.length = tdata->key.len;
12072         ut_params->auth_xform.auth.key.data = auth_key;
12073         ut_params->auth_xform.auth.iv.offset = IV_OFFSET;
12074         ut_params->auth_xform.auth.iv.length = tdata->iv.len;
12075
12076
12077         ut_params->sess = rte_cryptodev_sym_session_create(
12078                         ts_params->session_mpool);
12079
12080         rte_cryptodev_sym_session_init(dev_id, ut_params->sess,
12081                         &ut_params->auth_xform,
12082                         ts_params->session_priv_mpool);
12083
12084         TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed");
12085
12086         return 0;
12087 }
12088
12089 static int
12090 test_AES_GMAC_authentication(const struct gmac_test_data *tdata)
12091 {
12092         struct crypto_testsuite_params *ts_params = &testsuite_params;
12093         struct crypto_unittest_params *ut_params = &unittest_params;
12094         struct rte_cryptodev_info dev_info;
12095
12096         rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
12097         uint64_t feat_flags = dev_info.feature_flags;
12098
12099         if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
12100                         (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
12101                 printf("Device doesn't support RAW data-path APIs.\n");
12102                 return TEST_SKIPPED;
12103         }
12104
12105         int retval;
12106
12107         uint8_t *auth_tag, *plaintext;
12108         uint16_t plaintext_pad_len;
12109
12110         TEST_ASSERT_NOT_EQUAL(tdata->gmac_tag.len, 0,
12111                               "No GMAC length in the source data");
12112
12113         /* Verify the capabilities */
12114         struct rte_cryptodev_sym_capability_idx cap_idx;
12115         cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
12116         cap_idx.algo.auth = RTE_CRYPTO_AUTH_AES_GMAC;
12117         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
12118                         &cap_idx) == NULL)
12119                 return TEST_SKIPPED;
12120
12121         retval = create_gmac_session(ts_params->valid_devs[0],
12122                         tdata, RTE_CRYPTO_AUTH_OP_GENERATE);
12123
12124         if (retval < 0)
12125                 return retval;
12126
12127         if (tdata->plaintext.len > MBUF_SIZE)
12128                 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->large_mbuf_pool);
12129         else
12130                 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
12131         TEST_ASSERT_NOT_NULL(ut_params->ibuf,
12132                         "Failed to allocate input buffer in mempool");
12133
12134         memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
12135                         rte_pktmbuf_tailroom(ut_params->ibuf));
12136
12137         plaintext_pad_len = RTE_ALIGN_CEIL(tdata->plaintext.len, 16);
12138         /*
12139          * Runtime generate the large plain text instead of use hard code
12140          * plain text vector. It is done to avoid create huge source file
12141          * with the test vector.
12142          */
12143         if (tdata->plaintext.len == GMAC_LARGE_PLAINTEXT_LENGTH)
12144                 generate_gmac_large_plaintext(tdata->plaintext.data);
12145
12146         plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
12147                                 plaintext_pad_len);
12148         TEST_ASSERT_NOT_NULL(plaintext, "no room to append plaintext");
12149
12150         memcpy(plaintext, tdata->plaintext.data, tdata->plaintext.len);
12151         debug_hexdump(stdout, "plaintext:", plaintext,
12152                         tdata->plaintext.len);
12153
12154         retval = create_gmac_operation(RTE_CRYPTO_AUTH_OP_GENERATE,
12155                         tdata);
12156
12157         if (retval < 0)
12158                 return retval;
12159
12160         rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
12161
12162         ut_params->op->sym->m_src = ut_params->ibuf;
12163
12164         if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
12165                 process_cpu_crypt_auth_op(ts_params->valid_devs[0],
12166                         ut_params->op);
12167         else if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
12168                 process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
12169                                 ut_params->op, 0, 1, 0, 0);
12170         else
12171                 TEST_ASSERT_NOT_NULL(
12172                         process_crypto_request(ts_params->valid_devs[0],
12173                         ut_params->op), "failed to process sym crypto op");
12174
12175         TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
12176                         "crypto op processing failed");
12177
12178         if (ut_params->op->sym->m_dst) {
12179                 auth_tag = rte_pktmbuf_mtod_offset(ut_params->op->sym->m_dst,
12180                                 uint8_t *, plaintext_pad_len);
12181         } else {
12182                 auth_tag = plaintext + plaintext_pad_len;
12183         }
12184
12185         debug_hexdump(stdout, "auth tag:", auth_tag, tdata->gmac_tag.len);
12186
12187         TEST_ASSERT_BUFFERS_ARE_EQUAL(
12188                         auth_tag,
12189                         tdata->gmac_tag.data,
12190                         tdata->gmac_tag.len,
12191                         "GMAC Generated auth tag not as expected");
12192
12193         return 0;
12194 }
12195
12196 static int
12197 test_AES_GMAC_authentication_test_case_1(void)
12198 {
12199         return test_AES_GMAC_authentication(&gmac_test_case_1);
12200 }
12201
12202 static int
12203 test_AES_GMAC_authentication_test_case_2(void)
12204 {
12205         return test_AES_GMAC_authentication(&gmac_test_case_2);
12206 }
12207
12208 static int
12209 test_AES_GMAC_authentication_test_case_3(void)
12210 {
12211         return test_AES_GMAC_authentication(&gmac_test_case_3);
12212 }
12213
12214 static int
12215 test_AES_GMAC_authentication_test_case_4(void)
12216 {
12217         return test_AES_GMAC_authentication(&gmac_test_case_4);
12218 }
12219
12220 static int
12221 test_AES_GMAC_authentication_verify(const struct gmac_test_data *tdata)
12222 {
12223         struct crypto_testsuite_params *ts_params = &testsuite_params;
12224         struct crypto_unittest_params *ut_params = &unittest_params;
12225         int retval;
12226         uint32_t plaintext_pad_len;
12227         uint8_t *plaintext;
12228         struct rte_cryptodev_info dev_info;
12229
12230         rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
12231         uint64_t feat_flags = dev_info.feature_flags;
12232
12233         if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
12234                         (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
12235                 printf("Device doesn't support RAW data-path APIs.\n");
12236                 return TEST_SKIPPED;
12237         }
12238
12239         TEST_ASSERT_NOT_EQUAL(tdata->gmac_tag.len, 0,
12240                               "No GMAC length in the source data");
12241
12242         /* Verify the capabilities */
12243         struct rte_cryptodev_sym_capability_idx cap_idx;
12244         cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
12245         cap_idx.algo.auth = RTE_CRYPTO_AUTH_AES_GMAC;
12246         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
12247                         &cap_idx) == NULL)
12248                 return TEST_SKIPPED;
12249
12250         retval = create_gmac_session(ts_params->valid_devs[0],
12251                         tdata, RTE_CRYPTO_AUTH_OP_VERIFY);
12252
12253         if (retval < 0)
12254                 return retval;
12255
12256         if (tdata->plaintext.len > MBUF_SIZE)
12257                 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->large_mbuf_pool);
12258         else
12259                 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
12260         TEST_ASSERT_NOT_NULL(ut_params->ibuf,
12261                         "Failed to allocate input buffer in mempool");
12262
12263         memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
12264                         rte_pktmbuf_tailroom(ut_params->ibuf));
12265
12266         plaintext_pad_len = RTE_ALIGN_CEIL(tdata->plaintext.len, 16);
12267
12268         /*
12269          * Runtime generate the large plain text instead of use hard code
12270          * plain text vector. It is done to avoid create huge source file
12271          * with the test vector.
12272          */
12273         if (tdata->plaintext.len == GMAC_LARGE_PLAINTEXT_LENGTH)
12274                 generate_gmac_large_plaintext(tdata->plaintext.data);
12275
12276         plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
12277                                 plaintext_pad_len);
12278         TEST_ASSERT_NOT_NULL(plaintext, "no room to append plaintext");
12279
12280         memcpy(plaintext, tdata->plaintext.data, tdata->plaintext.len);
12281         debug_hexdump(stdout, "plaintext:", plaintext,
12282                         tdata->plaintext.len);
12283
12284         retval = create_gmac_operation(RTE_CRYPTO_AUTH_OP_VERIFY,
12285                         tdata);
12286
12287         if (retval < 0)
12288                 return retval;
12289
12290         rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
12291
12292         ut_params->op->sym->m_src = ut_params->ibuf;
12293
12294         if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
12295                 process_cpu_crypt_auth_op(ts_params->valid_devs[0],
12296                         ut_params->op);
12297         else if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
12298                 process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
12299                                 ut_params->op, 0, 1, 0, 0);
12300         else
12301                 TEST_ASSERT_NOT_NULL(
12302                         process_crypto_request(ts_params->valid_devs[0],
12303                         ut_params->op), "failed to process sym crypto op");
12304
12305         TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
12306                         "crypto op processing failed");
12307
12308         return 0;
12309
12310 }
12311
12312 static int
12313 test_AES_GMAC_authentication_verify_test_case_1(void)
12314 {
12315         return test_AES_GMAC_authentication_verify(&gmac_test_case_1);
12316 }
12317
12318 static int
12319 test_AES_GMAC_authentication_verify_test_case_2(void)
12320 {
12321         return test_AES_GMAC_authentication_verify(&gmac_test_case_2);
12322 }
12323
12324 static int
12325 test_AES_GMAC_authentication_verify_test_case_3(void)
12326 {
12327         return test_AES_GMAC_authentication_verify(&gmac_test_case_3);
12328 }
12329
12330 static int
12331 test_AES_GMAC_authentication_verify_test_case_4(void)
12332 {
12333         return test_AES_GMAC_authentication_verify(&gmac_test_case_4);
12334 }
12335
12336 static int
12337 test_AES_GMAC_authentication_SGL(const struct gmac_test_data *tdata,
12338                                 uint32_t fragsz)
12339 {
12340         struct crypto_testsuite_params *ts_params = &testsuite_params;
12341         struct crypto_unittest_params *ut_params = &unittest_params;
12342         struct rte_cryptodev_info dev_info;
12343         uint64_t feature_flags;
12344         unsigned int trn_data = 0;
12345         void *digest_mem = NULL;
12346         uint32_t segs = 1;
12347         unsigned int to_trn = 0;
12348         struct rte_mbuf *buf = NULL;
12349         uint8_t *auth_tag, *plaintext;
12350         int retval;
12351
12352         TEST_ASSERT_NOT_EQUAL(tdata->gmac_tag.len, 0,
12353                               "No GMAC length in the source data");
12354
12355         /* Verify the capabilities */
12356         struct rte_cryptodev_sym_capability_idx cap_idx;
12357         cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
12358         cap_idx.algo.auth = RTE_CRYPTO_AUTH_AES_GMAC;
12359         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
12360                         &cap_idx) == NULL)
12361                 return TEST_SKIPPED;
12362
12363         /* Check for any input SGL support */
12364         rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
12365         feature_flags = dev_info.feature_flags;
12366
12367         if ((!(feature_flags & RTE_CRYPTODEV_FF_IN_PLACE_SGL)) ||
12368                         (!(feature_flags & RTE_CRYPTODEV_FF_OOP_SGL_IN_LB_OUT)) ||
12369                         (!(feature_flags & RTE_CRYPTODEV_FF_OOP_SGL_IN_SGL_OUT)))
12370                 return TEST_SKIPPED;
12371
12372         if (fragsz > tdata->plaintext.len)
12373                 fragsz = tdata->plaintext.len;
12374
12375         uint16_t plaintext_len = fragsz;
12376
12377         retval = create_gmac_session(ts_params->valid_devs[0],
12378                         tdata, RTE_CRYPTO_AUTH_OP_GENERATE);
12379
12380         if (retval < 0)
12381                 return retval;
12382
12383         ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
12384         TEST_ASSERT_NOT_NULL(ut_params->ibuf,
12385                         "Failed to allocate input buffer in mempool");
12386
12387         memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
12388                         rte_pktmbuf_tailroom(ut_params->ibuf));
12389
12390         plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
12391                                 plaintext_len);
12392         TEST_ASSERT_NOT_NULL(plaintext, "no room to append plaintext");
12393
12394         memcpy(plaintext, tdata->plaintext.data, plaintext_len);
12395
12396         trn_data += plaintext_len;
12397
12398         buf = ut_params->ibuf;
12399
12400         /*
12401          * Loop until no more fragments
12402          */
12403
12404         while (trn_data < tdata->plaintext.len) {
12405                 ++segs;
12406                 to_trn = (tdata->plaintext.len - trn_data < fragsz) ?
12407                                 (tdata->plaintext.len - trn_data) : fragsz;
12408
12409                 buf->next = rte_pktmbuf_alloc(ts_params->mbuf_pool);
12410                 buf = buf->next;
12411
12412                 memset(rte_pktmbuf_mtod(buf, uint8_t *), 0,
12413                                 rte_pktmbuf_tailroom(buf));
12414
12415                 plaintext = (uint8_t *)rte_pktmbuf_append(buf,
12416                                 to_trn);
12417
12418                 memcpy(plaintext, tdata->plaintext.data + trn_data,
12419                                 to_trn);
12420                 trn_data += to_trn;
12421                 if (trn_data  == tdata->plaintext.len)
12422                         digest_mem = (uint8_t *)rte_pktmbuf_append(buf,
12423                                         tdata->gmac_tag.len);
12424         }
12425         ut_params->ibuf->nb_segs = segs;
12426
12427         /*
12428          * Place digest at the end of the last buffer
12429          */
12430         uint64_t digest_phys = rte_pktmbuf_iova(buf) + to_trn;
12431
12432         if (!digest_mem) {
12433                 digest_mem = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
12434                                 + tdata->gmac_tag.len);
12435                 digest_phys = rte_pktmbuf_iova_offset(ut_params->ibuf,
12436                                 tdata->plaintext.len);
12437         }
12438
12439         retval = create_gmac_operation_sgl(RTE_CRYPTO_AUTH_OP_GENERATE,
12440                         tdata, digest_mem, digest_phys);
12441
12442         if (retval < 0)
12443                 return retval;
12444
12445         rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
12446
12447         ut_params->op->sym->m_src = ut_params->ibuf;
12448
12449         if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
12450                 return TEST_SKIPPED;
12451
12452         TEST_ASSERT_NOT_NULL(
12453                 process_crypto_request(ts_params->valid_devs[0],
12454                 ut_params->op), "failed to process sym crypto op");
12455
12456         TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
12457                         "crypto op processing failed");
12458
12459         auth_tag = digest_mem;
12460         debug_hexdump(stdout, "auth tag:", auth_tag, tdata->gmac_tag.len);
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 /* Segment size not multiple of block size (16B) */
12471 static int
12472 test_AES_GMAC_authentication_SGL_40B(void)
12473 {
12474         return test_AES_GMAC_authentication_SGL(&gmac_test_case_1, 40);
12475 }
12476
12477 static int
12478 test_AES_GMAC_authentication_SGL_80B(void)
12479 {
12480         return test_AES_GMAC_authentication_SGL(&gmac_test_case_1, 80);
12481 }
12482
12483 static int
12484 test_AES_GMAC_authentication_SGL_2048B(void)
12485 {
12486         return test_AES_GMAC_authentication_SGL(&gmac_test_case_5, 2048);
12487 }
12488
12489 /* Segment size not multiple of block size (16B) */
12490 static int
12491 test_AES_GMAC_authentication_SGL_2047B(void)
12492 {
12493         return test_AES_GMAC_authentication_SGL(&gmac_test_case_5, 2047);
12494 }
12495
12496 struct test_crypto_vector {
12497         enum rte_crypto_cipher_algorithm crypto_algo;
12498         unsigned int cipher_offset;
12499         unsigned int cipher_len;
12500
12501         struct {
12502                 uint8_t data[64];
12503                 unsigned int len;
12504         } cipher_key;
12505
12506         struct {
12507                 uint8_t data[64];
12508                 unsigned int len;
12509         } iv;
12510
12511         struct {
12512                 const uint8_t *data;
12513                 unsigned int len;
12514         } plaintext;
12515
12516         struct {
12517                 const uint8_t *data;
12518                 unsigned int len;
12519         } ciphertext;
12520
12521         enum rte_crypto_auth_algorithm auth_algo;
12522         unsigned int auth_offset;
12523
12524         struct {
12525                 uint8_t data[128];
12526                 unsigned int len;
12527         } auth_key;
12528
12529         struct {
12530                 const uint8_t *data;
12531                 unsigned int len;
12532         } aad;
12533
12534         struct {
12535                 uint8_t data[128];
12536                 unsigned int len;
12537         } digest;
12538 };
12539
12540 static const struct test_crypto_vector
12541 hmac_sha1_test_crypto_vector = {
12542         .auth_algo = RTE_CRYPTO_AUTH_SHA1_HMAC,
12543         .plaintext = {
12544                 .data = plaintext_hash,
12545                 .len = 512
12546         },
12547         .auth_key = {
12548                 .data = {
12549                         0xF8, 0x2A, 0xC7, 0x54, 0xDB, 0x96, 0x18, 0xAA,
12550                         0xC3, 0xA1, 0x53, 0xF6, 0x1F, 0x17, 0x60, 0xBD,
12551                         0xDE, 0xF4, 0xDE, 0xAD
12552                 },
12553                 .len = 20
12554         },
12555         .digest = {
12556                 .data = {
12557                         0xC4, 0xB7, 0x0E, 0x6B, 0xDE, 0xD1, 0xE7, 0x77,
12558                         0x7E, 0x2E, 0x8F, 0xFC, 0x48, 0x39, 0x46, 0x17,
12559                         0x3F, 0x91, 0x64, 0x59
12560                 },
12561                 .len = 20
12562         }
12563 };
12564
12565 static const struct test_crypto_vector
12566 aes128_gmac_test_vector = {
12567         .auth_algo = RTE_CRYPTO_AUTH_AES_GMAC,
12568         .plaintext = {
12569                 .data = plaintext_hash,
12570                 .len = 512
12571         },
12572         .iv = {
12573                 .data = {
12574                         0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
12575                         0x08, 0x09, 0x0A, 0x0B
12576                 },
12577                 .len = 12
12578         },
12579         .auth_key = {
12580                 .data = {
12581                         0x42, 0x1A, 0x7D, 0x3D, 0xF5, 0x82, 0x80, 0xF1,
12582                         0xF1, 0x35, 0x5C, 0x3B, 0xDD, 0x9A, 0x65, 0xBA
12583                 },
12584                 .len = 16
12585         },
12586         .digest = {
12587                 .data = {
12588                         0xCA, 0x00, 0x99, 0x8B, 0x30, 0x7E, 0x74, 0x56,
12589                         0x32, 0xA7, 0x87, 0xB5, 0xE9, 0xB2, 0x34, 0x5A
12590                 },
12591                 .len = 16
12592         }
12593 };
12594
12595 static const struct test_crypto_vector
12596 aes128cbc_hmac_sha1_test_vector = {
12597         .crypto_algo = RTE_CRYPTO_CIPHER_AES_CBC,
12598         .cipher_offset = 0,
12599         .cipher_len = 512,
12600         .cipher_key = {
12601                 .data = {
12602                         0xE4, 0x23, 0x33, 0x8A, 0x35, 0x64, 0x61, 0xE2,
12603                         0x49, 0x03, 0xDD, 0xC6, 0xB8, 0xCA, 0x55, 0x7A
12604                 },
12605                 .len = 16
12606         },
12607         .iv = {
12608                 .data = {
12609                         0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
12610                         0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F
12611                 },
12612                 .len = 16
12613         },
12614         .plaintext = {
12615                 .data = plaintext_hash,
12616                 .len = 512
12617         },
12618         .ciphertext = {
12619                 .data = ciphertext512_aes128cbc,
12620                 .len = 512
12621         },
12622         .auth_algo = RTE_CRYPTO_AUTH_SHA1_HMAC,
12623         .auth_offset = 0,
12624         .auth_key = {
12625                 .data = {
12626                         0xF8, 0x2A, 0xC7, 0x54, 0xDB, 0x96, 0x18, 0xAA,
12627                         0xC3, 0xA1, 0x53, 0xF6, 0x1F, 0x17, 0x60, 0xBD,
12628                         0xDE, 0xF4, 0xDE, 0xAD
12629                 },
12630                 .len = 20
12631         },
12632         .digest = {
12633                 .data = {
12634                         0x9A, 0x4F, 0x88, 0x1B, 0xB6, 0x8F, 0xD8, 0x60,
12635                         0x42, 0x1A, 0x7D, 0x3D, 0xF5, 0x82, 0x80, 0xF1,
12636                         0x18, 0x8C, 0x1D, 0x32
12637                 },
12638                 .len = 20
12639         }
12640 };
12641
12642 static const struct test_crypto_vector
12643 aes128cbc_hmac_sha1_aad_test_vector = {
12644         .crypto_algo = RTE_CRYPTO_CIPHER_AES_CBC,
12645         .cipher_offset = 8,
12646         .cipher_len = 496,
12647         .cipher_key = {
12648                 .data = {
12649                         0xE4, 0x23, 0x33, 0x8A, 0x35, 0x64, 0x61, 0xE2,
12650                         0x49, 0x03, 0xDD, 0xC6, 0xB8, 0xCA, 0x55, 0x7A
12651                 },
12652                 .len = 16
12653         },
12654         .iv = {
12655                 .data = {
12656                         0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
12657                         0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F
12658                 },
12659                 .len = 16
12660         },
12661         .plaintext = {
12662                 .data = plaintext_hash,
12663                 .len = 512
12664         },
12665         .ciphertext = {
12666                 .data = ciphertext512_aes128cbc_aad,
12667                 .len = 512
12668         },
12669         .auth_algo = RTE_CRYPTO_AUTH_SHA1_HMAC,
12670         .auth_offset = 0,
12671         .auth_key = {
12672                 .data = {
12673                         0xF8, 0x2A, 0xC7, 0x54, 0xDB, 0x96, 0x18, 0xAA,
12674                         0xC3, 0xA1, 0x53, 0xF6, 0x1F, 0x17, 0x60, 0xBD,
12675                         0xDE, 0xF4, 0xDE, 0xAD
12676                 },
12677                 .len = 20
12678         },
12679         .digest = {
12680                 .data = {
12681                         0x6D, 0xF3, 0x50, 0x79, 0x7A, 0x2A, 0xAC, 0x7F,
12682                         0xA6, 0xF0, 0xC6, 0x38, 0x1F, 0xA4, 0xDD, 0x9B,
12683                         0x62, 0x0F, 0xFB, 0x10
12684                 },
12685                 .len = 20
12686         }
12687 };
12688
12689 static void
12690 data_corruption(uint8_t *data)
12691 {
12692         data[0] += 1;
12693 }
12694
12695 static void
12696 tag_corruption(uint8_t *data, unsigned int tag_offset)
12697 {
12698         data[tag_offset] += 1;
12699 }
12700
12701 static int
12702 create_auth_session(struct crypto_unittest_params *ut_params,
12703                 uint8_t dev_id,
12704                 const struct test_crypto_vector *reference,
12705                 enum rte_crypto_auth_operation auth_op)
12706 {
12707         struct crypto_testsuite_params *ts_params = &testsuite_params;
12708         uint8_t auth_key[reference->auth_key.len + 1];
12709
12710         memcpy(auth_key, reference->auth_key.data, reference->auth_key.len);
12711
12712         /* Setup Authentication Parameters */
12713         ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;
12714         ut_params->auth_xform.auth.op = auth_op;
12715         ut_params->auth_xform.next = NULL;
12716         ut_params->auth_xform.auth.algo = reference->auth_algo;
12717         ut_params->auth_xform.auth.key.length = reference->auth_key.len;
12718         ut_params->auth_xform.auth.key.data = auth_key;
12719         ut_params->auth_xform.auth.digest_length = reference->digest.len;
12720
12721         /* Create Crypto session*/
12722         ut_params->sess = rte_cryptodev_sym_session_create(
12723                         ts_params->session_mpool);
12724
12725         rte_cryptodev_sym_session_init(dev_id, ut_params->sess,
12726                                 &ut_params->auth_xform,
12727                                 ts_params->session_priv_mpool);
12728
12729         TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed");
12730
12731         return 0;
12732 }
12733
12734 static int
12735 create_auth_cipher_session(struct crypto_unittest_params *ut_params,
12736                 uint8_t dev_id,
12737                 const struct test_crypto_vector *reference,
12738                 enum rte_crypto_auth_operation auth_op,
12739                 enum rte_crypto_cipher_operation cipher_op)
12740 {
12741         struct crypto_testsuite_params *ts_params = &testsuite_params;
12742         uint8_t cipher_key[reference->cipher_key.len + 1];
12743         uint8_t auth_key[reference->auth_key.len + 1];
12744
12745         memcpy(cipher_key, reference->cipher_key.data,
12746                         reference->cipher_key.len);
12747         memcpy(auth_key, reference->auth_key.data, reference->auth_key.len);
12748
12749         /* Setup Authentication Parameters */
12750         ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;
12751         ut_params->auth_xform.auth.op = auth_op;
12752         ut_params->auth_xform.auth.algo = reference->auth_algo;
12753         ut_params->auth_xform.auth.key.length = reference->auth_key.len;
12754         ut_params->auth_xform.auth.key.data = auth_key;
12755         ut_params->auth_xform.auth.digest_length = reference->digest.len;
12756
12757         if (reference->auth_algo == RTE_CRYPTO_AUTH_AES_GMAC) {
12758                 ut_params->auth_xform.auth.iv.offset = IV_OFFSET;
12759                 ut_params->auth_xform.auth.iv.length = reference->iv.len;
12760         } else {
12761                 ut_params->auth_xform.next = &ut_params->cipher_xform;
12762
12763                 /* Setup Cipher Parameters */
12764                 ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
12765                 ut_params->cipher_xform.next = NULL;
12766                 ut_params->cipher_xform.cipher.algo = reference->crypto_algo;
12767                 ut_params->cipher_xform.cipher.op = cipher_op;
12768                 ut_params->cipher_xform.cipher.key.data = cipher_key;
12769                 ut_params->cipher_xform.cipher.key.length = reference->cipher_key.len;
12770                 ut_params->cipher_xform.cipher.iv.offset = IV_OFFSET;
12771                 ut_params->cipher_xform.cipher.iv.length = reference->iv.len;
12772         }
12773
12774         /* Create Crypto session*/
12775         ut_params->sess = rte_cryptodev_sym_session_create(
12776                         ts_params->session_mpool);
12777
12778         rte_cryptodev_sym_session_init(dev_id, ut_params->sess,
12779                                 &ut_params->auth_xform,
12780                                 ts_params->session_priv_mpool);
12781
12782         TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed");
12783
12784         return 0;
12785 }
12786
12787 static int
12788 create_auth_operation(struct crypto_testsuite_params *ts_params,
12789                 struct crypto_unittest_params *ut_params,
12790                 const struct test_crypto_vector *reference,
12791                 unsigned int auth_generate)
12792 {
12793         /* Generate Crypto op data structure */
12794         ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
12795                         RTE_CRYPTO_OP_TYPE_SYMMETRIC);
12796         TEST_ASSERT_NOT_NULL(ut_params->op,
12797                         "Failed to allocate pktmbuf offload");
12798
12799         /* Set crypto operation data parameters */
12800         rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
12801
12802         struct rte_crypto_sym_op *sym_op = ut_params->op->sym;
12803
12804         /* set crypto operation source mbuf */
12805         sym_op->m_src = ut_params->ibuf;
12806
12807         /* digest */
12808         sym_op->auth.digest.data = (uint8_t *)rte_pktmbuf_append(
12809                         ut_params->ibuf, reference->digest.len);
12810
12811         TEST_ASSERT_NOT_NULL(sym_op->auth.digest.data,
12812                         "no room to append auth tag");
12813
12814         sym_op->auth.digest.phys_addr = rte_pktmbuf_iova_offset(
12815                         ut_params->ibuf, reference->plaintext.len);
12816
12817         if (auth_generate)
12818                 memset(sym_op->auth.digest.data, 0, reference->digest.len);
12819         else
12820                 memcpy(sym_op->auth.digest.data,
12821                                 reference->digest.data,
12822                                 reference->digest.len);
12823
12824         debug_hexdump(stdout, "digest:",
12825                         sym_op->auth.digest.data,
12826                         reference->digest.len);
12827
12828         sym_op->auth.data.length = reference->plaintext.len;
12829         sym_op->auth.data.offset = 0;
12830
12831         return 0;
12832 }
12833
12834 static int
12835 create_auth_GMAC_operation(struct crypto_testsuite_params *ts_params,
12836                 struct crypto_unittest_params *ut_params,
12837                 const struct test_crypto_vector *reference,
12838                 unsigned int auth_generate)
12839 {
12840         /* Generate Crypto op data structure */
12841         ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
12842                         RTE_CRYPTO_OP_TYPE_SYMMETRIC);
12843         TEST_ASSERT_NOT_NULL(ut_params->op,
12844                         "Failed to allocate pktmbuf offload");
12845
12846         /* Set crypto operation data parameters */
12847         rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
12848
12849         struct rte_crypto_sym_op *sym_op = ut_params->op->sym;
12850
12851         /* set crypto operation source mbuf */
12852         sym_op->m_src = ut_params->ibuf;
12853
12854         /* digest */
12855         sym_op->auth.digest.data = (uint8_t *)rte_pktmbuf_append(
12856                         ut_params->ibuf, reference->digest.len);
12857
12858         TEST_ASSERT_NOT_NULL(sym_op->auth.digest.data,
12859                         "no room to append auth tag");
12860
12861         sym_op->auth.digest.phys_addr = rte_pktmbuf_iova_offset(
12862                         ut_params->ibuf, reference->ciphertext.len);
12863
12864         if (auth_generate)
12865                 memset(sym_op->auth.digest.data, 0, reference->digest.len);
12866         else
12867                 memcpy(sym_op->auth.digest.data,
12868                                 reference->digest.data,
12869                                 reference->digest.len);
12870
12871         debug_hexdump(stdout, "digest:",
12872                         sym_op->auth.digest.data,
12873                         reference->digest.len);
12874
12875         rte_memcpy(rte_crypto_op_ctod_offset(ut_params->op, uint8_t *, IV_OFFSET),
12876                         reference->iv.data, reference->iv.len);
12877
12878         sym_op->cipher.data.length = 0;
12879         sym_op->cipher.data.offset = 0;
12880
12881         sym_op->auth.data.length = reference->plaintext.len;
12882         sym_op->auth.data.offset = 0;
12883
12884         return 0;
12885 }
12886
12887 static int
12888 create_cipher_auth_operation(struct crypto_testsuite_params *ts_params,
12889                 struct crypto_unittest_params *ut_params,
12890                 const struct test_crypto_vector *reference,
12891                 unsigned int auth_generate)
12892 {
12893         /* Generate Crypto op data structure */
12894         ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
12895                         RTE_CRYPTO_OP_TYPE_SYMMETRIC);
12896         TEST_ASSERT_NOT_NULL(ut_params->op,
12897                         "Failed to allocate pktmbuf offload");
12898
12899         /* Set crypto operation data parameters */
12900         rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
12901
12902         struct rte_crypto_sym_op *sym_op = ut_params->op->sym;
12903
12904         /* set crypto operation source mbuf */
12905         sym_op->m_src = ut_params->ibuf;
12906
12907         /* digest */
12908         sym_op->auth.digest.data = (uint8_t *)rte_pktmbuf_append(
12909                         ut_params->ibuf, reference->digest.len);
12910
12911         TEST_ASSERT_NOT_NULL(sym_op->auth.digest.data,
12912                         "no room to append auth tag");
12913
12914         sym_op->auth.digest.phys_addr = rte_pktmbuf_iova_offset(
12915                         ut_params->ibuf, reference->ciphertext.len);
12916
12917         if (auth_generate)
12918                 memset(sym_op->auth.digest.data, 0, reference->digest.len);
12919         else
12920                 memcpy(sym_op->auth.digest.data,
12921                                 reference->digest.data,
12922                                 reference->digest.len);
12923
12924         debug_hexdump(stdout, "digest:",
12925                         sym_op->auth.digest.data,
12926                         reference->digest.len);
12927
12928         rte_memcpy(rte_crypto_op_ctod_offset(ut_params->op, uint8_t *, IV_OFFSET),
12929                         reference->iv.data, reference->iv.len);
12930
12931         sym_op->cipher.data.length = reference->cipher_len;
12932         sym_op->cipher.data.offset = reference->cipher_offset;
12933
12934         sym_op->auth.data.length = reference->plaintext.len;
12935         sym_op->auth.data.offset = reference->auth_offset;
12936
12937         return 0;
12938 }
12939
12940 static int
12941 create_auth_verify_operation(struct crypto_testsuite_params *ts_params,
12942                 struct crypto_unittest_params *ut_params,
12943                 const struct test_crypto_vector *reference)
12944 {
12945         return create_auth_operation(ts_params, ut_params, reference, 0);
12946 }
12947
12948 static int
12949 create_auth_verify_GMAC_operation(
12950                 struct crypto_testsuite_params *ts_params,
12951                 struct crypto_unittest_params *ut_params,
12952                 const struct test_crypto_vector *reference)
12953 {
12954         return create_auth_GMAC_operation(ts_params, ut_params, reference, 0);
12955 }
12956
12957 static int
12958 create_cipher_auth_verify_operation(struct crypto_testsuite_params *ts_params,
12959                 struct crypto_unittest_params *ut_params,
12960                 const struct test_crypto_vector *reference)
12961 {
12962         return create_cipher_auth_operation(ts_params, ut_params, reference, 0);
12963 }
12964
12965 static int
12966 test_authentication_verify_fail_when_data_corruption(
12967                 struct crypto_testsuite_params *ts_params,
12968                 struct crypto_unittest_params *ut_params,
12969                 const struct test_crypto_vector *reference,
12970                 unsigned int data_corrupted)
12971 {
12972         int retval;
12973
12974         uint8_t *plaintext;
12975         struct rte_cryptodev_info dev_info;
12976
12977         rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
12978         uint64_t feat_flags = dev_info.feature_flags;
12979
12980         if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
12981                         (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
12982                 printf("Device doesn't support RAW data-path APIs.\n");
12983                 return TEST_SKIPPED;
12984         }
12985
12986         /* Verify the capabilities */
12987         struct rte_cryptodev_sym_capability_idx cap_idx;
12988         cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
12989         cap_idx.algo.auth = reference->auth_algo;
12990         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
12991                         &cap_idx) == NULL)
12992                 return TEST_SKIPPED;
12993
12994
12995         /* Create session */
12996         retval = create_auth_session(ut_params,
12997                         ts_params->valid_devs[0],
12998                         reference,
12999                         RTE_CRYPTO_AUTH_OP_VERIFY);
13000         if (retval < 0)
13001                 return retval;
13002
13003         ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
13004         TEST_ASSERT_NOT_NULL(ut_params->ibuf,
13005                         "Failed to allocate input buffer in mempool");
13006
13007         /* clear mbuf payload */
13008         memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
13009                         rte_pktmbuf_tailroom(ut_params->ibuf));
13010
13011         plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
13012                         reference->plaintext.len);
13013         TEST_ASSERT_NOT_NULL(plaintext, "no room to append plaintext");
13014         memcpy(plaintext, reference->plaintext.data, reference->plaintext.len);
13015
13016         debug_hexdump(stdout, "plaintext:", plaintext,
13017                 reference->plaintext.len);
13018
13019         /* Create operation */
13020         retval = create_auth_verify_operation(ts_params, ut_params, reference);
13021
13022         if (retval < 0)
13023                 return retval;
13024
13025         if (data_corrupted)
13026                 data_corruption(plaintext);
13027         else
13028                 tag_corruption(plaintext, reference->plaintext.len);
13029
13030         if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO) {
13031                 process_cpu_crypt_auth_op(ts_params->valid_devs[0],
13032                         ut_params->op);
13033                 TEST_ASSERT_NOT_EQUAL(ut_params->op->status,
13034                         RTE_CRYPTO_OP_STATUS_SUCCESS,
13035                         "authentication not failed");
13036         } else if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
13037                 process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
13038                                 ut_params->op, 0, 1, 0, 0);
13039         else {
13040                 ut_params->op = process_crypto_request(ts_params->valid_devs[0],
13041                         ut_params->op);
13042         }
13043         if (ut_params->op == NULL)
13044                 return 0;
13045         else if (ut_params->op->status != RTE_CRYPTO_OP_STATUS_SUCCESS)
13046                 return 0;
13047
13048         return -1;
13049 }
13050
13051 static int
13052 test_authentication_verify_GMAC_fail_when_corruption(
13053                 struct crypto_testsuite_params *ts_params,
13054                 struct crypto_unittest_params *ut_params,
13055                 const struct test_crypto_vector *reference,
13056                 unsigned int data_corrupted)
13057 {
13058         int retval;
13059         uint8_t *plaintext;
13060         struct rte_cryptodev_info dev_info;
13061
13062         rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
13063         uint64_t feat_flags = dev_info.feature_flags;
13064
13065         if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
13066                         (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
13067                 printf("Device doesn't support RAW data-path APIs.\n");
13068                 return TEST_SKIPPED;
13069         }
13070
13071         /* Verify the capabilities */
13072         struct rte_cryptodev_sym_capability_idx cap_idx;
13073         cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
13074         cap_idx.algo.auth = reference->auth_algo;
13075         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
13076                         &cap_idx) == NULL)
13077                 return TEST_SKIPPED;
13078
13079         /* Create session */
13080         retval = create_auth_cipher_session(ut_params,
13081                         ts_params->valid_devs[0],
13082                         reference,
13083                         RTE_CRYPTO_AUTH_OP_VERIFY,
13084                         RTE_CRYPTO_CIPHER_OP_DECRYPT);
13085         if (retval < 0)
13086                 return retval;
13087
13088         ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
13089         TEST_ASSERT_NOT_NULL(ut_params->ibuf,
13090                         "Failed to allocate input buffer in mempool");
13091
13092         /* clear mbuf payload */
13093         memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
13094                         rte_pktmbuf_tailroom(ut_params->ibuf));
13095
13096         plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
13097                         reference->plaintext.len);
13098         TEST_ASSERT_NOT_NULL(plaintext, "no room to append plaintext");
13099         memcpy(plaintext, reference->plaintext.data, reference->plaintext.len);
13100
13101         debug_hexdump(stdout, "plaintext:", plaintext,
13102                 reference->plaintext.len);
13103
13104         /* Create operation */
13105         retval = create_auth_verify_GMAC_operation(ts_params,
13106                         ut_params,
13107                         reference);
13108
13109         if (retval < 0)
13110                 return retval;
13111
13112         if (data_corrupted)
13113                 data_corruption(plaintext);
13114         else
13115                 tag_corruption(plaintext, reference->aad.len);
13116
13117         if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO) {
13118                 process_cpu_crypt_auth_op(ts_params->valid_devs[0],
13119                         ut_params->op);
13120                 TEST_ASSERT_NOT_EQUAL(ut_params->op->status,
13121                         RTE_CRYPTO_OP_STATUS_SUCCESS,
13122                         "authentication not failed");
13123         } else if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
13124                 process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
13125                                 ut_params->op, 0, 1, 0, 0);
13126         else {
13127                 ut_params->op = process_crypto_request(ts_params->valid_devs[0],
13128                         ut_params->op);
13129                 TEST_ASSERT_NULL(ut_params->op, "authentication not failed");
13130         }
13131
13132         return 0;
13133 }
13134
13135 static int
13136 test_authenticated_decryption_fail_when_corruption(
13137                 struct crypto_testsuite_params *ts_params,
13138                 struct crypto_unittest_params *ut_params,
13139                 const struct test_crypto_vector *reference,
13140                 unsigned int data_corrupted)
13141 {
13142         int retval;
13143
13144         uint8_t *ciphertext;
13145         struct rte_cryptodev_info dev_info;
13146
13147         rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
13148         uint64_t feat_flags = dev_info.feature_flags;
13149
13150         if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
13151                         (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
13152                 printf("Device doesn't support RAW data-path APIs.\n");
13153                 return TEST_SKIPPED;
13154         }
13155
13156         /* Verify the capabilities */
13157         struct rte_cryptodev_sym_capability_idx cap_idx;
13158         cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
13159         cap_idx.algo.auth = reference->auth_algo;
13160         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
13161                         &cap_idx) == NULL)
13162                 return TEST_SKIPPED;
13163         cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
13164         cap_idx.algo.cipher = reference->crypto_algo;
13165         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
13166                         &cap_idx) == NULL)
13167                 return TEST_SKIPPED;
13168
13169         /* Create session */
13170         retval = create_auth_cipher_session(ut_params,
13171                         ts_params->valid_devs[0],
13172                         reference,
13173                         RTE_CRYPTO_AUTH_OP_VERIFY,
13174                         RTE_CRYPTO_CIPHER_OP_DECRYPT);
13175         if (retval < 0)
13176                 return retval;
13177
13178         ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
13179         TEST_ASSERT_NOT_NULL(ut_params->ibuf,
13180                         "Failed to allocate input buffer in mempool");
13181
13182         /* clear mbuf payload */
13183         memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
13184                         rte_pktmbuf_tailroom(ut_params->ibuf));
13185
13186         ciphertext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
13187                         reference->ciphertext.len);
13188         TEST_ASSERT_NOT_NULL(ciphertext, "no room to append ciphertext");
13189         memcpy(ciphertext, reference->ciphertext.data,
13190                         reference->ciphertext.len);
13191
13192         /* Create operation */
13193         retval = create_cipher_auth_verify_operation(ts_params,
13194                         ut_params,
13195                         reference);
13196
13197         if (retval < 0)
13198                 return retval;
13199
13200         if (data_corrupted)
13201                 data_corruption(ciphertext);
13202         else
13203                 tag_corruption(ciphertext, reference->ciphertext.len);
13204
13205         if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO) {
13206                 process_cpu_crypt_auth_op(ts_params->valid_devs[0],
13207                         ut_params->op);
13208                 TEST_ASSERT_NOT_EQUAL(ut_params->op->status,
13209                         RTE_CRYPTO_OP_STATUS_SUCCESS,
13210                         "authentication not failed");
13211         } else if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
13212                 process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
13213                                 ut_params->op, 1, 1, 0, 0);
13214         else {
13215                 ut_params->op = process_crypto_request(ts_params->valid_devs[0],
13216                         ut_params->op);
13217                 TEST_ASSERT_NULL(ut_params->op, "authentication not failed");
13218         }
13219
13220         return 0;
13221 }
13222
13223 static int
13224 test_authenticated_encrypt_with_esn(
13225                 struct crypto_testsuite_params *ts_params,
13226                 struct crypto_unittest_params *ut_params,
13227                 const struct test_crypto_vector *reference)
13228 {
13229         int retval;
13230
13231         uint8_t *authciphertext, *plaintext, *auth_tag;
13232         uint16_t plaintext_pad_len;
13233         uint8_t cipher_key[reference->cipher_key.len + 1];
13234         uint8_t auth_key[reference->auth_key.len + 1];
13235         struct rte_cryptodev_info dev_info;
13236
13237         rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
13238         uint64_t feat_flags = dev_info.feature_flags;
13239
13240         if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
13241                         (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
13242                 printf("Device doesn't support RAW data-path APIs.\n");
13243                 return TEST_SKIPPED;
13244         }
13245
13246         /* Verify the capabilities */
13247         struct rte_cryptodev_sym_capability_idx cap_idx;
13248         cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
13249         cap_idx.algo.auth = reference->auth_algo;
13250         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
13251                         &cap_idx) == NULL)
13252                 return TEST_SKIPPED;
13253         cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
13254         cap_idx.algo.cipher = reference->crypto_algo;
13255         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
13256                         &cap_idx) == NULL)
13257                 return TEST_SKIPPED;
13258
13259         /* Create session */
13260         memcpy(cipher_key, reference->cipher_key.data,
13261                         reference->cipher_key.len);
13262         memcpy(auth_key, reference->auth_key.data, reference->auth_key.len);
13263
13264         /* Setup Cipher Parameters */
13265         ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
13266         ut_params->cipher_xform.cipher.algo = reference->crypto_algo;
13267         ut_params->cipher_xform.cipher.op = RTE_CRYPTO_CIPHER_OP_ENCRYPT;
13268         ut_params->cipher_xform.cipher.key.data = cipher_key;
13269         ut_params->cipher_xform.cipher.key.length = reference->cipher_key.len;
13270         ut_params->cipher_xform.cipher.iv.offset = IV_OFFSET;
13271         ut_params->cipher_xform.cipher.iv.length = reference->iv.len;
13272
13273         ut_params->cipher_xform.next = &ut_params->auth_xform;
13274
13275         /* Setup Authentication Parameters */
13276         ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;
13277         ut_params->auth_xform.auth.op = RTE_CRYPTO_AUTH_OP_GENERATE;
13278         ut_params->auth_xform.auth.algo = reference->auth_algo;
13279         ut_params->auth_xform.auth.key.length = reference->auth_key.len;
13280         ut_params->auth_xform.auth.key.data = auth_key;
13281         ut_params->auth_xform.auth.digest_length = reference->digest.len;
13282         ut_params->auth_xform.next = NULL;
13283
13284         /* Create Crypto session*/
13285         ut_params->sess = rte_cryptodev_sym_session_create(
13286                         ts_params->session_mpool);
13287
13288         rte_cryptodev_sym_session_init(ts_params->valid_devs[0],
13289                                 ut_params->sess,
13290                                 &ut_params->cipher_xform,
13291                                 ts_params->session_priv_mpool);
13292
13293         TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed");
13294
13295         ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
13296         TEST_ASSERT_NOT_NULL(ut_params->ibuf,
13297                         "Failed to allocate input buffer in mempool");
13298
13299         /* clear mbuf payload */
13300         memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
13301                         rte_pktmbuf_tailroom(ut_params->ibuf));
13302
13303         plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
13304                         reference->plaintext.len);
13305         TEST_ASSERT_NOT_NULL(plaintext, "no room to append plaintext");
13306         memcpy(plaintext, reference->plaintext.data, reference->plaintext.len);
13307
13308         /* Create operation */
13309         retval = create_cipher_auth_operation(ts_params,
13310                         ut_params,
13311                         reference, 0);
13312
13313         if (retval < 0)
13314                 return retval;
13315
13316         if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
13317                 process_cpu_crypt_auth_op(ts_params->valid_devs[0],
13318                         ut_params->op);
13319         else if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
13320                 process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
13321                                 ut_params->op, 1, 1, 0, 0);
13322         else
13323                 ut_params->op = process_crypto_request(
13324                         ts_params->valid_devs[0], ut_params->op);
13325
13326         TEST_ASSERT_NOT_NULL(ut_params->op, "no crypto operation returned");
13327
13328         TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
13329                         "crypto op processing failed");
13330
13331         plaintext_pad_len = RTE_ALIGN_CEIL(reference->plaintext.len, 16);
13332
13333         authciphertext = rte_pktmbuf_mtod_offset(ut_params->ibuf, uint8_t *,
13334                         ut_params->op->sym->auth.data.offset);
13335         auth_tag = authciphertext + plaintext_pad_len;
13336         debug_hexdump(stdout, "ciphertext:", authciphertext,
13337                         reference->ciphertext.len);
13338         debug_hexdump(stdout, "auth tag:", auth_tag, reference->digest.len);
13339
13340         /* Validate obuf */
13341         TEST_ASSERT_BUFFERS_ARE_EQUAL(
13342                         authciphertext,
13343                         reference->ciphertext.data,
13344                         reference->ciphertext.len,
13345                         "Ciphertext data not as expected");
13346
13347         TEST_ASSERT_BUFFERS_ARE_EQUAL(
13348                         auth_tag,
13349                         reference->digest.data,
13350                         reference->digest.len,
13351                         "Generated digest not as expected");
13352
13353         return TEST_SUCCESS;
13354
13355 }
13356
13357 static int
13358 test_authenticated_decrypt_with_esn(
13359                 struct crypto_testsuite_params *ts_params,
13360                 struct crypto_unittest_params *ut_params,
13361                 const struct test_crypto_vector *reference)
13362 {
13363         int retval;
13364
13365         uint8_t *ciphertext;
13366         uint8_t cipher_key[reference->cipher_key.len + 1];
13367         uint8_t auth_key[reference->auth_key.len + 1];
13368         struct rte_cryptodev_info dev_info;
13369
13370         rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
13371         uint64_t feat_flags = dev_info.feature_flags;
13372
13373         if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
13374                         (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
13375                 printf("Device doesn't support RAW data-path APIs.\n");
13376                 return TEST_SKIPPED;
13377         }
13378
13379         /* Verify the capabilities */
13380         struct rte_cryptodev_sym_capability_idx cap_idx;
13381         cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
13382         cap_idx.algo.auth = reference->auth_algo;
13383         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
13384                         &cap_idx) == NULL)
13385                 return TEST_SKIPPED;
13386         cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
13387         cap_idx.algo.cipher = reference->crypto_algo;
13388         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
13389                         &cap_idx) == NULL)
13390                 return TEST_SKIPPED;
13391
13392         /* Create session */
13393         memcpy(cipher_key, reference->cipher_key.data,
13394                         reference->cipher_key.len);
13395         memcpy(auth_key, reference->auth_key.data, reference->auth_key.len);
13396
13397         /* Setup Authentication Parameters */
13398         ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;
13399         ut_params->auth_xform.auth.op = RTE_CRYPTO_AUTH_OP_VERIFY;
13400         ut_params->auth_xform.auth.algo = reference->auth_algo;
13401         ut_params->auth_xform.auth.key.length = reference->auth_key.len;
13402         ut_params->auth_xform.auth.key.data = auth_key;
13403         ut_params->auth_xform.auth.digest_length = reference->digest.len;
13404         ut_params->auth_xform.next = &ut_params->cipher_xform;
13405
13406         /* Setup Cipher Parameters */
13407         ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
13408         ut_params->cipher_xform.next = NULL;
13409         ut_params->cipher_xform.cipher.algo = reference->crypto_algo;
13410         ut_params->cipher_xform.cipher.op = RTE_CRYPTO_CIPHER_OP_DECRYPT;
13411         ut_params->cipher_xform.cipher.key.data = cipher_key;
13412         ut_params->cipher_xform.cipher.key.length = reference->cipher_key.len;
13413         ut_params->cipher_xform.cipher.iv.offset = IV_OFFSET;
13414         ut_params->cipher_xform.cipher.iv.length = reference->iv.len;
13415
13416         /* Create Crypto session*/
13417         ut_params->sess = rte_cryptodev_sym_session_create(
13418                         ts_params->session_mpool);
13419
13420         rte_cryptodev_sym_session_init(ts_params->valid_devs[0],
13421                                 ut_params->sess,
13422                                 &ut_params->auth_xform,
13423                                 ts_params->session_priv_mpool);
13424
13425         TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed");
13426
13427         ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
13428         TEST_ASSERT_NOT_NULL(ut_params->ibuf,
13429                         "Failed to allocate input buffer in mempool");
13430
13431         /* clear mbuf payload */
13432         memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
13433                         rte_pktmbuf_tailroom(ut_params->ibuf));
13434
13435         ciphertext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
13436                         reference->ciphertext.len);
13437         TEST_ASSERT_NOT_NULL(ciphertext, "no room to append ciphertext");
13438         memcpy(ciphertext, reference->ciphertext.data,
13439                         reference->ciphertext.len);
13440
13441         /* Create operation */
13442         retval = create_cipher_auth_verify_operation(ts_params,
13443                         ut_params,
13444                         reference);
13445
13446         if (retval < 0)
13447                 return retval;
13448
13449         if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
13450                 process_cpu_crypt_auth_op(ts_params->valid_devs[0],
13451                         ut_params->op);
13452         else if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
13453                 process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
13454                                 ut_params->op, 1, 1, 0, 0);
13455         else
13456                 ut_params->op = process_crypto_request(ts_params->valid_devs[0],
13457                         ut_params->op);
13458
13459         TEST_ASSERT_NOT_NULL(ut_params->op, "failed crypto process");
13460         TEST_ASSERT_EQUAL(ut_params->op->status,
13461                         RTE_CRYPTO_OP_STATUS_SUCCESS,
13462                         "crypto op processing passed");
13463
13464         ut_params->obuf = ut_params->op->sym->m_src;
13465         TEST_ASSERT_NOT_NULL(ut_params->obuf, "failed to retrieve obuf");
13466
13467         return 0;
13468 }
13469
13470 static int
13471 create_aead_operation_SGL(enum rte_crypto_aead_operation op,
13472                 const struct aead_test_data *tdata,
13473                 void *digest_mem, uint64_t digest_phys)
13474 {
13475         struct crypto_testsuite_params *ts_params = &testsuite_params;
13476         struct crypto_unittest_params *ut_params = &unittest_params;
13477
13478         const unsigned int auth_tag_len = tdata->auth_tag.len;
13479         const unsigned int iv_len = tdata->iv.len;
13480         unsigned int aad_len = tdata->aad.len;
13481         unsigned int aad_len_pad = 0;
13482
13483         /* Generate Crypto op data structure */
13484         ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
13485                         RTE_CRYPTO_OP_TYPE_SYMMETRIC);
13486         TEST_ASSERT_NOT_NULL(ut_params->op,
13487                 "Failed to allocate symmetric crypto operation struct");
13488
13489         struct rte_crypto_sym_op *sym_op = ut_params->op->sym;
13490
13491         sym_op->aead.digest.data = digest_mem;
13492
13493         TEST_ASSERT_NOT_NULL(sym_op->aead.digest.data,
13494                         "no room to append digest");
13495
13496         sym_op->aead.digest.phys_addr = digest_phys;
13497
13498         if (op == RTE_CRYPTO_AEAD_OP_DECRYPT) {
13499                 rte_memcpy(sym_op->aead.digest.data, tdata->auth_tag.data,
13500                                 auth_tag_len);
13501                 debug_hexdump(stdout, "digest:",
13502                                 sym_op->aead.digest.data,
13503                                 auth_tag_len);
13504         }
13505
13506         /* Append aad data */
13507         if (tdata->algo == RTE_CRYPTO_AEAD_AES_CCM) {
13508                 uint8_t *iv_ptr = rte_crypto_op_ctod_offset(ut_params->op,
13509                                 uint8_t *, IV_OFFSET);
13510
13511                 /* Copy IV 1 byte after the IV pointer, according to the API */
13512                 rte_memcpy(iv_ptr + 1, tdata->iv.data, iv_len);
13513
13514                 aad_len = RTE_ALIGN_CEIL(aad_len + 18, 16);
13515
13516                 sym_op->aead.aad.data = (uint8_t *)rte_pktmbuf_prepend(
13517                                 ut_params->ibuf, aad_len);
13518                 TEST_ASSERT_NOT_NULL(sym_op->aead.aad.data,
13519                                 "no room to prepend aad");
13520                 sym_op->aead.aad.phys_addr = rte_pktmbuf_iova(
13521                                 ut_params->ibuf);
13522
13523                 memset(sym_op->aead.aad.data, 0, aad_len);
13524                 /* Copy AAD 18 bytes after the AAD pointer, according to the API */
13525                 rte_memcpy(sym_op->aead.aad.data, tdata->aad.data, aad_len);
13526
13527                 debug_hexdump(stdout, "iv:", iv_ptr, iv_len);
13528                 debug_hexdump(stdout, "aad:",
13529                                 sym_op->aead.aad.data, aad_len);
13530         } else {
13531                 uint8_t *iv_ptr = rte_crypto_op_ctod_offset(ut_params->op,
13532                                 uint8_t *, IV_OFFSET);
13533
13534                 rte_memcpy(iv_ptr, tdata->iv.data, iv_len);
13535
13536                 aad_len_pad = RTE_ALIGN_CEIL(aad_len, 16);
13537
13538                 sym_op->aead.aad.data = (uint8_t *)rte_pktmbuf_prepend(
13539                                 ut_params->ibuf, aad_len_pad);
13540                 TEST_ASSERT_NOT_NULL(sym_op->aead.aad.data,
13541                                 "no room to prepend aad");
13542                 sym_op->aead.aad.phys_addr = rte_pktmbuf_iova(
13543                                 ut_params->ibuf);
13544
13545                 memset(sym_op->aead.aad.data, 0, aad_len);
13546                 rte_memcpy(sym_op->aead.aad.data, tdata->aad.data, aad_len);
13547
13548                 debug_hexdump(stdout, "iv:", iv_ptr, iv_len);
13549                 debug_hexdump(stdout, "aad:",
13550                                 sym_op->aead.aad.data, aad_len);
13551         }
13552
13553         sym_op->aead.data.length = tdata->plaintext.len;
13554         sym_op->aead.data.offset = aad_len_pad;
13555
13556         return 0;
13557 }
13558
13559 #define SGL_MAX_NO      16
13560
13561 static int
13562 test_authenticated_encryption_SGL(const struct aead_test_data *tdata,
13563                 const int oop, uint32_t fragsz, uint32_t fragsz_oop)
13564 {
13565         struct crypto_testsuite_params *ts_params = &testsuite_params;
13566         struct crypto_unittest_params *ut_params = &unittest_params;
13567         struct rte_mbuf *buf, *buf_oop = NULL, *buf_last_oop = NULL;
13568         int retval;
13569         int to_trn = 0;
13570         int to_trn_tbl[SGL_MAX_NO];
13571         int segs = 1;
13572         unsigned int trn_data = 0;
13573         uint8_t *plaintext, *ciphertext, *auth_tag;
13574         struct rte_cryptodev_info dev_info;
13575
13576         /* Verify the capabilities */
13577         struct rte_cryptodev_sym_capability_idx cap_idx;
13578         cap_idx.type = RTE_CRYPTO_SYM_XFORM_AEAD;
13579         cap_idx.algo.aead = tdata->algo;
13580         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
13581                         &cap_idx) == NULL)
13582                 return TEST_SKIPPED;
13583
13584         /* OOP not supported with CPU crypto */
13585         if (oop && gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
13586                 return TEST_SKIPPED;
13587
13588         /* Detailed check for the particular SGL support flag */
13589         rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
13590         if (!oop) {
13591                 unsigned int sgl_in = fragsz < tdata->plaintext.len;
13592                 if (sgl_in && (!(dev_info.feature_flags &
13593                                 RTE_CRYPTODEV_FF_IN_PLACE_SGL)))
13594                         return TEST_SKIPPED;
13595
13596                 uint64_t feat_flags = dev_info.feature_flags;
13597
13598                 if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
13599                         (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
13600                         printf("Device doesn't support RAW data-path APIs.\n");
13601                         return TEST_SKIPPED;
13602                 }
13603         } else {
13604                 unsigned int sgl_in = fragsz < tdata->plaintext.len;
13605                 unsigned int sgl_out = (fragsz_oop ? fragsz_oop : fragsz) <
13606                                 tdata->plaintext.len;
13607                 /* Raw data path API does not support OOP */
13608                 if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
13609                         return TEST_SKIPPED;
13610                 if (sgl_in && !sgl_out) {
13611                         if (!(dev_info.feature_flags &
13612                                         RTE_CRYPTODEV_FF_OOP_SGL_IN_LB_OUT))
13613                                 return TEST_SKIPPED;
13614                 } else if (!sgl_in && sgl_out) {
13615                         if (!(dev_info.feature_flags &
13616                                         RTE_CRYPTODEV_FF_OOP_LB_IN_SGL_OUT))
13617                                 return TEST_SKIPPED;
13618                 } else if (sgl_in && sgl_out) {
13619                         if (!(dev_info.feature_flags &
13620                                         RTE_CRYPTODEV_FF_OOP_SGL_IN_SGL_OUT))
13621                                 return TEST_SKIPPED;
13622                 }
13623         }
13624
13625         if (fragsz > tdata->plaintext.len)
13626                 fragsz = tdata->plaintext.len;
13627
13628         uint16_t plaintext_len = fragsz;
13629         uint16_t frag_size_oop = fragsz_oop ? fragsz_oop : fragsz;
13630
13631         if (fragsz_oop > tdata->plaintext.len)
13632                 frag_size_oop = tdata->plaintext.len;
13633
13634         int ecx = 0;
13635         void *digest_mem = NULL;
13636
13637         uint32_t prepend_len = RTE_ALIGN_CEIL(tdata->aad.len, 16);
13638
13639         if (tdata->plaintext.len % fragsz != 0) {
13640                 if (tdata->plaintext.len / fragsz + 1 > SGL_MAX_NO)
13641                         return 1;
13642         }       else {
13643                 if (tdata->plaintext.len / fragsz > SGL_MAX_NO)
13644                         return 1;
13645         }
13646
13647         /*
13648          * For out-op-place we need to alloc another mbuf
13649          */
13650         if (oop) {
13651                 ut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
13652                 rte_pktmbuf_append(ut_params->obuf,
13653                                 frag_size_oop + prepend_len);
13654                 buf_oop = ut_params->obuf;
13655         }
13656
13657         /* Create AEAD session */
13658         retval = create_aead_session(ts_params->valid_devs[0],
13659                         tdata->algo,
13660                         RTE_CRYPTO_AEAD_OP_ENCRYPT,
13661                         tdata->key.data, tdata->key.len,
13662                         tdata->aad.len, tdata->auth_tag.len,
13663                         tdata->iv.len);
13664         if (retval < 0)
13665                 return retval;
13666
13667         ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
13668
13669         /* clear mbuf payload */
13670         memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
13671                         rte_pktmbuf_tailroom(ut_params->ibuf));
13672
13673         plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
13674                         plaintext_len);
13675
13676         memcpy(plaintext, tdata->plaintext.data, plaintext_len);
13677
13678         trn_data += plaintext_len;
13679
13680         buf = ut_params->ibuf;
13681
13682         /*
13683          * Loop until no more fragments
13684          */
13685
13686         while (trn_data < tdata->plaintext.len) {
13687                 ++segs;
13688                 to_trn = (tdata->plaintext.len - trn_data < fragsz) ?
13689                                 (tdata->plaintext.len - trn_data) : fragsz;
13690
13691                 to_trn_tbl[ecx++] = to_trn;
13692
13693                 buf->next = rte_pktmbuf_alloc(ts_params->mbuf_pool);
13694                 buf = buf->next;
13695
13696                 memset(rte_pktmbuf_mtod(buf, uint8_t *), 0,
13697                                 rte_pktmbuf_tailroom(buf));
13698
13699                 /* OOP */
13700                 if (oop && !fragsz_oop) {
13701                         buf_last_oop = buf_oop->next =
13702                                         rte_pktmbuf_alloc(ts_params->mbuf_pool);
13703                         buf_oop = buf_oop->next;
13704                         memset(rte_pktmbuf_mtod(buf_oop, uint8_t *),
13705                                         0, rte_pktmbuf_tailroom(buf_oop));
13706                         rte_pktmbuf_append(buf_oop, to_trn);
13707                 }
13708
13709                 plaintext = (uint8_t *)rte_pktmbuf_append(buf,
13710                                 to_trn);
13711
13712                 memcpy(plaintext, tdata->plaintext.data + trn_data,
13713                                 to_trn);
13714                 trn_data += to_trn;
13715                 if (trn_data  == tdata->plaintext.len) {
13716                         if (oop) {
13717                                 if (!fragsz_oop)
13718                                         digest_mem = rte_pktmbuf_append(buf_oop,
13719                                                 tdata->auth_tag.len);
13720                         } else
13721                                 digest_mem = (uint8_t *)rte_pktmbuf_append(buf,
13722                                         tdata->auth_tag.len);
13723                 }
13724         }
13725
13726         uint64_t digest_phys = 0;
13727
13728         ut_params->ibuf->nb_segs = segs;
13729
13730         segs = 1;
13731         if (fragsz_oop && oop) {
13732                 to_trn = 0;
13733                 ecx = 0;
13734
13735                 if (frag_size_oop == tdata->plaintext.len) {
13736                         digest_mem = rte_pktmbuf_append(ut_params->obuf,
13737                                 tdata->auth_tag.len);
13738
13739                         digest_phys = rte_pktmbuf_iova_offset(
13740                                         ut_params->obuf,
13741                                         tdata->plaintext.len + prepend_len);
13742                 }
13743
13744                 trn_data = frag_size_oop;
13745                 while (trn_data < tdata->plaintext.len) {
13746                         ++segs;
13747                         to_trn =
13748                                 (tdata->plaintext.len - trn_data <
13749                                                 frag_size_oop) ?
13750                                 (tdata->plaintext.len - trn_data) :
13751                                                 frag_size_oop;
13752
13753                         to_trn_tbl[ecx++] = to_trn;
13754
13755                         buf_last_oop = buf_oop->next =
13756                                         rte_pktmbuf_alloc(ts_params->mbuf_pool);
13757                         buf_oop = buf_oop->next;
13758                         memset(rte_pktmbuf_mtod(buf_oop, uint8_t *),
13759                                         0, rte_pktmbuf_tailroom(buf_oop));
13760                         rte_pktmbuf_append(buf_oop, to_trn);
13761
13762                         trn_data += to_trn;
13763
13764                         if (trn_data  == tdata->plaintext.len) {
13765                                 digest_mem = rte_pktmbuf_append(buf_oop,
13766                                         tdata->auth_tag.len);
13767                         }
13768                 }
13769
13770                 ut_params->obuf->nb_segs = segs;
13771         }
13772
13773         /*
13774          * Place digest at the end of the last buffer
13775          */
13776         if (!digest_phys)
13777                 digest_phys = rte_pktmbuf_iova(buf) + to_trn;
13778         if (oop && buf_last_oop)
13779                 digest_phys = rte_pktmbuf_iova(buf_last_oop) + to_trn;
13780
13781         if (!digest_mem && !oop) {
13782                 digest_mem = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
13783                                 + tdata->auth_tag.len);
13784                 digest_phys = rte_pktmbuf_iova_offset(ut_params->ibuf,
13785                                 tdata->plaintext.len);
13786         }
13787
13788         /* Create AEAD operation */
13789         retval = create_aead_operation_SGL(RTE_CRYPTO_AEAD_OP_ENCRYPT,
13790                         tdata, digest_mem, digest_phys);
13791
13792         if (retval < 0)
13793                 return retval;
13794
13795         rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
13796
13797         ut_params->op->sym->m_src = ut_params->ibuf;
13798         if (oop)
13799                 ut_params->op->sym->m_dst = ut_params->obuf;
13800
13801         /* Process crypto operation */
13802         if (oop == IN_PLACE &&
13803                         gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
13804                 process_cpu_aead_op(ts_params->valid_devs[0], ut_params->op);
13805         else if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
13806                 process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
13807                                 ut_params->op, 0, 0, 0, 0);
13808         else
13809                 TEST_ASSERT_NOT_NULL(
13810                         process_crypto_request(ts_params->valid_devs[0],
13811                         ut_params->op), "failed to process sym crypto op");
13812
13813         TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
13814                         "crypto op processing failed");
13815
13816
13817         ciphertext = rte_pktmbuf_mtod_offset(ut_params->op->sym->m_src,
13818                         uint8_t *, prepend_len);
13819         if (oop) {
13820                 ciphertext = rte_pktmbuf_mtod_offset(ut_params->op->sym->m_dst,
13821                                 uint8_t *, prepend_len);
13822         }
13823
13824         if (fragsz_oop)
13825                 fragsz = fragsz_oop;
13826
13827         TEST_ASSERT_BUFFERS_ARE_EQUAL(
13828                         ciphertext,
13829                         tdata->ciphertext.data,
13830                         fragsz,
13831                         "Ciphertext data not as expected");
13832
13833         buf = ut_params->op->sym->m_src->next;
13834         if (oop)
13835                 buf = ut_params->op->sym->m_dst->next;
13836
13837         unsigned int off = fragsz;
13838
13839         ecx = 0;
13840         while (buf) {
13841                 ciphertext = rte_pktmbuf_mtod(buf,
13842                                 uint8_t *);
13843
13844                 TEST_ASSERT_BUFFERS_ARE_EQUAL(
13845                                 ciphertext,
13846                                 tdata->ciphertext.data + off,
13847                                 to_trn_tbl[ecx],
13848                                 "Ciphertext data not as expected");
13849
13850                 off += to_trn_tbl[ecx++];
13851                 buf = buf->next;
13852         }
13853
13854         auth_tag = digest_mem;
13855         TEST_ASSERT_BUFFERS_ARE_EQUAL(
13856                         auth_tag,
13857                         tdata->auth_tag.data,
13858                         tdata->auth_tag.len,
13859                         "Generated auth tag not as expected");
13860
13861         return 0;
13862 }
13863
13864 static int
13865 test_AES_GCM_auth_encrypt_SGL_out_of_place_400B_400B(void)
13866 {
13867         return test_authenticated_encryption_SGL(
13868                         &gcm_test_case_SGL_1, OUT_OF_PLACE, 400, 400);
13869 }
13870
13871 static int
13872 test_AES_GCM_auth_encrypt_SGL_out_of_place_1500B_2000B(void)
13873 {
13874         return test_authenticated_encryption_SGL(
13875                         &gcm_test_case_SGL_1, OUT_OF_PLACE, 1500, 2000);
13876 }
13877
13878 static int
13879 test_AES_GCM_auth_encrypt_SGL_out_of_place_400B_1seg(void)
13880 {
13881         return test_authenticated_encryption_SGL(
13882                         &gcm_test_case_8, OUT_OF_PLACE, 400,
13883                         gcm_test_case_8.plaintext.len);
13884 }
13885
13886 static int
13887 test_AES_GCM_auth_encrypt_SGL_in_place_1500B(void)
13888 {
13889         /* This test is not for OPENSSL PMD */
13890         if (gbl_driver_id == rte_cryptodev_driver_id_get(
13891                         RTE_STR(CRYPTODEV_NAME_OPENSSL_PMD)))
13892                 return TEST_SKIPPED;
13893
13894         return test_authenticated_encryption_SGL(
13895                         &gcm_test_case_SGL_1, IN_PLACE, 1500, 0);
13896 }
13897
13898 static int
13899 test_authentication_verify_fail_when_data_corrupted(
13900                 struct crypto_testsuite_params *ts_params,
13901                 struct crypto_unittest_params *ut_params,
13902                 const struct test_crypto_vector *reference)
13903 {
13904         return test_authentication_verify_fail_when_data_corruption(
13905                         ts_params, ut_params, reference, 1);
13906 }
13907
13908 static int
13909 test_authentication_verify_fail_when_tag_corrupted(
13910                 struct crypto_testsuite_params *ts_params,
13911                 struct crypto_unittest_params *ut_params,
13912                 const struct test_crypto_vector *reference)
13913 {
13914         return test_authentication_verify_fail_when_data_corruption(
13915                         ts_params, ut_params, reference, 0);
13916 }
13917
13918 static int
13919 test_authentication_verify_GMAC_fail_when_data_corrupted(
13920                 struct crypto_testsuite_params *ts_params,
13921                 struct crypto_unittest_params *ut_params,
13922                 const struct test_crypto_vector *reference)
13923 {
13924         return test_authentication_verify_GMAC_fail_when_corruption(
13925                         ts_params, ut_params, reference, 1);
13926 }
13927
13928 static int
13929 test_authentication_verify_GMAC_fail_when_tag_corrupted(
13930                 struct crypto_testsuite_params *ts_params,
13931                 struct crypto_unittest_params *ut_params,
13932                 const struct test_crypto_vector *reference)
13933 {
13934         return test_authentication_verify_GMAC_fail_when_corruption(
13935                         ts_params, ut_params, reference, 0);
13936 }
13937
13938 static int
13939 test_authenticated_decryption_fail_when_data_corrupted(
13940                 struct crypto_testsuite_params *ts_params,
13941                 struct crypto_unittest_params *ut_params,
13942                 const struct test_crypto_vector *reference)
13943 {
13944         return test_authenticated_decryption_fail_when_corruption(
13945                         ts_params, ut_params, reference, 1);
13946 }
13947
13948 static int
13949 test_authenticated_decryption_fail_when_tag_corrupted(
13950                 struct crypto_testsuite_params *ts_params,
13951                 struct crypto_unittest_params *ut_params,
13952                 const struct test_crypto_vector *reference)
13953 {
13954         return test_authenticated_decryption_fail_when_corruption(
13955                         ts_params, ut_params, reference, 0);
13956 }
13957
13958 static int
13959 authentication_verify_HMAC_SHA1_fail_data_corrupt(void)
13960 {
13961         return test_authentication_verify_fail_when_data_corrupted(
13962                         &testsuite_params, &unittest_params,
13963                         &hmac_sha1_test_crypto_vector);
13964 }
13965
13966 static int
13967 authentication_verify_HMAC_SHA1_fail_tag_corrupt(void)
13968 {
13969         return test_authentication_verify_fail_when_tag_corrupted(
13970                         &testsuite_params, &unittest_params,
13971                         &hmac_sha1_test_crypto_vector);
13972 }
13973
13974 static int
13975 authentication_verify_AES128_GMAC_fail_data_corrupt(void)
13976 {
13977         return test_authentication_verify_GMAC_fail_when_data_corrupted(
13978                         &testsuite_params, &unittest_params,
13979                         &aes128_gmac_test_vector);
13980 }
13981
13982 static int
13983 authentication_verify_AES128_GMAC_fail_tag_corrupt(void)
13984 {
13985         return test_authentication_verify_GMAC_fail_when_tag_corrupted(
13986                         &testsuite_params, &unittest_params,
13987                         &aes128_gmac_test_vector);
13988 }
13989
13990 static int
13991 auth_decryption_AES128CBC_HMAC_SHA1_fail_data_corrupt(void)
13992 {
13993         return test_authenticated_decryption_fail_when_data_corrupted(
13994                         &testsuite_params,
13995                         &unittest_params,
13996                         &aes128cbc_hmac_sha1_test_vector);
13997 }
13998
13999 static int
14000 auth_decryption_AES128CBC_HMAC_SHA1_fail_tag_corrupt(void)
14001 {
14002         return test_authenticated_decryption_fail_when_tag_corrupted(
14003                         &testsuite_params,
14004                         &unittest_params,
14005                         &aes128cbc_hmac_sha1_test_vector);
14006 }
14007
14008 static int
14009 auth_encrypt_AES128CBC_HMAC_SHA1_esn_check(void)
14010 {
14011         return test_authenticated_encrypt_with_esn(
14012                         &testsuite_params,
14013                         &unittest_params,
14014                         &aes128cbc_hmac_sha1_aad_test_vector);
14015 }
14016
14017 static int
14018 auth_decrypt_AES128CBC_HMAC_SHA1_esn_check(void)
14019 {
14020         return test_authenticated_decrypt_with_esn(
14021                         &testsuite_params,
14022                         &unittest_params,
14023                         &aes128cbc_hmac_sha1_aad_test_vector);
14024 }
14025
14026 static int
14027 test_chacha20_poly1305_encrypt_test_case_rfc8439(void)
14028 {
14029         return test_authenticated_encryption(&chacha20_poly1305_case_rfc8439);
14030 }
14031
14032 static int
14033 test_chacha20_poly1305_decrypt_test_case_rfc8439(void)
14034 {
14035         return test_authenticated_decryption(&chacha20_poly1305_case_rfc8439);
14036 }
14037
14038 #ifdef RTE_CRYPTO_SCHEDULER
14039
14040 /* global AESNI worker IDs for the scheduler test */
14041 uint8_t aesni_ids[2];
14042
14043 static int
14044 scheduler_testsuite_setup(void)
14045 {
14046         uint32_t i = 0;
14047         int32_t nb_devs, ret;
14048         char vdev_args[VDEV_ARGS_SIZE] = {""};
14049         char temp_str[VDEV_ARGS_SIZE] = {"mode=multi-core,"
14050                 "ordering=enable,name=cryptodev_test_scheduler,corelist="};
14051         uint16_t worker_core_count = 0;
14052         uint16_t socket_id = 0;
14053
14054         if (gbl_driver_id == rte_cryptodev_driver_id_get(
14055                         RTE_STR(CRYPTODEV_NAME_SCHEDULER_PMD))) {
14056
14057                 /* Identify the Worker Cores
14058                  * Use 2 worker cores for the device args
14059                  */
14060                 RTE_LCORE_FOREACH_WORKER(i) {
14061                         if (worker_core_count > 1)
14062                                 break;
14063                         snprintf(vdev_args, sizeof(vdev_args),
14064                                         "%s%d", temp_str, i);
14065                         strcpy(temp_str, vdev_args);
14066                         strlcat(temp_str, ";", sizeof(temp_str));
14067                         worker_core_count++;
14068                         socket_id = rte_lcore_to_socket_id(i);
14069                 }
14070                 if (worker_core_count != 2) {
14071                         RTE_LOG(ERR, USER1,
14072                                 "Cryptodev scheduler test require at least "
14073                                 "two worker cores to run. "
14074                                 "Please use the correct coremask.\n");
14075                         return TEST_FAILED;
14076                 }
14077                 strcpy(temp_str, vdev_args);
14078                 snprintf(vdev_args, sizeof(vdev_args), "%s,socket_id=%d",
14079                                 temp_str, socket_id);
14080                 RTE_LOG(DEBUG, USER1, "vdev_args: %s\n", vdev_args);
14081                 nb_devs = rte_cryptodev_device_count_by_driver(
14082                                 rte_cryptodev_driver_id_get(
14083                                 RTE_STR(CRYPTODEV_NAME_SCHEDULER_PMD)));
14084                 if (nb_devs < 1) {
14085                         ret = rte_vdev_init(
14086                                 RTE_STR(CRYPTODEV_NAME_SCHEDULER_PMD),
14087                                         vdev_args);
14088                         TEST_ASSERT(ret == 0,
14089                                 "Failed to create instance %u of pmd : %s",
14090                                 i, RTE_STR(CRYPTODEV_NAME_SCHEDULER_PMD));
14091                 }
14092         }
14093         return testsuite_setup();
14094 }
14095
14096 static int
14097 test_scheduler_attach_worker_op(void)
14098 {
14099         struct crypto_testsuite_params *ts_params = &testsuite_params;
14100         uint8_t sched_id = ts_params->valid_devs[0];
14101         uint32_t i, nb_devs_attached = 0;
14102         int ret;
14103         char vdev_name[32];
14104         unsigned int count = rte_cryptodev_count();
14105
14106         /* create 2 AESNI_MB vdevs on top of existing devices */
14107         for (i = count; i < count + 2; i++) {
14108                 snprintf(vdev_name, sizeof(vdev_name), "%s_%u",
14109                                 RTE_STR(CRYPTODEV_NAME_AESNI_MB_PMD),
14110                                 i);
14111                 ret = rte_vdev_init(vdev_name, NULL);
14112
14113                 TEST_ASSERT(ret == 0,
14114                         "Failed to create instance %u of"
14115                         " pmd : %s",
14116                         i, RTE_STR(CRYPTODEV_NAME_AESNI_MB_PMD));
14117
14118                 if (ret < 0) {
14119                         RTE_LOG(ERR, USER1,
14120                                 "Failed to create 2 AESNI MB PMDs.\n");
14121                         return TEST_SKIPPED;
14122                 }
14123         }
14124
14125         /* attach 2 AESNI_MB cdevs */
14126         for (i = count; i < count + 2; i++) {
14127                 struct rte_cryptodev_info info;
14128                 unsigned int session_size;
14129
14130                 rte_cryptodev_info_get(i, &info);
14131                 if (info.driver_id != rte_cryptodev_driver_id_get(
14132                                 RTE_STR(CRYPTODEV_NAME_AESNI_MB_PMD)))
14133                         continue;
14134
14135                 session_size = rte_cryptodev_sym_get_private_session_size(i);
14136                 /*
14137                  * Create the session mempool again, since now there are new devices
14138                  * to use the mempool.
14139                  */
14140                 if (ts_params->session_mpool) {
14141                         rte_mempool_free(ts_params->session_mpool);
14142                         ts_params->session_mpool = NULL;
14143                 }
14144                 if (ts_params->session_priv_mpool) {
14145                         rte_mempool_free(ts_params->session_priv_mpool);
14146                         ts_params->session_priv_mpool = NULL;
14147                 }
14148
14149                 if (info.sym.max_nb_sessions != 0 &&
14150                                 info.sym.max_nb_sessions < MAX_NB_SESSIONS) {
14151                         RTE_LOG(ERR, USER1,
14152                                         "Device does not support "
14153                                         "at least %u sessions\n",
14154                                         MAX_NB_SESSIONS);
14155                         return TEST_FAILED;
14156                 }
14157                 /*
14158                  * Create mempool with maximum number of sessions,
14159                  * to include the session headers
14160                  */
14161                 if (ts_params->session_mpool == NULL) {
14162                         ts_params->session_mpool =
14163                                 rte_cryptodev_sym_session_pool_create(
14164                                                 "test_sess_mp",
14165                                                 MAX_NB_SESSIONS, 0, 0, 0,
14166                                                 SOCKET_ID_ANY);
14167                         TEST_ASSERT_NOT_NULL(ts_params->session_mpool,
14168                                         "session mempool allocation failed");
14169                 }
14170
14171                 /*
14172                  * Create mempool with maximum number of sessions,
14173                  * to include device specific session private data
14174                  */
14175                 if (ts_params->session_priv_mpool == NULL) {
14176                         ts_params->session_priv_mpool = rte_mempool_create(
14177                                         "test_sess_mp_priv",
14178                                         MAX_NB_SESSIONS,
14179                                         session_size,
14180                                         0, 0, NULL, NULL, NULL,
14181                                         NULL, SOCKET_ID_ANY,
14182                                         0);
14183
14184                         TEST_ASSERT_NOT_NULL(ts_params->session_priv_mpool,
14185                                         "session mempool allocation failed");
14186                 }
14187
14188                 ts_params->qp_conf.mp_session = ts_params->session_mpool;
14189                 ts_params->qp_conf.mp_session_private =
14190                                 ts_params->session_priv_mpool;
14191
14192                 ret = rte_cryptodev_scheduler_worker_attach(sched_id,
14193                                 (uint8_t)i);
14194
14195                 TEST_ASSERT(ret == 0,
14196                         "Failed to attach device %u of pmd : %s", i,
14197                         RTE_STR(CRYPTODEV_NAME_AESNI_MB_PMD));
14198
14199                 aesni_ids[nb_devs_attached] = (uint8_t)i;
14200
14201                 nb_devs_attached++;
14202         }
14203
14204         return 0;
14205 }
14206
14207 static int
14208 test_scheduler_detach_worker_op(void)
14209 {
14210         struct crypto_testsuite_params *ts_params = &testsuite_params;
14211         uint8_t sched_id = ts_params->valid_devs[0];
14212         uint32_t i;
14213         int ret;
14214
14215         for (i = 0; i < 2; i++) {
14216                 ret = rte_cryptodev_scheduler_worker_detach(sched_id,
14217                                 aesni_ids[i]);
14218                 TEST_ASSERT(ret == 0,
14219                         "Failed to detach device %u", aesni_ids[i]);
14220         }
14221
14222         return 0;
14223 }
14224
14225 static int
14226 test_scheduler_mode_op(enum rte_cryptodev_scheduler_mode scheduler_mode)
14227 {
14228         struct crypto_testsuite_params *ts_params = &testsuite_params;
14229         uint8_t sched_id = ts_params->valid_devs[0];
14230         /* set mode */
14231         return rte_cryptodev_scheduler_mode_set(sched_id,
14232                 scheduler_mode);
14233 }
14234
14235 static int
14236 test_scheduler_mode_roundrobin_op(void)
14237 {
14238         TEST_ASSERT(test_scheduler_mode_op(CDEV_SCHED_MODE_ROUNDROBIN) ==
14239                         0, "Failed to set roundrobin mode");
14240         return 0;
14241
14242 }
14243
14244 static int
14245 test_scheduler_mode_multicore_op(void)
14246 {
14247         TEST_ASSERT(test_scheduler_mode_op(CDEV_SCHED_MODE_MULTICORE) ==
14248                         0, "Failed to set multicore mode");
14249
14250         return 0;
14251 }
14252
14253 static int
14254 test_scheduler_mode_failover_op(void)
14255 {
14256         TEST_ASSERT(test_scheduler_mode_op(CDEV_SCHED_MODE_FAILOVER) ==
14257                         0, "Failed to set failover mode");
14258
14259         return 0;
14260 }
14261
14262 static int
14263 test_scheduler_mode_pkt_size_distr_op(void)
14264 {
14265         TEST_ASSERT(test_scheduler_mode_op(CDEV_SCHED_MODE_PKT_SIZE_DISTR) ==
14266                         0, "Failed to set pktsize mode");
14267
14268         return 0;
14269 }
14270
14271 static int
14272 scheduler_multicore_testsuite_setup(void)
14273 {
14274         if (test_scheduler_attach_worker_op() < 0)
14275                 return TEST_SKIPPED;
14276         if (test_scheduler_mode_op(CDEV_SCHED_MODE_MULTICORE) < 0)
14277                 return TEST_SKIPPED;
14278         return 0;
14279 }
14280
14281 static int
14282 scheduler_roundrobin_testsuite_setup(void)
14283 {
14284         if (test_scheduler_attach_worker_op() < 0)
14285                 return TEST_SKIPPED;
14286         if (test_scheduler_mode_op(CDEV_SCHED_MODE_ROUNDROBIN) < 0)
14287                 return TEST_SKIPPED;
14288         return 0;
14289 }
14290
14291 static int
14292 scheduler_failover_testsuite_setup(void)
14293 {
14294         if (test_scheduler_attach_worker_op() < 0)
14295                 return TEST_SKIPPED;
14296         if (test_scheduler_mode_op(CDEV_SCHED_MODE_FAILOVER) < 0)
14297                 return TEST_SKIPPED;
14298         return 0;
14299 }
14300
14301 static int
14302 scheduler_pkt_size_distr_testsuite_setup(void)
14303 {
14304         if (test_scheduler_attach_worker_op() < 0)
14305                 return TEST_SKIPPED;
14306         if (test_scheduler_mode_op(CDEV_SCHED_MODE_PKT_SIZE_DISTR) < 0)
14307                 return TEST_SKIPPED;
14308         return 0;
14309 }
14310
14311 static void
14312 scheduler_mode_testsuite_teardown(void)
14313 {
14314         test_scheduler_detach_worker_op();
14315 }
14316
14317 #endif /* RTE_CRYPTO_SCHEDULER */
14318
14319 static struct unit_test_suite end_testsuite = {
14320         .suite_name = NULL,
14321         .setup = NULL,
14322         .teardown = NULL,
14323         .unit_test_suites = NULL
14324 };
14325
14326 #ifdef RTE_LIB_SECURITY
14327 static struct unit_test_suite ipsec_proto_testsuite  = {
14328         .suite_name = "IPsec Proto Unit Test Suite",
14329         .setup = ipsec_proto_testsuite_setup,
14330         .unit_test_cases = {
14331                 TEST_CASE_NAMED_WITH_DATA(
14332                         "Outbound known vector (ESP tunnel mode IPv4 AES-GCM 128)",
14333                         ut_setup_security, ut_teardown,
14334                         test_ipsec_proto_known_vec, &pkt_aes_128_gcm),
14335                 TEST_CASE_NAMED_WITH_DATA(
14336                         "Outbound known vector (ESP tunnel mode IPv4 AES-GCM 192)",
14337                         ut_setup_security, ut_teardown,
14338                         test_ipsec_proto_known_vec, &pkt_aes_192_gcm),
14339                 TEST_CASE_NAMED_WITH_DATA(
14340                         "Outbound known vector (ESP tunnel mode IPv4 AES-GCM 256)",
14341                         ut_setup_security, ut_teardown,
14342                         test_ipsec_proto_known_vec, &pkt_aes_256_gcm),
14343                 TEST_CASE_NAMED_WITH_DATA(
14344                         "Inbound known vector (ESP tunnel mode IPv4 AES-GCM 128)",
14345                         ut_setup_security, ut_teardown,
14346                         test_ipsec_proto_known_vec_inb, &pkt_aes_128_gcm),
14347                 TEST_CASE_NAMED_WITH_DATA(
14348                         "Inbound known vector (ESP tunnel mode IPv4 AES-GCM 192)",
14349                         ut_setup_security, ut_teardown,
14350                         test_ipsec_proto_known_vec_inb, &pkt_aes_192_gcm),
14351                 TEST_CASE_NAMED_WITH_DATA(
14352                         "Inbound known vector (ESP tunnel mode IPv4 AES-GCM 256)",
14353                         ut_setup_security, ut_teardown,
14354                         test_ipsec_proto_known_vec_inb, &pkt_aes_256_gcm),
14355                 TEST_CASE_NAMED_ST(
14356                         "Combined test alg list",
14357                         ut_setup_security, ut_teardown,
14358                         test_ipsec_proto_display_list),
14359                 TEST_CASE_NAMED_ST(
14360                         "IV generation",
14361                         ut_setup_security, ut_teardown,
14362                         test_ipsec_proto_iv_gen),
14363                 TEST_CASE_NAMED_ST(
14364                         "UDP encapsulation",
14365                         ut_setup_security, ut_teardown,
14366                         test_ipsec_proto_udp_encap),
14367                 TEST_CASE_NAMED_ST(
14368                         "UDP encapsulation ports verification test",
14369                         ut_setup_security, ut_teardown,
14370                         test_ipsec_proto_udp_ports_verify),
14371                 TEST_CASE_NAMED_ST(
14372                         "SA expiry packets soft",
14373                         ut_setup_security, ut_teardown,
14374                         test_ipsec_proto_sa_exp_pkts_soft),
14375                 TEST_CASE_NAMED_ST(
14376                         "SA expiry packets hard",
14377                         ut_setup_security, ut_teardown,
14378                         test_ipsec_proto_sa_exp_pkts_hard),
14379                 TEST_CASE_NAMED_ST(
14380                         "Negative test: ICV corruption",
14381                         ut_setup_security, ut_teardown,
14382                         test_ipsec_proto_err_icv_corrupt),
14383                 TEST_CASE_NAMED_ST(
14384                         "Tunnel dst addr verification",
14385                         ut_setup_security, ut_teardown,
14386                         test_ipsec_proto_tunnel_dst_addr_verify),
14387                 TEST_CASE_NAMED_ST(
14388                         "Tunnel src and dst addr verification",
14389                         ut_setup_security, ut_teardown,
14390                         test_ipsec_proto_tunnel_src_dst_addr_verify),
14391                 TEST_CASE_NAMED_ST(
14392                         "Inner IP checksum",
14393                         ut_setup_security, ut_teardown,
14394                         test_ipsec_proto_inner_ip_csum),
14395                 TEST_CASE_NAMED_ST(
14396                         "Inner L4 checksum",
14397                         ut_setup_security, ut_teardown,
14398                         test_ipsec_proto_inner_l4_csum),
14399                 TEST_CASES_END() /**< NULL terminate unit test array */
14400         }
14401 };
14402
14403 static struct unit_test_suite pdcp_proto_testsuite  = {
14404         .suite_name = "PDCP Proto Unit Test Suite",
14405         .setup = pdcp_proto_testsuite_setup,
14406         .unit_test_cases = {
14407                 TEST_CASE_ST(ut_setup_security, ut_teardown,
14408                         test_PDCP_PROTO_all),
14409                 TEST_CASES_END() /**< NULL terminate unit test array */
14410         }
14411 };
14412
14413 static struct unit_test_suite docsis_proto_testsuite  = {
14414         .suite_name = "Docsis Proto Unit Test Suite",
14415         .setup = docsis_proto_testsuite_setup,
14416         .unit_test_cases = {
14417                 TEST_CASE_ST(ut_setup_security, ut_teardown,
14418                         test_DOCSIS_PROTO_all),
14419                 TEST_CASES_END() /**< NULL terminate unit test array */
14420         }
14421 };
14422 #endif
14423
14424 static struct unit_test_suite cryptodev_gen_testsuite  = {
14425         .suite_name = "Crypto General Unit Test Suite",
14426         .setup = crypto_gen_testsuite_setup,
14427         .unit_test_cases = {
14428                 TEST_CASE_ST(ut_setup, ut_teardown,
14429                                 test_device_configure_invalid_dev_id),
14430                 TEST_CASE_ST(ut_setup, ut_teardown,
14431                                 test_queue_pair_descriptor_setup),
14432                 TEST_CASE_ST(ut_setup, ut_teardown,
14433                                 test_device_configure_invalid_queue_pair_ids),
14434                 TEST_CASE_ST(ut_setup, ut_teardown, test_stats),
14435                 TEST_CASE_ST(ut_setup, ut_teardown, test_enq_callback_setup),
14436                 TEST_CASE_ST(ut_setup, ut_teardown, test_deq_callback_setup),
14437                 TEST_CASES_END() /**< NULL terminate unit test array */
14438         }
14439 };
14440
14441 static struct unit_test_suite cryptodev_negative_hmac_sha1_testsuite = {
14442         .suite_name = "Negative HMAC SHA1 Unit Test Suite",
14443         .setup = negative_hmac_sha1_testsuite_setup,
14444         .unit_test_cases = {
14445                 /** Negative tests */
14446                 TEST_CASE_ST(ut_setup, ut_teardown,
14447                         authentication_verify_HMAC_SHA1_fail_data_corrupt),
14448                 TEST_CASE_ST(ut_setup, ut_teardown,
14449                         authentication_verify_HMAC_SHA1_fail_tag_corrupt),
14450                 TEST_CASE_ST(ut_setup, ut_teardown,
14451                         auth_decryption_AES128CBC_HMAC_SHA1_fail_data_corrupt),
14452                 TEST_CASE_ST(ut_setup, ut_teardown,
14453                         auth_decryption_AES128CBC_HMAC_SHA1_fail_tag_corrupt),
14454
14455                 TEST_CASES_END() /**< NULL terminate unit test array */
14456         }
14457 };
14458
14459 static struct unit_test_suite cryptodev_multi_session_testsuite = {
14460         .suite_name = "Multi Session Unit Test Suite",
14461         .setup = multi_session_testsuite_setup,
14462         .unit_test_cases = {
14463                 TEST_CASE_ST(ut_setup, ut_teardown, test_multi_session),
14464                 TEST_CASE_ST(ut_setup, ut_teardown,
14465                                 test_multi_session_random_usage),
14466
14467                 TEST_CASES_END() /**< NULL terminate unit test array */
14468         }
14469 };
14470
14471 static struct unit_test_suite cryptodev_null_testsuite  = {
14472         .suite_name = "NULL Test Suite",
14473         .setup = null_testsuite_setup,
14474         .unit_test_cases = {
14475                 TEST_CASE_ST(ut_setup, ut_teardown,
14476                         test_null_invalid_operation),
14477                 TEST_CASE_ST(ut_setup, ut_teardown, test_null_burst_operation),
14478                 TEST_CASES_END()
14479         }
14480 };
14481
14482 static struct unit_test_suite cryptodev_aes_ccm_auth_testsuite  = {
14483         .suite_name = "AES CCM Authenticated Test Suite",
14484         .setup = aes_ccm_auth_testsuite_setup,
14485         .unit_test_cases = {
14486                 /** AES CCM Authenticated Encryption 128 bits key*/
14487                 TEST_CASE_ST(ut_setup, ut_teardown,
14488                         test_AES_CCM_authenticated_encryption_test_case_128_1),
14489                 TEST_CASE_ST(ut_setup, ut_teardown,
14490                         test_AES_CCM_authenticated_encryption_test_case_128_2),
14491                 TEST_CASE_ST(ut_setup, ut_teardown,
14492                         test_AES_CCM_authenticated_encryption_test_case_128_3),
14493
14494                 /** AES CCM Authenticated Decryption 128 bits key*/
14495                 TEST_CASE_ST(ut_setup, ut_teardown,
14496                         test_AES_CCM_authenticated_decryption_test_case_128_1),
14497                 TEST_CASE_ST(ut_setup, ut_teardown,
14498                         test_AES_CCM_authenticated_decryption_test_case_128_2),
14499                 TEST_CASE_ST(ut_setup, ut_teardown,
14500                         test_AES_CCM_authenticated_decryption_test_case_128_3),
14501
14502                 /** AES CCM Authenticated Encryption 192 bits key */
14503                 TEST_CASE_ST(ut_setup, ut_teardown,
14504                         test_AES_CCM_authenticated_encryption_test_case_192_1),
14505                 TEST_CASE_ST(ut_setup, ut_teardown,
14506                         test_AES_CCM_authenticated_encryption_test_case_192_2),
14507                 TEST_CASE_ST(ut_setup, ut_teardown,
14508                         test_AES_CCM_authenticated_encryption_test_case_192_3),
14509
14510                 /** AES CCM Authenticated Decryption 192 bits key*/
14511                 TEST_CASE_ST(ut_setup, ut_teardown,
14512                         test_AES_CCM_authenticated_decryption_test_case_192_1),
14513                 TEST_CASE_ST(ut_setup, ut_teardown,
14514                         test_AES_CCM_authenticated_decryption_test_case_192_2),
14515                 TEST_CASE_ST(ut_setup, ut_teardown,
14516                         test_AES_CCM_authenticated_decryption_test_case_192_3),
14517
14518                 /** AES CCM Authenticated Encryption 256 bits key */
14519                 TEST_CASE_ST(ut_setup, ut_teardown,
14520                         test_AES_CCM_authenticated_encryption_test_case_256_1),
14521                 TEST_CASE_ST(ut_setup, ut_teardown,
14522                         test_AES_CCM_authenticated_encryption_test_case_256_2),
14523                 TEST_CASE_ST(ut_setup, ut_teardown,
14524                         test_AES_CCM_authenticated_encryption_test_case_256_3),
14525
14526                 /** AES CCM Authenticated Decryption 256 bits key*/
14527                 TEST_CASE_ST(ut_setup, ut_teardown,
14528                         test_AES_CCM_authenticated_decryption_test_case_256_1),
14529                 TEST_CASE_ST(ut_setup, ut_teardown,
14530                         test_AES_CCM_authenticated_decryption_test_case_256_2),
14531                 TEST_CASE_ST(ut_setup, ut_teardown,
14532                         test_AES_CCM_authenticated_decryption_test_case_256_3),
14533                 TEST_CASES_END()
14534         }
14535 };
14536
14537 static struct unit_test_suite cryptodev_aes_gcm_auth_testsuite  = {
14538         .suite_name = "AES GCM Authenticated Test Suite",
14539         .setup = aes_gcm_auth_testsuite_setup,
14540         .unit_test_cases = {
14541                 /** AES GCM Authenticated Encryption */
14542                 TEST_CASE_ST(ut_setup, ut_teardown,
14543                         test_AES_GCM_auth_encrypt_SGL_in_place_1500B),
14544                 TEST_CASE_ST(ut_setup, ut_teardown,
14545                         test_AES_GCM_auth_encrypt_SGL_out_of_place_400B_400B),
14546                 TEST_CASE_ST(ut_setup, ut_teardown,
14547                         test_AES_GCM_auth_encrypt_SGL_out_of_place_1500B_2000B),
14548                 TEST_CASE_ST(ut_setup, ut_teardown,
14549                         test_AES_GCM_auth_encrypt_SGL_out_of_place_400B_1seg),
14550                 TEST_CASE_ST(ut_setup, ut_teardown,
14551                         test_AES_GCM_authenticated_encryption_test_case_1),
14552                 TEST_CASE_ST(ut_setup, ut_teardown,
14553                         test_AES_GCM_authenticated_encryption_test_case_2),
14554                 TEST_CASE_ST(ut_setup, ut_teardown,
14555                         test_AES_GCM_authenticated_encryption_test_case_3),
14556                 TEST_CASE_ST(ut_setup, ut_teardown,
14557                         test_AES_GCM_authenticated_encryption_test_case_4),
14558                 TEST_CASE_ST(ut_setup, ut_teardown,
14559                         test_AES_GCM_authenticated_encryption_test_case_5),
14560                 TEST_CASE_ST(ut_setup, ut_teardown,
14561                         test_AES_GCM_authenticated_encryption_test_case_6),
14562                 TEST_CASE_ST(ut_setup, ut_teardown,
14563                         test_AES_GCM_authenticated_encryption_test_case_7),
14564                 TEST_CASE_ST(ut_setup, ut_teardown,
14565                         test_AES_GCM_authenticated_encryption_test_case_8),
14566                 TEST_CASE_ST(ut_setup, ut_teardown,
14567                         test_AES_GCM_J0_authenticated_encryption_test_case_1),
14568
14569                 /** AES GCM Authenticated Decryption */
14570                 TEST_CASE_ST(ut_setup, ut_teardown,
14571                         test_AES_GCM_authenticated_decryption_test_case_1),
14572                 TEST_CASE_ST(ut_setup, ut_teardown,
14573                         test_AES_GCM_authenticated_decryption_test_case_2),
14574                 TEST_CASE_ST(ut_setup, ut_teardown,
14575                         test_AES_GCM_authenticated_decryption_test_case_3),
14576                 TEST_CASE_ST(ut_setup, ut_teardown,
14577                         test_AES_GCM_authenticated_decryption_test_case_4),
14578                 TEST_CASE_ST(ut_setup, ut_teardown,
14579                         test_AES_GCM_authenticated_decryption_test_case_5),
14580                 TEST_CASE_ST(ut_setup, ut_teardown,
14581                         test_AES_GCM_authenticated_decryption_test_case_6),
14582                 TEST_CASE_ST(ut_setup, ut_teardown,
14583                         test_AES_GCM_authenticated_decryption_test_case_7),
14584                 TEST_CASE_ST(ut_setup, ut_teardown,
14585                         test_AES_GCM_authenticated_decryption_test_case_8),
14586                 TEST_CASE_ST(ut_setup, ut_teardown,
14587                         test_AES_GCM_J0_authenticated_decryption_test_case_1),
14588
14589                 /** AES GCM Authenticated Encryption 192 bits key */
14590                 TEST_CASE_ST(ut_setup, ut_teardown,
14591                         test_AES_GCM_auth_encryption_test_case_192_1),
14592                 TEST_CASE_ST(ut_setup, ut_teardown,
14593                         test_AES_GCM_auth_encryption_test_case_192_2),
14594                 TEST_CASE_ST(ut_setup, ut_teardown,
14595                         test_AES_GCM_auth_encryption_test_case_192_3),
14596                 TEST_CASE_ST(ut_setup, ut_teardown,
14597                         test_AES_GCM_auth_encryption_test_case_192_4),
14598                 TEST_CASE_ST(ut_setup, ut_teardown,
14599                         test_AES_GCM_auth_encryption_test_case_192_5),
14600                 TEST_CASE_ST(ut_setup, ut_teardown,
14601                         test_AES_GCM_auth_encryption_test_case_192_6),
14602                 TEST_CASE_ST(ut_setup, ut_teardown,
14603                         test_AES_GCM_auth_encryption_test_case_192_7),
14604
14605                 /** AES GCM Authenticated Decryption 192 bits key */
14606                 TEST_CASE_ST(ut_setup, ut_teardown,
14607                         test_AES_GCM_auth_decryption_test_case_192_1),
14608                 TEST_CASE_ST(ut_setup, ut_teardown,
14609                         test_AES_GCM_auth_decryption_test_case_192_2),
14610                 TEST_CASE_ST(ut_setup, ut_teardown,
14611                         test_AES_GCM_auth_decryption_test_case_192_3),
14612                 TEST_CASE_ST(ut_setup, ut_teardown,
14613                         test_AES_GCM_auth_decryption_test_case_192_4),
14614                 TEST_CASE_ST(ut_setup, ut_teardown,
14615                         test_AES_GCM_auth_decryption_test_case_192_5),
14616                 TEST_CASE_ST(ut_setup, ut_teardown,
14617                         test_AES_GCM_auth_decryption_test_case_192_6),
14618                 TEST_CASE_ST(ut_setup, ut_teardown,
14619                         test_AES_GCM_auth_decryption_test_case_192_7),
14620
14621                 /** AES GCM Authenticated Encryption 256 bits key */
14622                 TEST_CASE_ST(ut_setup, ut_teardown,
14623                         test_AES_GCM_auth_encryption_test_case_256_1),
14624                 TEST_CASE_ST(ut_setup, ut_teardown,
14625                         test_AES_GCM_auth_encryption_test_case_256_2),
14626                 TEST_CASE_ST(ut_setup, ut_teardown,
14627                         test_AES_GCM_auth_encryption_test_case_256_3),
14628                 TEST_CASE_ST(ut_setup, ut_teardown,
14629                         test_AES_GCM_auth_encryption_test_case_256_4),
14630                 TEST_CASE_ST(ut_setup, ut_teardown,
14631                         test_AES_GCM_auth_encryption_test_case_256_5),
14632                 TEST_CASE_ST(ut_setup, ut_teardown,
14633                         test_AES_GCM_auth_encryption_test_case_256_6),
14634                 TEST_CASE_ST(ut_setup, ut_teardown,
14635                         test_AES_GCM_auth_encryption_test_case_256_7),
14636
14637                 /** AES GCM Authenticated Decryption 256 bits key */
14638                 TEST_CASE_ST(ut_setup, ut_teardown,
14639                         test_AES_GCM_auth_decryption_test_case_256_1),
14640                 TEST_CASE_ST(ut_setup, ut_teardown,
14641                         test_AES_GCM_auth_decryption_test_case_256_2),
14642                 TEST_CASE_ST(ut_setup, ut_teardown,
14643                         test_AES_GCM_auth_decryption_test_case_256_3),
14644                 TEST_CASE_ST(ut_setup, ut_teardown,
14645                         test_AES_GCM_auth_decryption_test_case_256_4),
14646                 TEST_CASE_ST(ut_setup, ut_teardown,
14647                         test_AES_GCM_auth_decryption_test_case_256_5),
14648                 TEST_CASE_ST(ut_setup, ut_teardown,
14649                         test_AES_GCM_auth_decryption_test_case_256_6),
14650                 TEST_CASE_ST(ut_setup, ut_teardown,
14651                         test_AES_GCM_auth_decryption_test_case_256_7),
14652
14653                 /** AES GCM Authenticated Encryption big aad size */
14654                 TEST_CASE_ST(ut_setup, ut_teardown,
14655                         test_AES_GCM_auth_encryption_test_case_aad_1),
14656                 TEST_CASE_ST(ut_setup, ut_teardown,
14657                         test_AES_GCM_auth_encryption_test_case_aad_2),
14658
14659                 /** AES GCM Authenticated Decryption big aad size */
14660                 TEST_CASE_ST(ut_setup, ut_teardown,
14661                         test_AES_GCM_auth_decryption_test_case_aad_1),
14662                 TEST_CASE_ST(ut_setup, ut_teardown,
14663                         test_AES_GCM_auth_decryption_test_case_aad_2),
14664
14665                 /** Out of place tests */
14666                 TEST_CASE_ST(ut_setup, ut_teardown,
14667                         test_AES_GCM_authenticated_encryption_oop_test_case_1),
14668                 TEST_CASE_ST(ut_setup, ut_teardown,
14669                         test_AES_GCM_authenticated_decryption_oop_test_case_1),
14670
14671                 /** Session-less tests */
14672                 TEST_CASE_ST(ut_setup, ut_teardown,
14673                         test_AES_GCM_authenticated_encryption_sessionless_test_case_1),
14674                 TEST_CASE_ST(ut_setup, ut_teardown,
14675                         test_AES_GCM_authenticated_decryption_sessionless_test_case_1),
14676
14677                 TEST_CASES_END()
14678         }
14679 };
14680
14681 static struct unit_test_suite cryptodev_aes_gmac_auth_testsuite  = {
14682         .suite_name = "AES GMAC Authentication Test Suite",
14683         .setup = aes_gmac_auth_testsuite_setup,
14684         .unit_test_cases = {
14685                 TEST_CASE_ST(ut_setup, ut_teardown,
14686                         test_AES_GMAC_authentication_test_case_1),
14687                 TEST_CASE_ST(ut_setup, ut_teardown,
14688                         test_AES_GMAC_authentication_verify_test_case_1),
14689                 TEST_CASE_ST(ut_setup, ut_teardown,
14690                         test_AES_GMAC_authentication_test_case_2),
14691                 TEST_CASE_ST(ut_setup, ut_teardown,
14692                         test_AES_GMAC_authentication_verify_test_case_2),
14693                 TEST_CASE_ST(ut_setup, ut_teardown,
14694                         test_AES_GMAC_authentication_test_case_3),
14695                 TEST_CASE_ST(ut_setup, ut_teardown,
14696                         test_AES_GMAC_authentication_verify_test_case_3),
14697                 TEST_CASE_ST(ut_setup, ut_teardown,
14698                         test_AES_GMAC_authentication_test_case_4),
14699                 TEST_CASE_ST(ut_setup, ut_teardown,
14700                         test_AES_GMAC_authentication_verify_test_case_4),
14701                 TEST_CASE_ST(ut_setup, ut_teardown,
14702                         test_AES_GMAC_authentication_SGL_40B),
14703                 TEST_CASE_ST(ut_setup, ut_teardown,
14704                         test_AES_GMAC_authentication_SGL_80B),
14705                 TEST_CASE_ST(ut_setup, ut_teardown,
14706                         test_AES_GMAC_authentication_SGL_2048B),
14707                 TEST_CASE_ST(ut_setup, ut_teardown,
14708                         test_AES_GMAC_authentication_SGL_2047B),
14709
14710                 TEST_CASES_END()
14711         }
14712 };
14713
14714 static struct unit_test_suite cryptodev_chacha20_poly1305_testsuite  = {
14715         .suite_name = "Chacha20-Poly1305 Test Suite",
14716         .setup = chacha20_poly1305_testsuite_setup,
14717         .unit_test_cases = {
14718                 TEST_CASE_ST(ut_setup, ut_teardown,
14719                         test_chacha20_poly1305_encrypt_test_case_rfc8439),
14720                 TEST_CASE_ST(ut_setup, ut_teardown,
14721                         test_chacha20_poly1305_decrypt_test_case_rfc8439),
14722                 TEST_CASES_END()
14723         }
14724 };
14725
14726 static struct unit_test_suite cryptodev_snow3g_testsuite  = {
14727         .suite_name = "SNOW 3G Test Suite",
14728         .setup = snow3g_testsuite_setup,
14729         .unit_test_cases = {
14730                 /** SNOW 3G encrypt only (UEA2) */
14731                 TEST_CASE_ST(ut_setup, ut_teardown,
14732                         test_snow3g_encryption_test_case_1),
14733                 TEST_CASE_ST(ut_setup, ut_teardown,
14734                         test_snow3g_encryption_test_case_2),
14735                 TEST_CASE_ST(ut_setup, ut_teardown,
14736                         test_snow3g_encryption_test_case_3),
14737                 TEST_CASE_ST(ut_setup, ut_teardown,
14738                         test_snow3g_encryption_test_case_4),
14739                 TEST_CASE_ST(ut_setup, ut_teardown,
14740                         test_snow3g_encryption_test_case_5),
14741
14742                 TEST_CASE_ST(ut_setup, ut_teardown,
14743                         test_snow3g_encryption_test_case_1_oop),
14744                 TEST_CASE_ST(ut_setup, ut_teardown,
14745                         test_snow3g_encryption_test_case_1_oop_sgl),
14746                 TEST_CASE_ST(ut_setup, ut_teardown,
14747                         test_snow3g_encryption_test_case_1_offset_oop),
14748                 TEST_CASE_ST(ut_setup, ut_teardown,
14749                         test_snow3g_decryption_test_case_1_oop),
14750
14751                 /** SNOW 3G generate auth, then encrypt (UEA2) */
14752                 TEST_CASE_ST(ut_setup, ut_teardown,
14753                         test_snow3g_auth_cipher_test_case_1),
14754                 TEST_CASE_ST(ut_setup, ut_teardown,
14755                         test_snow3g_auth_cipher_test_case_2),
14756                 TEST_CASE_ST(ut_setup, ut_teardown,
14757                         test_snow3g_auth_cipher_test_case_2_oop),
14758                 TEST_CASE_ST(ut_setup, ut_teardown,
14759                         test_snow3g_auth_cipher_part_digest_enc),
14760                 TEST_CASE_ST(ut_setup, ut_teardown,
14761                         test_snow3g_auth_cipher_part_digest_enc_oop),
14762                 TEST_CASE_ST(ut_setup, ut_teardown,
14763                         test_snow3g_auth_cipher_test_case_3_sgl),
14764                 TEST_CASE_ST(ut_setup, ut_teardown,
14765                         test_snow3g_auth_cipher_test_case_3_oop_sgl),
14766                 TEST_CASE_ST(ut_setup, ut_teardown,
14767                         test_snow3g_auth_cipher_part_digest_enc_sgl),
14768                 TEST_CASE_ST(ut_setup, ut_teardown,
14769                         test_snow3g_auth_cipher_part_digest_enc_oop_sgl),
14770
14771                 /** SNOW 3G decrypt (UEA2), then verify auth */
14772                 TEST_CASE_ST(ut_setup, ut_teardown,
14773                         test_snow3g_auth_cipher_verify_test_case_1),
14774                 TEST_CASE_ST(ut_setup, ut_teardown,
14775                         test_snow3g_auth_cipher_verify_test_case_2),
14776                 TEST_CASE_ST(ut_setup, ut_teardown,
14777                         test_snow3g_auth_cipher_verify_test_case_2_oop),
14778                 TEST_CASE_ST(ut_setup, ut_teardown,
14779                         test_snow3g_auth_cipher_verify_part_digest_enc),
14780                 TEST_CASE_ST(ut_setup, ut_teardown,
14781                         test_snow3g_auth_cipher_verify_part_digest_enc_oop),
14782                 TEST_CASE_ST(ut_setup, ut_teardown,
14783                         test_snow3g_auth_cipher_verify_test_case_3_sgl),
14784                 TEST_CASE_ST(ut_setup, ut_teardown,
14785                         test_snow3g_auth_cipher_verify_test_case_3_oop_sgl),
14786                 TEST_CASE_ST(ut_setup, ut_teardown,
14787                         test_snow3g_auth_cipher_verify_part_digest_enc_sgl),
14788                 TEST_CASE_ST(ut_setup, ut_teardown,
14789                         test_snow3g_auth_cipher_verify_part_digest_enc_oop_sgl),
14790
14791                 /** SNOW 3G decrypt only (UEA2) */
14792                 TEST_CASE_ST(ut_setup, ut_teardown,
14793                         test_snow3g_decryption_test_case_1),
14794                 TEST_CASE_ST(ut_setup, ut_teardown,
14795                         test_snow3g_decryption_test_case_2),
14796                 TEST_CASE_ST(ut_setup, ut_teardown,
14797                         test_snow3g_decryption_test_case_3),
14798                 TEST_CASE_ST(ut_setup, ut_teardown,
14799                         test_snow3g_decryption_test_case_4),
14800                 TEST_CASE_ST(ut_setup, ut_teardown,
14801                         test_snow3g_decryption_test_case_5),
14802                 TEST_CASE_ST(ut_setup, ut_teardown,
14803                         test_snow3g_decryption_with_digest_test_case_1),
14804                 TEST_CASE_ST(ut_setup, ut_teardown,
14805                         test_snow3g_hash_generate_test_case_1),
14806                 TEST_CASE_ST(ut_setup, ut_teardown,
14807                         test_snow3g_hash_generate_test_case_2),
14808                 TEST_CASE_ST(ut_setup, ut_teardown,
14809                         test_snow3g_hash_generate_test_case_3),
14810
14811                 /* Tests with buffers which length is not byte-aligned */
14812                 TEST_CASE_ST(ut_setup, ut_teardown,
14813                         test_snow3g_hash_generate_test_case_4),
14814                 TEST_CASE_ST(ut_setup, ut_teardown,
14815                         test_snow3g_hash_generate_test_case_5),
14816                 TEST_CASE_ST(ut_setup, ut_teardown,
14817                         test_snow3g_hash_generate_test_case_6),
14818                 TEST_CASE_ST(ut_setup, ut_teardown,
14819                         test_snow3g_hash_verify_test_case_1),
14820                 TEST_CASE_ST(ut_setup, ut_teardown,
14821                         test_snow3g_hash_verify_test_case_2),
14822                 TEST_CASE_ST(ut_setup, ut_teardown,
14823                         test_snow3g_hash_verify_test_case_3),
14824
14825                 /* Tests with buffers which length is not byte-aligned */
14826                 TEST_CASE_ST(ut_setup, ut_teardown,
14827                         test_snow3g_hash_verify_test_case_4),
14828                 TEST_CASE_ST(ut_setup, ut_teardown,
14829                         test_snow3g_hash_verify_test_case_5),
14830                 TEST_CASE_ST(ut_setup, ut_teardown,
14831                         test_snow3g_hash_verify_test_case_6),
14832                 TEST_CASE_ST(ut_setup, ut_teardown,
14833                         test_snow3g_cipher_auth_test_case_1),
14834                 TEST_CASE_ST(ut_setup, ut_teardown,
14835                         test_snow3g_auth_cipher_with_digest_test_case_1),
14836                 TEST_CASES_END()
14837         }
14838 };
14839
14840 static struct unit_test_suite cryptodev_zuc_testsuite  = {
14841         .suite_name = "ZUC Test Suite",
14842         .setup = zuc_testsuite_setup,
14843         .unit_test_cases = {
14844                 /** ZUC encrypt only (EEA3) */
14845                 TEST_CASE_ST(ut_setup, ut_teardown,
14846                         test_zuc_encryption_test_case_1),
14847                 TEST_CASE_ST(ut_setup, ut_teardown,
14848                         test_zuc_encryption_test_case_2),
14849                 TEST_CASE_ST(ut_setup, ut_teardown,
14850                         test_zuc_encryption_test_case_3),
14851                 TEST_CASE_ST(ut_setup, ut_teardown,
14852                         test_zuc_encryption_test_case_4),
14853                 TEST_CASE_ST(ut_setup, ut_teardown,
14854                         test_zuc_encryption_test_case_5),
14855                 TEST_CASE_ST(ut_setup, ut_teardown,
14856                         test_zuc_encryption_test_case_6_sgl),
14857                 TEST_CASE_ST(ut_setup, ut_teardown,
14858                         test_zuc_encryption_test_case_7),
14859
14860                 /** ZUC authenticate (EIA3) */
14861                 TEST_CASE_ST(ut_setup, ut_teardown,
14862                         test_zuc_hash_generate_test_case_1),
14863                 TEST_CASE_ST(ut_setup, ut_teardown,
14864                         test_zuc_hash_generate_test_case_2),
14865                 TEST_CASE_ST(ut_setup, ut_teardown,
14866                         test_zuc_hash_generate_test_case_3),
14867                 TEST_CASE_ST(ut_setup, ut_teardown,
14868                         test_zuc_hash_generate_test_case_4),
14869                 TEST_CASE_ST(ut_setup, ut_teardown,
14870                         test_zuc_hash_generate_test_case_5),
14871                 TEST_CASE_ST(ut_setup, ut_teardown,
14872                         test_zuc_hash_generate_test_case_6),
14873                 TEST_CASE_ST(ut_setup, ut_teardown,
14874                         test_zuc_hash_generate_test_case_7),
14875                 TEST_CASE_ST(ut_setup, ut_teardown,
14876                         test_zuc_hash_generate_test_case_8),
14877                 TEST_CASE_ST(ut_setup, ut_teardown,
14878                         test_zuc_hash_generate_test_case_9),
14879                 TEST_CASE_ST(ut_setup, ut_teardown,
14880                         test_zuc_hash_generate_test_case_10),
14881
14882
14883                 /** ZUC alg-chain (EEA3/EIA3) */
14884                 TEST_CASE_ST(ut_setup, ut_teardown,
14885                         test_zuc_cipher_auth_test_case_1),
14886                 TEST_CASE_ST(ut_setup, ut_teardown,
14887                         test_zuc_cipher_auth_test_case_2),
14888
14889                 /** ZUC generate auth, then encrypt (EEA3) */
14890                 TEST_CASE_ST(ut_setup, ut_teardown,
14891                         test_zuc_auth_cipher_test_case_1),
14892                 TEST_CASE_ST(ut_setup, ut_teardown,
14893                         test_zuc_auth_cipher_test_case_1_oop),
14894                 TEST_CASE_ST(ut_setup, ut_teardown,
14895                         test_zuc_auth_cipher_test_case_1_sgl),
14896                 TEST_CASE_ST(ut_setup, ut_teardown,
14897                         test_zuc_auth_cipher_test_case_1_oop_sgl),
14898
14899                 /** ZUC decrypt (EEA3), then verify auth */
14900                 TEST_CASE_ST(ut_setup, ut_teardown,
14901                         test_zuc_auth_cipher_verify_test_case_1),
14902                 TEST_CASE_ST(ut_setup, ut_teardown,
14903                         test_zuc_auth_cipher_verify_test_case_1_oop),
14904                 TEST_CASE_ST(ut_setup, ut_teardown,
14905                         test_zuc_auth_cipher_verify_test_case_1_sgl),
14906                 TEST_CASE_ST(ut_setup, ut_teardown,
14907                         test_zuc_auth_cipher_verify_test_case_1_oop_sgl),
14908                 TEST_CASES_END()
14909         }
14910 };
14911
14912 static struct unit_test_suite cryptodev_hmac_md5_auth_testsuite  = {
14913         .suite_name = "HMAC_MD5 Authentication Test Suite",
14914         .setup = hmac_md5_auth_testsuite_setup,
14915         .unit_test_cases = {
14916                 TEST_CASE_ST(ut_setup, ut_teardown,
14917                         test_MD5_HMAC_generate_case_1),
14918                 TEST_CASE_ST(ut_setup, ut_teardown,
14919                         test_MD5_HMAC_verify_case_1),
14920                 TEST_CASE_ST(ut_setup, ut_teardown,
14921                         test_MD5_HMAC_generate_case_2),
14922                 TEST_CASE_ST(ut_setup, ut_teardown,
14923                         test_MD5_HMAC_verify_case_2),
14924                 TEST_CASES_END()
14925         }
14926 };
14927
14928 static struct unit_test_suite cryptodev_kasumi_testsuite  = {
14929         .suite_name = "Kasumi Test Suite",
14930         .setup = kasumi_testsuite_setup,
14931         .unit_test_cases = {
14932                 /** KASUMI hash only (UIA1) */
14933                 TEST_CASE_ST(ut_setup, ut_teardown,
14934                         test_kasumi_hash_generate_test_case_1),
14935                 TEST_CASE_ST(ut_setup, ut_teardown,
14936                         test_kasumi_hash_generate_test_case_2),
14937                 TEST_CASE_ST(ut_setup, ut_teardown,
14938                         test_kasumi_hash_generate_test_case_3),
14939                 TEST_CASE_ST(ut_setup, ut_teardown,
14940                         test_kasumi_hash_generate_test_case_4),
14941                 TEST_CASE_ST(ut_setup, ut_teardown,
14942                         test_kasumi_hash_generate_test_case_5),
14943                 TEST_CASE_ST(ut_setup, ut_teardown,
14944                         test_kasumi_hash_generate_test_case_6),
14945
14946                 TEST_CASE_ST(ut_setup, ut_teardown,
14947                         test_kasumi_hash_verify_test_case_1),
14948                 TEST_CASE_ST(ut_setup, ut_teardown,
14949                         test_kasumi_hash_verify_test_case_2),
14950                 TEST_CASE_ST(ut_setup, ut_teardown,
14951                         test_kasumi_hash_verify_test_case_3),
14952                 TEST_CASE_ST(ut_setup, ut_teardown,
14953                         test_kasumi_hash_verify_test_case_4),
14954                 TEST_CASE_ST(ut_setup, ut_teardown,
14955                         test_kasumi_hash_verify_test_case_5),
14956
14957                 /** KASUMI encrypt only (UEA1) */
14958                 TEST_CASE_ST(ut_setup, ut_teardown,
14959                         test_kasumi_encryption_test_case_1),
14960                 TEST_CASE_ST(ut_setup, ut_teardown,
14961                         test_kasumi_encryption_test_case_1_sgl),
14962                 TEST_CASE_ST(ut_setup, ut_teardown,
14963                         test_kasumi_encryption_test_case_1_oop),
14964                 TEST_CASE_ST(ut_setup, ut_teardown,
14965                         test_kasumi_encryption_test_case_1_oop_sgl),
14966                 TEST_CASE_ST(ut_setup, ut_teardown,
14967                         test_kasumi_encryption_test_case_2),
14968                 TEST_CASE_ST(ut_setup, ut_teardown,
14969                         test_kasumi_encryption_test_case_3),
14970                 TEST_CASE_ST(ut_setup, ut_teardown,
14971                         test_kasumi_encryption_test_case_4),
14972                 TEST_CASE_ST(ut_setup, ut_teardown,
14973                         test_kasumi_encryption_test_case_5),
14974
14975                 /** KASUMI decrypt only (UEA1) */
14976                 TEST_CASE_ST(ut_setup, ut_teardown,
14977                         test_kasumi_decryption_test_case_1),
14978                 TEST_CASE_ST(ut_setup, ut_teardown,
14979                         test_kasumi_decryption_test_case_2),
14980                 TEST_CASE_ST(ut_setup, ut_teardown,
14981                         test_kasumi_decryption_test_case_3),
14982                 TEST_CASE_ST(ut_setup, ut_teardown,
14983                         test_kasumi_decryption_test_case_4),
14984                 TEST_CASE_ST(ut_setup, ut_teardown,
14985                         test_kasumi_decryption_test_case_5),
14986                 TEST_CASE_ST(ut_setup, ut_teardown,
14987                         test_kasumi_decryption_test_case_1_oop),
14988                 TEST_CASE_ST(ut_setup, ut_teardown,
14989                         test_kasumi_cipher_auth_test_case_1),
14990
14991                 /** KASUMI generate auth, then encrypt (F8) */
14992                 TEST_CASE_ST(ut_setup, ut_teardown,
14993                         test_kasumi_auth_cipher_test_case_1),
14994                 TEST_CASE_ST(ut_setup, ut_teardown,
14995                         test_kasumi_auth_cipher_test_case_2),
14996                 TEST_CASE_ST(ut_setup, ut_teardown,
14997                         test_kasumi_auth_cipher_test_case_2_oop),
14998                 TEST_CASE_ST(ut_setup, ut_teardown,
14999                         test_kasumi_auth_cipher_test_case_2_sgl),
15000                 TEST_CASE_ST(ut_setup, ut_teardown,
15001                         test_kasumi_auth_cipher_test_case_2_oop_sgl),
15002
15003                 /** KASUMI decrypt (F8), then verify auth */
15004                 TEST_CASE_ST(ut_setup, ut_teardown,
15005                         test_kasumi_auth_cipher_verify_test_case_1),
15006                 TEST_CASE_ST(ut_setup, ut_teardown,
15007                         test_kasumi_auth_cipher_verify_test_case_2),
15008                 TEST_CASE_ST(ut_setup, ut_teardown,
15009                         test_kasumi_auth_cipher_verify_test_case_2_oop),
15010                 TEST_CASE_ST(ut_setup, ut_teardown,
15011                         test_kasumi_auth_cipher_verify_test_case_2_sgl),
15012                 TEST_CASE_ST(ut_setup, ut_teardown,
15013                         test_kasumi_auth_cipher_verify_test_case_2_oop_sgl),
15014
15015                 TEST_CASES_END()
15016         }
15017 };
15018
15019 static struct unit_test_suite cryptodev_esn_testsuite  = {
15020         .suite_name = "ESN Test Suite",
15021         .setup = esn_testsuite_setup,
15022         .unit_test_cases = {
15023                 TEST_CASE_ST(ut_setup, ut_teardown,
15024                         auth_encrypt_AES128CBC_HMAC_SHA1_esn_check),
15025                 TEST_CASE_ST(ut_setup, ut_teardown,
15026                         auth_decrypt_AES128CBC_HMAC_SHA1_esn_check),
15027                 TEST_CASES_END()
15028         }
15029 };
15030
15031 static struct unit_test_suite cryptodev_negative_aes_gcm_testsuite  = {
15032         .suite_name = "Negative AES GCM Test Suite",
15033         .setup = negative_aes_gcm_testsuite_setup,
15034         .unit_test_cases = {
15035                 TEST_CASE_ST(ut_setup, ut_teardown,
15036                         test_AES_GCM_auth_encryption_fail_iv_corrupt),
15037                 TEST_CASE_ST(ut_setup, ut_teardown,
15038                         test_AES_GCM_auth_encryption_fail_in_data_corrupt),
15039                 TEST_CASE_ST(ut_setup, ut_teardown,
15040                         test_AES_GCM_auth_encryption_fail_out_data_corrupt),
15041                 TEST_CASE_ST(ut_setup, ut_teardown,
15042                         test_AES_GCM_auth_encryption_fail_aad_len_corrupt),
15043                 TEST_CASE_ST(ut_setup, ut_teardown,
15044                         test_AES_GCM_auth_encryption_fail_aad_corrupt),
15045                 TEST_CASE_ST(ut_setup, ut_teardown,
15046                         test_AES_GCM_auth_encryption_fail_tag_corrupt),
15047                 TEST_CASE_ST(ut_setup, ut_teardown,
15048                         test_AES_GCM_auth_decryption_fail_iv_corrupt),
15049                 TEST_CASE_ST(ut_setup, ut_teardown,
15050                         test_AES_GCM_auth_decryption_fail_in_data_corrupt),
15051                 TEST_CASE_ST(ut_setup, ut_teardown,
15052                         test_AES_GCM_auth_decryption_fail_out_data_corrupt),
15053                 TEST_CASE_ST(ut_setup, ut_teardown,
15054                         test_AES_GCM_auth_decryption_fail_aad_len_corrupt),
15055                 TEST_CASE_ST(ut_setup, ut_teardown,
15056                         test_AES_GCM_auth_decryption_fail_aad_corrupt),
15057                 TEST_CASE_ST(ut_setup, ut_teardown,
15058                         test_AES_GCM_auth_decryption_fail_tag_corrupt),
15059
15060                 TEST_CASES_END()
15061         }
15062 };
15063
15064 static struct unit_test_suite cryptodev_negative_aes_gmac_testsuite  = {
15065         .suite_name = "Negative AES GMAC Test Suite",
15066         .setup = negative_aes_gmac_testsuite_setup,
15067         .unit_test_cases = {
15068                 TEST_CASE_ST(ut_setup, ut_teardown,
15069                         authentication_verify_AES128_GMAC_fail_data_corrupt),
15070                 TEST_CASE_ST(ut_setup, ut_teardown,
15071                         authentication_verify_AES128_GMAC_fail_tag_corrupt),
15072
15073                 TEST_CASES_END()
15074         }
15075 };
15076
15077 static struct unit_test_suite cryptodev_mixed_cipher_hash_testsuite  = {
15078         .suite_name = "Mixed CIPHER + HASH algorithms Test Suite",
15079         .setup = mixed_cipher_hash_testsuite_setup,
15080         .unit_test_cases = {
15081                 /** AUTH AES CMAC + CIPHER AES CTR */
15082                 TEST_CASE_ST(ut_setup, ut_teardown,
15083                         test_aes_cmac_aes_ctr_digest_enc_test_case_1),
15084                 TEST_CASE_ST(ut_setup, ut_teardown,
15085                         test_aes_cmac_aes_ctr_digest_enc_test_case_1_oop),
15086                 TEST_CASE_ST(ut_setup, ut_teardown,
15087                         test_aes_cmac_aes_ctr_digest_enc_test_case_1_sgl),
15088                 TEST_CASE_ST(ut_setup, ut_teardown,
15089                         test_aes_cmac_aes_ctr_digest_enc_test_case_1_oop_sgl),
15090                 TEST_CASE_ST(ut_setup, ut_teardown,
15091                         test_verify_aes_cmac_aes_ctr_digest_enc_test_case_1),
15092                 TEST_CASE_ST(ut_setup, ut_teardown,
15093                         test_verify_aes_cmac_aes_ctr_digest_enc_test_case_1_oop),
15094                 TEST_CASE_ST(ut_setup, ut_teardown,
15095                         test_verify_aes_cmac_aes_ctr_digest_enc_test_case_1_sgl),
15096                 TEST_CASE_ST(ut_setup, ut_teardown,
15097                         test_verify_aes_cmac_aes_ctr_digest_enc_test_case_1_oop_sgl),
15098
15099                 /** AUTH ZUC + CIPHER SNOW3G */
15100                 TEST_CASE_ST(ut_setup, ut_teardown,
15101                         test_auth_zuc_cipher_snow_test_case_1),
15102                 TEST_CASE_ST(ut_setup, ut_teardown,
15103                         test_verify_auth_zuc_cipher_snow_test_case_1),
15104                 /** AUTH AES CMAC + CIPHER SNOW3G */
15105                 TEST_CASE_ST(ut_setup, ut_teardown,
15106                         test_auth_aes_cmac_cipher_snow_test_case_1),
15107                 TEST_CASE_ST(ut_setup, ut_teardown,
15108                         test_verify_auth_aes_cmac_cipher_snow_test_case_1),
15109                 /** AUTH ZUC + CIPHER AES CTR */
15110                 TEST_CASE_ST(ut_setup, ut_teardown,
15111                         test_auth_zuc_cipher_aes_ctr_test_case_1),
15112                 TEST_CASE_ST(ut_setup, ut_teardown,
15113                         test_verify_auth_zuc_cipher_aes_ctr_test_case_1),
15114                 /** AUTH SNOW3G + CIPHER AES CTR */
15115                 TEST_CASE_ST(ut_setup, ut_teardown,
15116                         test_auth_snow_cipher_aes_ctr_test_case_1),
15117                 TEST_CASE_ST(ut_setup, ut_teardown,
15118                         test_verify_auth_snow_cipher_aes_ctr_test_case_1),
15119                 /** AUTH SNOW3G + CIPHER ZUC */
15120                 TEST_CASE_ST(ut_setup, ut_teardown,
15121                         test_auth_snow_cipher_zuc_test_case_1),
15122                 TEST_CASE_ST(ut_setup, ut_teardown,
15123                         test_verify_auth_snow_cipher_zuc_test_case_1),
15124                 /** AUTH AES CMAC + CIPHER ZUC */
15125                 TEST_CASE_ST(ut_setup, ut_teardown,
15126                         test_auth_aes_cmac_cipher_zuc_test_case_1),
15127                 TEST_CASE_ST(ut_setup, ut_teardown,
15128                         test_verify_auth_aes_cmac_cipher_zuc_test_case_1),
15129
15130                 /** AUTH NULL + CIPHER SNOW3G */
15131                 TEST_CASE_ST(ut_setup, ut_teardown,
15132                         test_auth_null_cipher_snow_test_case_1),
15133                 TEST_CASE_ST(ut_setup, ut_teardown,
15134                         test_verify_auth_null_cipher_snow_test_case_1),
15135                 /** AUTH NULL + CIPHER ZUC */
15136                 TEST_CASE_ST(ut_setup, ut_teardown,
15137                         test_auth_null_cipher_zuc_test_case_1),
15138                 TEST_CASE_ST(ut_setup, ut_teardown,
15139                         test_verify_auth_null_cipher_zuc_test_case_1),
15140                 /** AUTH SNOW3G + CIPHER NULL */
15141                 TEST_CASE_ST(ut_setup, ut_teardown,
15142                         test_auth_snow_cipher_null_test_case_1),
15143                 TEST_CASE_ST(ut_setup, ut_teardown,
15144                         test_verify_auth_snow_cipher_null_test_case_1),
15145                 /** AUTH ZUC + CIPHER NULL */
15146                 TEST_CASE_ST(ut_setup, ut_teardown,
15147                         test_auth_zuc_cipher_null_test_case_1),
15148                 TEST_CASE_ST(ut_setup, ut_teardown,
15149                         test_verify_auth_zuc_cipher_null_test_case_1),
15150                 /** AUTH NULL + CIPHER AES CTR */
15151                 TEST_CASE_ST(ut_setup, ut_teardown,
15152                         test_auth_null_cipher_aes_ctr_test_case_1),
15153                 TEST_CASE_ST(ut_setup, ut_teardown,
15154                         test_verify_auth_null_cipher_aes_ctr_test_case_1),
15155                 /** AUTH AES CMAC + CIPHER NULL */
15156                 TEST_CASE_ST(ut_setup, ut_teardown,
15157                         test_auth_aes_cmac_cipher_null_test_case_1),
15158                 TEST_CASE_ST(ut_setup, ut_teardown,
15159                         test_verify_auth_aes_cmac_cipher_null_test_case_1),
15160                 TEST_CASES_END()
15161         }
15162 };
15163
15164 static int
15165 run_cryptodev_testsuite(const char *pmd_name)
15166 {
15167         uint8_t ret, j, i = 0, blk_start_idx = 0;
15168         const enum blockcipher_test_type blk_suites[] = {
15169                 BLKCIPHER_AES_CHAIN_TYPE,
15170                 BLKCIPHER_AES_CIPHERONLY_TYPE,
15171                 BLKCIPHER_AES_DOCSIS_TYPE,
15172                 BLKCIPHER_3DES_CHAIN_TYPE,
15173                 BLKCIPHER_3DES_CIPHERONLY_TYPE,
15174                 BLKCIPHER_DES_CIPHERONLY_TYPE,
15175                 BLKCIPHER_DES_DOCSIS_TYPE,
15176                 BLKCIPHER_AUTHONLY_TYPE};
15177         struct unit_test_suite *static_suites[] = {
15178                 &cryptodev_multi_session_testsuite,
15179                 &cryptodev_null_testsuite,
15180                 &cryptodev_aes_ccm_auth_testsuite,
15181                 &cryptodev_aes_gcm_auth_testsuite,
15182                 &cryptodev_aes_gmac_auth_testsuite,
15183                 &cryptodev_snow3g_testsuite,
15184                 &cryptodev_chacha20_poly1305_testsuite,
15185                 &cryptodev_zuc_testsuite,
15186                 &cryptodev_hmac_md5_auth_testsuite,
15187                 &cryptodev_kasumi_testsuite,
15188                 &cryptodev_esn_testsuite,
15189                 &cryptodev_negative_aes_gcm_testsuite,
15190                 &cryptodev_negative_aes_gmac_testsuite,
15191                 &cryptodev_mixed_cipher_hash_testsuite,
15192                 &cryptodev_negative_hmac_sha1_testsuite,
15193                 &cryptodev_gen_testsuite,
15194 #ifdef RTE_LIB_SECURITY
15195                 &ipsec_proto_testsuite,
15196                 &pdcp_proto_testsuite,
15197                 &docsis_proto_testsuite,
15198 #endif
15199                 &end_testsuite
15200         };
15201         static struct unit_test_suite ts = {
15202                 .suite_name = "Cryptodev Unit Test Suite",
15203                 .setup = testsuite_setup,
15204                 .teardown = testsuite_teardown,
15205                 .unit_test_cases = {TEST_CASES_END()}
15206         };
15207
15208         gbl_driver_id = rte_cryptodev_driver_id_get(pmd_name);
15209
15210         if (gbl_driver_id == -1) {
15211                 RTE_LOG(ERR, USER1, "%s PMD must be loaded.\n", pmd_name);
15212                 return TEST_SKIPPED;
15213         }
15214
15215         ts.unit_test_suites = malloc(sizeof(struct unit_test_suite *) *
15216                         (RTE_DIM(blk_suites) + RTE_DIM(static_suites)));
15217
15218         ADD_BLOCKCIPHER_TESTSUITE(i, ts, blk_suites, RTE_DIM(blk_suites));
15219         ADD_STATIC_TESTSUITE(i, ts, static_suites, RTE_DIM(static_suites));
15220         ret = unit_test_suite_runner(&ts);
15221
15222         FREE_BLOCKCIPHER_TESTSUITE(blk_start_idx, ts, RTE_DIM(blk_suites));
15223         free(ts.unit_test_suites);
15224         return ret;
15225 }
15226
15227 static int
15228 require_feature_flag(const char *pmd_name, uint64_t flag, const char *flag_name)
15229 {
15230         struct rte_cryptodev_info dev_info;
15231         uint8_t i, nb_devs;
15232         int driver_id;
15233
15234         driver_id = rte_cryptodev_driver_id_get(pmd_name);
15235         if (driver_id == -1) {
15236                 RTE_LOG(WARNING, USER1, "%s PMD must be loaded.\n", pmd_name);
15237                 return TEST_SKIPPED;
15238         }
15239
15240         nb_devs = rte_cryptodev_count();
15241         if (nb_devs < 1) {
15242                 RTE_LOG(WARNING, USER1, "No crypto devices found?\n");
15243                 return TEST_SKIPPED;
15244         }
15245
15246         for (i = 0; i < nb_devs; i++) {
15247                 rte_cryptodev_info_get(i, &dev_info);
15248                 if (dev_info.driver_id == driver_id) {
15249                         if (!(dev_info.feature_flags & flag)) {
15250                                 RTE_LOG(INFO, USER1, "%s not supported\n",
15251                                                 flag_name);
15252                                 return TEST_SKIPPED;
15253                         }
15254                         return 0; /* found */
15255                 }
15256         }
15257
15258         RTE_LOG(INFO, USER1, "%s not supported\n", flag_name);
15259         return TEST_SKIPPED;
15260 }
15261
15262 static int
15263 test_cryptodev_qat(void)
15264 {
15265         return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_QAT_SYM_PMD));
15266 }
15267
15268 static int
15269 test_cryptodev_virtio(void)
15270 {
15271         return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_VIRTIO_PMD));
15272 }
15273
15274 static int
15275 test_cryptodev_aesni_mb(void)
15276 {
15277         return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_AESNI_MB_PMD));
15278 }
15279
15280 static int
15281 test_cryptodev_cpu_aesni_mb(void)
15282 {
15283         int32_t rc;
15284         enum rte_security_session_action_type at = gbl_action_type;
15285         gbl_action_type = RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO;
15286         rc = run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_AESNI_MB_PMD));
15287         gbl_action_type = at;
15288         return rc;
15289 }
15290
15291 static int
15292 test_cryptodev_openssl(void)
15293 {
15294         return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_OPENSSL_PMD));
15295 }
15296
15297 static int
15298 test_cryptodev_aesni_gcm(void)
15299 {
15300         return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_AESNI_GCM_PMD));
15301 }
15302
15303 static int
15304 test_cryptodev_cpu_aesni_gcm(void)
15305 {
15306         int32_t rc;
15307         enum rte_security_session_action_type at = gbl_action_type;
15308         gbl_action_type = RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO;
15309         rc  = run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_AESNI_GCM_PMD));
15310         gbl_action_type = at;
15311         return rc;
15312 }
15313
15314 static int
15315 test_cryptodev_mlx5(void)
15316 {
15317         return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_MLX5_PMD));
15318 }
15319
15320 static int
15321 test_cryptodev_null(void)
15322 {
15323         return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_NULL_PMD));
15324 }
15325
15326 static int
15327 test_cryptodev_sw_snow3g(void)
15328 {
15329         return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_SNOW3G_PMD));
15330 }
15331
15332 static int
15333 test_cryptodev_sw_kasumi(void)
15334 {
15335         return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_KASUMI_PMD));
15336 }
15337
15338 static int
15339 test_cryptodev_sw_zuc(void)
15340 {
15341         return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_ZUC_PMD));
15342 }
15343
15344 static int
15345 test_cryptodev_armv8(void)
15346 {
15347         return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_ARMV8_PMD));
15348 }
15349
15350 static int
15351 test_cryptodev_mrvl(void)
15352 {
15353         return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_MVSAM_PMD));
15354 }
15355
15356 #ifdef RTE_CRYPTO_SCHEDULER
15357
15358 static int
15359 test_cryptodev_scheduler(void)
15360 {
15361         uint8_t ret, sched_i, j, i = 0, blk_start_idx = 0;
15362         const enum blockcipher_test_type blk_suites[] = {
15363                 BLKCIPHER_AES_CHAIN_TYPE,
15364                 BLKCIPHER_AES_CIPHERONLY_TYPE,
15365                 BLKCIPHER_AUTHONLY_TYPE
15366         };
15367         static struct unit_test_suite scheduler_multicore = {
15368                 .suite_name = "Scheduler Multicore Unit Test Suite",
15369                 .setup = scheduler_multicore_testsuite_setup,
15370                 .teardown = scheduler_mode_testsuite_teardown,
15371                 .unit_test_cases = {TEST_CASES_END()}
15372         };
15373         static struct unit_test_suite scheduler_round_robin = {
15374                 .suite_name = "Scheduler Round Robin Unit Test Suite",
15375                 .setup = scheduler_roundrobin_testsuite_setup,
15376                 .teardown = scheduler_mode_testsuite_teardown,
15377                 .unit_test_cases = {TEST_CASES_END()}
15378         };
15379         static struct unit_test_suite scheduler_failover = {
15380                 .suite_name = "Scheduler Failover Unit Test Suite",
15381                 .setup = scheduler_failover_testsuite_setup,
15382                 .teardown = scheduler_mode_testsuite_teardown,
15383                 .unit_test_cases = {TEST_CASES_END()}
15384         };
15385         static struct unit_test_suite scheduler_pkt_size_distr = {
15386                 .suite_name = "Scheduler Pkt Size Distr Unit Test Suite",
15387                 .setup = scheduler_pkt_size_distr_testsuite_setup,
15388                 .teardown = scheduler_mode_testsuite_teardown,
15389                 .unit_test_cases = {TEST_CASES_END()}
15390         };
15391         struct unit_test_suite *sched_mode_suites[] = {
15392                 &scheduler_multicore,
15393                 &scheduler_round_robin,
15394                 &scheduler_failover,
15395                 &scheduler_pkt_size_distr
15396         };
15397         static struct unit_test_suite scheduler_config = {
15398                 .suite_name = "Crypto Device Scheduler Config Unit Test Suite",
15399                 .unit_test_cases = {
15400                         TEST_CASE(test_scheduler_attach_worker_op),
15401                         TEST_CASE(test_scheduler_mode_multicore_op),
15402                         TEST_CASE(test_scheduler_mode_roundrobin_op),
15403                         TEST_CASE(test_scheduler_mode_failover_op),
15404                         TEST_CASE(test_scheduler_mode_pkt_size_distr_op),
15405                         TEST_CASE(test_scheduler_detach_worker_op),
15406
15407                         TEST_CASES_END() /**< NULL terminate array */
15408                 }
15409         };
15410         struct unit_test_suite *static_suites[] = {
15411                 &scheduler_config,
15412                 &end_testsuite
15413         };
15414         static struct unit_test_suite ts = {
15415                 .suite_name = "Scheduler Unit Test Suite",
15416                 .setup = scheduler_testsuite_setup,
15417                 .teardown = testsuite_teardown,
15418                 .unit_test_cases = {TEST_CASES_END()}
15419         };
15420
15421         gbl_driver_id = rte_cryptodev_driver_id_get(
15422                         RTE_STR(CRYPTODEV_NAME_SCHEDULER_PMD));
15423
15424         if (gbl_driver_id == -1) {
15425                 RTE_LOG(ERR, USER1, "SCHEDULER PMD must be loaded.\n");
15426                 return TEST_SKIPPED;
15427         }
15428
15429         if (rte_cryptodev_driver_id_get(
15430                                 RTE_STR(CRYPTODEV_NAME_AESNI_MB_PMD)) == -1) {
15431                 RTE_LOG(ERR, USER1, "AESNI MB PMD must be loaded.\n");
15432                 return TEST_SKIPPED;
15433         }
15434
15435         for (sched_i = 0; sched_i < RTE_DIM(sched_mode_suites); sched_i++) {
15436                 uint8_t blk_i = 0;
15437                 sched_mode_suites[sched_i]->unit_test_suites = malloc(sizeof
15438                                 (struct unit_test_suite *) *
15439                                 (RTE_DIM(blk_suites) + 1));
15440                 ADD_BLOCKCIPHER_TESTSUITE(blk_i, (*sched_mode_suites[sched_i]),
15441                                 blk_suites, RTE_DIM(blk_suites));
15442                 sched_mode_suites[sched_i]->unit_test_suites[blk_i] = &end_testsuite;
15443         }
15444
15445         ts.unit_test_suites = malloc(sizeof(struct unit_test_suite *) *
15446                         (RTE_DIM(static_suites) + RTE_DIM(sched_mode_suites)));
15447         ADD_STATIC_TESTSUITE(i, ts, sched_mode_suites,
15448                         RTE_DIM(sched_mode_suites));
15449         ADD_STATIC_TESTSUITE(i, ts, static_suites, RTE_DIM(static_suites));
15450         ret = unit_test_suite_runner(&ts);
15451
15452         for (sched_i = 0; sched_i < RTE_DIM(sched_mode_suites); sched_i++) {
15453                 FREE_BLOCKCIPHER_TESTSUITE(blk_start_idx,
15454                                 (*sched_mode_suites[sched_i]),
15455                                 RTE_DIM(blk_suites));
15456                 free(sched_mode_suites[sched_i]->unit_test_suites);
15457         }
15458         free(ts.unit_test_suites);
15459         return ret;
15460 }
15461
15462 REGISTER_TEST_COMMAND(cryptodev_scheduler_autotest, test_cryptodev_scheduler);
15463
15464 #endif
15465
15466 static int
15467 test_cryptodev_dpaa2_sec(void)
15468 {
15469         return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_DPAA2_SEC_PMD));
15470 }
15471
15472 static int
15473 test_cryptodev_dpaa_sec(void)
15474 {
15475         return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_DPAA_SEC_PMD));
15476 }
15477
15478 static int
15479 test_cryptodev_ccp(void)
15480 {
15481         return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_CCP_PMD));
15482 }
15483
15484 static int
15485 test_cryptodev_octeontx(void)
15486 {
15487         return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_OCTEONTX_SYM_PMD));
15488 }
15489
15490 static int
15491 test_cryptodev_octeontx2(void)
15492 {
15493         return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_OCTEONTX2_PMD));
15494 }
15495
15496 static int
15497 test_cryptodev_caam_jr(void)
15498 {
15499         return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_CAAM_JR_PMD));
15500 }
15501
15502 static int
15503 test_cryptodev_nitrox(void)
15504 {
15505         return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_NITROX_PMD));
15506 }
15507
15508 static int
15509 test_cryptodev_bcmfs(void)
15510 {
15511         return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_BCMFS_PMD));
15512 }
15513
15514 static int
15515 test_cryptodev_qat_raw_api(void)
15516 {
15517         static const char *pmd_name = RTE_STR(CRYPTODEV_NAME_QAT_SYM_PMD);
15518         int ret;
15519
15520         ret = require_feature_flag(pmd_name, RTE_CRYPTODEV_FF_SYM_RAW_DP,
15521                         "RAW API");
15522         if (ret)
15523                 return ret;
15524
15525         global_api_test_type = CRYPTODEV_RAW_API_TEST;
15526         ret = run_cryptodev_testsuite(pmd_name);
15527         global_api_test_type = CRYPTODEV_API_TEST;
15528
15529         return ret;
15530 }
15531
15532 static int
15533 test_cryptodev_cn9k(void)
15534 {
15535         return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_CN9K_PMD));
15536 }
15537
15538 static int
15539 test_cryptodev_cn10k(void)
15540 {
15541         return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_CN10K_PMD));
15542 }
15543
15544 static int
15545 test_cryptodev_dpaa2_sec_raw_api(void)
15546 {
15547         static const char *pmd_name = RTE_STR(CRYPTODEV_NAME_DPAA2_SEC_PMD);
15548         int ret;
15549
15550         ret = require_feature_flag(pmd_name, RTE_CRYPTODEV_FF_SYM_RAW_DP,
15551                         "RAW API");
15552         if (ret)
15553                 return ret;
15554
15555         global_api_test_type = CRYPTODEV_RAW_API_TEST;
15556         ret = run_cryptodev_testsuite(pmd_name);
15557         global_api_test_type = CRYPTODEV_API_TEST;
15558
15559         return ret;
15560 }
15561
15562 static int
15563 test_cryptodev_dpaa_sec_raw_api(void)
15564 {
15565         static const char *pmd_name = RTE_STR(CRYPTODEV_NAME_DPAA2_SEC_PMD);
15566         int ret;
15567
15568         ret = require_feature_flag(pmd_name, RTE_CRYPTODEV_FF_SYM_RAW_DP,
15569                         "RAW API");
15570         if (ret)
15571                 return ret;
15572
15573         global_api_test_type = CRYPTODEV_RAW_API_TEST;
15574         ret = run_cryptodev_testsuite(pmd_name);
15575         global_api_test_type = CRYPTODEV_API_TEST;
15576
15577         return ret;
15578 }
15579
15580 REGISTER_TEST_COMMAND(cryptodev_dpaa2_sec_raw_api_autotest,
15581                 test_cryptodev_dpaa2_sec_raw_api);
15582 REGISTER_TEST_COMMAND(cryptodev_dpaa_sec_raw_api_autotest,
15583                 test_cryptodev_dpaa_sec_raw_api);
15584 REGISTER_TEST_COMMAND(cryptodev_qat_raw_api_autotest,
15585                 test_cryptodev_qat_raw_api);
15586 REGISTER_TEST_COMMAND(cryptodev_qat_autotest, test_cryptodev_qat);
15587 REGISTER_TEST_COMMAND(cryptodev_aesni_mb_autotest, test_cryptodev_aesni_mb);
15588 REGISTER_TEST_COMMAND(cryptodev_cpu_aesni_mb_autotest,
15589         test_cryptodev_cpu_aesni_mb);
15590 REGISTER_TEST_COMMAND(cryptodev_openssl_autotest, test_cryptodev_openssl);
15591 REGISTER_TEST_COMMAND(cryptodev_aesni_gcm_autotest, test_cryptodev_aesni_gcm);
15592 REGISTER_TEST_COMMAND(cryptodev_cpu_aesni_gcm_autotest,
15593         test_cryptodev_cpu_aesni_gcm);
15594 REGISTER_TEST_COMMAND(cryptodev_mlx5_autotest, test_cryptodev_mlx5);
15595 REGISTER_TEST_COMMAND(cryptodev_null_autotest, test_cryptodev_null);
15596 REGISTER_TEST_COMMAND(cryptodev_sw_snow3g_autotest, test_cryptodev_sw_snow3g);
15597 REGISTER_TEST_COMMAND(cryptodev_sw_kasumi_autotest, test_cryptodev_sw_kasumi);
15598 REGISTER_TEST_COMMAND(cryptodev_sw_zuc_autotest, test_cryptodev_sw_zuc);
15599 REGISTER_TEST_COMMAND(cryptodev_sw_armv8_autotest, test_cryptodev_armv8);
15600 REGISTER_TEST_COMMAND(cryptodev_sw_mvsam_autotest, test_cryptodev_mrvl);
15601 REGISTER_TEST_COMMAND(cryptodev_dpaa2_sec_autotest, test_cryptodev_dpaa2_sec);
15602 REGISTER_TEST_COMMAND(cryptodev_dpaa_sec_autotest, test_cryptodev_dpaa_sec);
15603 REGISTER_TEST_COMMAND(cryptodev_ccp_autotest, test_cryptodev_ccp);
15604 REGISTER_TEST_COMMAND(cryptodev_virtio_autotest, test_cryptodev_virtio);
15605 REGISTER_TEST_COMMAND(cryptodev_octeontx_autotest, test_cryptodev_octeontx);
15606 REGISTER_TEST_COMMAND(cryptodev_octeontx2_autotest, test_cryptodev_octeontx2);
15607 REGISTER_TEST_COMMAND(cryptodev_caam_jr_autotest, test_cryptodev_caam_jr);
15608 REGISTER_TEST_COMMAND(cryptodev_nitrox_autotest, test_cryptodev_nitrox);
15609 REGISTER_TEST_COMMAND(cryptodev_bcmfs_autotest, test_cryptodev_bcmfs);
15610 REGISTER_TEST_COMMAND(cryptodev_cn9k_autotest, test_cryptodev_cn9k);
15611 REGISTER_TEST_COMMAND(cryptodev_cn10k_autotest, test_cryptodev_cn10k);