f2c3c1f6d1aaea7f2fff9eb3e10883455f38c7fe
[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 check_cipher_capability(const struct crypto_testsuite_params *ts_params,
5887                         const enum rte_crypto_cipher_algorithm cipher_algo,
5888                         const uint16_t key_size, const uint16_t iv_size)
5889 {
5890         struct rte_cryptodev_sym_capability_idx cap_idx;
5891         const struct rte_cryptodev_symmetric_capability *cap;
5892
5893         /* Check if device supports the algorithm */
5894         cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
5895         cap_idx.algo.cipher = cipher_algo;
5896
5897         cap = rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
5898                         &cap_idx);
5899
5900         if (cap == NULL)
5901                 return -1;
5902
5903         /* Check if device supports key size and IV size */
5904         if (rte_cryptodev_sym_capability_check_cipher(cap, key_size,
5905                         iv_size) < 0) {
5906                 return -1;
5907         }
5908
5909         return 0;
5910 }
5911
5912 static int
5913 check_auth_capability(const struct crypto_testsuite_params *ts_params,
5914                         const enum rte_crypto_auth_algorithm auth_algo,
5915                         const uint16_t key_size, const uint16_t iv_size,
5916                         const uint16_t tag_size)
5917 {
5918         struct rte_cryptodev_sym_capability_idx cap_idx;
5919         const struct rte_cryptodev_symmetric_capability *cap;
5920
5921         /* Check if device supports the algorithm */
5922         cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
5923         cap_idx.algo.auth = auth_algo;
5924
5925         cap = rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
5926                         &cap_idx);
5927
5928         if (cap == NULL)
5929                 return -1;
5930
5931         /* Check if device supports key size and IV size */
5932         if (rte_cryptodev_sym_capability_check_auth(cap, key_size,
5933                         tag_size, iv_size) < 0) {
5934                 return -1;
5935         }
5936
5937         return 0;
5938 }
5939
5940 static int
5941 test_zuc_encryption(const struct wireless_test_data *tdata)
5942 {
5943         struct crypto_testsuite_params *ts_params = &testsuite_params;
5944         struct crypto_unittest_params *ut_params = &unittest_params;
5945
5946         int retval;
5947         uint8_t *plaintext, *ciphertext;
5948         unsigned plaintext_pad_len;
5949         unsigned plaintext_len;
5950         struct rte_cryptodev_info dev_info;
5951
5952         rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
5953         uint64_t feat_flags = dev_info.feature_flags;
5954
5955         if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
5956                         (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
5957                 printf("Device doesn't support RAW data-path APIs.\n");
5958                 return TEST_SKIPPED;
5959         }
5960
5961         if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
5962                 return TEST_SKIPPED;
5963
5964         /* Check if device supports ZUC EEA3 */
5965         if (check_cipher_capability(ts_params, RTE_CRYPTO_CIPHER_ZUC_EEA3,
5966                         tdata->key.len, tdata->cipher_iv.len) < 0)
5967                 return TEST_SKIPPED;
5968
5969         /* Create ZUC session */
5970         retval = create_wireless_algo_cipher_session(ts_params->valid_devs[0],
5971                                         RTE_CRYPTO_CIPHER_OP_ENCRYPT,
5972                                         RTE_CRYPTO_CIPHER_ZUC_EEA3,
5973                                         tdata->key.data, tdata->key.len,
5974                                         tdata->cipher_iv.len);
5975         if (retval != 0)
5976                 return retval;
5977
5978         ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
5979
5980         /* Clear mbuf payload */
5981         memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
5982                rte_pktmbuf_tailroom(ut_params->ibuf));
5983
5984         plaintext_len = ceil_byte_length(tdata->plaintext.len);
5985         /* Append data which is padded to a multiple */
5986         /* of the algorithms block size */
5987         plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 8);
5988         plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
5989                                 plaintext_pad_len);
5990         memcpy(plaintext, tdata->plaintext.data, plaintext_len);
5991
5992         debug_hexdump(stdout, "plaintext:", plaintext, plaintext_len);
5993
5994         /* Create ZUC operation */
5995         retval = create_wireless_algo_cipher_operation(tdata->cipher_iv.data,
5996                                         tdata->cipher_iv.len,
5997                                         tdata->plaintext.len,
5998                                         0);
5999         if (retval < 0)
6000                 return retval;
6001
6002         if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
6003                 process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
6004                                 ut_params->op, 1, 0, 1, tdata->cipher_iv.len);
6005         else
6006                 ut_params->op = process_crypto_request(ts_params->valid_devs[0],
6007                                                 ut_params->op);
6008         TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
6009
6010         ut_params->obuf = ut_params->op->sym->m_dst;
6011         if (ut_params->obuf)
6012                 ciphertext = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *);
6013         else
6014                 ciphertext = plaintext;
6015
6016         debug_hexdump(stdout, "ciphertext:", ciphertext, plaintext_len);
6017
6018         /* Validate obuf */
6019         TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
6020                 ciphertext,
6021                 tdata->ciphertext.data,
6022                 tdata->validCipherLenInBits.len,
6023                 "ZUC Ciphertext data not as expected");
6024         return 0;
6025 }
6026
6027 static int
6028 test_zuc_encryption_sgl(const struct wireless_test_data *tdata)
6029 {
6030         struct crypto_testsuite_params *ts_params = &testsuite_params;
6031         struct crypto_unittest_params *ut_params = &unittest_params;
6032
6033         int retval;
6034
6035         unsigned int plaintext_pad_len;
6036         unsigned int plaintext_len;
6037         const uint8_t *ciphertext;
6038         uint8_t ciphertext_buffer[2048];
6039         struct rte_cryptodev_info dev_info;
6040
6041         /* Check if device supports ZUC EEA3 */
6042         if (check_cipher_capability(ts_params, RTE_CRYPTO_CIPHER_ZUC_EEA3,
6043                         tdata->key.len, tdata->cipher_iv.len) < 0)
6044                 return TEST_SKIPPED;
6045
6046         if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
6047                 return TEST_SKIPPED;
6048
6049         rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
6050
6051         uint64_t feat_flags = dev_info.feature_flags;
6052
6053         if (!(feat_flags & RTE_CRYPTODEV_FF_IN_PLACE_SGL)) {
6054                 printf("Device doesn't support in-place scatter-gather. "
6055                                 "Test Skipped.\n");
6056                 return TEST_SKIPPED;
6057         }
6058
6059         if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
6060                         (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
6061                 printf("Device doesn't support RAW data-path APIs.\n");
6062                 return TEST_SKIPPED;
6063         }
6064
6065         plaintext_len = ceil_byte_length(tdata->plaintext.len);
6066
6067         /* Append data which is padded to a multiple */
6068         /* of the algorithms block size */
6069         plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 8);
6070
6071         ut_params->ibuf = create_segmented_mbuf(ts_params->mbuf_pool,
6072                         plaintext_pad_len, 10, 0);
6073
6074         pktmbuf_write(ut_params->ibuf, 0, plaintext_len,
6075                         tdata->plaintext.data);
6076
6077         /* Create ZUC session */
6078         retval = create_wireless_algo_cipher_session(ts_params->valid_devs[0],
6079                         RTE_CRYPTO_CIPHER_OP_ENCRYPT,
6080                         RTE_CRYPTO_CIPHER_ZUC_EEA3,
6081                         tdata->key.data, tdata->key.len,
6082                         tdata->cipher_iv.len);
6083         if (retval < 0)
6084                 return retval;
6085
6086         /* Clear mbuf payload */
6087
6088         pktmbuf_write(ut_params->ibuf, 0, plaintext_len, tdata->plaintext.data);
6089
6090         /* Create ZUC operation */
6091         retval = create_wireless_algo_cipher_operation(tdata->cipher_iv.data,
6092                         tdata->cipher_iv.len, tdata->plaintext.len,
6093                         0);
6094         if (retval < 0)
6095                 return retval;
6096
6097         if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
6098                 process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
6099                                 ut_params->op, 1, 0, 1, tdata->cipher_iv.len);
6100         else
6101                 ut_params->op = process_crypto_request(ts_params->valid_devs[0],
6102                                                 ut_params->op);
6103         TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
6104
6105         ut_params->obuf = ut_params->op->sym->m_dst;
6106         if (ut_params->obuf)
6107                 ciphertext = rte_pktmbuf_read(ut_params->obuf,
6108                         0, plaintext_len, ciphertext_buffer);
6109         else
6110                 ciphertext = rte_pktmbuf_read(ut_params->ibuf,
6111                         0, plaintext_len, ciphertext_buffer);
6112
6113         /* Validate obuf */
6114         debug_hexdump(stdout, "ciphertext:", ciphertext, plaintext_len);
6115
6116         /* Validate obuf */
6117         TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
6118                 ciphertext,
6119                 tdata->ciphertext.data,
6120                 tdata->validCipherLenInBits.len,
6121                 "ZUC Ciphertext data not as expected");
6122
6123         return 0;
6124 }
6125
6126 static int
6127 test_zuc_authentication(const struct wireless_test_data *tdata)
6128 {
6129         struct crypto_testsuite_params *ts_params = &testsuite_params;
6130         struct crypto_unittest_params *ut_params = &unittest_params;
6131
6132         int retval;
6133         unsigned plaintext_pad_len;
6134         unsigned plaintext_len;
6135         uint8_t *plaintext;
6136
6137         struct rte_cryptodev_info dev_info;
6138
6139         rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
6140         uint64_t feat_flags = dev_info.feature_flags;
6141
6142         if (!(feat_flags & RTE_CRYPTODEV_FF_NON_BYTE_ALIGNED_DATA) &&
6143                         (tdata->validAuthLenInBits.len % 8 != 0)) {
6144                 printf("Device doesn't support NON-Byte Aligned Data.\n");
6145                 return TEST_SKIPPED;
6146         }
6147
6148         if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
6149                         (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
6150                 printf("Device doesn't support RAW data-path APIs.\n");
6151                 return TEST_SKIPPED;
6152         }
6153
6154         if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
6155                 return TEST_SKIPPED;
6156
6157         /* Check if device supports ZUC EIA3 */
6158         if (check_auth_capability(ts_params, RTE_CRYPTO_AUTH_ZUC_EIA3,
6159                         tdata->key.len, tdata->auth_iv.len,
6160                         tdata->digest.len) < 0)
6161                 return TEST_SKIPPED;
6162
6163         /* Create ZUC session */
6164         retval = create_wireless_algo_hash_session(ts_params->valid_devs[0],
6165                         tdata->key.data, tdata->key.len,
6166                         tdata->auth_iv.len, tdata->digest.len,
6167                         RTE_CRYPTO_AUTH_OP_GENERATE,
6168                         RTE_CRYPTO_AUTH_ZUC_EIA3);
6169         if (retval != 0)
6170                 return retval;
6171
6172         /* alloc mbuf and set payload */
6173         ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
6174
6175         memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
6176         rte_pktmbuf_tailroom(ut_params->ibuf));
6177
6178         plaintext_len = ceil_byte_length(tdata->plaintext.len);
6179         /* Append data which is padded to a multiple of */
6180         /* the algorithms block size */
6181         plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 8);
6182         plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
6183                                 plaintext_pad_len);
6184         memcpy(plaintext, tdata->plaintext.data, plaintext_len);
6185
6186         /* Create ZUC operation */
6187         retval = create_wireless_algo_hash_operation(NULL, tdata->digest.len,
6188                         tdata->auth_iv.data, tdata->auth_iv.len,
6189                         plaintext_pad_len, RTE_CRYPTO_AUTH_OP_GENERATE,
6190                         tdata->validAuthLenInBits.len,
6191                         0);
6192         if (retval < 0)
6193                 return retval;
6194
6195         if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
6196                 process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
6197                                 ut_params->op, 0, 1, 1, 0);
6198         else
6199                 ut_params->op = process_crypto_request(ts_params->valid_devs[0],
6200                                 ut_params->op);
6201         ut_params->obuf = ut_params->op->sym->m_src;
6202         TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
6203         ut_params->digest = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *)
6204                         + plaintext_pad_len;
6205
6206         /* Validate obuf */
6207         TEST_ASSERT_BUFFERS_ARE_EQUAL(
6208         ut_params->digest,
6209         tdata->digest.data,
6210         tdata->digest.len,
6211         "ZUC Generated auth tag not as expected");
6212
6213         return 0;
6214 }
6215
6216 static int
6217 test_zuc_auth_cipher(const struct wireless_test_data *tdata,
6218         uint8_t op_mode, uint8_t verify)
6219 {
6220         struct crypto_testsuite_params *ts_params = &testsuite_params;
6221         struct crypto_unittest_params *ut_params = &unittest_params;
6222
6223         int retval;
6224
6225         uint8_t *plaintext = NULL, *ciphertext = NULL;
6226         unsigned int plaintext_pad_len;
6227         unsigned int plaintext_len;
6228         unsigned int ciphertext_pad_len;
6229         unsigned int ciphertext_len;
6230
6231         struct rte_cryptodev_info dev_info;
6232
6233         /* Check if device supports ZUC EEA3 */
6234         if (check_cipher_capability(ts_params, RTE_CRYPTO_CIPHER_ZUC_EEA3,
6235                         tdata->key.len, tdata->cipher_iv.len) < 0)
6236                 return TEST_SKIPPED;
6237
6238         /* Check if device supports ZUC EIA3 */
6239         if (check_auth_capability(ts_params, RTE_CRYPTO_AUTH_ZUC_EIA3,
6240                         tdata->key.len, tdata->auth_iv.len,
6241                         tdata->digest.len) < 0)
6242                 return TEST_SKIPPED;
6243
6244         rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
6245
6246         uint64_t feat_flags = dev_info.feature_flags;
6247
6248         if (!(feat_flags & RTE_CRYPTODEV_FF_DIGEST_ENCRYPTED)) {
6249                 printf("Device doesn't support digest encrypted.\n");
6250                 return TEST_SKIPPED;
6251         }
6252         if (op_mode == IN_PLACE) {
6253                 if (!(feat_flags & RTE_CRYPTODEV_FF_IN_PLACE_SGL)) {
6254                         printf("Device doesn't support in-place scatter-gather "
6255                                         "in both input and output mbufs.\n");
6256                         return TEST_SKIPPED;
6257                 }
6258
6259                 if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
6260                         (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
6261                         printf("Device doesn't support RAW data-path APIs.\n");
6262                         return TEST_SKIPPED;
6263                 }
6264         } else {
6265                 if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
6266                         return TEST_SKIPPED;
6267                 if (!(feat_flags & RTE_CRYPTODEV_FF_OOP_SGL_IN_SGL_OUT)) {
6268                         printf("Device doesn't support out-of-place scatter-gather "
6269                                         "in both input and output mbufs.\n");
6270                         return TEST_SKIPPED;
6271                 }
6272         }
6273
6274         /* Create ZUC session */
6275         retval = create_wireless_algo_auth_cipher_session(
6276                         ts_params->valid_devs[0],
6277                         (verify ? RTE_CRYPTO_CIPHER_OP_DECRYPT
6278                                         : RTE_CRYPTO_CIPHER_OP_ENCRYPT),
6279                         (verify ? RTE_CRYPTO_AUTH_OP_VERIFY
6280                                         : RTE_CRYPTO_AUTH_OP_GENERATE),
6281                         RTE_CRYPTO_AUTH_ZUC_EIA3,
6282                         RTE_CRYPTO_CIPHER_ZUC_EEA3,
6283                         tdata->key.data, tdata->key.len,
6284                         tdata->auth_iv.len, tdata->digest.len,
6285                         tdata->cipher_iv.len);
6286
6287         if (retval != 0)
6288                 return retval;
6289
6290         ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
6291         if (op_mode == OUT_OF_PLACE)
6292                 ut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
6293
6294         /* clear mbuf payload */
6295         memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
6296                 rte_pktmbuf_tailroom(ut_params->ibuf));
6297         if (op_mode == OUT_OF_PLACE)
6298                 memset(rte_pktmbuf_mtod(ut_params->obuf, uint8_t *), 0,
6299                         rte_pktmbuf_tailroom(ut_params->obuf));
6300
6301         ciphertext_len = ceil_byte_length(tdata->ciphertext.len);
6302         plaintext_len = ceil_byte_length(tdata->plaintext.len);
6303         ciphertext_pad_len = RTE_ALIGN_CEIL(ciphertext_len, 16);
6304         plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16);
6305
6306         if (verify) {
6307                 ciphertext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
6308                                         ciphertext_pad_len);
6309                 memcpy(ciphertext, tdata->ciphertext.data, ciphertext_len);
6310                 if (op_mode == OUT_OF_PLACE)
6311                         rte_pktmbuf_append(ut_params->obuf, ciphertext_pad_len);
6312                 debug_hexdump(stdout, "ciphertext:", ciphertext,
6313                         ciphertext_len);
6314         } else {
6315                 plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
6316                                         plaintext_pad_len);
6317                 memcpy(plaintext, tdata->plaintext.data, plaintext_len);
6318                 if (op_mode == OUT_OF_PLACE)
6319                         rte_pktmbuf_append(ut_params->obuf, plaintext_pad_len);
6320                 debug_hexdump(stdout, "plaintext:", plaintext,
6321                         plaintext_len);
6322         }
6323
6324         /* Create ZUC operation */
6325         retval = create_wireless_algo_auth_cipher_operation(
6326                 tdata->digest.data, tdata->digest.len,
6327                 tdata->cipher_iv.data, tdata->cipher_iv.len,
6328                 tdata->auth_iv.data, tdata->auth_iv.len,
6329                 (tdata->digest.offset_bytes == 0 ?
6330                 (verify ? ciphertext_pad_len : plaintext_pad_len)
6331                         : tdata->digest.offset_bytes),
6332                 tdata->validCipherLenInBits.len,
6333                 tdata->validCipherOffsetInBits.len,
6334                 tdata->validAuthLenInBits.len,
6335                 0,
6336                 op_mode, 0, verify);
6337
6338         if (retval < 0)
6339                 return retval;
6340
6341         if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
6342                 process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
6343                                 ut_params->op, 1, 1, 1, tdata->cipher_iv.len);
6344         else
6345                 ut_params->op = process_crypto_request(ts_params->valid_devs[0],
6346                         ut_params->op);
6347
6348         TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
6349
6350         ut_params->obuf = (op_mode == IN_PLACE ?
6351                 ut_params->op->sym->m_src : ut_params->op->sym->m_dst);
6352
6353
6354         if (verify) {
6355                 if (ut_params->obuf)
6356                         plaintext = rte_pktmbuf_mtod(ut_params->obuf,
6357                                                         uint8_t *);
6358                 else
6359                         plaintext = ciphertext;
6360
6361                 debug_hexdump(stdout, "plaintext:", plaintext,
6362                         (tdata->plaintext.len >> 3) - tdata->digest.len);
6363                 debug_hexdump(stdout, "plaintext expected:",
6364                         tdata->plaintext.data,
6365                         (tdata->plaintext.len >> 3) - tdata->digest.len);
6366         } else {
6367                 if (ut_params->obuf)
6368                         ciphertext = rte_pktmbuf_mtod(ut_params->obuf,
6369                                                         uint8_t *);
6370                 else
6371                         ciphertext = plaintext;
6372
6373                 debug_hexdump(stdout, "ciphertext:", ciphertext,
6374                         ciphertext_len);
6375                 debug_hexdump(stdout, "ciphertext expected:",
6376                         tdata->ciphertext.data, tdata->ciphertext.len >> 3);
6377
6378                 ut_params->digest = rte_pktmbuf_mtod(
6379                         ut_params->obuf, uint8_t *) +
6380                         (tdata->digest.offset_bytes == 0 ?
6381                         plaintext_pad_len : tdata->digest.offset_bytes);
6382
6383                 debug_hexdump(stdout, "digest:", ut_params->digest,
6384                         tdata->digest.len);
6385                 debug_hexdump(stdout, "digest expected:",
6386                         tdata->digest.data, tdata->digest.len);
6387         }
6388
6389         /* Validate obuf */
6390         if (verify) {
6391                 TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
6392                         plaintext,
6393                         tdata->plaintext.data,
6394                         tdata->plaintext.len >> 3,
6395                         "ZUC Plaintext data not as expected");
6396         } else {
6397                 TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
6398                         ciphertext,
6399                         tdata->ciphertext.data,
6400                         tdata->ciphertext.len >> 3,
6401                         "ZUC Ciphertext data not as expected");
6402
6403                 TEST_ASSERT_BUFFERS_ARE_EQUAL(
6404                         ut_params->digest,
6405                         tdata->digest.data,
6406                         DIGEST_BYTE_LENGTH_KASUMI_F9,
6407                         "ZUC Generated auth tag not as expected");
6408         }
6409         return 0;
6410 }
6411
6412 static int
6413 test_zuc_auth_cipher_sgl(const struct wireless_test_data *tdata,
6414         uint8_t op_mode, uint8_t verify)
6415 {
6416         struct crypto_testsuite_params *ts_params = &testsuite_params;
6417         struct crypto_unittest_params *ut_params = &unittest_params;
6418
6419         int retval;
6420
6421         const uint8_t *plaintext = NULL;
6422         const uint8_t *ciphertext = NULL;
6423         const uint8_t *digest = NULL;
6424         unsigned int plaintext_pad_len;
6425         unsigned int plaintext_len;
6426         unsigned int ciphertext_pad_len;
6427         unsigned int ciphertext_len;
6428         uint8_t buffer[10000];
6429         uint8_t digest_buffer[10000];
6430
6431         struct rte_cryptodev_info dev_info;
6432
6433         /* Check if device supports ZUC EEA3 */
6434         if (check_cipher_capability(ts_params, RTE_CRYPTO_CIPHER_ZUC_EEA3,
6435                         tdata->key.len, tdata->cipher_iv.len) < 0)
6436                 return TEST_SKIPPED;
6437
6438         /* Check if device supports ZUC EIA3 */
6439         if (check_auth_capability(ts_params, RTE_CRYPTO_AUTH_ZUC_EIA3,
6440                         tdata->key.len, tdata->auth_iv.len,
6441                         tdata->digest.len) < 0)
6442                 return TEST_SKIPPED;
6443
6444         rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
6445
6446         uint64_t feat_flags = dev_info.feature_flags;
6447
6448         if (op_mode == IN_PLACE) {
6449                 if (!(feat_flags & RTE_CRYPTODEV_FF_IN_PLACE_SGL)) {
6450                         printf("Device doesn't support in-place scatter-gather "
6451                                         "in both input and output mbufs.\n");
6452                         return TEST_SKIPPED;
6453                 }
6454
6455                 if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
6456                         (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
6457                         printf("Device doesn't support RAW data-path APIs.\n");
6458                         return TEST_SKIPPED;
6459                 }
6460         } else {
6461                 if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
6462                         return TEST_SKIPPED;
6463                 if (!(feat_flags & RTE_CRYPTODEV_FF_OOP_SGL_IN_SGL_OUT)) {
6464                         printf("Device doesn't support out-of-place scatter-gather "
6465                                         "in both input and output mbufs.\n");
6466                         return TEST_SKIPPED;
6467                 }
6468                 if (!(feat_flags & RTE_CRYPTODEV_FF_DIGEST_ENCRYPTED)) {
6469                         printf("Device doesn't support digest encrypted.\n");
6470                         return TEST_SKIPPED;
6471                 }
6472         }
6473
6474         /* Create ZUC session */
6475         retval = create_wireless_algo_auth_cipher_session(
6476                         ts_params->valid_devs[0],
6477                         (verify ? RTE_CRYPTO_CIPHER_OP_DECRYPT
6478                                         : RTE_CRYPTO_CIPHER_OP_ENCRYPT),
6479                         (verify ? RTE_CRYPTO_AUTH_OP_VERIFY
6480                                         : RTE_CRYPTO_AUTH_OP_GENERATE),
6481                         RTE_CRYPTO_AUTH_ZUC_EIA3,
6482                         RTE_CRYPTO_CIPHER_ZUC_EEA3,
6483                         tdata->key.data, tdata->key.len,
6484                         tdata->auth_iv.len, tdata->digest.len,
6485                         tdata->cipher_iv.len);
6486
6487         if (retval != 0)
6488                 return retval;
6489
6490         ciphertext_len = ceil_byte_length(tdata->ciphertext.len);
6491         plaintext_len = ceil_byte_length(tdata->plaintext.len);
6492         ciphertext_pad_len = RTE_ALIGN_CEIL(ciphertext_len, 16);
6493         plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16);
6494
6495         ut_params->ibuf = create_segmented_mbuf(ts_params->mbuf_pool,
6496                         plaintext_pad_len, 15, 0);
6497         TEST_ASSERT_NOT_NULL(ut_params->ibuf,
6498                         "Failed to allocate input buffer in mempool");
6499
6500         if (op_mode == OUT_OF_PLACE) {
6501                 ut_params->obuf = create_segmented_mbuf(ts_params->mbuf_pool,
6502                                 plaintext_pad_len, 15, 0);
6503                 TEST_ASSERT_NOT_NULL(ut_params->obuf,
6504                                 "Failed to allocate output buffer in mempool");
6505         }
6506
6507         if (verify) {
6508                 pktmbuf_write(ut_params->ibuf, 0, ciphertext_len,
6509                         tdata->ciphertext.data);
6510                 ciphertext = rte_pktmbuf_read(ut_params->ibuf, 0,
6511                                         ciphertext_len, buffer);
6512                 debug_hexdump(stdout, "ciphertext:", ciphertext,
6513                         ciphertext_len);
6514         } else {
6515                 pktmbuf_write(ut_params->ibuf, 0, plaintext_len,
6516                         tdata->plaintext.data);
6517                 plaintext = rte_pktmbuf_read(ut_params->ibuf, 0,
6518                                         plaintext_len, buffer);
6519                 debug_hexdump(stdout, "plaintext:", plaintext,
6520                         plaintext_len);
6521         }
6522         memset(buffer, 0, sizeof(buffer));
6523
6524         /* Create ZUC operation */
6525         retval = create_wireless_algo_auth_cipher_operation(
6526                 tdata->digest.data, tdata->digest.len,
6527                 tdata->cipher_iv.data, tdata->cipher_iv.len,
6528                 NULL, 0,
6529                 (tdata->digest.offset_bytes == 0 ?
6530                 (verify ? ciphertext_pad_len : plaintext_pad_len)
6531                         : tdata->digest.offset_bytes),
6532                 tdata->validCipherLenInBits.len,
6533                 tdata->validCipherOffsetInBits.len,
6534                 tdata->validAuthLenInBits.len,
6535                 0,
6536                 op_mode, 1, verify);
6537
6538         if (retval < 0)
6539                 return retval;
6540
6541         if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
6542                 process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
6543                                 ut_params->op, 1, 1, 1, tdata->cipher_iv.len);
6544         else
6545                 ut_params->op = process_crypto_request(ts_params->valid_devs[0],
6546                         ut_params->op);
6547
6548         TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
6549
6550         ut_params->obuf = (op_mode == IN_PLACE ?
6551                 ut_params->op->sym->m_src : ut_params->op->sym->m_dst);
6552
6553         if (verify) {
6554                 if (ut_params->obuf)
6555                         plaintext = rte_pktmbuf_read(ut_params->obuf, 0,
6556                                         plaintext_len, buffer);
6557                 else
6558                         plaintext = rte_pktmbuf_read(ut_params->ibuf, 0,
6559                                         plaintext_len, buffer);
6560
6561                 debug_hexdump(stdout, "plaintext:", plaintext,
6562                         (tdata->plaintext.len >> 3) - tdata->digest.len);
6563                 debug_hexdump(stdout, "plaintext expected:",
6564                         tdata->plaintext.data,
6565                         (tdata->plaintext.len >> 3) - tdata->digest.len);
6566         } else {
6567                 if (ut_params->obuf)
6568                         ciphertext = rte_pktmbuf_read(ut_params->obuf, 0,
6569                                         ciphertext_len, buffer);
6570                 else
6571                         ciphertext = rte_pktmbuf_read(ut_params->ibuf, 0,
6572                                         ciphertext_len, buffer);
6573
6574                 debug_hexdump(stdout, "ciphertext:", ciphertext,
6575                         ciphertext_len);
6576                 debug_hexdump(stdout, "ciphertext expected:",
6577                         tdata->ciphertext.data, tdata->ciphertext.len >> 3);
6578
6579                 if (ut_params->obuf)
6580                         digest = rte_pktmbuf_read(ut_params->obuf,
6581                                 (tdata->digest.offset_bytes == 0 ?
6582                                 plaintext_pad_len : tdata->digest.offset_bytes),
6583                                 tdata->digest.len, digest_buffer);
6584                 else
6585                         digest = rte_pktmbuf_read(ut_params->ibuf,
6586                                 (tdata->digest.offset_bytes == 0 ?
6587                                 plaintext_pad_len : tdata->digest.offset_bytes),
6588                                 tdata->digest.len, digest_buffer);
6589
6590                 debug_hexdump(stdout, "digest:", digest,
6591                         tdata->digest.len);
6592                 debug_hexdump(stdout, "digest expected:",
6593                         tdata->digest.data, tdata->digest.len);
6594         }
6595
6596         /* Validate obuf */
6597         if (verify) {
6598                 TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
6599                         plaintext,
6600                         tdata->plaintext.data,
6601                         tdata->plaintext.len >> 3,
6602                         "ZUC Plaintext data not as expected");
6603         } else {
6604                 TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
6605                         ciphertext,
6606                         tdata->ciphertext.data,
6607                         tdata->validDataLenInBits.len,
6608                         "ZUC Ciphertext data not as expected");
6609
6610                 TEST_ASSERT_BUFFERS_ARE_EQUAL(
6611                         digest,
6612                         tdata->digest.data,
6613                         DIGEST_BYTE_LENGTH_KASUMI_F9,
6614                         "ZUC Generated auth tag not as expected");
6615         }
6616         return 0;
6617 }
6618
6619 static int
6620 test_kasumi_encryption_test_case_1(void)
6621 {
6622         return test_kasumi_encryption(&kasumi_test_case_1);
6623 }
6624
6625 static int
6626 test_kasumi_encryption_test_case_1_sgl(void)
6627 {
6628         return test_kasumi_encryption_sgl(&kasumi_test_case_1);
6629 }
6630
6631 static int
6632 test_kasumi_encryption_test_case_1_oop(void)
6633 {
6634         return test_kasumi_encryption_oop(&kasumi_test_case_1);
6635 }
6636
6637 static int
6638 test_kasumi_encryption_test_case_1_oop_sgl(void)
6639 {
6640         return test_kasumi_encryption_oop_sgl(&kasumi_test_case_1);
6641 }
6642
6643 static int
6644 test_kasumi_encryption_test_case_2(void)
6645 {
6646         return test_kasumi_encryption(&kasumi_test_case_2);
6647 }
6648
6649 static int
6650 test_kasumi_encryption_test_case_3(void)
6651 {
6652         return test_kasumi_encryption(&kasumi_test_case_3);
6653 }
6654
6655 static int
6656 test_kasumi_encryption_test_case_4(void)
6657 {
6658         return test_kasumi_encryption(&kasumi_test_case_4);
6659 }
6660
6661 static int
6662 test_kasumi_encryption_test_case_5(void)
6663 {
6664         return test_kasumi_encryption(&kasumi_test_case_5);
6665 }
6666
6667 static int
6668 test_kasumi_decryption_test_case_1(void)
6669 {
6670         return test_kasumi_decryption(&kasumi_test_case_1);
6671 }
6672
6673 static int
6674 test_kasumi_decryption_test_case_1_oop(void)
6675 {
6676         return test_kasumi_decryption_oop(&kasumi_test_case_1);
6677 }
6678
6679 static int
6680 test_kasumi_decryption_test_case_2(void)
6681 {
6682         return test_kasumi_decryption(&kasumi_test_case_2);
6683 }
6684
6685 static int
6686 test_kasumi_decryption_test_case_3(void)
6687 {
6688         /* rte_crypto_mbuf_to_vec does not support incomplete mbuf build */
6689         if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
6690                 return TEST_SKIPPED;
6691         return test_kasumi_decryption(&kasumi_test_case_3);
6692 }
6693
6694 static int
6695 test_kasumi_decryption_test_case_4(void)
6696 {
6697         return test_kasumi_decryption(&kasumi_test_case_4);
6698 }
6699
6700 static int
6701 test_kasumi_decryption_test_case_5(void)
6702 {
6703         return test_kasumi_decryption(&kasumi_test_case_5);
6704 }
6705 static int
6706 test_snow3g_encryption_test_case_1(void)
6707 {
6708         return test_snow3g_encryption(&snow3g_test_case_1);
6709 }
6710
6711 static int
6712 test_snow3g_encryption_test_case_1_oop(void)
6713 {
6714         return test_snow3g_encryption_oop(&snow3g_test_case_1);
6715 }
6716
6717 static int
6718 test_snow3g_encryption_test_case_1_oop_sgl(void)
6719 {
6720         return test_snow3g_encryption_oop_sgl(&snow3g_test_case_1);
6721 }
6722
6723
6724 static int
6725 test_snow3g_encryption_test_case_1_offset_oop(void)
6726 {
6727         return test_snow3g_encryption_offset_oop(&snow3g_test_case_1);
6728 }
6729
6730 static int
6731 test_snow3g_encryption_test_case_2(void)
6732 {
6733         return test_snow3g_encryption(&snow3g_test_case_2);
6734 }
6735
6736 static int
6737 test_snow3g_encryption_test_case_3(void)
6738 {
6739         return test_snow3g_encryption(&snow3g_test_case_3);
6740 }
6741
6742 static int
6743 test_snow3g_encryption_test_case_4(void)
6744 {
6745         return test_snow3g_encryption(&snow3g_test_case_4);
6746 }
6747
6748 static int
6749 test_snow3g_encryption_test_case_5(void)
6750 {
6751         return test_snow3g_encryption(&snow3g_test_case_5);
6752 }
6753
6754 static int
6755 test_snow3g_decryption_test_case_1(void)
6756 {
6757         return test_snow3g_decryption(&snow3g_test_case_1);
6758 }
6759
6760 static int
6761 test_snow3g_decryption_test_case_1_oop(void)
6762 {
6763         return test_snow3g_decryption_oop(&snow3g_test_case_1);
6764 }
6765
6766 static int
6767 test_snow3g_decryption_test_case_2(void)
6768 {
6769         return test_snow3g_decryption(&snow3g_test_case_2);
6770 }
6771
6772 static int
6773 test_snow3g_decryption_test_case_3(void)
6774 {
6775         return test_snow3g_decryption(&snow3g_test_case_3);
6776 }
6777
6778 static int
6779 test_snow3g_decryption_test_case_4(void)
6780 {
6781         return test_snow3g_decryption(&snow3g_test_case_4);
6782 }
6783
6784 static int
6785 test_snow3g_decryption_test_case_5(void)
6786 {
6787         return test_snow3g_decryption(&snow3g_test_case_5);
6788 }
6789
6790 /*
6791  * Function prepares snow3g_hash_test_data from snow3g_test_data.
6792  * Pattern digest from snow3g_test_data must be allocated as
6793  * 4 last bytes in plaintext.
6794  */
6795 static void
6796 snow3g_hash_test_vector_setup(const struct snow3g_test_data *pattern,
6797                 struct snow3g_hash_test_data *output)
6798 {
6799         if ((pattern != NULL) && (output != NULL)) {
6800                 output->key.len = pattern->key.len;
6801
6802                 memcpy(output->key.data,
6803                 pattern->key.data, pattern->key.len);
6804
6805                 output->auth_iv.len = pattern->auth_iv.len;
6806
6807                 memcpy(output->auth_iv.data,
6808                 pattern->auth_iv.data, pattern->auth_iv.len);
6809
6810                 output->plaintext.len = pattern->plaintext.len;
6811
6812                 memcpy(output->plaintext.data,
6813                 pattern->plaintext.data, pattern->plaintext.len >> 3);
6814
6815                 output->digest.len = pattern->digest.len;
6816
6817                 memcpy(output->digest.data,
6818                 &pattern->plaintext.data[pattern->digest.offset_bytes],
6819                 pattern->digest.len);
6820
6821                 output->validAuthLenInBits.len =
6822                 pattern->validAuthLenInBits.len;
6823         }
6824 }
6825
6826 /*
6827  * Test case verify computed cipher and digest from snow3g_test_case_7 data.
6828  */
6829 static int
6830 test_snow3g_decryption_with_digest_test_case_1(void)
6831 {
6832         struct snow3g_hash_test_data snow3g_hash_data;
6833         struct rte_cryptodev_info dev_info;
6834         struct crypto_testsuite_params *ts_params = &testsuite_params;
6835
6836         rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
6837         uint64_t feat_flags = dev_info.feature_flags;
6838
6839         if (!(feat_flags & RTE_CRYPTODEV_FF_DIGEST_ENCRYPTED)) {
6840                 printf("Device doesn't support encrypted digest operations.\n");
6841                 return TEST_SKIPPED;
6842         }
6843
6844         /*
6845          * Function prepare data for hash veryfication test case.
6846          * Digest is allocated in 4 last bytes in plaintext, pattern.
6847          */
6848         snow3g_hash_test_vector_setup(&snow3g_test_case_7, &snow3g_hash_data);
6849
6850         return test_snow3g_decryption(&snow3g_test_case_7) &
6851                         test_snow3g_authentication_verify(&snow3g_hash_data);
6852 }
6853
6854 static int
6855 test_snow3g_cipher_auth_test_case_1(void)
6856 {
6857         return test_snow3g_cipher_auth(&snow3g_test_case_3);
6858 }
6859
6860 static int
6861 test_snow3g_auth_cipher_test_case_1(void)
6862 {
6863         return test_snow3g_auth_cipher(
6864                 &snow3g_auth_cipher_test_case_1, IN_PLACE, 0);
6865 }
6866
6867 static int
6868 test_snow3g_auth_cipher_test_case_2(void)
6869 {
6870         return test_snow3g_auth_cipher(
6871                 &snow3g_auth_cipher_test_case_2, IN_PLACE, 0);
6872 }
6873
6874 static int
6875 test_snow3g_auth_cipher_test_case_2_oop(void)
6876 {
6877         return test_snow3g_auth_cipher(
6878                 &snow3g_auth_cipher_test_case_2, OUT_OF_PLACE, 0);
6879 }
6880
6881 static int
6882 test_snow3g_auth_cipher_part_digest_enc(void)
6883 {
6884         return test_snow3g_auth_cipher(
6885                 &snow3g_auth_cipher_partial_digest_encryption,
6886                         IN_PLACE, 0);
6887 }
6888
6889 static int
6890 test_snow3g_auth_cipher_part_digest_enc_oop(void)
6891 {
6892         return test_snow3g_auth_cipher(
6893                 &snow3g_auth_cipher_partial_digest_encryption,
6894                         OUT_OF_PLACE, 0);
6895 }
6896
6897 static int
6898 test_snow3g_auth_cipher_test_case_3_sgl(void)
6899 {
6900         /* rte_crypto_mbuf_to_vec does not support incomplete mbuf build */
6901         if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
6902                 return TEST_SKIPPED;
6903         return test_snow3g_auth_cipher_sgl(
6904                 &snow3g_auth_cipher_test_case_3, IN_PLACE, 0);
6905 }
6906
6907 static int
6908 test_snow3g_auth_cipher_test_case_3_oop_sgl(void)
6909 {
6910         return test_snow3g_auth_cipher_sgl(
6911                 &snow3g_auth_cipher_test_case_3, OUT_OF_PLACE, 0);
6912 }
6913
6914 static int
6915 test_snow3g_auth_cipher_part_digest_enc_sgl(void)
6916 {
6917         /* rte_crypto_mbuf_to_vec does not support incomplete mbuf build */
6918         if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
6919                 return TEST_SKIPPED;
6920         return test_snow3g_auth_cipher_sgl(
6921                 &snow3g_auth_cipher_partial_digest_encryption,
6922                         IN_PLACE, 0);
6923 }
6924
6925 static int
6926 test_snow3g_auth_cipher_part_digest_enc_oop_sgl(void)
6927 {
6928         return test_snow3g_auth_cipher_sgl(
6929                 &snow3g_auth_cipher_partial_digest_encryption,
6930                         OUT_OF_PLACE, 0);
6931 }
6932
6933 static int
6934 test_snow3g_auth_cipher_verify_test_case_1(void)
6935 {
6936         return test_snow3g_auth_cipher(
6937                 &snow3g_auth_cipher_test_case_1, IN_PLACE, 1);
6938 }
6939
6940 static int
6941 test_snow3g_auth_cipher_verify_test_case_2(void)
6942 {
6943         return test_snow3g_auth_cipher(
6944                 &snow3g_auth_cipher_test_case_2, IN_PLACE, 1);
6945 }
6946
6947 static int
6948 test_snow3g_auth_cipher_verify_test_case_2_oop(void)
6949 {
6950         return test_snow3g_auth_cipher(
6951                 &snow3g_auth_cipher_test_case_2, OUT_OF_PLACE, 1);
6952 }
6953
6954 static int
6955 test_snow3g_auth_cipher_verify_part_digest_enc(void)
6956 {
6957         return test_snow3g_auth_cipher(
6958                 &snow3g_auth_cipher_partial_digest_encryption,
6959                         IN_PLACE, 1);
6960 }
6961
6962 static int
6963 test_snow3g_auth_cipher_verify_part_digest_enc_oop(void)
6964 {
6965         return test_snow3g_auth_cipher(
6966                 &snow3g_auth_cipher_partial_digest_encryption,
6967                         OUT_OF_PLACE, 1);
6968 }
6969
6970 static int
6971 test_snow3g_auth_cipher_verify_test_case_3_sgl(void)
6972 {
6973         return test_snow3g_auth_cipher_sgl(
6974                 &snow3g_auth_cipher_test_case_3, IN_PLACE, 1);
6975 }
6976
6977 static int
6978 test_snow3g_auth_cipher_verify_test_case_3_oop_sgl(void)
6979 {
6980         return test_snow3g_auth_cipher_sgl(
6981                 &snow3g_auth_cipher_test_case_3, OUT_OF_PLACE, 1);
6982 }
6983
6984 static int
6985 test_snow3g_auth_cipher_verify_part_digest_enc_sgl(void)
6986 {
6987         return test_snow3g_auth_cipher_sgl(
6988                 &snow3g_auth_cipher_partial_digest_encryption,
6989                         IN_PLACE, 1);
6990 }
6991
6992 static int
6993 test_snow3g_auth_cipher_verify_part_digest_enc_oop_sgl(void)
6994 {
6995         return test_snow3g_auth_cipher_sgl(
6996                 &snow3g_auth_cipher_partial_digest_encryption,
6997                         OUT_OF_PLACE, 1);
6998 }
6999
7000 static int
7001 test_snow3g_auth_cipher_with_digest_test_case_1(void)
7002 {
7003         return test_snow3g_auth_cipher(
7004                 &snow3g_test_case_7, IN_PLACE, 0);
7005 }
7006
7007 static int
7008 test_kasumi_auth_cipher_test_case_1(void)
7009 {
7010         return test_kasumi_auth_cipher(
7011                 &kasumi_test_case_3, IN_PLACE, 0);
7012 }
7013
7014 static int
7015 test_kasumi_auth_cipher_test_case_2(void)
7016 {
7017         return test_kasumi_auth_cipher(
7018                 &kasumi_auth_cipher_test_case_2, IN_PLACE, 0);
7019 }
7020
7021 static int
7022 test_kasumi_auth_cipher_test_case_2_oop(void)
7023 {
7024         return test_kasumi_auth_cipher(
7025                 &kasumi_auth_cipher_test_case_2, OUT_OF_PLACE, 0);
7026 }
7027
7028 static int
7029 test_kasumi_auth_cipher_test_case_2_sgl(void)
7030 {
7031         return test_kasumi_auth_cipher_sgl(
7032                 &kasumi_auth_cipher_test_case_2, IN_PLACE, 0);
7033 }
7034
7035 static int
7036 test_kasumi_auth_cipher_test_case_2_oop_sgl(void)
7037 {
7038         return test_kasumi_auth_cipher_sgl(
7039                 &kasumi_auth_cipher_test_case_2, OUT_OF_PLACE, 0);
7040 }
7041
7042 static int
7043 test_kasumi_auth_cipher_verify_test_case_1(void)
7044 {
7045         return test_kasumi_auth_cipher(
7046                 &kasumi_test_case_3, IN_PLACE, 1);
7047 }
7048
7049 static int
7050 test_kasumi_auth_cipher_verify_test_case_2(void)
7051 {
7052         return test_kasumi_auth_cipher(
7053                 &kasumi_auth_cipher_test_case_2, IN_PLACE, 1);
7054 }
7055
7056 static int
7057 test_kasumi_auth_cipher_verify_test_case_2_oop(void)
7058 {
7059         return test_kasumi_auth_cipher(
7060                 &kasumi_auth_cipher_test_case_2, OUT_OF_PLACE, 1);
7061 }
7062
7063 static int
7064 test_kasumi_auth_cipher_verify_test_case_2_sgl(void)
7065 {
7066         return test_kasumi_auth_cipher_sgl(
7067                 &kasumi_auth_cipher_test_case_2, IN_PLACE, 1);
7068 }
7069
7070 static int
7071 test_kasumi_auth_cipher_verify_test_case_2_oop_sgl(void)
7072 {
7073         return test_kasumi_auth_cipher_sgl(
7074                 &kasumi_auth_cipher_test_case_2, OUT_OF_PLACE, 1);
7075 }
7076
7077 static int
7078 test_kasumi_cipher_auth_test_case_1(void)
7079 {
7080         return test_kasumi_cipher_auth(&kasumi_test_case_6);
7081 }
7082
7083 static int
7084 test_zuc_encryption_test_case_1(void)
7085 {
7086         return test_zuc_encryption(&zuc_test_case_cipher_193b);
7087 }
7088
7089 static int
7090 test_zuc_encryption_test_case_2(void)
7091 {
7092         return test_zuc_encryption(&zuc_test_case_cipher_800b);
7093 }
7094
7095 static int
7096 test_zuc_encryption_test_case_3(void)
7097 {
7098         return test_zuc_encryption(&zuc_test_case_cipher_1570b);
7099 }
7100
7101 static int
7102 test_zuc_encryption_test_case_4(void)
7103 {
7104         return test_zuc_encryption(&zuc_test_case_cipher_2798b);
7105 }
7106
7107 static int
7108 test_zuc_encryption_test_case_5(void)
7109 {
7110         return test_zuc_encryption(&zuc_test_case_cipher_4019b);
7111 }
7112
7113 static int
7114 test_zuc_encryption_test_case_6_sgl(void)
7115 {
7116         return test_zuc_encryption_sgl(&zuc_test_case_cipher_193b);
7117 }
7118
7119 static int
7120 test_zuc_encryption_test_case_7(void)
7121 {
7122         return test_zuc_encryption(&zuc_test_case_cipher_800b_key_256b);
7123 }
7124
7125 static int
7126 test_zuc_hash_generate_test_case_1(void)
7127 {
7128         return test_zuc_authentication(&zuc_test_case_auth_1b);
7129 }
7130
7131 static int
7132 test_zuc_hash_generate_test_case_2(void)
7133 {
7134         return test_zuc_authentication(&zuc_test_case_auth_90b);
7135 }
7136
7137 static int
7138 test_zuc_hash_generate_test_case_3(void)
7139 {
7140         return test_zuc_authentication(&zuc_test_case_auth_577b);
7141 }
7142
7143 static int
7144 test_zuc_hash_generate_test_case_4(void)
7145 {
7146         return test_zuc_authentication(&zuc_test_case_auth_2079b);
7147 }
7148
7149 static int
7150 test_zuc_hash_generate_test_case_5(void)
7151 {
7152         return test_zuc_authentication(&zuc_test_auth_5670b);
7153 }
7154
7155 static int
7156 test_zuc_hash_generate_test_case_6(void)
7157 {
7158         return test_zuc_authentication(&zuc_test_case_auth_128b);
7159 }
7160
7161 static int
7162 test_zuc_hash_generate_test_case_7(void)
7163 {
7164         return test_zuc_authentication(&zuc_test_case_auth_2080b);
7165 }
7166
7167 static int
7168 test_zuc_hash_generate_test_case_8(void)
7169 {
7170         return test_zuc_authentication(&zuc_test_case_auth_584b);
7171 }
7172
7173 static int
7174 test_zuc_hash_generate_test_case_9(void)
7175 {
7176         return test_zuc_authentication(&zuc_test_case_auth_584b_mac_64b);
7177 }
7178
7179 static int
7180 test_zuc_hash_generate_test_case_10(void)
7181 {
7182         return test_zuc_authentication(&zuc_test_case_auth_2080b_mac_128b);
7183 }
7184
7185 static int
7186 test_zuc_cipher_auth_test_case_1(void)
7187 {
7188         return test_zuc_cipher_auth(&zuc_test_case_cipher_200b_auth_200b);
7189 }
7190
7191 static int
7192 test_zuc_cipher_auth_test_case_2(void)
7193 {
7194         return test_zuc_cipher_auth(&zuc_test_case_cipher_800b_auth_120b);
7195 }
7196
7197 static int
7198 test_zuc_auth_cipher_test_case_1(void)
7199 {
7200         return test_zuc_auth_cipher(
7201                 &zuc_auth_cipher_test_case_1, IN_PLACE, 0);
7202 }
7203
7204 static int
7205 test_zuc_auth_cipher_test_case_1_oop(void)
7206 {
7207         return test_zuc_auth_cipher(
7208                 &zuc_auth_cipher_test_case_1, OUT_OF_PLACE, 0);
7209 }
7210
7211 static int
7212 test_zuc_auth_cipher_test_case_1_sgl(void)
7213 {
7214         return test_zuc_auth_cipher_sgl(
7215                 &zuc_auth_cipher_test_case_1, IN_PLACE, 0);
7216 }
7217
7218 static int
7219 test_zuc_auth_cipher_test_case_1_oop_sgl(void)
7220 {
7221         return test_zuc_auth_cipher_sgl(
7222                 &zuc_auth_cipher_test_case_1, OUT_OF_PLACE, 0);
7223 }
7224
7225 static int
7226 test_zuc_auth_cipher_verify_test_case_1(void)
7227 {
7228         return test_zuc_auth_cipher(
7229                 &zuc_auth_cipher_test_case_1, IN_PLACE, 1);
7230 }
7231
7232 static int
7233 test_zuc_auth_cipher_verify_test_case_1_oop(void)
7234 {
7235         return test_zuc_auth_cipher(
7236                 &zuc_auth_cipher_test_case_1, OUT_OF_PLACE, 1);
7237 }
7238
7239 static int
7240 test_zuc_auth_cipher_verify_test_case_1_sgl(void)
7241 {
7242         return test_zuc_auth_cipher_sgl(
7243                 &zuc_auth_cipher_test_case_1, IN_PLACE, 1);
7244 }
7245
7246 static int
7247 test_zuc_auth_cipher_verify_test_case_1_oop_sgl(void)
7248 {
7249         return test_zuc_auth_cipher_sgl(
7250                 &zuc_auth_cipher_test_case_1, OUT_OF_PLACE, 1);
7251 }
7252
7253 static int
7254 test_mixed_check_if_unsupported(const struct mixed_cipher_auth_test_data *tdata)
7255 {
7256         uint8_t dev_id = testsuite_params.valid_devs[0];
7257
7258         struct rte_cryptodev_sym_capability_idx cap_idx;
7259
7260         /* Check if device supports particular cipher algorithm */
7261         cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
7262         cap_idx.algo.cipher = tdata->cipher_algo;
7263         if (rte_cryptodev_sym_capability_get(dev_id, &cap_idx) == NULL)
7264                 return TEST_SKIPPED;
7265
7266         /* Check if device supports particular hash algorithm */
7267         cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
7268         cap_idx.algo.auth = tdata->auth_algo;
7269         if (rte_cryptodev_sym_capability_get(dev_id, &cap_idx) == NULL)
7270                 return TEST_SKIPPED;
7271
7272         return 0;
7273 }
7274
7275 static int
7276 test_mixed_auth_cipher(const struct mixed_cipher_auth_test_data *tdata,
7277         uint8_t op_mode, uint8_t verify)
7278 {
7279         struct crypto_testsuite_params *ts_params = &testsuite_params;
7280         struct crypto_unittest_params *ut_params = &unittest_params;
7281
7282         int retval;
7283
7284         uint8_t *plaintext = NULL, *ciphertext = NULL;
7285         unsigned int plaintext_pad_len;
7286         unsigned int plaintext_len;
7287         unsigned int ciphertext_pad_len;
7288         unsigned int ciphertext_len;
7289
7290         struct rte_cryptodev_info dev_info;
7291         struct rte_crypto_op *op;
7292
7293         /* Check if device supports particular algorithms separately */
7294         if (test_mixed_check_if_unsupported(tdata))
7295                 return TEST_SKIPPED;
7296         if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
7297                 return TEST_SKIPPED;
7298
7299         rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
7300
7301         uint64_t feat_flags = dev_info.feature_flags;
7302
7303         if (!(feat_flags & RTE_CRYPTODEV_FF_DIGEST_ENCRYPTED)) {
7304                 printf("Device doesn't support digest encrypted.\n");
7305                 return TEST_SKIPPED;
7306         }
7307
7308         /* Create the session */
7309         if (verify)
7310                 retval = create_wireless_algo_cipher_auth_session(
7311                                 ts_params->valid_devs[0],
7312                                 RTE_CRYPTO_CIPHER_OP_DECRYPT,
7313                                 RTE_CRYPTO_AUTH_OP_VERIFY,
7314                                 tdata->auth_algo,
7315                                 tdata->cipher_algo,
7316                                 tdata->auth_key.data, tdata->auth_key.len,
7317                                 tdata->auth_iv.len, tdata->digest_enc.len,
7318                                 tdata->cipher_iv.len);
7319         else
7320                 retval = create_wireless_algo_auth_cipher_session(
7321                                 ts_params->valid_devs[0],
7322                                 RTE_CRYPTO_CIPHER_OP_ENCRYPT,
7323                                 RTE_CRYPTO_AUTH_OP_GENERATE,
7324                                 tdata->auth_algo,
7325                                 tdata->cipher_algo,
7326                                 tdata->auth_key.data, tdata->auth_key.len,
7327                                 tdata->auth_iv.len, tdata->digest_enc.len,
7328                                 tdata->cipher_iv.len);
7329         if (retval != 0)
7330                 return retval;
7331
7332         ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
7333         if (op_mode == OUT_OF_PLACE)
7334                 ut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
7335
7336         /* clear mbuf payload */
7337         memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
7338                 rte_pktmbuf_tailroom(ut_params->ibuf));
7339         if (op_mode == OUT_OF_PLACE) {
7340
7341                 memset(rte_pktmbuf_mtod(ut_params->obuf, uint8_t *), 0,
7342                                 rte_pktmbuf_tailroom(ut_params->obuf));
7343         }
7344
7345         ciphertext_len = ceil_byte_length(tdata->ciphertext.len_bits);
7346         plaintext_len = ceil_byte_length(tdata->plaintext.len_bits);
7347         ciphertext_pad_len = RTE_ALIGN_CEIL(ciphertext_len, 16);
7348         plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16);
7349
7350         if (verify) {
7351                 ciphertext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
7352                                 ciphertext_pad_len);
7353                 memcpy(ciphertext, tdata->ciphertext.data, ciphertext_len);
7354                 if (op_mode == OUT_OF_PLACE)
7355                         rte_pktmbuf_append(ut_params->obuf, ciphertext_pad_len);
7356                 debug_hexdump(stdout, "ciphertext:", ciphertext,
7357                                 ciphertext_len);
7358         } else {
7359                 plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
7360                                 plaintext_pad_len);
7361                 memcpy(plaintext, tdata->plaintext.data, plaintext_len);
7362                 if (op_mode == OUT_OF_PLACE)
7363                         rte_pktmbuf_append(ut_params->obuf, plaintext_pad_len);
7364                 debug_hexdump(stdout, "plaintext:", plaintext, plaintext_len);
7365         }
7366
7367         /* Create the operation */
7368         retval = create_wireless_algo_auth_cipher_operation(
7369                         tdata->digest_enc.data, tdata->digest_enc.len,
7370                         tdata->cipher_iv.data, tdata->cipher_iv.len,
7371                         tdata->auth_iv.data, tdata->auth_iv.len,
7372                         (tdata->digest_enc.offset == 0 ?
7373                                 plaintext_pad_len
7374                                 : tdata->digest_enc.offset),
7375                         tdata->validCipherLen.len_bits,
7376                         tdata->cipher.offset_bits,
7377                         tdata->validAuthLen.len_bits,
7378                         tdata->auth.offset_bits,
7379                         op_mode, 0, verify);
7380
7381         if (retval < 0)
7382                 return retval;
7383
7384         op = process_crypto_request(ts_params->valid_devs[0], ut_params->op);
7385
7386         /* Check if the op failed because the device doesn't */
7387         /* support this particular combination of algorithms */
7388         if (op == NULL && ut_params->op->status ==
7389                         RTE_CRYPTO_OP_STATUS_INVALID_SESSION) {
7390                 printf("Device doesn't support this mixed combination. "
7391                                 "Test Skipped.\n");
7392                 return TEST_SKIPPED;
7393         }
7394         ut_params->op = op;
7395
7396         TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
7397
7398         ut_params->obuf = (op_mode == IN_PLACE ?
7399                         ut_params->op->sym->m_src : ut_params->op->sym->m_dst);
7400
7401         if (verify) {
7402                 if (ut_params->obuf)
7403                         plaintext = rte_pktmbuf_mtod(ut_params->obuf,
7404                                                         uint8_t *);
7405                 else
7406                         plaintext = ciphertext +
7407                                         (tdata->cipher.offset_bits >> 3);
7408
7409                 debug_hexdump(stdout, "plaintext:", plaintext,
7410                                 tdata->plaintext.len_bits >> 3);
7411                 debug_hexdump(stdout, "plaintext expected:",
7412                                 tdata->plaintext.data,
7413                                 tdata->plaintext.len_bits >> 3);
7414         } else {
7415                 if (ut_params->obuf)
7416                         ciphertext = rte_pktmbuf_mtod(ut_params->obuf,
7417                                         uint8_t *);
7418                 else
7419                         ciphertext = plaintext;
7420
7421                 debug_hexdump(stdout, "ciphertext:", ciphertext,
7422                                 ciphertext_len);
7423                 debug_hexdump(stdout, "ciphertext expected:",
7424                                 tdata->ciphertext.data,
7425                                 tdata->ciphertext.len_bits >> 3);
7426
7427                 ut_params->digest = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *)
7428                                 + (tdata->digest_enc.offset == 0 ?
7429                 plaintext_pad_len : tdata->digest_enc.offset);
7430
7431                 debug_hexdump(stdout, "digest:", ut_params->digest,
7432                                 tdata->digest_enc.len);
7433                 debug_hexdump(stdout, "digest expected:",
7434                                 tdata->digest_enc.data,
7435                                 tdata->digest_enc.len);
7436         }
7437
7438         /* Validate obuf */
7439         if (verify) {
7440                 TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
7441                                 plaintext,
7442                                 tdata->plaintext.data,
7443                                 tdata->plaintext.len_bits >> 3,
7444                                 "Plaintext data not as expected");
7445         } else {
7446                 TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
7447                                 ciphertext,
7448                                 tdata->ciphertext.data,
7449                                 tdata->validDataLen.len_bits,
7450                                 "Ciphertext data not as expected");
7451
7452                 TEST_ASSERT_BUFFERS_ARE_EQUAL(
7453                                 ut_params->digest,
7454                                 tdata->digest_enc.data,
7455                                 DIGEST_BYTE_LENGTH_SNOW3G_UIA2,
7456                                 "Generated auth tag not as expected");
7457         }
7458
7459         TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
7460                         "crypto op processing failed");
7461
7462         return 0;
7463 }
7464
7465 static int
7466 test_mixed_auth_cipher_sgl(const struct mixed_cipher_auth_test_data *tdata,
7467         uint8_t op_mode, uint8_t verify)
7468 {
7469         struct crypto_testsuite_params *ts_params = &testsuite_params;
7470         struct crypto_unittest_params *ut_params = &unittest_params;
7471
7472         int retval;
7473
7474         const uint8_t *plaintext = NULL;
7475         const uint8_t *ciphertext = NULL;
7476         const uint8_t *digest = NULL;
7477         unsigned int plaintext_pad_len;
7478         unsigned int plaintext_len;
7479         unsigned int ciphertext_pad_len;
7480         unsigned int ciphertext_len;
7481         uint8_t buffer[10000];
7482         uint8_t digest_buffer[10000];
7483
7484         struct rte_cryptodev_info dev_info;
7485         struct rte_crypto_op *op;
7486
7487         /* Check if device supports particular algorithms */
7488         if (test_mixed_check_if_unsupported(tdata))
7489                 return TEST_SKIPPED;
7490         if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
7491                 return TEST_SKIPPED;
7492
7493         rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
7494
7495         uint64_t feat_flags = dev_info.feature_flags;
7496
7497         if (op_mode == IN_PLACE) {
7498                 if (!(feat_flags & RTE_CRYPTODEV_FF_IN_PLACE_SGL)) {
7499                         printf("Device doesn't support in-place scatter-gather "
7500                                         "in both input and output mbufs.\n");
7501                         return TEST_SKIPPED;
7502                 }
7503         } else {
7504                 if (!(feat_flags & RTE_CRYPTODEV_FF_OOP_SGL_IN_SGL_OUT)) {
7505                         printf("Device doesn't support out-of-place scatter-gather "
7506                                         "in both input and output mbufs.\n");
7507                         return TEST_SKIPPED;
7508                 }
7509                 if (!(feat_flags & RTE_CRYPTODEV_FF_DIGEST_ENCRYPTED)) {
7510                         printf("Device doesn't support digest encrypted.\n");
7511                         return TEST_SKIPPED;
7512                 }
7513         }
7514
7515         /* Create the session */
7516         if (verify)
7517                 retval = create_wireless_algo_cipher_auth_session(
7518                                 ts_params->valid_devs[0],
7519                                 RTE_CRYPTO_CIPHER_OP_DECRYPT,
7520                                 RTE_CRYPTO_AUTH_OP_VERIFY,
7521                                 tdata->auth_algo,
7522                                 tdata->cipher_algo,
7523                                 tdata->auth_key.data, tdata->auth_key.len,
7524                                 tdata->auth_iv.len, tdata->digest_enc.len,
7525                                 tdata->cipher_iv.len);
7526         else
7527                 retval = create_wireless_algo_auth_cipher_session(
7528                                 ts_params->valid_devs[0],
7529                                 RTE_CRYPTO_CIPHER_OP_ENCRYPT,
7530                                 RTE_CRYPTO_AUTH_OP_GENERATE,
7531                                 tdata->auth_algo,
7532                                 tdata->cipher_algo,
7533                                 tdata->auth_key.data, tdata->auth_key.len,
7534                                 tdata->auth_iv.len, tdata->digest_enc.len,
7535                                 tdata->cipher_iv.len);
7536         if (retval != 0)
7537                 return retval;
7538
7539         ciphertext_len = ceil_byte_length(tdata->ciphertext.len_bits);
7540         plaintext_len = ceil_byte_length(tdata->plaintext.len_bits);
7541         ciphertext_pad_len = RTE_ALIGN_CEIL(ciphertext_len, 16);
7542         plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16);
7543
7544         ut_params->ibuf = create_segmented_mbuf(ts_params->mbuf_pool,
7545                         ciphertext_pad_len, 15, 0);
7546         TEST_ASSERT_NOT_NULL(ut_params->ibuf,
7547                         "Failed to allocate input buffer in mempool");
7548
7549         if (op_mode == OUT_OF_PLACE) {
7550                 ut_params->obuf = create_segmented_mbuf(ts_params->mbuf_pool,
7551                                 plaintext_pad_len, 15, 0);
7552                 TEST_ASSERT_NOT_NULL(ut_params->obuf,
7553                                 "Failed to allocate output buffer in mempool");
7554         }
7555
7556         if (verify) {
7557                 pktmbuf_write(ut_params->ibuf, 0, ciphertext_len,
7558                         tdata->ciphertext.data);
7559                 ciphertext = rte_pktmbuf_read(ut_params->ibuf, 0,
7560                                         ciphertext_len, buffer);
7561                 debug_hexdump(stdout, "ciphertext:", ciphertext,
7562                         ciphertext_len);
7563         } else {
7564                 pktmbuf_write(ut_params->ibuf, 0, plaintext_len,
7565                         tdata->plaintext.data);
7566                 plaintext = rte_pktmbuf_read(ut_params->ibuf, 0,
7567                                         plaintext_len, buffer);
7568                 debug_hexdump(stdout, "plaintext:", plaintext,
7569                         plaintext_len);
7570         }
7571         memset(buffer, 0, sizeof(buffer));
7572
7573         /* Create the operation */
7574         retval = create_wireless_algo_auth_cipher_operation(
7575                         tdata->digest_enc.data, tdata->digest_enc.len,
7576                         tdata->cipher_iv.data, tdata->cipher_iv.len,
7577                         tdata->auth_iv.data, tdata->auth_iv.len,
7578                         (tdata->digest_enc.offset == 0 ?
7579                                 plaintext_pad_len
7580                                 : tdata->digest_enc.offset),
7581                         tdata->validCipherLen.len_bits,
7582                         tdata->cipher.offset_bits,
7583                         tdata->validAuthLen.len_bits,
7584                         tdata->auth.offset_bits,
7585                         op_mode, 1, verify);
7586
7587         if (retval < 0)
7588                 return retval;
7589
7590         op = process_crypto_request(ts_params->valid_devs[0], ut_params->op);
7591
7592         /* Check if the op failed because the device doesn't */
7593         /* support this particular combination of algorithms */
7594         if (op == NULL && ut_params->op->status ==
7595                         RTE_CRYPTO_OP_STATUS_INVALID_SESSION) {
7596                 printf("Device doesn't support this mixed combination. "
7597                                 "Test Skipped.\n");
7598                 return TEST_SKIPPED;
7599         }
7600         ut_params->op = op;
7601
7602         TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
7603
7604         ut_params->obuf = (op_mode == IN_PLACE ?
7605                         ut_params->op->sym->m_src : ut_params->op->sym->m_dst);
7606
7607         if (verify) {
7608                 if (ut_params->obuf)
7609                         plaintext = rte_pktmbuf_read(ut_params->obuf, 0,
7610                                         plaintext_len, buffer);
7611                 else
7612                         plaintext = rte_pktmbuf_read(ut_params->ibuf, 0,
7613                                         plaintext_len, buffer);
7614
7615                 debug_hexdump(stdout, "plaintext:", plaintext,
7616                                 (tdata->plaintext.len_bits >> 3) -
7617                                 tdata->digest_enc.len);
7618                 debug_hexdump(stdout, "plaintext expected:",
7619                                 tdata->plaintext.data,
7620                                 (tdata->plaintext.len_bits >> 3) -
7621                                 tdata->digest_enc.len);
7622         } else {
7623                 if (ut_params->obuf)
7624                         ciphertext = rte_pktmbuf_read(ut_params->obuf, 0,
7625                                         ciphertext_len, buffer);
7626                 else
7627                         ciphertext = rte_pktmbuf_read(ut_params->ibuf, 0,
7628                                         ciphertext_len, buffer);
7629
7630                 debug_hexdump(stdout, "ciphertext:", ciphertext,
7631                         ciphertext_len);
7632                 debug_hexdump(stdout, "ciphertext expected:",
7633                         tdata->ciphertext.data,
7634                         tdata->ciphertext.len_bits >> 3);
7635
7636                 if (ut_params->obuf)
7637                         digest = rte_pktmbuf_read(ut_params->obuf,
7638                                         (tdata->digest_enc.offset == 0 ?
7639                                                 plaintext_pad_len :
7640                                                 tdata->digest_enc.offset),
7641                                         tdata->digest_enc.len, digest_buffer);
7642                 else
7643                         digest = rte_pktmbuf_read(ut_params->ibuf,
7644                                         (tdata->digest_enc.offset == 0 ?
7645                                                 plaintext_pad_len :
7646                                                 tdata->digest_enc.offset),
7647                                         tdata->digest_enc.len, digest_buffer);
7648
7649                 debug_hexdump(stdout, "digest:", digest,
7650                                 tdata->digest_enc.len);
7651                 debug_hexdump(stdout, "digest expected:",
7652                                 tdata->digest_enc.data, tdata->digest_enc.len);
7653         }
7654
7655         /* Validate obuf */
7656         if (verify) {
7657                 TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
7658                                 plaintext,
7659                                 tdata->plaintext.data,
7660                                 tdata->plaintext.len_bits >> 3,
7661                                 "Plaintext data not as expected");
7662         } else {
7663                 TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
7664                                 ciphertext,
7665                                 tdata->ciphertext.data,
7666                                 tdata->validDataLen.len_bits,
7667                                 "Ciphertext data not as expected");
7668                 TEST_ASSERT_BUFFERS_ARE_EQUAL(
7669                                 digest,
7670                                 tdata->digest_enc.data,
7671                                 tdata->digest_enc.len,
7672                                 "Generated auth tag not as expected");
7673         }
7674
7675         TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
7676                         "crypto op processing failed");
7677
7678         return 0;
7679 }
7680
7681 /** AUTH AES CMAC + CIPHER AES CTR */
7682
7683 static int
7684 test_aes_cmac_aes_ctr_digest_enc_test_case_1(void)
7685 {
7686         return test_mixed_auth_cipher(
7687                 &auth_aes_cmac_cipher_aes_ctr_test_case_1, IN_PLACE, 0);
7688 }
7689
7690 static int
7691 test_aes_cmac_aes_ctr_digest_enc_test_case_1_oop(void)
7692 {
7693         return test_mixed_auth_cipher(
7694                 &auth_aes_cmac_cipher_aes_ctr_test_case_1, OUT_OF_PLACE, 0);
7695 }
7696
7697 static int
7698 test_aes_cmac_aes_ctr_digest_enc_test_case_1_sgl(void)
7699 {
7700         return test_mixed_auth_cipher_sgl(
7701                 &auth_aes_cmac_cipher_aes_ctr_test_case_1, IN_PLACE, 0);
7702 }
7703
7704 static int
7705 test_aes_cmac_aes_ctr_digest_enc_test_case_1_oop_sgl(void)
7706 {
7707         return test_mixed_auth_cipher_sgl(
7708                 &auth_aes_cmac_cipher_aes_ctr_test_case_1, OUT_OF_PLACE, 0);
7709 }
7710
7711 static int
7712 test_verify_aes_cmac_aes_ctr_digest_enc_test_case_1(void)
7713 {
7714         return test_mixed_auth_cipher(
7715                 &auth_aes_cmac_cipher_aes_ctr_test_case_1, IN_PLACE, 1);
7716 }
7717
7718 static int
7719 test_verify_aes_cmac_aes_ctr_digest_enc_test_case_1_oop(void)
7720 {
7721         return test_mixed_auth_cipher(
7722                 &auth_aes_cmac_cipher_aes_ctr_test_case_1, OUT_OF_PLACE, 1);
7723 }
7724
7725 static int
7726 test_verify_aes_cmac_aes_ctr_digest_enc_test_case_1_sgl(void)
7727 {
7728         return test_mixed_auth_cipher_sgl(
7729                 &auth_aes_cmac_cipher_aes_ctr_test_case_1, IN_PLACE, 1);
7730 }
7731
7732 static int
7733 test_verify_aes_cmac_aes_ctr_digest_enc_test_case_1_oop_sgl(void)
7734 {
7735         return test_mixed_auth_cipher_sgl(
7736                 &auth_aes_cmac_cipher_aes_ctr_test_case_1, OUT_OF_PLACE, 1);
7737 }
7738
7739 /** MIXED AUTH + CIPHER */
7740
7741 static int
7742 test_auth_zuc_cipher_snow_test_case_1(void)
7743 {
7744         return test_mixed_auth_cipher(
7745                 &auth_zuc_cipher_snow_test_case_1, OUT_OF_PLACE, 0);
7746 }
7747
7748 static int
7749 test_verify_auth_zuc_cipher_snow_test_case_1(void)
7750 {
7751         return test_mixed_auth_cipher(
7752                 &auth_zuc_cipher_snow_test_case_1, OUT_OF_PLACE, 1);
7753 }
7754
7755 static int
7756 test_auth_aes_cmac_cipher_snow_test_case_1(void)
7757 {
7758         return test_mixed_auth_cipher(
7759                 &auth_aes_cmac_cipher_snow_test_case_1, OUT_OF_PLACE, 0);
7760 }
7761
7762 static int
7763 test_verify_auth_aes_cmac_cipher_snow_test_case_1(void)
7764 {
7765         return test_mixed_auth_cipher(
7766                 &auth_aes_cmac_cipher_snow_test_case_1, OUT_OF_PLACE, 1);
7767 }
7768
7769 static int
7770 test_auth_zuc_cipher_aes_ctr_test_case_1(void)
7771 {
7772         return test_mixed_auth_cipher(
7773                 &auth_zuc_cipher_aes_ctr_test_case_1, OUT_OF_PLACE, 0);
7774 }
7775
7776 static int
7777 test_verify_auth_zuc_cipher_aes_ctr_test_case_1(void)
7778 {
7779         return test_mixed_auth_cipher(
7780                 &auth_zuc_cipher_aes_ctr_test_case_1, OUT_OF_PLACE, 1);
7781 }
7782
7783 static int
7784 test_auth_snow_cipher_aes_ctr_test_case_1(void)
7785 {
7786         return test_mixed_auth_cipher(
7787                 &auth_snow_cipher_aes_ctr_test_case_1, OUT_OF_PLACE, 0);
7788 }
7789
7790 static int
7791 test_verify_auth_snow_cipher_aes_ctr_test_case_1(void)
7792 {
7793         return test_mixed_auth_cipher(
7794                 &auth_snow_cipher_aes_ctr_test_case_1, OUT_OF_PLACE, 1);
7795 }
7796
7797 static int
7798 test_auth_snow_cipher_zuc_test_case_1(void)
7799 {
7800         return test_mixed_auth_cipher(
7801                 &auth_snow_cipher_zuc_test_case_1, OUT_OF_PLACE, 0);
7802 }
7803
7804 static int
7805 test_verify_auth_snow_cipher_zuc_test_case_1(void)
7806 {
7807         return test_mixed_auth_cipher(
7808                 &auth_snow_cipher_zuc_test_case_1, OUT_OF_PLACE, 1);
7809 }
7810
7811 static int
7812 test_auth_aes_cmac_cipher_zuc_test_case_1(void)
7813 {
7814         return test_mixed_auth_cipher(
7815                 &auth_aes_cmac_cipher_zuc_test_case_1, OUT_OF_PLACE, 0);
7816 }
7817
7818 static int
7819 test_verify_auth_aes_cmac_cipher_zuc_test_case_1(void)
7820 {
7821         return test_mixed_auth_cipher(
7822                 &auth_aes_cmac_cipher_zuc_test_case_1, OUT_OF_PLACE, 1);
7823 }
7824
7825 static int
7826 test_auth_null_cipher_snow_test_case_1(void)
7827 {
7828         return test_mixed_auth_cipher(
7829                 &auth_null_cipher_snow_test_case_1, OUT_OF_PLACE, 0);
7830 }
7831
7832 static int
7833 test_verify_auth_null_cipher_snow_test_case_1(void)
7834 {
7835         return test_mixed_auth_cipher(
7836                 &auth_null_cipher_snow_test_case_1, OUT_OF_PLACE, 1);
7837 }
7838
7839 static int
7840 test_auth_null_cipher_zuc_test_case_1(void)
7841 {
7842         return test_mixed_auth_cipher(
7843                 &auth_null_cipher_zuc_test_case_1, OUT_OF_PLACE, 0);
7844 }
7845
7846 static int
7847 test_verify_auth_null_cipher_zuc_test_case_1(void)
7848 {
7849         return test_mixed_auth_cipher(
7850                 &auth_null_cipher_zuc_test_case_1, OUT_OF_PLACE, 1);
7851 }
7852
7853 static int
7854 test_auth_snow_cipher_null_test_case_1(void)
7855 {
7856         return test_mixed_auth_cipher(
7857                 &auth_snow_cipher_null_test_case_1, OUT_OF_PLACE, 0);
7858 }
7859
7860 static int
7861 test_verify_auth_snow_cipher_null_test_case_1(void)
7862 {
7863         return test_mixed_auth_cipher(
7864                 &auth_snow_cipher_null_test_case_1, OUT_OF_PLACE, 1);
7865 }
7866
7867 static int
7868 test_auth_zuc_cipher_null_test_case_1(void)
7869 {
7870         return test_mixed_auth_cipher(
7871                 &auth_zuc_cipher_null_test_case_1, OUT_OF_PLACE, 0);
7872 }
7873
7874 static int
7875 test_verify_auth_zuc_cipher_null_test_case_1(void)
7876 {
7877         return test_mixed_auth_cipher(
7878                 &auth_zuc_cipher_null_test_case_1, OUT_OF_PLACE, 1);
7879 }
7880
7881 static int
7882 test_auth_null_cipher_aes_ctr_test_case_1(void)
7883 {
7884         return test_mixed_auth_cipher(
7885                 &auth_null_cipher_aes_ctr_test_case_1, OUT_OF_PLACE, 0);
7886 }
7887
7888 static int
7889 test_verify_auth_null_cipher_aes_ctr_test_case_1(void)
7890 {
7891         return test_mixed_auth_cipher(
7892                 &auth_null_cipher_aes_ctr_test_case_1, OUT_OF_PLACE, 1);
7893 }
7894
7895 static int
7896 test_auth_aes_cmac_cipher_null_test_case_1(void)
7897 {
7898         return test_mixed_auth_cipher(
7899                 &auth_aes_cmac_cipher_null_test_case_1, OUT_OF_PLACE, 0);
7900 }
7901
7902 static int
7903 test_verify_auth_aes_cmac_cipher_null_test_case_1(void)
7904 {
7905         return test_mixed_auth_cipher(
7906                 &auth_aes_cmac_cipher_null_test_case_1, OUT_OF_PLACE, 1);
7907 }
7908
7909 /* ***** AEAD algorithm Tests ***** */
7910
7911 static int
7912 create_aead_session(uint8_t dev_id, enum rte_crypto_aead_algorithm algo,
7913                 enum rte_crypto_aead_operation op,
7914                 const uint8_t *key, const uint8_t key_len,
7915                 const uint16_t aad_len, const uint8_t auth_len,
7916                 uint8_t iv_len)
7917 {
7918         uint8_t aead_key[key_len];
7919
7920         struct crypto_testsuite_params *ts_params = &testsuite_params;
7921         struct crypto_unittest_params *ut_params = &unittest_params;
7922
7923         memcpy(aead_key, key, key_len);
7924
7925         /* Setup AEAD Parameters */
7926         ut_params->aead_xform.type = RTE_CRYPTO_SYM_XFORM_AEAD;
7927         ut_params->aead_xform.next = NULL;
7928         ut_params->aead_xform.aead.algo = algo;
7929         ut_params->aead_xform.aead.op = op;
7930         ut_params->aead_xform.aead.key.data = aead_key;
7931         ut_params->aead_xform.aead.key.length = key_len;
7932         ut_params->aead_xform.aead.iv.offset = IV_OFFSET;
7933         ut_params->aead_xform.aead.iv.length = iv_len;
7934         ut_params->aead_xform.aead.digest_length = auth_len;
7935         ut_params->aead_xform.aead.aad_length = aad_len;
7936
7937         debug_hexdump(stdout, "key:", key, key_len);
7938
7939         /* Create Crypto session*/
7940         ut_params->sess = rte_cryptodev_sym_session_create(
7941                         ts_params->session_mpool);
7942
7943         rte_cryptodev_sym_session_init(dev_id, ut_params->sess,
7944                         &ut_params->aead_xform,
7945                         ts_params->session_priv_mpool);
7946
7947         TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed");
7948
7949         return 0;
7950 }
7951
7952 static int
7953 create_aead_xform(struct rte_crypto_op *op,
7954                 enum rte_crypto_aead_algorithm algo,
7955                 enum rte_crypto_aead_operation aead_op,
7956                 uint8_t *key, const uint8_t key_len,
7957                 const uint8_t aad_len, const uint8_t auth_len,
7958                 uint8_t iv_len)
7959 {
7960         TEST_ASSERT_NOT_NULL(rte_crypto_op_sym_xforms_alloc(op, 1),
7961                         "failed to allocate space for crypto transform");
7962
7963         struct rte_crypto_sym_op *sym_op = op->sym;
7964
7965         /* Setup AEAD Parameters */
7966         sym_op->xform->type = RTE_CRYPTO_SYM_XFORM_AEAD;
7967         sym_op->xform->next = NULL;
7968         sym_op->xform->aead.algo = algo;
7969         sym_op->xform->aead.op = aead_op;
7970         sym_op->xform->aead.key.data = key;
7971         sym_op->xform->aead.key.length = key_len;
7972         sym_op->xform->aead.iv.offset = IV_OFFSET;
7973         sym_op->xform->aead.iv.length = iv_len;
7974         sym_op->xform->aead.digest_length = auth_len;
7975         sym_op->xform->aead.aad_length = aad_len;
7976
7977         debug_hexdump(stdout, "key:", key, key_len);
7978
7979         return 0;
7980 }
7981
7982 static int
7983 create_aead_operation(enum rte_crypto_aead_operation op,
7984                 const struct aead_test_data *tdata)
7985 {
7986         struct crypto_testsuite_params *ts_params = &testsuite_params;
7987         struct crypto_unittest_params *ut_params = &unittest_params;
7988
7989         uint8_t *plaintext, *ciphertext;
7990         unsigned int aad_pad_len, plaintext_pad_len;
7991
7992         /* Generate Crypto op data structure */
7993         ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
7994                         RTE_CRYPTO_OP_TYPE_SYMMETRIC);
7995         TEST_ASSERT_NOT_NULL(ut_params->op,
7996                         "Failed to allocate symmetric crypto operation struct");
7997
7998         struct rte_crypto_sym_op *sym_op = ut_params->op->sym;
7999
8000         /* Append aad data */
8001         if (tdata->algo == RTE_CRYPTO_AEAD_AES_CCM) {
8002                 aad_pad_len = RTE_ALIGN_CEIL(tdata->aad.len + 18, 16);
8003                 sym_op->aead.aad.data = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
8004                                 aad_pad_len);
8005                 TEST_ASSERT_NOT_NULL(sym_op->aead.aad.data,
8006                                 "no room to append aad");
8007
8008                 sym_op->aead.aad.phys_addr =
8009                                 rte_pktmbuf_iova(ut_params->ibuf);
8010                 /* Copy AAD 18 bytes after the AAD pointer, according to the API */
8011                 memcpy(sym_op->aead.aad.data + 18, tdata->aad.data, tdata->aad.len);
8012                 debug_hexdump(stdout, "aad:", sym_op->aead.aad.data,
8013                         tdata->aad.len);
8014
8015                 /* Append IV at the end of the crypto operation*/
8016                 uint8_t *iv_ptr = rte_crypto_op_ctod_offset(ut_params->op,
8017                                 uint8_t *, IV_OFFSET);
8018
8019                 /* Copy IV 1 byte after the IV pointer, according to the API */
8020                 rte_memcpy(iv_ptr + 1, tdata->iv.data, tdata->iv.len);
8021                 debug_hexdump(stdout, "iv:", iv_ptr,
8022                         tdata->iv.len);
8023         } else {
8024                 aad_pad_len = RTE_ALIGN_CEIL(tdata->aad.len, 16);
8025                 sym_op->aead.aad.data = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
8026                                 aad_pad_len);
8027                 TEST_ASSERT_NOT_NULL(sym_op->aead.aad.data,
8028                                 "no room to append aad");
8029
8030                 sym_op->aead.aad.phys_addr =
8031                                 rte_pktmbuf_iova(ut_params->ibuf);
8032                 memcpy(sym_op->aead.aad.data, tdata->aad.data, tdata->aad.len);
8033                 debug_hexdump(stdout, "aad:", sym_op->aead.aad.data,
8034                         tdata->aad.len);
8035
8036                 /* Append IV at the end of the crypto operation*/
8037                 uint8_t *iv_ptr = rte_crypto_op_ctod_offset(ut_params->op,
8038                                 uint8_t *, IV_OFFSET);
8039
8040                 if (tdata->iv.len == 0) {
8041                         rte_memcpy(iv_ptr, tdata->iv.data, AES_GCM_J0_LENGTH);
8042                         debug_hexdump(stdout, "iv:", iv_ptr,
8043                                 AES_GCM_J0_LENGTH);
8044                 } else {
8045                         rte_memcpy(iv_ptr, tdata->iv.data, tdata->iv.len);
8046                         debug_hexdump(stdout, "iv:", iv_ptr,
8047                                 tdata->iv.len);
8048                 }
8049         }
8050
8051         /* Append plaintext/ciphertext */
8052         if (op == RTE_CRYPTO_AEAD_OP_ENCRYPT) {
8053                 plaintext_pad_len = RTE_ALIGN_CEIL(tdata->plaintext.len, 16);
8054                 plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
8055                                 plaintext_pad_len);
8056                 TEST_ASSERT_NOT_NULL(plaintext, "no room to append plaintext");
8057
8058                 memcpy(plaintext, tdata->plaintext.data, tdata->plaintext.len);
8059                 debug_hexdump(stdout, "plaintext:", plaintext,
8060                                 tdata->plaintext.len);
8061
8062                 if (ut_params->obuf) {
8063                         ciphertext = (uint8_t *)rte_pktmbuf_append(
8064                                         ut_params->obuf,
8065                                         plaintext_pad_len + aad_pad_len);
8066                         TEST_ASSERT_NOT_NULL(ciphertext,
8067                                         "no room to append ciphertext");
8068
8069                         memset(ciphertext + aad_pad_len, 0,
8070                                         tdata->ciphertext.len);
8071                 }
8072         } else {
8073                 plaintext_pad_len = RTE_ALIGN_CEIL(tdata->ciphertext.len, 16);
8074                 ciphertext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
8075                                 plaintext_pad_len);
8076                 TEST_ASSERT_NOT_NULL(ciphertext,
8077                                 "no room to append ciphertext");
8078
8079                 memcpy(ciphertext, tdata->ciphertext.data,
8080                                 tdata->ciphertext.len);
8081                 debug_hexdump(stdout, "ciphertext:", ciphertext,
8082                                 tdata->ciphertext.len);
8083
8084                 if (ut_params->obuf) {
8085                         plaintext = (uint8_t *)rte_pktmbuf_append(
8086                                         ut_params->obuf,
8087                                         plaintext_pad_len + aad_pad_len);
8088                         TEST_ASSERT_NOT_NULL(plaintext,
8089                                         "no room to append plaintext");
8090
8091                         memset(plaintext + aad_pad_len, 0,
8092                                         tdata->plaintext.len);
8093                 }
8094         }
8095
8096         /* Append digest data */
8097         if (op == RTE_CRYPTO_AEAD_OP_ENCRYPT) {
8098                 sym_op->aead.digest.data = (uint8_t *)rte_pktmbuf_append(
8099                                 ut_params->obuf ? ut_params->obuf :
8100                                                 ut_params->ibuf,
8101                                                 tdata->auth_tag.len);
8102                 TEST_ASSERT_NOT_NULL(sym_op->aead.digest.data,
8103                                 "no room to append digest");
8104                 memset(sym_op->aead.digest.data, 0, tdata->auth_tag.len);
8105                 sym_op->aead.digest.phys_addr = rte_pktmbuf_iova_offset(
8106                                 ut_params->obuf ? ut_params->obuf :
8107                                                 ut_params->ibuf,
8108                                                 plaintext_pad_len +
8109                                                 aad_pad_len);
8110         } else {
8111                 sym_op->aead.digest.data = (uint8_t *)rte_pktmbuf_append(
8112                                 ut_params->ibuf, tdata->auth_tag.len);
8113                 TEST_ASSERT_NOT_NULL(sym_op->aead.digest.data,
8114                                 "no room to append digest");
8115                 sym_op->aead.digest.phys_addr = rte_pktmbuf_iova_offset(
8116                                 ut_params->ibuf,
8117                                 plaintext_pad_len + aad_pad_len);
8118
8119                 rte_memcpy(sym_op->aead.digest.data, tdata->auth_tag.data,
8120                         tdata->auth_tag.len);
8121                 debug_hexdump(stdout, "digest:",
8122                         sym_op->aead.digest.data,
8123                         tdata->auth_tag.len);
8124         }
8125
8126         sym_op->aead.data.length = tdata->plaintext.len;
8127         sym_op->aead.data.offset = aad_pad_len;
8128
8129         return 0;
8130 }
8131
8132 static int
8133 test_authenticated_encryption(const struct aead_test_data *tdata)
8134 {
8135         struct crypto_testsuite_params *ts_params = &testsuite_params;
8136         struct crypto_unittest_params *ut_params = &unittest_params;
8137
8138         int retval;
8139         uint8_t *ciphertext, *auth_tag;
8140         uint16_t plaintext_pad_len;
8141         uint32_t i;
8142         struct rte_cryptodev_info dev_info;
8143
8144         rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
8145         uint64_t feat_flags = dev_info.feature_flags;
8146
8147         if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
8148                         (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
8149                 printf("Device doesn't support RAW data-path APIs.\n");
8150                 return TEST_SKIPPED;
8151         }
8152
8153         /* Verify the capabilities */
8154         struct rte_cryptodev_sym_capability_idx cap_idx;
8155         const struct rte_cryptodev_symmetric_capability *capability;
8156         cap_idx.type = RTE_CRYPTO_SYM_XFORM_AEAD;
8157         cap_idx.algo.aead = tdata->algo;
8158         capability = rte_cryptodev_sym_capability_get(
8159                         ts_params->valid_devs[0], &cap_idx);
8160         if (capability == NULL)
8161                 return TEST_SKIPPED;
8162         if (rte_cryptodev_sym_capability_check_aead(
8163                         capability, tdata->key.len, tdata->auth_tag.len,
8164                         tdata->aad.len, tdata->iv.len))
8165                 return TEST_SKIPPED;
8166
8167         /* Create AEAD session */
8168         retval = create_aead_session(ts_params->valid_devs[0],
8169                         tdata->algo,
8170                         RTE_CRYPTO_AEAD_OP_ENCRYPT,
8171                         tdata->key.data, tdata->key.len,
8172                         tdata->aad.len, tdata->auth_tag.len,
8173                         tdata->iv.len);
8174         if (retval < 0)
8175                 return retval;
8176
8177         if (tdata->aad.len > MBUF_SIZE) {
8178                 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->large_mbuf_pool);
8179                 /* Populate full size of add data */
8180                 for (i = 32; i < MAX_AAD_LENGTH; i += 32)
8181                         memcpy(&tdata->aad.data[i], &tdata->aad.data[0], 32);
8182         } else
8183                 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
8184
8185         /* clear mbuf payload */
8186         memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
8187                         rte_pktmbuf_tailroom(ut_params->ibuf));
8188
8189         /* Create AEAD operation */
8190         retval = create_aead_operation(RTE_CRYPTO_AEAD_OP_ENCRYPT, tdata);
8191         if (retval < 0)
8192                 return retval;
8193
8194         rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
8195
8196         ut_params->op->sym->m_src = ut_params->ibuf;
8197
8198         /* Process crypto operation */
8199         if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
8200                 process_cpu_aead_op(ts_params->valid_devs[0], ut_params->op);
8201         else if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
8202                 process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
8203                                 ut_params->op, 0, 0, 0, 0);
8204         else
8205                 TEST_ASSERT_NOT_NULL(
8206                         process_crypto_request(ts_params->valid_devs[0],
8207                         ut_params->op), "failed to process sym crypto op");
8208
8209         TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
8210                         "crypto op processing failed");
8211
8212         plaintext_pad_len = RTE_ALIGN_CEIL(tdata->plaintext.len, 16);
8213
8214         if (ut_params->op->sym->m_dst) {
8215                 ciphertext = rte_pktmbuf_mtod(ut_params->op->sym->m_dst,
8216                                 uint8_t *);
8217                 auth_tag = rte_pktmbuf_mtod_offset(ut_params->op->sym->m_dst,
8218                                 uint8_t *, plaintext_pad_len);
8219         } else {
8220                 ciphertext = rte_pktmbuf_mtod_offset(ut_params->op->sym->m_src,
8221                                 uint8_t *,
8222                                 ut_params->op->sym->cipher.data.offset);
8223                 auth_tag = ciphertext + plaintext_pad_len;
8224         }
8225
8226         debug_hexdump(stdout, "ciphertext:", ciphertext, tdata->ciphertext.len);
8227         debug_hexdump(stdout, "auth tag:", auth_tag, tdata->auth_tag.len);
8228
8229         /* Validate obuf */
8230         TEST_ASSERT_BUFFERS_ARE_EQUAL(
8231                         ciphertext,
8232                         tdata->ciphertext.data,
8233                         tdata->ciphertext.len,
8234                         "Ciphertext data not as expected");
8235
8236         TEST_ASSERT_BUFFERS_ARE_EQUAL(
8237                         auth_tag,
8238                         tdata->auth_tag.data,
8239                         tdata->auth_tag.len,
8240                         "Generated auth tag not as expected");
8241
8242         return 0;
8243
8244 }
8245
8246 #ifdef RTE_LIB_SECURITY
8247 static int
8248 security_proto_supported(enum rte_security_session_action_type action,
8249         enum rte_security_session_protocol proto)
8250 {
8251         struct crypto_testsuite_params *ts_params = &testsuite_params;
8252
8253         const struct rte_security_capability *capabilities;
8254         const struct rte_security_capability *capability;
8255         uint16_t i = 0;
8256
8257         struct rte_security_ctx *ctx = (struct rte_security_ctx *)
8258                                 rte_cryptodev_get_sec_ctx(
8259                                 ts_params->valid_devs[0]);
8260
8261
8262         capabilities = rte_security_capabilities_get(ctx);
8263
8264         if (capabilities == NULL)
8265                 return -ENOTSUP;
8266
8267         while ((capability = &capabilities[i++])->action !=
8268                         RTE_SECURITY_ACTION_TYPE_NONE) {
8269                 if (capability->action == action &&
8270                                 capability->protocol == proto)
8271                         return 0;
8272         }
8273
8274         return -ENOTSUP;
8275 }
8276
8277 /* Basic algorithm run function for async inplace mode.
8278  * Creates a session from input parameters and runs one operation
8279  * on input_vec. Checks the output of the crypto operation against
8280  * output_vec.
8281  */
8282 static int test_pdcp_proto(int i, int oop, enum rte_crypto_cipher_operation opc,
8283                            enum rte_crypto_auth_operation opa,
8284                            const uint8_t *input_vec, unsigned int input_vec_len,
8285                            const uint8_t *output_vec,
8286                            unsigned int output_vec_len,
8287                            enum rte_crypto_cipher_algorithm cipher_alg,
8288                            const uint8_t *cipher_key, uint32_t cipher_key_len,
8289                            enum rte_crypto_auth_algorithm auth_alg,
8290                            const uint8_t *auth_key, uint32_t auth_key_len,
8291                            uint8_t bearer, enum rte_security_pdcp_domain domain,
8292                            uint8_t packet_direction, uint8_t sn_size,
8293                            uint32_t hfn, uint32_t hfn_threshold, uint8_t sdap)
8294 {
8295         struct crypto_testsuite_params *ts_params = &testsuite_params;
8296         struct crypto_unittest_params *ut_params = &unittest_params;
8297         uint8_t *plaintext;
8298         int ret = TEST_SUCCESS;
8299         struct rte_security_ctx *ctx = (struct rte_security_ctx *)
8300                                 rte_cryptodev_get_sec_ctx(
8301                                 ts_params->valid_devs[0]);
8302
8303         /* Verify the capabilities */
8304         struct rte_security_capability_idx sec_cap_idx;
8305
8306         sec_cap_idx.action = ut_params->type;
8307         sec_cap_idx.protocol = RTE_SECURITY_PROTOCOL_PDCP;
8308         sec_cap_idx.pdcp.domain = domain;
8309         if (rte_security_capability_get(ctx, &sec_cap_idx) == NULL)
8310                 return TEST_SKIPPED;
8311
8312         /* Generate test mbuf data */
8313         ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
8314
8315         /* clear mbuf payload */
8316         memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
8317                         rte_pktmbuf_tailroom(ut_params->ibuf));
8318
8319         plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
8320                                                   input_vec_len);
8321         memcpy(plaintext, input_vec, input_vec_len);
8322
8323         /* Out of place support */
8324         if (oop) {
8325                 /*
8326                  * For out-op-place we need to alloc another mbuf
8327                  */
8328                 ut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
8329                 rte_pktmbuf_append(ut_params->obuf, output_vec_len);
8330         }
8331
8332         /* Setup Cipher Parameters */
8333         ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
8334         ut_params->cipher_xform.cipher.algo = cipher_alg;
8335         ut_params->cipher_xform.cipher.op = opc;
8336         ut_params->cipher_xform.cipher.key.data = cipher_key;
8337         ut_params->cipher_xform.cipher.key.length = cipher_key_len;
8338         ut_params->cipher_xform.cipher.iv.length =
8339                                 packet_direction ? 4 : 0;
8340         ut_params->cipher_xform.cipher.iv.offset = IV_OFFSET;
8341
8342         /* Setup HMAC Parameters if ICV header is required */
8343         if (auth_alg != 0) {
8344                 ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;
8345                 ut_params->auth_xform.next = NULL;
8346                 ut_params->auth_xform.auth.algo = auth_alg;
8347                 ut_params->auth_xform.auth.op = opa;
8348                 ut_params->auth_xform.auth.key.data = auth_key;
8349                 ut_params->auth_xform.auth.key.length = auth_key_len;
8350
8351                 ut_params->cipher_xform.next = &ut_params->auth_xform;
8352         } else {
8353                 ut_params->cipher_xform.next = NULL;
8354         }
8355
8356         struct rte_security_session_conf sess_conf = {
8357                 .action_type = ut_params->type,
8358                 .protocol = RTE_SECURITY_PROTOCOL_PDCP,
8359                 {.pdcp = {
8360                         .bearer = bearer,
8361                         .domain = domain,
8362                         .pkt_dir = packet_direction,
8363                         .sn_size = sn_size,
8364                         .hfn = packet_direction ? 0 : hfn,
8365                         /**
8366                          * hfn can be set as pdcp_test_hfn[i]
8367                          * if hfn_ovrd is not set. Here, PDCP
8368                          * packet direction is just used to
8369                          * run half of the cases with session
8370                          * HFN and other half with per packet
8371                          * HFN.
8372                          */
8373                         .hfn_threshold = hfn_threshold,
8374                         .hfn_ovrd = packet_direction ? 1 : 0,
8375                         .sdap_enabled = sdap,
8376                 } },
8377                 .crypto_xform = &ut_params->cipher_xform
8378         };
8379
8380         /* Create security session */
8381         ut_params->sec_session = rte_security_session_create(ctx,
8382                                 &sess_conf, ts_params->session_mpool,
8383                                 ts_params->session_priv_mpool);
8384
8385         if (!ut_params->sec_session) {
8386                 printf("TestCase %s()-%d line %d failed %s: ",
8387                         __func__, i, __LINE__, "Failed to allocate session");
8388                 ret = TEST_FAILED;
8389                 goto on_err;
8390         }
8391
8392         /* Generate crypto op data structure */
8393         ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
8394                         RTE_CRYPTO_OP_TYPE_SYMMETRIC);
8395         if (!ut_params->op) {
8396                 printf("TestCase %s()-%d line %d failed %s: ",
8397                         __func__, i, __LINE__,
8398                         "Failed to allocate symmetric crypto operation struct");
8399                 ret = TEST_FAILED;
8400                 goto on_err;
8401         }
8402
8403         uint32_t *per_pkt_hfn = rte_crypto_op_ctod_offset(ut_params->op,
8404                                         uint32_t *, IV_OFFSET);
8405         *per_pkt_hfn = packet_direction ? hfn : 0;
8406
8407         rte_security_attach_session(ut_params->op, ut_params->sec_session);
8408
8409         /* set crypto operation source mbuf */
8410         ut_params->op->sym->m_src = ut_params->ibuf;
8411         if (oop)
8412                 ut_params->op->sym->m_dst = ut_params->obuf;
8413
8414         /* Process crypto operation */
8415         if (process_crypto_request(ts_params->valid_devs[0], ut_params->op)
8416                 == NULL) {
8417                 printf("TestCase %s()-%d line %d failed %s: ",
8418                         __func__, i, __LINE__,
8419                         "failed to process sym crypto op");
8420                 ret = TEST_FAILED;
8421                 goto on_err;
8422         }
8423
8424         if (ut_params->op->status != RTE_CRYPTO_OP_STATUS_SUCCESS) {
8425                 printf("TestCase %s()-%d line %d failed %s: ",
8426                         __func__, i, __LINE__, "crypto op processing failed");
8427                 ret = TEST_FAILED;
8428                 goto on_err;
8429         }
8430
8431         /* Validate obuf */
8432         uint8_t *ciphertext = rte_pktmbuf_mtod(ut_params->op->sym->m_src,
8433                         uint8_t *);
8434         if (oop) {
8435                 ciphertext = rte_pktmbuf_mtod(ut_params->op->sym->m_dst,
8436                                 uint8_t *);
8437         }
8438
8439         if (memcmp(ciphertext, output_vec, output_vec_len)) {
8440                 printf("\n=======PDCP TestCase #%d failed: Data Mismatch ", i);
8441                 rte_hexdump(stdout, "encrypted", ciphertext, output_vec_len);
8442                 rte_hexdump(stdout, "reference", output_vec, output_vec_len);
8443                 ret = TEST_FAILED;
8444                 goto on_err;
8445         }
8446
8447 on_err:
8448         rte_crypto_op_free(ut_params->op);
8449         ut_params->op = NULL;
8450
8451         if (ut_params->sec_session)
8452                 rte_security_session_destroy(ctx, ut_params->sec_session);
8453         ut_params->sec_session = NULL;
8454
8455         rte_pktmbuf_free(ut_params->ibuf);
8456         ut_params->ibuf = NULL;
8457         if (oop) {
8458                 rte_pktmbuf_free(ut_params->obuf);
8459                 ut_params->obuf = NULL;
8460         }
8461
8462         return ret;
8463 }
8464
8465 static int
8466 test_pdcp_proto_SGL(int i, int oop,
8467         enum rte_crypto_cipher_operation opc,
8468         enum rte_crypto_auth_operation opa,
8469         uint8_t *input_vec,
8470         unsigned int input_vec_len,
8471         uint8_t *output_vec,
8472         unsigned int output_vec_len,
8473         uint32_t fragsz,
8474         uint32_t fragsz_oop)
8475 {
8476         struct crypto_testsuite_params *ts_params = &testsuite_params;
8477         struct crypto_unittest_params *ut_params = &unittest_params;
8478         uint8_t *plaintext;
8479         struct rte_mbuf *buf, *buf_oop = NULL;
8480         int ret = TEST_SUCCESS;
8481         int to_trn = 0;
8482         int to_trn_tbl[16];
8483         int segs = 1;
8484         unsigned int trn_data = 0;
8485         struct rte_cryptodev_info dev_info;
8486         uint64_t feat_flags;
8487         struct rte_security_ctx *ctx = (struct rte_security_ctx *)
8488                                 rte_cryptodev_get_sec_ctx(
8489                                 ts_params->valid_devs[0]);
8490         struct rte_mbuf *temp_mbuf;
8491
8492         rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
8493         feat_flags = dev_info.feature_flags;
8494
8495         if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
8496                         (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
8497                 printf("Device does not support RAW data-path APIs.\n");
8498                 return -ENOTSUP;
8499         }
8500         /* Verify the capabilities */
8501         struct rte_security_capability_idx sec_cap_idx;
8502
8503         sec_cap_idx.action = ut_params->type;
8504         sec_cap_idx.protocol = RTE_SECURITY_PROTOCOL_PDCP;
8505         sec_cap_idx.pdcp.domain = pdcp_test_params[i].domain;
8506         if (rte_security_capability_get(ctx, &sec_cap_idx) == NULL)
8507                 return TEST_SKIPPED;
8508
8509         if (fragsz > input_vec_len)
8510                 fragsz = input_vec_len;
8511
8512         uint16_t plaintext_len = fragsz;
8513         uint16_t frag_size_oop = fragsz_oop ? fragsz_oop : fragsz;
8514
8515         if (fragsz_oop > output_vec_len)
8516                 frag_size_oop = output_vec_len;
8517
8518         int ecx = 0;
8519         if (input_vec_len % fragsz != 0) {
8520                 if (input_vec_len / fragsz + 1 > 16)
8521                         return 1;
8522         } else if (input_vec_len / fragsz > 16)
8523                 return 1;
8524
8525         /* Out of place support */
8526         if (oop) {
8527                 /*
8528                  * For out-op-place we need to alloc another mbuf
8529                  */
8530                 ut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
8531                 rte_pktmbuf_append(ut_params->obuf, frag_size_oop);
8532                 buf_oop = ut_params->obuf;
8533         }
8534
8535         /* Generate test mbuf data */
8536         ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
8537
8538         /* clear mbuf payload */
8539         memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
8540                         rte_pktmbuf_tailroom(ut_params->ibuf));
8541
8542         plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
8543                                                   plaintext_len);
8544         memcpy(plaintext, input_vec, plaintext_len);
8545         trn_data += plaintext_len;
8546
8547         buf = ut_params->ibuf;
8548
8549         /*
8550          * Loop until no more fragments
8551          */
8552
8553         while (trn_data < input_vec_len) {
8554                 ++segs;
8555                 to_trn = (input_vec_len - trn_data < fragsz) ?
8556                                 (input_vec_len - trn_data) : fragsz;
8557
8558                 to_trn_tbl[ecx++] = to_trn;
8559
8560                 buf->next = rte_pktmbuf_alloc(ts_params->mbuf_pool);
8561                 buf = buf->next;
8562
8563                 memset(rte_pktmbuf_mtod(buf, uint8_t *), 0,
8564                                 rte_pktmbuf_tailroom(buf));
8565
8566                 /* OOP */
8567                 if (oop && !fragsz_oop) {
8568                         buf_oop->next =
8569                                         rte_pktmbuf_alloc(ts_params->mbuf_pool);
8570                         buf_oop = buf_oop->next;
8571                         memset(rte_pktmbuf_mtod(buf_oop, uint8_t *),
8572                                         0, rte_pktmbuf_tailroom(buf_oop));
8573                         rte_pktmbuf_append(buf_oop, to_trn);
8574                 }
8575
8576                 plaintext = (uint8_t *)rte_pktmbuf_append(buf,
8577                                 to_trn);
8578
8579                 memcpy(plaintext, input_vec + trn_data, to_trn);
8580                 trn_data += to_trn;
8581         }
8582
8583         ut_params->ibuf->nb_segs = segs;
8584
8585         segs = 1;
8586         if (fragsz_oop && oop) {
8587                 to_trn = 0;
8588                 ecx = 0;
8589
8590                 trn_data = frag_size_oop;
8591                 while (trn_data < output_vec_len) {
8592                         ++segs;
8593                         to_trn =
8594                                 (output_vec_len - trn_data <
8595                                                 frag_size_oop) ?
8596                                 (output_vec_len - trn_data) :
8597                                                 frag_size_oop;
8598
8599                         to_trn_tbl[ecx++] = to_trn;
8600
8601                         buf_oop->next =
8602                                 rte_pktmbuf_alloc(ts_params->mbuf_pool);
8603                         buf_oop = buf_oop->next;
8604                         memset(rte_pktmbuf_mtod(buf_oop, uint8_t *),
8605                                         0, rte_pktmbuf_tailroom(buf_oop));
8606                         rte_pktmbuf_append(buf_oop, to_trn);
8607
8608                         trn_data += to_trn;
8609                 }
8610                 ut_params->obuf->nb_segs = segs;
8611         }
8612
8613         /* Setup Cipher Parameters */
8614         ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
8615         ut_params->cipher_xform.cipher.algo = pdcp_test_params[i].cipher_alg;
8616         ut_params->cipher_xform.cipher.op = opc;
8617         ut_params->cipher_xform.cipher.key.data = pdcp_test_crypto_key[i];
8618         ut_params->cipher_xform.cipher.key.length =
8619                                         pdcp_test_params[i].cipher_key_len;
8620         ut_params->cipher_xform.cipher.iv.length = 0;
8621
8622         /* Setup HMAC Parameters if ICV header is required */
8623         if (pdcp_test_params[i].auth_alg != 0) {
8624                 ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;
8625                 ut_params->auth_xform.next = NULL;
8626                 ut_params->auth_xform.auth.algo = pdcp_test_params[i].auth_alg;
8627                 ut_params->auth_xform.auth.op = opa;
8628                 ut_params->auth_xform.auth.key.data = pdcp_test_auth_key[i];
8629                 ut_params->auth_xform.auth.key.length =
8630                                         pdcp_test_params[i].auth_key_len;
8631
8632                 ut_params->cipher_xform.next = &ut_params->auth_xform;
8633         } else {
8634                 ut_params->cipher_xform.next = NULL;
8635         }
8636
8637         struct rte_security_session_conf sess_conf = {
8638                 .action_type = ut_params->type,
8639                 .protocol = RTE_SECURITY_PROTOCOL_PDCP,
8640                 {.pdcp = {
8641                         .bearer = pdcp_test_bearer[i],
8642                         .domain = pdcp_test_params[i].domain,
8643                         .pkt_dir = pdcp_test_packet_direction[i],
8644                         .sn_size = pdcp_test_data_sn_size[i],
8645                         .hfn = pdcp_test_hfn[i],
8646                         .hfn_threshold = pdcp_test_hfn_threshold[i],
8647                         .hfn_ovrd = 0,
8648                 } },
8649                 .crypto_xform = &ut_params->cipher_xform
8650         };
8651
8652         /* Create security session */
8653         ut_params->sec_session = rte_security_session_create(ctx,
8654                                 &sess_conf, ts_params->session_mpool,
8655                                 ts_params->session_priv_mpool);
8656
8657         if (!ut_params->sec_session) {
8658                 printf("TestCase %s()-%d line %d failed %s: ",
8659                         __func__, i, __LINE__, "Failed to allocate session");
8660                 ret = TEST_FAILED;
8661                 goto on_err;
8662         }
8663
8664         /* Generate crypto op data structure */
8665         ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
8666                         RTE_CRYPTO_OP_TYPE_SYMMETRIC);
8667         if (!ut_params->op) {
8668                 printf("TestCase %s()-%d line %d failed %s: ",
8669                         __func__, i, __LINE__,
8670                         "Failed to allocate symmetric crypto operation struct");
8671                 ret = TEST_FAILED;
8672                 goto on_err;
8673         }
8674
8675         rte_security_attach_session(ut_params->op, ut_params->sec_session);
8676
8677         /* set crypto operation source mbuf */
8678         ut_params->op->sym->m_src = ut_params->ibuf;
8679         if (oop)
8680                 ut_params->op->sym->m_dst = ut_params->obuf;
8681
8682         /* Process crypto operation */
8683         temp_mbuf = ut_params->op->sym->m_src;
8684         if (global_api_test_type == CRYPTODEV_RAW_API_TEST) {
8685                 /* filling lengths */
8686                 while (temp_mbuf) {
8687                         ut_params->op->sym->cipher.data.length
8688                                 += temp_mbuf->pkt_len;
8689                         ut_params->op->sym->auth.data.length
8690                                 += temp_mbuf->pkt_len;
8691                         temp_mbuf = temp_mbuf->next;
8692                 }
8693                 process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
8694                         ut_params->op, 1, 1, 0, 0);
8695         } else {
8696                 ut_params->op = process_crypto_request(ts_params->valid_devs[0],
8697                                                         ut_params->op);
8698         }
8699         if (ut_params->op == NULL) {
8700                 printf("TestCase %s()-%d line %d failed %s: ",
8701                         __func__, i, __LINE__,
8702                         "failed to process sym crypto op");
8703                 ret = TEST_FAILED;
8704                 goto on_err;
8705         }
8706
8707         if (ut_params->op->status != RTE_CRYPTO_OP_STATUS_SUCCESS) {
8708                 printf("TestCase %s()-%d line %d failed %s: ",
8709                         __func__, i, __LINE__, "crypto op processing failed");
8710                 ret = TEST_FAILED;
8711                 goto on_err;
8712         }
8713
8714         /* Validate obuf */
8715         uint8_t *ciphertext = rte_pktmbuf_mtod(ut_params->op->sym->m_src,
8716                         uint8_t *);
8717         if (oop) {
8718                 ciphertext = rte_pktmbuf_mtod(ut_params->op->sym->m_dst,
8719                                 uint8_t *);
8720         }
8721         if (fragsz_oop)
8722                 fragsz = frag_size_oop;
8723         if (memcmp(ciphertext, output_vec, fragsz)) {
8724                 printf("\n=======PDCP TestCase #%d failed: Data Mismatch ", i);
8725                 rte_hexdump(stdout, "encrypted", ciphertext, fragsz);
8726                 rte_hexdump(stdout, "reference", output_vec, fragsz);
8727                 ret = TEST_FAILED;
8728                 goto on_err;
8729         }
8730
8731         buf = ut_params->op->sym->m_src->next;
8732         if (oop)
8733                 buf = ut_params->op->sym->m_dst->next;
8734
8735         unsigned int off = fragsz;
8736
8737         ecx = 0;
8738         while (buf) {
8739                 ciphertext = rte_pktmbuf_mtod(buf,
8740                                 uint8_t *);
8741                 if (memcmp(ciphertext, output_vec + off, to_trn_tbl[ecx])) {
8742                         printf("\n=======PDCP TestCase #%d failed: Data Mismatch ", i);
8743                         rte_hexdump(stdout, "encrypted", ciphertext, to_trn_tbl[ecx]);
8744                         rte_hexdump(stdout, "reference", output_vec + off,
8745                                         to_trn_tbl[ecx]);
8746                         ret = TEST_FAILED;
8747                         goto on_err;
8748                 }
8749                 off += to_trn_tbl[ecx++];
8750                 buf = buf->next;
8751         }
8752 on_err:
8753         rte_crypto_op_free(ut_params->op);
8754         ut_params->op = NULL;
8755
8756         if (ut_params->sec_session)
8757                 rte_security_session_destroy(ctx, ut_params->sec_session);
8758         ut_params->sec_session = NULL;
8759
8760         rte_pktmbuf_free(ut_params->ibuf);
8761         ut_params->ibuf = NULL;
8762         if (oop) {
8763                 rte_pktmbuf_free(ut_params->obuf);
8764                 ut_params->obuf = NULL;
8765         }
8766
8767         return ret;
8768 }
8769
8770 int
8771 test_pdcp_proto_cplane_encap(int i)
8772 {
8773         return test_pdcp_proto(
8774                 i, 0, RTE_CRYPTO_CIPHER_OP_ENCRYPT, RTE_CRYPTO_AUTH_OP_GENERATE,
8775                 pdcp_test_data_in[i], pdcp_test_data_in_len[i],
8776                 pdcp_test_data_out[i], pdcp_test_data_in_len[i] + 4,
8777                 pdcp_test_params[i].cipher_alg, pdcp_test_crypto_key[i],
8778                 pdcp_test_params[i].cipher_key_len,
8779                 pdcp_test_params[i].auth_alg, pdcp_test_auth_key[i],
8780                 pdcp_test_params[i].auth_key_len, pdcp_test_bearer[i],
8781                 pdcp_test_params[i].domain, pdcp_test_packet_direction[i],
8782                 pdcp_test_data_sn_size[i], pdcp_test_hfn[i],
8783                 pdcp_test_hfn_threshold[i], SDAP_DISABLED);
8784 }
8785
8786 int
8787 test_pdcp_proto_uplane_encap(int i)
8788 {
8789         return test_pdcp_proto(
8790                 i, 0, RTE_CRYPTO_CIPHER_OP_ENCRYPT, RTE_CRYPTO_AUTH_OP_GENERATE,
8791                 pdcp_test_data_in[i], pdcp_test_data_in_len[i],
8792                 pdcp_test_data_out[i], pdcp_test_data_in_len[i],
8793                 pdcp_test_params[i].cipher_alg, pdcp_test_crypto_key[i],
8794                 pdcp_test_params[i].cipher_key_len,
8795                 pdcp_test_params[i].auth_alg, pdcp_test_auth_key[i],
8796                 pdcp_test_params[i].auth_key_len, pdcp_test_bearer[i],
8797                 pdcp_test_params[i].domain, pdcp_test_packet_direction[i],
8798                 pdcp_test_data_sn_size[i], pdcp_test_hfn[i],
8799                 pdcp_test_hfn_threshold[i], SDAP_DISABLED);
8800 }
8801
8802 int
8803 test_pdcp_proto_uplane_encap_with_int(int i)
8804 {
8805         return test_pdcp_proto(
8806                 i, 0, RTE_CRYPTO_CIPHER_OP_ENCRYPT, RTE_CRYPTO_AUTH_OP_GENERATE,
8807                 pdcp_test_data_in[i], pdcp_test_data_in_len[i],
8808                 pdcp_test_data_out[i], pdcp_test_data_in_len[i] + 4,
8809                 pdcp_test_params[i].cipher_alg, pdcp_test_crypto_key[i],
8810                 pdcp_test_params[i].cipher_key_len,
8811                 pdcp_test_params[i].auth_alg, pdcp_test_auth_key[i],
8812                 pdcp_test_params[i].auth_key_len, pdcp_test_bearer[i],
8813                 pdcp_test_params[i].domain, pdcp_test_packet_direction[i],
8814                 pdcp_test_data_sn_size[i], pdcp_test_hfn[i],
8815                 pdcp_test_hfn_threshold[i], SDAP_DISABLED);
8816 }
8817
8818 int
8819 test_pdcp_proto_cplane_decap(int i)
8820 {
8821         return test_pdcp_proto(
8822                 i, 0, RTE_CRYPTO_CIPHER_OP_DECRYPT, RTE_CRYPTO_AUTH_OP_VERIFY,
8823                 pdcp_test_data_out[i], pdcp_test_data_in_len[i] + 4,
8824                 pdcp_test_data_in[i], pdcp_test_data_in_len[i],
8825                 pdcp_test_params[i].cipher_alg, pdcp_test_crypto_key[i],
8826                 pdcp_test_params[i].cipher_key_len,
8827                 pdcp_test_params[i].auth_alg, pdcp_test_auth_key[i],
8828                 pdcp_test_params[i].auth_key_len, pdcp_test_bearer[i],
8829                 pdcp_test_params[i].domain, pdcp_test_packet_direction[i],
8830                 pdcp_test_data_sn_size[i], pdcp_test_hfn[i],
8831                 pdcp_test_hfn_threshold[i], SDAP_DISABLED);
8832 }
8833
8834 int
8835 test_pdcp_proto_uplane_decap(int i)
8836 {
8837         return test_pdcp_proto(
8838                 i, 0, RTE_CRYPTO_CIPHER_OP_DECRYPT, RTE_CRYPTO_AUTH_OP_VERIFY,
8839                 pdcp_test_data_out[i], pdcp_test_data_in_len[i],
8840                 pdcp_test_data_in[i], pdcp_test_data_in_len[i],
8841                 pdcp_test_params[i].cipher_alg, pdcp_test_crypto_key[i],
8842                 pdcp_test_params[i].cipher_key_len,
8843                 pdcp_test_params[i].auth_alg, pdcp_test_auth_key[i],
8844                 pdcp_test_params[i].auth_key_len, pdcp_test_bearer[i],
8845                 pdcp_test_params[i].domain, pdcp_test_packet_direction[i],
8846                 pdcp_test_data_sn_size[i], pdcp_test_hfn[i],
8847                 pdcp_test_hfn_threshold[i], SDAP_DISABLED);
8848 }
8849
8850 int
8851 test_pdcp_proto_uplane_decap_with_int(int i)
8852 {
8853         return test_pdcp_proto(
8854                 i, 0, RTE_CRYPTO_CIPHER_OP_DECRYPT, RTE_CRYPTO_AUTH_OP_VERIFY,
8855                 pdcp_test_data_out[i], pdcp_test_data_in_len[i] + 4,
8856                 pdcp_test_data_in[i], pdcp_test_data_in_len[i],
8857                 pdcp_test_params[i].cipher_alg, pdcp_test_crypto_key[i],
8858                 pdcp_test_params[i].cipher_key_len,
8859                 pdcp_test_params[i].auth_alg, pdcp_test_auth_key[i],
8860                 pdcp_test_params[i].auth_key_len, pdcp_test_bearer[i],
8861                 pdcp_test_params[i].domain, pdcp_test_packet_direction[i],
8862                 pdcp_test_data_sn_size[i], pdcp_test_hfn[i],
8863                 pdcp_test_hfn_threshold[i], SDAP_DISABLED);
8864 }
8865
8866 static int
8867 test_PDCP_PROTO_SGL_in_place_32B(void)
8868 {
8869         /* i can be used for running any PDCP case
8870          * In this case it is uplane 12-bit AES-SNOW DL encap
8871          */
8872         int i = PDCP_UPLANE_12BIT_OFFSET + AES_ENC + SNOW_AUTH + DOWNLINK;
8873         return test_pdcp_proto_SGL(i, IN_PLACE,
8874                         RTE_CRYPTO_CIPHER_OP_ENCRYPT,
8875                         RTE_CRYPTO_AUTH_OP_GENERATE,
8876                         pdcp_test_data_in[i],
8877                         pdcp_test_data_in_len[i],
8878                         pdcp_test_data_out[i],
8879                         pdcp_test_data_in_len[i]+4,
8880                         32, 0);
8881 }
8882 static int
8883 test_PDCP_PROTO_SGL_oop_32B_128B(void)
8884 {
8885         /* i can be used for running any PDCP case
8886          * In this case it is uplane 18-bit NULL-NULL DL encap
8887          */
8888         int i = PDCP_UPLANE_18BIT_OFFSET + NULL_ENC + NULL_AUTH + DOWNLINK;
8889         return test_pdcp_proto_SGL(i, OUT_OF_PLACE,
8890                         RTE_CRYPTO_CIPHER_OP_ENCRYPT,
8891                         RTE_CRYPTO_AUTH_OP_GENERATE,
8892                         pdcp_test_data_in[i],
8893                         pdcp_test_data_in_len[i],
8894                         pdcp_test_data_out[i],
8895                         pdcp_test_data_in_len[i]+4,
8896                         32, 128);
8897 }
8898 static int
8899 test_PDCP_PROTO_SGL_oop_32B_40B(void)
8900 {
8901         /* i can be used for running any PDCP case
8902          * In this case it is uplane 18-bit AES DL encap
8903          */
8904         int i = PDCP_UPLANE_OFFSET + AES_ENC + EIGHTEEN_BIT_SEQ_NUM_OFFSET
8905                         + DOWNLINK;
8906         return test_pdcp_proto_SGL(i, OUT_OF_PLACE,
8907                         RTE_CRYPTO_CIPHER_OP_ENCRYPT,
8908                         RTE_CRYPTO_AUTH_OP_GENERATE,
8909                         pdcp_test_data_in[i],
8910                         pdcp_test_data_in_len[i],
8911                         pdcp_test_data_out[i],
8912                         pdcp_test_data_in_len[i],
8913                         32, 40);
8914 }
8915 static int
8916 test_PDCP_PROTO_SGL_oop_128B_32B(void)
8917 {
8918         /* i can be used for running any PDCP case
8919          * In this case it is cplane 12-bit AES-ZUC DL encap
8920          */
8921         int i = PDCP_CPLANE_LONG_SN_OFFSET + AES_ENC + ZUC_AUTH + DOWNLINK;
8922         return test_pdcp_proto_SGL(i, OUT_OF_PLACE,
8923                         RTE_CRYPTO_CIPHER_OP_ENCRYPT,
8924                         RTE_CRYPTO_AUTH_OP_GENERATE,
8925                         pdcp_test_data_in[i],
8926                         pdcp_test_data_in_len[i],
8927                         pdcp_test_data_out[i],
8928                         pdcp_test_data_in_len[i]+4,
8929                         128, 32);
8930 }
8931
8932 static int
8933 test_PDCP_SDAP_PROTO_encap_all(void)
8934 {
8935         int i = 0, size = 0;
8936         int err, all_err = TEST_SUCCESS;
8937         const struct pdcp_sdap_test *cur_test;
8938
8939         size = RTE_DIM(list_pdcp_sdap_tests);
8940
8941         for (i = 0; i < size; i++) {
8942                 cur_test = &list_pdcp_sdap_tests[i];
8943                 err = test_pdcp_proto(
8944                         i, 0, RTE_CRYPTO_CIPHER_OP_ENCRYPT,
8945                         RTE_CRYPTO_AUTH_OP_GENERATE, cur_test->data_in,
8946                         cur_test->in_len, cur_test->data_out,
8947                         cur_test->in_len + ((cur_test->auth_key) ? 4 : 0),
8948                         cur_test->param.cipher_alg, cur_test->cipher_key,
8949                         cur_test->param.cipher_key_len,
8950                         cur_test->param.auth_alg,
8951                         cur_test->auth_key, cur_test->param.auth_key_len,
8952                         cur_test->bearer, cur_test->param.domain,
8953                         cur_test->packet_direction, cur_test->sn_size,
8954                         cur_test->hfn,
8955                         cur_test->hfn_threshold, SDAP_ENABLED);
8956                 if (err) {
8957                         printf("\t%d) %s: Encapsulation failed\n",
8958                                         cur_test->test_idx,
8959                                         cur_test->param.name);
8960                         err = TEST_FAILED;
8961                 } else {
8962                         printf("\t%d) %s: Encap PASS\n", cur_test->test_idx,
8963                                         cur_test->param.name);
8964                         err = TEST_SUCCESS;
8965                 }
8966                 all_err += err;
8967         }
8968
8969         printf("Success: %d, Failure: %d\n", size + all_err, -all_err);
8970
8971         return (all_err == TEST_SUCCESS) ? TEST_SUCCESS : TEST_FAILED;
8972 }
8973
8974 static int
8975 test_PDCP_PROTO_short_mac(void)
8976 {
8977         int i = 0, size = 0;
8978         int err, all_err = TEST_SUCCESS;
8979         const struct pdcp_short_mac_test *cur_test;
8980
8981         size = RTE_DIM(list_pdcp_smac_tests);
8982
8983         for (i = 0; i < size; i++) {
8984                 cur_test = &list_pdcp_smac_tests[i];
8985                 err = test_pdcp_proto(
8986                         i, 0, RTE_CRYPTO_CIPHER_OP_ENCRYPT,
8987                         RTE_CRYPTO_AUTH_OP_GENERATE, cur_test->data_in,
8988                         cur_test->in_len, cur_test->data_out,
8989                         cur_test->in_len + ((cur_test->auth_key) ? 4 : 0),
8990                         RTE_CRYPTO_CIPHER_NULL, NULL,
8991                         0, cur_test->param.auth_alg,
8992                         cur_test->auth_key, cur_test->param.auth_key_len,
8993                         0, cur_test->param.domain, 0, 0,
8994                         0, 0, 0);
8995                 if (err) {
8996                         printf("\t%d) %s: Short MAC test failed\n",
8997                                         cur_test->test_idx,
8998                                         cur_test->param.name);
8999                         err = TEST_FAILED;
9000                 } else {
9001                         printf("\t%d) %s: Short MAC test PASS\n",
9002                                         cur_test->test_idx,
9003                                         cur_test->param.name);
9004                         rte_hexdump(stdout, "MAC I",
9005                                     cur_test->data_out + cur_test->in_len + 2,
9006                                     2);
9007                         err = TEST_SUCCESS;
9008                 }
9009                 all_err += err;
9010         }
9011
9012         printf("Success: %d, Failure: %d\n", size + all_err, -all_err);
9013
9014         return (all_err == TEST_SUCCESS) ? TEST_SUCCESS : TEST_FAILED;
9015
9016 }
9017
9018 static int
9019 test_PDCP_SDAP_PROTO_decap_all(void)
9020 {
9021         int i = 0, size = 0;
9022         int err, all_err = TEST_SUCCESS;
9023         const struct pdcp_sdap_test *cur_test;
9024
9025         size = RTE_DIM(list_pdcp_sdap_tests);
9026
9027         for (i = 0; i < size; i++) {
9028                 cur_test = &list_pdcp_sdap_tests[i];
9029                 err = test_pdcp_proto(
9030                         i, 0, RTE_CRYPTO_CIPHER_OP_DECRYPT,
9031                         RTE_CRYPTO_AUTH_OP_VERIFY,
9032                         cur_test->data_out,
9033                         cur_test->in_len + ((cur_test->auth_key) ? 4 : 0),
9034                         cur_test->data_in, cur_test->in_len,
9035                         cur_test->param.cipher_alg,
9036                         cur_test->cipher_key, cur_test->param.cipher_key_len,
9037                         cur_test->param.auth_alg, cur_test->auth_key,
9038                         cur_test->param.auth_key_len, cur_test->bearer,
9039                         cur_test->param.domain, cur_test->packet_direction,
9040                         cur_test->sn_size, cur_test->hfn,
9041                         cur_test->hfn_threshold, SDAP_ENABLED);
9042                 if (err) {
9043                         printf("\t%d) %s: Decapsulation failed\n",
9044                                         cur_test->test_idx,
9045                                         cur_test->param.name);
9046                         err = TEST_FAILED;
9047                 } else {
9048                         printf("\t%d) %s: Decap PASS\n", cur_test->test_idx,
9049                                         cur_test->param.name);
9050                         err = TEST_SUCCESS;
9051                 }
9052                 all_err += err;
9053         }
9054
9055         printf("Success: %d, Failure: %d\n", size + all_err, -all_err);
9056
9057         return (all_err == TEST_SUCCESS) ? TEST_SUCCESS : TEST_FAILED;
9058 }
9059
9060 static int
9061 test_ipsec_proto_process(const struct ipsec_test_data td[],
9062                          struct ipsec_test_data res_d[],
9063                          int nb_td,
9064                          bool silent,
9065                          const struct ipsec_test_flags *flags)
9066 {
9067         struct crypto_testsuite_params *ts_params = &testsuite_params;
9068         struct crypto_unittest_params *ut_params = &unittest_params;
9069         struct rte_security_capability_idx sec_cap_idx;
9070         const struct rte_security_capability *sec_cap;
9071         struct rte_security_ipsec_xform ipsec_xform;
9072         uint8_t dev_id = ts_params->valid_devs[0];
9073         enum rte_security_ipsec_sa_direction dir;
9074         struct ipsec_test_data *res_d_tmp = NULL;
9075         uint32_t src = RTE_IPV4(192, 168, 1, 0);
9076         uint32_t dst = RTE_IPV4(192, 168, 1, 1);
9077         int salt_len, i, ret = TEST_SUCCESS;
9078         struct rte_security_ctx *ctx;
9079         uint8_t *input_text;
9080         uint32_t verify;
9081
9082         ut_params->type = RTE_SECURITY_ACTION_TYPE_LOOKASIDE_PROTOCOL;
9083         gbl_action_type = RTE_SECURITY_ACTION_TYPE_LOOKASIDE_PROTOCOL;
9084
9085         /* Use first test data to create session */
9086
9087         /* Copy IPsec xform */
9088         memcpy(&ipsec_xform, &td[0].ipsec_xform, sizeof(ipsec_xform));
9089
9090         dir = ipsec_xform.direction;
9091         verify = flags->tunnel_hdr_verify;
9092
9093         if ((dir == RTE_SECURITY_IPSEC_SA_DIR_INGRESS) && verify) {
9094                 if (verify == RTE_SECURITY_IPSEC_TUNNEL_VERIFY_SRC_DST_ADDR)
9095                         src += 1;
9096                 else if (verify == RTE_SECURITY_IPSEC_TUNNEL_VERIFY_DST_ADDR)
9097                         dst += 1;
9098         }
9099
9100         memcpy(&ipsec_xform.tunnel.ipv4.src_ip, &src, sizeof(src));
9101         memcpy(&ipsec_xform.tunnel.ipv4.dst_ip, &dst, sizeof(dst));
9102
9103         ctx = rte_cryptodev_get_sec_ctx(dev_id);
9104
9105         sec_cap_idx.action = ut_params->type;
9106         sec_cap_idx.protocol = RTE_SECURITY_PROTOCOL_IPSEC;
9107         sec_cap_idx.ipsec.proto = ipsec_xform.proto;
9108         sec_cap_idx.ipsec.mode = ipsec_xform.mode;
9109         sec_cap_idx.ipsec.direction = ipsec_xform.direction;
9110
9111         if (flags->udp_encap)
9112                 ipsec_xform.options.udp_encap = 1;
9113
9114         sec_cap = rte_security_capability_get(ctx, &sec_cap_idx);
9115         if (sec_cap == NULL)
9116                 return TEST_SKIPPED;
9117
9118         /* Copy cipher session parameters */
9119         if (td[0].aead) {
9120                 memcpy(&ut_params->aead_xform, &td[0].xform.aead,
9121                        sizeof(ut_params->aead_xform));
9122                 ut_params->aead_xform.aead.key.data = td[0].key.data;
9123                 ut_params->aead_xform.aead.iv.offset = IV_OFFSET;
9124
9125                 /* Verify crypto capabilities */
9126                 if (test_ipsec_crypto_caps_aead_verify(
9127                                 sec_cap,
9128                                 &ut_params->aead_xform) != 0) {
9129                         if (!silent)
9130                                 RTE_LOG(INFO, USER1,
9131                                         "Crypto capabilities not supported\n");
9132                         return TEST_SKIPPED;
9133                 }
9134         } else {
9135                 /* Only AEAD supported now */
9136                 return TEST_SKIPPED;
9137         }
9138
9139         if (test_ipsec_sec_caps_verify(&ipsec_xform, sec_cap, silent) != 0)
9140                 return TEST_SKIPPED;
9141
9142         salt_len = RTE_MIN(sizeof(ipsec_xform.salt), td[0].salt.len);
9143         memcpy(&ipsec_xform.salt, td[0].salt.data, salt_len);
9144
9145         struct rte_security_session_conf sess_conf = {
9146                 .action_type = ut_params->type,
9147                 .protocol = RTE_SECURITY_PROTOCOL_IPSEC,
9148                 .ipsec = ipsec_xform,
9149                 .crypto_xform = &ut_params->aead_xform,
9150         };
9151
9152         /* Create security session */
9153         ut_params->sec_session = rte_security_session_create(ctx, &sess_conf,
9154                                         ts_params->session_mpool,
9155                                         ts_params->session_priv_mpool);
9156
9157         if (ut_params->sec_session == NULL)
9158                 return TEST_SKIPPED;
9159
9160         for (i = 0; i < nb_td; i++) {
9161                 /* Setup source mbuf payload */
9162                 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
9163                 memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
9164                                 rte_pktmbuf_tailroom(ut_params->ibuf));
9165
9166                 input_text = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
9167                                 td[i].input_text.len);
9168
9169                 memcpy(input_text, td[i].input_text.data,
9170                        td[i].input_text.len);
9171
9172                 /* Generate crypto op data structure */
9173                 ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
9174                                         RTE_CRYPTO_OP_TYPE_SYMMETRIC);
9175                 if (!ut_params->op) {
9176                         printf("TestCase %s line %d: %s\n",
9177                                 __func__, __LINE__,
9178                                 "failed to allocate crypto op");
9179                         ret = TEST_FAILED;
9180                         goto crypto_op_free;
9181                 }
9182
9183                 /* Attach session to operation */
9184                 rte_security_attach_session(ut_params->op,
9185                                             ut_params->sec_session);
9186
9187                 /* Set crypto operation mbufs */
9188                 ut_params->op->sym->m_src = ut_params->ibuf;
9189                 ut_params->op->sym->m_dst = NULL;
9190
9191                 /* Copy IV in crypto operation when IV generation is disabled */
9192                 if (dir == RTE_SECURITY_IPSEC_SA_DIR_EGRESS &&
9193                     ipsec_xform.options.iv_gen_disable == 1) {
9194                         uint8_t *iv = rte_crypto_op_ctod_offset(ut_params->op,
9195                                                                 uint8_t *,
9196                                                                 IV_OFFSET);
9197                         int len;
9198
9199                         if (td[i].aead)
9200                                 len = td[i].xform.aead.aead.iv.length;
9201                         else
9202                                 len = td[i].xform.chain.cipher.cipher.iv.length;
9203
9204                         memcpy(iv, td[i].iv.data, len);
9205                 }
9206
9207                 /* Process crypto operation */
9208                 process_crypto_request(dev_id, ut_params->op);
9209
9210                 ret = test_ipsec_status_check(ut_params->op, flags, dir, i + 1);
9211                 if (ret != TEST_SUCCESS)
9212                         goto crypto_op_free;
9213
9214                 if (res_d != NULL)
9215                         res_d_tmp = &res_d[i];
9216
9217                 ret = test_ipsec_post_process(ut_params->ibuf, &td[i],
9218                                               res_d_tmp, silent, flags);
9219                 if (ret != TEST_SUCCESS)
9220                         goto crypto_op_free;
9221
9222                 rte_crypto_op_free(ut_params->op);
9223                 ut_params->op = NULL;
9224
9225                 rte_pktmbuf_free(ut_params->ibuf);
9226                 ut_params->ibuf = NULL;
9227         }
9228
9229 crypto_op_free:
9230         rte_crypto_op_free(ut_params->op);
9231         ut_params->op = NULL;
9232
9233         rte_pktmbuf_free(ut_params->ibuf);
9234         ut_params->ibuf = NULL;
9235
9236         if (ut_params->sec_session)
9237                 rte_security_session_destroy(ctx, ut_params->sec_session);
9238         ut_params->sec_session = NULL;
9239
9240         return ret;
9241 }
9242
9243 static int
9244 test_ipsec_proto_known_vec(const void *test_data)
9245 {
9246         struct ipsec_test_data td_outb;
9247         struct ipsec_test_flags flags;
9248
9249         memset(&flags, 0, sizeof(flags));
9250
9251         memcpy(&td_outb, test_data, sizeof(td_outb));
9252
9253         /* Disable IV gen to be able to test with known vectors */
9254         td_outb.ipsec_xform.options.iv_gen_disable = 1;
9255
9256         return test_ipsec_proto_process(&td_outb, NULL, 1, false, &flags);
9257 }
9258
9259 static int
9260 test_ipsec_proto_known_vec_inb(const void *td_outb)
9261 {
9262         struct ipsec_test_flags flags;
9263         struct ipsec_test_data td_inb;
9264
9265         memset(&flags, 0, sizeof(flags));
9266
9267         test_ipsec_td_in_from_out(td_outb, &td_inb);
9268
9269         return test_ipsec_proto_process(&td_inb, NULL, 1, false, &flags);
9270 }
9271
9272 static int
9273 test_ipsec_proto_all(const struct ipsec_test_flags *flags)
9274 {
9275         struct ipsec_test_data td_outb[IPSEC_TEST_PACKETS_MAX];
9276         struct ipsec_test_data td_inb[IPSEC_TEST_PACKETS_MAX];
9277         unsigned int i, nb_pkts = 1, pass_cnt = 0;
9278         int ret;
9279
9280         if (flags->iv_gen ||
9281             flags->sa_expiry_pkts_soft ||
9282             flags->sa_expiry_pkts_hard)
9283                 nb_pkts = IPSEC_TEST_PACKETS_MAX;
9284
9285         for (i = 0; i < RTE_DIM(aead_list); i++) {
9286                 test_ipsec_td_prepare(&aead_list[i],
9287                                       NULL,
9288                                       flags,
9289                                       td_outb,
9290                                       nb_pkts);
9291
9292                 ret = test_ipsec_proto_process(td_outb, td_inb, nb_pkts, true,
9293                                                flags);
9294                 if (ret == TEST_SKIPPED)
9295                         continue;
9296
9297                 if (ret == TEST_FAILED)
9298                         return TEST_FAILED;
9299
9300                 test_ipsec_td_update(td_inb, td_outb, nb_pkts, flags);
9301
9302                 ret = test_ipsec_proto_process(td_inb, NULL, nb_pkts, true,
9303                                                flags);
9304                 if (ret == TEST_SKIPPED)
9305                         continue;
9306
9307                 if (ret == TEST_FAILED)
9308                         return TEST_FAILED;
9309
9310                 if (flags->display_alg)
9311                         test_ipsec_display_alg(&aead_list[i], NULL);
9312
9313                 pass_cnt++;
9314         }
9315
9316         if (pass_cnt > 0)
9317                 return TEST_SUCCESS;
9318         else
9319                 return TEST_SKIPPED;
9320 }
9321
9322 static int
9323 test_ipsec_proto_display_list(const void *data __rte_unused)
9324 {
9325         struct ipsec_test_flags flags;
9326
9327         memset(&flags, 0, sizeof(flags));
9328
9329         flags.display_alg = true;
9330
9331         return test_ipsec_proto_all(&flags);
9332 }
9333
9334 static int
9335 test_ipsec_proto_iv_gen(const void *data __rte_unused)
9336 {
9337         struct ipsec_test_flags flags;
9338
9339         memset(&flags, 0, sizeof(flags));
9340
9341         flags.iv_gen = true;
9342
9343         return test_ipsec_proto_all(&flags);
9344 }
9345
9346 static int
9347 test_ipsec_proto_sa_exp_pkts_soft(const void *data __rte_unused)
9348 {
9349         struct ipsec_test_flags flags;
9350
9351         memset(&flags, 0, sizeof(flags));
9352
9353         flags.sa_expiry_pkts_soft = true;
9354
9355         return test_ipsec_proto_all(&flags);
9356 }
9357
9358 static int
9359 test_ipsec_proto_sa_exp_pkts_hard(const void *data __rte_unused)
9360 {
9361         struct ipsec_test_flags flags;
9362
9363         memset(&flags, 0, sizeof(flags));
9364
9365         flags.sa_expiry_pkts_hard = true;
9366
9367         return test_ipsec_proto_all(&flags);
9368 }
9369
9370 static int
9371 test_ipsec_proto_err_icv_corrupt(const void *data __rte_unused)
9372 {
9373         struct ipsec_test_flags flags;
9374
9375         memset(&flags, 0, sizeof(flags));
9376
9377         flags.icv_corrupt = true;
9378
9379         return test_ipsec_proto_all(&flags);
9380 }
9381
9382 static int
9383 test_ipsec_proto_udp_encap(const void *data __rte_unused)
9384 {
9385         struct ipsec_test_flags flags;
9386
9387         memset(&flags, 0, sizeof(flags));
9388
9389         flags.udp_encap = true;
9390
9391         return test_ipsec_proto_all(&flags);
9392 }
9393
9394 static int
9395 test_ipsec_proto_tunnel_src_dst_addr_verify(const void *data __rte_unused)
9396 {
9397         struct ipsec_test_flags flags;
9398
9399         memset(&flags, 0, sizeof(flags));
9400
9401         flags.tunnel_hdr_verify = RTE_SECURITY_IPSEC_TUNNEL_VERIFY_SRC_DST_ADDR;
9402
9403         return test_ipsec_proto_all(&flags);
9404 }
9405
9406 static int
9407 test_ipsec_proto_tunnel_dst_addr_verify(const void *data __rte_unused)
9408 {
9409         struct ipsec_test_flags flags;
9410
9411         memset(&flags, 0, sizeof(flags));
9412
9413         flags.tunnel_hdr_verify = RTE_SECURITY_IPSEC_TUNNEL_VERIFY_DST_ADDR;
9414
9415         return test_ipsec_proto_all(&flags);
9416 }
9417
9418 static int
9419 test_ipsec_proto_udp_ports_verify(const void *data __rte_unused)
9420 {
9421         struct ipsec_test_flags flags;
9422
9423         memset(&flags, 0, sizeof(flags));
9424
9425         flags.udp_encap = true;
9426         flags.udp_ports_verify = true;
9427
9428         return test_ipsec_proto_all(&flags);
9429 }
9430
9431 static int
9432 test_ipsec_proto_inner_ip_csum(const void *data __rte_unused)
9433 {
9434         struct ipsec_test_flags flags;
9435
9436         memset(&flags, 0, sizeof(flags));
9437
9438         flags.ip_csum = true;
9439
9440         return test_ipsec_proto_all(&flags);
9441 }
9442
9443 static int
9444 test_ipsec_proto_inner_l4_csum(const void *data __rte_unused)
9445 {
9446         struct ipsec_test_flags flags;
9447
9448         memset(&flags, 0, sizeof(flags));
9449
9450         flags.l4_csum = true;
9451
9452         return test_ipsec_proto_all(&flags);
9453 }
9454
9455 static int
9456 test_PDCP_PROTO_all(void)
9457 {
9458         struct crypto_testsuite_params *ts_params = &testsuite_params;
9459         struct crypto_unittest_params *ut_params = &unittest_params;
9460         struct rte_cryptodev_info dev_info;
9461         int status;
9462
9463         rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
9464         uint64_t feat_flags = dev_info.feature_flags;
9465
9466         if (!(feat_flags & RTE_CRYPTODEV_FF_SECURITY))
9467                 return TEST_SKIPPED;
9468
9469         /* Set action type */
9470         ut_params->type = gbl_action_type == RTE_SECURITY_ACTION_TYPE_NONE ?
9471                 RTE_SECURITY_ACTION_TYPE_LOOKASIDE_PROTOCOL :
9472                 gbl_action_type;
9473
9474         if (security_proto_supported(ut_params->type,
9475                         RTE_SECURITY_PROTOCOL_PDCP) < 0)
9476                 return TEST_SKIPPED;
9477
9478         status = test_PDCP_PROTO_cplane_encap_all();
9479         status += test_PDCP_PROTO_cplane_decap_all();
9480         status += test_PDCP_PROTO_uplane_encap_all();
9481         status += test_PDCP_PROTO_uplane_decap_all();
9482         status += test_PDCP_PROTO_SGL_in_place_32B();
9483         status += test_PDCP_PROTO_SGL_oop_32B_128B();
9484         status += test_PDCP_PROTO_SGL_oop_32B_40B();
9485         status += test_PDCP_PROTO_SGL_oop_128B_32B();
9486         status += test_PDCP_SDAP_PROTO_encap_all();
9487         status += test_PDCP_SDAP_PROTO_decap_all();
9488         status += test_PDCP_PROTO_short_mac();
9489
9490         if (status)
9491                 return TEST_FAILED;
9492         else
9493                 return TEST_SUCCESS;
9494 }
9495
9496 static int
9497 test_docsis_proto_uplink(int i, struct docsis_test_data *d_td)
9498 {
9499         struct crypto_testsuite_params *ts_params = &testsuite_params;
9500         struct crypto_unittest_params *ut_params = &unittest_params;
9501         uint8_t *plaintext, *ciphertext;
9502         uint8_t *iv_ptr;
9503         int32_t cipher_len, crc_len;
9504         uint32_t crc_data_len;
9505         int ret = TEST_SUCCESS;
9506
9507         struct rte_security_ctx *ctx = (struct rte_security_ctx *)
9508                                         rte_cryptodev_get_sec_ctx(
9509                                                 ts_params->valid_devs[0]);
9510
9511         /* Verify the capabilities */
9512         struct rte_security_capability_idx sec_cap_idx;
9513         const struct rte_security_capability *sec_cap;
9514         const struct rte_cryptodev_capabilities *crypto_cap;
9515         const struct rte_cryptodev_symmetric_capability *sym_cap;
9516         int j = 0;
9517
9518         sec_cap_idx.action = ut_params->type;
9519         sec_cap_idx.protocol = RTE_SECURITY_PROTOCOL_DOCSIS;
9520         sec_cap_idx.docsis.direction = RTE_SECURITY_DOCSIS_UPLINK;
9521
9522         sec_cap = rte_security_capability_get(ctx, &sec_cap_idx);
9523         if (sec_cap == NULL)
9524                 return TEST_SKIPPED;
9525
9526         while ((crypto_cap = &sec_cap->crypto_capabilities[j++])->op !=
9527                         RTE_CRYPTO_OP_TYPE_UNDEFINED) {
9528                 if (crypto_cap->op == RTE_CRYPTO_OP_TYPE_SYMMETRIC &&
9529                                 crypto_cap->sym.xform_type ==
9530                                         RTE_CRYPTO_SYM_XFORM_CIPHER &&
9531                                 crypto_cap->sym.cipher.algo ==
9532                                         RTE_CRYPTO_CIPHER_AES_DOCSISBPI) {
9533                         sym_cap = &crypto_cap->sym;
9534                         if (rte_cryptodev_sym_capability_check_cipher(sym_cap,
9535                                                 d_td->key.len,
9536                                                 d_td->iv.len) == 0)
9537                                 break;
9538                 }
9539         }
9540
9541         if (crypto_cap->op == RTE_CRYPTO_OP_TYPE_UNDEFINED)
9542                 return TEST_SKIPPED;
9543
9544         /* Setup source mbuf payload */
9545         ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
9546         memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
9547                         rte_pktmbuf_tailroom(ut_params->ibuf));
9548
9549         ciphertext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
9550                         d_td->ciphertext.len);
9551
9552         memcpy(ciphertext, d_td->ciphertext.data, d_td->ciphertext.len);
9553
9554         /* Setup cipher session parameters */
9555         ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
9556         ut_params->cipher_xform.cipher.algo = RTE_CRYPTO_CIPHER_AES_DOCSISBPI;
9557         ut_params->cipher_xform.cipher.op = RTE_CRYPTO_CIPHER_OP_DECRYPT;
9558         ut_params->cipher_xform.cipher.key.data = d_td->key.data;
9559         ut_params->cipher_xform.cipher.key.length = d_td->key.len;
9560         ut_params->cipher_xform.cipher.iv.length = d_td->iv.len;
9561         ut_params->cipher_xform.cipher.iv.offset = IV_OFFSET;
9562         ut_params->cipher_xform.next = NULL;
9563
9564         /* Setup DOCSIS session parameters */
9565         ut_params->docsis_xform.direction = RTE_SECURITY_DOCSIS_UPLINK;
9566
9567         struct rte_security_session_conf sess_conf = {
9568                 .action_type = ut_params->type,
9569                 .protocol = RTE_SECURITY_PROTOCOL_DOCSIS,
9570                 .docsis = ut_params->docsis_xform,
9571                 .crypto_xform = &ut_params->cipher_xform,
9572         };
9573
9574         /* Create security session */
9575         ut_params->sec_session = rte_security_session_create(ctx, &sess_conf,
9576                                         ts_params->session_mpool,
9577                                         ts_params->session_priv_mpool);
9578
9579         if (!ut_params->sec_session) {
9580                 printf("TestCase %s(%d) line %d: %s\n",
9581                         __func__, i, __LINE__, "failed to allocate session");
9582                 ret = TEST_FAILED;
9583                 goto on_err;
9584         }
9585
9586         /* Generate crypto op data structure */
9587         ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
9588                                 RTE_CRYPTO_OP_TYPE_SYMMETRIC);
9589         if (!ut_params->op) {
9590                 printf("TestCase %s(%d) line %d: %s\n",
9591                         __func__, i, __LINE__,
9592                         "failed to allocate symmetric crypto operation");
9593                 ret = TEST_FAILED;
9594                 goto on_err;
9595         }
9596
9597         /* Setup CRC operation parameters */
9598         crc_len = d_td->ciphertext.no_crc == false ?
9599                         (d_td->ciphertext.len -
9600                                 d_td->ciphertext.crc_offset -
9601                                 RTE_ETHER_CRC_LEN) :
9602                         0;
9603         crc_len = crc_len > 0 ? crc_len : 0;
9604         crc_data_len = crc_len == 0 ? 0 : RTE_ETHER_CRC_LEN;
9605         ut_params->op->sym->auth.data.length = crc_len;
9606         ut_params->op->sym->auth.data.offset = d_td->ciphertext.crc_offset;
9607
9608         /* Setup cipher operation parameters */
9609         cipher_len = d_td->ciphertext.no_cipher == false ?
9610                         (d_td->ciphertext.len -
9611                                 d_td->ciphertext.cipher_offset) :
9612                         0;
9613         cipher_len = cipher_len > 0 ? cipher_len : 0;
9614         ut_params->op->sym->cipher.data.length = cipher_len;
9615         ut_params->op->sym->cipher.data.offset = d_td->ciphertext.cipher_offset;
9616
9617         /* Setup cipher IV */
9618         iv_ptr = (uint8_t *)ut_params->op + IV_OFFSET;
9619         rte_memcpy(iv_ptr, d_td->iv.data, d_td->iv.len);
9620
9621         /* Attach session to operation */
9622         rte_security_attach_session(ut_params->op, ut_params->sec_session);
9623
9624         /* Set crypto operation mbufs */
9625         ut_params->op->sym->m_src = ut_params->ibuf;
9626         ut_params->op->sym->m_dst = NULL;
9627
9628         /* Process crypto operation */
9629         if (process_crypto_request(ts_params->valid_devs[0], ut_params->op) ==
9630                         NULL) {
9631                 printf("TestCase %s(%d) line %d: %s\n",
9632                         __func__, i, __LINE__,
9633                         "failed to process security crypto op");
9634                 ret = TEST_FAILED;
9635                 goto on_err;
9636         }
9637
9638         if (ut_params->op->status != RTE_CRYPTO_OP_STATUS_SUCCESS) {
9639                 printf("TestCase %s(%d) line %d: %s\n",
9640                         __func__, i, __LINE__, "crypto op processing failed");
9641                 ret = TEST_FAILED;
9642                 goto on_err;
9643         }
9644
9645         /* Validate plaintext */
9646         plaintext = ciphertext;
9647
9648         if (memcmp(plaintext, d_td->plaintext.data,
9649                         d_td->plaintext.len - crc_data_len)) {
9650                 printf("TestCase %s(%d) line %d: %s\n",
9651                         __func__, i, __LINE__, "plaintext not as expected\n");
9652                 rte_hexdump(stdout, "expected", d_td->plaintext.data,
9653                                 d_td->plaintext.len);
9654                 rte_hexdump(stdout, "actual", plaintext, d_td->plaintext.len);
9655                 ret = TEST_FAILED;
9656                 goto on_err;
9657         }
9658
9659 on_err:
9660         rte_crypto_op_free(ut_params->op);
9661         ut_params->op = NULL;
9662
9663         if (ut_params->sec_session)
9664                 rte_security_session_destroy(ctx, ut_params->sec_session);
9665         ut_params->sec_session = NULL;
9666
9667         rte_pktmbuf_free(ut_params->ibuf);
9668         ut_params->ibuf = NULL;
9669
9670         return ret;
9671 }
9672
9673 static int
9674 test_docsis_proto_downlink(int i, struct docsis_test_data *d_td)
9675 {
9676         struct crypto_testsuite_params *ts_params = &testsuite_params;
9677         struct crypto_unittest_params *ut_params = &unittest_params;
9678         uint8_t *plaintext, *ciphertext;
9679         uint8_t *iv_ptr;
9680         int32_t cipher_len, crc_len;
9681         int ret = TEST_SUCCESS;
9682
9683         struct rte_security_ctx *ctx = (struct rte_security_ctx *)
9684                                         rte_cryptodev_get_sec_ctx(
9685                                                 ts_params->valid_devs[0]);
9686
9687         /* Verify the capabilities */
9688         struct rte_security_capability_idx sec_cap_idx;
9689         const struct rte_security_capability *sec_cap;
9690         const struct rte_cryptodev_capabilities *crypto_cap;
9691         const struct rte_cryptodev_symmetric_capability *sym_cap;
9692         int j = 0;
9693
9694         sec_cap_idx.action = ut_params->type;
9695         sec_cap_idx.protocol = RTE_SECURITY_PROTOCOL_DOCSIS;
9696         sec_cap_idx.docsis.direction = RTE_SECURITY_DOCSIS_DOWNLINK;
9697
9698         sec_cap = rte_security_capability_get(ctx, &sec_cap_idx);
9699         if (sec_cap == NULL)
9700                 return TEST_SKIPPED;
9701
9702         while ((crypto_cap = &sec_cap->crypto_capabilities[j++])->op !=
9703                         RTE_CRYPTO_OP_TYPE_UNDEFINED) {
9704                 if (crypto_cap->op == RTE_CRYPTO_OP_TYPE_SYMMETRIC &&
9705                                 crypto_cap->sym.xform_type ==
9706                                         RTE_CRYPTO_SYM_XFORM_CIPHER &&
9707                                 crypto_cap->sym.cipher.algo ==
9708                                         RTE_CRYPTO_CIPHER_AES_DOCSISBPI) {
9709                         sym_cap = &crypto_cap->sym;
9710                         if (rte_cryptodev_sym_capability_check_cipher(sym_cap,
9711                                                 d_td->key.len,
9712                                                 d_td->iv.len) == 0)
9713                                 break;
9714                 }
9715         }
9716
9717         if (crypto_cap->op == RTE_CRYPTO_OP_TYPE_UNDEFINED)
9718                 return TEST_SKIPPED;
9719
9720         /* Setup source mbuf payload */
9721         ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
9722         memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
9723                         rte_pktmbuf_tailroom(ut_params->ibuf));
9724
9725         plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
9726                         d_td->plaintext.len);
9727
9728         memcpy(plaintext, d_td->plaintext.data, d_td->plaintext.len);
9729
9730         /* Setup cipher session parameters */
9731         ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
9732         ut_params->cipher_xform.cipher.algo = RTE_CRYPTO_CIPHER_AES_DOCSISBPI;
9733         ut_params->cipher_xform.cipher.op = RTE_CRYPTO_CIPHER_OP_ENCRYPT;
9734         ut_params->cipher_xform.cipher.key.data = d_td->key.data;
9735         ut_params->cipher_xform.cipher.key.length = d_td->key.len;
9736         ut_params->cipher_xform.cipher.iv.length = d_td->iv.len;
9737         ut_params->cipher_xform.cipher.iv.offset = IV_OFFSET;
9738         ut_params->cipher_xform.next = NULL;
9739
9740         /* Setup DOCSIS session parameters */
9741         ut_params->docsis_xform.direction = RTE_SECURITY_DOCSIS_DOWNLINK;
9742
9743         struct rte_security_session_conf sess_conf = {
9744                 .action_type = ut_params->type,
9745                 .protocol = RTE_SECURITY_PROTOCOL_DOCSIS,
9746                 .docsis = ut_params->docsis_xform,
9747                 .crypto_xform = &ut_params->cipher_xform,
9748         };
9749
9750         /* Create security session */
9751         ut_params->sec_session = rte_security_session_create(ctx, &sess_conf,
9752                                         ts_params->session_mpool,
9753                                         ts_params->session_priv_mpool);
9754
9755         if (!ut_params->sec_session) {
9756                 printf("TestCase %s(%d) line %d: %s\n",
9757                         __func__, i, __LINE__, "failed to allocate session");
9758                 ret = TEST_FAILED;
9759                 goto on_err;
9760         }
9761
9762         /* Generate crypto op data structure */
9763         ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
9764                                 RTE_CRYPTO_OP_TYPE_SYMMETRIC);
9765         if (!ut_params->op) {
9766                 printf("TestCase %s(%d) line %d: %s\n",
9767                         __func__, i, __LINE__,
9768                         "failed to allocate security crypto operation");
9769                 ret = TEST_FAILED;
9770                 goto on_err;
9771         }
9772
9773         /* Setup CRC operation parameters */
9774         crc_len = d_td->plaintext.no_crc == false ?
9775                         (d_td->plaintext.len -
9776                                 d_td->plaintext.crc_offset -
9777                                 RTE_ETHER_CRC_LEN) :
9778                         0;
9779         crc_len = crc_len > 0 ? crc_len : 0;
9780         ut_params->op->sym->auth.data.length = crc_len;
9781         ut_params->op->sym->auth.data.offset = d_td->plaintext.crc_offset;
9782
9783         /* Setup cipher operation parameters */
9784         cipher_len = d_td->plaintext.no_cipher == false ?
9785                         (d_td->plaintext.len -
9786                                 d_td->plaintext.cipher_offset) :
9787                         0;
9788         cipher_len = cipher_len > 0 ? cipher_len : 0;
9789         ut_params->op->sym->cipher.data.length = cipher_len;
9790         ut_params->op->sym->cipher.data.offset = d_td->plaintext.cipher_offset;
9791
9792         /* Setup cipher IV */
9793         iv_ptr = (uint8_t *)ut_params->op + IV_OFFSET;
9794         rte_memcpy(iv_ptr, d_td->iv.data, d_td->iv.len);
9795
9796         /* Attach session to operation */
9797         rte_security_attach_session(ut_params->op, ut_params->sec_session);
9798
9799         /* Set crypto operation mbufs */
9800         ut_params->op->sym->m_src = ut_params->ibuf;
9801         ut_params->op->sym->m_dst = NULL;
9802
9803         /* Process crypto operation */
9804         if (process_crypto_request(ts_params->valid_devs[0], ut_params->op) ==
9805                         NULL) {
9806                 printf("TestCase %s(%d) line %d: %s\n",
9807                         __func__, i, __LINE__,
9808                         "failed to process security crypto op");
9809                 ret = TEST_FAILED;
9810                 goto on_err;
9811         }
9812
9813         if (ut_params->op->status != RTE_CRYPTO_OP_STATUS_SUCCESS) {
9814                 printf("TestCase %s(%d) line %d: %s\n",
9815                         __func__, i, __LINE__, "crypto op processing failed");
9816                 ret = TEST_FAILED;
9817                 goto on_err;
9818         }
9819
9820         /* Validate ciphertext */
9821         ciphertext = plaintext;
9822
9823         if (memcmp(ciphertext, d_td->ciphertext.data, d_td->ciphertext.len)) {
9824                 printf("TestCase %s(%d) line %d: %s\n",
9825                         __func__, i, __LINE__, "ciphertext not as expected\n");
9826                 rte_hexdump(stdout, "expected", d_td->ciphertext.data,
9827                                 d_td->ciphertext.len);
9828                 rte_hexdump(stdout, "actual", ciphertext, d_td->ciphertext.len);
9829                 ret = TEST_FAILED;
9830                 goto on_err;
9831         }
9832
9833 on_err:
9834         rte_crypto_op_free(ut_params->op);
9835         ut_params->op = NULL;
9836
9837         if (ut_params->sec_session)
9838                 rte_security_session_destroy(ctx, ut_params->sec_session);
9839         ut_params->sec_session = NULL;
9840
9841         rte_pktmbuf_free(ut_params->ibuf);
9842         ut_params->ibuf = NULL;
9843
9844         return ret;
9845 }
9846
9847 #define TEST_DOCSIS_COUNT(func) do {                    \
9848         int ret = func;                                 \
9849         if (ret == TEST_SUCCESS)  {                     \
9850                 printf("\t%2d)", n++);                  \
9851                 printf("+++++ PASSED:" #func"\n");      \
9852                 p++;                                    \
9853         } else if (ret == TEST_SKIPPED) {               \
9854                 printf("\t%2d)", n++);                  \
9855                 printf("~~~~~ SKIPPED:" #func"\n");     \
9856                 s++;                                    \
9857         } else {                                        \
9858                 printf("\t%2d)", n++);                  \
9859                 printf("----- FAILED:" #func"\n");      \
9860                 f++;                                    \
9861         }                                               \
9862 } while (0)
9863
9864 static int
9865 test_DOCSIS_PROTO_uplink_all(void)
9866 {
9867         int p = 0, s = 0, f = 0, n = 0;
9868
9869         TEST_DOCSIS_COUNT(test_docsis_proto_uplink(1, &docsis_test_case_1));
9870         TEST_DOCSIS_COUNT(test_docsis_proto_uplink(2, &docsis_test_case_2));
9871         TEST_DOCSIS_COUNT(test_docsis_proto_uplink(3, &docsis_test_case_3));
9872         TEST_DOCSIS_COUNT(test_docsis_proto_uplink(4, &docsis_test_case_4));
9873         TEST_DOCSIS_COUNT(test_docsis_proto_uplink(5, &docsis_test_case_5));
9874         TEST_DOCSIS_COUNT(test_docsis_proto_uplink(6, &docsis_test_case_6));
9875         TEST_DOCSIS_COUNT(test_docsis_proto_uplink(7, &docsis_test_case_7));
9876         TEST_DOCSIS_COUNT(test_docsis_proto_uplink(8, &docsis_test_case_8));
9877         TEST_DOCSIS_COUNT(test_docsis_proto_uplink(9, &docsis_test_case_9));
9878         TEST_DOCSIS_COUNT(test_docsis_proto_uplink(10, &docsis_test_case_10));
9879         TEST_DOCSIS_COUNT(test_docsis_proto_uplink(11, &docsis_test_case_11));
9880         TEST_DOCSIS_COUNT(test_docsis_proto_uplink(12, &docsis_test_case_12));
9881         TEST_DOCSIS_COUNT(test_docsis_proto_uplink(13, &docsis_test_case_13));
9882         TEST_DOCSIS_COUNT(test_docsis_proto_uplink(14, &docsis_test_case_14));
9883         TEST_DOCSIS_COUNT(test_docsis_proto_uplink(15, &docsis_test_case_15));
9884         TEST_DOCSIS_COUNT(test_docsis_proto_uplink(16, &docsis_test_case_16));
9885         TEST_DOCSIS_COUNT(test_docsis_proto_uplink(17, &docsis_test_case_17));
9886         TEST_DOCSIS_COUNT(test_docsis_proto_uplink(18, &docsis_test_case_18));
9887         TEST_DOCSIS_COUNT(test_docsis_proto_uplink(19, &docsis_test_case_19));
9888         TEST_DOCSIS_COUNT(test_docsis_proto_uplink(20, &docsis_test_case_20));
9889         TEST_DOCSIS_COUNT(test_docsis_proto_uplink(21, &docsis_test_case_21));
9890         TEST_DOCSIS_COUNT(test_docsis_proto_uplink(22, &docsis_test_case_22));
9891         TEST_DOCSIS_COUNT(test_docsis_proto_uplink(23, &docsis_test_case_23));
9892         TEST_DOCSIS_COUNT(test_docsis_proto_uplink(24, &docsis_test_case_24));
9893         TEST_DOCSIS_COUNT(test_docsis_proto_uplink(25, &docsis_test_case_25));
9894         TEST_DOCSIS_COUNT(test_docsis_proto_uplink(26, &docsis_test_case_26));
9895
9896         if (f)
9897                 printf("## %s: %d passed out of %d (%d skipped)\n",
9898                         __func__, p, n, s);
9899
9900         return f;
9901 };
9902
9903 static int
9904 test_DOCSIS_PROTO_downlink_all(void)
9905 {
9906         int p = 0, s = 0, f = 0, n = 0;
9907
9908         TEST_DOCSIS_COUNT(test_docsis_proto_downlink(1, &docsis_test_case_1));
9909         TEST_DOCSIS_COUNT(test_docsis_proto_downlink(2, &docsis_test_case_2));
9910         TEST_DOCSIS_COUNT(test_docsis_proto_downlink(3, &docsis_test_case_3));
9911         TEST_DOCSIS_COUNT(test_docsis_proto_downlink(4, &docsis_test_case_4));
9912         TEST_DOCSIS_COUNT(test_docsis_proto_downlink(5, &docsis_test_case_5));
9913         TEST_DOCSIS_COUNT(test_docsis_proto_downlink(6, &docsis_test_case_6));
9914         TEST_DOCSIS_COUNT(test_docsis_proto_downlink(7, &docsis_test_case_7));
9915         TEST_DOCSIS_COUNT(test_docsis_proto_downlink(8, &docsis_test_case_8));
9916         TEST_DOCSIS_COUNT(test_docsis_proto_downlink(9, &docsis_test_case_9));
9917         TEST_DOCSIS_COUNT(test_docsis_proto_downlink(10, &docsis_test_case_10));
9918         TEST_DOCSIS_COUNT(test_docsis_proto_downlink(11, &docsis_test_case_11));
9919         TEST_DOCSIS_COUNT(test_docsis_proto_downlink(12, &docsis_test_case_12));
9920         TEST_DOCSIS_COUNT(test_docsis_proto_downlink(13, &docsis_test_case_13));
9921         TEST_DOCSIS_COUNT(test_docsis_proto_downlink(14, &docsis_test_case_14));
9922         TEST_DOCSIS_COUNT(test_docsis_proto_downlink(15, &docsis_test_case_15));
9923         TEST_DOCSIS_COUNT(test_docsis_proto_downlink(16, &docsis_test_case_16));
9924         TEST_DOCSIS_COUNT(test_docsis_proto_downlink(17, &docsis_test_case_17));
9925         TEST_DOCSIS_COUNT(test_docsis_proto_downlink(18, &docsis_test_case_18));
9926         TEST_DOCSIS_COUNT(test_docsis_proto_downlink(19, &docsis_test_case_19));
9927         TEST_DOCSIS_COUNT(test_docsis_proto_downlink(20, &docsis_test_case_20));
9928         TEST_DOCSIS_COUNT(test_docsis_proto_downlink(21, &docsis_test_case_21));
9929         TEST_DOCSIS_COUNT(test_docsis_proto_downlink(22, &docsis_test_case_22));
9930         TEST_DOCSIS_COUNT(test_docsis_proto_downlink(23, &docsis_test_case_23));
9931         TEST_DOCSIS_COUNT(test_docsis_proto_downlink(24, &docsis_test_case_24));
9932         TEST_DOCSIS_COUNT(test_docsis_proto_downlink(25, &docsis_test_case_25));
9933         TEST_DOCSIS_COUNT(test_docsis_proto_downlink(26, &docsis_test_case_26));
9934
9935         if (f)
9936                 printf("## %s: %d passed out of %d (%d skipped)\n",
9937                         __func__, p, n, s);
9938
9939         return f;
9940 };
9941
9942 static int
9943 test_DOCSIS_PROTO_all(void)
9944 {
9945         struct crypto_testsuite_params *ts_params = &testsuite_params;
9946         struct crypto_unittest_params *ut_params = &unittest_params;
9947         struct rte_cryptodev_info dev_info;
9948         int status;
9949
9950         rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
9951         uint64_t feat_flags = dev_info.feature_flags;
9952
9953         if (!(feat_flags & RTE_CRYPTODEV_FF_SECURITY))
9954                 return TEST_SKIPPED;
9955
9956         /* Set action type */
9957         ut_params->type = gbl_action_type == RTE_SECURITY_ACTION_TYPE_NONE ?
9958                 RTE_SECURITY_ACTION_TYPE_LOOKASIDE_PROTOCOL :
9959                 gbl_action_type;
9960
9961         if (security_proto_supported(ut_params->type,
9962                         RTE_SECURITY_PROTOCOL_DOCSIS) < 0)
9963                 return TEST_SKIPPED;
9964
9965         status = test_DOCSIS_PROTO_uplink_all();
9966         status += test_DOCSIS_PROTO_downlink_all();
9967
9968         if (status)
9969                 return TEST_FAILED;
9970         else
9971                 return TEST_SUCCESS;
9972 }
9973 #endif
9974
9975 static int
9976 test_AES_GCM_authenticated_encryption_test_case_1(void)
9977 {
9978         return test_authenticated_encryption(&gcm_test_case_1);
9979 }
9980
9981 static int
9982 test_AES_GCM_authenticated_encryption_test_case_2(void)
9983 {
9984         return test_authenticated_encryption(&gcm_test_case_2);
9985 }
9986
9987 static int
9988 test_AES_GCM_authenticated_encryption_test_case_3(void)
9989 {
9990         return test_authenticated_encryption(&gcm_test_case_3);
9991 }
9992
9993 static int
9994 test_AES_GCM_authenticated_encryption_test_case_4(void)
9995 {
9996         return test_authenticated_encryption(&gcm_test_case_4);
9997 }
9998
9999 static int
10000 test_AES_GCM_authenticated_encryption_test_case_5(void)
10001 {
10002         return test_authenticated_encryption(&gcm_test_case_5);
10003 }
10004
10005 static int
10006 test_AES_GCM_authenticated_encryption_test_case_6(void)
10007 {
10008         return test_authenticated_encryption(&gcm_test_case_6);
10009 }
10010
10011 static int
10012 test_AES_GCM_authenticated_encryption_test_case_7(void)
10013 {
10014         return test_authenticated_encryption(&gcm_test_case_7);
10015 }
10016
10017 static int
10018 test_AES_GCM_authenticated_encryption_test_case_8(void)
10019 {
10020         return test_authenticated_encryption(&gcm_test_case_8);
10021 }
10022
10023 static int
10024 test_AES_GCM_J0_authenticated_encryption_test_case_1(void)
10025 {
10026         return test_authenticated_encryption(&gcm_J0_test_case_1);
10027 }
10028
10029 static int
10030 test_AES_GCM_auth_encryption_test_case_192_1(void)
10031 {
10032         return test_authenticated_encryption(&gcm_test_case_192_1);
10033 }
10034
10035 static int
10036 test_AES_GCM_auth_encryption_test_case_192_2(void)
10037 {
10038         return test_authenticated_encryption(&gcm_test_case_192_2);
10039 }
10040
10041 static int
10042 test_AES_GCM_auth_encryption_test_case_192_3(void)
10043 {
10044         return test_authenticated_encryption(&gcm_test_case_192_3);
10045 }
10046
10047 static int
10048 test_AES_GCM_auth_encryption_test_case_192_4(void)
10049 {
10050         return test_authenticated_encryption(&gcm_test_case_192_4);
10051 }
10052
10053 static int
10054 test_AES_GCM_auth_encryption_test_case_192_5(void)
10055 {
10056         return test_authenticated_encryption(&gcm_test_case_192_5);
10057 }
10058
10059 static int
10060 test_AES_GCM_auth_encryption_test_case_192_6(void)
10061 {
10062         return test_authenticated_encryption(&gcm_test_case_192_6);
10063 }
10064
10065 static int
10066 test_AES_GCM_auth_encryption_test_case_192_7(void)
10067 {
10068         return test_authenticated_encryption(&gcm_test_case_192_7);
10069 }
10070
10071 static int
10072 test_AES_GCM_auth_encryption_test_case_256_1(void)
10073 {
10074         return test_authenticated_encryption(&gcm_test_case_256_1);
10075 }
10076
10077 static int
10078 test_AES_GCM_auth_encryption_test_case_256_2(void)
10079 {
10080         return test_authenticated_encryption(&gcm_test_case_256_2);
10081 }
10082
10083 static int
10084 test_AES_GCM_auth_encryption_test_case_256_3(void)
10085 {
10086         return test_authenticated_encryption(&gcm_test_case_256_3);
10087 }
10088
10089 static int
10090 test_AES_GCM_auth_encryption_test_case_256_4(void)
10091 {
10092         return test_authenticated_encryption(&gcm_test_case_256_4);
10093 }
10094
10095 static int
10096 test_AES_GCM_auth_encryption_test_case_256_5(void)
10097 {
10098         return test_authenticated_encryption(&gcm_test_case_256_5);
10099 }
10100
10101 static int
10102 test_AES_GCM_auth_encryption_test_case_256_6(void)
10103 {
10104         return test_authenticated_encryption(&gcm_test_case_256_6);
10105 }
10106
10107 static int
10108 test_AES_GCM_auth_encryption_test_case_256_7(void)
10109 {
10110         return test_authenticated_encryption(&gcm_test_case_256_7);
10111 }
10112
10113 static int
10114 test_AES_GCM_auth_encryption_test_case_aad_1(void)
10115 {
10116         return test_authenticated_encryption(&gcm_test_case_aad_1);
10117 }
10118
10119 static int
10120 test_AES_GCM_auth_encryption_test_case_aad_2(void)
10121 {
10122         return test_authenticated_encryption(&gcm_test_case_aad_2);
10123 }
10124
10125 static int
10126 test_AES_GCM_auth_encryption_fail_iv_corrupt(void)
10127 {
10128         struct aead_test_data tdata;
10129         int res;
10130
10131         RTE_LOG(INFO, USER1, "This is a negative test, errors are expected\n");
10132         memcpy(&tdata, &gcm_test_case_7, sizeof(struct aead_test_data));
10133         tdata.iv.data[0] += 1;
10134         res = test_authenticated_encryption(&tdata);
10135         if (res == TEST_SKIPPED)
10136                 return res;
10137         TEST_ASSERT_EQUAL(res, TEST_FAILED, "encryption not failed");
10138         return TEST_SUCCESS;
10139 }
10140
10141 static int
10142 test_AES_GCM_auth_encryption_fail_in_data_corrupt(void)
10143 {
10144         struct aead_test_data tdata;
10145         int res;
10146
10147         RTE_LOG(INFO, USER1, "This is a negative test, errors are expected\n");
10148         memcpy(&tdata, &gcm_test_case_7, sizeof(struct aead_test_data));
10149         tdata.plaintext.data[0] += 1;
10150         res = test_authenticated_encryption(&tdata);
10151         if (res == TEST_SKIPPED)
10152                 return res;
10153         TEST_ASSERT_EQUAL(res, TEST_FAILED, "encryption not failed");
10154         return TEST_SUCCESS;
10155 }
10156
10157 static int
10158 test_AES_GCM_auth_encryption_fail_out_data_corrupt(void)
10159 {
10160         struct aead_test_data tdata;
10161         int res;
10162
10163         RTE_LOG(INFO, USER1, "This is a negative test, errors are expected\n");
10164         memcpy(&tdata, &gcm_test_case_7, sizeof(struct aead_test_data));
10165         tdata.ciphertext.data[0] += 1;
10166         res = test_authenticated_encryption(&tdata);
10167         if (res == TEST_SKIPPED)
10168                 return res;
10169         TEST_ASSERT_EQUAL(res, TEST_FAILED, "encryption not failed");
10170         return TEST_SUCCESS;
10171 }
10172
10173 static int
10174 test_AES_GCM_auth_encryption_fail_aad_len_corrupt(void)
10175 {
10176         struct aead_test_data tdata;
10177         int res;
10178
10179         RTE_LOG(INFO, USER1, "This is a negative test, errors are expected\n");
10180         memcpy(&tdata, &gcm_test_case_7, sizeof(struct aead_test_data));
10181         tdata.aad.len += 1;
10182         res = test_authenticated_encryption(&tdata);
10183         if (res == TEST_SKIPPED)
10184                 return res;
10185         TEST_ASSERT_EQUAL(res, TEST_FAILED, "encryption not failed");
10186         return TEST_SUCCESS;
10187 }
10188
10189 static int
10190 test_AES_GCM_auth_encryption_fail_aad_corrupt(void)
10191 {
10192         struct aead_test_data tdata;
10193         uint8_t aad[gcm_test_case_7.aad.len];
10194         int res;
10195
10196         RTE_LOG(INFO, USER1, "This is a negative test, errors are expected\n");
10197         memcpy(&tdata, &gcm_test_case_7, sizeof(struct aead_test_data));
10198         memcpy(aad, gcm_test_case_7.aad.data, gcm_test_case_7.aad.len);
10199         aad[0] += 1;
10200         tdata.aad.data = aad;
10201         res = test_authenticated_encryption(&tdata);
10202         if (res == TEST_SKIPPED)
10203                 return res;
10204         TEST_ASSERT_EQUAL(res, TEST_FAILED, "encryption not failed");
10205         return TEST_SUCCESS;
10206 }
10207
10208 static int
10209 test_AES_GCM_auth_encryption_fail_tag_corrupt(void)
10210 {
10211         struct aead_test_data tdata;
10212         int res;
10213
10214         RTE_LOG(INFO, USER1, "This is a negative test, errors are expected\n");
10215         memcpy(&tdata, &gcm_test_case_7, sizeof(struct aead_test_data));
10216         tdata.auth_tag.data[0] += 1;
10217         res = test_authenticated_encryption(&tdata);
10218         if (res == TEST_SKIPPED)
10219                 return res;
10220         TEST_ASSERT_EQUAL(res, TEST_FAILED, "encryption not failed");
10221         return TEST_SUCCESS;
10222 }
10223
10224 static int
10225 test_authenticated_decryption(const struct aead_test_data *tdata)
10226 {
10227         struct crypto_testsuite_params *ts_params = &testsuite_params;
10228         struct crypto_unittest_params *ut_params = &unittest_params;
10229
10230         int retval;
10231         uint8_t *plaintext;
10232         uint32_t i;
10233         struct rte_cryptodev_info dev_info;
10234
10235         rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
10236         uint64_t feat_flags = dev_info.feature_flags;
10237
10238         if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
10239                         (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
10240                 printf("Device doesn't support RAW data-path APIs.\n");
10241                 return TEST_SKIPPED;
10242         }
10243
10244         /* Verify the capabilities */
10245         struct rte_cryptodev_sym_capability_idx cap_idx;
10246         const struct rte_cryptodev_symmetric_capability *capability;
10247         cap_idx.type = RTE_CRYPTO_SYM_XFORM_AEAD;
10248         cap_idx.algo.aead = tdata->algo;
10249         capability = rte_cryptodev_sym_capability_get(
10250                         ts_params->valid_devs[0], &cap_idx);
10251         if (capability == NULL)
10252                 return TEST_SKIPPED;
10253         if (rte_cryptodev_sym_capability_check_aead(
10254                         capability, tdata->key.len, tdata->auth_tag.len,
10255                         tdata->aad.len, tdata->iv.len))
10256                 return TEST_SKIPPED;
10257
10258         /* Create AEAD session */
10259         retval = create_aead_session(ts_params->valid_devs[0],
10260                         tdata->algo,
10261                         RTE_CRYPTO_AEAD_OP_DECRYPT,
10262                         tdata->key.data, tdata->key.len,
10263                         tdata->aad.len, tdata->auth_tag.len,
10264                         tdata->iv.len);
10265         if (retval < 0)
10266                 return retval;
10267
10268         /* alloc mbuf and set payload */
10269         if (tdata->aad.len > MBUF_SIZE) {
10270                 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->large_mbuf_pool);
10271                 /* Populate full size of add data */
10272                 for (i = 32; i < MAX_AAD_LENGTH; i += 32)
10273                         memcpy(&tdata->aad.data[i], &tdata->aad.data[0], 32);
10274         } else
10275                 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
10276
10277         memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
10278                         rte_pktmbuf_tailroom(ut_params->ibuf));
10279
10280         /* Create AEAD operation */
10281         retval = create_aead_operation(RTE_CRYPTO_AEAD_OP_DECRYPT, tdata);
10282         if (retval < 0)
10283                 return retval;
10284
10285         rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
10286
10287         ut_params->op->sym->m_src = ut_params->ibuf;
10288
10289         /* Process crypto operation */
10290         if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
10291                 process_cpu_aead_op(ts_params->valid_devs[0], ut_params->op);
10292         else if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
10293                 process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
10294                                 ut_params->op, 0, 0, 0, 0);
10295         else
10296                 TEST_ASSERT_NOT_NULL(
10297                         process_crypto_request(ts_params->valid_devs[0],
10298                         ut_params->op), "failed to process sym crypto op");
10299
10300         TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
10301                         "crypto op processing failed");
10302
10303         if (ut_params->op->sym->m_dst)
10304                 plaintext = rte_pktmbuf_mtod(ut_params->op->sym->m_dst,
10305                                 uint8_t *);
10306         else
10307                 plaintext = rte_pktmbuf_mtod_offset(ut_params->op->sym->m_src,
10308                                 uint8_t *,
10309                                 ut_params->op->sym->cipher.data.offset);
10310
10311         debug_hexdump(stdout, "plaintext:", plaintext, tdata->ciphertext.len);
10312
10313         /* Validate obuf */
10314         TEST_ASSERT_BUFFERS_ARE_EQUAL(
10315                         plaintext,
10316                         tdata->plaintext.data,
10317                         tdata->plaintext.len,
10318                         "Plaintext data not as expected");
10319
10320         TEST_ASSERT_EQUAL(ut_params->op->status,
10321                         RTE_CRYPTO_OP_STATUS_SUCCESS,
10322                         "Authentication failed");
10323
10324         return 0;
10325 }
10326
10327 static int
10328 test_AES_GCM_authenticated_decryption_test_case_1(void)
10329 {
10330         return test_authenticated_decryption(&gcm_test_case_1);
10331 }
10332
10333 static int
10334 test_AES_GCM_authenticated_decryption_test_case_2(void)
10335 {
10336         return test_authenticated_decryption(&gcm_test_case_2);
10337 }
10338
10339 static int
10340 test_AES_GCM_authenticated_decryption_test_case_3(void)
10341 {
10342         return test_authenticated_decryption(&gcm_test_case_3);
10343 }
10344
10345 static int
10346 test_AES_GCM_authenticated_decryption_test_case_4(void)
10347 {
10348         return test_authenticated_decryption(&gcm_test_case_4);
10349 }
10350
10351 static int
10352 test_AES_GCM_authenticated_decryption_test_case_5(void)
10353 {
10354         return test_authenticated_decryption(&gcm_test_case_5);
10355 }
10356
10357 static int
10358 test_AES_GCM_authenticated_decryption_test_case_6(void)
10359 {
10360         return test_authenticated_decryption(&gcm_test_case_6);
10361 }
10362
10363 static int
10364 test_AES_GCM_authenticated_decryption_test_case_7(void)
10365 {
10366         return test_authenticated_decryption(&gcm_test_case_7);
10367 }
10368
10369 static int
10370 test_AES_GCM_authenticated_decryption_test_case_8(void)
10371 {
10372         return test_authenticated_decryption(&gcm_test_case_8);
10373 }
10374
10375 static int
10376 test_AES_GCM_J0_authenticated_decryption_test_case_1(void)
10377 {
10378         return test_authenticated_decryption(&gcm_J0_test_case_1);
10379 }
10380
10381 static int
10382 test_AES_GCM_auth_decryption_test_case_192_1(void)
10383 {
10384         return test_authenticated_decryption(&gcm_test_case_192_1);
10385 }
10386
10387 static int
10388 test_AES_GCM_auth_decryption_test_case_192_2(void)
10389 {
10390         return test_authenticated_decryption(&gcm_test_case_192_2);
10391 }
10392
10393 static int
10394 test_AES_GCM_auth_decryption_test_case_192_3(void)
10395 {
10396         return test_authenticated_decryption(&gcm_test_case_192_3);
10397 }
10398
10399 static int
10400 test_AES_GCM_auth_decryption_test_case_192_4(void)
10401 {
10402         return test_authenticated_decryption(&gcm_test_case_192_4);
10403 }
10404
10405 static int
10406 test_AES_GCM_auth_decryption_test_case_192_5(void)
10407 {
10408         return test_authenticated_decryption(&gcm_test_case_192_5);
10409 }
10410
10411 static int
10412 test_AES_GCM_auth_decryption_test_case_192_6(void)
10413 {
10414         return test_authenticated_decryption(&gcm_test_case_192_6);
10415 }
10416
10417 static int
10418 test_AES_GCM_auth_decryption_test_case_192_7(void)
10419 {
10420         return test_authenticated_decryption(&gcm_test_case_192_7);
10421 }
10422
10423 static int
10424 test_AES_GCM_auth_decryption_test_case_256_1(void)
10425 {
10426         return test_authenticated_decryption(&gcm_test_case_256_1);
10427 }
10428
10429 static int
10430 test_AES_GCM_auth_decryption_test_case_256_2(void)
10431 {
10432         return test_authenticated_decryption(&gcm_test_case_256_2);
10433 }
10434
10435 static int
10436 test_AES_GCM_auth_decryption_test_case_256_3(void)
10437 {
10438         return test_authenticated_decryption(&gcm_test_case_256_3);
10439 }
10440
10441 static int
10442 test_AES_GCM_auth_decryption_test_case_256_4(void)
10443 {
10444         return test_authenticated_decryption(&gcm_test_case_256_4);
10445 }
10446
10447 static int
10448 test_AES_GCM_auth_decryption_test_case_256_5(void)
10449 {
10450         return test_authenticated_decryption(&gcm_test_case_256_5);
10451 }
10452
10453 static int
10454 test_AES_GCM_auth_decryption_test_case_256_6(void)
10455 {
10456         return test_authenticated_decryption(&gcm_test_case_256_6);
10457 }
10458
10459 static int
10460 test_AES_GCM_auth_decryption_test_case_256_7(void)
10461 {
10462         return test_authenticated_decryption(&gcm_test_case_256_7);
10463 }
10464
10465 static int
10466 test_AES_GCM_auth_decryption_test_case_aad_1(void)
10467 {
10468         return test_authenticated_decryption(&gcm_test_case_aad_1);
10469 }
10470
10471 static int
10472 test_AES_GCM_auth_decryption_test_case_aad_2(void)
10473 {
10474         return test_authenticated_decryption(&gcm_test_case_aad_2);
10475 }
10476
10477 static int
10478 test_AES_GCM_auth_decryption_fail_iv_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.iv.data[0] += 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_in_data_corrupt(void)
10494 {
10495         struct aead_test_data tdata;
10496         int res;
10497
10498         RTE_LOG(INFO, USER1, "This is a negative test, errors are expected\n");
10499         memcpy(&tdata, &gcm_test_case_7, sizeof(struct aead_test_data));
10500         tdata.plaintext.data[0] += 1;
10501         res = test_authenticated_decryption(&tdata);
10502         if (res == TEST_SKIPPED)
10503                 return res;
10504         TEST_ASSERT_EQUAL(res, TEST_FAILED, "decryption not failed");
10505         return TEST_SUCCESS;
10506 }
10507
10508 static int
10509 test_AES_GCM_auth_decryption_fail_out_data_corrupt(void)
10510 {
10511         struct aead_test_data tdata;
10512         int res;
10513
10514         memcpy(&tdata, &gcm_test_case_7, sizeof(struct aead_test_data));
10515         tdata.ciphertext.data[0] += 1;
10516         res = test_authenticated_decryption(&tdata);
10517         if (res == TEST_SKIPPED)
10518                 return res;
10519         TEST_ASSERT_EQUAL(res, TEST_FAILED, "decryption not failed");
10520         return TEST_SUCCESS;
10521 }
10522
10523 static int
10524 test_AES_GCM_auth_decryption_fail_aad_len_corrupt(void)
10525 {
10526         struct aead_test_data tdata;
10527         int res;
10528
10529         memcpy(&tdata, &gcm_test_case_7, sizeof(struct aead_test_data));
10530         tdata.aad.len += 1;
10531         res = test_authenticated_decryption(&tdata);
10532         if (res == TEST_SKIPPED)
10533                 return res;
10534         TEST_ASSERT_EQUAL(res, TEST_FAILED, "decryption not failed");
10535         return TEST_SUCCESS;
10536 }
10537
10538 static int
10539 test_AES_GCM_auth_decryption_fail_aad_corrupt(void)
10540 {
10541         struct aead_test_data tdata;
10542         uint8_t aad[gcm_test_case_7.aad.len];
10543         int res;
10544
10545         memcpy(&tdata, &gcm_test_case_7, sizeof(struct aead_test_data));
10546         memcpy(aad, gcm_test_case_7.aad.data, gcm_test_case_7.aad.len);
10547         aad[0] += 1;
10548         tdata.aad.data = aad;
10549         res = test_authenticated_decryption(&tdata);
10550         if (res == TEST_SKIPPED)
10551                 return res;
10552         TEST_ASSERT_EQUAL(res, TEST_FAILED, "decryption not failed");
10553         return TEST_SUCCESS;
10554 }
10555
10556 static int
10557 test_AES_GCM_auth_decryption_fail_tag_corrupt(void)
10558 {
10559         struct aead_test_data tdata;
10560         int res;
10561
10562         memcpy(&tdata, &gcm_test_case_7, sizeof(struct aead_test_data));
10563         tdata.auth_tag.data[0] += 1;
10564         res = test_authenticated_decryption(&tdata);
10565         if (res == TEST_SKIPPED)
10566                 return res;
10567         TEST_ASSERT_EQUAL(res, TEST_FAILED, "authentication not failed");
10568         return TEST_SUCCESS;
10569 }
10570
10571 static int
10572 test_authenticated_encryption_oop(const struct aead_test_data *tdata)
10573 {
10574         struct crypto_testsuite_params *ts_params = &testsuite_params;
10575         struct crypto_unittest_params *ut_params = &unittest_params;
10576
10577         int retval;
10578         uint8_t *ciphertext, *auth_tag;
10579         uint16_t plaintext_pad_len;
10580         struct rte_cryptodev_info dev_info;
10581
10582         /* Verify the capabilities */
10583         struct rte_cryptodev_sym_capability_idx cap_idx;
10584         cap_idx.type = RTE_CRYPTO_SYM_XFORM_AEAD;
10585         cap_idx.algo.aead = tdata->algo;
10586         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
10587                         &cap_idx) == NULL)
10588                 return TEST_SKIPPED;
10589
10590         rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
10591         uint64_t feat_flags = dev_info.feature_flags;
10592
10593         if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
10594                         (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP)))
10595                 return TEST_SKIPPED;
10596
10597         /* not supported with CPU crypto */
10598         if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
10599                 return TEST_SKIPPED;
10600
10601         /* Create AEAD session */
10602         retval = create_aead_session(ts_params->valid_devs[0],
10603                         tdata->algo,
10604                         RTE_CRYPTO_AEAD_OP_ENCRYPT,
10605                         tdata->key.data, tdata->key.len,
10606                         tdata->aad.len, tdata->auth_tag.len,
10607                         tdata->iv.len);
10608         if (retval < 0)
10609                 return retval;
10610
10611         ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
10612         ut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
10613
10614         /* clear mbuf payload */
10615         memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
10616                         rte_pktmbuf_tailroom(ut_params->ibuf));
10617         memset(rte_pktmbuf_mtod(ut_params->obuf, uint8_t *), 0,
10618                         rte_pktmbuf_tailroom(ut_params->obuf));
10619
10620         /* Create AEAD operation */
10621         retval = create_aead_operation(RTE_CRYPTO_AEAD_OP_ENCRYPT, tdata);
10622         if (retval < 0)
10623                 return retval;
10624
10625         rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
10626
10627         ut_params->op->sym->m_src = ut_params->ibuf;
10628         ut_params->op->sym->m_dst = ut_params->obuf;
10629
10630         /* Process crypto operation */
10631         if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
10632                 process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
10633                         ut_params->op, 0, 0, 0, 0);
10634         else
10635                 TEST_ASSERT_NOT_NULL(process_crypto_request(ts_params->valid_devs[0],
10636                         ut_params->op), "failed to process sym crypto op");
10637
10638         TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
10639                         "crypto op processing failed");
10640
10641         plaintext_pad_len = RTE_ALIGN_CEIL(tdata->plaintext.len, 16);
10642
10643         ciphertext = rte_pktmbuf_mtod_offset(ut_params->obuf, uint8_t *,
10644                         ut_params->op->sym->cipher.data.offset);
10645         auth_tag = ciphertext + plaintext_pad_len;
10646
10647         debug_hexdump(stdout, "ciphertext:", ciphertext, tdata->ciphertext.len);
10648         debug_hexdump(stdout, "auth tag:", auth_tag, tdata->auth_tag.len);
10649
10650         /* Validate obuf */
10651         TEST_ASSERT_BUFFERS_ARE_EQUAL(
10652                         ciphertext,
10653                         tdata->ciphertext.data,
10654                         tdata->ciphertext.len,
10655                         "Ciphertext data not as expected");
10656
10657         TEST_ASSERT_BUFFERS_ARE_EQUAL(
10658                         auth_tag,
10659                         tdata->auth_tag.data,
10660                         tdata->auth_tag.len,
10661                         "Generated auth tag not as expected");
10662
10663         return 0;
10664
10665 }
10666
10667 static int
10668 test_AES_GCM_authenticated_encryption_oop_test_case_1(void)
10669 {
10670         return test_authenticated_encryption_oop(&gcm_test_case_5);
10671 }
10672
10673 static int
10674 test_authenticated_decryption_oop(const struct aead_test_data *tdata)
10675 {
10676         struct crypto_testsuite_params *ts_params = &testsuite_params;
10677         struct crypto_unittest_params *ut_params = &unittest_params;
10678
10679         int retval;
10680         uint8_t *plaintext;
10681         struct rte_cryptodev_info dev_info;
10682
10683         rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
10684         uint64_t feat_flags = dev_info.feature_flags;
10685
10686         /* Verify the capabilities */
10687         struct rte_cryptodev_sym_capability_idx cap_idx;
10688         cap_idx.type = RTE_CRYPTO_SYM_XFORM_AEAD;
10689         cap_idx.algo.aead = tdata->algo;
10690         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
10691                         &cap_idx) == NULL)
10692                 return TEST_SKIPPED;
10693
10694         /* not supported with CPU crypto and raw data-path APIs*/
10695         if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO ||
10696                         global_api_test_type == CRYPTODEV_RAW_API_TEST)
10697                 return TEST_SKIPPED;
10698
10699         if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
10700                         (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
10701                 printf("Device does not support RAW data-path APIs.\n");
10702                 return TEST_SKIPPED;
10703         }
10704
10705         /* Create AEAD session */
10706         retval = create_aead_session(ts_params->valid_devs[0],
10707                         tdata->algo,
10708                         RTE_CRYPTO_AEAD_OP_DECRYPT,
10709                         tdata->key.data, tdata->key.len,
10710                         tdata->aad.len, tdata->auth_tag.len,
10711                         tdata->iv.len);
10712         if (retval < 0)
10713                 return retval;
10714
10715         /* alloc mbuf and set payload */
10716         ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
10717         ut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
10718
10719         memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
10720                         rte_pktmbuf_tailroom(ut_params->ibuf));
10721         memset(rte_pktmbuf_mtod(ut_params->obuf, uint8_t *), 0,
10722                         rte_pktmbuf_tailroom(ut_params->obuf));
10723
10724         /* Create AEAD operation */
10725         retval = create_aead_operation(RTE_CRYPTO_AEAD_OP_DECRYPT, tdata);
10726         if (retval < 0)
10727                 return retval;
10728
10729         rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
10730
10731         ut_params->op->sym->m_src = ut_params->ibuf;
10732         ut_params->op->sym->m_dst = ut_params->obuf;
10733
10734         /* Process crypto operation */
10735         if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
10736                 process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
10737                                 ut_params->op, 0, 0, 0, 0);
10738         else
10739                 TEST_ASSERT_NOT_NULL(process_crypto_request(ts_params->valid_devs[0],
10740                         ut_params->op), "failed to process sym crypto op");
10741
10742         TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
10743                         "crypto op processing failed");
10744
10745         plaintext = rte_pktmbuf_mtod_offset(ut_params->obuf, uint8_t *,
10746                         ut_params->op->sym->cipher.data.offset);
10747
10748         debug_hexdump(stdout, "plaintext:", plaintext, tdata->ciphertext.len);
10749
10750         /* Validate obuf */
10751         TEST_ASSERT_BUFFERS_ARE_EQUAL(
10752                         plaintext,
10753                         tdata->plaintext.data,
10754                         tdata->plaintext.len,
10755                         "Plaintext data not as expected");
10756
10757         TEST_ASSERT_EQUAL(ut_params->op->status,
10758                         RTE_CRYPTO_OP_STATUS_SUCCESS,
10759                         "Authentication failed");
10760         return 0;
10761 }
10762
10763 static int
10764 test_AES_GCM_authenticated_decryption_oop_test_case_1(void)
10765 {
10766         return test_authenticated_decryption_oop(&gcm_test_case_5);
10767 }
10768
10769 static int
10770 test_authenticated_encryption_sessionless(
10771                 const struct aead_test_data *tdata)
10772 {
10773         struct crypto_testsuite_params *ts_params = &testsuite_params;
10774         struct crypto_unittest_params *ut_params = &unittest_params;
10775
10776         int retval;
10777         uint8_t *ciphertext, *auth_tag;
10778         uint16_t plaintext_pad_len;
10779         uint8_t key[tdata->key.len + 1];
10780         struct rte_cryptodev_info dev_info;
10781
10782         rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
10783         uint64_t feat_flags = dev_info.feature_flags;
10784
10785         if (!(feat_flags & RTE_CRYPTODEV_FF_SYM_SESSIONLESS)) {
10786                 printf("Device doesn't support Sessionless ops.\n");
10787                 return TEST_SKIPPED;
10788         }
10789
10790         /* not supported with CPU crypto */
10791         if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
10792                 return TEST_SKIPPED;
10793
10794         /* Verify the capabilities */
10795         struct rte_cryptodev_sym_capability_idx cap_idx;
10796         cap_idx.type = RTE_CRYPTO_SYM_XFORM_AEAD;
10797         cap_idx.algo.aead = tdata->algo;
10798         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
10799                         &cap_idx) == NULL)
10800                 return TEST_SKIPPED;
10801
10802         ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
10803
10804         /* clear mbuf payload */
10805         memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
10806                         rte_pktmbuf_tailroom(ut_params->ibuf));
10807
10808         /* Create AEAD operation */
10809         retval = create_aead_operation(RTE_CRYPTO_AEAD_OP_ENCRYPT, tdata);
10810         if (retval < 0)
10811                 return retval;
10812
10813         /* Create GCM xform */
10814         memcpy(key, tdata->key.data, tdata->key.len);
10815         retval = create_aead_xform(ut_params->op,
10816                         tdata->algo,
10817                         RTE_CRYPTO_AEAD_OP_ENCRYPT,
10818                         key, tdata->key.len,
10819                         tdata->aad.len, tdata->auth_tag.len,
10820                         tdata->iv.len);
10821         if (retval < 0)
10822                 return retval;
10823
10824         ut_params->op->sym->m_src = ut_params->ibuf;
10825
10826         TEST_ASSERT_EQUAL(ut_params->op->sess_type,
10827                         RTE_CRYPTO_OP_SESSIONLESS,
10828                         "crypto op session type not sessionless");
10829
10830         /* Process crypto operation */
10831         TEST_ASSERT_NOT_NULL(process_crypto_request(ts_params->valid_devs[0],
10832                         ut_params->op), "failed to process sym crypto op");
10833
10834         TEST_ASSERT_NOT_NULL(ut_params->op, "failed crypto process");
10835
10836         TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
10837                         "crypto op status not success");
10838
10839         plaintext_pad_len = RTE_ALIGN_CEIL(tdata->plaintext.len, 16);
10840
10841         ciphertext = rte_pktmbuf_mtod_offset(ut_params->ibuf, uint8_t *,
10842                         ut_params->op->sym->cipher.data.offset);
10843         auth_tag = ciphertext + plaintext_pad_len;
10844
10845         debug_hexdump(stdout, "ciphertext:", ciphertext, tdata->ciphertext.len);
10846         debug_hexdump(stdout, "auth tag:", auth_tag, tdata->auth_tag.len);
10847
10848         /* Validate obuf */
10849         TEST_ASSERT_BUFFERS_ARE_EQUAL(
10850                         ciphertext,
10851                         tdata->ciphertext.data,
10852                         tdata->ciphertext.len,
10853                         "Ciphertext data not as expected");
10854
10855         TEST_ASSERT_BUFFERS_ARE_EQUAL(
10856                         auth_tag,
10857                         tdata->auth_tag.data,
10858                         tdata->auth_tag.len,
10859                         "Generated auth tag not as expected");
10860
10861         return 0;
10862
10863 }
10864
10865 static int
10866 test_AES_GCM_authenticated_encryption_sessionless_test_case_1(void)
10867 {
10868         return test_authenticated_encryption_sessionless(
10869                         &gcm_test_case_5);
10870 }
10871
10872 static int
10873 test_authenticated_decryption_sessionless(
10874                 const struct aead_test_data *tdata)
10875 {
10876         struct crypto_testsuite_params *ts_params = &testsuite_params;
10877         struct crypto_unittest_params *ut_params = &unittest_params;
10878
10879         int retval;
10880         uint8_t *plaintext;
10881         uint8_t key[tdata->key.len + 1];
10882         struct rte_cryptodev_info dev_info;
10883
10884         rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
10885         uint64_t feat_flags = dev_info.feature_flags;
10886
10887         if (!(feat_flags & RTE_CRYPTODEV_FF_SYM_SESSIONLESS)) {
10888                 printf("Device doesn't support Sessionless ops.\n");
10889                 return TEST_SKIPPED;
10890         }
10891
10892         if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
10893                         (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
10894                 printf("Device doesn't support RAW data-path APIs.\n");
10895                 return TEST_SKIPPED;
10896         }
10897
10898         /* not supported with CPU crypto */
10899         if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
10900                 return TEST_SKIPPED;
10901
10902         /* Verify the capabilities */
10903         struct rte_cryptodev_sym_capability_idx cap_idx;
10904         cap_idx.type = RTE_CRYPTO_SYM_XFORM_AEAD;
10905         cap_idx.algo.aead = tdata->algo;
10906         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
10907                         &cap_idx) == NULL)
10908                 return TEST_SKIPPED;
10909
10910         /* alloc mbuf and set payload */
10911         ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
10912
10913         memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
10914                         rte_pktmbuf_tailroom(ut_params->ibuf));
10915
10916         /* Create AEAD operation */
10917         retval = create_aead_operation(RTE_CRYPTO_AEAD_OP_DECRYPT, tdata);
10918         if (retval < 0)
10919                 return retval;
10920
10921         /* Create AEAD xform */
10922         memcpy(key, tdata->key.data, tdata->key.len);
10923         retval = create_aead_xform(ut_params->op,
10924                         tdata->algo,
10925                         RTE_CRYPTO_AEAD_OP_DECRYPT,
10926                         key, tdata->key.len,
10927                         tdata->aad.len, tdata->auth_tag.len,
10928                         tdata->iv.len);
10929         if (retval < 0)
10930                 return retval;
10931
10932         ut_params->op->sym->m_src = ut_params->ibuf;
10933
10934         TEST_ASSERT_EQUAL(ut_params->op->sess_type,
10935                         RTE_CRYPTO_OP_SESSIONLESS,
10936                         "crypto op session type not sessionless");
10937
10938         /* Process crypto operation */
10939         if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
10940                 process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
10941                                 ut_params->op, 0, 0, 0, 0);
10942         else
10943                 TEST_ASSERT_NOT_NULL(process_crypto_request(
10944                         ts_params->valid_devs[0], ut_params->op),
10945                                 "failed to process sym crypto op");
10946
10947         TEST_ASSERT_NOT_NULL(ut_params->op, "failed crypto process");
10948
10949         TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
10950                         "crypto op status not success");
10951
10952         plaintext = rte_pktmbuf_mtod_offset(ut_params->ibuf, uint8_t *,
10953                         ut_params->op->sym->cipher.data.offset);
10954
10955         debug_hexdump(stdout, "plaintext:", plaintext, tdata->ciphertext.len);
10956
10957         /* Validate obuf */
10958         TEST_ASSERT_BUFFERS_ARE_EQUAL(
10959                         plaintext,
10960                         tdata->plaintext.data,
10961                         tdata->plaintext.len,
10962                         "Plaintext data not as expected");
10963
10964         TEST_ASSERT_EQUAL(ut_params->op->status,
10965                         RTE_CRYPTO_OP_STATUS_SUCCESS,
10966                         "Authentication failed");
10967         return 0;
10968 }
10969
10970 static int
10971 test_AES_GCM_authenticated_decryption_sessionless_test_case_1(void)
10972 {
10973         return test_authenticated_decryption_sessionless(
10974                         &gcm_test_case_5);
10975 }
10976
10977 static int
10978 test_AES_CCM_authenticated_encryption_test_case_128_1(void)
10979 {
10980         return test_authenticated_encryption(&ccm_test_case_128_1);
10981 }
10982
10983 static int
10984 test_AES_CCM_authenticated_encryption_test_case_128_2(void)
10985 {
10986         return test_authenticated_encryption(&ccm_test_case_128_2);
10987 }
10988
10989 static int
10990 test_AES_CCM_authenticated_encryption_test_case_128_3(void)
10991 {
10992         return test_authenticated_encryption(&ccm_test_case_128_3);
10993 }
10994
10995 static int
10996 test_AES_CCM_authenticated_decryption_test_case_128_1(void)
10997 {
10998         return test_authenticated_decryption(&ccm_test_case_128_1);
10999 }
11000
11001 static int
11002 test_AES_CCM_authenticated_decryption_test_case_128_2(void)
11003 {
11004         return test_authenticated_decryption(&ccm_test_case_128_2);
11005 }
11006
11007 static int
11008 test_AES_CCM_authenticated_decryption_test_case_128_3(void)
11009 {
11010         return test_authenticated_decryption(&ccm_test_case_128_3);
11011 }
11012
11013 static int
11014 test_AES_CCM_authenticated_encryption_test_case_192_1(void)
11015 {
11016         return test_authenticated_encryption(&ccm_test_case_192_1);
11017 }
11018
11019 static int
11020 test_AES_CCM_authenticated_encryption_test_case_192_2(void)
11021 {
11022         return test_authenticated_encryption(&ccm_test_case_192_2);
11023 }
11024
11025 static int
11026 test_AES_CCM_authenticated_encryption_test_case_192_3(void)
11027 {
11028         return test_authenticated_encryption(&ccm_test_case_192_3);
11029 }
11030
11031 static int
11032 test_AES_CCM_authenticated_decryption_test_case_192_1(void)
11033 {
11034         return test_authenticated_decryption(&ccm_test_case_192_1);
11035 }
11036
11037 static int
11038 test_AES_CCM_authenticated_decryption_test_case_192_2(void)
11039 {
11040         return test_authenticated_decryption(&ccm_test_case_192_2);
11041 }
11042
11043 static int
11044 test_AES_CCM_authenticated_decryption_test_case_192_3(void)
11045 {
11046         return test_authenticated_decryption(&ccm_test_case_192_3);
11047 }
11048
11049 static int
11050 test_AES_CCM_authenticated_encryption_test_case_256_1(void)
11051 {
11052         return test_authenticated_encryption(&ccm_test_case_256_1);
11053 }
11054
11055 static int
11056 test_AES_CCM_authenticated_encryption_test_case_256_2(void)
11057 {
11058         return test_authenticated_encryption(&ccm_test_case_256_2);
11059 }
11060
11061 static int
11062 test_AES_CCM_authenticated_encryption_test_case_256_3(void)
11063 {
11064         return test_authenticated_encryption(&ccm_test_case_256_3);
11065 }
11066
11067 static int
11068 test_AES_CCM_authenticated_decryption_test_case_256_1(void)
11069 {
11070         return test_authenticated_decryption(&ccm_test_case_256_1);
11071 }
11072
11073 static int
11074 test_AES_CCM_authenticated_decryption_test_case_256_2(void)
11075 {
11076         return test_authenticated_decryption(&ccm_test_case_256_2);
11077 }
11078
11079 static int
11080 test_AES_CCM_authenticated_decryption_test_case_256_3(void)
11081 {
11082         return test_authenticated_decryption(&ccm_test_case_256_3);
11083 }
11084
11085 static int
11086 test_stats(void)
11087 {
11088         struct crypto_testsuite_params *ts_params = &testsuite_params;
11089         struct rte_cryptodev_stats stats;
11090
11091         if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
11092                 return TEST_SKIPPED;
11093
11094         /* Verify the capabilities */
11095         struct rte_cryptodev_sym_capability_idx cap_idx;
11096         cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
11097         cap_idx.algo.auth = RTE_CRYPTO_AUTH_SHA1_HMAC;
11098         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
11099                         &cap_idx) == NULL)
11100                 return TEST_SKIPPED;
11101         cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
11102         cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_AES_CBC;
11103         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
11104                         &cap_idx) == NULL)
11105                 return TEST_SKIPPED;
11106
11107         if (rte_cryptodev_stats_get(ts_params->valid_devs[0], &stats)
11108                         == -ENOTSUP)
11109                 return TEST_SKIPPED;
11110
11111         rte_cryptodev_stats_reset(ts_params->valid_devs[0]);
11112         TEST_ASSERT((rte_cryptodev_stats_get(ts_params->valid_devs[0] + 600,
11113                         &stats) == -ENODEV),
11114                 "rte_cryptodev_stats_get invalid dev failed");
11115         TEST_ASSERT((rte_cryptodev_stats_get(ts_params->valid_devs[0], 0) != 0),
11116                 "rte_cryptodev_stats_get invalid Param failed");
11117
11118         /* Test expected values */
11119         test_AES_CBC_HMAC_SHA1_encrypt_digest();
11120         TEST_ASSERT_SUCCESS(rte_cryptodev_stats_get(ts_params->valid_devs[0],
11121                         &stats),
11122                 "rte_cryptodev_stats_get failed");
11123         TEST_ASSERT((stats.enqueued_count == 1),
11124                 "rte_cryptodev_stats_get returned unexpected enqueued stat");
11125         TEST_ASSERT((stats.dequeued_count == 1),
11126                 "rte_cryptodev_stats_get returned unexpected enqueued stat");
11127         TEST_ASSERT((stats.enqueue_err_count == 0),
11128                 "rte_cryptodev_stats_get returned unexpected enqueued stat");
11129         TEST_ASSERT((stats.dequeue_err_count == 0),
11130                 "rte_cryptodev_stats_get returned unexpected enqueued stat");
11131
11132         /* invalid device but should ignore and not reset device stats*/
11133         rte_cryptodev_stats_reset(ts_params->valid_devs[0] + 300);
11134         TEST_ASSERT_SUCCESS(rte_cryptodev_stats_get(ts_params->valid_devs[0],
11135                         &stats),
11136                 "rte_cryptodev_stats_get failed");
11137         TEST_ASSERT((stats.enqueued_count == 1),
11138                 "rte_cryptodev_stats_get returned unexpected enqueued stat");
11139
11140         /* check that a valid reset clears stats */
11141         rte_cryptodev_stats_reset(ts_params->valid_devs[0]);
11142         TEST_ASSERT_SUCCESS(rte_cryptodev_stats_get(ts_params->valid_devs[0],
11143                         &stats),
11144                                           "rte_cryptodev_stats_get failed");
11145         TEST_ASSERT((stats.enqueued_count == 0),
11146                 "rte_cryptodev_stats_get returned unexpected enqueued stat");
11147         TEST_ASSERT((stats.dequeued_count == 0),
11148                 "rte_cryptodev_stats_get returned unexpected enqueued stat");
11149
11150         return TEST_SUCCESS;
11151 }
11152
11153 static int MD5_HMAC_create_session(struct crypto_testsuite_params *ts_params,
11154                                    struct crypto_unittest_params *ut_params,
11155                                    enum rte_crypto_auth_operation op,
11156                                    const struct HMAC_MD5_vector *test_case)
11157 {
11158         uint8_t key[64];
11159
11160         memcpy(key, test_case->key.data, test_case->key.len);
11161
11162         ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;
11163         ut_params->auth_xform.next = NULL;
11164         ut_params->auth_xform.auth.op = op;
11165
11166         ut_params->auth_xform.auth.algo = RTE_CRYPTO_AUTH_MD5_HMAC;
11167
11168         ut_params->auth_xform.auth.digest_length = MD5_DIGEST_LEN;
11169         ut_params->auth_xform.auth.key.length = test_case->key.len;
11170         ut_params->auth_xform.auth.key.data = key;
11171
11172         ut_params->sess = rte_cryptodev_sym_session_create(
11173                         ts_params->session_mpool);
11174
11175         rte_cryptodev_sym_session_init(ts_params->valid_devs[0],
11176                         ut_params->sess, &ut_params->auth_xform,
11177                         ts_params->session_priv_mpool);
11178
11179         if (ut_params->sess == NULL)
11180                 return TEST_FAILED;
11181
11182         ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
11183
11184         memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
11185                         rte_pktmbuf_tailroom(ut_params->ibuf));
11186
11187         return 0;
11188 }
11189
11190 static int MD5_HMAC_create_op(struct crypto_unittest_params *ut_params,
11191                               const struct HMAC_MD5_vector *test_case,
11192                               uint8_t **plaintext)
11193 {
11194         uint16_t plaintext_pad_len;
11195
11196         struct rte_crypto_sym_op *sym_op = ut_params->op->sym;
11197
11198         plaintext_pad_len = RTE_ALIGN_CEIL(test_case->plaintext.len,
11199                                 16);
11200
11201         *plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
11202                         plaintext_pad_len);
11203         memcpy(*plaintext, test_case->plaintext.data,
11204                         test_case->plaintext.len);
11205
11206         sym_op->auth.digest.data = (uint8_t *)rte_pktmbuf_append(
11207                         ut_params->ibuf, MD5_DIGEST_LEN);
11208         TEST_ASSERT_NOT_NULL(sym_op->auth.digest.data,
11209                         "no room to append digest");
11210         sym_op->auth.digest.phys_addr = rte_pktmbuf_iova_offset(
11211                         ut_params->ibuf, plaintext_pad_len);
11212
11213         if (ut_params->auth_xform.auth.op == RTE_CRYPTO_AUTH_OP_VERIFY) {
11214                 rte_memcpy(sym_op->auth.digest.data, test_case->auth_tag.data,
11215                            test_case->auth_tag.len);
11216         }
11217
11218         sym_op->auth.data.offset = 0;
11219         sym_op->auth.data.length = test_case->plaintext.len;
11220
11221         rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
11222         ut_params->op->sym->m_src = ut_params->ibuf;
11223
11224         return 0;
11225 }
11226
11227 static int
11228 test_MD5_HMAC_generate(const struct HMAC_MD5_vector *test_case)
11229 {
11230         uint16_t plaintext_pad_len;
11231         uint8_t *plaintext, *auth_tag;
11232
11233         struct crypto_testsuite_params *ts_params = &testsuite_params;
11234         struct crypto_unittest_params *ut_params = &unittest_params;
11235         struct rte_cryptodev_info dev_info;
11236
11237         rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
11238         uint64_t feat_flags = dev_info.feature_flags;
11239
11240         if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
11241                         (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
11242                 printf("Device doesn't support RAW data-path APIs.\n");
11243                 return TEST_SKIPPED;
11244         }
11245
11246         /* Verify the capabilities */
11247         struct rte_cryptodev_sym_capability_idx cap_idx;
11248         cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
11249         cap_idx.algo.auth = RTE_CRYPTO_AUTH_MD5_HMAC;
11250         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
11251                         &cap_idx) == NULL)
11252                 return TEST_SKIPPED;
11253
11254         if (MD5_HMAC_create_session(ts_params, ut_params,
11255                         RTE_CRYPTO_AUTH_OP_GENERATE, test_case))
11256                 return TEST_FAILED;
11257
11258         /* Generate Crypto op data structure */
11259         ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
11260                         RTE_CRYPTO_OP_TYPE_SYMMETRIC);
11261         TEST_ASSERT_NOT_NULL(ut_params->op,
11262                         "Failed to allocate symmetric crypto operation struct");
11263
11264         plaintext_pad_len = RTE_ALIGN_CEIL(test_case->plaintext.len,
11265                                 16);
11266
11267         if (MD5_HMAC_create_op(ut_params, test_case, &plaintext))
11268                 return TEST_FAILED;
11269
11270         if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
11271                 process_cpu_crypt_auth_op(ts_params->valid_devs[0],
11272                         ut_params->op);
11273         else if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
11274                 process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
11275                                 ut_params->op, 0, 1, 0, 0);
11276         else
11277                 TEST_ASSERT_NOT_NULL(
11278                         process_crypto_request(ts_params->valid_devs[0],
11279                                 ut_params->op),
11280                                 "failed to process sym crypto op");
11281
11282         TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
11283                         "crypto op processing failed");
11284
11285         if (ut_params->op->sym->m_dst) {
11286                 auth_tag = rte_pktmbuf_mtod_offset(ut_params->op->sym->m_dst,
11287                                 uint8_t *, plaintext_pad_len);
11288         } else {
11289                 auth_tag = plaintext + plaintext_pad_len;
11290         }
11291
11292         TEST_ASSERT_BUFFERS_ARE_EQUAL(
11293                         auth_tag,
11294                         test_case->auth_tag.data,
11295                         test_case->auth_tag.len,
11296                         "HMAC_MD5 generated tag not as expected");
11297
11298         return TEST_SUCCESS;
11299 }
11300
11301 static int
11302 test_MD5_HMAC_verify(const struct HMAC_MD5_vector *test_case)
11303 {
11304         uint8_t *plaintext;
11305
11306         struct crypto_testsuite_params *ts_params = &testsuite_params;
11307         struct crypto_unittest_params *ut_params = &unittest_params;
11308         struct rte_cryptodev_info dev_info;
11309
11310         rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
11311         uint64_t feat_flags = dev_info.feature_flags;
11312
11313         if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
11314                         (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
11315                 printf("Device doesn't support RAW data-path APIs.\n");
11316                 return TEST_SKIPPED;
11317         }
11318
11319         /* Verify the capabilities */
11320         struct rte_cryptodev_sym_capability_idx cap_idx;
11321         cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
11322         cap_idx.algo.auth = RTE_CRYPTO_AUTH_MD5_HMAC;
11323         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
11324                         &cap_idx) == NULL)
11325                 return TEST_SKIPPED;
11326
11327         if (MD5_HMAC_create_session(ts_params, ut_params,
11328                         RTE_CRYPTO_AUTH_OP_VERIFY, test_case)) {
11329                 return TEST_FAILED;
11330         }
11331
11332         /* Generate Crypto op data structure */
11333         ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
11334                         RTE_CRYPTO_OP_TYPE_SYMMETRIC);
11335         TEST_ASSERT_NOT_NULL(ut_params->op,
11336                         "Failed to allocate symmetric crypto operation struct");
11337
11338         if (MD5_HMAC_create_op(ut_params, test_case, &plaintext))
11339                 return TEST_FAILED;
11340
11341         if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
11342                 process_cpu_crypt_auth_op(ts_params->valid_devs[0],
11343                         ut_params->op);
11344         else if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
11345                 process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
11346                                 ut_params->op, 0, 1, 0, 0);
11347         else
11348                 TEST_ASSERT_NOT_NULL(
11349                         process_crypto_request(ts_params->valid_devs[0],
11350                                 ut_params->op),
11351                                 "failed to process sym crypto op");
11352
11353         TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
11354                         "HMAC_MD5 crypto op processing failed");
11355
11356         return TEST_SUCCESS;
11357 }
11358
11359 static int
11360 test_MD5_HMAC_generate_case_1(void)
11361 {
11362         return test_MD5_HMAC_generate(&HMAC_MD5_test_case_1);
11363 }
11364
11365 static int
11366 test_MD5_HMAC_verify_case_1(void)
11367 {
11368         return test_MD5_HMAC_verify(&HMAC_MD5_test_case_1);
11369 }
11370
11371 static int
11372 test_MD5_HMAC_generate_case_2(void)
11373 {
11374         return test_MD5_HMAC_generate(&HMAC_MD5_test_case_2);
11375 }
11376
11377 static int
11378 test_MD5_HMAC_verify_case_2(void)
11379 {
11380         return test_MD5_HMAC_verify(&HMAC_MD5_test_case_2);
11381 }
11382
11383 static int
11384 test_multi_session(void)
11385 {
11386         struct crypto_testsuite_params *ts_params = &testsuite_params;
11387         struct crypto_unittest_params *ut_params = &unittest_params;
11388
11389         struct rte_cryptodev_info dev_info;
11390         struct rte_cryptodev_sym_session **sessions;
11391
11392         uint16_t i;
11393
11394         /* Verify the capabilities */
11395         struct rte_cryptodev_sym_capability_idx cap_idx;
11396         cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
11397         cap_idx.algo.auth = RTE_CRYPTO_AUTH_SHA512_HMAC;
11398         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
11399                         &cap_idx) == NULL)
11400                 return TEST_SKIPPED;
11401         cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
11402         cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_AES_CBC;
11403         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
11404                         &cap_idx) == NULL)
11405                 return TEST_SKIPPED;
11406
11407         test_AES_CBC_HMAC_SHA512_decrypt_create_session_params(ut_params,
11408                         aes_cbc_key, hmac_sha512_key);
11409
11410
11411         rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
11412
11413         sessions = rte_malloc(NULL,
11414                         sizeof(struct rte_cryptodev_sym_session *) *
11415                         (MAX_NB_SESSIONS + 1), 0);
11416
11417         /* Create multiple crypto sessions*/
11418         for (i = 0; i < MAX_NB_SESSIONS; i++) {
11419
11420                 sessions[i] = rte_cryptodev_sym_session_create(
11421                                 ts_params->session_mpool);
11422
11423                 rte_cryptodev_sym_session_init(ts_params->valid_devs[0],
11424                                 sessions[i], &ut_params->auth_xform,
11425                                 ts_params->session_priv_mpool);
11426                 TEST_ASSERT_NOT_NULL(sessions[i],
11427                                 "Session creation failed at session number %u",
11428                                 i);
11429
11430                 /* Attempt to send a request on each session */
11431                 TEST_ASSERT_SUCCESS( test_AES_CBC_HMAC_SHA512_decrypt_perform(
11432                         sessions[i],
11433                         ut_params,
11434                         ts_params,
11435                         catch_22_quote_2_512_bytes_AES_CBC_ciphertext,
11436                         catch_22_quote_2_512_bytes_AES_CBC_HMAC_SHA512_digest,
11437                         aes_cbc_iv),
11438                         "Failed to perform decrypt on request number %u.", i);
11439                 /* free crypto operation structure */
11440                 if (ut_params->op)
11441                         rte_crypto_op_free(ut_params->op);
11442
11443                 /*
11444                  * free mbuf - both obuf and ibuf are usually the same,
11445                  * so check if they point at the same address is necessary,
11446                  * to avoid freeing the mbuf twice.
11447                  */
11448                 if (ut_params->obuf) {
11449                         rte_pktmbuf_free(ut_params->obuf);
11450                         if (ut_params->ibuf == ut_params->obuf)
11451                                 ut_params->ibuf = 0;
11452                         ut_params->obuf = 0;
11453                 }
11454                 if (ut_params->ibuf) {
11455                         rte_pktmbuf_free(ut_params->ibuf);
11456                         ut_params->ibuf = 0;
11457                 }
11458         }
11459
11460         sessions[i] = NULL;
11461         /* Next session create should fail */
11462         rte_cryptodev_sym_session_init(ts_params->valid_devs[0],
11463                         sessions[i], &ut_params->auth_xform,
11464                         ts_params->session_priv_mpool);
11465         TEST_ASSERT_NULL(sessions[i],
11466                         "Session creation succeeded unexpectedly!");
11467
11468         for (i = 0; i < MAX_NB_SESSIONS; i++) {
11469                 rte_cryptodev_sym_session_clear(ts_params->valid_devs[0],
11470                                 sessions[i]);
11471                 rte_cryptodev_sym_session_free(sessions[i]);
11472         }
11473
11474         rte_free(sessions);
11475
11476         return TEST_SUCCESS;
11477 }
11478
11479 struct multi_session_params {
11480         struct crypto_unittest_params ut_params;
11481         uint8_t *cipher_key;
11482         uint8_t *hmac_key;
11483         const uint8_t *cipher;
11484         const uint8_t *digest;
11485         uint8_t *iv;
11486 };
11487
11488 #define MB_SESSION_NUMBER 3
11489
11490 static int
11491 test_multi_session_random_usage(void)
11492 {
11493         struct crypto_testsuite_params *ts_params = &testsuite_params;
11494         struct rte_cryptodev_info dev_info;
11495         struct rte_cryptodev_sym_session **sessions;
11496         uint32_t i, j;
11497         struct multi_session_params ut_paramz[] = {
11498
11499                 {
11500                         .cipher_key = ms_aes_cbc_key0,
11501                         .hmac_key = ms_hmac_key0,
11502                         .cipher = ms_aes_cbc_cipher0,
11503                         .digest = ms_hmac_digest0,
11504                         .iv = ms_aes_cbc_iv0
11505                 },
11506                 {
11507                         .cipher_key = ms_aes_cbc_key1,
11508                         .hmac_key = ms_hmac_key1,
11509                         .cipher = ms_aes_cbc_cipher1,
11510                         .digest = ms_hmac_digest1,
11511                         .iv = ms_aes_cbc_iv1
11512                 },
11513                 {
11514                         .cipher_key = ms_aes_cbc_key2,
11515                         .hmac_key = ms_hmac_key2,
11516                         .cipher = ms_aes_cbc_cipher2,
11517                         .digest = ms_hmac_digest2,
11518                         .iv = ms_aes_cbc_iv2
11519                 },
11520
11521         };
11522
11523         /* Verify the capabilities */
11524         struct rte_cryptodev_sym_capability_idx cap_idx;
11525         cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
11526         cap_idx.algo.auth = RTE_CRYPTO_AUTH_SHA512_HMAC;
11527         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
11528                         &cap_idx) == NULL)
11529                 return TEST_SKIPPED;
11530         cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
11531         cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_AES_CBC;
11532         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
11533                         &cap_idx) == NULL)
11534                 return TEST_SKIPPED;
11535
11536         rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
11537
11538         sessions = rte_malloc(NULL,
11539                         (sizeof(struct rte_cryptodev_sym_session *)
11540                                         * MAX_NB_SESSIONS) + 1, 0);
11541
11542         for (i = 0; i < MB_SESSION_NUMBER; i++) {
11543                 sessions[i] = rte_cryptodev_sym_session_create(
11544                                 ts_params->session_mpool);
11545
11546                 rte_memcpy(&ut_paramz[i].ut_params, &unittest_params,
11547                                 sizeof(struct crypto_unittest_params));
11548
11549                 test_AES_CBC_HMAC_SHA512_decrypt_create_session_params(
11550                                 &ut_paramz[i].ut_params,
11551                                 ut_paramz[i].cipher_key, ut_paramz[i].hmac_key);
11552
11553                 /* Create multiple crypto sessions*/
11554                 rte_cryptodev_sym_session_init(
11555                                 ts_params->valid_devs[0],
11556                                 sessions[i],
11557                                 &ut_paramz[i].ut_params.auth_xform,
11558                                 ts_params->session_priv_mpool);
11559
11560                 TEST_ASSERT_NOT_NULL(sessions[i],
11561                                 "Session creation failed at session number %u",
11562                                 i);
11563
11564         }
11565
11566         srand(time(NULL));
11567         for (i = 0; i < 40000; i++) {
11568
11569                 j = rand() % MB_SESSION_NUMBER;
11570
11571                 TEST_ASSERT_SUCCESS(
11572                         test_AES_CBC_HMAC_SHA512_decrypt_perform(
11573                                         sessions[j],
11574                                         &ut_paramz[j].ut_params,
11575                                         ts_params, ut_paramz[j].cipher,
11576                                         ut_paramz[j].digest,
11577                                         ut_paramz[j].iv),
11578                         "Failed to perform decrypt on request number %u.", i);
11579
11580                 if (ut_paramz[j].ut_params.op)
11581                         rte_crypto_op_free(ut_paramz[j].ut_params.op);
11582
11583                 /*
11584                  * free mbuf - both obuf and ibuf are usually the same,
11585                  * so check if they point at the same address is necessary,
11586                  * to avoid freeing the mbuf twice.
11587                  */
11588                 if (ut_paramz[j].ut_params.obuf) {
11589                         rte_pktmbuf_free(ut_paramz[j].ut_params.obuf);
11590                         if (ut_paramz[j].ut_params.ibuf
11591                                         == ut_paramz[j].ut_params.obuf)
11592                                 ut_paramz[j].ut_params.ibuf = 0;
11593                         ut_paramz[j].ut_params.obuf = 0;
11594                 }
11595                 if (ut_paramz[j].ut_params.ibuf) {
11596                         rte_pktmbuf_free(ut_paramz[j].ut_params.ibuf);
11597                         ut_paramz[j].ut_params.ibuf = 0;
11598                 }
11599         }
11600
11601         for (i = 0; i < MB_SESSION_NUMBER; i++) {
11602                 rte_cryptodev_sym_session_clear(ts_params->valid_devs[0],
11603                                 sessions[i]);
11604                 rte_cryptodev_sym_session_free(sessions[i]);
11605         }
11606
11607         rte_free(sessions);
11608
11609         return TEST_SUCCESS;
11610 }
11611
11612 uint8_t orig_data[] = {0xab, 0xab, 0xab, 0xab,
11613                         0xab, 0xab, 0xab, 0xab,
11614                         0xab, 0xab, 0xab, 0xab,
11615                         0xab, 0xab, 0xab, 0xab};
11616
11617 static int
11618 test_null_invalid_operation(void)
11619 {
11620         struct crypto_testsuite_params *ts_params = &testsuite_params;
11621         struct crypto_unittest_params *ut_params = &unittest_params;
11622         int ret;
11623
11624         /* This test is for NULL PMD only */
11625         if (gbl_driver_id != rte_cryptodev_driver_id_get(
11626                         RTE_STR(CRYPTODEV_NAME_NULL_PMD)))
11627                 return TEST_SKIPPED;
11628
11629         /* Setup Cipher Parameters */
11630         ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
11631         ut_params->cipher_xform.next = NULL;
11632
11633         ut_params->cipher_xform.cipher.algo = RTE_CRYPTO_CIPHER_AES_CBC;
11634         ut_params->cipher_xform.cipher.op = RTE_CRYPTO_CIPHER_OP_ENCRYPT;
11635
11636         ut_params->sess = rte_cryptodev_sym_session_create(
11637                         ts_params->session_mpool);
11638
11639         /* Create Crypto session*/
11640         ret = rte_cryptodev_sym_session_init(ts_params->valid_devs[0],
11641                         ut_params->sess, &ut_params->cipher_xform,
11642                         ts_params->session_priv_mpool);
11643         TEST_ASSERT(ret < 0,
11644                         "Session creation succeeded unexpectedly");
11645
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_SHA1_HMAC;
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         ret = rte_cryptodev_sym_session_init(ts_params->valid_devs[0],
11659                         ut_params->sess, &ut_params->auth_xform,
11660                         ts_params->session_priv_mpool);
11661         TEST_ASSERT(ret < 0,
11662                         "Session creation succeeded unexpectedly");
11663
11664         return TEST_SUCCESS;
11665 }
11666
11667
11668 #define NULL_BURST_LENGTH (32)
11669
11670 static int
11671 test_null_burst_operation(void)
11672 {
11673         struct crypto_testsuite_params *ts_params = &testsuite_params;
11674         struct crypto_unittest_params *ut_params = &unittest_params;
11675
11676         unsigned i, burst_len = NULL_BURST_LENGTH;
11677
11678         struct rte_crypto_op *burst[NULL_BURST_LENGTH] = { NULL };
11679         struct rte_crypto_op *burst_dequeued[NULL_BURST_LENGTH] = { NULL };
11680
11681         /* This test is for NULL PMD only */
11682         if (gbl_driver_id != rte_cryptodev_driver_id_get(
11683                         RTE_STR(CRYPTODEV_NAME_NULL_PMD)))
11684                 return TEST_SKIPPED;
11685
11686         /* Setup Cipher Parameters */
11687         ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
11688         ut_params->cipher_xform.next = &ut_params->auth_xform;
11689
11690         ut_params->cipher_xform.cipher.algo = RTE_CRYPTO_CIPHER_NULL;
11691         ut_params->cipher_xform.cipher.op = RTE_CRYPTO_CIPHER_OP_ENCRYPT;
11692
11693         /* Setup HMAC Parameters */
11694         ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;
11695         ut_params->auth_xform.next = NULL;
11696
11697         ut_params->auth_xform.auth.algo = RTE_CRYPTO_AUTH_NULL;
11698         ut_params->auth_xform.auth.op = RTE_CRYPTO_AUTH_OP_GENERATE;
11699
11700         ut_params->sess = rte_cryptodev_sym_session_create(
11701                         ts_params->session_mpool);
11702
11703         /* Create Crypto session*/
11704         rte_cryptodev_sym_session_init(ts_params->valid_devs[0],
11705                         ut_params->sess, &ut_params->cipher_xform,
11706                         ts_params->session_priv_mpool);
11707         TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed");
11708
11709         TEST_ASSERT_EQUAL(rte_crypto_op_bulk_alloc(ts_params->op_mpool,
11710                         RTE_CRYPTO_OP_TYPE_SYMMETRIC, burst, burst_len),
11711                         burst_len, "failed to generate burst of crypto ops");
11712
11713         /* Generate an operation for each mbuf in burst */
11714         for (i = 0; i < burst_len; i++) {
11715                 struct rte_mbuf *m = rte_pktmbuf_alloc(ts_params->mbuf_pool);
11716
11717                 TEST_ASSERT_NOT_NULL(m, "Failed to allocate mbuf");
11718
11719                 unsigned *data = (unsigned *)rte_pktmbuf_append(m,
11720                                 sizeof(unsigned));
11721                 *data = i;
11722
11723                 rte_crypto_op_attach_sym_session(burst[i], ut_params->sess);
11724
11725                 burst[i]->sym->m_src = m;
11726         }
11727
11728         /* Process crypto operation */
11729         TEST_ASSERT_EQUAL(rte_cryptodev_enqueue_burst(ts_params->valid_devs[0],
11730                         0, burst, burst_len),
11731                         burst_len,
11732                         "Error enqueuing burst");
11733
11734         TEST_ASSERT_EQUAL(rte_cryptodev_dequeue_burst(ts_params->valid_devs[0],
11735                         0, burst_dequeued, burst_len),
11736                         burst_len,
11737                         "Error dequeuing burst");
11738
11739
11740         for (i = 0; i < burst_len; i++) {
11741                 TEST_ASSERT_EQUAL(
11742                         *rte_pktmbuf_mtod(burst[i]->sym->m_src, uint32_t *),
11743                         *rte_pktmbuf_mtod(burst_dequeued[i]->sym->m_src,
11744                                         uint32_t *),
11745                         "data not as expected");
11746
11747                 rte_pktmbuf_free(burst[i]->sym->m_src);
11748                 rte_crypto_op_free(burst[i]);
11749         }
11750
11751         return TEST_SUCCESS;
11752 }
11753
11754 static uint16_t
11755 test_enq_callback(uint16_t dev_id, uint16_t qp_id, struct rte_crypto_op **ops,
11756                   uint16_t nb_ops, void *user_param)
11757 {
11758         RTE_SET_USED(dev_id);
11759         RTE_SET_USED(qp_id);
11760         RTE_SET_USED(ops);
11761         RTE_SET_USED(user_param);
11762
11763         printf("crypto enqueue callback called\n");
11764         return nb_ops;
11765 }
11766
11767 static uint16_t
11768 test_deq_callback(uint16_t dev_id, uint16_t qp_id, struct rte_crypto_op **ops,
11769                   uint16_t nb_ops, void *user_param)
11770 {
11771         RTE_SET_USED(dev_id);
11772         RTE_SET_USED(qp_id);
11773         RTE_SET_USED(ops);
11774         RTE_SET_USED(user_param);
11775
11776         printf("crypto dequeue callback called\n");
11777         return nb_ops;
11778 }
11779
11780 /*
11781  * Thread using enqueue/dequeue callback with RCU.
11782  */
11783 static int
11784 test_enqdeq_callback_thread(void *arg)
11785 {
11786         RTE_SET_USED(arg);
11787         /* DP thread calls rte_cryptodev_enqueue_burst()/
11788          * rte_cryptodev_dequeue_burst() and invokes callback.
11789          */
11790         test_null_burst_operation();
11791         return 0;
11792 }
11793
11794 static int
11795 test_enq_callback_setup(void)
11796 {
11797         struct crypto_testsuite_params *ts_params = &testsuite_params;
11798         struct rte_cryptodev_info dev_info;
11799         struct rte_cryptodev_qp_conf qp_conf = {
11800                 .nb_descriptors = MAX_NUM_OPS_INFLIGHT
11801         };
11802
11803         struct rte_cryptodev_cb *cb;
11804         uint16_t qp_id = 0;
11805
11806         /* Stop the device in case it's started so it can be configured */
11807         rte_cryptodev_stop(ts_params->valid_devs[0]);
11808
11809         rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
11810
11811         TEST_ASSERT_SUCCESS(rte_cryptodev_configure(ts_params->valid_devs[0],
11812                         &ts_params->conf),
11813                         "Failed to configure cryptodev %u",
11814                         ts_params->valid_devs[0]);
11815
11816         qp_conf.nb_descriptors = MAX_NUM_OPS_INFLIGHT;
11817         qp_conf.mp_session = ts_params->session_mpool;
11818         qp_conf.mp_session_private = ts_params->session_priv_mpool;
11819
11820         TEST_ASSERT_SUCCESS(rte_cryptodev_queue_pair_setup(
11821                         ts_params->valid_devs[0], qp_id, &qp_conf,
11822                         rte_cryptodev_socket_id(ts_params->valid_devs[0])),
11823                         "Failed test for "
11824                         "rte_cryptodev_queue_pair_setup: num_inflights "
11825                         "%u on qp %u on cryptodev %u",
11826                         qp_conf.nb_descriptors, qp_id,
11827                         ts_params->valid_devs[0]);
11828
11829         /* Test with invalid crypto device */
11830         cb = rte_cryptodev_add_enq_callback(RTE_CRYPTO_MAX_DEVS,
11831                         qp_id, test_enq_callback, NULL);
11832         TEST_ASSERT_NULL(cb, "Add callback on qp %u on "
11833                         "cryptodev %u did not fail",
11834                         qp_id, RTE_CRYPTO_MAX_DEVS);
11835
11836         /* Test with invalid queue pair */
11837         cb = rte_cryptodev_add_enq_callback(ts_params->valid_devs[0],
11838                         dev_info.max_nb_queue_pairs + 1,
11839                         test_enq_callback, NULL);
11840         TEST_ASSERT_NULL(cb, "Add callback on qp %u on "
11841                         "cryptodev %u did not fail",
11842                         dev_info.max_nb_queue_pairs + 1,
11843                         ts_params->valid_devs[0]);
11844
11845         /* Test with NULL callback */
11846         cb = rte_cryptodev_add_enq_callback(ts_params->valid_devs[0],
11847                         qp_id, NULL, NULL);
11848         TEST_ASSERT_NULL(cb, "Add callback on qp %u on "
11849                         "cryptodev %u did not fail",
11850                         qp_id, ts_params->valid_devs[0]);
11851
11852         /* Test with valid configuration */
11853         cb = rte_cryptodev_add_enq_callback(ts_params->valid_devs[0],
11854                         qp_id, test_enq_callback, NULL);
11855         TEST_ASSERT_NOT_NULL(cb, "Failed test to add callback on "
11856                         "qp %u on cryptodev %u",
11857                         qp_id, ts_params->valid_devs[0]);
11858
11859         rte_cryptodev_start(ts_params->valid_devs[0]);
11860
11861         /* Launch a thread */
11862         rte_eal_remote_launch(test_enqdeq_callback_thread, NULL,
11863                                 rte_get_next_lcore(-1, 1, 0));
11864
11865         /* Wait until reader exited. */
11866         rte_eal_mp_wait_lcore();
11867
11868         /* Test with invalid crypto device */
11869         TEST_ASSERT_FAIL(rte_cryptodev_remove_enq_callback(
11870                         RTE_CRYPTO_MAX_DEVS, qp_id, cb),
11871                         "Expected call to fail as crypto device is invalid");
11872
11873         /* Test with invalid queue pair */
11874         TEST_ASSERT_FAIL(rte_cryptodev_remove_enq_callback(
11875                         ts_params->valid_devs[0],
11876                         dev_info.max_nb_queue_pairs + 1, cb),
11877                         "Expected call to fail as queue pair is invalid");
11878
11879         /* Test with NULL callback */
11880         TEST_ASSERT_FAIL(rte_cryptodev_remove_enq_callback(
11881                         ts_params->valid_devs[0], qp_id, NULL),
11882                         "Expected call to fail as callback is NULL");
11883
11884         /* Test with valid configuration */
11885         TEST_ASSERT_SUCCESS(rte_cryptodev_remove_enq_callback(
11886                         ts_params->valid_devs[0], qp_id, cb),
11887                         "Failed test to remove callback on "
11888                         "qp %u on cryptodev %u",
11889                         qp_id, ts_params->valid_devs[0]);
11890
11891         return TEST_SUCCESS;
11892 }
11893
11894 static int
11895 test_deq_callback_setup(void)
11896 {
11897         struct crypto_testsuite_params *ts_params = &testsuite_params;
11898         struct rte_cryptodev_info dev_info;
11899         struct rte_cryptodev_qp_conf qp_conf = {
11900                 .nb_descriptors = MAX_NUM_OPS_INFLIGHT
11901         };
11902
11903         struct rte_cryptodev_cb *cb;
11904         uint16_t qp_id = 0;
11905
11906         /* Stop the device in case it's started so it can be configured */
11907         rte_cryptodev_stop(ts_params->valid_devs[0]);
11908
11909         rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
11910
11911         TEST_ASSERT_SUCCESS(rte_cryptodev_configure(ts_params->valid_devs[0],
11912                         &ts_params->conf),
11913                         "Failed to configure cryptodev %u",
11914                         ts_params->valid_devs[0]);
11915
11916         qp_conf.nb_descriptors = MAX_NUM_OPS_INFLIGHT;
11917         qp_conf.mp_session = ts_params->session_mpool;
11918         qp_conf.mp_session_private = ts_params->session_priv_mpool;
11919
11920         TEST_ASSERT_SUCCESS(rte_cryptodev_queue_pair_setup(
11921                         ts_params->valid_devs[0], qp_id, &qp_conf,
11922                         rte_cryptodev_socket_id(ts_params->valid_devs[0])),
11923                         "Failed test for "
11924                         "rte_cryptodev_queue_pair_setup: num_inflights "
11925                         "%u on qp %u on cryptodev %u",
11926                         qp_conf.nb_descriptors, qp_id,
11927                         ts_params->valid_devs[0]);
11928
11929         /* Test with invalid crypto device */
11930         cb = rte_cryptodev_add_deq_callback(RTE_CRYPTO_MAX_DEVS,
11931                         qp_id, test_deq_callback, NULL);
11932         TEST_ASSERT_NULL(cb, "Add callback on qp %u on "
11933                         "cryptodev %u did not fail",
11934                         qp_id, RTE_CRYPTO_MAX_DEVS);
11935
11936         /* Test with invalid queue pair */
11937         cb = rte_cryptodev_add_deq_callback(ts_params->valid_devs[0],
11938                         dev_info.max_nb_queue_pairs + 1,
11939                         test_deq_callback, NULL);
11940         TEST_ASSERT_NULL(cb, "Add callback on qp %u on "
11941                         "cryptodev %u did not fail",
11942                         dev_info.max_nb_queue_pairs + 1,
11943                         ts_params->valid_devs[0]);
11944
11945         /* Test with NULL callback */
11946         cb = rte_cryptodev_add_deq_callback(ts_params->valid_devs[0],
11947                         qp_id, NULL, NULL);
11948         TEST_ASSERT_NULL(cb, "Add callback on qp %u on "
11949                         "cryptodev %u did not fail",
11950                         qp_id, ts_params->valid_devs[0]);
11951
11952         /* Test with valid configuration */
11953         cb = rte_cryptodev_add_deq_callback(ts_params->valid_devs[0],
11954                         qp_id, test_deq_callback, NULL);
11955         TEST_ASSERT_NOT_NULL(cb, "Failed test to add callback on "
11956                         "qp %u on cryptodev %u",
11957                         qp_id, ts_params->valid_devs[0]);
11958
11959         rte_cryptodev_start(ts_params->valid_devs[0]);
11960
11961         /* Launch a thread */
11962         rte_eal_remote_launch(test_enqdeq_callback_thread, NULL,
11963                                 rte_get_next_lcore(-1, 1, 0));
11964
11965         /* Wait until reader exited. */
11966         rte_eal_mp_wait_lcore();
11967
11968         /* Test with invalid crypto device */
11969         TEST_ASSERT_FAIL(rte_cryptodev_remove_deq_callback(
11970                         RTE_CRYPTO_MAX_DEVS, qp_id, cb),
11971                         "Expected call to fail as crypto device is invalid");
11972
11973         /* Test with invalid queue pair */
11974         TEST_ASSERT_FAIL(rte_cryptodev_remove_deq_callback(
11975                         ts_params->valid_devs[0],
11976                         dev_info.max_nb_queue_pairs + 1, cb),
11977                         "Expected call to fail as queue pair is invalid");
11978
11979         /* Test with NULL callback */
11980         TEST_ASSERT_FAIL(rte_cryptodev_remove_deq_callback(
11981                         ts_params->valid_devs[0], qp_id, NULL),
11982                         "Expected call to fail as callback is NULL");
11983
11984         /* Test with valid configuration */
11985         TEST_ASSERT_SUCCESS(rte_cryptodev_remove_deq_callback(
11986                         ts_params->valid_devs[0], qp_id, cb),
11987                         "Failed test to remove callback on "
11988                         "qp %u on cryptodev %u",
11989                         qp_id, ts_params->valid_devs[0]);
11990
11991         return TEST_SUCCESS;
11992 }
11993
11994 static void
11995 generate_gmac_large_plaintext(uint8_t *data)
11996 {
11997         uint16_t i;
11998
11999         for (i = 32; i < GMAC_LARGE_PLAINTEXT_LENGTH; i += 32)
12000                 memcpy(&data[i], &data[0], 32);
12001 }
12002
12003 static int
12004 create_gmac_operation(enum rte_crypto_auth_operation op,
12005                 const struct gmac_test_data *tdata)
12006 {
12007         struct crypto_testsuite_params *ts_params = &testsuite_params;
12008         struct crypto_unittest_params *ut_params = &unittest_params;
12009         struct rte_crypto_sym_op *sym_op;
12010
12011         uint32_t plaintext_pad_len = RTE_ALIGN_CEIL(tdata->plaintext.len, 16);
12012
12013         /* Generate Crypto op data structure */
12014         ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
12015                         RTE_CRYPTO_OP_TYPE_SYMMETRIC);
12016         TEST_ASSERT_NOT_NULL(ut_params->op,
12017                         "Failed to allocate symmetric crypto operation struct");
12018
12019         sym_op = ut_params->op->sym;
12020
12021         sym_op->auth.digest.data = (uint8_t *)rte_pktmbuf_append(
12022                         ut_params->ibuf, tdata->gmac_tag.len);
12023         TEST_ASSERT_NOT_NULL(sym_op->auth.digest.data,
12024                         "no room to append digest");
12025
12026         sym_op->auth.digest.phys_addr = rte_pktmbuf_iova_offset(
12027                         ut_params->ibuf, plaintext_pad_len);
12028
12029         if (op == RTE_CRYPTO_AUTH_OP_VERIFY) {
12030                 rte_memcpy(sym_op->auth.digest.data, tdata->gmac_tag.data,
12031                                 tdata->gmac_tag.len);
12032                 debug_hexdump(stdout, "digest:",
12033                                 sym_op->auth.digest.data,
12034                                 tdata->gmac_tag.len);
12035         }
12036
12037         uint8_t *iv_ptr = rte_crypto_op_ctod_offset(ut_params->op,
12038                         uint8_t *, IV_OFFSET);
12039
12040         rte_memcpy(iv_ptr, tdata->iv.data, tdata->iv.len);
12041
12042         debug_hexdump(stdout, "iv:", iv_ptr, tdata->iv.len);
12043
12044         sym_op->cipher.data.length = 0;
12045         sym_op->cipher.data.offset = 0;
12046
12047         sym_op->auth.data.offset = 0;
12048         sym_op->auth.data.length = tdata->plaintext.len;
12049
12050         return 0;
12051 }
12052
12053 static int
12054 create_gmac_operation_sgl(enum rte_crypto_auth_operation op,
12055                 const struct gmac_test_data *tdata,
12056                 void *digest_mem, uint64_t digest_phys)
12057 {
12058         struct crypto_testsuite_params *ts_params = &testsuite_params;
12059         struct crypto_unittest_params *ut_params = &unittest_params;
12060         struct rte_crypto_sym_op *sym_op;
12061
12062         /* Generate Crypto op data structure */
12063         ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
12064                         RTE_CRYPTO_OP_TYPE_SYMMETRIC);
12065         TEST_ASSERT_NOT_NULL(ut_params->op,
12066                         "Failed to allocate symmetric crypto operation struct");
12067
12068         sym_op = ut_params->op->sym;
12069
12070         sym_op->auth.digest.data = digest_mem;
12071         TEST_ASSERT_NOT_NULL(sym_op->auth.digest.data,
12072                         "no room to append digest");
12073
12074         sym_op->auth.digest.phys_addr = digest_phys;
12075
12076         if (op == RTE_CRYPTO_AUTH_OP_VERIFY) {
12077                 rte_memcpy(sym_op->auth.digest.data, tdata->gmac_tag.data,
12078                                 tdata->gmac_tag.len);
12079                 debug_hexdump(stdout, "digest:",
12080                                 sym_op->auth.digest.data,
12081                                 tdata->gmac_tag.len);
12082         }
12083
12084         uint8_t *iv_ptr = rte_crypto_op_ctod_offset(ut_params->op,
12085                         uint8_t *, IV_OFFSET);
12086
12087         rte_memcpy(iv_ptr, tdata->iv.data, tdata->iv.len);
12088
12089         debug_hexdump(stdout, "iv:", iv_ptr, tdata->iv.len);
12090
12091         sym_op->cipher.data.length = 0;
12092         sym_op->cipher.data.offset = 0;
12093
12094         sym_op->auth.data.offset = 0;
12095         sym_op->auth.data.length = tdata->plaintext.len;
12096
12097         return 0;
12098 }
12099
12100 static int create_gmac_session(uint8_t dev_id,
12101                 const struct gmac_test_data *tdata,
12102                 enum rte_crypto_auth_operation auth_op)
12103 {
12104         uint8_t auth_key[tdata->key.len];
12105
12106         struct crypto_testsuite_params *ts_params = &testsuite_params;
12107         struct crypto_unittest_params *ut_params = &unittest_params;
12108
12109         memcpy(auth_key, tdata->key.data, tdata->key.len);
12110
12111         ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;
12112         ut_params->auth_xform.next = NULL;
12113
12114         ut_params->auth_xform.auth.algo = RTE_CRYPTO_AUTH_AES_GMAC;
12115         ut_params->auth_xform.auth.op = auth_op;
12116         ut_params->auth_xform.auth.digest_length = tdata->gmac_tag.len;
12117         ut_params->auth_xform.auth.key.length = tdata->key.len;
12118         ut_params->auth_xform.auth.key.data = auth_key;
12119         ut_params->auth_xform.auth.iv.offset = IV_OFFSET;
12120         ut_params->auth_xform.auth.iv.length = tdata->iv.len;
12121
12122
12123         ut_params->sess = rte_cryptodev_sym_session_create(
12124                         ts_params->session_mpool);
12125
12126         rte_cryptodev_sym_session_init(dev_id, ut_params->sess,
12127                         &ut_params->auth_xform,
12128                         ts_params->session_priv_mpool);
12129
12130         TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed");
12131
12132         return 0;
12133 }
12134
12135 static int
12136 test_AES_GMAC_authentication(const struct gmac_test_data *tdata)
12137 {
12138         struct crypto_testsuite_params *ts_params = &testsuite_params;
12139         struct crypto_unittest_params *ut_params = &unittest_params;
12140         struct rte_cryptodev_info dev_info;
12141
12142         rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
12143         uint64_t feat_flags = dev_info.feature_flags;
12144
12145         if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
12146                         (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
12147                 printf("Device doesn't support RAW data-path APIs.\n");
12148                 return TEST_SKIPPED;
12149         }
12150
12151         int retval;
12152
12153         uint8_t *auth_tag, *plaintext;
12154         uint16_t plaintext_pad_len;
12155
12156         TEST_ASSERT_NOT_EQUAL(tdata->gmac_tag.len, 0,
12157                               "No GMAC length in the source data");
12158
12159         /* Verify the capabilities */
12160         struct rte_cryptodev_sym_capability_idx cap_idx;
12161         cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
12162         cap_idx.algo.auth = RTE_CRYPTO_AUTH_AES_GMAC;
12163         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
12164                         &cap_idx) == NULL)
12165                 return TEST_SKIPPED;
12166
12167         retval = create_gmac_session(ts_params->valid_devs[0],
12168                         tdata, RTE_CRYPTO_AUTH_OP_GENERATE);
12169
12170         if (retval < 0)
12171                 return retval;
12172
12173         if (tdata->plaintext.len > MBUF_SIZE)
12174                 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->large_mbuf_pool);
12175         else
12176                 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
12177         TEST_ASSERT_NOT_NULL(ut_params->ibuf,
12178                         "Failed to allocate input buffer in mempool");
12179
12180         memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
12181                         rte_pktmbuf_tailroom(ut_params->ibuf));
12182
12183         plaintext_pad_len = RTE_ALIGN_CEIL(tdata->plaintext.len, 16);
12184         /*
12185          * Runtime generate the large plain text instead of use hard code
12186          * plain text vector. It is done to avoid create huge source file
12187          * with the test vector.
12188          */
12189         if (tdata->plaintext.len == GMAC_LARGE_PLAINTEXT_LENGTH)
12190                 generate_gmac_large_plaintext(tdata->plaintext.data);
12191
12192         plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
12193                                 plaintext_pad_len);
12194         TEST_ASSERT_NOT_NULL(plaintext, "no room to append plaintext");
12195
12196         memcpy(plaintext, tdata->plaintext.data, tdata->plaintext.len);
12197         debug_hexdump(stdout, "plaintext:", plaintext,
12198                         tdata->plaintext.len);
12199
12200         retval = create_gmac_operation(RTE_CRYPTO_AUTH_OP_GENERATE,
12201                         tdata);
12202
12203         if (retval < 0)
12204                 return retval;
12205
12206         rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
12207
12208         ut_params->op->sym->m_src = ut_params->ibuf;
12209
12210         if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
12211                 process_cpu_crypt_auth_op(ts_params->valid_devs[0],
12212                         ut_params->op);
12213         else if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
12214                 process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
12215                                 ut_params->op, 0, 1, 0, 0);
12216         else
12217                 TEST_ASSERT_NOT_NULL(
12218                         process_crypto_request(ts_params->valid_devs[0],
12219                         ut_params->op), "failed to process sym crypto op");
12220
12221         TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
12222                         "crypto op processing failed");
12223
12224         if (ut_params->op->sym->m_dst) {
12225                 auth_tag = rte_pktmbuf_mtod_offset(ut_params->op->sym->m_dst,
12226                                 uint8_t *, plaintext_pad_len);
12227         } else {
12228                 auth_tag = plaintext + plaintext_pad_len;
12229         }
12230
12231         debug_hexdump(stdout, "auth tag:", auth_tag, tdata->gmac_tag.len);
12232
12233         TEST_ASSERT_BUFFERS_ARE_EQUAL(
12234                         auth_tag,
12235                         tdata->gmac_tag.data,
12236                         tdata->gmac_tag.len,
12237                         "GMAC Generated auth tag not as expected");
12238
12239         return 0;
12240 }
12241
12242 static int
12243 test_AES_GMAC_authentication_test_case_1(void)
12244 {
12245         return test_AES_GMAC_authentication(&gmac_test_case_1);
12246 }
12247
12248 static int
12249 test_AES_GMAC_authentication_test_case_2(void)
12250 {
12251         return test_AES_GMAC_authentication(&gmac_test_case_2);
12252 }
12253
12254 static int
12255 test_AES_GMAC_authentication_test_case_3(void)
12256 {
12257         return test_AES_GMAC_authentication(&gmac_test_case_3);
12258 }
12259
12260 static int
12261 test_AES_GMAC_authentication_test_case_4(void)
12262 {
12263         return test_AES_GMAC_authentication(&gmac_test_case_4);
12264 }
12265
12266 static int
12267 test_AES_GMAC_authentication_verify(const struct gmac_test_data *tdata)
12268 {
12269         struct crypto_testsuite_params *ts_params = &testsuite_params;
12270         struct crypto_unittest_params *ut_params = &unittest_params;
12271         int retval;
12272         uint32_t plaintext_pad_len;
12273         uint8_t *plaintext;
12274         struct rte_cryptodev_info dev_info;
12275
12276         rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
12277         uint64_t feat_flags = dev_info.feature_flags;
12278
12279         if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
12280                         (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
12281                 printf("Device doesn't support RAW data-path APIs.\n");
12282                 return TEST_SKIPPED;
12283         }
12284
12285         TEST_ASSERT_NOT_EQUAL(tdata->gmac_tag.len, 0,
12286                               "No GMAC length in the source data");
12287
12288         /* Verify the capabilities */
12289         struct rte_cryptodev_sym_capability_idx cap_idx;
12290         cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
12291         cap_idx.algo.auth = RTE_CRYPTO_AUTH_AES_GMAC;
12292         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
12293                         &cap_idx) == NULL)
12294                 return TEST_SKIPPED;
12295
12296         retval = create_gmac_session(ts_params->valid_devs[0],
12297                         tdata, RTE_CRYPTO_AUTH_OP_VERIFY);
12298
12299         if (retval < 0)
12300                 return retval;
12301
12302         if (tdata->plaintext.len > MBUF_SIZE)
12303                 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->large_mbuf_pool);
12304         else
12305                 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
12306         TEST_ASSERT_NOT_NULL(ut_params->ibuf,
12307                         "Failed to allocate input buffer in mempool");
12308
12309         memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
12310                         rte_pktmbuf_tailroom(ut_params->ibuf));
12311
12312         plaintext_pad_len = RTE_ALIGN_CEIL(tdata->plaintext.len, 16);
12313
12314         /*
12315          * Runtime generate the large plain text instead of use hard code
12316          * plain text vector. It is done to avoid create huge source file
12317          * with the test vector.
12318          */
12319         if (tdata->plaintext.len == GMAC_LARGE_PLAINTEXT_LENGTH)
12320                 generate_gmac_large_plaintext(tdata->plaintext.data);
12321
12322         plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
12323                                 plaintext_pad_len);
12324         TEST_ASSERT_NOT_NULL(plaintext, "no room to append plaintext");
12325
12326         memcpy(plaintext, tdata->plaintext.data, tdata->plaintext.len);
12327         debug_hexdump(stdout, "plaintext:", plaintext,
12328                         tdata->plaintext.len);
12329
12330         retval = create_gmac_operation(RTE_CRYPTO_AUTH_OP_VERIFY,
12331                         tdata);
12332
12333         if (retval < 0)
12334                 return retval;
12335
12336         rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
12337
12338         ut_params->op->sym->m_src = ut_params->ibuf;
12339
12340         if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
12341                 process_cpu_crypt_auth_op(ts_params->valid_devs[0],
12342                         ut_params->op);
12343         else if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
12344                 process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
12345                                 ut_params->op, 0, 1, 0, 0);
12346         else
12347                 TEST_ASSERT_NOT_NULL(
12348                         process_crypto_request(ts_params->valid_devs[0],
12349                         ut_params->op), "failed to process sym crypto op");
12350
12351         TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
12352                         "crypto op processing failed");
12353
12354         return 0;
12355
12356 }
12357
12358 static int
12359 test_AES_GMAC_authentication_verify_test_case_1(void)
12360 {
12361         return test_AES_GMAC_authentication_verify(&gmac_test_case_1);
12362 }
12363
12364 static int
12365 test_AES_GMAC_authentication_verify_test_case_2(void)
12366 {
12367         return test_AES_GMAC_authentication_verify(&gmac_test_case_2);
12368 }
12369
12370 static int
12371 test_AES_GMAC_authentication_verify_test_case_3(void)
12372 {
12373         return test_AES_GMAC_authentication_verify(&gmac_test_case_3);
12374 }
12375
12376 static int
12377 test_AES_GMAC_authentication_verify_test_case_4(void)
12378 {
12379         return test_AES_GMAC_authentication_verify(&gmac_test_case_4);
12380 }
12381
12382 static int
12383 test_AES_GMAC_authentication_SGL(const struct gmac_test_data *tdata,
12384                                 uint32_t fragsz)
12385 {
12386         struct crypto_testsuite_params *ts_params = &testsuite_params;
12387         struct crypto_unittest_params *ut_params = &unittest_params;
12388         struct rte_cryptodev_info dev_info;
12389         uint64_t feature_flags;
12390         unsigned int trn_data = 0;
12391         void *digest_mem = NULL;
12392         uint32_t segs = 1;
12393         unsigned int to_trn = 0;
12394         struct rte_mbuf *buf = NULL;
12395         uint8_t *auth_tag, *plaintext;
12396         int retval;
12397
12398         TEST_ASSERT_NOT_EQUAL(tdata->gmac_tag.len, 0,
12399                               "No GMAC length in the source data");
12400
12401         /* Verify the capabilities */
12402         struct rte_cryptodev_sym_capability_idx cap_idx;
12403         cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
12404         cap_idx.algo.auth = RTE_CRYPTO_AUTH_AES_GMAC;
12405         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
12406                         &cap_idx) == NULL)
12407                 return TEST_SKIPPED;
12408
12409         /* Check for any input SGL support */
12410         rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
12411         feature_flags = dev_info.feature_flags;
12412
12413         if ((!(feature_flags & RTE_CRYPTODEV_FF_IN_PLACE_SGL)) ||
12414                         (!(feature_flags & RTE_CRYPTODEV_FF_OOP_SGL_IN_LB_OUT)) ||
12415                         (!(feature_flags & RTE_CRYPTODEV_FF_OOP_SGL_IN_SGL_OUT)))
12416                 return TEST_SKIPPED;
12417
12418         if (fragsz > tdata->plaintext.len)
12419                 fragsz = tdata->plaintext.len;
12420
12421         uint16_t plaintext_len = fragsz;
12422
12423         retval = create_gmac_session(ts_params->valid_devs[0],
12424                         tdata, RTE_CRYPTO_AUTH_OP_GENERATE);
12425
12426         if (retval < 0)
12427                 return retval;
12428
12429         ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
12430         TEST_ASSERT_NOT_NULL(ut_params->ibuf,
12431                         "Failed to allocate input buffer in mempool");
12432
12433         memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
12434                         rte_pktmbuf_tailroom(ut_params->ibuf));
12435
12436         plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
12437                                 plaintext_len);
12438         TEST_ASSERT_NOT_NULL(plaintext, "no room to append plaintext");
12439
12440         memcpy(plaintext, tdata->plaintext.data, plaintext_len);
12441
12442         trn_data += plaintext_len;
12443
12444         buf = ut_params->ibuf;
12445
12446         /*
12447          * Loop until no more fragments
12448          */
12449
12450         while (trn_data < tdata->plaintext.len) {
12451                 ++segs;
12452                 to_trn = (tdata->plaintext.len - trn_data < fragsz) ?
12453                                 (tdata->plaintext.len - trn_data) : fragsz;
12454
12455                 buf->next = rte_pktmbuf_alloc(ts_params->mbuf_pool);
12456                 buf = buf->next;
12457
12458                 memset(rte_pktmbuf_mtod(buf, uint8_t *), 0,
12459                                 rte_pktmbuf_tailroom(buf));
12460
12461                 plaintext = (uint8_t *)rte_pktmbuf_append(buf,
12462                                 to_trn);
12463
12464                 memcpy(plaintext, tdata->plaintext.data + trn_data,
12465                                 to_trn);
12466                 trn_data += to_trn;
12467                 if (trn_data  == tdata->plaintext.len)
12468                         digest_mem = (uint8_t *)rte_pktmbuf_append(buf,
12469                                         tdata->gmac_tag.len);
12470         }
12471         ut_params->ibuf->nb_segs = segs;
12472
12473         /*
12474          * Place digest at the end of the last buffer
12475          */
12476         uint64_t digest_phys = rte_pktmbuf_iova(buf) + to_trn;
12477
12478         if (!digest_mem) {
12479                 digest_mem = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
12480                                 + tdata->gmac_tag.len);
12481                 digest_phys = rte_pktmbuf_iova_offset(ut_params->ibuf,
12482                                 tdata->plaintext.len);
12483         }
12484
12485         retval = create_gmac_operation_sgl(RTE_CRYPTO_AUTH_OP_GENERATE,
12486                         tdata, digest_mem, digest_phys);
12487
12488         if (retval < 0)
12489                 return retval;
12490
12491         rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
12492
12493         ut_params->op->sym->m_src = ut_params->ibuf;
12494
12495         if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
12496                 return TEST_SKIPPED;
12497
12498         TEST_ASSERT_NOT_NULL(
12499                 process_crypto_request(ts_params->valid_devs[0],
12500                 ut_params->op), "failed to process sym crypto op");
12501
12502         TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
12503                         "crypto op processing failed");
12504
12505         auth_tag = digest_mem;
12506         debug_hexdump(stdout, "auth tag:", auth_tag, tdata->gmac_tag.len);
12507         TEST_ASSERT_BUFFERS_ARE_EQUAL(
12508                         auth_tag,
12509                         tdata->gmac_tag.data,
12510                         tdata->gmac_tag.len,
12511                         "GMAC Generated auth tag not as expected");
12512
12513         return 0;
12514 }
12515
12516 /* Segment size not multiple of block size (16B) */
12517 static int
12518 test_AES_GMAC_authentication_SGL_40B(void)
12519 {
12520         return test_AES_GMAC_authentication_SGL(&gmac_test_case_1, 40);
12521 }
12522
12523 static int
12524 test_AES_GMAC_authentication_SGL_80B(void)
12525 {
12526         return test_AES_GMAC_authentication_SGL(&gmac_test_case_1, 80);
12527 }
12528
12529 static int
12530 test_AES_GMAC_authentication_SGL_2048B(void)
12531 {
12532         return test_AES_GMAC_authentication_SGL(&gmac_test_case_5, 2048);
12533 }
12534
12535 /* Segment size not multiple of block size (16B) */
12536 static int
12537 test_AES_GMAC_authentication_SGL_2047B(void)
12538 {
12539         return test_AES_GMAC_authentication_SGL(&gmac_test_case_5, 2047);
12540 }
12541
12542 struct test_crypto_vector {
12543         enum rte_crypto_cipher_algorithm crypto_algo;
12544         unsigned int cipher_offset;
12545         unsigned int cipher_len;
12546
12547         struct {
12548                 uint8_t data[64];
12549                 unsigned int len;
12550         } cipher_key;
12551
12552         struct {
12553                 uint8_t data[64];
12554                 unsigned int len;
12555         } iv;
12556
12557         struct {
12558                 const uint8_t *data;
12559                 unsigned int len;
12560         } plaintext;
12561
12562         struct {
12563                 const uint8_t *data;
12564                 unsigned int len;
12565         } ciphertext;
12566
12567         enum rte_crypto_auth_algorithm auth_algo;
12568         unsigned int auth_offset;
12569
12570         struct {
12571                 uint8_t data[128];
12572                 unsigned int len;
12573         } auth_key;
12574
12575         struct {
12576                 const uint8_t *data;
12577                 unsigned int len;
12578         } aad;
12579
12580         struct {
12581                 uint8_t data[128];
12582                 unsigned int len;
12583         } digest;
12584 };
12585
12586 static const struct test_crypto_vector
12587 hmac_sha1_test_crypto_vector = {
12588         .auth_algo = RTE_CRYPTO_AUTH_SHA1_HMAC,
12589         .plaintext = {
12590                 .data = plaintext_hash,
12591                 .len = 512
12592         },
12593         .auth_key = {
12594                 .data = {
12595                         0xF8, 0x2A, 0xC7, 0x54, 0xDB, 0x96, 0x18, 0xAA,
12596                         0xC3, 0xA1, 0x53, 0xF6, 0x1F, 0x17, 0x60, 0xBD,
12597                         0xDE, 0xF4, 0xDE, 0xAD
12598                 },
12599                 .len = 20
12600         },
12601         .digest = {
12602                 .data = {
12603                         0xC4, 0xB7, 0x0E, 0x6B, 0xDE, 0xD1, 0xE7, 0x77,
12604                         0x7E, 0x2E, 0x8F, 0xFC, 0x48, 0x39, 0x46, 0x17,
12605                         0x3F, 0x91, 0x64, 0x59
12606                 },
12607                 .len = 20
12608         }
12609 };
12610
12611 static const struct test_crypto_vector
12612 aes128_gmac_test_vector = {
12613         .auth_algo = RTE_CRYPTO_AUTH_AES_GMAC,
12614         .plaintext = {
12615                 .data = plaintext_hash,
12616                 .len = 512
12617         },
12618         .iv = {
12619                 .data = {
12620                         0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
12621                         0x08, 0x09, 0x0A, 0x0B
12622                 },
12623                 .len = 12
12624         },
12625         .auth_key = {
12626                 .data = {
12627                         0x42, 0x1A, 0x7D, 0x3D, 0xF5, 0x82, 0x80, 0xF1,
12628                         0xF1, 0x35, 0x5C, 0x3B, 0xDD, 0x9A, 0x65, 0xBA
12629                 },
12630                 .len = 16
12631         },
12632         .digest = {
12633                 .data = {
12634                         0xCA, 0x00, 0x99, 0x8B, 0x30, 0x7E, 0x74, 0x56,
12635                         0x32, 0xA7, 0x87, 0xB5, 0xE9, 0xB2, 0x34, 0x5A
12636                 },
12637                 .len = 16
12638         }
12639 };
12640
12641 static const struct test_crypto_vector
12642 aes128cbc_hmac_sha1_test_vector = {
12643         .crypto_algo = RTE_CRYPTO_CIPHER_AES_CBC,
12644         .cipher_offset = 0,
12645         .cipher_len = 512,
12646         .cipher_key = {
12647                 .data = {
12648                         0xE4, 0x23, 0x33, 0x8A, 0x35, 0x64, 0x61, 0xE2,
12649                         0x49, 0x03, 0xDD, 0xC6, 0xB8, 0xCA, 0x55, 0x7A
12650                 },
12651                 .len = 16
12652         },
12653         .iv = {
12654                 .data = {
12655                         0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
12656                         0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F
12657                 },
12658                 .len = 16
12659         },
12660         .plaintext = {
12661                 .data = plaintext_hash,
12662                 .len = 512
12663         },
12664         .ciphertext = {
12665                 .data = ciphertext512_aes128cbc,
12666                 .len = 512
12667         },
12668         .auth_algo = RTE_CRYPTO_AUTH_SHA1_HMAC,
12669         .auth_offset = 0,
12670         .auth_key = {
12671                 .data = {
12672                         0xF8, 0x2A, 0xC7, 0x54, 0xDB, 0x96, 0x18, 0xAA,
12673                         0xC3, 0xA1, 0x53, 0xF6, 0x1F, 0x17, 0x60, 0xBD,
12674                         0xDE, 0xF4, 0xDE, 0xAD
12675                 },
12676                 .len = 20
12677         },
12678         .digest = {
12679                 .data = {
12680                         0x9A, 0x4F, 0x88, 0x1B, 0xB6, 0x8F, 0xD8, 0x60,
12681                         0x42, 0x1A, 0x7D, 0x3D, 0xF5, 0x82, 0x80, 0xF1,
12682                         0x18, 0x8C, 0x1D, 0x32
12683                 },
12684                 .len = 20
12685         }
12686 };
12687
12688 static const struct test_crypto_vector
12689 aes128cbc_hmac_sha1_aad_test_vector = {
12690         .crypto_algo = RTE_CRYPTO_CIPHER_AES_CBC,
12691         .cipher_offset = 8,
12692         .cipher_len = 496,
12693         .cipher_key = {
12694                 .data = {
12695                         0xE4, 0x23, 0x33, 0x8A, 0x35, 0x64, 0x61, 0xE2,
12696                         0x49, 0x03, 0xDD, 0xC6, 0xB8, 0xCA, 0x55, 0x7A
12697                 },
12698                 .len = 16
12699         },
12700         .iv = {
12701                 .data = {
12702                         0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
12703                         0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F
12704                 },
12705                 .len = 16
12706         },
12707         .plaintext = {
12708                 .data = plaintext_hash,
12709                 .len = 512
12710         },
12711         .ciphertext = {
12712                 .data = ciphertext512_aes128cbc_aad,
12713                 .len = 512
12714         },
12715         .auth_algo = RTE_CRYPTO_AUTH_SHA1_HMAC,
12716         .auth_offset = 0,
12717         .auth_key = {
12718                 .data = {
12719                         0xF8, 0x2A, 0xC7, 0x54, 0xDB, 0x96, 0x18, 0xAA,
12720                         0xC3, 0xA1, 0x53, 0xF6, 0x1F, 0x17, 0x60, 0xBD,
12721                         0xDE, 0xF4, 0xDE, 0xAD
12722                 },
12723                 .len = 20
12724         },
12725         .digest = {
12726                 .data = {
12727                         0x6D, 0xF3, 0x50, 0x79, 0x7A, 0x2A, 0xAC, 0x7F,
12728                         0xA6, 0xF0, 0xC6, 0x38, 0x1F, 0xA4, 0xDD, 0x9B,
12729                         0x62, 0x0F, 0xFB, 0x10
12730                 },
12731                 .len = 20
12732         }
12733 };
12734
12735 static void
12736 data_corruption(uint8_t *data)
12737 {
12738         data[0] += 1;
12739 }
12740
12741 static void
12742 tag_corruption(uint8_t *data, unsigned int tag_offset)
12743 {
12744         data[tag_offset] += 1;
12745 }
12746
12747 static int
12748 create_auth_session(struct crypto_unittest_params *ut_params,
12749                 uint8_t dev_id,
12750                 const struct test_crypto_vector *reference,
12751                 enum rte_crypto_auth_operation auth_op)
12752 {
12753         struct crypto_testsuite_params *ts_params = &testsuite_params;
12754         uint8_t auth_key[reference->auth_key.len + 1];
12755
12756         memcpy(auth_key, reference->auth_key.data, reference->auth_key.len);
12757
12758         /* Setup Authentication Parameters */
12759         ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;
12760         ut_params->auth_xform.auth.op = auth_op;
12761         ut_params->auth_xform.next = NULL;
12762         ut_params->auth_xform.auth.algo = reference->auth_algo;
12763         ut_params->auth_xform.auth.key.length = reference->auth_key.len;
12764         ut_params->auth_xform.auth.key.data = auth_key;
12765         ut_params->auth_xform.auth.digest_length = reference->digest.len;
12766
12767         /* Create Crypto session*/
12768         ut_params->sess = rte_cryptodev_sym_session_create(
12769                         ts_params->session_mpool);
12770
12771         rte_cryptodev_sym_session_init(dev_id, ut_params->sess,
12772                                 &ut_params->auth_xform,
12773                                 ts_params->session_priv_mpool);
12774
12775         TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed");
12776
12777         return 0;
12778 }
12779
12780 static int
12781 create_auth_cipher_session(struct crypto_unittest_params *ut_params,
12782                 uint8_t dev_id,
12783                 const struct test_crypto_vector *reference,
12784                 enum rte_crypto_auth_operation auth_op,
12785                 enum rte_crypto_cipher_operation cipher_op)
12786 {
12787         struct crypto_testsuite_params *ts_params = &testsuite_params;
12788         uint8_t cipher_key[reference->cipher_key.len + 1];
12789         uint8_t auth_key[reference->auth_key.len + 1];
12790
12791         memcpy(cipher_key, reference->cipher_key.data,
12792                         reference->cipher_key.len);
12793         memcpy(auth_key, reference->auth_key.data, reference->auth_key.len);
12794
12795         /* Setup Authentication Parameters */
12796         ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;
12797         ut_params->auth_xform.auth.op = auth_op;
12798         ut_params->auth_xform.auth.algo = reference->auth_algo;
12799         ut_params->auth_xform.auth.key.length = reference->auth_key.len;
12800         ut_params->auth_xform.auth.key.data = auth_key;
12801         ut_params->auth_xform.auth.digest_length = reference->digest.len;
12802
12803         if (reference->auth_algo == RTE_CRYPTO_AUTH_AES_GMAC) {
12804                 ut_params->auth_xform.auth.iv.offset = IV_OFFSET;
12805                 ut_params->auth_xform.auth.iv.length = reference->iv.len;
12806         } else {
12807                 ut_params->auth_xform.next = &ut_params->cipher_xform;
12808
12809                 /* Setup Cipher Parameters */
12810                 ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
12811                 ut_params->cipher_xform.next = NULL;
12812                 ut_params->cipher_xform.cipher.algo = reference->crypto_algo;
12813                 ut_params->cipher_xform.cipher.op = cipher_op;
12814                 ut_params->cipher_xform.cipher.key.data = cipher_key;
12815                 ut_params->cipher_xform.cipher.key.length = reference->cipher_key.len;
12816                 ut_params->cipher_xform.cipher.iv.offset = IV_OFFSET;
12817                 ut_params->cipher_xform.cipher.iv.length = reference->iv.len;
12818         }
12819
12820         /* Create Crypto session*/
12821         ut_params->sess = rte_cryptodev_sym_session_create(
12822                         ts_params->session_mpool);
12823
12824         rte_cryptodev_sym_session_init(dev_id, ut_params->sess,
12825                                 &ut_params->auth_xform,
12826                                 ts_params->session_priv_mpool);
12827
12828         TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed");
12829
12830         return 0;
12831 }
12832
12833 static int
12834 create_auth_operation(struct crypto_testsuite_params *ts_params,
12835                 struct crypto_unittest_params *ut_params,
12836                 const struct test_crypto_vector *reference,
12837                 unsigned int auth_generate)
12838 {
12839         /* Generate Crypto op data structure */
12840         ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
12841                         RTE_CRYPTO_OP_TYPE_SYMMETRIC);
12842         TEST_ASSERT_NOT_NULL(ut_params->op,
12843                         "Failed to allocate pktmbuf offload");
12844
12845         /* Set crypto operation data parameters */
12846         rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
12847
12848         struct rte_crypto_sym_op *sym_op = ut_params->op->sym;
12849
12850         /* set crypto operation source mbuf */
12851         sym_op->m_src = ut_params->ibuf;
12852
12853         /* digest */
12854         sym_op->auth.digest.data = (uint8_t *)rte_pktmbuf_append(
12855                         ut_params->ibuf, reference->digest.len);
12856
12857         TEST_ASSERT_NOT_NULL(sym_op->auth.digest.data,
12858                         "no room to append auth tag");
12859
12860         sym_op->auth.digest.phys_addr = rte_pktmbuf_iova_offset(
12861                         ut_params->ibuf, reference->plaintext.len);
12862
12863         if (auth_generate)
12864                 memset(sym_op->auth.digest.data, 0, reference->digest.len);
12865         else
12866                 memcpy(sym_op->auth.digest.data,
12867                                 reference->digest.data,
12868                                 reference->digest.len);
12869
12870         debug_hexdump(stdout, "digest:",
12871                         sym_op->auth.digest.data,
12872                         reference->digest.len);
12873
12874         sym_op->auth.data.length = reference->plaintext.len;
12875         sym_op->auth.data.offset = 0;
12876
12877         return 0;
12878 }
12879
12880 static int
12881 create_auth_GMAC_operation(struct crypto_testsuite_params *ts_params,
12882                 struct crypto_unittest_params *ut_params,
12883                 const struct test_crypto_vector *reference,
12884                 unsigned int auth_generate)
12885 {
12886         /* Generate Crypto op data structure */
12887         ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
12888                         RTE_CRYPTO_OP_TYPE_SYMMETRIC);
12889         TEST_ASSERT_NOT_NULL(ut_params->op,
12890                         "Failed to allocate pktmbuf offload");
12891
12892         /* Set crypto operation data parameters */
12893         rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
12894
12895         struct rte_crypto_sym_op *sym_op = ut_params->op->sym;
12896
12897         /* set crypto operation source mbuf */
12898         sym_op->m_src = ut_params->ibuf;
12899
12900         /* digest */
12901         sym_op->auth.digest.data = (uint8_t *)rte_pktmbuf_append(
12902                         ut_params->ibuf, reference->digest.len);
12903
12904         TEST_ASSERT_NOT_NULL(sym_op->auth.digest.data,
12905                         "no room to append auth tag");
12906
12907         sym_op->auth.digest.phys_addr = rte_pktmbuf_iova_offset(
12908                         ut_params->ibuf, reference->ciphertext.len);
12909
12910         if (auth_generate)
12911                 memset(sym_op->auth.digest.data, 0, reference->digest.len);
12912         else
12913                 memcpy(sym_op->auth.digest.data,
12914                                 reference->digest.data,
12915                                 reference->digest.len);
12916
12917         debug_hexdump(stdout, "digest:",
12918                         sym_op->auth.digest.data,
12919                         reference->digest.len);
12920
12921         rte_memcpy(rte_crypto_op_ctod_offset(ut_params->op, uint8_t *, IV_OFFSET),
12922                         reference->iv.data, reference->iv.len);
12923
12924         sym_op->cipher.data.length = 0;
12925         sym_op->cipher.data.offset = 0;
12926
12927         sym_op->auth.data.length = reference->plaintext.len;
12928         sym_op->auth.data.offset = 0;
12929
12930         return 0;
12931 }
12932
12933 static int
12934 create_cipher_auth_operation(struct crypto_testsuite_params *ts_params,
12935                 struct crypto_unittest_params *ut_params,
12936                 const struct test_crypto_vector *reference,
12937                 unsigned int auth_generate)
12938 {
12939         /* Generate Crypto op data structure */
12940         ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
12941                         RTE_CRYPTO_OP_TYPE_SYMMETRIC);
12942         TEST_ASSERT_NOT_NULL(ut_params->op,
12943                         "Failed to allocate pktmbuf offload");
12944
12945         /* Set crypto operation data parameters */
12946         rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
12947
12948         struct rte_crypto_sym_op *sym_op = ut_params->op->sym;
12949
12950         /* set crypto operation source mbuf */
12951         sym_op->m_src = ut_params->ibuf;
12952
12953         /* digest */
12954         sym_op->auth.digest.data = (uint8_t *)rte_pktmbuf_append(
12955                         ut_params->ibuf, reference->digest.len);
12956
12957         TEST_ASSERT_NOT_NULL(sym_op->auth.digest.data,
12958                         "no room to append auth tag");
12959
12960         sym_op->auth.digest.phys_addr = rte_pktmbuf_iova_offset(
12961                         ut_params->ibuf, reference->ciphertext.len);
12962
12963         if (auth_generate)
12964                 memset(sym_op->auth.digest.data, 0, reference->digest.len);
12965         else
12966                 memcpy(sym_op->auth.digest.data,
12967                                 reference->digest.data,
12968                                 reference->digest.len);
12969
12970         debug_hexdump(stdout, "digest:",
12971                         sym_op->auth.digest.data,
12972                         reference->digest.len);
12973
12974         rte_memcpy(rte_crypto_op_ctod_offset(ut_params->op, uint8_t *, IV_OFFSET),
12975                         reference->iv.data, reference->iv.len);
12976
12977         sym_op->cipher.data.length = reference->cipher_len;
12978         sym_op->cipher.data.offset = reference->cipher_offset;
12979
12980         sym_op->auth.data.length = reference->plaintext.len;
12981         sym_op->auth.data.offset = reference->auth_offset;
12982
12983         return 0;
12984 }
12985
12986 static int
12987 create_auth_verify_operation(struct crypto_testsuite_params *ts_params,
12988                 struct crypto_unittest_params *ut_params,
12989                 const struct test_crypto_vector *reference)
12990 {
12991         return create_auth_operation(ts_params, ut_params, reference, 0);
12992 }
12993
12994 static int
12995 create_auth_verify_GMAC_operation(
12996                 struct crypto_testsuite_params *ts_params,
12997                 struct crypto_unittest_params *ut_params,
12998                 const struct test_crypto_vector *reference)
12999 {
13000         return create_auth_GMAC_operation(ts_params, ut_params, reference, 0);
13001 }
13002
13003 static int
13004 create_cipher_auth_verify_operation(struct crypto_testsuite_params *ts_params,
13005                 struct crypto_unittest_params *ut_params,
13006                 const struct test_crypto_vector *reference)
13007 {
13008         return create_cipher_auth_operation(ts_params, ut_params, reference, 0);
13009 }
13010
13011 static int
13012 test_authentication_verify_fail_when_data_corruption(
13013                 struct crypto_testsuite_params *ts_params,
13014                 struct crypto_unittest_params *ut_params,
13015                 const struct test_crypto_vector *reference,
13016                 unsigned int data_corrupted)
13017 {
13018         int retval;
13019
13020         uint8_t *plaintext;
13021         struct rte_cryptodev_info dev_info;
13022
13023         rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
13024         uint64_t feat_flags = dev_info.feature_flags;
13025
13026         if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
13027                         (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
13028                 printf("Device doesn't support RAW data-path APIs.\n");
13029                 return TEST_SKIPPED;
13030         }
13031
13032         /* Verify the capabilities */
13033         struct rte_cryptodev_sym_capability_idx cap_idx;
13034         cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
13035         cap_idx.algo.auth = reference->auth_algo;
13036         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
13037                         &cap_idx) == NULL)
13038                 return TEST_SKIPPED;
13039
13040
13041         /* Create session */
13042         retval = create_auth_session(ut_params,
13043                         ts_params->valid_devs[0],
13044                         reference,
13045                         RTE_CRYPTO_AUTH_OP_VERIFY);
13046         if (retval < 0)
13047                 return retval;
13048
13049         ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
13050         TEST_ASSERT_NOT_NULL(ut_params->ibuf,
13051                         "Failed to allocate input buffer in mempool");
13052
13053         /* clear mbuf payload */
13054         memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
13055                         rte_pktmbuf_tailroom(ut_params->ibuf));
13056
13057         plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
13058                         reference->plaintext.len);
13059         TEST_ASSERT_NOT_NULL(plaintext, "no room to append plaintext");
13060         memcpy(plaintext, reference->plaintext.data, reference->plaintext.len);
13061
13062         debug_hexdump(stdout, "plaintext:", plaintext,
13063                 reference->plaintext.len);
13064
13065         /* Create operation */
13066         retval = create_auth_verify_operation(ts_params, ut_params, reference);
13067
13068         if (retval < 0)
13069                 return retval;
13070
13071         if (data_corrupted)
13072                 data_corruption(plaintext);
13073         else
13074                 tag_corruption(plaintext, reference->plaintext.len);
13075
13076         if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO) {
13077                 process_cpu_crypt_auth_op(ts_params->valid_devs[0],
13078                         ut_params->op);
13079                 TEST_ASSERT_NOT_EQUAL(ut_params->op->status,
13080                         RTE_CRYPTO_OP_STATUS_SUCCESS,
13081                         "authentication not failed");
13082         } else if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
13083                 process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
13084                                 ut_params->op, 0, 1, 0, 0);
13085         else {
13086                 ut_params->op = process_crypto_request(ts_params->valid_devs[0],
13087                         ut_params->op);
13088         }
13089         if (ut_params->op == NULL)
13090                 return 0;
13091         else if (ut_params->op->status != RTE_CRYPTO_OP_STATUS_SUCCESS)
13092                 return 0;
13093
13094         return -1;
13095 }
13096
13097 static int
13098 test_authentication_verify_GMAC_fail_when_corruption(
13099                 struct crypto_testsuite_params *ts_params,
13100                 struct crypto_unittest_params *ut_params,
13101                 const struct test_crypto_vector *reference,
13102                 unsigned int data_corrupted)
13103 {
13104         int retval;
13105         uint8_t *plaintext;
13106         struct rte_cryptodev_info dev_info;
13107
13108         rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
13109         uint64_t feat_flags = dev_info.feature_flags;
13110
13111         if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
13112                         (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
13113                 printf("Device doesn't support RAW data-path APIs.\n");
13114                 return TEST_SKIPPED;
13115         }
13116
13117         /* Verify the capabilities */
13118         struct rte_cryptodev_sym_capability_idx cap_idx;
13119         cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
13120         cap_idx.algo.auth = reference->auth_algo;
13121         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
13122                         &cap_idx) == NULL)
13123                 return TEST_SKIPPED;
13124
13125         /* Create session */
13126         retval = create_auth_cipher_session(ut_params,
13127                         ts_params->valid_devs[0],
13128                         reference,
13129                         RTE_CRYPTO_AUTH_OP_VERIFY,
13130                         RTE_CRYPTO_CIPHER_OP_DECRYPT);
13131         if (retval < 0)
13132                 return retval;
13133
13134         ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
13135         TEST_ASSERT_NOT_NULL(ut_params->ibuf,
13136                         "Failed to allocate input buffer in mempool");
13137
13138         /* clear mbuf payload */
13139         memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
13140                         rte_pktmbuf_tailroom(ut_params->ibuf));
13141
13142         plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
13143                         reference->plaintext.len);
13144         TEST_ASSERT_NOT_NULL(plaintext, "no room to append plaintext");
13145         memcpy(plaintext, reference->plaintext.data, reference->plaintext.len);
13146
13147         debug_hexdump(stdout, "plaintext:", plaintext,
13148                 reference->plaintext.len);
13149
13150         /* Create operation */
13151         retval = create_auth_verify_GMAC_operation(ts_params,
13152                         ut_params,
13153                         reference);
13154
13155         if (retval < 0)
13156                 return retval;
13157
13158         if (data_corrupted)
13159                 data_corruption(plaintext);
13160         else
13161                 tag_corruption(plaintext, reference->aad.len);
13162
13163         if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO) {
13164                 process_cpu_crypt_auth_op(ts_params->valid_devs[0],
13165                         ut_params->op);
13166                 TEST_ASSERT_NOT_EQUAL(ut_params->op->status,
13167                         RTE_CRYPTO_OP_STATUS_SUCCESS,
13168                         "authentication not failed");
13169         } else if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
13170                 process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
13171                                 ut_params->op, 0, 1, 0, 0);
13172         else {
13173                 ut_params->op = process_crypto_request(ts_params->valid_devs[0],
13174                         ut_params->op);
13175                 TEST_ASSERT_NULL(ut_params->op, "authentication not failed");
13176         }
13177
13178         return 0;
13179 }
13180
13181 static int
13182 test_authenticated_decryption_fail_when_corruption(
13183                 struct crypto_testsuite_params *ts_params,
13184                 struct crypto_unittest_params *ut_params,
13185                 const struct test_crypto_vector *reference,
13186                 unsigned int data_corrupted)
13187 {
13188         int retval;
13189
13190         uint8_t *ciphertext;
13191         struct rte_cryptodev_info dev_info;
13192
13193         rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
13194         uint64_t feat_flags = dev_info.feature_flags;
13195
13196         if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
13197                         (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
13198                 printf("Device doesn't support RAW data-path APIs.\n");
13199                 return TEST_SKIPPED;
13200         }
13201
13202         /* Verify the capabilities */
13203         struct rte_cryptodev_sym_capability_idx cap_idx;
13204         cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
13205         cap_idx.algo.auth = reference->auth_algo;
13206         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
13207                         &cap_idx) == NULL)
13208                 return TEST_SKIPPED;
13209         cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
13210         cap_idx.algo.cipher = reference->crypto_algo;
13211         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
13212                         &cap_idx) == NULL)
13213                 return TEST_SKIPPED;
13214
13215         /* Create session */
13216         retval = create_auth_cipher_session(ut_params,
13217                         ts_params->valid_devs[0],
13218                         reference,
13219                         RTE_CRYPTO_AUTH_OP_VERIFY,
13220                         RTE_CRYPTO_CIPHER_OP_DECRYPT);
13221         if (retval < 0)
13222                 return retval;
13223
13224         ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
13225         TEST_ASSERT_NOT_NULL(ut_params->ibuf,
13226                         "Failed to allocate input buffer in mempool");
13227
13228         /* clear mbuf payload */
13229         memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
13230                         rte_pktmbuf_tailroom(ut_params->ibuf));
13231
13232         ciphertext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
13233                         reference->ciphertext.len);
13234         TEST_ASSERT_NOT_NULL(ciphertext, "no room to append ciphertext");
13235         memcpy(ciphertext, reference->ciphertext.data,
13236                         reference->ciphertext.len);
13237
13238         /* Create operation */
13239         retval = create_cipher_auth_verify_operation(ts_params,
13240                         ut_params,
13241                         reference);
13242
13243         if (retval < 0)
13244                 return retval;
13245
13246         if (data_corrupted)
13247                 data_corruption(ciphertext);
13248         else
13249                 tag_corruption(ciphertext, reference->ciphertext.len);
13250
13251         if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO) {
13252                 process_cpu_crypt_auth_op(ts_params->valid_devs[0],
13253                         ut_params->op);
13254                 TEST_ASSERT_NOT_EQUAL(ut_params->op->status,
13255                         RTE_CRYPTO_OP_STATUS_SUCCESS,
13256                         "authentication not failed");
13257         } else if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
13258                 process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
13259                                 ut_params->op, 1, 1, 0, 0);
13260         else {
13261                 ut_params->op = process_crypto_request(ts_params->valid_devs[0],
13262                         ut_params->op);
13263                 TEST_ASSERT_NULL(ut_params->op, "authentication not failed");
13264         }
13265
13266         return 0;
13267 }
13268
13269 static int
13270 test_authenticated_encrypt_with_esn(
13271                 struct crypto_testsuite_params *ts_params,
13272                 struct crypto_unittest_params *ut_params,
13273                 const struct test_crypto_vector *reference)
13274 {
13275         int retval;
13276
13277         uint8_t *authciphertext, *plaintext, *auth_tag;
13278         uint16_t plaintext_pad_len;
13279         uint8_t cipher_key[reference->cipher_key.len + 1];
13280         uint8_t auth_key[reference->auth_key.len + 1];
13281         struct rte_cryptodev_info dev_info;
13282
13283         rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
13284         uint64_t feat_flags = dev_info.feature_flags;
13285
13286         if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
13287                         (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
13288                 printf("Device doesn't support RAW data-path APIs.\n");
13289                 return TEST_SKIPPED;
13290         }
13291
13292         /* Verify the capabilities */
13293         struct rte_cryptodev_sym_capability_idx cap_idx;
13294         cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
13295         cap_idx.algo.auth = reference->auth_algo;
13296         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
13297                         &cap_idx) == NULL)
13298                 return TEST_SKIPPED;
13299         cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
13300         cap_idx.algo.cipher = reference->crypto_algo;
13301         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
13302                         &cap_idx) == NULL)
13303                 return TEST_SKIPPED;
13304
13305         /* Create session */
13306         memcpy(cipher_key, reference->cipher_key.data,
13307                         reference->cipher_key.len);
13308         memcpy(auth_key, reference->auth_key.data, reference->auth_key.len);
13309
13310         /* Setup Cipher Parameters */
13311         ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
13312         ut_params->cipher_xform.cipher.algo = reference->crypto_algo;
13313         ut_params->cipher_xform.cipher.op = RTE_CRYPTO_CIPHER_OP_ENCRYPT;
13314         ut_params->cipher_xform.cipher.key.data = cipher_key;
13315         ut_params->cipher_xform.cipher.key.length = reference->cipher_key.len;
13316         ut_params->cipher_xform.cipher.iv.offset = IV_OFFSET;
13317         ut_params->cipher_xform.cipher.iv.length = reference->iv.len;
13318
13319         ut_params->cipher_xform.next = &ut_params->auth_xform;
13320
13321         /* Setup Authentication Parameters */
13322         ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;
13323         ut_params->auth_xform.auth.op = RTE_CRYPTO_AUTH_OP_GENERATE;
13324         ut_params->auth_xform.auth.algo = reference->auth_algo;
13325         ut_params->auth_xform.auth.key.length = reference->auth_key.len;
13326         ut_params->auth_xform.auth.key.data = auth_key;
13327         ut_params->auth_xform.auth.digest_length = reference->digest.len;
13328         ut_params->auth_xform.next = NULL;
13329
13330         /* Create Crypto session*/
13331         ut_params->sess = rte_cryptodev_sym_session_create(
13332                         ts_params->session_mpool);
13333
13334         rte_cryptodev_sym_session_init(ts_params->valid_devs[0],
13335                                 ut_params->sess,
13336                                 &ut_params->cipher_xform,
13337                                 ts_params->session_priv_mpool);
13338
13339         TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed");
13340
13341         ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
13342         TEST_ASSERT_NOT_NULL(ut_params->ibuf,
13343                         "Failed to allocate input buffer in mempool");
13344
13345         /* clear mbuf payload */
13346         memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
13347                         rte_pktmbuf_tailroom(ut_params->ibuf));
13348
13349         plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
13350                         reference->plaintext.len);
13351         TEST_ASSERT_NOT_NULL(plaintext, "no room to append plaintext");
13352         memcpy(plaintext, reference->plaintext.data, reference->plaintext.len);
13353
13354         /* Create operation */
13355         retval = create_cipher_auth_operation(ts_params,
13356                         ut_params,
13357                         reference, 0);
13358
13359         if (retval < 0)
13360                 return retval;
13361
13362         if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
13363                 process_cpu_crypt_auth_op(ts_params->valid_devs[0],
13364                         ut_params->op);
13365         else if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
13366                 process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
13367                                 ut_params->op, 1, 1, 0, 0);
13368         else
13369                 ut_params->op = process_crypto_request(
13370                         ts_params->valid_devs[0], ut_params->op);
13371
13372         TEST_ASSERT_NOT_NULL(ut_params->op, "no crypto operation returned");
13373
13374         TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
13375                         "crypto op processing failed");
13376
13377         plaintext_pad_len = RTE_ALIGN_CEIL(reference->plaintext.len, 16);
13378
13379         authciphertext = rte_pktmbuf_mtod_offset(ut_params->ibuf, uint8_t *,
13380                         ut_params->op->sym->auth.data.offset);
13381         auth_tag = authciphertext + plaintext_pad_len;
13382         debug_hexdump(stdout, "ciphertext:", authciphertext,
13383                         reference->ciphertext.len);
13384         debug_hexdump(stdout, "auth tag:", auth_tag, reference->digest.len);
13385
13386         /* Validate obuf */
13387         TEST_ASSERT_BUFFERS_ARE_EQUAL(
13388                         authciphertext,
13389                         reference->ciphertext.data,
13390                         reference->ciphertext.len,
13391                         "Ciphertext data not as expected");
13392
13393         TEST_ASSERT_BUFFERS_ARE_EQUAL(
13394                         auth_tag,
13395                         reference->digest.data,
13396                         reference->digest.len,
13397                         "Generated digest not as expected");
13398
13399         return TEST_SUCCESS;
13400
13401 }
13402
13403 static int
13404 test_authenticated_decrypt_with_esn(
13405                 struct crypto_testsuite_params *ts_params,
13406                 struct crypto_unittest_params *ut_params,
13407                 const struct test_crypto_vector *reference)
13408 {
13409         int retval;
13410
13411         uint8_t *ciphertext;
13412         uint8_t cipher_key[reference->cipher_key.len + 1];
13413         uint8_t auth_key[reference->auth_key.len + 1];
13414         struct rte_cryptodev_info dev_info;
13415
13416         rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
13417         uint64_t feat_flags = dev_info.feature_flags;
13418
13419         if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
13420                         (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
13421                 printf("Device doesn't support RAW data-path APIs.\n");
13422                 return TEST_SKIPPED;
13423         }
13424
13425         /* Verify the capabilities */
13426         struct rte_cryptodev_sym_capability_idx cap_idx;
13427         cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
13428         cap_idx.algo.auth = reference->auth_algo;
13429         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
13430                         &cap_idx) == NULL)
13431                 return TEST_SKIPPED;
13432         cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
13433         cap_idx.algo.cipher = reference->crypto_algo;
13434         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
13435                         &cap_idx) == NULL)
13436                 return TEST_SKIPPED;
13437
13438         /* Create session */
13439         memcpy(cipher_key, reference->cipher_key.data,
13440                         reference->cipher_key.len);
13441         memcpy(auth_key, reference->auth_key.data, reference->auth_key.len);
13442
13443         /* Setup Authentication Parameters */
13444         ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;
13445         ut_params->auth_xform.auth.op = RTE_CRYPTO_AUTH_OP_VERIFY;
13446         ut_params->auth_xform.auth.algo = reference->auth_algo;
13447         ut_params->auth_xform.auth.key.length = reference->auth_key.len;
13448         ut_params->auth_xform.auth.key.data = auth_key;
13449         ut_params->auth_xform.auth.digest_length = reference->digest.len;
13450         ut_params->auth_xform.next = &ut_params->cipher_xform;
13451
13452         /* Setup Cipher Parameters */
13453         ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
13454         ut_params->cipher_xform.next = NULL;
13455         ut_params->cipher_xform.cipher.algo = reference->crypto_algo;
13456         ut_params->cipher_xform.cipher.op = RTE_CRYPTO_CIPHER_OP_DECRYPT;
13457         ut_params->cipher_xform.cipher.key.data = cipher_key;
13458         ut_params->cipher_xform.cipher.key.length = reference->cipher_key.len;
13459         ut_params->cipher_xform.cipher.iv.offset = IV_OFFSET;
13460         ut_params->cipher_xform.cipher.iv.length = reference->iv.len;
13461
13462         /* Create Crypto session*/
13463         ut_params->sess = rte_cryptodev_sym_session_create(
13464                         ts_params->session_mpool);
13465
13466         rte_cryptodev_sym_session_init(ts_params->valid_devs[0],
13467                                 ut_params->sess,
13468                                 &ut_params->auth_xform,
13469                                 ts_params->session_priv_mpool);
13470
13471         TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed");
13472
13473         ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
13474         TEST_ASSERT_NOT_NULL(ut_params->ibuf,
13475                         "Failed to allocate input buffer in mempool");
13476
13477         /* clear mbuf payload */
13478         memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
13479                         rte_pktmbuf_tailroom(ut_params->ibuf));
13480
13481         ciphertext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
13482                         reference->ciphertext.len);
13483         TEST_ASSERT_NOT_NULL(ciphertext, "no room to append ciphertext");
13484         memcpy(ciphertext, reference->ciphertext.data,
13485                         reference->ciphertext.len);
13486
13487         /* Create operation */
13488         retval = create_cipher_auth_verify_operation(ts_params,
13489                         ut_params,
13490                         reference);
13491
13492         if (retval < 0)
13493                 return retval;
13494
13495         if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
13496                 process_cpu_crypt_auth_op(ts_params->valid_devs[0],
13497                         ut_params->op);
13498         else if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
13499                 process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
13500                                 ut_params->op, 1, 1, 0, 0);
13501         else
13502                 ut_params->op = process_crypto_request(ts_params->valid_devs[0],
13503                         ut_params->op);
13504
13505         TEST_ASSERT_NOT_NULL(ut_params->op, "failed crypto process");
13506         TEST_ASSERT_EQUAL(ut_params->op->status,
13507                         RTE_CRYPTO_OP_STATUS_SUCCESS,
13508                         "crypto op processing passed");
13509
13510         ut_params->obuf = ut_params->op->sym->m_src;
13511         TEST_ASSERT_NOT_NULL(ut_params->obuf, "failed to retrieve obuf");
13512
13513         return 0;
13514 }
13515
13516 static int
13517 create_aead_operation_SGL(enum rte_crypto_aead_operation op,
13518                 const struct aead_test_data *tdata,
13519                 void *digest_mem, uint64_t digest_phys)
13520 {
13521         struct crypto_testsuite_params *ts_params = &testsuite_params;
13522         struct crypto_unittest_params *ut_params = &unittest_params;
13523
13524         const unsigned int auth_tag_len = tdata->auth_tag.len;
13525         const unsigned int iv_len = tdata->iv.len;
13526         unsigned int aad_len = tdata->aad.len;
13527         unsigned int aad_len_pad = 0;
13528
13529         /* Generate Crypto op data structure */
13530         ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
13531                         RTE_CRYPTO_OP_TYPE_SYMMETRIC);
13532         TEST_ASSERT_NOT_NULL(ut_params->op,
13533                 "Failed to allocate symmetric crypto operation struct");
13534
13535         struct rte_crypto_sym_op *sym_op = ut_params->op->sym;
13536
13537         sym_op->aead.digest.data = digest_mem;
13538
13539         TEST_ASSERT_NOT_NULL(sym_op->aead.digest.data,
13540                         "no room to append digest");
13541
13542         sym_op->aead.digest.phys_addr = digest_phys;
13543
13544         if (op == RTE_CRYPTO_AEAD_OP_DECRYPT) {
13545                 rte_memcpy(sym_op->aead.digest.data, tdata->auth_tag.data,
13546                                 auth_tag_len);
13547                 debug_hexdump(stdout, "digest:",
13548                                 sym_op->aead.digest.data,
13549                                 auth_tag_len);
13550         }
13551
13552         /* Append aad data */
13553         if (tdata->algo == RTE_CRYPTO_AEAD_AES_CCM) {
13554                 uint8_t *iv_ptr = rte_crypto_op_ctod_offset(ut_params->op,
13555                                 uint8_t *, IV_OFFSET);
13556
13557                 /* Copy IV 1 byte after the IV pointer, according to the API */
13558                 rte_memcpy(iv_ptr + 1, tdata->iv.data, iv_len);
13559
13560                 aad_len = RTE_ALIGN_CEIL(aad_len + 18, 16);
13561
13562                 sym_op->aead.aad.data = (uint8_t *)rte_pktmbuf_prepend(
13563                                 ut_params->ibuf, aad_len);
13564                 TEST_ASSERT_NOT_NULL(sym_op->aead.aad.data,
13565                                 "no room to prepend aad");
13566                 sym_op->aead.aad.phys_addr = rte_pktmbuf_iova(
13567                                 ut_params->ibuf);
13568
13569                 memset(sym_op->aead.aad.data, 0, aad_len);
13570                 /* Copy AAD 18 bytes after the AAD pointer, according to the API */
13571                 rte_memcpy(sym_op->aead.aad.data, tdata->aad.data, aad_len);
13572
13573                 debug_hexdump(stdout, "iv:", iv_ptr, iv_len);
13574                 debug_hexdump(stdout, "aad:",
13575                                 sym_op->aead.aad.data, aad_len);
13576         } else {
13577                 uint8_t *iv_ptr = rte_crypto_op_ctod_offset(ut_params->op,
13578                                 uint8_t *, IV_OFFSET);
13579
13580                 rte_memcpy(iv_ptr, tdata->iv.data, iv_len);
13581
13582                 aad_len_pad = RTE_ALIGN_CEIL(aad_len, 16);
13583
13584                 sym_op->aead.aad.data = (uint8_t *)rte_pktmbuf_prepend(
13585                                 ut_params->ibuf, aad_len_pad);
13586                 TEST_ASSERT_NOT_NULL(sym_op->aead.aad.data,
13587                                 "no room to prepend aad");
13588                 sym_op->aead.aad.phys_addr = rte_pktmbuf_iova(
13589                                 ut_params->ibuf);
13590
13591                 memset(sym_op->aead.aad.data, 0, aad_len);
13592                 rte_memcpy(sym_op->aead.aad.data, tdata->aad.data, aad_len);
13593
13594                 debug_hexdump(stdout, "iv:", iv_ptr, iv_len);
13595                 debug_hexdump(stdout, "aad:",
13596                                 sym_op->aead.aad.data, aad_len);
13597         }
13598
13599         sym_op->aead.data.length = tdata->plaintext.len;
13600         sym_op->aead.data.offset = aad_len_pad;
13601
13602         return 0;
13603 }
13604
13605 #define SGL_MAX_NO      16
13606
13607 static int
13608 test_authenticated_encryption_SGL(const struct aead_test_data *tdata,
13609                 const int oop, uint32_t fragsz, uint32_t fragsz_oop)
13610 {
13611         struct crypto_testsuite_params *ts_params = &testsuite_params;
13612         struct crypto_unittest_params *ut_params = &unittest_params;
13613         struct rte_mbuf *buf, *buf_oop = NULL, *buf_last_oop = NULL;
13614         int retval;
13615         int to_trn = 0;
13616         int to_trn_tbl[SGL_MAX_NO];
13617         int segs = 1;
13618         unsigned int trn_data = 0;
13619         uint8_t *plaintext, *ciphertext, *auth_tag;
13620         struct rte_cryptodev_info dev_info;
13621
13622         /* Verify the capabilities */
13623         struct rte_cryptodev_sym_capability_idx cap_idx;
13624         cap_idx.type = RTE_CRYPTO_SYM_XFORM_AEAD;
13625         cap_idx.algo.aead = tdata->algo;
13626         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
13627                         &cap_idx) == NULL)
13628                 return TEST_SKIPPED;
13629
13630         /* OOP not supported with CPU crypto */
13631         if (oop && gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
13632                 return TEST_SKIPPED;
13633
13634         /* Detailed check for the particular SGL support flag */
13635         rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
13636         if (!oop) {
13637                 unsigned int sgl_in = fragsz < tdata->plaintext.len;
13638                 if (sgl_in && (!(dev_info.feature_flags &
13639                                 RTE_CRYPTODEV_FF_IN_PLACE_SGL)))
13640                         return TEST_SKIPPED;
13641
13642                 uint64_t feat_flags = dev_info.feature_flags;
13643
13644                 if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
13645                         (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
13646                         printf("Device doesn't support RAW data-path APIs.\n");
13647                         return TEST_SKIPPED;
13648                 }
13649         } else {
13650                 unsigned int sgl_in = fragsz < tdata->plaintext.len;
13651                 unsigned int sgl_out = (fragsz_oop ? fragsz_oop : fragsz) <
13652                                 tdata->plaintext.len;
13653                 /* Raw data path API does not support OOP */
13654                 if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
13655                         return TEST_SKIPPED;
13656                 if (sgl_in && !sgl_out) {
13657                         if (!(dev_info.feature_flags &
13658                                         RTE_CRYPTODEV_FF_OOP_SGL_IN_LB_OUT))
13659                                 return TEST_SKIPPED;
13660                 } else if (!sgl_in && sgl_out) {
13661                         if (!(dev_info.feature_flags &
13662                                         RTE_CRYPTODEV_FF_OOP_LB_IN_SGL_OUT))
13663                                 return TEST_SKIPPED;
13664                 } else if (sgl_in && sgl_out) {
13665                         if (!(dev_info.feature_flags &
13666                                         RTE_CRYPTODEV_FF_OOP_SGL_IN_SGL_OUT))
13667                                 return TEST_SKIPPED;
13668                 }
13669         }
13670
13671         if (fragsz > tdata->plaintext.len)
13672                 fragsz = tdata->plaintext.len;
13673
13674         uint16_t plaintext_len = fragsz;
13675         uint16_t frag_size_oop = fragsz_oop ? fragsz_oop : fragsz;
13676
13677         if (fragsz_oop > tdata->plaintext.len)
13678                 frag_size_oop = tdata->plaintext.len;
13679
13680         int ecx = 0;
13681         void *digest_mem = NULL;
13682
13683         uint32_t prepend_len = RTE_ALIGN_CEIL(tdata->aad.len, 16);
13684
13685         if (tdata->plaintext.len % fragsz != 0) {
13686                 if (tdata->plaintext.len / fragsz + 1 > SGL_MAX_NO)
13687                         return 1;
13688         }       else {
13689                 if (tdata->plaintext.len / fragsz > SGL_MAX_NO)
13690                         return 1;
13691         }
13692
13693         /*
13694          * For out-op-place we need to alloc another mbuf
13695          */
13696         if (oop) {
13697                 ut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
13698                 rte_pktmbuf_append(ut_params->obuf,
13699                                 frag_size_oop + prepend_len);
13700                 buf_oop = ut_params->obuf;
13701         }
13702
13703         /* Create AEAD session */
13704         retval = create_aead_session(ts_params->valid_devs[0],
13705                         tdata->algo,
13706                         RTE_CRYPTO_AEAD_OP_ENCRYPT,
13707                         tdata->key.data, tdata->key.len,
13708                         tdata->aad.len, tdata->auth_tag.len,
13709                         tdata->iv.len);
13710         if (retval < 0)
13711                 return retval;
13712
13713         ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
13714
13715         /* clear mbuf payload */
13716         memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
13717                         rte_pktmbuf_tailroom(ut_params->ibuf));
13718
13719         plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
13720                         plaintext_len);
13721
13722         memcpy(plaintext, tdata->plaintext.data, plaintext_len);
13723
13724         trn_data += plaintext_len;
13725
13726         buf = ut_params->ibuf;
13727
13728         /*
13729          * Loop until no more fragments
13730          */
13731
13732         while (trn_data < tdata->plaintext.len) {
13733                 ++segs;
13734                 to_trn = (tdata->plaintext.len - trn_data < fragsz) ?
13735                                 (tdata->plaintext.len - trn_data) : fragsz;
13736
13737                 to_trn_tbl[ecx++] = to_trn;
13738
13739                 buf->next = rte_pktmbuf_alloc(ts_params->mbuf_pool);
13740                 buf = buf->next;
13741
13742                 memset(rte_pktmbuf_mtod(buf, uint8_t *), 0,
13743                                 rte_pktmbuf_tailroom(buf));
13744
13745                 /* OOP */
13746                 if (oop && !fragsz_oop) {
13747                         buf_last_oop = buf_oop->next =
13748                                         rte_pktmbuf_alloc(ts_params->mbuf_pool);
13749                         buf_oop = buf_oop->next;
13750                         memset(rte_pktmbuf_mtod(buf_oop, uint8_t *),
13751                                         0, rte_pktmbuf_tailroom(buf_oop));
13752                         rte_pktmbuf_append(buf_oop, to_trn);
13753                 }
13754
13755                 plaintext = (uint8_t *)rte_pktmbuf_append(buf,
13756                                 to_trn);
13757
13758                 memcpy(plaintext, tdata->plaintext.data + trn_data,
13759                                 to_trn);
13760                 trn_data += to_trn;
13761                 if (trn_data  == tdata->plaintext.len) {
13762                         if (oop) {
13763                                 if (!fragsz_oop)
13764                                         digest_mem = rte_pktmbuf_append(buf_oop,
13765                                                 tdata->auth_tag.len);
13766                         } else
13767                                 digest_mem = (uint8_t *)rte_pktmbuf_append(buf,
13768                                         tdata->auth_tag.len);
13769                 }
13770         }
13771
13772         uint64_t digest_phys = 0;
13773
13774         ut_params->ibuf->nb_segs = segs;
13775
13776         segs = 1;
13777         if (fragsz_oop && oop) {
13778                 to_trn = 0;
13779                 ecx = 0;
13780
13781                 if (frag_size_oop == tdata->plaintext.len) {
13782                         digest_mem = rte_pktmbuf_append(ut_params->obuf,
13783                                 tdata->auth_tag.len);
13784
13785                         digest_phys = rte_pktmbuf_iova_offset(
13786                                         ut_params->obuf,
13787                                         tdata->plaintext.len + prepend_len);
13788                 }
13789
13790                 trn_data = frag_size_oop;
13791                 while (trn_data < tdata->plaintext.len) {
13792                         ++segs;
13793                         to_trn =
13794                                 (tdata->plaintext.len - trn_data <
13795                                                 frag_size_oop) ?
13796                                 (tdata->plaintext.len - trn_data) :
13797                                                 frag_size_oop;
13798
13799                         to_trn_tbl[ecx++] = to_trn;
13800
13801                         buf_last_oop = buf_oop->next =
13802                                         rte_pktmbuf_alloc(ts_params->mbuf_pool);
13803                         buf_oop = buf_oop->next;
13804                         memset(rte_pktmbuf_mtod(buf_oop, uint8_t *),
13805                                         0, rte_pktmbuf_tailroom(buf_oop));
13806                         rte_pktmbuf_append(buf_oop, to_trn);
13807
13808                         trn_data += to_trn;
13809
13810                         if (trn_data  == tdata->plaintext.len) {
13811                                 digest_mem = rte_pktmbuf_append(buf_oop,
13812                                         tdata->auth_tag.len);
13813                         }
13814                 }
13815
13816                 ut_params->obuf->nb_segs = segs;
13817         }
13818
13819         /*
13820          * Place digest at the end of the last buffer
13821          */
13822         if (!digest_phys)
13823                 digest_phys = rte_pktmbuf_iova(buf) + to_trn;
13824         if (oop && buf_last_oop)
13825                 digest_phys = rte_pktmbuf_iova(buf_last_oop) + to_trn;
13826
13827         if (!digest_mem && !oop) {
13828                 digest_mem = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
13829                                 + tdata->auth_tag.len);
13830                 digest_phys = rte_pktmbuf_iova_offset(ut_params->ibuf,
13831                                 tdata->plaintext.len);
13832         }
13833
13834         /* Create AEAD operation */
13835         retval = create_aead_operation_SGL(RTE_CRYPTO_AEAD_OP_ENCRYPT,
13836                         tdata, digest_mem, digest_phys);
13837
13838         if (retval < 0)
13839                 return retval;
13840
13841         rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
13842
13843         ut_params->op->sym->m_src = ut_params->ibuf;
13844         if (oop)
13845                 ut_params->op->sym->m_dst = ut_params->obuf;
13846
13847         /* Process crypto operation */
13848         if (oop == IN_PLACE &&
13849                         gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
13850                 process_cpu_aead_op(ts_params->valid_devs[0], ut_params->op);
13851         else if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
13852                 process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
13853                                 ut_params->op, 0, 0, 0, 0);
13854         else
13855                 TEST_ASSERT_NOT_NULL(
13856                         process_crypto_request(ts_params->valid_devs[0],
13857                         ut_params->op), "failed to process sym crypto op");
13858
13859         TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
13860                         "crypto op processing failed");
13861
13862
13863         ciphertext = rte_pktmbuf_mtod_offset(ut_params->op->sym->m_src,
13864                         uint8_t *, prepend_len);
13865         if (oop) {
13866                 ciphertext = rte_pktmbuf_mtod_offset(ut_params->op->sym->m_dst,
13867                                 uint8_t *, prepend_len);
13868         }
13869
13870         if (fragsz_oop)
13871                 fragsz = fragsz_oop;
13872
13873         TEST_ASSERT_BUFFERS_ARE_EQUAL(
13874                         ciphertext,
13875                         tdata->ciphertext.data,
13876                         fragsz,
13877                         "Ciphertext data not as expected");
13878
13879         buf = ut_params->op->sym->m_src->next;
13880         if (oop)
13881                 buf = ut_params->op->sym->m_dst->next;
13882
13883         unsigned int off = fragsz;
13884
13885         ecx = 0;
13886         while (buf) {
13887                 ciphertext = rte_pktmbuf_mtod(buf,
13888                                 uint8_t *);
13889
13890                 TEST_ASSERT_BUFFERS_ARE_EQUAL(
13891                                 ciphertext,
13892                                 tdata->ciphertext.data + off,
13893                                 to_trn_tbl[ecx],
13894                                 "Ciphertext data not as expected");
13895
13896                 off += to_trn_tbl[ecx++];
13897                 buf = buf->next;
13898         }
13899
13900         auth_tag = digest_mem;
13901         TEST_ASSERT_BUFFERS_ARE_EQUAL(
13902                         auth_tag,
13903                         tdata->auth_tag.data,
13904                         tdata->auth_tag.len,
13905                         "Generated auth tag not as expected");
13906
13907         return 0;
13908 }
13909
13910 static int
13911 test_AES_GCM_auth_encrypt_SGL_out_of_place_400B_400B(void)
13912 {
13913         return test_authenticated_encryption_SGL(
13914                         &gcm_test_case_SGL_1, OUT_OF_PLACE, 400, 400);
13915 }
13916
13917 static int
13918 test_AES_GCM_auth_encrypt_SGL_out_of_place_1500B_2000B(void)
13919 {
13920         return test_authenticated_encryption_SGL(
13921                         &gcm_test_case_SGL_1, OUT_OF_PLACE, 1500, 2000);
13922 }
13923
13924 static int
13925 test_AES_GCM_auth_encrypt_SGL_out_of_place_400B_1seg(void)
13926 {
13927         return test_authenticated_encryption_SGL(
13928                         &gcm_test_case_8, OUT_OF_PLACE, 400,
13929                         gcm_test_case_8.plaintext.len);
13930 }
13931
13932 static int
13933 test_AES_GCM_auth_encrypt_SGL_in_place_1500B(void)
13934 {
13935         /* This test is not for OPENSSL PMD */
13936         if (gbl_driver_id == rte_cryptodev_driver_id_get(
13937                         RTE_STR(CRYPTODEV_NAME_OPENSSL_PMD)))
13938                 return TEST_SKIPPED;
13939
13940         return test_authenticated_encryption_SGL(
13941                         &gcm_test_case_SGL_1, IN_PLACE, 1500, 0);
13942 }
13943
13944 static int
13945 test_authentication_verify_fail_when_data_corrupted(
13946                 struct crypto_testsuite_params *ts_params,
13947                 struct crypto_unittest_params *ut_params,
13948                 const struct test_crypto_vector *reference)
13949 {
13950         return test_authentication_verify_fail_when_data_corruption(
13951                         ts_params, ut_params, reference, 1);
13952 }
13953
13954 static int
13955 test_authentication_verify_fail_when_tag_corrupted(
13956                 struct crypto_testsuite_params *ts_params,
13957                 struct crypto_unittest_params *ut_params,
13958                 const struct test_crypto_vector *reference)
13959 {
13960         return test_authentication_verify_fail_when_data_corruption(
13961                         ts_params, ut_params, reference, 0);
13962 }
13963
13964 static int
13965 test_authentication_verify_GMAC_fail_when_data_corrupted(
13966                 struct crypto_testsuite_params *ts_params,
13967                 struct crypto_unittest_params *ut_params,
13968                 const struct test_crypto_vector *reference)
13969 {
13970         return test_authentication_verify_GMAC_fail_when_corruption(
13971                         ts_params, ut_params, reference, 1);
13972 }
13973
13974 static int
13975 test_authentication_verify_GMAC_fail_when_tag_corrupted(
13976                 struct crypto_testsuite_params *ts_params,
13977                 struct crypto_unittest_params *ut_params,
13978                 const struct test_crypto_vector *reference)
13979 {
13980         return test_authentication_verify_GMAC_fail_when_corruption(
13981                         ts_params, ut_params, reference, 0);
13982 }
13983
13984 static int
13985 test_authenticated_decryption_fail_when_data_corrupted(
13986                 struct crypto_testsuite_params *ts_params,
13987                 struct crypto_unittest_params *ut_params,
13988                 const struct test_crypto_vector *reference)
13989 {
13990         return test_authenticated_decryption_fail_when_corruption(
13991                         ts_params, ut_params, reference, 1);
13992 }
13993
13994 static int
13995 test_authenticated_decryption_fail_when_tag_corrupted(
13996                 struct crypto_testsuite_params *ts_params,
13997                 struct crypto_unittest_params *ut_params,
13998                 const struct test_crypto_vector *reference)
13999 {
14000         return test_authenticated_decryption_fail_when_corruption(
14001                         ts_params, ut_params, reference, 0);
14002 }
14003
14004 static int
14005 authentication_verify_HMAC_SHA1_fail_data_corrupt(void)
14006 {
14007         return test_authentication_verify_fail_when_data_corrupted(
14008                         &testsuite_params, &unittest_params,
14009                         &hmac_sha1_test_crypto_vector);
14010 }
14011
14012 static int
14013 authentication_verify_HMAC_SHA1_fail_tag_corrupt(void)
14014 {
14015         return test_authentication_verify_fail_when_tag_corrupted(
14016                         &testsuite_params, &unittest_params,
14017                         &hmac_sha1_test_crypto_vector);
14018 }
14019
14020 static int
14021 authentication_verify_AES128_GMAC_fail_data_corrupt(void)
14022 {
14023         return test_authentication_verify_GMAC_fail_when_data_corrupted(
14024                         &testsuite_params, &unittest_params,
14025                         &aes128_gmac_test_vector);
14026 }
14027
14028 static int
14029 authentication_verify_AES128_GMAC_fail_tag_corrupt(void)
14030 {
14031         return test_authentication_verify_GMAC_fail_when_tag_corrupted(
14032                         &testsuite_params, &unittest_params,
14033                         &aes128_gmac_test_vector);
14034 }
14035
14036 static int
14037 auth_decryption_AES128CBC_HMAC_SHA1_fail_data_corrupt(void)
14038 {
14039         return test_authenticated_decryption_fail_when_data_corrupted(
14040                         &testsuite_params,
14041                         &unittest_params,
14042                         &aes128cbc_hmac_sha1_test_vector);
14043 }
14044
14045 static int
14046 auth_decryption_AES128CBC_HMAC_SHA1_fail_tag_corrupt(void)
14047 {
14048         return test_authenticated_decryption_fail_when_tag_corrupted(
14049                         &testsuite_params,
14050                         &unittest_params,
14051                         &aes128cbc_hmac_sha1_test_vector);
14052 }
14053
14054 static int
14055 auth_encrypt_AES128CBC_HMAC_SHA1_esn_check(void)
14056 {
14057         return test_authenticated_encrypt_with_esn(
14058                         &testsuite_params,
14059                         &unittest_params,
14060                         &aes128cbc_hmac_sha1_aad_test_vector);
14061 }
14062
14063 static int
14064 auth_decrypt_AES128CBC_HMAC_SHA1_esn_check(void)
14065 {
14066         return test_authenticated_decrypt_with_esn(
14067                         &testsuite_params,
14068                         &unittest_params,
14069                         &aes128cbc_hmac_sha1_aad_test_vector);
14070 }
14071
14072 static int
14073 test_chacha20_poly1305_encrypt_test_case_rfc8439(void)
14074 {
14075         return test_authenticated_encryption(&chacha20_poly1305_case_rfc8439);
14076 }
14077
14078 static int
14079 test_chacha20_poly1305_decrypt_test_case_rfc8439(void)
14080 {
14081         return test_authenticated_decryption(&chacha20_poly1305_case_rfc8439);
14082 }
14083
14084 #ifdef RTE_CRYPTO_SCHEDULER
14085
14086 /* global AESNI worker IDs for the scheduler test */
14087 uint8_t aesni_ids[2];
14088
14089 static int
14090 scheduler_testsuite_setup(void)
14091 {
14092         uint32_t i = 0;
14093         int32_t nb_devs, ret;
14094         char vdev_args[VDEV_ARGS_SIZE] = {""};
14095         char temp_str[VDEV_ARGS_SIZE] = {"mode=multi-core,"
14096                 "ordering=enable,name=cryptodev_test_scheduler,corelist="};
14097         uint16_t worker_core_count = 0;
14098         uint16_t socket_id = 0;
14099
14100         if (gbl_driver_id == rte_cryptodev_driver_id_get(
14101                         RTE_STR(CRYPTODEV_NAME_SCHEDULER_PMD))) {
14102
14103                 /* Identify the Worker Cores
14104                  * Use 2 worker cores for the device args
14105                  */
14106                 RTE_LCORE_FOREACH_WORKER(i) {
14107                         if (worker_core_count > 1)
14108                                 break;
14109                         snprintf(vdev_args, sizeof(vdev_args),
14110                                         "%s%d", temp_str, i);
14111                         strcpy(temp_str, vdev_args);
14112                         strlcat(temp_str, ";", sizeof(temp_str));
14113                         worker_core_count++;
14114                         socket_id = rte_lcore_to_socket_id(i);
14115                 }
14116                 if (worker_core_count != 2) {
14117                         RTE_LOG(ERR, USER1,
14118                                 "Cryptodev scheduler test require at least "
14119                                 "two worker cores to run. "
14120                                 "Please use the correct coremask.\n");
14121                         return TEST_FAILED;
14122                 }
14123                 strcpy(temp_str, vdev_args);
14124                 snprintf(vdev_args, sizeof(vdev_args), "%s,socket_id=%d",
14125                                 temp_str, socket_id);
14126                 RTE_LOG(DEBUG, USER1, "vdev_args: %s\n", vdev_args);
14127                 nb_devs = rte_cryptodev_device_count_by_driver(
14128                                 rte_cryptodev_driver_id_get(
14129                                 RTE_STR(CRYPTODEV_NAME_SCHEDULER_PMD)));
14130                 if (nb_devs < 1) {
14131                         ret = rte_vdev_init(
14132                                 RTE_STR(CRYPTODEV_NAME_SCHEDULER_PMD),
14133                                         vdev_args);
14134                         TEST_ASSERT(ret == 0,
14135                                 "Failed to create instance %u of pmd : %s",
14136                                 i, RTE_STR(CRYPTODEV_NAME_SCHEDULER_PMD));
14137                 }
14138         }
14139         return testsuite_setup();
14140 }
14141
14142 static int
14143 test_scheduler_attach_worker_op(void)
14144 {
14145         struct crypto_testsuite_params *ts_params = &testsuite_params;
14146         uint8_t sched_id = ts_params->valid_devs[0];
14147         uint32_t i, nb_devs_attached = 0;
14148         int ret;
14149         char vdev_name[32];
14150         unsigned int count = rte_cryptodev_count();
14151
14152         /* create 2 AESNI_MB vdevs on top of existing devices */
14153         for (i = count; i < count + 2; i++) {
14154                 snprintf(vdev_name, sizeof(vdev_name), "%s_%u",
14155                                 RTE_STR(CRYPTODEV_NAME_AESNI_MB_PMD),
14156                                 i);
14157                 ret = rte_vdev_init(vdev_name, NULL);
14158
14159                 TEST_ASSERT(ret == 0,
14160                         "Failed to create instance %u of"
14161                         " pmd : %s",
14162                         i, RTE_STR(CRYPTODEV_NAME_AESNI_MB_PMD));
14163
14164                 if (ret < 0) {
14165                         RTE_LOG(ERR, USER1,
14166                                 "Failed to create 2 AESNI MB PMDs.\n");
14167                         return TEST_SKIPPED;
14168                 }
14169         }
14170
14171         /* attach 2 AESNI_MB cdevs */
14172         for (i = count; i < count + 2; i++) {
14173                 struct rte_cryptodev_info info;
14174                 unsigned int session_size;
14175
14176                 rte_cryptodev_info_get(i, &info);
14177                 if (info.driver_id != rte_cryptodev_driver_id_get(
14178                                 RTE_STR(CRYPTODEV_NAME_AESNI_MB_PMD)))
14179                         continue;
14180
14181                 session_size = rte_cryptodev_sym_get_private_session_size(i);
14182                 /*
14183                  * Create the session mempool again, since now there are new devices
14184                  * to use the mempool.
14185                  */
14186                 if (ts_params->session_mpool) {
14187                         rte_mempool_free(ts_params->session_mpool);
14188                         ts_params->session_mpool = NULL;
14189                 }
14190                 if (ts_params->session_priv_mpool) {
14191                         rte_mempool_free(ts_params->session_priv_mpool);
14192                         ts_params->session_priv_mpool = NULL;
14193                 }
14194
14195                 if (info.sym.max_nb_sessions != 0 &&
14196                                 info.sym.max_nb_sessions < MAX_NB_SESSIONS) {
14197                         RTE_LOG(ERR, USER1,
14198                                         "Device does not support "
14199                                         "at least %u sessions\n",
14200                                         MAX_NB_SESSIONS);
14201                         return TEST_FAILED;
14202                 }
14203                 /*
14204                  * Create mempool with maximum number of sessions,
14205                  * to include the session headers
14206                  */
14207                 if (ts_params->session_mpool == NULL) {
14208                         ts_params->session_mpool =
14209                                 rte_cryptodev_sym_session_pool_create(
14210                                                 "test_sess_mp",
14211                                                 MAX_NB_SESSIONS, 0, 0, 0,
14212                                                 SOCKET_ID_ANY);
14213                         TEST_ASSERT_NOT_NULL(ts_params->session_mpool,
14214                                         "session mempool allocation failed");
14215                 }
14216
14217                 /*
14218                  * Create mempool with maximum number of sessions,
14219                  * to include device specific session private data
14220                  */
14221                 if (ts_params->session_priv_mpool == NULL) {
14222                         ts_params->session_priv_mpool = rte_mempool_create(
14223                                         "test_sess_mp_priv",
14224                                         MAX_NB_SESSIONS,
14225                                         session_size,
14226                                         0, 0, NULL, NULL, NULL,
14227                                         NULL, SOCKET_ID_ANY,
14228                                         0);
14229
14230                         TEST_ASSERT_NOT_NULL(ts_params->session_priv_mpool,
14231                                         "session mempool allocation failed");
14232                 }
14233
14234                 ts_params->qp_conf.mp_session = ts_params->session_mpool;
14235                 ts_params->qp_conf.mp_session_private =
14236                                 ts_params->session_priv_mpool;
14237
14238                 ret = rte_cryptodev_scheduler_worker_attach(sched_id,
14239                                 (uint8_t)i);
14240
14241                 TEST_ASSERT(ret == 0,
14242                         "Failed to attach device %u of pmd : %s", i,
14243                         RTE_STR(CRYPTODEV_NAME_AESNI_MB_PMD));
14244
14245                 aesni_ids[nb_devs_attached] = (uint8_t)i;
14246
14247                 nb_devs_attached++;
14248         }
14249
14250         return 0;
14251 }
14252
14253 static int
14254 test_scheduler_detach_worker_op(void)
14255 {
14256         struct crypto_testsuite_params *ts_params = &testsuite_params;
14257         uint8_t sched_id = ts_params->valid_devs[0];
14258         uint32_t i;
14259         int ret;
14260
14261         for (i = 0; i < 2; i++) {
14262                 ret = rte_cryptodev_scheduler_worker_detach(sched_id,
14263                                 aesni_ids[i]);
14264                 TEST_ASSERT(ret == 0,
14265                         "Failed to detach device %u", aesni_ids[i]);
14266         }
14267
14268         return 0;
14269 }
14270
14271 static int
14272 test_scheduler_mode_op(enum rte_cryptodev_scheduler_mode scheduler_mode)
14273 {
14274         struct crypto_testsuite_params *ts_params = &testsuite_params;
14275         uint8_t sched_id = ts_params->valid_devs[0];
14276         /* set mode */
14277         return rte_cryptodev_scheduler_mode_set(sched_id,
14278                 scheduler_mode);
14279 }
14280
14281 static int
14282 test_scheduler_mode_roundrobin_op(void)
14283 {
14284         TEST_ASSERT(test_scheduler_mode_op(CDEV_SCHED_MODE_ROUNDROBIN) ==
14285                         0, "Failed to set roundrobin mode");
14286         return 0;
14287
14288 }
14289
14290 static int
14291 test_scheduler_mode_multicore_op(void)
14292 {
14293         TEST_ASSERT(test_scheduler_mode_op(CDEV_SCHED_MODE_MULTICORE) ==
14294                         0, "Failed to set multicore mode");
14295
14296         return 0;
14297 }
14298
14299 static int
14300 test_scheduler_mode_failover_op(void)
14301 {
14302         TEST_ASSERT(test_scheduler_mode_op(CDEV_SCHED_MODE_FAILOVER) ==
14303                         0, "Failed to set failover mode");
14304
14305         return 0;
14306 }
14307
14308 static int
14309 test_scheduler_mode_pkt_size_distr_op(void)
14310 {
14311         TEST_ASSERT(test_scheduler_mode_op(CDEV_SCHED_MODE_PKT_SIZE_DISTR) ==
14312                         0, "Failed to set pktsize mode");
14313
14314         return 0;
14315 }
14316
14317 static int
14318 scheduler_multicore_testsuite_setup(void)
14319 {
14320         if (test_scheduler_attach_worker_op() < 0)
14321                 return TEST_SKIPPED;
14322         if (test_scheduler_mode_op(CDEV_SCHED_MODE_MULTICORE) < 0)
14323                 return TEST_SKIPPED;
14324         return 0;
14325 }
14326
14327 static int
14328 scheduler_roundrobin_testsuite_setup(void)
14329 {
14330         if (test_scheduler_attach_worker_op() < 0)
14331                 return TEST_SKIPPED;
14332         if (test_scheduler_mode_op(CDEV_SCHED_MODE_ROUNDROBIN) < 0)
14333                 return TEST_SKIPPED;
14334         return 0;
14335 }
14336
14337 static int
14338 scheduler_failover_testsuite_setup(void)
14339 {
14340         if (test_scheduler_attach_worker_op() < 0)
14341                 return TEST_SKIPPED;
14342         if (test_scheduler_mode_op(CDEV_SCHED_MODE_FAILOVER) < 0)
14343                 return TEST_SKIPPED;
14344         return 0;
14345 }
14346
14347 static int
14348 scheduler_pkt_size_distr_testsuite_setup(void)
14349 {
14350         if (test_scheduler_attach_worker_op() < 0)
14351                 return TEST_SKIPPED;
14352         if (test_scheduler_mode_op(CDEV_SCHED_MODE_PKT_SIZE_DISTR) < 0)
14353                 return TEST_SKIPPED;
14354         return 0;
14355 }
14356
14357 static void
14358 scheduler_mode_testsuite_teardown(void)
14359 {
14360         test_scheduler_detach_worker_op();
14361 }
14362
14363 #endif /* RTE_CRYPTO_SCHEDULER */
14364
14365 static struct unit_test_suite end_testsuite = {
14366         .suite_name = NULL,
14367         .setup = NULL,
14368         .teardown = NULL,
14369         .unit_test_suites = NULL
14370 };
14371
14372 #ifdef RTE_LIB_SECURITY
14373 static struct unit_test_suite ipsec_proto_testsuite  = {
14374         .suite_name = "IPsec Proto Unit Test Suite",
14375         .setup = ipsec_proto_testsuite_setup,
14376         .unit_test_cases = {
14377                 TEST_CASE_NAMED_WITH_DATA(
14378                         "Outbound known vector (ESP tunnel mode IPv4 AES-GCM 128)",
14379                         ut_setup_security, ut_teardown,
14380                         test_ipsec_proto_known_vec, &pkt_aes_128_gcm),
14381                 TEST_CASE_NAMED_WITH_DATA(
14382                         "Outbound known vector (ESP tunnel mode IPv4 AES-GCM 192)",
14383                         ut_setup_security, ut_teardown,
14384                         test_ipsec_proto_known_vec, &pkt_aes_192_gcm),
14385                 TEST_CASE_NAMED_WITH_DATA(
14386                         "Outbound known vector (ESP tunnel mode IPv4 AES-GCM 256)",
14387                         ut_setup_security, ut_teardown,
14388                         test_ipsec_proto_known_vec, &pkt_aes_256_gcm),
14389                 TEST_CASE_NAMED_WITH_DATA(
14390                         "Inbound known vector (ESP tunnel mode IPv4 AES-GCM 128)",
14391                         ut_setup_security, ut_teardown,
14392                         test_ipsec_proto_known_vec_inb, &pkt_aes_128_gcm),
14393                 TEST_CASE_NAMED_WITH_DATA(
14394                         "Inbound known vector (ESP tunnel mode IPv4 AES-GCM 192)",
14395                         ut_setup_security, ut_teardown,
14396                         test_ipsec_proto_known_vec_inb, &pkt_aes_192_gcm),
14397                 TEST_CASE_NAMED_WITH_DATA(
14398                         "Inbound known vector (ESP tunnel mode IPv4 AES-GCM 256)",
14399                         ut_setup_security, ut_teardown,
14400                         test_ipsec_proto_known_vec_inb, &pkt_aes_256_gcm),
14401                 TEST_CASE_NAMED_ST(
14402                         "Combined test alg list",
14403                         ut_setup_security, ut_teardown,
14404                         test_ipsec_proto_display_list),
14405                 TEST_CASE_NAMED_ST(
14406                         "IV generation",
14407                         ut_setup_security, ut_teardown,
14408                         test_ipsec_proto_iv_gen),
14409                 TEST_CASE_NAMED_ST(
14410                         "UDP encapsulation",
14411                         ut_setup_security, ut_teardown,
14412                         test_ipsec_proto_udp_encap),
14413                 TEST_CASE_NAMED_ST(
14414                         "UDP encapsulation ports verification test",
14415                         ut_setup_security, ut_teardown,
14416                         test_ipsec_proto_udp_ports_verify),
14417                 TEST_CASE_NAMED_ST(
14418                         "SA expiry packets soft",
14419                         ut_setup_security, ut_teardown,
14420                         test_ipsec_proto_sa_exp_pkts_soft),
14421                 TEST_CASE_NAMED_ST(
14422                         "SA expiry packets hard",
14423                         ut_setup_security, ut_teardown,
14424                         test_ipsec_proto_sa_exp_pkts_hard),
14425                 TEST_CASE_NAMED_ST(
14426                         "Negative test: ICV corruption",
14427                         ut_setup_security, ut_teardown,
14428                         test_ipsec_proto_err_icv_corrupt),
14429                 TEST_CASE_NAMED_ST(
14430                         "Tunnel dst addr verification",
14431                         ut_setup_security, ut_teardown,
14432                         test_ipsec_proto_tunnel_dst_addr_verify),
14433                 TEST_CASE_NAMED_ST(
14434                         "Tunnel src and dst addr verification",
14435                         ut_setup_security, ut_teardown,
14436                         test_ipsec_proto_tunnel_src_dst_addr_verify),
14437                 TEST_CASE_NAMED_ST(
14438                         "Inner IP checksum",
14439                         ut_setup_security, ut_teardown,
14440                         test_ipsec_proto_inner_ip_csum),
14441                 TEST_CASE_NAMED_ST(
14442                         "Inner L4 checksum",
14443                         ut_setup_security, ut_teardown,
14444                         test_ipsec_proto_inner_l4_csum),
14445                 TEST_CASES_END() /**< NULL terminate unit test array */
14446         }
14447 };
14448
14449 static struct unit_test_suite pdcp_proto_testsuite  = {
14450         .suite_name = "PDCP Proto Unit Test Suite",
14451         .setup = pdcp_proto_testsuite_setup,
14452         .unit_test_cases = {
14453                 TEST_CASE_ST(ut_setup_security, ut_teardown,
14454                         test_PDCP_PROTO_all),
14455                 TEST_CASES_END() /**< NULL terminate unit test array */
14456         }
14457 };
14458
14459 static struct unit_test_suite docsis_proto_testsuite  = {
14460         .suite_name = "Docsis Proto Unit Test Suite",
14461         .setup = docsis_proto_testsuite_setup,
14462         .unit_test_cases = {
14463                 TEST_CASE_ST(ut_setup_security, ut_teardown,
14464                         test_DOCSIS_PROTO_all),
14465                 TEST_CASES_END() /**< NULL terminate unit test array */
14466         }
14467 };
14468 #endif
14469
14470 static struct unit_test_suite cryptodev_gen_testsuite  = {
14471         .suite_name = "Crypto General Unit Test Suite",
14472         .setup = crypto_gen_testsuite_setup,
14473         .unit_test_cases = {
14474                 TEST_CASE_ST(ut_setup, ut_teardown,
14475                                 test_device_configure_invalid_dev_id),
14476                 TEST_CASE_ST(ut_setup, ut_teardown,
14477                                 test_queue_pair_descriptor_setup),
14478                 TEST_CASE_ST(ut_setup, ut_teardown,
14479                                 test_device_configure_invalid_queue_pair_ids),
14480                 TEST_CASE_ST(ut_setup, ut_teardown, test_stats),
14481                 TEST_CASE_ST(ut_setup, ut_teardown, test_enq_callback_setup),
14482                 TEST_CASE_ST(ut_setup, ut_teardown, test_deq_callback_setup),
14483                 TEST_CASES_END() /**< NULL terminate unit test array */
14484         }
14485 };
14486
14487 static struct unit_test_suite cryptodev_negative_hmac_sha1_testsuite = {
14488         .suite_name = "Negative HMAC SHA1 Unit Test Suite",
14489         .setup = negative_hmac_sha1_testsuite_setup,
14490         .unit_test_cases = {
14491                 /** Negative tests */
14492                 TEST_CASE_ST(ut_setup, ut_teardown,
14493                         authentication_verify_HMAC_SHA1_fail_data_corrupt),
14494                 TEST_CASE_ST(ut_setup, ut_teardown,
14495                         authentication_verify_HMAC_SHA1_fail_tag_corrupt),
14496                 TEST_CASE_ST(ut_setup, ut_teardown,
14497                         auth_decryption_AES128CBC_HMAC_SHA1_fail_data_corrupt),
14498                 TEST_CASE_ST(ut_setup, ut_teardown,
14499                         auth_decryption_AES128CBC_HMAC_SHA1_fail_tag_corrupt),
14500
14501                 TEST_CASES_END() /**< NULL terminate unit test array */
14502         }
14503 };
14504
14505 static struct unit_test_suite cryptodev_multi_session_testsuite = {
14506         .suite_name = "Multi Session Unit Test Suite",
14507         .setup = multi_session_testsuite_setup,
14508         .unit_test_cases = {
14509                 TEST_CASE_ST(ut_setup, ut_teardown, test_multi_session),
14510                 TEST_CASE_ST(ut_setup, ut_teardown,
14511                                 test_multi_session_random_usage),
14512
14513                 TEST_CASES_END() /**< NULL terminate unit test array */
14514         }
14515 };
14516
14517 static struct unit_test_suite cryptodev_null_testsuite  = {
14518         .suite_name = "NULL Test Suite",
14519         .setup = null_testsuite_setup,
14520         .unit_test_cases = {
14521                 TEST_CASE_ST(ut_setup, ut_teardown,
14522                         test_null_invalid_operation),
14523                 TEST_CASE_ST(ut_setup, ut_teardown, test_null_burst_operation),
14524                 TEST_CASES_END()
14525         }
14526 };
14527
14528 static struct unit_test_suite cryptodev_aes_ccm_auth_testsuite  = {
14529         .suite_name = "AES CCM Authenticated Test Suite",
14530         .setup = aes_ccm_auth_testsuite_setup,
14531         .unit_test_cases = {
14532                 /** AES CCM Authenticated Encryption 128 bits key*/
14533                 TEST_CASE_ST(ut_setup, ut_teardown,
14534                         test_AES_CCM_authenticated_encryption_test_case_128_1),
14535                 TEST_CASE_ST(ut_setup, ut_teardown,
14536                         test_AES_CCM_authenticated_encryption_test_case_128_2),
14537                 TEST_CASE_ST(ut_setup, ut_teardown,
14538                         test_AES_CCM_authenticated_encryption_test_case_128_3),
14539
14540                 /** AES CCM Authenticated Decryption 128 bits key*/
14541                 TEST_CASE_ST(ut_setup, ut_teardown,
14542                         test_AES_CCM_authenticated_decryption_test_case_128_1),
14543                 TEST_CASE_ST(ut_setup, ut_teardown,
14544                         test_AES_CCM_authenticated_decryption_test_case_128_2),
14545                 TEST_CASE_ST(ut_setup, ut_teardown,
14546                         test_AES_CCM_authenticated_decryption_test_case_128_3),
14547
14548                 /** AES CCM Authenticated Encryption 192 bits key */
14549                 TEST_CASE_ST(ut_setup, ut_teardown,
14550                         test_AES_CCM_authenticated_encryption_test_case_192_1),
14551                 TEST_CASE_ST(ut_setup, ut_teardown,
14552                         test_AES_CCM_authenticated_encryption_test_case_192_2),
14553                 TEST_CASE_ST(ut_setup, ut_teardown,
14554                         test_AES_CCM_authenticated_encryption_test_case_192_3),
14555
14556                 /** AES CCM Authenticated Decryption 192 bits key*/
14557                 TEST_CASE_ST(ut_setup, ut_teardown,
14558                         test_AES_CCM_authenticated_decryption_test_case_192_1),
14559                 TEST_CASE_ST(ut_setup, ut_teardown,
14560                         test_AES_CCM_authenticated_decryption_test_case_192_2),
14561                 TEST_CASE_ST(ut_setup, ut_teardown,
14562                         test_AES_CCM_authenticated_decryption_test_case_192_3),
14563
14564                 /** AES CCM Authenticated Encryption 256 bits key */
14565                 TEST_CASE_ST(ut_setup, ut_teardown,
14566                         test_AES_CCM_authenticated_encryption_test_case_256_1),
14567                 TEST_CASE_ST(ut_setup, ut_teardown,
14568                         test_AES_CCM_authenticated_encryption_test_case_256_2),
14569                 TEST_CASE_ST(ut_setup, ut_teardown,
14570                         test_AES_CCM_authenticated_encryption_test_case_256_3),
14571
14572                 /** AES CCM Authenticated Decryption 256 bits key*/
14573                 TEST_CASE_ST(ut_setup, ut_teardown,
14574                         test_AES_CCM_authenticated_decryption_test_case_256_1),
14575                 TEST_CASE_ST(ut_setup, ut_teardown,
14576                         test_AES_CCM_authenticated_decryption_test_case_256_2),
14577                 TEST_CASE_ST(ut_setup, ut_teardown,
14578                         test_AES_CCM_authenticated_decryption_test_case_256_3),
14579                 TEST_CASES_END()
14580         }
14581 };
14582
14583 static struct unit_test_suite cryptodev_aes_gcm_auth_testsuite  = {
14584         .suite_name = "AES GCM Authenticated Test Suite",
14585         .setup = aes_gcm_auth_testsuite_setup,
14586         .unit_test_cases = {
14587                 /** AES GCM Authenticated Encryption */
14588                 TEST_CASE_ST(ut_setup, ut_teardown,
14589                         test_AES_GCM_auth_encrypt_SGL_in_place_1500B),
14590                 TEST_CASE_ST(ut_setup, ut_teardown,
14591                         test_AES_GCM_auth_encrypt_SGL_out_of_place_400B_400B),
14592                 TEST_CASE_ST(ut_setup, ut_teardown,
14593                         test_AES_GCM_auth_encrypt_SGL_out_of_place_1500B_2000B),
14594                 TEST_CASE_ST(ut_setup, ut_teardown,
14595                         test_AES_GCM_auth_encrypt_SGL_out_of_place_400B_1seg),
14596                 TEST_CASE_ST(ut_setup, ut_teardown,
14597                         test_AES_GCM_authenticated_encryption_test_case_1),
14598                 TEST_CASE_ST(ut_setup, ut_teardown,
14599                         test_AES_GCM_authenticated_encryption_test_case_2),
14600                 TEST_CASE_ST(ut_setup, ut_teardown,
14601                         test_AES_GCM_authenticated_encryption_test_case_3),
14602                 TEST_CASE_ST(ut_setup, ut_teardown,
14603                         test_AES_GCM_authenticated_encryption_test_case_4),
14604                 TEST_CASE_ST(ut_setup, ut_teardown,
14605                         test_AES_GCM_authenticated_encryption_test_case_5),
14606                 TEST_CASE_ST(ut_setup, ut_teardown,
14607                         test_AES_GCM_authenticated_encryption_test_case_6),
14608                 TEST_CASE_ST(ut_setup, ut_teardown,
14609                         test_AES_GCM_authenticated_encryption_test_case_7),
14610                 TEST_CASE_ST(ut_setup, ut_teardown,
14611                         test_AES_GCM_authenticated_encryption_test_case_8),
14612                 TEST_CASE_ST(ut_setup, ut_teardown,
14613                         test_AES_GCM_J0_authenticated_encryption_test_case_1),
14614
14615                 /** AES GCM Authenticated Decryption */
14616                 TEST_CASE_ST(ut_setup, ut_teardown,
14617                         test_AES_GCM_authenticated_decryption_test_case_1),
14618                 TEST_CASE_ST(ut_setup, ut_teardown,
14619                         test_AES_GCM_authenticated_decryption_test_case_2),
14620                 TEST_CASE_ST(ut_setup, ut_teardown,
14621                         test_AES_GCM_authenticated_decryption_test_case_3),
14622                 TEST_CASE_ST(ut_setup, ut_teardown,
14623                         test_AES_GCM_authenticated_decryption_test_case_4),
14624                 TEST_CASE_ST(ut_setup, ut_teardown,
14625                         test_AES_GCM_authenticated_decryption_test_case_5),
14626                 TEST_CASE_ST(ut_setup, ut_teardown,
14627                         test_AES_GCM_authenticated_decryption_test_case_6),
14628                 TEST_CASE_ST(ut_setup, ut_teardown,
14629                         test_AES_GCM_authenticated_decryption_test_case_7),
14630                 TEST_CASE_ST(ut_setup, ut_teardown,
14631                         test_AES_GCM_authenticated_decryption_test_case_8),
14632                 TEST_CASE_ST(ut_setup, ut_teardown,
14633                         test_AES_GCM_J0_authenticated_decryption_test_case_1),
14634
14635                 /** AES GCM Authenticated Encryption 192 bits key */
14636                 TEST_CASE_ST(ut_setup, ut_teardown,
14637                         test_AES_GCM_auth_encryption_test_case_192_1),
14638                 TEST_CASE_ST(ut_setup, ut_teardown,
14639                         test_AES_GCM_auth_encryption_test_case_192_2),
14640                 TEST_CASE_ST(ut_setup, ut_teardown,
14641                         test_AES_GCM_auth_encryption_test_case_192_3),
14642                 TEST_CASE_ST(ut_setup, ut_teardown,
14643                         test_AES_GCM_auth_encryption_test_case_192_4),
14644                 TEST_CASE_ST(ut_setup, ut_teardown,
14645                         test_AES_GCM_auth_encryption_test_case_192_5),
14646                 TEST_CASE_ST(ut_setup, ut_teardown,
14647                         test_AES_GCM_auth_encryption_test_case_192_6),
14648                 TEST_CASE_ST(ut_setup, ut_teardown,
14649                         test_AES_GCM_auth_encryption_test_case_192_7),
14650
14651                 /** AES GCM Authenticated Decryption 192 bits key */
14652                 TEST_CASE_ST(ut_setup, ut_teardown,
14653                         test_AES_GCM_auth_decryption_test_case_192_1),
14654                 TEST_CASE_ST(ut_setup, ut_teardown,
14655                         test_AES_GCM_auth_decryption_test_case_192_2),
14656                 TEST_CASE_ST(ut_setup, ut_teardown,
14657                         test_AES_GCM_auth_decryption_test_case_192_3),
14658                 TEST_CASE_ST(ut_setup, ut_teardown,
14659                         test_AES_GCM_auth_decryption_test_case_192_4),
14660                 TEST_CASE_ST(ut_setup, ut_teardown,
14661                         test_AES_GCM_auth_decryption_test_case_192_5),
14662                 TEST_CASE_ST(ut_setup, ut_teardown,
14663                         test_AES_GCM_auth_decryption_test_case_192_6),
14664                 TEST_CASE_ST(ut_setup, ut_teardown,
14665                         test_AES_GCM_auth_decryption_test_case_192_7),
14666
14667                 /** AES GCM Authenticated Encryption 256 bits key */
14668                 TEST_CASE_ST(ut_setup, ut_teardown,
14669                         test_AES_GCM_auth_encryption_test_case_256_1),
14670                 TEST_CASE_ST(ut_setup, ut_teardown,
14671                         test_AES_GCM_auth_encryption_test_case_256_2),
14672                 TEST_CASE_ST(ut_setup, ut_teardown,
14673                         test_AES_GCM_auth_encryption_test_case_256_3),
14674                 TEST_CASE_ST(ut_setup, ut_teardown,
14675                         test_AES_GCM_auth_encryption_test_case_256_4),
14676                 TEST_CASE_ST(ut_setup, ut_teardown,
14677                         test_AES_GCM_auth_encryption_test_case_256_5),
14678                 TEST_CASE_ST(ut_setup, ut_teardown,
14679                         test_AES_GCM_auth_encryption_test_case_256_6),
14680                 TEST_CASE_ST(ut_setup, ut_teardown,
14681                         test_AES_GCM_auth_encryption_test_case_256_7),
14682
14683                 /** AES GCM Authenticated Decryption 256 bits key */
14684                 TEST_CASE_ST(ut_setup, ut_teardown,
14685                         test_AES_GCM_auth_decryption_test_case_256_1),
14686                 TEST_CASE_ST(ut_setup, ut_teardown,
14687                         test_AES_GCM_auth_decryption_test_case_256_2),
14688                 TEST_CASE_ST(ut_setup, ut_teardown,
14689                         test_AES_GCM_auth_decryption_test_case_256_3),
14690                 TEST_CASE_ST(ut_setup, ut_teardown,
14691                         test_AES_GCM_auth_decryption_test_case_256_4),
14692                 TEST_CASE_ST(ut_setup, ut_teardown,
14693                         test_AES_GCM_auth_decryption_test_case_256_5),
14694                 TEST_CASE_ST(ut_setup, ut_teardown,
14695                         test_AES_GCM_auth_decryption_test_case_256_6),
14696                 TEST_CASE_ST(ut_setup, ut_teardown,
14697                         test_AES_GCM_auth_decryption_test_case_256_7),
14698
14699                 /** AES GCM Authenticated Encryption big aad size */
14700                 TEST_CASE_ST(ut_setup, ut_teardown,
14701                         test_AES_GCM_auth_encryption_test_case_aad_1),
14702                 TEST_CASE_ST(ut_setup, ut_teardown,
14703                         test_AES_GCM_auth_encryption_test_case_aad_2),
14704
14705                 /** AES GCM Authenticated Decryption big aad size */
14706                 TEST_CASE_ST(ut_setup, ut_teardown,
14707                         test_AES_GCM_auth_decryption_test_case_aad_1),
14708                 TEST_CASE_ST(ut_setup, ut_teardown,
14709                         test_AES_GCM_auth_decryption_test_case_aad_2),
14710
14711                 /** Out of place tests */
14712                 TEST_CASE_ST(ut_setup, ut_teardown,
14713                         test_AES_GCM_authenticated_encryption_oop_test_case_1),
14714                 TEST_CASE_ST(ut_setup, ut_teardown,
14715                         test_AES_GCM_authenticated_decryption_oop_test_case_1),
14716
14717                 /** Session-less tests */
14718                 TEST_CASE_ST(ut_setup, ut_teardown,
14719                         test_AES_GCM_authenticated_encryption_sessionless_test_case_1),
14720                 TEST_CASE_ST(ut_setup, ut_teardown,
14721                         test_AES_GCM_authenticated_decryption_sessionless_test_case_1),
14722
14723                 TEST_CASES_END()
14724         }
14725 };
14726
14727 static struct unit_test_suite cryptodev_aes_gmac_auth_testsuite  = {
14728         .suite_name = "AES GMAC Authentication Test Suite",
14729         .setup = aes_gmac_auth_testsuite_setup,
14730         .unit_test_cases = {
14731                 TEST_CASE_ST(ut_setup, ut_teardown,
14732                         test_AES_GMAC_authentication_test_case_1),
14733                 TEST_CASE_ST(ut_setup, ut_teardown,
14734                         test_AES_GMAC_authentication_verify_test_case_1),
14735                 TEST_CASE_ST(ut_setup, ut_teardown,
14736                         test_AES_GMAC_authentication_test_case_2),
14737                 TEST_CASE_ST(ut_setup, ut_teardown,
14738                         test_AES_GMAC_authentication_verify_test_case_2),
14739                 TEST_CASE_ST(ut_setup, ut_teardown,
14740                         test_AES_GMAC_authentication_test_case_3),
14741                 TEST_CASE_ST(ut_setup, ut_teardown,
14742                         test_AES_GMAC_authentication_verify_test_case_3),
14743                 TEST_CASE_ST(ut_setup, ut_teardown,
14744                         test_AES_GMAC_authentication_test_case_4),
14745                 TEST_CASE_ST(ut_setup, ut_teardown,
14746                         test_AES_GMAC_authentication_verify_test_case_4),
14747                 TEST_CASE_ST(ut_setup, ut_teardown,
14748                         test_AES_GMAC_authentication_SGL_40B),
14749                 TEST_CASE_ST(ut_setup, ut_teardown,
14750                         test_AES_GMAC_authentication_SGL_80B),
14751                 TEST_CASE_ST(ut_setup, ut_teardown,
14752                         test_AES_GMAC_authentication_SGL_2048B),
14753                 TEST_CASE_ST(ut_setup, ut_teardown,
14754                         test_AES_GMAC_authentication_SGL_2047B),
14755
14756                 TEST_CASES_END()
14757         }
14758 };
14759
14760 static struct unit_test_suite cryptodev_chacha20_poly1305_testsuite  = {
14761         .suite_name = "Chacha20-Poly1305 Test Suite",
14762         .setup = chacha20_poly1305_testsuite_setup,
14763         .unit_test_cases = {
14764                 TEST_CASE_ST(ut_setup, ut_teardown,
14765                         test_chacha20_poly1305_encrypt_test_case_rfc8439),
14766                 TEST_CASE_ST(ut_setup, ut_teardown,
14767                         test_chacha20_poly1305_decrypt_test_case_rfc8439),
14768                 TEST_CASES_END()
14769         }
14770 };
14771
14772 static struct unit_test_suite cryptodev_snow3g_testsuite  = {
14773         .suite_name = "SNOW 3G Test Suite",
14774         .setup = snow3g_testsuite_setup,
14775         .unit_test_cases = {
14776                 /** SNOW 3G encrypt only (UEA2) */
14777                 TEST_CASE_ST(ut_setup, ut_teardown,
14778                         test_snow3g_encryption_test_case_1),
14779                 TEST_CASE_ST(ut_setup, ut_teardown,
14780                         test_snow3g_encryption_test_case_2),
14781                 TEST_CASE_ST(ut_setup, ut_teardown,
14782                         test_snow3g_encryption_test_case_3),
14783                 TEST_CASE_ST(ut_setup, ut_teardown,
14784                         test_snow3g_encryption_test_case_4),
14785                 TEST_CASE_ST(ut_setup, ut_teardown,
14786                         test_snow3g_encryption_test_case_5),
14787
14788                 TEST_CASE_ST(ut_setup, ut_teardown,
14789                         test_snow3g_encryption_test_case_1_oop),
14790                 TEST_CASE_ST(ut_setup, ut_teardown,
14791                         test_snow3g_encryption_test_case_1_oop_sgl),
14792                 TEST_CASE_ST(ut_setup, ut_teardown,
14793                         test_snow3g_encryption_test_case_1_offset_oop),
14794                 TEST_CASE_ST(ut_setup, ut_teardown,
14795                         test_snow3g_decryption_test_case_1_oop),
14796
14797                 /** SNOW 3G generate auth, then encrypt (UEA2) */
14798                 TEST_CASE_ST(ut_setup, ut_teardown,
14799                         test_snow3g_auth_cipher_test_case_1),
14800                 TEST_CASE_ST(ut_setup, ut_teardown,
14801                         test_snow3g_auth_cipher_test_case_2),
14802                 TEST_CASE_ST(ut_setup, ut_teardown,
14803                         test_snow3g_auth_cipher_test_case_2_oop),
14804                 TEST_CASE_ST(ut_setup, ut_teardown,
14805                         test_snow3g_auth_cipher_part_digest_enc),
14806                 TEST_CASE_ST(ut_setup, ut_teardown,
14807                         test_snow3g_auth_cipher_part_digest_enc_oop),
14808                 TEST_CASE_ST(ut_setup, ut_teardown,
14809                         test_snow3g_auth_cipher_test_case_3_sgl),
14810                 TEST_CASE_ST(ut_setup, ut_teardown,
14811                         test_snow3g_auth_cipher_test_case_3_oop_sgl),
14812                 TEST_CASE_ST(ut_setup, ut_teardown,
14813                         test_snow3g_auth_cipher_part_digest_enc_sgl),
14814                 TEST_CASE_ST(ut_setup, ut_teardown,
14815                         test_snow3g_auth_cipher_part_digest_enc_oop_sgl),
14816
14817                 /** SNOW 3G decrypt (UEA2), then verify auth */
14818                 TEST_CASE_ST(ut_setup, ut_teardown,
14819                         test_snow3g_auth_cipher_verify_test_case_1),
14820                 TEST_CASE_ST(ut_setup, ut_teardown,
14821                         test_snow3g_auth_cipher_verify_test_case_2),
14822                 TEST_CASE_ST(ut_setup, ut_teardown,
14823                         test_snow3g_auth_cipher_verify_test_case_2_oop),
14824                 TEST_CASE_ST(ut_setup, ut_teardown,
14825                         test_snow3g_auth_cipher_verify_part_digest_enc),
14826                 TEST_CASE_ST(ut_setup, ut_teardown,
14827                         test_snow3g_auth_cipher_verify_part_digest_enc_oop),
14828                 TEST_CASE_ST(ut_setup, ut_teardown,
14829                         test_snow3g_auth_cipher_verify_test_case_3_sgl),
14830                 TEST_CASE_ST(ut_setup, ut_teardown,
14831                         test_snow3g_auth_cipher_verify_test_case_3_oop_sgl),
14832                 TEST_CASE_ST(ut_setup, ut_teardown,
14833                         test_snow3g_auth_cipher_verify_part_digest_enc_sgl),
14834                 TEST_CASE_ST(ut_setup, ut_teardown,
14835                         test_snow3g_auth_cipher_verify_part_digest_enc_oop_sgl),
14836
14837                 /** SNOW 3G decrypt only (UEA2) */
14838                 TEST_CASE_ST(ut_setup, ut_teardown,
14839                         test_snow3g_decryption_test_case_1),
14840                 TEST_CASE_ST(ut_setup, ut_teardown,
14841                         test_snow3g_decryption_test_case_2),
14842                 TEST_CASE_ST(ut_setup, ut_teardown,
14843                         test_snow3g_decryption_test_case_3),
14844                 TEST_CASE_ST(ut_setup, ut_teardown,
14845                         test_snow3g_decryption_test_case_4),
14846                 TEST_CASE_ST(ut_setup, ut_teardown,
14847                         test_snow3g_decryption_test_case_5),
14848                 TEST_CASE_ST(ut_setup, ut_teardown,
14849                         test_snow3g_decryption_with_digest_test_case_1),
14850                 TEST_CASE_ST(ut_setup, ut_teardown,
14851                         test_snow3g_hash_generate_test_case_1),
14852                 TEST_CASE_ST(ut_setup, ut_teardown,
14853                         test_snow3g_hash_generate_test_case_2),
14854                 TEST_CASE_ST(ut_setup, ut_teardown,
14855                         test_snow3g_hash_generate_test_case_3),
14856
14857                 /* Tests with buffers which length is not byte-aligned */
14858                 TEST_CASE_ST(ut_setup, ut_teardown,
14859                         test_snow3g_hash_generate_test_case_4),
14860                 TEST_CASE_ST(ut_setup, ut_teardown,
14861                         test_snow3g_hash_generate_test_case_5),
14862                 TEST_CASE_ST(ut_setup, ut_teardown,
14863                         test_snow3g_hash_generate_test_case_6),
14864                 TEST_CASE_ST(ut_setup, ut_teardown,
14865                         test_snow3g_hash_verify_test_case_1),
14866                 TEST_CASE_ST(ut_setup, ut_teardown,
14867                         test_snow3g_hash_verify_test_case_2),
14868                 TEST_CASE_ST(ut_setup, ut_teardown,
14869                         test_snow3g_hash_verify_test_case_3),
14870
14871                 /* Tests with buffers which length is not byte-aligned */
14872                 TEST_CASE_ST(ut_setup, ut_teardown,
14873                         test_snow3g_hash_verify_test_case_4),
14874                 TEST_CASE_ST(ut_setup, ut_teardown,
14875                         test_snow3g_hash_verify_test_case_5),
14876                 TEST_CASE_ST(ut_setup, ut_teardown,
14877                         test_snow3g_hash_verify_test_case_6),
14878                 TEST_CASE_ST(ut_setup, ut_teardown,
14879                         test_snow3g_cipher_auth_test_case_1),
14880                 TEST_CASE_ST(ut_setup, ut_teardown,
14881                         test_snow3g_auth_cipher_with_digest_test_case_1),
14882                 TEST_CASES_END()
14883         }
14884 };
14885
14886 static struct unit_test_suite cryptodev_zuc_testsuite  = {
14887         .suite_name = "ZUC Test Suite",
14888         .setup = zuc_testsuite_setup,
14889         .unit_test_cases = {
14890                 /** ZUC encrypt only (EEA3) */
14891                 TEST_CASE_ST(ut_setup, ut_teardown,
14892                         test_zuc_encryption_test_case_1),
14893                 TEST_CASE_ST(ut_setup, ut_teardown,
14894                         test_zuc_encryption_test_case_2),
14895                 TEST_CASE_ST(ut_setup, ut_teardown,
14896                         test_zuc_encryption_test_case_3),
14897                 TEST_CASE_ST(ut_setup, ut_teardown,
14898                         test_zuc_encryption_test_case_4),
14899                 TEST_CASE_ST(ut_setup, ut_teardown,
14900                         test_zuc_encryption_test_case_5),
14901                 TEST_CASE_ST(ut_setup, ut_teardown,
14902                         test_zuc_encryption_test_case_6_sgl),
14903                 TEST_CASE_ST(ut_setup, ut_teardown,
14904                         test_zuc_encryption_test_case_7),
14905
14906                 /** ZUC authenticate (EIA3) */
14907                 TEST_CASE_ST(ut_setup, ut_teardown,
14908                         test_zuc_hash_generate_test_case_1),
14909                 TEST_CASE_ST(ut_setup, ut_teardown,
14910                         test_zuc_hash_generate_test_case_2),
14911                 TEST_CASE_ST(ut_setup, ut_teardown,
14912                         test_zuc_hash_generate_test_case_3),
14913                 TEST_CASE_ST(ut_setup, ut_teardown,
14914                         test_zuc_hash_generate_test_case_4),
14915                 TEST_CASE_ST(ut_setup, ut_teardown,
14916                         test_zuc_hash_generate_test_case_5),
14917                 TEST_CASE_ST(ut_setup, ut_teardown,
14918                         test_zuc_hash_generate_test_case_6),
14919                 TEST_CASE_ST(ut_setup, ut_teardown,
14920                         test_zuc_hash_generate_test_case_7),
14921                 TEST_CASE_ST(ut_setup, ut_teardown,
14922                         test_zuc_hash_generate_test_case_8),
14923                 TEST_CASE_ST(ut_setup, ut_teardown,
14924                         test_zuc_hash_generate_test_case_9),
14925                 TEST_CASE_ST(ut_setup, ut_teardown,
14926                         test_zuc_hash_generate_test_case_10),
14927
14928
14929                 /** ZUC alg-chain (EEA3/EIA3) */
14930                 TEST_CASE_ST(ut_setup, ut_teardown,
14931                         test_zuc_cipher_auth_test_case_1),
14932                 TEST_CASE_ST(ut_setup, ut_teardown,
14933                         test_zuc_cipher_auth_test_case_2),
14934
14935                 /** ZUC generate auth, then encrypt (EEA3) */
14936                 TEST_CASE_ST(ut_setup, ut_teardown,
14937                         test_zuc_auth_cipher_test_case_1),
14938                 TEST_CASE_ST(ut_setup, ut_teardown,
14939                         test_zuc_auth_cipher_test_case_1_oop),
14940                 TEST_CASE_ST(ut_setup, ut_teardown,
14941                         test_zuc_auth_cipher_test_case_1_sgl),
14942                 TEST_CASE_ST(ut_setup, ut_teardown,
14943                         test_zuc_auth_cipher_test_case_1_oop_sgl),
14944
14945                 /** ZUC decrypt (EEA3), then verify auth */
14946                 TEST_CASE_ST(ut_setup, ut_teardown,
14947                         test_zuc_auth_cipher_verify_test_case_1),
14948                 TEST_CASE_ST(ut_setup, ut_teardown,
14949                         test_zuc_auth_cipher_verify_test_case_1_oop),
14950                 TEST_CASE_ST(ut_setup, ut_teardown,
14951                         test_zuc_auth_cipher_verify_test_case_1_sgl),
14952                 TEST_CASE_ST(ut_setup, ut_teardown,
14953                         test_zuc_auth_cipher_verify_test_case_1_oop_sgl),
14954                 TEST_CASES_END()
14955         }
14956 };
14957
14958 static struct unit_test_suite cryptodev_hmac_md5_auth_testsuite  = {
14959         .suite_name = "HMAC_MD5 Authentication Test Suite",
14960         .setup = hmac_md5_auth_testsuite_setup,
14961         .unit_test_cases = {
14962                 TEST_CASE_ST(ut_setup, ut_teardown,
14963                         test_MD5_HMAC_generate_case_1),
14964                 TEST_CASE_ST(ut_setup, ut_teardown,
14965                         test_MD5_HMAC_verify_case_1),
14966                 TEST_CASE_ST(ut_setup, ut_teardown,
14967                         test_MD5_HMAC_generate_case_2),
14968                 TEST_CASE_ST(ut_setup, ut_teardown,
14969                         test_MD5_HMAC_verify_case_2),
14970                 TEST_CASES_END()
14971         }
14972 };
14973
14974 static struct unit_test_suite cryptodev_kasumi_testsuite  = {
14975         .suite_name = "Kasumi Test Suite",
14976         .setup = kasumi_testsuite_setup,
14977         .unit_test_cases = {
14978                 /** KASUMI hash only (UIA1) */
14979                 TEST_CASE_ST(ut_setup, ut_teardown,
14980                         test_kasumi_hash_generate_test_case_1),
14981                 TEST_CASE_ST(ut_setup, ut_teardown,
14982                         test_kasumi_hash_generate_test_case_2),
14983                 TEST_CASE_ST(ut_setup, ut_teardown,
14984                         test_kasumi_hash_generate_test_case_3),
14985                 TEST_CASE_ST(ut_setup, ut_teardown,
14986                         test_kasumi_hash_generate_test_case_4),
14987                 TEST_CASE_ST(ut_setup, ut_teardown,
14988                         test_kasumi_hash_generate_test_case_5),
14989                 TEST_CASE_ST(ut_setup, ut_teardown,
14990                         test_kasumi_hash_generate_test_case_6),
14991
14992                 TEST_CASE_ST(ut_setup, ut_teardown,
14993                         test_kasumi_hash_verify_test_case_1),
14994                 TEST_CASE_ST(ut_setup, ut_teardown,
14995                         test_kasumi_hash_verify_test_case_2),
14996                 TEST_CASE_ST(ut_setup, ut_teardown,
14997                         test_kasumi_hash_verify_test_case_3),
14998                 TEST_CASE_ST(ut_setup, ut_teardown,
14999                         test_kasumi_hash_verify_test_case_4),
15000                 TEST_CASE_ST(ut_setup, ut_teardown,
15001                         test_kasumi_hash_verify_test_case_5),
15002
15003                 /** KASUMI encrypt only (UEA1) */
15004                 TEST_CASE_ST(ut_setup, ut_teardown,
15005                         test_kasumi_encryption_test_case_1),
15006                 TEST_CASE_ST(ut_setup, ut_teardown,
15007                         test_kasumi_encryption_test_case_1_sgl),
15008                 TEST_CASE_ST(ut_setup, ut_teardown,
15009                         test_kasumi_encryption_test_case_1_oop),
15010                 TEST_CASE_ST(ut_setup, ut_teardown,
15011                         test_kasumi_encryption_test_case_1_oop_sgl),
15012                 TEST_CASE_ST(ut_setup, ut_teardown,
15013                         test_kasumi_encryption_test_case_2),
15014                 TEST_CASE_ST(ut_setup, ut_teardown,
15015                         test_kasumi_encryption_test_case_3),
15016                 TEST_CASE_ST(ut_setup, ut_teardown,
15017                         test_kasumi_encryption_test_case_4),
15018                 TEST_CASE_ST(ut_setup, ut_teardown,
15019                         test_kasumi_encryption_test_case_5),
15020
15021                 /** KASUMI decrypt only (UEA1) */
15022                 TEST_CASE_ST(ut_setup, ut_teardown,
15023                         test_kasumi_decryption_test_case_1),
15024                 TEST_CASE_ST(ut_setup, ut_teardown,
15025                         test_kasumi_decryption_test_case_2),
15026                 TEST_CASE_ST(ut_setup, ut_teardown,
15027                         test_kasumi_decryption_test_case_3),
15028                 TEST_CASE_ST(ut_setup, ut_teardown,
15029                         test_kasumi_decryption_test_case_4),
15030                 TEST_CASE_ST(ut_setup, ut_teardown,
15031                         test_kasumi_decryption_test_case_5),
15032                 TEST_CASE_ST(ut_setup, ut_teardown,
15033                         test_kasumi_decryption_test_case_1_oop),
15034                 TEST_CASE_ST(ut_setup, ut_teardown,
15035                         test_kasumi_cipher_auth_test_case_1),
15036
15037                 /** KASUMI generate auth, then encrypt (F8) */
15038                 TEST_CASE_ST(ut_setup, ut_teardown,
15039                         test_kasumi_auth_cipher_test_case_1),
15040                 TEST_CASE_ST(ut_setup, ut_teardown,
15041                         test_kasumi_auth_cipher_test_case_2),
15042                 TEST_CASE_ST(ut_setup, ut_teardown,
15043                         test_kasumi_auth_cipher_test_case_2_oop),
15044                 TEST_CASE_ST(ut_setup, ut_teardown,
15045                         test_kasumi_auth_cipher_test_case_2_sgl),
15046                 TEST_CASE_ST(ut_setup, ut_teardown,
15047                         test_kasumi_auth_cipher_test_case_2_oop_sgl),
15048
15049                 /** KASUMI decrypt (F8), then verify auth */
15050                 TEST_CASE_ST(ut_setup, ut_teardown,
15051                         test_kasumi_auth_cipher_verify_test_case_1),
15052                 TEST_CASE_ST(ut_setup, ut_teardown,
15053                         test_kasumi_auth_cipher_verify_test_case_2),
15054                 TEST_CASE_ST(ut_setup, ut_teardown,
15055                         test_kasumi_auth_cipher_verify_test_case_2_oop),
15056                 TEST_CASE_ST(ut_setup, ut_teardown,
15057                         test_kasumi_auth_cipher_verify_test_case_2_sgl),
15058                 TEST_CASE_ST(ut_setup, ut_teardown,
15059                         test_kasumi_auth_cipher_verify_test_case_2_oop_sgl),
15060
15061                 TEST_CASES_END()
15062         }
15063 };
15064
15065 static struct unit_test_suite cryptodev_esn_testsuite  = {
15066         .suite_name = "ESN Test Suite",
15067         .setup = esn_testsuite_setup,
15068         .unit_test_cases = {
15069                 TEST_CASE_ST(ut_setup, ut_teardown,
15070                         auth_encrypt_AES128CBC_HMAC_SHA1_esn_check),
15071                 TEST_CASE_ST(ut_setup, ut_teardown,
15072                         auth_decrypt_AES128CBC_HMAC_SHA1_esn_check),
15073                 TEST_CASES_END()
15074         }
15075 };
15076
15077 static struct unit_test_suite cryptodev_negative_aes_gcm_testsuite  = {
15078         .suite_name = "Negative AES GCM Test Suite",
15079         .setup = negative_aes_gcm_testsuite_setup,
15080         .unit_test_cases = {
15081                 TEST_CASE_ST(ut_setup, ut_teardown,
15082                         test_AES_GCM_auth_encryption_fail_iv_corrupt),
15083                 TEST_CASE_ST(ut_setup, ut_teardown,
15084                         test_AES_GCM_auth_encryption_fail_in_data_corrupt),
15085                 TEST_CASE_ST(ut_setup, ut_teardown,
15086                         test_AES_GCM_auth_encryption_fail_out_data_corrupt),
15087                 TEST_CASE_ST(ut_setup, ut_teardown,
15088                         test_AES_GCM_auth_encryption_fail_aad_len_corrupt),
15089                 TEST_CASE_ST(ut_setup, ut_teardown,
15090                         test_AES_GCM_auth_encryption_fail_aad_corrupt),
15091                 TEST_CASE_ST(ut_setup, ut_teardown,
15092                         test_AES_GCM_auth_encryption_fail_tag_corrupt),
15093                 TEST_CASE_ST(ut_setup, ut_teardown,
15094                         test_AES_GCM_auth_decryption_fail_iv_corrupt),
15095                 TEST_CASE_ST(ut_setup, ut_teardown,
15096                         test_AES_GCM_auth_decryption_fail_in_data_corrupt),
15097                 TEST_CASE_ST(ut_setup, ut_teardown,
15098                         test_AES_GCM_auth_decryption_fail_out_data_corrupt),
15099                 TEST_CASE_ST(ut_setup, ut_teardown,
15100                         test_AES_GCM_auth_decryption_fail_aad_len_corrupt),
15101                 TEST_CASE_ST(ut_setup, ut_teardown,
15102                         test_AES_GCM_auth_decryption_fail_aad_corrupt),
15103                 TEST_CASE_ST(ut_setup, ut_teardown,
15104                         test_AES_GCM_auth_decryption_fail_tag_corrupt),
15105
15106                 TEST_CASES_END()
15107         }
15108 };
15109
15110 static struct unit_test_suite cryptodev_negative_aes_gmac_testsuite  = {
15111         .suite_name = "Negative AES GMAC Test Suite",
15112         .setup = negative_aes_gmac_testsuite_setup,
15113         .unit_test_cases = {
15114                 TEST_CASE_ST(ut_setup, ut_teardown,
15115                         authentication_verify_AES128_GMAC_fail_data_corrupt),
15116                 TEST_CASE_ST(ut_setup, ut_teardown,
15117                         authentication_verify_AES128_GMAC_fail_tag_corrupt),
15118
15119                 TEST_CASES_END()
15120         }
15121 };
15122
15123 static struct unit_test_suite cryptodev_mixed_cipher_hash_testsuite  = {
15124         .suite_name = "Mixed CIPHER + HASH algorithms Test Suite",
15125         .setup = mixed_cipher_hash_testsuite_setup,
15126         .unit_test_cases = {
15127                 /** AUTH AES CMAC + CIPHER AES CTR */
15128                 TEST_CASE_ST(ut_setup, ut_teardown,
15129                         test_aes_cmac_aes_ctr_digest_enc_test_case_1),
15130                 TEST_CASE_ST(ut_setup, ut_teardown,
15131                         test_aes_cmac_aes_ctr_digest_enc_test_case_1_oop),
15132                 TEST_CASE_ST(ut_setup, ut_teardown,
15133                         test_aes_cmac_aes_ctr_digest_enc_test_case_1_sgl),
15134                 TEST_CASE_ST(ut_setup, ut_teardown,
15135                         test_aes_cmac_aes_ctr_digest_enc_test_case_1_oop_sgl),
15136                 TEST_CASE_ST(ut_setup, ut_teardown,
15137                         test_verify_aes_cmac_aes_ctr_digest_enc_test_case_1),
15138                 TEST_CASE_ST(ut_setup, ut_teardown,
15139                         test_verify_aes_cmac_aes_ctr_digest_enc_test_case_1_oop),
15140                 TEST_CASE_ST(ut_setup, ut_teardown,
15141                         test_verify_aes_cmac_aes_ctr_digest_enc_test_case_1_sgl),
15142                 TEST_CASE_ST(ut_setup, ut_teardown,
15143                         test_verify_aes_cmac_aes_ctr_digest_enc_test_case_1_oop_sgl),
15144
15145                 /** AUTH ZUC + CIPHER SNOW3G */
15146                 TEST_CASE_ST(ut_setup, ut_teardown,
15147                         test_auth_zuc_cipher_snow_test_case_1),
15148                 TEST_CASE_ST(ut_setup, ut_teardown,
15149                         test_verify_auth_zuc_cipher_snow_test_case_1),
15150                 /** AUTH AES CMAC + CIPHER SNOW3G */
15151                 TEST_CASE_ST(ut_setup, ut_teardown,
15152                         test_auth_aes_cmac_cipher_snow_test_case_1),
15153                 TEST_CASE_ST(ut_setup, ut_teardown,
15154                         test_verify_auth_aes_cmac_cipher_snow_test_case_1),
15155                 /** AUTH ZUC + CIPHER AES CTR */
15156                 TEST_CASE_ST(ut_setup, ut_teardown,
15157                         test_auth_zuc_cipher_aes_ctr_test_case_1),
15158                 TEST_CASE_ST(ut_setup, ut_teardown,
15159                         test_verify_auth_zuc_cipher_aes_ctr_test_case_1),
15160                 /** AUTH SNOW3G + CIPHER AES CTR */
15161                 TEST_CASE_ST(ut_setup, ut_teardown,
15162                         test_auth_snow_cipher_aes_ctr_test_case_1),
15163                 TEST_CASE_ST(ut_setup, ut_teardown,
15164                         test_verify_auth_snow_cipher_aes_ctr_test_case_1),
15165                 /** AUTH SNOW3G + CIPHER ZUC */
15166                 TEST_CASE_ST(ut_setup, ut_teardown,
15167                         test_auth_snow_cipher_zuc_test_case_1),
15168                 TEST_CASE_ST(ut_setup, ut_teardown,
15169                         test_verify_auth_snow_cipher_zuc_test_case_1),
15170                 /** AUTH AES CMAC + CIPHER ZUC */
15171                 TEST_CASE_ST(ut_setup, ut_teardown,
15172                         test_auth_aes_cmac_cipher_zuc_test_case_1),
15173                 TEST_CASE_ST(ut_setup, ut_teardown,
15174                         test_verify_auth_aes_cmac_cipher_zuc_test_case_1),
15175
15176                 /** AUTH NULL + CIPHER SNOW3G */
15177                 TEST_CASE_ST(ut_setup, ut_teardown,
15178                         test_auth_null_cipher_snow_test_case_1),
15179                 TEST_CASE_ST(ut_setup, ut_teardown,
15180                         test_verify_auth_null_cipher_snow_test_case_1),
15181                 /** AUTH NULL + CIPHER ZUC */
15182                 TEST_CASE_ST(ut_setup, ut_teardown,
15183                         test_auth_null_cipher_zuc_test_case_1),
15184                 TEST_CASE_ST(ut_setup, ut_teardown,
15185                         test_verify_auth_null_cipher_zuc_test_case_1),
15186                 /** AUTH SNOW3G + CIPHER NULL */
15187                 TEST_CASE_ST(ut_setup, ut_teardown,
15188                         test_auth_snow_cipher_null_test_case_1),
15189                 TEST_CASE_ST(ut_setup, ut_teardown,
15190                         test_verify_auth_snow_cipher_null_test_case_1),
15191                 /** AUTH ZUC + CIPHER NULL */
15192                 TEST_CASE_ST(ut_setup, ut_teardown,
15193                         test_auth_zuc_cipher_null_test_case_1),
15194                 TEST_CASE_ST(ut_setup, ut_teardown,
15195                         test_verify_auth_zuc_cipher_null_test_case_1),
15196                 /** AUTH NULL + CIPHER AES CTR */
15197                 TEST_CASE_ST(ut_setup, ut_teardown,
15198                         test_auth_null_cipher_aes_ctr_test_case_1),
15199                 TEST_CASE_ST(ut_setup, ut_teardown,
15200                         test_verify_auth_null_cipher_aes_ctr_test_case_1),
15201                 /** AUTH AES CMAC + CIPHER NULL */
15202                 TEST_CASE_ST(ut_setup, ut_teardown,
15203                         test_auth_aes_cmac_cipher_null_test_case_1),
15204                 TEST_CASE_ST(ut_setup, ut_teardown,
15205                         test_verify_auth_aes_cmac_cipher_null_test_case_1),
15206                 TEST_CASES_END()
15207         }
15208 };
15209
15210 static int
15211 run_cryptodev_testsuite(const char *pmd_name)
15212 {
15213         uint8_t ret, j, i = 0, blk_start_idx = 0;
15214         const enum blockcipher_test_type blk_suites[] = {
15215                 BLKCIPHER_AES_CHAIN_TYPE,
15216                 BLKCIPHER_AES_CIPHERONLY_TYPE,
15217                 BLKCIPHER_AES_DOCSIS_TYPE,
15218                 BLKCIPHER_3DES_CHAIN_TYPE,
15219                 BLKCIPHER_3DES_CIPHERONLY_TYPE,
15220                 BLKCIPHER_DES_CIPHERONLY_TYPE,
15221                 BLKCIPHER_DES_DOCSIS_TYPE,
15222                 BLKCIPHER_AUTHONLY_TYPE};
15223         struct unit_test_suite *static_suites[] = {
15224                 &cryptodev_multi_session_testsuite,
15225                 &cryptodev_null_testsuite,
15226                 &cryptodev_aes_ccm_auth_testsuite,
15227                 &cryptodev_aes_gcm_auth_testsuite,
15228                 &cryptodev_aes_gmac_auth_testsuite,
15229                 &cryptodev_snow3g_testsuite,
15230                 &cryptodev_chacha20_poly1305_testsuite,
15231                 &cryptodev_zuc_testsuite,
15232                 &cryptodev_hmac_md5_auth_testsuite,
15233                 &cryptodev_kasumi_testsuite,
15234                 &cryptodev_esn_testsuite,
15235                 &cryptodev_negative_aes_gcm_testsuite,
15236                 &cryptodev_negative_aes_gmac_testsuite,
15237                 &cryptodev_mixed_cipher_hash_testsuite,
15238                 &cryptodev_negative_hmac_sha1_testsuite,
15239                 &cryptodev_gen_testsuite,
15240 #ifdef RTE_LIB_SECURITY
15241                 &ipsec_proto_testsuite,
15242                 &pdcp_proto_testsuite,
15243                 &docsis_proto_testsuite,
15244 #endif
15245                 &end_testsuite
15246         };
15247         static struct unit_test_suite ts = {
15248                 .suite_name = "Cryptodev Unit Test Suite",
15249                 .setup = testsuite_setup,
15250                 .teardown = testsuite_teardown,
15251                 .unit_test_cases = {TEST_CASES_END()}
15252         };
15253
15254         gbl_driver_id = rte_cryptodev_driver_id_get(pmd_name);
15255
15256         if (gbl_driver_id == -1) {
15257                 RTE_LOG(ERR, USER1, "%s PMD must be loaded.\n", pmd_name);
15258                 return TEST_SKIPPED;
15259         }
15260
15261         ts.unit_test_suites = malloc(sizeof(struct unit_test_suite *) *
15262                         (RTE_DIM(blk_suites) + RTE_DIM(static_suites)));
15263
15264         ADD_BLOCKCIPHER_TESTSUITE(i, ts, blk_suites, RTE_DIM(blk_suites));
15265         ADD_STATIC_TESTSUITE(i, ts, static_suites, RTE_DIM(static_suites));
15266         ret = unit_test_suite_runner(&ts);
15267
15268         FREE_BLOCKCIPHER_TESTSUITE(blk_start_idx, ts, RTE_DIM(blk_suites));
15269         free(ts.unit_test_suites);
15270         return ret;
15271 }
15272
15273 static int
15274 require_feature_flag(const char *pmd_name, uint64_t flag, const char *flag_name)
15275 {
15276         struct rte_cryptodev_info dev_info;
15277         uint8_t i, nb_devs;
15278         int driver_id;
15279
15280         driver_id = rte_cryptodev_driver_id_get(pmd_name);
15281         if (driver_id == -1) {
15282                 RTE_LOG(WARNING, USER1, "%s PMD must be loaded.\n", pmd_name);
15283                 return TEST_SKIPPED;
15284         }
15285
15286         nb_devs = rte_cryptodev_count();
15287         if (nb_devs < 1) {
15288                 RTE_LOG(WARNING, USER1, "No crypto devices found?\n");
15289                 return TEST_SKIPPED;
15290         }
15291
15292         for (i = 0; i < nb_devs; i++) {
15293                 rte_cryptodev_info_get(i, &dev_info);
15294                 if (dev_info.driver_id == driver_id) {
15295                         if (!(dev_info.feature_flags & flag)) {
15296                                 RTE_LOG(INFO, USER1, "%s not supported\n",
15297                                                 flag_name);
15298                                 return TEST_SKIPPED;
15299                         }
15300                         return 0; /* found */
15301                 }
15302         }
15303
15304         RTE_LOG(INFO, USER1, "%s not supported\n", flag_name);
15305         return TEST_SKIPPED;
15306 }
15307
15308 static int
15309 test_cryptodev_qat(void)
15310 {
15311         return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_QAT_SYM_PMD));
15312 }
15313
15314 static int
15315 test_cryptodev_virtio(void)
15316 {
15317         return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_VIRTIO_PMD));
15318 }
15319
15320 static int
15321 test_cryptodev_aesni_mb(void)
15322 {
15323         return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_AESNI_MB_PMD));
15324 }
15325
15326 static int
15327 test_cryptodev_cpu_aesni_mb(void)
15328 {
15329         int32_t rc;
15330         enum rte_security_session_action_type at = gbl_action_type;
15331         gbl_action_type = RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO;
15332         rc = run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_AESNI_MB_PMD));
15333         gbl_action_type = at;
15334         return rc;
15335 }
15336
15337 static int
15338 test_cryptodev_openssl(void)
15339 {
15340         return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_OPENSSL_PMD));
15341 }
15342
15343 static int
15344 test_cryptodev_aesni_gcm(void)
15345 {
15346         return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_AESNI_GCM_PMD));
15347 }
15348
15349 static int
15350 test_cryptodev_cpu_aesni_gcm(void)
15351 {
15352         int32_t rc;
15353         enum rte_security_session_action_type at = gbl_action_type;
15354         gbl_action_type = RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO;
15355         rc  = run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_AESNI_GCM_PMD));
15356         gbl_action_type = at;
15357         return rc;
15358 }
15359
15360 static int
15361 test_cryptodev_mlx5(void)
15362 {
15363         return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_MLX5_PMD));
15364 }
15365
15366 static int
15367 test_cryptodev_null(void)
15368 {
15369         return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_NULL_PMD));
15370 }
15371
15372 static int
15373 test_cryptodev_sw_snow3g(void)
15374 {
15375         return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_SNOW3G_PMD));
15376 }
15377
15378 static int
15379 test_cryptodev_sw_kasumi(void)
15380 {
15381         return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_KASUMI_PMD));
15382 }
15383
15384 static int
15385 test_cryptodev_sw_zuc(void)
15386 {
15387         return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_ZUC_PMD));
15388 }
15389
15390 static int
15391 test_cryptodev_armv8(void)
15392 {
15393         return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_ARMV8_PMD));
15394 }
15395
15396 static int
15397 test_cryptodev_mrvl(void)
15398 {
15399         return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_MVSAM_PMD));
15400 }
15401
15402 #ifdef RTE_CRYPTO_SCHEDULER
15403
15404 static int
15405 test_cryptodev_scheduler(void)
15406 {
15407         uint8_t ret, sched_i, j, i = 0, blk_start_idx = 0;
15408         const enum blockcipher_test_type blk_suites[] = {
15409                 BLKCIPHER_AES_CHAIN_TYPE,
15410                 BLKCIPHER_AES_CIPHERONLY_TYPE,
15411                 BLKCIPHER_AUTHONLY_TYPE
15412         };
15413         static struct unit_test_suite scheduler_multicore = {
15414                 .suite_name = "Scheduler Multicore Unit Test Suite",
15415                 .setup = scheduler_multicore_testsuite_setup,
15416                 .teardown = scheduler_mode_testsuite_teardown,
15417                 .unit_test_cases = {TEST_CASES_END()}
15418         };
15419         static struct unit_test_suite scheduler_round_robin = {
15420                 .suite_name = "Scheduler Round Robin Unit Test Suite",
15421                 .setup = scheduler_roundrobin_testsuite_setup,
15422                 .teardown = scheduler_mode_testsuite_teardown,
15423                 .unit_test_cases = {TEST_CASES_END()}
15424         };
15425         static struct unit_test_suite scheduler_failover = {
15426                 .suite_name = "Scheduler Failover Unit Test Suite",
15427                 .setup = scheduler_failover_testsuite_setup,
15428                 .teardown = scheduler_mode_testsuite_teardown,
15429                 .unit_test_cases = {TEST_CASES_END()}
15430         };
15431         static struct unit_test_suite scheduler_pkt_size_distr = {
15432                 .suite_name = "Scheduler Pkt Size Distr Unit Test Suite",
15433                 .setup = scheduler_pkt_size_distr_testsuite_setup,
15434                 .teardown = scheduler_mode_testsuite_teardown,
15435                 .unit_test_cases = {TEST_CASES_END()}
15436         };
15437         struct unit_test_suite *sched_mode_suites[] = {
15438                 &scheduler_multicore,
15439                 &scheduler_round_robin,
15440                 &scheduler_failover,
15441                 &scheduler_pkt_size_distr
15442         };
15443         static struct unit_test_suite scheduler_config = {
15444                 .suite_name = "Crypto Device Scheduler Config Unit Test Suite",
15445                 .unit_test_cases = {
15446                         TEST_CASE(test_scheduler_attach_worker_op),
15447                         TEST_CASE(test_scheduler_mode_multicore_op),
15448                         TEST_CASE(test_scheduler_mode_roundrobin_op),
15449                         TEST_CASE(test_scheduler_mode_failover_op),
15450                         TEST_CASE(test_scheduler_mode_pkt_size_distr_op),
15451                         TEST_CASE(test_scheduler_detach_worker_op),
15452
15453                         TEST_CASES_END() /**< NULL terminate array */
15454                 }
15455         };
15456         struct unit_test_suite *static_suites[] = {
15457                 &scheduler_config,
15458                 &end_testsuite
15459         };
15460         static struct unit_test_suite ts = {
15461                 .suite_name = "Scheduler Unit Test Suite",
15462                 .setup = scheduler_testsuite_setup,
15463                 .teardown = testsuite_teardown,
15464                 .unit_test_cases = {TEST_CASES_END()}
15465         };
15466
15467         gbl_driver_id = rte_cryptodev_driver_id_get(
15468                         RTE_STR(CRYPTODEV_NAME_SCHEDULER_PMD));
15469
15470         if (gbl_driver_id == -1) {
15471                 RTE_LOG(ERR, USER1, "SCHEDULER PMD must be loaded.\n");
15472                 return TEST_SKIPPED;
15473         }
15474
15475         if (rte_cryptodev_driver_id_get(
15476                                 RTE_STR(CRYPTODEV_NAME_AESNI_MB_PMD)) == -1) {
15477                 RTE_LOG(ERR, USER1, "AESNI MB PMD must be loaded.\n");
15478                 return TEST_SKIPPED;
15479         }
15480
15481         for (sched_i = 0; sched_i < RTE_DIM(sched_mode_suites); sched_i++) {
15482                 uint8_t blk_i = 0;
15483                 sched_mode_suites[sched_i]->unit_test_suites = malloc(sizeof
15484                                 (struct unit_test_suite *) *
15485                                 (RTE_DIM(blk_suites) + 1));
15486                 ADD_BLOCKCIPHER_TESTSUITE(blk_i, (*sched_mode_suites[sched_i]),
15487                                 blk_suites, RTE_DIM(blk_suites));
15488                 sched_mode_suites[sched_i]->unit_test_suites[blk_i] = &end_testsuite;
15489         }
15490
15491         ts.unit_test_suites = malloc(sizeof(struct unit_test_suite *) *
15492                         (RTE_DIM(static_suites) + RTE_DIM(sched_mode_suites)));
15493         ADD_STATIC_TESTSUITE(i, ts, sched_mode_suites,
15494                         RTE_DIM(sched_mode_suites));
15495         ADD_STATIC_TESTSUITE(i, ts, static_suites, RTE_DIM(static_suites));
15496         ret = unit_test_suite_runner(&ts);
15497
15498         for (sched_i = 0; sched_i < RTE_DIM(sched_mode_suites); sched_i++) {
15499                 FREE_BLOCKCIPHER_TESTSUITE(blk_start_idx,
15500                                 (*sched_mode_suites[sched_i]),
15501                                 RTE_DIM(blk_suites));
15502                 free(sched_mode_suites[sched_i]->unit_test_suites);
15503         }
15504         free(ts.unit_test_suites);
15505         return ret;
15506 }
15507
15508 REGISTER_TEST_COMMAND(cryptodev_scheduler_autotest, test_cryptodev_scheduler);
15509
15510 #endif
15511
15512 static int
15513 test_cryptodev_dpaa2_sec(void)
15514 {
15515         return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_DPAA2_SEC_PMD));
15516 }
15517
15518 static int
15519 test_cryptodev_dpaa_sec(void)
15520 {
15521         return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_DPAA_SEC_PMD));
15522 }
15523
15524 static int
15525 test_cryptodev_ccp(void)
15526 {
15527         return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_CCP_PMD));
15528 }
15529
15530 static int
15531 test_cryptodev_octeontx(void)
15532 {
15533         return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_OCTEONTX_SYM_PMD));
15534 }
15535
15536 static int
15537 test_cryptodev_octeontx2(void)
15538 {
15539         return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_OCTEONTX2_PMD));
15540 }
15541
15542 static int
15543 test_cryptodev_caam_jr(void)
15544 {
15545         return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_CAAM_JR_PMD));
15546 }
15547
15548 static int
15549 test_cryptodev_nitrox(void)
15550 {
15551         return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_NITROX_PMD));
15552 }
15553
15554 static int
15555 test_cryptodev_bcmfs(void)
15556 {
15557         return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_BCMFS_PMD));
15558 }
15559
15560 static int
15561 test_cryptodev_qat_raw_api(void)
15562 {
15563         static const char *pmd_name = RTE_STR(CRYPTODEV_NAME_QAT_SYM_PMD);
15564         int ret;
15565
15566         ret = require_feature_flag(pmd_name, RTE_CRYPTODEV_FF_SYM_RAW_DP,
15567                         "RAW API");
15568         if (ret)
15569                 return ret;
15570
15571         global_api_test_type = CRYPTODEV_RAW_API_TEST;
15572         ret = run_cryptodev_testsuite(pmd_name);
15573         global_api_test_type = CRYPTODEV_API_TEST;
15574
15575         return ret;
15576 }
15577
15578 static int
15579 test_cryptodev_cn9k(void)
15580 {
15581         return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_CN9K_PMD));
15582 }
15583
15584 static int
15585 test_cryptodev_cn10k(void)
15586 {
15587         return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_CN10K_PMD));
15588 }
15589
15590 static int
15591 test_cryptodev_dpaa2_sec_raw_api(void)
15592 {
15593         static const char *pmd_name = RTE_STR(CRYPTODEV_NAME_DPAA2_SEC_PMD);
15594         int ret;
15595
15596         ret = require_feature_flag(pmd_name, RTE_CRYPTODEV_FF_SYM_RAW_DP,
15597                         "RAW API");
15598         if (ret)
15599                 return ret;
15600
15601         global_api_test_type = CRYPTODEV_RAW_API_TEST;
15602         ret = run_cryptodev_testsuite(pmd_name);
15603         global_api_test_type = CRYPTODEV_API_TEST;
15604
15605         return ret;
15606 }
15607
15608 static int
15609 test_cryptodev_dpaa_sec_raw_api(void)
15610 {
15611         static const char *pmd_name = RTE_STR(CRYPTODEV_NAME_DPAA2_SEC_PMD);
15612         int ret;
15613
15614         ret = require_feature_flag(pmd_name, RTE_CRYPTODEV_FF_SYM_RAW_DP,
15615                         "RAW API");
15616         if (ret)
15617                 return ret;
15618
15619         global_api_test_type = CRYPTODEV_RAW_API_TEST;
15620         ret = run_cryptodev_testsuite(pmd_name);
15621         global_api_test_type = CRYPTODEV_API_TEST;
15622
15623         return ret;
15624 }
15625
15626 REGISTER_TEST_COMMAND(cryptodev_dpaa2_sec_raw_api_autotest,
15627                 test_cryptodev_dpaa2_sec_raw_api);
15628 REGISTER_TEST_COMMAND(cryptodev_dpaa_sec_raw_api_autotest,
15629                 test_cryptodev_dpaa_sec_raw_api);
15630 REGISTER_TEST_COMMAND(cryptodev_qat_raw_api_autotest,
15631                 test_cryptodev_qat_raw_api);
15632 REGISTER_TEST_COMMAND(cryptodev_qat_autotest, test_cryptodev_qat);
15633 REGISTER_TEST_COMMAND(cryptodev_aesni_mb_autotest, test_cryptodev_aesni_mb);
15634 REGISTER_TEST_COMMAND(cryptodev_cpu_aesni_mb_autotest,
15635         test_cryptodev_cpu_aesni_mb);
15636 REGISTER_TEST_COMMAND(cryptodev_openssl_autotest, test_cryptodev_openssl);
15637 REGISTER_TEST_COMMAND(cryptodev_aesni_gcm_autotest, test_cryptodev_aesni_gcm);
15638 REGISTER_TEST_COMMAND(cryptodev_cpu_aesni_gcm_autotest,
15639         test_cryptodev_cpu_aesni_gcm);
15640 REGISTER_TEST_COMMAND(cryptodev_mlx5_autotest, test_cryptodev_mlx5);
15641 REGISTER_TEST_COMMAND(cryptodev_null_autotest, test_cryptodev_null);
15642 REGISTER_TEST_COMMAND(cryptodev_sw_snow3g_autotest, test_cryptodev_sw_snow3g);
15643 REGISTER_TEST_COMMAND(cryptodev_sw_kasumi_autotest, test_cryptodev_sw_kasumi);
15644 REGISTER_TEST_COMMAND(cryptodev_sw_zuc_autotest, test_cryptodev_sw_zuc);
15645 REGISTER_TEST_COMMAND(cryptodev_sw_armv8_autotest, test_cryptodev_armv8);
15646 REGISTER_TEST_COMMAND(cryptodev_sw_mvsam_autotest, test_cryptodev_mrvl);
15647 REGISTER_TEST_COMMAND(cryptodev_dpaa2_sec_autotest, test_cryptodev_dpaa2_sec);
15648 REGISTER_TEST_COMMAND(cryptodev_dpaa_sec_autotest, test_cryptodev_dpaa_sec);
15649 REGISTER_TEST_COMMAND(cryptodev_ccp_autotest, test_cryptodev_ccp);
15650 REGISTER_TEST_COMMAND(cryptodev_virtio_autotest, test_cryptodev_virtio);
15651 REGISTER_TEST_COMMAND(cryptodev_octeontx_autotest, test_cryptodev_octeontx);
15652 REGISTER_TEST_COMMAND(cryptodev_octeontx2_autotest, test_cryptodev_octeontx2);
15653 REGISTER_TEST_COMMAND(cryptodev_caam_jr_autotest, test_cryptodev_caam_jr);
15654 REGISTER_TEST_COMMAND(cryptodev_nitrox_autotest, test_cryptodev_nitrox);
15655 REGISTER_TEST_COMMAND(cryptodev_bcmfs_autotest, test_cryptodev_bcmfs);
15656 REGISTER_TEST_COMMAND(cryptodev_cn9k_autotest, test_cryptodev_cn9k);
15657 REGISTER_TEST_COMMAND(cryptodev_cn10k_autotest, test_cryptodev_cn10k);