net/virtio: fix uninitialized RSS key
[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 static struct crypto_testsuite_params testsuite_params = { NULL };
183 struct crypto_testsuite_params *p_testsuite_params = &testsuite_params;
184 static struct crypto_unittest_params unittest_params;
185
186 void
187 process_sym_raw_dp_op(uint8_t dev_id, uint16_t qp_id,
188                 struct rte_crypto_op *op, uint8_t is_cipher, uint8_t is_auth,
189                 uint8_t len_in_bits, uint8_t cipher_iv_len)
190 {
191         struct rte_crypto_sym_op *sop = op->sym;
192         struct rte_crypto_op *ret_op = NULL;
193         struct rte_crypto_vec data_vec[UINT8_MAX], dest_data_vec[UINT8_MAX];
194         struct rte_crypto_va_iova_ptr cipher_iv, digest, aad_auth_iv;
195         union rte_crypto_sym_ofs ofs;
196         struct rte_crypto_sym_vec vec;
197         struct rte_crypto_sgl sgl, dest_sgl;
198         uint32_t max_len;
199         union rte_cryptodev_session_ctx sess;
200         uint64_t auth_end_iova;
201         uint32_t count = 0;
202         struct rte_crypto_raw_dp_ctx *ctx;
203         uint32_t cipher_offset = 0, cipher_len = 0, auth_offset = 0,
204                         auth_len = 0;
205         int32_t n;
206         uint32_t n_success;
207         int ctx_service_size;
208         int32_t status = 0;
209         int enqueue_status, dequeue_status;
210         struct crypto_unittest_params *ut_params = &unittest_params;
211         int is_sgl = sop->m_src->nb_segs > 1;
212
213         ctx_service_size = rte_cryptodev_get_raw_dp_ctx_size(dev_id);
214         if (ctx_service_size < 0) {
215                 op->status = RTE_CRYPTO_OP_STATUS_ERROR;
216                 return;
217         }
218
219         ctx = malloc(ctx_service_size);
220         if (!ctx) {
221                 op->status = RTE_CRYPTO_OP_STATUS_ERROR;
222                 return;
223         }
224
225         /* Both are enums, setting crypto_sess will suit any session type */
226         sess.crypto_sess = op->sym->session;
227
228         if (rte_cryptodev_configure_raw_dp_ctx(dev_id, qp_id, ctx,
229                         op->sess_type, sess, 0) < 0) {
230                 op->status = RTE_CRYPTO_OP_STATUS_ERROR;
231                 goto exit;
232         }
233
234         cipher_iv.iova = 0;
235         cipher_iv.va = NULL;
236         aad_auth_iv.iova = 0;
237         aad_auth_iv.va = NULL;
238         digest.iova = 0;
239         digest.va = NULL;
240         sgl.vec = data_vec;
241         vec.num = 1;
242         vec.src_sgl = &sgl;
243         vec.iv = &cipher_iv;
244         vec.digest = &digest;
245         vec.aad = &aad_auth_iv;
246         vec.status = &status;
247
248         ofs.raw = 0;
249
250         if (is_cipher && is_auth) {
251                 cipher_offset = sop->cipher.data.offset;
252                 cipher_len = sop->cipher.data.length;
253                 auth_offset = sop->auth.data.offset;
254                 auth_len = sop->auth.data.length;
255                 max_len = RTE_MAX(cipher_offset + cipher_len,
256                                 auth_offset + auth_len);
257                 if (len_in_bits) {
258                         max_len = max_len >> 3;
259                         cipher_offset = cipher_offset >> 3;
260                         auth_offset = auth_offset >> 3;
261                         cipher_len = cipher_len >> 3;
262                         auth_len = auth_len >> 3;
263                 }
264                 ofs.ofs.cipher.head = cipher_offset;
265                 ofs.ofs.cipher.tail = max_len - cipher_offset - cipher_len;
266                 ofs.ofs.auth.head = auth_offset;
267                 ofs.ofs.auth.tail = max_len - auth_offset - auth_len;
268                 cipher_iv.va = rte_crypto_op_ctod_offset(op, void *, IV_OFFSET);
269                 cipher_iv.iova = rte_crypto_op_ctophys_offset(op, IV_OFFSET);
270                 aad_auth_iv.va = rte_crypto_op_ctod_offset(
271                                 op, void *, IV_OFFSET + cipher_iv_len);
272                 aad_auth_iv.iova = rte_crypto_op_ctophys_offset(op, IV_OFFSET +
273                                 cipher_iv_len);
274                 digest.va = (void *)sop->auth.digest.data;
275                 digest.iova = sop->auth.digest.phys_addr;
276
277                 if (is_sgl) {
278                         uint32_t remaining_off = auth_offset + auth_len;
279                         struct rte_mbuf *sgl_buf = sop->m_src;
280
281                         while (remaining_off >= rte_pktmbuf_data_len(sgl_buf)
282                                         && sgl_buf->next != NULL) {
283                                 remaining_off -= rte_pktmbuf_data_len(sgl_buf);
284                                 sgl_buf = sgl_buf->next;
285                         }
286
287                         auth_end_iova = (uint64_t)rte_pktmbuf_iova_offset(
288                                 sgl_buf, remaining_off);
289                 } else {
290                         auth_end_iova = rte_pktmbuf_iova(op->sym->m_src) +
291                                                          auth_offset + auth_len;
292                 }
293                 /* Then check if digest-encrypted conditions are met */
294                 if ((auth_offset + auth_len < cipher_offset + cipher_len) &&
295                                 (digest.iova == auth_end_iova) && is_sgl)
296                         max_len = RTE_MAX(max_len, auth_offset + auth_len +
297                                 ut_params->auth_xform.auth.digest_length);
298
299         } else if (is_cipher) {
300                 cipher_offset = sop->cipher.data.offset;
301                 cipher_len = sop->cipher.data.length;
302                 max_len = cipher_len + cipher_offset;
303                 if (len_in_bits) {
304                         max_len = max_len >> 3;
305                         cipher_offset = cipher_offset >> 3;
306                         cipher_len = cipher_len >> 3;
307                 }
308                 ofs.ofs.cipher.head = cipher_offset;
309                 ofs.ofs.cipher.tail = max_len - cipher_offset - cipher_len;
310                 cipher_iv.va = rte_crypto_op_ctod_offset(op, void *, IV_OFFSET);
311                 cipher_iv.iova = rte_crypto_op_ctophys_offset(op, IV_OFFSET);
312
313         } else if (is_auth) {
314                 auth_offset = sop->auth.data.offset;
315                 auth_len = sop->auth.data.length;
316                 max_len = auth_len + auth_offset;
317                 if (len_in_bits) {
318                         max_len = max_len >> 3;
319                         auth_offset = auth_offset >> 3;
320                         auth_len = auth_len >> 3;
321                 }
322                 ofs.ofs.auth.head = auth_offset;
323                 ofs.ofs.auth.tail = max_len - auth_offset - auth_len;
324                 aad_auth_iv.va = rte_crypto_op_ctod_offset(
325                                 op, void *, IV_OFFSET + cipher_iv_len);
326                 aad_auth_iv.iova = rte_crypto_op_ctophys_offset(op, IV_OFFSET +
327                                 cipher_iv_len);
328                 digest.va = (void *)sop->auth.digest.data;
329                 digest.iova = sop->auth.digest.phys_addr;
330
331         } else { /* aead */
332                 cipher_offset = sop->aead.data.offset;
333                 cipher_len = sop->aead.data.length;
334                 max_len = cipher_len + cipher_offset;
335                 if (len_in_bits) {
336                         max_len = max_len >> 3;
337                         cipher_offset = cipher_offset >> 3;
338                         cipher_len = cipher_len >> 3;
339                 }
340                 ofs.ofs.cipher.head = cipher_offset;
341                 ofs.ofs.cipher.tail = max_len - cipher_offset - cipher_len;
342                 cipher_iv.va = rte_crypto_op_ctod_offset(op, void *, IV_OFFSET);
343                 cipher_iv.iova = rte_crypto_op_ctophys_offset(op, IV_OFFSET);
344                 aad_auth_iv.va = (void *)sop->aead.aad.data;
345                 aad_auth_iv.iova = sop->aead.aad.phys_addr;
346                 digest.va = (void *)sop->aead.digest.data;
347                 digest.iova = sop->aead.digest.phys_addr;
348         }
349
350         n = rte_crypto_mbuf_to_vec(sop->m_src, 0, max_len,
351                         data_vec, RTE_DIM(data_vec));
352         if (n < 0 || n > sop->m_src->nb_segs) {
353                 op->status = RTE_CRYPTO_OP_STATUS_ERROR;
354                 goto exit;
355         }
356
357         sgl.num = n;
358         /* Out of place */
359         if (sop->m_dst != NULL) {
360                 dest_sgl.vec = dest_data_vec;
361                 vec.dest_sgl = &dest_sgl;
362                 n = rte_crypto_mbuf_to_vec(sop->m_dst, 0, max_len,
363                                 dest_data_vec, RTE_DIM(dest_data_vec));
364                 if (n < 0 || n > sop->m_dst->nb_segs) {
365                         op->status = RTE_CRYPTO_OP_STATUS_ERROR;
366                         goto exit;
367                 }
368                 dest_sgl.num = n;
369         } else
370                 vec.dest_sgl = NULL;
371
372         if (rte_cryptodev_raw_enqueue_burst(ctx, &vec, ofs, (void **)&op,
373                         &enqueue_status) < 1) {
374                 op->status = RTE_CRYPTO_OP_STATUS_ERROR;
375                 goto exit;
376         }
377
378         if (enqueue_status == 0) {
379                 status = rte_cryptodev_raw_enqueue_done(ctx, 1);
380                 if (status < 0) {
381                         op->status = RTE_CRYPTO_OP_STATUS_ERROR;
382                         goto exit;
383                 }
384         } else if (enqueue_status < 0) {
385                 op->status = RTE_CRYPTO_OP_STATUS_ERROR;
386                 goto exit;
387         }
388
389         n = n_success = 0;
390         while (count++ < MAX_RAW_DEQUEUE_COUNT && n == 0) {
391                 n = rte_cryptodev_raw_dequeue_burst(ctx,
392                         NULL, 1, post_process_raw_dp_op,
393                                 (void **)&ret_op, 0, &n_success,
394                                 &dequeue_status);
395                 if (dequeue_status < 0) {
396                         op->status = RTE_CRYPTO_OP_STATUS_ERROR;
397                         goto exit;
398                 }
399                 if (n == 0)
400                         rte_pause();
401         }
402
403         if (n == 1 && dequeue_status == 0) {
404                 if (rte_cryptodev_raw_dequeue_done(ctx, 1) < 0) {
405                         op->status = RTE_CRYPTO_OP_STATUS_ERROR;
406                         goto exit;
407                 }
408         }
409
410         op->status = (count == MAX_RAW_DEQUEUE_COUNT + 1 || ret_op != op ||
411                         ret_op->status == RTE_CRYPTO_OP_STATUS_ERROR ||
412                         n_success < 1) ? RTE_CRYPTO_OP_STATUS_ERROR :
413                                         RTE_CRYPTO_OP_STATUS_SUCCESS;
414
415 exit:
416         free(ctx);
417 }
418
419 static void
420 process_cpu_aead_op(uint8_t dev_id, struct rte_crypto_op *op)
421 {
422         int32_t n, st;
423         struct rte_crypto_sym_op *sop;
424         union rte_crypto_sym_ofs ofs;
425         struct rte_crypto_sgl sgl;
426         struct rte_crypto_sym_vec symvec;
427         struct rte_crypto_va_iova_ptr iv_ptr, aad_ptr, digest_ptr;
428         struct rte_crypto_vec vec[UINT8_MAX];
429
430         sop = op->sym;
431
432         n = rte_crypto_mbuf_to_vec(sop->m_src, sop->aead.data.offset,
433                 sop->aead.data.length, vec, RTE_DIM(vec));
434
435         if (n < 0 || n != sop->m_src->nb_segs) {
436                 op->status = RTE_CRYPTO_OP_STATUS_ERROR;
437                 return;
438         }
439
440         sgl.vec = vec;
441         sgl.num = n;
442         symvec.src_sgl = &sgl;
443         symvec.iv = &iv_ptr;
444         symvec.digest = &digest_ptr;
445         symvec.aad = &aad_ptr;
446         symvec.status = &st;
447         symvec.num = 1;
448
449         /* for CPU crypto the IOVA address is not required */
450         iv_ptr.va = rte_crypto_op_ctod_offset(op, void *, IV_OFFSET);
451         digest_ptr.va = (void *)sop->aead.digest.data;
452         aad_ptr.va = (void *)sop->aead.aad.data;
453
454         ofs.raw = 0;
455
456         n = rte_cryptodev_sym_cpu_crypto_process(dev_id, sop->session, ofs,
457                 &symvec);
458
459         if (n != 1)
460                 op->status = RTE_CRYPTO_OP_STATUS_AUTH_FAILED;
461         else
462                 op->status = RTE_CRYPTO_OP_STATUS_SUCCESS;
463 }
464
465 static void
466 process_cpu_crypt_auth_op(uint8_t dev_id, struct rte_crypto_op *op)
467 {
468         int32_t n, st;
469         struct rte_crypto_sym_op *sop;
470         union rte_crypto_sym_ofs ofs;
471         struct rte_crypto_sgl sgl;
472         struct rte_crypto_sym_vec symvec;
473         struct rte_crypto_va_iova_ptr iv_ptr, digest_ptr;
474         struct rte_crypto_vec vec[UINT8_MAX];
475
476         sop = op->sym;
477
478         n = rte_crypto_mbuf_to_vec(sop->m_src, sop->auth.data.offset,
479                 sop->auth.data.length, vec, RTE_DIM(vec));
480
481         if (n < 0 || n != sop->m_src->nb_segs) {
482                 op->status = RTE_CRYPTO_OP_STATUS_ERROR;
483                 return;
484         }
485
486         sgl.vec = vec;
487         sgl.num = n;
488         symvec.src_sgl = &sgl;
489         symvec.iv = &iv_ptr;
490         symvec.digest = &digest_ptr;
491         symvec.status = &st;
492         symvec.num = 1;
493
494         iv_ptr.va = rte_crypto_op_ctod_offset(op, void *, IV_OFFSET);
495         digest_ptr.va = (void *)sop->auth.digest.data;
496
497         ofs.raw = 0;
498         ofs.ofs.cipher.head = sop->cipher.data.offset - sop->auth.data.offset;
499         ofs.ofs.cipher.tail = (sop->auth.data.offset + sop->auth.data.length) -
500                 (sop->cipher.data.offset + sop->cipher.data.length);
501
502         n = rte_cryptodev_sym_cpu_crypto_process(dev_id, sop->session, ofs,
503                 &symvec);
504
505         if (n != 1)
506                 op->status = RTE_CRYPTO_OP_STATUS_AUTH_FAILED;
507         else
508                 op->status = RTE_CRYPTO_OP_STATUS_SUCCESS;
509 }
510
511 static struct rte_crypto_op *
512 process_crypto_request(uint8_t dev_id, struct rte_crypto_op *op)
513 {
514
515         RTE_VERIFY(gbl_action_type != RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO);
516
517         if (rte_cryptodev_enqueue_burst(dev_id, 0, &op, 1) != 1) {
518                 RTE_LOG(ERR, USER1, "Error sending packet for encryption\n");
519                 return NULL;
520         }
521
522         op = NULL;
523
524         while (rte_cryptodev_dequeue_burst(dev_id, 0, &op, 1) == 0)
525                 rte_pause();
526
527         if (op->status != RTE_CRYPTO_OP_STATUS_SUCCESS) {
528                 RTE_LOG(DEBUG, USER1, "Operation status %d\n", op->status);
529                 return NULL;
530         }
531
532         return op;
533 }
534
535 static int
536 testsuite_setup(void)
537 {
538         struct crypto_testsuite_params *ts_params = &testsuite_params;
539         struct rte_cryptodev_info info;
540         uint32_t i = 0, nb_devs, dev_id;
541         uint16_t qp_id;
542
543         memset(ts_params, 0, sizeof(*ts_params));
544
545         ts_params->mbuf_pool = rte_mempool_lookup("CRYPTO_MBUFPOOL");
546         if (ts_params->mbuf_pool == NULL) {
547                 /* Not already created so create */
548                 ts_params->mbuf_pool = rte_pktmbuf_pool_create(
549                                 "CRYPTO_MBUFPOOL",
550                                 NUM_MBUFS, MBUF_CACHE_SIZE, 0, MBUF_SIZE,
551                                 rte_socket_id());
552                 if (ts_params->mbuf_pool == NULL) {
553                         RTE_LOG(ERR, USER1, "Can't create CRYPTO_MBUFPOOL\n");
554                         return TEST_FAILED;
555                 }
556         }
557
558         ts_params->large_mbuf_pool = rte_mempool_lookup(
559                         "CRYPTO_LARGE_MBUFPOOL");
560         if (ts_params->large_mbuf_pool == NULL) {
561                 /* Not already created so create */
562                 ts_params->large_mbuf_pool = rte_pktmbuf_pool_create(
563                                 "CRYPTO_LARGE_MBUFPOOL",
564                                 1, 0, 0, UINT16_MAX,
565                                 rte_socket_id());
566                 if (ts_params->large_mbuf_pool == NULL) {
567                         RTE_LOG(ERR, USER1,
568                                 "Can't create CRYPTO_LARGE_MBUFPOOL\n");
569                         return TEST_FAILED;
570                 }
571         }
572
573         ts_params->op_mpool = rte_crypto_op_pool_create(
574                         "MBUF_CRYPTO_SYM_OP_POOL",
575                         RTE_CRYPTO_OP_TYPE_SYMMETRIC,
576                         NUM_MBUFS, MBUF_CACHE_SIZE,
577                         DEFAULT_NUM_XFORMS *
578                         sizeof(struct rte_crypto_sym_xform) +
579                         MAXIMUM_IV_LENGTH,
580                         rte_socket_id());
581         if (ts_params->op_mpool == NULL) {
582                 RTE_LOG(ERR, USER1, "Can't create CRYPTO_OP_POOL\n");
583                 return TEST_FAILED;
584         }
585
586         nb_devs = rte_cryptodev_count();
587         if (nb_devs < 1) {
588                 RTE_LOG(WARNING, USER1, "No crypto devices found?\n");
589                 return TEST_SKIPPED;
590         }
591
592         if (rte_cryptodev_device_count_by_driver(gbl_driver_id) < 1) {
593                 RTE_LOG(WARNING, USER1, "No %s devices found?\n",
594                                 rte_cryptodev_driver_name_get(gbl_driver_id));
595                 return TEST_SKIPPED;
596         }
597
598         /* Create list of valid crypto devs */
599         for (i = 0; i < nb_devs; i++) {
600                 rte_cryptodev_info_get(i, &info);
601                 if (info.driver_id == gbl_driver_id)
602                         ts_params->valid_devs[ts_params->valid_dev_count++] = i;
603         }
604
605         if (ts_params->valid_dev_count < 1)
606                 return TEST_FAILED;
607
608         /* Set up all the qps on the first of the valid devices found */
609
610         dev_id = ts_params->valid_devs[0];
611
612         rte_cryptodev_info_get(dev_id, &info);
613
614         ts_params->conf.nb_queue_pairs = info.max_nb_queue_pairs;
615         ts_params->conf.socket_id = SOCKET_ID_ANY;
616         ts_params->conf.ff_disable = RTE_CRYPTODEV_FF_SECURITY;
617
618         unsigned int session_size =
619                 rte_cryptodev_sym_get_private_session_size(dev_id);
620
621 #ifdef RTE_LIB_SECURITY
622         unsigned int security_session_size = rte_security_session_get_size(
623                         rte_cryptodev_get_sec_ctx(dev_id));
624
625         if (session_size < security_session_size)
626                 session_size = security_session_size;
627 #endif
628         /*
629          * Create mempool with maximum number of sessions.
630          */
631         if (info.sym.max_nb_sessions != 0 &&
632                         info.sym.max_nb_sessions < MAX_NB_SESSIONS) {
633                 RTE_LOG(ERR, USER1, "Device does not support "
634                                 "at least %u sessions\n",
635                                 MAX_NB_SESSIONS);
636                 return TEST_FAILED;
637         }
638
639         ts_params->session_mpool = rte_cryptodev_sym_session_pool_create(
640                         "test_sess_mp", MAX_NB_SESSIONS, 0, 0, 0,
641                         SOCKET_ID_ANY);
642         TEST_ASSERT_NOT_NULL(ts_params->session_mpool,
643                         "session mempool allocation failed");
644
645         ts_params->session_priv_mpool = rte_mempool_create(
646                         "test_sess_mp_priv",
647                         MAX_NB_SESSIONS,
648                         session_size,
649                         0, 0, NULL, NULL, NULL,
650                         NULL, SOCKET_ID_ANY,
651                         0);
652         TEST_ASSERT_NOT_NULL(ts_params->session_priv_mpool,
653                         "session mempool allocation failed");
654
655
656
657         TEST_ASSERT_SUCCESS(rte_cryptodev_configure(dev_id,
658                         &ts_params->conf),
659                         "Failed to configure cryptodev %u with %u qps",
660                         dev_id, ts_params->conf.nb_queue_pairs);
661
662         ts_params->qp_conf.nb_descriptors = MAX_NUM_OPS_INFLIGHT;
663         ts_params->qp_conf.mp_session = ts_params->session_mpool;
664         ts_params->qp_conf.mp_session_private = ts_params->session_priv_mpool;
665
666         for (qp_id = 0; qp_id < info.max_nb_queue_pairs; qp_id++) {
667                 TEST_ASSERT_SUCCESS(rte_cryptodev_queue_pair_setup(
668                         dev_id, qp_id, &ts_params->qp_conf,
669                         rte_cryptodev_socket_id(dev_id)),
670                         "Failed to setup queue pair %u on cryptodev %u",
671                         qp_id, dev_id);
672         }
673
674         return TEST_SUCCESS;
675 }
676
677 static void
678 testsuite_teardown(void)
679 {
680         struct crypto_testsuite_params *ts_params = &testsuite_params;
681         int res;
682
683         if (ts_params->mbuf_pool != NULL) {
684                 RTE_LOG(DEBUG, USER1, "CRYPTO_MBUFPOOL count %u\n",
685                 rte_mempool_avail_count(ts_params->mbuf_pool));
686         }
687
688         if (ts_params->op_mpool != NULL) {
689                 RTE_LOG(DEBUG, USER1, "CRYPTO_OP_POOL count %u\n",
690                 rte_mempool_avail_count(ts_params->op_mpool));
691         }
692
693         /* Free session mempools */
694         if (ts_params->session_priv_mpool != NULL) {
695                 rte_mempool_free(ts_params->session_priv_mpool);
696                 ts_params->session_priv_mpool = NULL;
697         }
698
699         if (ts_params->session_mpool != NULL) {
700                 rte_mempool_free(ts_params->session_mpool);
701                 ts_params->session_mpool = NULL;
702         }
703
704         res = rte_cryptodev_close(ts_params->valid_devs[0]);
705         if (res)
706                 RTE_LOG(ERR, USER1, "Crypto device close error %d\n", res);
707 }
708
709 static int
710 check_capabilities_supported(enum rte_crypto_sym_xform_type type,
711                 const int *algs, uint16_t num_algs)
712 {
713         uint8_t dev_id = testsuite_params.valid_devs[0];
714         bool some_alg_supported = FALSE;
715         uint16_t i;
716
717         for (i = 0; i < num_algs && !some_alg_supported; i++) {
718                 struct rte_cryptodev_sym_capability_idx alg = {
719                         type, {algs[i]}
720                 };
721                 if (rte_cryptodev_sym_capability_get(dev_id,
722                                 &alg) != NULL)
723                         some_alg_supported = TRUE;
724         }
725         if (!some_alg_supported)
726                 return TEST_SKIPPED;
727
728         return 0;
729 }
730
731 int
732 check_cipher_capabilities_supported(const enum rte_crypto_cipher_algorithm *ciphers,
733                 uint16_t num_ciphers)
734 {
735         return check_capabilities_supported(RTE_CRYPTO_SYM_XFORM_CIPHER,
736                         (const int *) ciphers, num_ciphers);
737 }
738
739 int
740 check_auth_capabilities_supported(const enum rte_crypto_auth_algorithm *auths,
741                 uint16_t num_auths)
742 {
743         return check_capabilities_supported(RTE_CRYPTO_SYM_XFORM_AUTH,
744                         (const int *) auths, num_auths);
745 }
746
747 int
748 check_aead_capabilities_supported(const enum rte_crypto_aead_algorithm *aeads,
749                 uint16_t num_aeads)
750 {
751         return check_capabilities_supported(RTE_CRYPTO_SYM_XFORM_AEAD,
752                         (const int *) aeads, num_aeads);
753 }
754
755 static int
756 null_testsuite_setup(void)
757 {
758         struct crypto_testsuite_params *ts_params = &testsuite_params;
759         uint8_t dev_id = ts_params->valid_devs[0];
760         struct rte_cryptodev_info dev_info;
761         const enum rte_crypto_cipher_algorithm ciphers[] = {
762                 RTE_CRYPTO_CIPHER_NULL
763         };
764         const enum rte_crypto_auth_algorithm auths[] = {
765                 RTE_CRYPTO_AUTH_NULL
766         };
767
768         rte_cryptodev_info_get(dev_id, &dev_info);
769
770         if (!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYMMETRIC_CRYPTO)) {
771                 RTE_LOG(INFO, USER1, "Feature flag requirements for NULL "
772                                 "testsuite not met\n");
773                 return TEST_SKIPPED;
774         }
775
776         if (check_cipher_capabilities_supported(ciphers, RTE_DIM(ciphers)) != 0
777                         && check_auth_capabilities_supported(auths,
778                         RTE_DIM(auths)) != 0) {
779                 RTE_LOG(INFO, USER1, "Capability requirements for NULL "
780                                 "testsuite not met\n");
781                 return TEST_SKIPPED;
782         }
783
784         return 0;
785 }
786
787 static int
788 crypto_gen_testsuite_setup(void)
789 {
790         struct crypto_testsuite_params *ts_params = &testsuite_params;
791         uint8_t dev_id = ts_params->valid_devs[0];
792         struct rte_cryptodev_info dev_info;
793
794         rte_cryptodev_info_get(dev_id, &dev_info);
795
796         if (!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYMMETRIC_CRYPTO)) {
797                 RTE_LOG(INFO, USER1, "Feature flag requirements for Crypto Gen "
798                                 "testsuite not met\n");
799                 return TEST_SKIPPED;
800         }
801
802         return 0;
803 }
804
805 #ifdef RTE_LIB_SECURITY
806 static int
807 ipsec_proto_testsuite_setup(void)
808 {
809         struct crypto_testsuite_params *ts_params = &testsuite_params;
810         struct crypto_unittest_params *ut_params = &unittest_params;
811         struct rte_cryptodev_info dev_info;
812         int ret = 0;
813
814         rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
815
816         if (!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SECURITY)) {
817                 RTE_LOG(INFO, USER1, "Feature flag requirements for IPsec Proto "
818                                 "testsuite not met\n");
819                 return TEST_SKIPPED;
820         }
821
822         /* Reconfigure to enable security */
823         ret = dev_configure_and_start(0);
824         if (ret != TEST_SUCCESS)
825                 return ret;
826
827         /* Set action type */
828         ut_params->type = RTE_SECURITY_ACTION_TYPE_LOOKASIDE_PROTOCOL;
829
830         if (security_proto_supported(
831                         RTE_SECURITY_ACTION_TYPE_LOOKASIDE_PROTOCOL,
832                         RTE_SECURITY_PROTOCOL_IPSEC) < 0) {
833                 RTE_LOG(INFO, USER1, "Capability requirements for IPsec Proto "
834                                 "test not met\n");
835                 ret = TEST_SKIPPED;
836         }
837
838         test_ipsec_alg_list_populate();
839
840         /*
841          * Stop the device. Device would be started again by individual test
842          * case setup routine.
843          */
844         rte_cryptodev_stop(ts_params->valid_devs[0]);
845
846         return ret;
847 }
848
849 static int
850 pdcp_proto_testsuite_setup(void)
851 {
852         struct crypto_testsuite_params *ts_params = &testsuite_params;
853         uint8_t dev_id = ts_params->valid_devs[0];
854         struct rte_cryptodev_info dev_info;
855         const enum rte_crypto_cipher_algorithm ciphers[] = {
856                 RTE_CRYPTO_CIPHER_NULL,
857                 RTE_CRYPTO_CIPHER_AES_CTR,
858                 RTE_CRYPTO_CIPHER_ZUC_EEA3,
859                 RTE_CRYPTO_CIPHER_SNOW3G_UEA2
860         };
861         const enum rte_crypto_auth_algorithm auths[] = {
862                 RTE_CRYPTO_AUTH_NULL,
863                 RTE_CRYPTO_AUTH_SNOW3G_UIA2,
864                 RTE_CRYPTO_AUTH_AES_CMAC,
865                 RTE_CRYPTO_AUTH_ZUC_EIA3
866         };
867
868         rte_cryptodev_info_get(dev_id, &dev_info);
869
870         if (!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYMMETRIC_CRYPTO) ||
871                         !(dev_info.feature_flags &
872                         RTE_CRYPTODEV_FF_SECURITY)) {
873                 RTE_LOG(INFO, USER1, "Feature flag requirements for PDCP Proto "
874                                 "testsuite not met\n");
875                 return TEST_SKIPPED;
876         }
877
878         if (check_cipher_capabilities_supported(ciphers, RTE_DIM(ciphers)) != 0
879                         && check_auth_capabilities_supported(auths,
880                         RTE_DIM(auths)) != 0) {
881                 RTE_LOG(INFO, USER1, "Capability requirements for PDCP Proto "
882                                 "testsuite not met\n");
883                 return TEST_SKIPPED;
884         }
885
886         return 0;
887 }
888
889 static int
890 docsis_proto_testsuite_setup(void)
891 {
892         struct crypto_testsuite_params *ts_params = &testsuite_params;
893         uint8_t dev_id = ts_params->valid_devs[0];
894         struct rte_cryptodev_info dev_info;
895         const enum rte_crypto_cipher_algorithm ciphers[] = {
896                 RTE_CRYPTO_CIPHER_AES_DOCSISBPI
897         };
898
899         rte_cryptodev_info_get(dev_id, &dev_info);
900
901         if (!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYMMETRIC_CRYPTO) ||
902                         !(dev_info.feature_flags &
903                         RTE_CRYPTODEV_FF_SECURITY)) {
904                 RTE_LOG(INFO, USER1, "Feature flag requirements for DOCSIS "
905                                 "Proto testsuite not met\n");
906                 return TEST_SKIPPED;
907         }
908
909         if (check_cipher_capabilities_supported(ciphers, RTE_DIM(ciphers)) != 0) {
910                 RTE_LOG(INFO, USER1, "Capability requirements for DOCSIS Proto "
911                                 "testsuite not met\n");
912                 return TEST_SKIPPED;
913         }
914
915         return 0;
916 }
917 #endif
918
919 static int
920 aes_ccm_auth_testsuite_setup(void)
921 {
922         struct crypto_testsuite_params *ts_params = &testsuite_params;
923         uint8_t dev_id = ts_params->valid_devs[0];
924         struct rte_cryptodev_info dev_info;
925         const enum rte_crypto_aead_algorithm aeads[] = {
926                 RTE_CRYPTO_AEAD_AES_CCM
927         };
928
929         rte_cryptodev_info_get(dev_id, &dev_info);
930
931         if (!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYMMETRIC_CRYPTO) ||
932                         ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
933                         !(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
934                 RTE_LOG(INFO, USER1, "Feature flag requirements for AES CCM "
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 CCM "
941                                 "testsuite not met\n");
942                 return TEST_SKIPPED;
943         }
944
945         return 0;
946 }
947
948 static int
949 aes_gcm_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_aead_algorithm aeads[] = {
955                 RTE_CRYPTO_AEAD_AES_GCM
956         };
957
958         rte_cryptodev_info_get(dev_id, &dev_info);
959
960         if (!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYMMETRIC_CRYPTO)) {
961                 RTE_LOG(INFO, USER1, "Feature flag requirements for AES GCM "
962                                 "testsuite not met\n");
963                 return TEST_SKIPPED;
964         }
965
966         if (check_aead_capabilities_supported(aeads, RTE_DIM(aeads)) != 0) {
967                 RTE_LOG(INFO, USER1, "Capability requirements for AES GCM "
968                                 "testsuite not met\n");
969                 return TEST_SKIPPED;
970         }
971
972         return 0;
973 }
974
975 static int
976 aes_gmac_auth_testsuite_setup(void)
977 {
978         struct crypto_testsuite_params *ts_params = &testsuite_params;
979         uint8_t dev_id = ts_params->valid_devs[0];
980         struct rte_cryptodev_info dev_info;
981         const enum rte_crypto_auth_algorithm auths[] = {
982                 RTE_CRYPTO_AUTH_AES_GMAC
983         };
984
985         rte_cryptodev_info_get(dev_id, &dev_info);
986
987         if (!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYMMETRIC_CRYPTO) ||
988                         ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
989                         !(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
990                 RTE_LOG(INFO, USER1, "Feature flag requirements for AES GMAC "
991                                 "testsuite not met\n");
992                 return TEST_SKIPPED;
993         }
994
995         if (check_auth_capabilities_supported(auths, RTE_DIM(auths)) != 0) {
996                 RTE_LOG(INFO, USER1, "Capability requirements for AES GMAC "
997                                 "testsuite not met\n");
998                 return TEST_SKIPPED;
999         }
1000
1001         return 0;
1002 }
1003
1004 static int
1005 chacha20_poly1305_testsuite_setup(void)
1006 {
1007         struct crypto_testsuite_params *ts_params = &testsuite_params;
1008         uint8_t dev_id = ts_params->valid_devs[0];
1009         struct rte_cryptodev_info dev_info;
1010         const enum rte_crypto_aead_algorithm aeads[] = {
1011                 RTE_CRYPTO_AEAD_CHACHA20_POLY1305
1012         };
1013
1014         rte_cryptodev_info_get(dev_id, &dev_info);
1015
1016         if (!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYMMETRIC_CRYPTO) ||
1017                         ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
1018                         !(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
1019                 RTE_LOG(INFO, USER1, "Feature flag requirements for "
1020                                 "Chacha20-Poly1305 testsuite not met\n");
1021                 return TEST_SKIPPED;
1022         }
1023
1024         if (check_aead_capabilities_supported(aeads, RTE_DIM(aeads)) != 0) {
1025                 RTE_LOG(INFO, USER1, "Capability requirements for "
1026                                 "Chacha20-Poly1305 testsuite not met\n");
1027                 return TEST_SKIPPED;
1028         }
1029
1030         return 0;
1031 }
1032
1033 static int
1034 snow3g_testsuite_setup(void)
1035 {
1036         struct crypto_testsuite_params *ts_params = &testsuite_params;
1037         uint8_t dev_id = ts_params->valid_devs[0];
1038         struct rte_cryptodev_info dev_info;
1039         const enum rte_crypto_cipher_algorithm ciphers[] = {
1040                 RTE_CRYPTO_CIPHER_SNOW3G_UEA2
1041
1042         };
1043         const enum rte_crypto_auth_algorithm auths[] = {
1044                 RTE_CRYPTO_AUTH_SNOW3G_UIA2
1045         };
1046
1047         rte_cryptodev_info_get(dev_id, &dev_info);
1048
1049         if (!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYMMETRIC_CRYPTO)) {
1050                 RTE_LOG(INFO, USER1, "Feature flag requirements for Snow3G "
1051                                 "testsuite not met\n");
1052                 return TEST_SKIPPED;
1053         }
1054
1055         if (check_cipher_capabilities_supported(ciphers, RTE_DIM(ciphers)) != 0
1056                         && check_auth_capabilities_supported(auths,
1057                         RTE_DIM(auths)) != 0) {
1058                 RTE_LOG(INFO, USER1, "Capability requirements for Snow3G "
1059                                 "testsuite not met\n");
1060                 return TEST_SKIPPED;
1061         }
1062
1063         return 0;
1064 }
1065
1066 static int
1067 zuc_testsuite_setup(void)
1068 {
1069         struct crypto_testsuite_params *ts_params = &testsuite_params;
1070         uint8_t dev_id = ts_params->valid_devs[0];
1071         struct rte_cryptodev_info dev_info;
1072         const enum rte_crypto_cipher_algorithm ciphers[] = {
1073                 RTE_CRYPTO_CIPHER_ZUC_EEA3
1074         };
1075         const enum rte_crypto_auth_algorithm auths[] = {
1076                 RTE_CRYPTO_AUTH_ZUC_EIA3
1077         };
1078
1079         rte_cryptodev_info_get(dev_id, &dev_info);
1080
1081         if (!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYMMETRIC_CRYPTO)) {
1082                 RTE_LOG(INFO, USER1, "Feature flag requirements for ZUC "
1083                                 "testsuite not met\n");
1084                 return TEST_SKIPPED;
1085         }
1086
1087         if (check_cipher_capabilities_supported(ciphers, RTE_DIM(ciphers)) != 0
1088                         && check_auth_capabilities_supported(auths,
1089                         RTE_DIM(auths)) != 0) {
1090                 RTE_LOG(INFO, USER1, "Capability requirements for ZUC "
1091                                 "testsuite not met\n");
1092                 return TEST_SKIPPED;
1093         }
1094
1095         return 0;
1096 }
1097
1098 static int
1099 hmac_md5_auth_testsuite_setup(void)
1100 {
1101         struct crypto_testsuite_params *ts_params = &testsuite_params;
1102         uint8_t dev_id = ts_params->valid_devs[0];
1103         struct rte_cryptodev_info dev_info;
1104         const enum rte_crypto_auth_algorithm auths[] = {
1105                 RTE_CRYPTO_AUTH_MD5_HMAC
1106         };
1107
1108         rte_cryptodev_info_get(dev_id, &dev_info);
1109
1110         if (!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYMMETRIC_CRYPTO) ||
1111                         ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
1112                         !(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
1113                 RTE_LOG(INFO, USER1, "Feature flag requirements for HMAC MD5 "
1114                                 "Auth testsuite not met\n");
1115                 return TEST_SKIPPED;
1116         }
1117
1118         if (check_auth_capabilities_supported(auths, RTE_DIM(auths)) != 0) {
1119                 RTE_LOG(INFO, USER1, "Capability requirements for HMAC MD5 "
1120                                 "testsuite not met\n");
1121                 return TEST_SKIPPED;
1122         }
1123
1124         return 0;
1125 }
1126
1127 static int
1128 kasumi_testsuite_setup(void)
1129 {
1130         struct crypto_testsuite_params *ts_params = &testsuite_params;
1131         uint8_t dev_id = ts_params->valid_devs[0];
1132         struct rte_cryptodev_info dev_info;
1133         const enum rte_crypto_cipher_algorithm ciphers[] = {
1134                 RTE_CRYPTO_CIPHER_KASUMI_F8
1135         };
1136         const enum rte_crypto_auth_algorithm auths[] = {
1137                 RTE_CRYPTO_AUTH_KASUMI_F9
1138         };
1139
1140         rte_cryptodev_info_get(dev_id, &dev_info);
1141
1142         if (!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYMMETRIC_CRYPTO) ||
1143                         ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
1144                         !(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
1145                 RTE_LOG(INFO, USER1, "Feature flag requirements for Kasumi "
1146                                 "testsuite not met\n");
1147                 return TEST_SKIPPED;
1148         }
1149
1150         if (check_cipher_capabilities_supported(ciphers, RTE_DIM(ciphers)) != 0
1151                         && check_auth_capabilities_supported(auths,
1152                         RTE_DIM(auths)) != 0) {
1153                 RTE_LOG(INFO, USER1, "Capability requirements for Kasumi "
1154                                 "testsuite not met\n");
1155                 return TEST_SKIPPED;
1156         }
1157
1158         return 0;
1159 }
1160
1161 static int
1162 negative_aes_gcm_testsuite_setup(void)
1163 {
1164         struct crypto_testsuite_params *ts_params = &testsuite_params;
1165         uint8_t dev_id = ts_params->valid_devs[0];
1166         struct rte_cryptodev_info dev_info;
1167         const enum rte_crypto_aead_algorithm aeads[] = {
1168                 RTE_CRYPTO_AEAD_AES_GCM
1169         };
1170
1171         rte_cryptodev_info_get(dev_id, &dev_info);
1172
1173         if (!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYMMETRIC_CRYPTO) ||
1174                         ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
1175                         !(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
1176                 RTE_LOG(INFO, USER1, "Feature flag requirements for Negative "
1177                                 "AES GCM testsuite not met\n");
1178                 return TEST_SKIPPED;
1179         }
1180
1181         if (check_aead_capabilities_supported(aeads, RTE_DIM(aeads)) != 0) {
1182                 RTE_LOG(INFO, USER1, "Capability requirements for Negative "
1183                                 "AES GCM testsuite not met\n");
1184                 return TEST_SKIPPED;
1185         }
1186
1187         return 0;
1188 }
1189
1190 static int
1191 negative_aes_gmac_testsuite_setup(void)
1192 {
1193         struct crypto_testsuite_params *ts_params = &testsuite_params;
1194         uint8_t dev_id = ts_params->valid_devs[0];
1195         struct rte_cryptodev_info dev_info;
1196         const enum rte_crypto_auth_algorithm auths[] = {
1197                 RTE_CRYPTO_AUTH_AES_GMAC
1198         };
1199
1200         rte_cryptodev_info_get(dev_id, &dev_info);
1201
1202         if (!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYMMETRIC_CRYPTO) ||
1203                         ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
1204                         !(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
1205                 RTE_LOG(INFO, USER1, "Feature flag requirements for Negative "
1206                                 "AES GMAC testsuite not met\n");
1207                 return TEST_SKIPPED;
1208         }
1209
1210         if (check_auth_capabilities_supported(auths, RTE_DIM(auths)) != 0) {
1211                 RTE_LOG(INFO, USER1, "Capability requirements for Negative "
1212                                 "AES GMAC testsuite not met\n");
1213                 return TEST_SKIPPED;
1214         }
1215
1216         return 0;
1217 }
1218
1219 static int
1220 mixed_cipher_hash_testsuite_setup(void)
1221 {
1222         struct crypto_testsuite_params *ts_params = &testsuite_params;
1223         uint8_t dev_id = ts_params->valid_devs[0];
1224         struct rte_cryptodev_info dev_info;
1225         uint64_t feat_flags;
1226         const enum rte_crypto_cipher_algorithm ciphers[] = {
1227                 RTE_CRYPTO_CIPHER_NULL,
1228                 RTE_CRYPTO_CIPHER_AES_CTR,
1229                 RTE_CRYPTO_CIPHER_ZUC_EEA3,
1230                 RTE_CRYPTO_CIPHER_SNOW3G_UEA2
1231         };
1232         const enum rte_crypto_auth_algorithm auths[] = {
1233                 RTE_CRYPTO_AUTH_NULL,
1234                 RTE_CRYPTO_AUTH_SNOW3G_UIA2,
1235                 RTE_CRYPTO_AUTH_AES_CMAC,
1236                 RTE_CRYPTO_AUTH_ZUC_EIA3
1237         };
1238
1239         rte_cryptodev_info_get(dev_id, &dev_info);
1240         feat_flags = dev_info.feature_flags;
1241
1242         if (!(feat_flags & RTE_CRYPTODEV_FF_SYMMETRIC_CRYPTO) ||
1243                         (global_api_test_type == CRYPTODEV_RAW_API_TEST)) {
1244                 RTE_LOG(INFO, USER1, "Feature flag requirements for Mixed "
1245                                 "Cipher Hash testsuite not met\n");
1246                 return TEST_SKIPPED;
1247         }
1248
1249         if (check_cipher_capabilities_supported(ciphers, RTE_DIM(ciphers)) != 0
1250                         && check_auth_capabilities_supported(auths,
1251                         RTE_DIM(auths)) != 0) {
1252                 RTE_LOG(INFO, USER1, "Capability requirements for Mixed "
1253                                 "Cipher Hash testsuite not met\n");
1254                 return TEST_SKIPPED;
1255         }
1256
1257         return 0;
1258 }
1259
1260 static int
1261 esn_testsuite_setup(void)
1262 {
1263         struct crypto_testsuite_params *ts_params = &testsuite_params;
1264         uint8_t dev_id = ts_params->valid_devs[0];
1265         struct rte_cryptodev_info dev_info;
1266         const enum rte_crypto_cipher_algorithm ciphers[] = {
1267                 RTE_CRYPTO_CIPHER_AES_CBC
1268         };
1269         const enum rte_crypto_auth_algorithm auths[] = {
1270                 RTE_CRYPTO_AUTH_SHA1_HMAC
1271         };
1272
1273         rte_cryptodev_info_get(dev_id, &dev_info);
1274
1275         if (!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYMMETRIC_CRYPTO) ||
1276                         ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
1277                         !(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
1278                 RTE_LOG(INFO, USER1, "Feature flag requirements for ESN "
1279                                 "testsuite not met\n");
1280                 return TEST_SKIPPED;
1281         }
1282
1283         if (check_cipher_capabilities_supported(ciphers, RTE_DIM(ciphers)) != 0
1284                         && check_auth_capabilities_supported(auths,
1285                         RTE_DIM(auths)) != 0) {
1286                 RTE_LOG(INFO, USER1, "Capability requirements for ESN "
1287                                 "testsuite not met\n");
1288                 return TEST_SKIPPED;
1289         }
1290
1291         return 0;
1292 }
1293
1294 static int
1295 multi_session_testsuite_setup(void)
1296 {
1297         struct crypto_testsuite_params *ts_params = &testsuite_params;
1298         uint8_t dev_id = ts_params->valid_devs[0];
1299         struct rte_cryptodev_info dev_info;
1300         const enum rte_crypto_cipher_algorithm ciphers[] = {
1301                 RTE_CRYPTO_CIPHER_AES_CBC
1302         };
1303         const enum rte_crypto_auth_algorithm auths[] = {
1304                 RTE_CRYPTO_AUTH_SHA512_HMAC
1305         };
1306
1307         rte_cryptodev_info_get(dev_id, &dev_info);
1308
1309         if (!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYMMETRIC_CRYPTO)) {
1310                 RTE_LOG(INFO, USER1, "Feature flag requirements for Multi "
1311                                 "Session testsuite not met\n");
1312                 return TEST_SKIPPED;
1313         }
1314
1315         if (check_cipher_capabilities_supported(ciphers, RTE_DIM(ciphers)) != 0
1316                         && check_auth_capabilities_supported(auths,
1317                         RTE_DIM(auths)) != 0) {
1318                 RTE_LOG(INFO, USER1, "Capability requirements for Multi "
1319                                 "Session testsuite not met\n");
1320                 return TEST_SKIPPED;
1321         }
1322
1323         return 0;
1324 }
1325
1326 static int
1327 negative_hmac_sha1_testsuite_setup(void)
1328 {
1329         struct crypto_testsuite_params *ts_params = &testsuite_params;
1330         uint8_t dev_id = ts_params->valid_devs[0];
1331         struct rte_cryptodev_info dev_info;
1332         const enum rte_crypto_cipher_algorithm ciphers[] = {
1333                 RTE_CRYPTO_CIPHER_AES_CBC
1334         };
1335         const enum rte_crypto_auth_algorithm auths[] = {
1336                 RTE_CRYPTO_AUTH_SHA1_HMAC
1337         };
1338
1339         rte_cryptodev_info_get(dev_id, &dev_info);
1340
1341         if (!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYMMETRIC_CRYPTO) ||
1342                         ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
1343                         !(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
1344                 RTE_LOG(INFO, USER1, "Feature flag requirements for Negative "
1345                                 "HMAC SHA1 testsuite not met\n");
1346                 return TEST_SKIPPED;
1347         }
1348
1349         if (check_cipher_capabilities_supported(ciphers, RTE_DIM(ciphers)) != 0
1350                         && check_auth_capabilities_supported(auths,
1351                         RTE_DIM(auths)) != 0) {
1352                 RTE_LOG(INFO, USER1, "Capability requirements for Negative "
1353                                 "HMAC SHA1 testsuite not met\n");
1354                 return TEST_SKIPPED;
1355         }
1356
1357         return 0;
1358 }
1359
1360 static int
1361 dev_configure_and_start(uint64_t ff_disable)
1362 {
1363         struct crypto_testsuite_params *ts_params = &testsuite_params;
1364         struct crypto_unittest_params *ut_params = &unittest_params;
1365
1366         uint16_t qp_id;
1367
1368         /* Clear unit test parameters before running test */
1369         memset(ut_params, 0, sizeof(*ut_params));
1370
1371         /* Reconfigure device to default parameters */
1372         ts_params->conf.socket_id = SOCKET_ID_ANY;
1373         ts_params->conf.ff_disable = ff_disable;
1374         ts_params->qp_conf.nb_descriptors = MAX_NUM_OPS_INFLIGHT;
1375         ts_params->qp_conf.mp_session = ts_params->session_mpool;
1376         ts_params->qp_conf.mp_session_private = ts_params->session_priv_mpool;
1377
1378         TEST_ASSERT_SUCCESS(rte_cryptodev_configure(ts_params->valid_devs[0],
1379                         &ts_params->conf),
1380                         "Failed to configure cryptodev %u",
1381                         ts_params->valid_devs[0]);
1382
1383         for (qp_id = 0; qp_id < ts_params->conf.nb_queue_pairs ; qp_id++) {
1384                 TEST_ASSERT_SUCCESS(rte_cryptodev_queue_pair_setup(
1385                         ts_params->valid_devs[0], qp_id,
1386                         &ts_params->qp_conf,
1387                         rte_cryptodev_socket_id(ts_params->valid_devs[0])),
1388                         "Failed to setup queue pair %u on cryptodev %u",
1389                         qp_id, ts_params->valid_devs[0]);
1390         }
1391
1392
1393         rte_cryptodev_stats_reset(ts_params->valid_devs[0]);
1394
1395         /* Start the device */
1396         TEST_ASSERT_SUCCESS(rte_cryptodev_start(ts_params->valid_devs[0]),
1397                         "Failed to start cryptodev %u",
1398                         ts_params->valid_devs[0]);
1399
1400         return TEST_SUCCESS;
1401 }
1402
1403 int
1404 ut_setup(void)
1405 {
1406         /* Configure and start the device with security feature disabled */
1407         return dev_configure_and_start(RTE_CRYPTODEV_FF_SECURITY);
1408 }
1409
1410 static int
1411 ut_setup_security(void)
1412 {
1413         /* Configure and start the device with no features disabled */
1414         return dev_configure_and_start(0);
1415 }
1416
1417 void
1418 ut_teardown(void)
1419 {
1420         struct crypto_testsuite_params *ts_params = &testsuite_params;
1421         struct crypto_unittest_params *ut_params = &unittest_params;
1422
1423         /* free crypto session structure */
1424 #ifdef RTE_LIB_SECURITY
1425         if (ut_params->type == RTE_SECURITY_ACTION_TYPE_LOOKASIDE_PROTOCOL) {
1426                 if (ut_params->sec_session) {
1427                         rte_security_session_destroy(rte_cryptodev_get_sec_ctx
1428                                                 (ts_params->valid_devs[0]),
1429                                                 ut_params->sec_session);
1430                         ut_params->sec_session = NULL;
1431                 }
1432         } else
1433 #endif
1434         {
1435                 if (ut_params->sess) {
1436                         rte_cryptodev_sym_session_clear(
1437                                         ts_params->valid_devs[0],
1438                                         ut_params->sess);
1439                         rte_cryptodev_sym_session_free(ut_params->sess);
1440                         ut_params->sess = NULL;
1441                 }
1442         }
1443
1444         /* free crypto operation structure */
1445         if (ut_params->op)
1446                 rte_crypto_op_free(ut_params->op);
1447
1448         /*
1449          * free mbuf - both obuf and ibuf are usually the same,
1450          * so check if they point at the same address is necessary,
1451          * to avoid freeing the mbuf twice.
1452          */
1453         if (ut_params->obuf) {
1454                 rte_pktmbuf_free(ut_params->obuf);
1455                 if (ut_params->ibuf == ut_params->obuf)
1456                         ut_params->ibuf = 0;
1457                 ut_params->obuf = 0;
1458         }
1459         if (ut_params->ibuf) {
1460                 rte_pktmbuf_free(ut_params->ibuf);
1461                 ut_params->ibuf = 0;
1462         }
1463
1464         if (ts_params->mbuf_pool != NULL)
1465                 RTE_LOG(DEBUG, USER1, "CRYPTO_MBUFPOOL count %u\n",
1466                         rte_mempool_avail_count(ts_params->mbuf_pool));
1467
1468         /* Stop the device */
1469         rte_cryptodev_stop(ts_params->valid_devs[0]);
1470 }
1471
1472 static int
1473 test_device_configure_invalid_dev_id(void)
1474 {
1475         struct crypto_testsuite_params *ts_params = &testsuite_params;
1476         uint16_t dev_id, num_devs = 0;
1477
1478         TEST_ASSERT((num_devs = rte_cryptodev_count()) >= 1,
1479                         "Need at least %d devices for test", 1);
1480
1481         /* valid dev_id values */
1482         dev_id = ts_params->valid_devs[0];
1483
1484         /* Stop the device in case it's started so it can be configured */
1485         rte_cryptodev_stop(dev_id);
1486
1487         TEST_ASSERT_SUCCESS(rte_cryptodev_configure(dev_id, &ts_params->conf),
1488                         "Failed test for rte_cryptodev_configure: "
1489                         "invalid dev_num %u", dev_id);
1490
1491         /* invalid dev_id values */
1492         dev_id = num_devs;
1493
1494         TEST_ASSERT_FAIL(rte_cryptodev_configure(dev_id, &ts_params->conf),
1495                         "Failed test for rte_cryptodev_configure: "
1496                         "invalid dev_num %u", dev_id);
1497
1498         dev_id = 0xff;
1499
1500         TEST_ASSERT_FAIL(rte_cryptodev_configure(dev_id, &ts_params->conf),
1501                         "Failed test for rte_cryptodev_configure:"
1502                         "invalid dev_num %u", dev_id);
1503
1504         return TEST_SUCCESS;
1505 }
1506
1507 static int
1508 test_device_configure_invalid_queue_pair_ids(void)
1509 {
1510         struct crypto_testsuite_params *ts_params = &testsuite_params;
1511         uint16_t orig_nb_qps = ts_params->conf.nb_queue_pairs;
1512
1513         /* Stop the device in case it's started so it can be configured */
1514         rte_cryptodev_stop(ts_params->valid_devs[0]);
1515
1516         /* valid - max value queue pairs */
1517         ts_params->conf.nb_queue_pairs = orig_nb_qps;
1518
1519         TEST_ASSERT_SUCCESS(rte_cryptodev_configure(ts_params->valid_devs[0],
1520                         &ts_params->conf),
1521                         "Failed to configure cryptodev: dev_id %u, qp_id %u",
1522                         ts_params->valid_devs[0], ts_params->conf.nb_queue_pairs);
1523
1524         /* valid - one queue pairs */
1525         ts_params->conf.nb_queue_pairs = 1;
1526
1527         TEST_ASSERT_SUCCESS(rte_cryptodev_configure(ts_params->valid_devs[0],
1528                         &ts_params->conf),
1529                         "Failed to configure cryptodev: dev_id %u, qp_id %u",
1530                         ts_params->valid_devs[0],
1531                         ts_params->conf.nb_queue_pairs);
1532
1533
1534         /* invalid - zero queue pairs */
1535         ts_params->conf.nb_queue_pairs = 0;
1536
1537         TEST_ASSERT_FAIL(rte_cryptodev_configure(ts_params->valid_devs[0],
1538                         &ts_params->conf),
1539                         "Failed test for rte_cryptodev_configure, dev_id %u,"
1540                         " invalid qps: %u",
1541                         ts_params->valid_devs[0],
1542                         ts_params->conf.nb_queue_pairs);
1543
1544
1545         /* invalid - max value supported by field queue pairs */
1546         ts_params->conf.nb_queue_pairs = UINT16_MAX;
1547
1548         TEST_ASSERT_FAIL(rte_cryptodev_configure(ts_params->valid_devs[0],
1549                         &ts_params->conf),
1550                         "Failed test for rte_cryptodev_configure, dev_id %u,"
1551                         " invalid qps: %u",
1552                         ts_params->valid_devs[0],
1553                         ts_params->conf.nb_queue_pairs);
1554
1555
1556         /* invalid - max value + 1 queue pairs */
1557         ts_params->conf.nb_queue_pairs = orig_nb_qps + 1;
1558
1559         TEST_ASSERT_FAIL(rte_cryptodev_configure(ts_params->valid_devs[0],
1560                         &ts_params->conf),
1561                         "Failed test for rte_cryptodev_configure, dev_id %u,"
1562                         " invalid qps: %u",
1563                         ts_params->valid_devs[0],
1564                         ts_params->conf.nb_queue_pairs);
1565
1566         /* revert to original testsuite value */
1567         ts_params->conf.nb_queue_pairs = orig_nb_qps;
1568
1569         return TEST_SUCCESS;
1570 }
1571
1572 static int
1573 test_queue_pair_descriptor_setup(void)
1574 {
1575         struct crypto_testsuite_params *ts_params = &testsuite_params;
1576         struct rte_cryptodev_qp_conf qp_conf = {
1577                 .nb_descriptors = MAX_NUM_OPS_INFLIGHT
1578         };
1579         uint16_t qp_id;
1580
1581         /* Stop the device in case it's started so it can be configured */
1582         rte_cryptodev_stop(ts_params->valid_devs[0]);
1583
1584         TEST_ASSERT_SUCCESS(rte_cryptodev_configure(ts_params->valid_devs[0],
1585                         &ts_params->conf),
1586                         "Failed to configure cryptodev %u",
1587                         ts_params->valid_devs[0]);
1588
1589         /*
1590          * Test various ring sizes on this device. memzones can't be
1591          * freed so are re-used if ring is released and re-created.
1592          */
1593         qp_conf.nb_descriptors = MIN_NUM_OPS_INFLIGHT; /* min size*/
1594         qp_conf.mp_session = ts_params->session_mpool;
1595         qp_conf.mp_session_private = ts_params->session_priv_mpool;
1596
1597         for (qp_id = 0; qp_id < ts_params->conf.nb_queue_pairs; qp_id++) {
1598                 TEST_ASSERT_SUCCESS(rte_cryptodev_queue_pair_setup(
1599                                 ts_params->valid_devs[0], qp_id, &qp_conf,
1600                                 rte_cryptodev_socket_id(
1601                                                 ts_params->valid_devs[0])),
1602                                 "Failed test for "
1603                                 "rte_cryptodev_queue_pair_setup: num_inflights "
1604                                 "%u on qp %u on cryptodev %u",
1605                                 qp_conf.nb_descriptors, qp_id,
1606                                 ts_params->valid_devs[0]);
1607         }
1608
1609         qp_conf.nb_descriptors = (uint32_t)(MAX_NUM_OPS_INFLIGHT / 2);
1610
1611         for (qp_id = 0; qp_id < ts_params->conf.nb_queue_pairs; qp_id++) {
1612                 TEST_ASSERT_SUCCESS(rte_cryptodev_queue_pair_setup(
1613                                 ts_params->valid_devs[0], qp_id, &qp_conf,
1614                                 rte_cryptodev_socket_id(
1615                                                 ts_params->valid_devs[0])),
1616                                 "Failed test for"
1617                                 " rte_cryptodev_queue_pair_setup: num_inflights"
1618                                 " %u on qp %u on cryptodev %u",
1619                                 qp_conf.nb_descriptors, qp_id,
1620                                 ts_params->valid_devs[0]);
1621         }
1622
1623         qp_conf.nb_descriptors = MAX_NUM_OPS_INFLIGHT; /* valid */
1624
1625         for (qp_id = 0; qp_id < ts_params->conf.nb_queue_pairs; qp_id++) {
1626                 TEST_ASSERT_SUCCESS(rte_cryptodev_queue_pair_setup(
1627                                 ts_params->valid_devs[0], qp_id, &qp_conf,
1628                                 rte_cryptodev_socket_id(
1629                                                 ts_params->valid_devs[0])),
1630                                 "Failed test for "
1631                                 "rte_cryptodev_queue_pair_setup: num_inflights"
1632                                 " %u on qp %u on cryptodev %u",
1633                                 qp_conf.nb_descriptors, qp_id,
1634                                 ts_params->valid_devs[0]);
1635         }
1636
1637         qp_conf.nb_descriptors = DEFAULT_NUM_OPS_INFLIGHT;
1638
1639         for (qp_id = 0; qp_id < ts_params->conf.nb_queue_pairs; qp_id++) {
1640                 TEST_ASSERT_SUCCESS(rte_cryptodev_queue_pair_setup(
1641                                 ts_params->valid_devs[0], qp_id, &qp_conf,
1642                                 rte_cryptodev_socket_id(
1643                                                 ts_params->valid_devs[0])),
1644                                 "Failed test for"
1645                                 " rte_cryptodev_queue_pair_setup:"
1646                                 "num_inflights %u on qp %u on cryptodev %u",
1647                                 qp_conf.nb_descriptors, qp_id,
1648                                 ts_params->valid_devs[0]);
1649         }
1650
1651         /* test invalid queue pair id */
1652         qp_conf.nb_descriptors = DEFAULT_NUM_OPS_INFLIGHT;      /*valid */
1653
1654         qp_id = ts_params->conf.nb_queue_pairs;         /*invalid */
1655
1656         TEST_ASSERT_FAIL(rte_cryptodev_queue_pair_setup(
1657                         ts_params->valid_devs[0],
1658                         qp_id, &qp_conf,
1659                         rte_cryptodev_socket_id(ts_params->valid_devs[0])),
1660                         "Failed test for rte_cryptodev_queue_pair_setup:"
1661                         "invalid qp %u on cryptodev %u",
1662                         qp_id, ts_params->valid_devs[0]);
1663
1664         qp_id = 0xffff; /*invalid*/
1665
1666         TEST_ASSERT_FAIL(rte_cryptodev_queue_pair_setup(
1667                         ts_params->valid_devs[0],
1668                         qp_id, &qp_conf,
1669                         rte_cryptodev_socket_id(ts_params->valid_devs[0])),
1670                         "Failed test for rte_cryptodev_queue_pair_setup:"
1671                         "invalid qp %u on cryptodev %u",
1672                         qp_id, ts_params->valid_devs[0]);
1673
1674         return TEST_SUCCESS;
1675 }
1676
1677 /* ***** Plaintext data for tests ***** */
1678
1679 const char catch_22_quote_1[] =
1680                 "There was only one catch and that was Catch-22, which "
1681                 "specified that a concern for one's safety in the face of "
1682                 "dangers that were real and immediate was the process of a "
1683                 "rational mind. Orr was crazy and could be grounded. All he "
1684                 "had to do was ask; and as soon as he did, he would no longer "
1685                 "be crazy and would have to fly more missions. Orr would be "
1686                 "crazy to fly more missions and sane if he didn't, but if he "
1687                 "was sane he had to fly them. If he flew them he was crazy "
1688                 "and didn't have to; but if he didn't want to he was sane and "
1689                 "had to. Yossarian was moved very deeply by the absolute "
1690                 "simplicity of this clause of Catch-22 and let out a "
1691                 "respectful whistle. \"That's some catch, that Catch-22\", he "
1692                 "observed. \"It's the best there is,\" Doc Daneeka agreed.";
1693
1694 const char catch_22_quote[] =
1695                 "What a lousy earth! He wondered how many people were "
1696                 "destitute that same night even in his own prosperous country, "
1697                 "how many homes were shanties, how many husbands were drunk "
1698                 "and wives socked, and how many children were bullied, abused, "
1699                 "or abandoned. How many families hungered for food they could "
1700                 "not afford to buy? How many hearts were broken? How many "
1701                 "suicides would take place that same night, how many people "
1702                 "would go insane? How many cockroaches and landlords would "
1703                 "triumph? How many winners were losers, successes failures, "
1704                 "and rich men poor men? How many wise guys were stupid? How "
1705                 "many happy endings were unhappy endings? How many honest men "
1706                 "were liars, brave men cowards, loyal men traitors, how many "
1707                 "sainted men were corrupt, how many people in positions of "
1708                 "trust had sold their souls to bodyguards, how many had never "
1709                 "had souls? How many straight-and-narrow paths were crooked "
1710                 "paths? How many best families were worst families and how "
1711                 "many good people were bad people? When you added them all up "
1712                 "and then subtracted, you might be left with only the children, "
1713                 "and perhaps with Albert Einstein and an old violinist or "
1714                 "sculptor somewhere.";
1715
1716 #define QUOTE_480_BYTES         (480)
1717 #define QUOTE_512_BYTES         (512)
1718 #define QUOTE_768_BYTES         (768)
1719 #define QUOTE_1024_BYTES        (1024)
1720
1721
1722
1723 /* ***** SHA1 Hash Tests ***** */
1724
1725 #define HMAC_KEY_LENGTH_SHA1    (DIGEST_BYTE_LENGTH_SHA1)
1726
1727 static uint8_t hmac_sha1_key[] = {
1728         0xF8, 0x2A, 0xC7, 0x54, 0xDB, 0x96, 0x18, 0xAA,
1729         0xC3, 0xA1, 0x53, 0xF6, 0x1F, 0x17, 0x60, 0xBD,
1730         0xDE, 0xF4, 0xDE, 0xAD };
1731
1732 /* ***** SHA224 Hash Tests ***** */
1733
1734 #define HMAC_KEY_LENGTH_SHA224  (DIGEST_BYTE_LENGTH_SHA224)
1735
1736
1737 /* ***** AES-CBC Cipher Tests ***** */
1738
1739 #define CIPHER_KEY_LENGTH_AES_CBC       (16)
1740 #define CIPHER_IV_LENGTH_AES_CBC        (CIPHER_KEY_LENGTH_AES_CBC)
1741
1742 static uint8_t aes_cbc_key[] = {
1743         0xE4, 0x23, 0x33, 0x8A, 0x35, 0x64, 0x61, 0xE2,
1744         0x49, 0x03, 0xDD, 0xC6, 0xB8, 0xCA, 0x55, 0x7A };
1745
1746 static uint8_t aes_cbc_iv[] = {
1747         0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
1748         0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f };
1749
1750
1751 /* ***** AES-CBC / HMAC-SHA1 Hash Tests ***** */
1752
1753 static const uint8_t catch_22_quote_2_512_bytes_AES_CBC_ciphertext[] = {
1754         0x8B, 0x4D, 0xDA, 0x1B, 0xCF, 0x04, 0xA0, 0x31,
1755         0xB4, 0xBF, 0xBD, 0x68, 0x43, 0x20, 0x7E, 0x76,
1756         0xB1, 0x96, 0x8B, 0xA2, 0x7C, 0xA2, 0x83, 0x9E,
1757         0x39, 0x5A, 0x2F, 0x7E, 0x92, 0xB4, 0x48, 0x1A,
1758         0x3F, 0x6B, 0x5D, 0xDF, 0x52, 0x85, 0x5F, 0x8E,
1759         0x42, 0x3C, 0xFB, 0xE9, 0x1A, 0x24, 0xD6, 0x08,
1760         0xDD, 0xFD, 0x16, 0xFB, 0xE9, 0x55, 0xEF, 0xF0,
1761         0xA0, 0x8D, 0x13, 0xAB, 0x81, 0xC6, 0x90, 0x01,
1762         0xB5, 0x18, 0x84, 0xB3, 0xF6, 0xE6, 0x11, 0x57,
1763         0xD6, 0x71, 0xC6, 0x3C, 0x3F, 0x2F, 0x33, 0xEE,
1764         0x24, 0x42, 0x6E, 0xAC, 0x0B, 0xCA, 0xEC, 0xF9,
1765         0x84, 0xF8, 0x22, 0xAA, 0x60, 0xF0, 0x32, 0xA9,
1766         0x75, 0x75, 0x3B, 0xCB, 0x70, 0x21, 0x0A, 0x8D,
1767         0x0F, 0xE0, 0xC4, 0x78, 0x2B, 0xF8, 0x97, 0xE3,
1768         0xE4, 0x26, 0x4B, 0x29, 0xDA, 0x88, 0xCD, 0x46,
1769         0xEC, 0xAA, 0xF9, 0x7F, 0xF1, 0x15, 0xEA, 0xC3,
1770         0x87, 0xE6, 0x31, 0xF2, 0xCF, 0xDE, 0x4D, 0x80,
1771         0x70, 0x91, 0x7E, 0x0C, 0xF7, 0x26, 0x3A, 0x92,
1772         0x4F, 0x18, 0x83, 0xC0, 0x8F, 0x59, 0x01, 0xA5,
1773         0x88, 0xD1, 0xDB, 0x26, 0x71, 0x27, 0x16, 0xF5,
1774         0xEE, 0x10, 0x82, 0xAC, 0x68, 0x26, 0x9B, 0xE2,
1775         0x6D, 0xD8, 0x9A, 0x80, 0xDF, 0x04, 0x31, 0xD5,
1776         0xF1, 0x35, 0x5C, 0x3B, 0xDD, 0x9A, 0x65, 0xBA,
1777         0x58, 0x34, 0x85, 0x61, 0x1C, 0x42, 0x10, 0x76,
1778         0x73, 0x02, 0x42, 0xC9, 0x23, 0x18, 0x8E, 0xB4,
1779         0x6F, 0xB4, 0xA3, 0x54, 0x6E, 0x88, 0x3B, 0x62,
1780         0x7C, 0x02, 0x8D, 0x4C, 0x9F, 0xC8, 0x45, 0xF4,
1781         0xC9, 0xDE, 0x4F, 0xEB, 0x22, 0x83, 0x1B, 0xE4,
1782         0x49, 0x37, 0xE4, 0xAD, 0xE7, 0xCD, 0x21, 0x54,
1783         0xBC, 0x1C, 0xC2, 0x04, 0x97, 0xB4, 0x10, 0x61,
1784         0xF0, 0xE4, 0xEF, 0x27, 0x63, 0x3A, 0xDA, 0x91,
1785         0x41, 0x25, 0x62, 0x1C, 0x5C, 0xB6, 0x38, 0x4A,
1786         0x88, 0x71, 0x59, 0x5A, 0x8D, 0xA0, 0x09, 0xAF,
1787         0x72, 0x94, 0xD7, 0x79, 0x5C, 0x60, 0x7C, 0x8F,
1788         0x4C, 0xF5, 0xD9, 0xA1, 0x39, 0x6D, 0x81, 0x28,
1789         0xEF, 0x13, 0x28, 0xDF, 0xF5, 0x3E, 0xF7, 0x8E,
1790         0x09, 0x9C, 0x78, 0x18, 0x79, 0xB8, 0x68, 0xD7,
1791         0xA8, 0x29, 0x62, 0xAD, 0xDE, 0xE1, 0x61, 0x76,
1792         0x1B, 0x05, 0x16, 0xCD, 0xBF, 0x02, 0x8E, 0xA6,
1793         0x43, 0x6E, 0x92, 0x55, 0x4F, 0x60, 0x9C, 0x03,
1794         0xB8, 0x4F, 0xA3, 0x02, 0xAC, 0xA8, 0xA7, 0x0C,
1795         0x1E, 0xB5, 0x6B, 0xF8, 0xC8, 0x4D, 0xDE, 0xD2,
1796         0xB0, 0x29, 0x6E, 0x40, 0xE6, 0xD6, 0xC9, 0xE6,
1797         0xB9, 0x0F, 0xB6, 0x63, 0xF5, 0xAA, 0x2B, 0x96,
1798         0xA7, 0x16, 0xAC, 0x4E, 0x0A, 0x33, 0x1C, 0xA6,
1799         0xE6, 0xBD, 0x8A, 0xCF, 0x40, 0xA9, 0xB2, 0xFA,
1800         0x63, 0x27, 0xFD, 0x9B, 0xD9, 0xFC, 0xD5, 0x87,
1801         0x8D, 0x4C, 0xB6, 0xA4, 0xCB, 0xE7, 0x74, 0x55,
1802         0xF4, 0xFB, 0x41, 0x25, 0xB5, 0x4B, 0x0A, 0x1B,
1803         0xB1, 0xD6, 0xB7, 0xD9, 0x47, 0x2A, 0xC3, 0x98,
1804         0x6A, 0xC4, 0x03, 0x73, 0x1F, 0x93, 0x6E, 0x53,
1805         0x19, 0x25, 0x64, 0x15, 0x83, 0xF9, 0x73, 0x2A,
1806         0x74, 0xB4, 0x93, 0x69, 0xC4, 0x72, 0xFC, 0x26,
1807         0xA2, 0x9F, 0x43, 0x45, 0xDD, 0xB9, 0xEF, 0x36,
1808         0xC8, 0x3A, 0xCD, 0x99, 0x9B, 0x54, 0x1A, 0x36,
1809         0xC1, 0x59, 0xF8, 0x98, 0xA8, 0xCC, 0x28, 0x0D,
1810         0x73, 0x4C, 0xEE, 0x98, 0xCB, 0x7C, 0x58, 0x7E,
1811         0x20, 0x75, 0x1E, 0xB7, 0xC9, 0xF8, 0xF2, 0x0E,
1812         0x63, 0x9E, 0x05, 0x78, 0x1A, 0xB6, 0xA8, 0x7A,
1813         0xF9, 0x98, 0x6A, 0xA6, 0x46, 0x84, 0x2E, 0xF6,
1814         0x4B, 0xDC, 0x9B, 0x8F, 0x9B, 0x8F, 0xEE, 0xB4,
1815         0xAA, 0x3F, 0xEE, 0xC0, 0x37, 0x27, 0x76, 0xC7,
1816         0x95, 0xBB, 0x26, 0x74, 0x69, 0x12, 0x7F, 0xF1,
1817         0xBB, 0xFF, 0xAE, 0xB5, 0x99, 0x6E, 0xCB, 0x0C
1818 };
1819
1820 static const uint8_t catch_22_quote_2_512_bytes_AES_CBC_HMAC_SHA1_digest[] = {
1821         0x9a, 0x4f, 0x88, 0x1b, 0xb6, 0x8f, 0xd8, 0x60,
1822         0x42, 0x1a, 0x7d, 0x3d, 0xf5, 0x82, 0x80, 0xf1,
1823         0x18, 0x8c, 0x1d, 0x32
1824 };
1825
1826
1827 /* Multisession Vector context Test */
1828 /*Begin Session 0 */
1829 static uint8_t ms_aes_cbc_key0[] = {
1830         0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7,
1831         0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff
1832 };
1833
1834 static uint8_t ms_aes_cbc_iv0[] = {
1835         0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7,
1836         0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff
1837 };
1838
1839 static const uint8_t ms_aes_cbc_cipher0[] = {
1840                 0x3C, 0xE4, 0xEE, 0x42, 0xB6, 0x9B, 0xC3, 0x38,
1841                 0x5F, 0xAD, 0x54, 0xDC, 0xA8, 0x32, 0x81, 0xDC,
1842                 0x7A, 0x6F, 0x85, 0x58, 0x07, 0x35, 0xED, 0xEB,
1843                 0xAD, 0x79, 0x79, 0x96, 0xD3, 0x0E, 0xA6, 0xD9,
1844                 0xAA, 0x86, 0xA4, 0x8F, 0xB5, 0xD6, 0x6E, 0x6D,
1845                 0x0C, 0x91, 0x2F, 0xC4, 0x67, 0x98, 0x0E, 0xC4,
1846                 0x8D, 0x83, 0x68, 0x69, 0xC4, 0xD3, 0x94, 0x34,
1847                 0xC4, 0x5D, 0x60, 0x55, 0x22, 0x87, 0x8F, 0x6F,
1848                 0x17, 0x8E, 0x75, 0xE4, 0x02, 0xF5, 0x1B, 0x99,
1849                 0xC8, 0x39, 0xA9, 0xAB, 0x23, 0x91, 0x12, 0xED,
1850                 0x08, 0xE7, 0xD9, 0x25, 0x89, 0x24, 0x4F, 0x8D,
1851                 0x68, 0xF3, 0x10, 0x39, 0x0A, 0xEE, 0x45, 0x24,
1852                 0xDF, 0x7A, 0x9D, 0x00, 0x25, 0xE5, 0x35, 0x71,
1853                 0x4E, 0x40, 0x59, 0x6F, 0x0A, 0x13, 0xB3, 0x72,
1854                 0x1D, 0x98, 0x63, 0x94, 0x89, 0xA5, 0x39, 0x8E,
1855                 0xD3, 0x9C, 0x8A, 0x7F, 0x71, 0x2F, 0xC7, 0xCD,
1856                 0x81, 0x05, 0xDC, 0xC0, 0x8D, 0xCE, 0x6D, 0x18,
1857                 0x30, 0xC4, 0x72, 0x51, 0xF0, 0x27, 0xC8, 0xF6,
1858                 0x60, 0x5B, 0x7C, 0xB2, 0xE3, 0x49, 0x0C, 0x29,
1859                 0xC6, 0x9F, 0x39, 0x57, 0x80, 0x55, 0x24, 0x2C,
1860                 0x9B, 0x0F, 0x5A, 0xB3, 0x89, 0x55, 0x31, 0x96,
1861                 0x0D, 0xCD, 0xF6, 0x51, 0x03, 0x2D, 0x89, 0x26,
1862                 0x74, 0x44, 0xD6, 0xE8, 0xDC, 0xEA, 0x44, 0x55,
1863                 0x64, 0x71, 0x9C, 0x9F, 0x5D, 0xBA, 0x39, 0x46,
1864                 0xA8, 0x17, 0xA1, 0x9C, 0x52, 0x9D, 0xBC, 0x6B,
1865                 0x4A, 0x98, 0xE6, 0xEA, 0x33, 0xEC, 0x58, 0xB4,
1866                 0x43, 0xF0, 0x32, 0x45, 0xA4, 0xC1, 0x55, 0xB7,
1867                 0x5D, 0xB5, 0x59, 0xB2, 0xE3, 0x96, 0xFF, 0xA5,
1868                 0xAF, 0xE1, 0x86, 0x1B, 0x42, 0xE6, 0x3B, 0xA0,
1869                 0x90, 0x4A, 0xE8, 0x8C, 0x21, 0x7F, 0x36, 0x1E,
1870                 0x5B, 0x65, 0x25, 0xD1, 0xC1, 0x5A, 0xCA, 0x3D,
1871                 0x10, 0xED, 0x2D, 0x79, 0xD0, 0x0F, 0x58, 0x44,
1872                 0x69, 0x81, 0xF5, 0xD4, 0xC9, 0x0F, 0x90, 0x76,
1873                 0x1F, 0x54, 0xD2, 0xD5, 0x97, 0xCE, 0x2C, 0xE3,
1874                 0xEF, 0xF4, 0xB7, 0xC6, 0x3A, 0x87, 0x7F, 0x83,
1875                 0x2A, 0xAF, 0xCD, 0x90, 0x12, 0xA7, 0x7D, 0x85,
1876                 0x1D, 0x62, 0xD3, 0x85, 0x25, 0x05, 0xDB, 0x45,
1877                 0x92, 0xA3, 0xF6, 0xA2, 0xA8, 0x41, 0xE4, 0x25,
1878                 0x86, 0x87, 0x67, 0x24, 0xEC, 0x89, 0x23, 0x2A,
1879                 0x9B, 0x20, 0x4D, 0x93, 0xEE, 0xE2, 0x2E, 0xC1,
1880                 0x0B, 0x15, 0x33, 0xCF, 0x00, 0xD1, 0x1A, 0xDA,
1881                 0x93, 0xFD, 0x28, 0x21, 0x5B, 0xCF, 0xD1, 0xF3,
1882                 0x5A, 0x81, 0xBA, 0x82, 0x5E, 0x2F, 0x61, 0xB4,
1883                 0x05, 0x71, 0xB5, 0xF4, 0x39, 0x3C, 0x1F, 0x60,
1884                 0x00, 0x7A, 0xC4, 0xF8, 0x35, 0x20, 0x6C, 0x3A,
1885                 0xCC, 0x03, 0x8F, 0x7B, 0xA2, 0xB6, 0x65, 0x8A,
1886                 0xB6, 0x5F, 0xFD, 0x25, 0xD3, 0x5F, 0x92, 0xF9,
1887                 0xAE, 0x17, 0x9B, 0x5E, 0x6E, 0x9A, 0xE4, 0x55,
1888                 0x10, 0x25, 0x07, 0xA4, 0xAF, 0x21, 0x69, 0x13,
1889                 0xD8, 0xFA, 0x31, 0xED, 0xF7, 0xA7, 0xA7, 0x3B,
1890                 0xB8, 0x96, 0x8E, 0x10, 0x86, 0x74, 0xD8, 0xB1,
1891                 0x34, 0x9E, 0x9B, 0x6A, 0x26, 0xA8, 0xD4, 0xD0,
1892                 0xB5, 0xF6, 0xDE, 0xE7, 0xCA, 0x06, 0xDC, 0xA3,
1893                 0x6F, 0xEE, 0x6B, 0x1E, 0xB5, 0x30, 0x99, 0x23,
1894                 0xF9, 0x76, 0xF0, 0xA0, 0xCF, 0x3B, 0x94, 0x7B,
1895                 0x19, 0x8D, 0xA5, 0x0C, 0x18, 0xA6, 0x1D, 0x07,
1896                 0x89, 0xBE, 0x5B, 0x61, 0xE5, 0xF1, 0x42, 0xDB,
1897                 0xD4, 0x2E, 0x02, 0x1F, 0xCE, 0xEF, 0x92, 0xB1,
1898                 0x1B, 0x56, 0x50, 0xF2, 0x16, 0xE5, 0xE7, 0x4F,
1899                 0xFD, 0xBB, 0x3E, 0xD2, 0xFC, 0x3C, 0xC6, 0x0F,
1900                 0xF9, 0x12, 0x4E, 0xCB, 0x1E, 0x0C, 0x15, 0x84,
1901                 0x2A, 0x14, 0x8A, 0x02, 0xE4, 0x7E, 0x95, 0x5B,
1902                 0x86, 0xDB, 0x9B, 0x62, 0x5B, 0x19, 0xD2, 0x17,
1903                 0xFA, 0x13, 0xBB, 0x6B, 0x3F, 0x45, 0x9F, 0xBF
1904 };
1905
1906
1907 static  uint8_t ms_hmac_key0[] = {
1908                 0xFF, 0x1A, 0x7D, 0x3D, 0xF5, 0x82, 0x80, 0xF1,
1909                 0xF1, 0x35, 0x5C, 0x3B, 0xDD, 0x9A, 0x65, 0xBA,
1910                 0x58, 0x34, 0x85, 0x65, 0x1C, 0x42, 0x50, 0x76,
1911                 0x9A, 0xAF, 0x88, 0x1B, 0xB6, 0x8F, 0xF8, 0x60,
1912                 0xA2, 0x5A, 0x7F, 0x3F, 0xF4, 0x72, 0x70, 0xF1,
1913                 0xF5, 0x35, 0x4C, 0x3B, 0xDD, 0x90, 0x65, 0xB0,
1914                 0x47, 0x3A, 0x75, 0x61, 0x5C, 0xA2, 0x10, 0x76,
1915                 0x9A, 0xAF, 0x77, 0x5B, 0xB6, 0x7F, 0xF7, 0x60
1916 };
1917
1918 static const uint8_t ms_hmac_digest0[] = {
1919                 0x43, 0x52, 0xED, 0x34, 0xAB, 0x36, 0xB2, 0x51,
1920                 0xFB, 0xA3, 0xA6, 0x7C, 0x38, 0xFC, 0x42, 0x8F,
1921                 0x57, 0x64, 0xAB, 0x81, 0xA7, 0x89, 0xB7, 0x6C,
1922                 0xA0, 0xDC, 0xB9, 0x4D, 0xC4, 0x30, 0xF9, 0xD4,
1923                 0x10, 0x82, 0x55, 0xD0, 0xAB, 0x32, 0xFB, 0x56,
1924                 0x0D, 0xE4, 0x68, 0x3D, 0x76, 0xD0, 0x7B, 0xE4,
1925                 0xA6, 0x2C, 0x34, 0x9E, 0x8C, 0x41, 0xF8, 0x23,
1926                 0x28, 0x1B, 0x3A, 0x90, 0x26, 0x34, 0x47, 0x90
1927                 };
1928
1929 /* End Session 0 */
1930 /* Begin session 1 */
1931
1932 static  uint8_t ms_aes_cbc_key1[] = {
1933                 0xf1, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7,
1934                 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff
1935 };
1936
1937 static  uint8_t ms_aes_cbc_iv1[] = {
1938         0xf1, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7,
1939         0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff
1940 };
1941
1942 static const uint8_t ms_aes_cbc_cipher1[] = {
1943                 0x5A, 0x7A, 0x67, 0x5D, 0xB8, 0xE1, 0xDC, 0x71,
1944                 0x39, 0xA8, 0x74, 0x93, 0x9C, 0x4C, 0xFE, 0x23,
1945                 0x61, 0xCD, 0xA4, 0xB3, 0xD9, 0xCE, 0x99, 0x09,
1946                 0x2A, 0x23, 0xF3, 0x29, 0xBF, 0x4C, 0xB4, 0x6A,
1947                 0x1B, 0x6B, 0x73, 0x4D, 0x48, 0x0C, 0xCF, 0x6C,
1948                 0x5E, 0x34, 0x9E, 0x7F, 0xBC, 0x8F, 0xCC, 0x8F,
1949                 0x75, 0x1D, 0x3D, 0x77, 0x10, 0x76, 0xC8, 0xB9,
1950                 0x99, 0x6F, 0xD6, 0x56, 0x75, 0xA9, 0xB2, 0x66,
1951                 0xC2, 0x24, 0x2B, 0x9C, 0xFE, 0x40, 0x8E, 0x43,
1952                 0x20, 0x97, 0x1B, 0xFA, 0xD0, 0xCF, 0x04, 0xAB,
1953                 0xBB, 0xF6, 0x5D, 0xF5, 0xA0, 0x19, 0x7C, 0x23,
1954                 0x5D, 0x80, 0x8C, 0x49, 0xF6, 0x76, 0x88, 0x29,
1955                 0x27, 0x4C, 0x59, 0x2B, 0x43, 0xA6, 0xB2, 0x26,
1956                 0x27, 0x78, 0xBE, 0x1B, 0xE1, 0x4F, 0x5A, 0x1F,
1957                 0xFC, 0x68, 0x08, 0xE7, 0xC4, 0xD1, 0x34, 0x68,
1958                 0xB7, 0x13, 0x14, 0x41, 0x62, 0x6B, 0x1F, 0x77,
1959                 0x0C, 0x68, 0x1D, 0x0D, 0xED, 0x89, 0xAA, 0xD8,
1960                 0x97, 0x02, 0xBA, 0x5E, 0xD4, 0x84, 0x25, 0x97,
1961                 0x03, 0xA5, 0xA6, 0x13, 0x66, 0x02, 0xF4, 0xC3,
1962                 0xF3, 0xD3, 0xCC, 0x95, 0xC3, 0x87, 0x46, 0x90,
1963                 0x1F, 0x6E, 0x14, 0xA8, 0x00, 0xF2, 0x6F, 0xD5,
1964                 0xA1, 0xAD, 0xD5, 0x40, 0xA2, 0x0F, 0x32, 0x7E,
1965                 0x99, 0xA3, 0xF5, 0x53, 0xC3, 0x26, 0xA1, 0x45,
1966                 0x01, 0x88, 0x57, 0x84, 0x3E, 0x7B, 0x4E, 0x0B,
1967                 0x3C, 0xB5, 0x3E, 0x9E, 0xE9, 0x78, 0x77, 0xC5,
1968                 0xC0, 0x89, 0xA8, 0xF8, 0xF1, 0xA5, 0x2D, 0x5D,
1969                 0xF9, 0xC6, 0xFB, 0xCB, 0x05, 0x23, 0xBD, 0x6E,
1970                 0x5E, 0x14, 0xC6, 0x57, 0x73, 0xCF, 0x98, 0xBD,
1971                 0x10, 0x8B, 0x18, 0xA6, 0x01, 0x5B, 0x13, 0xAE,
1972                 0x8E, 0xDE, 0x1F, 0xB5, 0xB7, 0x40, 0x6C, 0xC1,
1973                 0x1E, 0xA1, 0x19, 0x20, 0x9E, 0x95, 0xE0, 0x2F,
1974                 0x1C, 0xF5, 0xD9, 0xD0, 0x2B, 0x1E, 0x82, 0x25,
1975                 0x62, 0xB4, 0xEB, 0xA1, 0x1F, 0xCE, 0x44, 0xA1,
1976                 0xCB, 0x92, 0x01, 0x6B, 0xE4, 0x26, 0x23, 0xE3,
1977                 0xC5, 0x67, 0x35, 0x55, 0xDA, 0xE5, 0x27, 0xEE,
1978                 0x8D, 0x12, 0x84, 0xB7, 0xBA, 0xA7, 0x1C, 0xD6,
1979                 0x32, 0x3F, 0x67, 0xED, 0xFB, 0x5B, 0x8B, 0x52,
1980                 0x46, 0x8C, 0xF9, 0x69, 0xCD, 0xAE, 0x79, 0xAA,
1981                 0x37, 0x78, 0x49, 0xEB, 0xC6, 0x8E, 0x76, 0x63,
1982                 0x84, 0xFF, 0x9D, 0x22, 0x99, 0x51, 0xB7, 0x5E,
1983                 0x83, 0x4C, 0x8B, 0xDF, 0x5A, 0x07, 0xCC, 0xBA,
1984                 0x42, 0xA5, 0x98, 0xB6, 0x47, 0x0E, 0x66, 0xEB,
1985                 0x23, 0x0E, 0xBA, 0x44, 0xA8, 0xAA, 0x20, 0x71,
1986                 0x79, 0x9C, 0x77, 0x5F, 0xF5, 0xFE, 0xEC, 0xEF,
1987                 0xC6, 0x64, 0x3D, 0x84, 0xD0, 0x2B, 0xA7, 0x0A,
1988                 0xC3, 0x72, 0x5B, 0x9C, 0xFA, 0xA8, 0x87, 0x95,
1989                 0x94, 0x11, 0x38, 0xA7, 0x1E, 0x58, 0xE3, 0x73,
1990                 0xC6, 0xC9, 0xD1, 0x7B, 0x92, 0xDB, 0x0F, 0x49,
1991                 0x74, 0xC2, 0xA2, 0x0E, 0x35, 0x57, 0xAC, 0xDB,
1992                 0x9A, 0x1C, 0xCF, 0x5A, 0x32, 0x3E, 0x26, 0x9B,
1993                 0xEC, 0xB3, 0xEF, 0x9C, 0xFE, 0xBE, 0x52, 0xAC,
1994                 0xB1, 0x29, 0xDD, 0xFD, 0x07, 0xE2, 0xEE, 0xED,
1995                 0xE4, 0x46, 0x37, 0xFE, 0xD1, 0xDC, 0xCD, 0x02,
1996                 0xF9, 0x31, 0xB0, 0xFB, 0x36, 0xB7, 0x34, 0xA4,
1997                 0x76, 0xE8, 0x57, 0xBF, 0x99, 0x92, 0xC7, 0xAF,
1998                 0x98, 0x10, 0xE2, 0x70, 0xCA, 0xC9, 0x2B, 0x82,
1999                 0x06, 0x96, 0x88, 0x0D, 0xB3, 0xAC, 0x9E, 0x6D,
2000                 0x43, 0xBC, 0x5B, 0x31, 0xCF, 0x65, 0x8D, 0xA6,
2001                 0xC7, 0xFE, 0x73, 0xE1, 0x54, 0xF7, 0x10, 0xF9,
2002                 0x86, 0xF7, 0xDF, 0xA1, 0xA1, 0xD8, 0xAE, 0x35,
2003                 0xB3, 0x90, 0xDC, 0x6F, 0x43, 0x7A, 0x8B, 0xE0,
2004                 0xFE, 0x8F, 0x33, 0x4D, 0x29, 0x6C, 0x45, 0x53,
2005                 0x73, 0xDD, 0x21, 0x0B, 0x85, 0x30, 0xB5, 0xA5,
2006                 0xF3, 0x5D, 0xEC, 0x79, 0x61, 0x9D, 0x9E, 0xB3
2007
2008 };
2009
2010 static uint8_t ms_hmac_key1[] = {
2011                 0xFE, 0x1A, 0x7D, 0x3D, 0xF5, 0x82, 0x80, 0xF1,
2012                 0xF1, 0x35, 0x5C, 0x3B, 0xDD, 0x9A, 0x65, 0xBA,
2013                 0x58, 0x34, 0x85, 0x65, 0x1C, 0x42, 0x50, 0x76,
2014                 0x9A, 0xAF, 0x88, 0x1B, 0xB6, 0x8F, 0xF8, 0x60,
2015                 0xA2, 0x5A, 0x7F, 0x3F, 0xF4, 0x72, 0x70, 0xF1,
2016                 0xF5, 0x35, 0x4C, 0x3B, 0xDD, 0x90, 0x65, 0xB0,
2017                 0x47, 0x3A, 0x75, 0x61, 0x5C, 0xA2, 0x10, 0x76,
2018                 0x9A, 0xAF, 0x77, 0x5B, 0xB6, 0x7F, 0xF7, 0x60
2019 };
2020
2021 static const uint8_t ms_hmac_digest1[] = {
2022                 0xCE, 0x6E, 0x5F, 0x77, 0x96, 0x9A, 0xB1, 0x69,
2023                 0x2D, 0x5E, 0xF3, 0x2F, 0x32, 0x10, 0xCB, 0x50,
2024                 0x0E, 0x09, 0x56, 0x25, 0x07, 0x34, 0xC9, 0x20,
2025                 0xEC, 0x13, 0x43, 0x23, 0x5C, 0x08, 0x8B, 0xCD,
2026                 0xDC, 0x86, 0x8C, 0xEE, 0x0A, 0x95, 0x2E, 0xB9,
2027                 0x8C, 0x7B, 0x02, 0x7A, 0xD4, 0xE1, 0x49, 0xB4,
2028                 0x45, 0xB5, 0x52, 0x37, 0xC6, 0xFF, 0xFE, 0xAA,
2029                 0x0A, 0x87, 0xB8, 0x51, 0xF9, 0x2A, 0x01, 0x8F
2030 };
2031 /* End Session 1  */
2032 /* Begin Session 2 */
2033 static  uint8_t ms_aes_cbc_key2[] = {
2034                 0xff, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7,
2035                 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff
2036 };
2037
2038 static  uint8_t ms_aes_cbc_iv2[] = {
2039                 0xff, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7,
2040                 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff
2041 };
2042
2043 static const uint8_t ms_aes_cbc_cipher2[] = {
2044                 0xBB, 0x3C, 0x68, 0x25, 0xFD, 0xB6, 0xA2, 0x91,
2045                 0x20, 0x56, 0xF6, 0x30, 0x35, 0xFC, 0x9E, 0x97,
2046                 0xF2, 0x90, 0xFC, 0x7E, 0x3E, 0x0A, 0x75, 0xC8,
2047                 0x4C, 0xF2, 0x2D, 0xAC, 0xD3, 0x93, 0xF0, 0xC5,
2048                 0x14, 0x88, 0x8A, 0x23, 0xC2, 0x59, 0x9A, 0x98,
2049                 0x4B, 0xD5, 0x2C, 0xDA, 0x43, 0xA9, 0x34, 0x69,
2050                 0x7C, 0x6D, 0xDB, 0xDC, 0xCB, 0xC0, 0xA0, 0x09,
2051                 0xA7, 0x86, 0x16, 0x4B, 0xBF, 0xA8, 0xB6, 0xCF,
2052                 0x7F, 0x74, 0x1F, 0x22, 0xF0, 0xF6, 0xBB, 0x44,
2053                 0x8B, 0x4C, 0x9E, 0x23, 0xF8, 0x9F, 0xFC, 0x5B,
2054                 0x9E, 0x9C, 0x2A, 0x79, 0x30, 0x8F, 0xBF, 0xA9,
2055                 0x68, 0xA1, 0x20, 0x71, 0x7C, 0x77, 0x22, 0x34,
2056                 0x07, 0xCD, 0xC6, 0xF6, 0x50, 0x0A, 0x08, 0x99,
2057                 0x17, 0x98, 0xE3, 0x93, 0x8A, 0xB0, 0xEE, 0xDF,
2058                 0xC2, 0xBA, 0x3B, 0x44, 0x73, 0xDF, 0xDD, 0xDC,
2059                 0x14, 0x4D, 0x3B, 0xBB, 0x5E, 0x58, 0xC1, 0x26,
2060                 0xA7, 0xAE, 0x47, 0xF3, 0x24, 0x6D, 0x4F, 0xD3,
2061                 0x6E, 0x3E, 0x33, 0xE6, 0x7F, 0xCA, 0x50, 0xAF,
2062                 0x5D, 0x3D, 0xA0, 0xDD, 0xC9, 0xF3, 0x30, 0xD3,
2063                 0x6E, 0x8B, 0x2E, 0x12, 0x24, 0x34, 0xF0, 0xD3,
2064                 0xC7, 0x8D, 0x23, 0x29, 0xAA, 0x05, 0xE1, 0xFA,
2065                 0x2E, 0xF6, 0x8D, 0x37, 0x86, 0xC0, 0x6D, 0x13,
2066                 0x2D, 0x98, 0xF3, 0x52, 0x39, 0x22, 0xCE, 0x38,
2067                 0xC2, 0x1A, 0x72, 0xED, 0xFB, 0xCC, 0xE4, 0x71,
2068                 0x5A, 0x0C, 0x0D, 0x09, 0xF8, 0xE8, 0x1B, 0xBC,
2069                 0x53, 0xC8, 0xD8, 0x8F, 0xE5, 0x98, 0x5A, 0xB1,
2070                 0x06, 0xA6, 0x5B, 0xE6, 0xA2, 0x88, 0x21, 0x9E,
2071                 0x36, 0xC0, 0x34, 0xF9, 0xFB, 0x3B, 0x0A, 0x22,
2072                 0x00, 0x00, 0x39, 0x48, 0x8D, 0x23, 0x74, 0x62,
2073                 0x72, 0x91, 0xE6, 0x36, 0xAA, 0x77, 0x9C, 0x72,
2074                 0x9D, 0xA8, 0xC3, 0xA9, 0xD5, 0x44, 0x72, 0xA6,
2075                 0xB9, 0x28, 0x8F, 0x64, 0x4C, 0x8A, 0x64, 0xE6,
2076                 0x4E, 0xFA, 0xEF, 0x87, 0xDE, 0x7B, 0x22, 0x44,
2077                 0xB0, 0xDF, 0x2E, 0x5F, 0x0B, 0xA5, 0xF2, 0x24,
2078                 0x07, 0x5C, 0x2D, 0x39, 0xB7, 0x3D, 0x8A, 0xE5,
2079                 0x0E, 0x9D, 0x4E, 0x50, 0xED, 0x03, 0x99, 0x8E,
2080                 0xF0, 0x06, 0x55, 0x4E, 0xA2, 0x24, 0xE7, 0x17,
2081                 0x46, 0xDF, 0x6C, 0xCD, 0xC6, 0x44, 0xE8, 0xF9,
2082                 0xB9, 0x1B, 0x36, 0xF6, 0x7F, 0x10, 0xA4, 0x7D,
2083                 0x90, 0xBD, 0xE4, 0xAA, 0xD6, 0x9E, 0x18, 0x9D,
2084                 0x22, 0x35, 0xD6, 0x55, 0x54, 0xAA, 0xF7, 0x22,
2085                 0xA3, 0x3E, 0xEF, 0xC8, 0xA2, 0x34, 0x8D, 0xA9,
2086                 0x37, 0x63, 0xA6, 0xC3, 0x57, 0xCB, 0x0C, 0x49,
2087                 0x7D, 0x02, 0xBE, 0xAA, 0x13, 0x75, 0xB7, 0x4E,
2088                 0x52, 0x62, 0xA5, 0xC2, 0x33, 0xC7, 0x6C, 0x1B,
2089                 0xF6, 0x34, 0xF6, 0x09, 0xA5, 0x0C, 0xC7, 0xA2,
2090                 0x61, 0x48, 0x62, 0x7D, 0x17, 0x15, 0xE3, 0x95,
2091                 0xC8, 0x63, 0xD2, 0xA4, 0x43, 0xA9, 0x49, 0x07,
2092                 0xB2, 0x3B, 0x2B, 0x62, 0x7D, 0xCB, 0x51, 0xB3,
2093                 0x25, 0x33, 0x47, 0x0E, 0x14, 0x67, 0xDC, 0x6A,
2094                 0x9B, 0x51, 0xAC, 0x9D, 0x8F, 0xA2, 0x2B, 0x57,
2095                 0x8C, 0x5C, 0x5F, 0x76, 0x23, 0x92, 0x0F, 0x84,
2096                 0x46, 0x0E, 0x40, 0x85, 0x38, 0x60, 0xFA, 0x61,
2097                 0x20, 0xC5, 0xE3, 0xF1, 0x70, 0xAC, 0x1B, 0xBF,
2098                 0xC4, 0x2B, 0xC5, 0x67, 0xD1, 0x43, 0xC5, 0x17,
2099                 0x74, 0x71, 0x69, 0x6F, 0x82, 0x89, 0x19, 0x8A,
2100                 0x70, 0x43, 0x92, 0x01, 0xC4, 0x63, 0x7E, 0xB1,
2101                 0x59, 0x4E, 0xCD, 0xEA, 0x93, 0xA4, 0x52, 0x53,
2102                 0x9B, 0x61, 0x5B, 0xD2, 0x3E, 0x19, 0x39, 0xB7,
2103                 0x32, 0xEA, 0x8E, 0xF8, 0x1D, 0x76, 0x5C, 0xB2,
2104                 0x73, 0x2D, 0x91, 0xC0, 0x18, 0xED, 0x25, 0x2A,
2105                 0x53, 0x64, 0xF0, 0x92, 0x31, 0x55, 0x21, 0xA8,
2106                 0x24, 0xA9, 0xD1, 0x02, 0xF6, 0x6C, 0x2B, 0x70,
2107                 0xA9, 0x59, 0xC1, 0xD6, 0xC3, 0x57, 0x5B, 0x92
2108 };
2109
2110 static  uint8_t ms_hmac_key2[] = {
2111                 0xFC, 0x1A, 0x7D, 0x3D, 0xF5, 0x82, 0x80, 0xF1,
2112                 0xF1, 0x35, 0x5C, 0x3B, 0xDD, 0x9A, 0x65, 0xBA,
2113                 0x58, 0x34, 0x85, 0x65, 0x1C, 0x42, 0x50, 0x76,
2114                 0x9A, 0xAF, 0x88, 0x1B, 0xB6, 0x8F, 0xF8, 0x60,
2115                 0xA2, 0x5A, 0x7F, 0x3F, 0xF4, 0x72, 0x70, 0xF1,
2116                 0xF5, 0x35, 0x4C, 0x3B, 0xDD, 0x90, 0x65, 0xB0,
2117                 0x47, 0x3A, 0x75, 0x61, 0x5C, 0xA2, 0x10, 0x76,
2118                 0x9A, 0xAF, 0x77, 0x5B, 0xB6, 0x7F, 0xF7, 0x60
2119 };
2120
2121 static const uint8_t ms_hmac_digest2[] = {
2122                 0xA5, 0x0F, 0x9C, 0xFB, 0x08, 0x62, 0x59, 0xFF,
2123                 0x80, 0x2F, 0xEB, 0x4B, 0xE1, 0x46, 0x21, 0xD6,
2124                 0x02, 0x98, 0xF2, 0x8E, 0xF4, 0xEC, 0xD4, 0x77,
2125                 0x86, 0x4C, 0x31, 0x28, 0xC8, 0x25, 0x80, 0x27,
2126                 0x3A, 0x72, 0x5D, 0x6A, 0x56, 0x8A, 0xD3, 0x82,
2127                 0xB0, 0xEC, 0x31, 0x6D, 0x8B, 0x6B, 0xB4, 0x24,
2128                 0xE7, 0x62, 0xC1, 0x52, 0xBC, 0x14, 0x1B, 0x8E,
2129                 0xEC, 0x9A, 0xF1, 0x47, 0x80, 0xD2, 0xB0, 0x59
2130 };
2131
2132 /* End Session 2 */
2133
2134
2135 static int
2136 test_AES_CBC_HMAC_SHA1_encrypt_digest(void)
2137 {
2138         struct crypto_testsuite_params *ts_params = &testsuite_params;
2139         struct crypto_unittest_params *ut_params = &unittest_params;
2140         int status;
2141
2142         /* Verify the capabilities */
2143         struct rte_cryptodev_sym_capability_idx cap_idx;
2144         cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
2145         cap_idx.algo.auth = RTE_CRYPTO_AUTH_SHA1_HMAC;
2146         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
2147                         &cap_idx) == NULL)
2148                 return TEST_SKIPPED;
2149         cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
2150         cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_AES_CBC;
2151         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
2152                         &cap_idx) == NULL)
2153                 return TEST_SKIPPED;
2154
2155         /* Generate test mbuf data and space for digest */
2156         ut_params->ibuf = setup_test_string(ts_params->mbuf_pool,
2157                         catch_22_quote, QUOTE_512_BYTES, 0);
2158
2159         ut_params->digest = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
2160                         DIGEST_BYTE_LENGTH_SHA1);
2161         TEST_ASSERT_NOT_NULL(ut_params->digest, "no room to append digest");
2162
2163         /* Setup Cipher Parameters */
2164         ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
2165         ut_params->cipher_xform.next = &ut_params->auth_xform;
2166
2167         ut_params->cipher_xform.cipher.algo = RTE_CRYPTO_CIPHER_AES_CBC;
2168         ut_params->cipher_xform.cipher.op = RTE_CRYPTO_CIPHER_OP_ENCRYPT;
2169         ut_params->cipher_xform.cipher.key.data = aes_cbc_key;
2170         ut_params->cipher_xform.cipher.key.length = CIPHER_KEY_LENGTH_AES_CBC;
2171         ut_params->cipher_xform.cipher.iv.offset = IV_OFFSET;
2172         ut_params->cipher_xform.cipher.iv.length = CIPHER_IV_LENGTH_AES_CBC;
2173
2174         /* Setup HMAC Parameters */
2175         ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;
2176
2177         ut_params->auth_xform.next = NULL;
2178
2179         ut_params->auth_xform.auth.op = RTE_CRYPTO_AUTH_OP_GENERATE;
2180         ut_params->auth_xform.auth.algo = RTE_CRYPTO_AUTH_SHA1_HMAC;
2181         ut_params->auth_xform.auth.key.length = HMAC_KEY_LENGTH_SHA1;
2182         ut_params->auth_xform.auth.key.data = hmac_sha1_key;
2183         ut_params->auth_xform.auth.digest_length = DIGEST_BYTE_LENGTH_SHA1;
2184
2185         ut_params->sess = rte_cryptodev_sym_session_create(
2186                         ts_params->session_mpool);
2187         TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed");
2188
2189         /* Create crypto session*/
2190         status = rte_cryptodev_sym_session_init(ts_params->valid_devs[0],
2191                         ut_params->sess, &ut_params->cipher_xform,
2192                         ts_params->session_priv_mpool);
2193
2194         if (status == -ENOTSUP)
2195                 return TEST_SKIPPED;
2196
2197         TEST_ASSERT_EQUAL(status, 0, "Session init failed");
2198
2199         /* Generate crypto op data structure */
2200         ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
2201                         RTE_CRYPTO_OP_TYPE_SYMMETRIC);
2202         TEST_ASSERT_NOT_NULL(ut_params->op,
2203                         "Failed to allocate symmetric crypto operation struct");
2204
2205         rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
2206
2207         struct rte_crypto_sym_op *sym_op = ut_params->op->sym;
2208
2209         /* set crypto operation source mbuf */
2210         sym_op->m_src = ut_params->ibuf;
2211
2212         /* Set crypto operation authentication parameters */
2213         sym_op->auth.digest.data = ut_params->digest;
2214         sym_op->auth.digest.phys_addr = rte_pktmbuf_iova_offset(
2215                         ut_params->ibuf, QUOTE_512_BYTES);
2216
2217         sym_op->auth.data.offset = 0;
2218         sym_op->auth.data.length = QUOTE_512_BYTES;
2219
2220         /* Copy IV at the end of the crypto operation */
2221         rte_memcpy(rte_crypto_op_ctod_offset(ut_params->op, uint8_t *, IV_OFFSET),
2222                         aes_cbc_iv, CIPHER_IV_LENGTH_AES_CBC);
2223
2224         /* Set crypto operation cipher parameters */
2225         sym_op->cipher.data.offset = 0;
2226         sym_op->cipher.data.length = QUOTE_512_BYTES;
2227
2228         /* Process crypto operation */
2229         if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
2230                 process_cpu_crypt_auth_op(ts_params->valid_devs[0],
2231                         ut_params->op);
2232         else
2233                 TEST_ASSERT_NOT_NULL(
2234                         process_crypto_request(ts_params->valid_devs[0],
2235                                 ut_params->op),
2236                                 "failed to process sym crypto op");
2237
2238         TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
2239                         "crypto op processing failed");
2240
2241         /* Validate obuf */
2242         uint8_t *ciphertext = rte_pktmbuf_mtod(ut_params->op->sym->m_src,
2243                         uint8_t *);
2244
2245         TEST_ASSERT_BUFFERS_ARE_EQUAL(ciphertext,
2246                         catch_22_quote_2_512_bytes_AES_CBC_ciphertext,
2247                         QUOTE_512_BYTES,
2248                         "ciphertext data not as expected");
2249
2250         uint8_t *digest = ciphertext + QUOTE_512_BYTES;
2251
2252         TEST_ASSERT_BUFFERS_ARE_EQUAL(digest,
2253                         catch_22_quote_2_512_bytes_AES_CBC_HMAC_SHA1_digest,
2254                         gbl_driver_id == rte_cryptodev_driver_id_get(
2255                                         RTE_STR(CRYPTODEV_NAME_AESNI_MB_PMD)) ?
2256                                         TRUNCATED_DIGEST_BYTE_LENGTH_SHA1 :
2257                                         DIGEST_BYTE_LENGTH_SHA1,
2258                         "Generated digest data not as expected");
2259
2260         return TEST_SUCCESS;
2261 }
2262
2263 /* ***** AES-CBC / HMAC-SHA512 Hash Tests ***** */
2264
2265 #define HMAC_KEY_LENGTH_SHA512  (DIGEST_BYTE_LENGTH_SHA512)
2266
2267 static uint8_t hmac_sha512_key[] = {
2268         0x42, 0x1a, 0x7d, 0x3d, 0xf5, 0x82, 0x80, 0xf1,
2269         0xF1, 0x35, 0x5C, 0x3B, 0xDD, 0x9A, 0x65, 0xBA,
2270         0x58, 0x34, 0x85, 0x65, 0x1C, 0x42, 0x50, 0x76,
2271         0x9a, 0xaf, 0x88, 0x1b, 0xb6, 0x8f, 0xf8, 0x60,
2272         0xa2, 0x5a, 0x7f, 0x3f, 0xf4, 0x72, 0x70, 0xf1,
2273         0xF5, 0x35, 0x4C, 0x3B, 0xDD, 0x90, 0x65, 0xB0,
2274         0x47, 0x3a, 0x75, 0x61, 0x5C, 0xa2, 0x10, 0x76,
2275         0x9a, 0xaf, 0x77, 0x5b, 0xb6, 0x7f, 0xf7, 0x60 };
2276
2277 static const uint8_t catch_22_quote_2_512_bytes_AES_CBC_HMAC_SHA512_digest[] = {
2278         0x5D, 0x54, 0x66, 0xC1, 0x6E, 0xBC, 0x04, 0xB8,
2279         0x46, 0xB8, 0x08, 0x6E, 0xE0, 0xF0, 0x43, 0x48,
2280         0x37, 0x96, 0x9C, 0xC6, 0x9C, 0xC2, 0x1E, 0xE8,
2281         0xF2, 0x0C, 0x0B, 0xEF, 0x86, 0xA2, 0xE3, 0x70,
2282         0x95, 0xC8, 0xB3, 0x06, 0x47, 0xA9, 0x90, 0xE8,
2283         0xA0, 0xC6, 0x72, 0x69, 0x05, 0xC0, 0x0D, 0x0E,
2284         0x21, 0x96, 0x65, 0x93, 0x74, 0x43, 0x2A, 0x1D,
2285         0x2E, 0xBF, 0xC2, 0xC2, 0xEE, 0xCC, 0x2F, 0x0A };
2286
2287
2288
2289 static int
2290 test_AES_CBC_HMAC_SHA512_decrypt_create_session_params(
2291                 struct crypto_unittest_params *ut_params,
2292                 uint8_t *cipher_key,
2293                 uint8_t *hmac_key);
2294
2295 static int
2296 test_AES_CBC_HMAC_SHA512_decrypt_perform(struct rte_cryptodev_sym_session *sess,
2297                 struct crypto_unittest_params *ut_params,
2298                 struct crypto_testsuite_params *ts_params,
2299                 const uint8_t *cipher,
2300                 const uint8_t *digest,
2301                 const uint8_t *iv);
2302
2303
2304 static int
2305 test_AES_CBC_HMAC_SHA512_decrypt_create_session_params(
2306                 struct crypto_unittest_params *ut_params,
2307                 uint8_t *cipher_key,
2308                 uint8_t *hmac_key)
2309 {
2310
2311         /* Setup Cipher Parameters */
2312         ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
2313         ut_params->cipher_xform.next = NULL;
2314
2315         ut_params->cipher_xform.cipher.algo = RTE_CRYPTO_CIPHER_AES_CBC;
2316         ut_params->cipher_xform.cipher.op = RTE_CRYPTO_CIPHER_OP_DECRYPT;
2317         ut_params->cipher_xform.cipher.key.data = cipher_key;
2318         ut_params->cipher_xform.cipher.key.length = CIPHER_KEY_LENGTH_AES_CBC;
2319         ut_params->cipher_xform.cipher.iv.offset = IV_OFFSET;
2320         ut_params->cipher_xform.cipher.iv.length = CIPHER_IV_LENGTH_AES_CBC;
2321
2322         /* Setup HMAC Parameters */
2323         ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;
2324         ut_params->auth_xform.next = &ut_params->cipher_xform;
2325
2326         ut_params->auth_xform.auth.op = RTE_CRYPTO_AUTH_OP_VERIFY;
2327         ut_params->auth_xform.auth.algo = RTE_CRYPTO_AUTH_SHA512_HMAC;
2328         ut_params->auth_xform.auth.key.data = hmac_key;
2329         ut_params->auth_xform.auth.key.length = HMAC_KEY_LENGTH_SHA512;
2330         ut_params->auth_xform.auth.digest_length = DIGEST_BYTE_LENGTH_SHA512;
2331
2332         return TEST_SUCCESS;
2333 }
2334
2335
2336 static int
2337 test_AES_CBC_HMAC_SHA512_decrypt_perform(struct rte_cryptodev_sym_session *sess,
2338                 struct crypto_unittest_params *ut_params,
2339                 struct crypto_testsuite_params *ts_params,
2340                 const uint8_t *cipher,
2341                 const uint8_t *digest,
2342                 const uint8_t *iv)
2343 {
2344         /* Generate test mbuf data and digest */
2345         ut_params->ibuf = setup_test_string(ts_params->mbuf_pool,
2346                         (const char *)
2347                         cipher,
2348                         QUOTE_512_BYTES, 0);
2349
2350         ut_params->digest = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
2351                         DIGEST_BYTE_LENGTH_SHA512);
2352         TEST_ASSERT_NOT_NULL(ut_params->digest, "no room to append digest");
2353
2354         rte_memcpy(ut_params->digest,
2355                         digest,
2356                         DIGEST_BYTE_LENGTH_SHA512);
2357
2358         /* Generate Crypto op data structure */
2359         ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
2360                         RTE_CRYPTO_OP_TYPE_SYMMETRIC);
2361         TEST_ASSERT_NOT_NULL(ut_params->op,
2362                         "Failed to allocate symmetric crypto operation struct");
2363
2364         rte_crypto_op_attach_sym_session(ut_params->op, sess);
2365
2366         struct rte_crypto_sym_op *sym_op = ut_params->op->sym;
2367
2368         /* set crypto operation source mbuf */
2369         sym_op->m_src = ut_params->ibuf;
2370
2371         sym_op->auth.digest.data = ut_params->digest;
2372         sym_op->auth.digest.phys_addr = rte_pktmbuf_iova_offset(
2373                         ut_params->ibuf, QUOTE_512_BYTES);
2374
2375         sym_op->auth.data.offset = 0;
2376         sym_op->auth.data.length = QUOTE_512_BYTES;
2377
2378         /* Copy IV at the end of the crypto operation */
2379         rte_memcpy(rte_crypto_op_ctod_offset(ut_params->op, uint8_t *, IV_OFFSET),
2380                         iv, CIPHER_IV_LENGTH_AES_CBC);
2381
2382         sym_op->cipher.data.offset = 0;
2383         sym_op->cipher.data.length = QUOTE_512_BYTES;
2384
2385         /* Process crypto operation */
2386         if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
2387                 process_cpu_crypt_auth_op(ts_params->valid_devs[0],
2388                         ut_params->op);
2389         else if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
2390                 process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
2391                                 ut_params->op, 1, 1, 0, 0);
2392         else
2393                 TEST_ASSERT_NOT_NULL(
2394                                 process_crypto_request(ts_params->valid_devs[0],
2395                                         ut_params->op),
2396                                         "failed to process sym crypto op");
2397
2398         TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
2399                         "crypto op processing failed");
2400
2401         ut_params->obuf = ut_params->op->sym->m_src;
2402
2403         /* Validate obuf */
2404         TEST_ASSERT_BUFFERS_ARE_EQUAL(
2405                         rte_pktmbuf_mtod(ut_params->obuf, uint8_t *),
2406                         catch_22_quote,
2407                         QUOTE_512_BYTES,
2408                         "Plaintext data not as expected");
2409
2410         /* Validate obuf */
2411         TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
2412                         "Digest verification failed");
2413
2414         return TEST_SUCCESS;
2415 }
2416
2417 /* ***** SNOW 3G Tests ***** */
2418 static int
2419 create_wireless_algo_hash_session(uint8_t dev_id,
2420         const uint8_t *key, const uint8_t key_len,
2421         const uint8_t iv_len, const uint8_t auth_len,
2422         enum rte_crypto_auth_operation op,
2423         enum rte_crypto_auth_algorithm algo)
2424 {
2425         uint8_t hash_key[key_len];
2426         int status;
2427
2428         struct crypto_testsuite_params *ts_params = &testsuite_params;
2429         struct crypto_unittest_params *ut_params = &unittest_params;
2430
2431         memcpy(hash_key, key, key_len);
2432
2433         debug_hexdump(stdout, "key:", key, key_len);
2434
2435         /* Setup Authentication Parameters */
2436         ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;
2437         ut_params->auth_xform.next = NULL;
2438
2439         ut_params->auth_xform.auth.op = op;
2440         ut_params->auth_xform.auth.algo = algo;
2441         ut_params->auth_xform.auth.key.length = key_len;
2442         ut_params->auth_xform.auth.key.data = hash_key;
2443         ut_params->auth_xform.auth.digest_length = auth_len;
2444         ut_params->auth_xform.auth.iv.offset = IV_OFFSET;
2445         ut_params->auth_xform.auth.iv.length = iv_len;
2446         ut_params->sess = rte_cryptodev_sym_session_create(
2447                         ts_params->session_mpool);
2448
2449         status = rte_cryptodev_sym_session_init(dev_id, ut_params->sess,
2450                         &ut_params->auth_xform,
2451                         ts_params->session_priv_mpool);
2452         if (status == -ENOTSUP)
2453                 return TEST_SKIPPED;
2454
2455         TEST_ASSERT_EQUAL(status, 0, "session init failed");
2456         TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed");
2457         return 0;
2458 }
2459
2460 static int
2461 create_wireless_algo_cipher_session(uint8_t dev_id,
2462                         enum rte_crypto_cipher_operation op,
2463                         enum rte_crypto_cipher_algorithm algo,
2464                         const uint8_t *key, const uint8_t key_len,
2465                         uint8_t iv_len)
2466 {
2467         uint8_t cipher_key[key_len];
2468         int status;
2469         struct crypto_testsuite_params *ts_params = &testsuite_params;
2470         struct crypto_unittest_params *ut_params = &unittest_params;
2471
2472         memcpy(cipher_key, key, key_len);
2473
2474         /* Setup Cipher Parameters */
2475         ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
2476         ut_params->cipher_xform.next = NULL;
2477
2478         ut_params->cipher_xform.cipher.algo = algo;
2479         ut_params->cipher_xform.cipher.op = op;
2480         ut_params->cipher_xform.cipher.key.data = cipher_key;
2481         ut_params->cipher_xform.cipher.key.length = key_len;
2482         ut_params->cipher_xform.cipher.iv.offset = IV_OFFSET;
2483         ut_params->cipher_xform.cipher.iv.length = iv_len;
2484
2485         debug_hexdump(stdout, "key:", key, key_len);
2486
2487         /* Create Crypto session */
2488         ut_params->sess = rte_cryptodev_sym_session_create(
2489                         ts_params->session_mpool);
2490
2491         status = rte_cryptodev_sym_session_init(dev_id, ut_params->sess,
2492                         &ut_params->cipher_xform,
2493                         ts_params->session_priv_mpool);
2494         if (status == -ENOTSUP)
2495                 return TEST_SKIPPED;
2496
2497         TEST_ASSERT_EQUAL(status, 0, "session init failed");
2498         TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed");
2499         return 0;
2500 }
2501
2502 static int
2503 create_wireless_algo_cipher_operation(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
2524         /* iv */
2525         rte_memcpy(rte_crypto_op_ctod_offset(ut_params->op, uint8_t *, IV_OFFSET),
2526                         iv, iv_len);
2527         sym_op->cipher.data.length = cipher_len;
2528         sym_op->cipher.data.offset = cipher_offset;
2529         return 0;
2530 }
2531
2532 static int
2533 create_wireless_algo_cipher_operation_oop(const uint8_t *iv, uint8_t iv_len,
2534                         unsigned int cipher_len,
2535                         unsigned int cipher_offset)
2536 {
2537         struct crypto_testsuite_params *ts_params = &testsuite_params;
2538         struct crypto_unittest_params *ut_params = &unittest_params;
2539
2540         /* Generate Crypto op data structure */
2541         ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
2542                                 RTE_CRYPTO_OP_TYPE_SYMMETRIC);
2543         TEST_ASSERT_NOT_NULL(ut_params->op,
2544                                 "Failed to allocate pktmbuf offload");
2545
2546         /* Set crypto operation data parameters */
2547         rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
2548
2549         struct rte_crypto_sym_op *sym_op = ut_params->op->sym;
2550
2551         /* set crypto operation source mbuf */
2552         sym_op->m_src = ut_params->ibuf;
2553         sym_op->m_dst = ut_params->obuf;
2554
2555         /* iv */
2556         rte_memcpy(rte_crypto_op_ctod_offset(ut_params->op, uint8_t *, IV_OFFSET),
2557                         iv, iv_len);
2558         sym_op->cipher.data.length = cipher_len;
2559         sym_op->cipher.data.offset = cipher_offset;
2560         return 0;
2561 }
2562
2563 static int
2564 create_wireless_algo_cipher_auth_session(uint8_t dev_id,
2565                 enum rte_crypto_cipher_operation cipher_op,
2566                 enum rte_crypto_auth_operation auth_op,
2567                 enum rte_crypto_auth_algorithm auth_algo,
2568                 enum rte_crypto_cipher_algorithm cipher_algo,
2569                 const uint8_t *key, uint8_t key_len,
2570                 uint8_t auth_iv_len, uint8_t auth_len,
2571                 uint8_t cipher_iv_len)
2572
2573 {
2574         uint8_t cipher_auth_key[key_len];
2575         int status;
2576
2577         struct crypto_testsuite_params *ts_params = &testsuite_params;
2578         struct crypto_unittest_params *ut_params = &unittest_params;
2579
2580         memcpy(cipher_auth_key, key, key_len);
2581
2582         /* Setup Authentication Parameters */
2583         ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;
2584         ut_params->auth_xform.next = NULL;
2585
2586         ut_params->auth_xform.auth.op = auth_op;
2587         ut_params->auth_xform.auth.algo = auth_algo;
2588         ut_params->auth_xform.auth.key.length = key_len;
2589         /* Hash key = cipher key */
2590         ut_params->auth_xform.auth.key.data = cipher_auth_key;
2591         ut_params->auth_xform.auth.digest_length = auth_len;
2592         /* Auth IV will be after cipher IV */
2593         ut_params->auth_xform.auth.iv.offset = IV_OFFSET + cipher_iv_len;
2594         ut_params->auth_xform.auth.iv.length = auth_iv_len;
2595
2596         /* Setup Cipher Parameters */
2597         ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
2598         ut_params->cipher_xform.next = &ut_params->auth_xform;
2599
2600         ut_params->cipher_xform.cipher.algo = cipher_algo;
2601         ut_params->cipher_xform.cipher.op = cipher_op;
2602         ut_params->cipher_xform.cipher.key.data = cipher_auth_key;
2603         ut_params->cipher_xform.cipher.key.length = key_len;
2604         ut_params->cipher_xform.cipher.iv.offset = IV_OFFSET;
2605         ut_params->cipher_xform.cipher.iv.length = cipher_iv_len;
2606
2607         debug_hexdump(stdout, "key:", key, key_len);
2608
2609         /* Create Crypto session*/
2610         ut_params->sess = rte_cryptodev_sym_session_create(
2611                         ts_params->session_mpool);
2612         TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed");
2613
2614         status = rte_cryptodev_sym_session_init(dev_id, ut_params->sess,
2615                         &ut_params->cipher_xform,
2616                         ts_params->session_priv_mpool);
2617         if (status == -ENOTSUP)
2618                 return TEST_SKIPPED;
2619
2620         TEST_ASSERT_EQUAL(status, 0, "session init failed");
2621         return 0;
2622 }
2623
2624 static int
2625 create_wireless_cipher_auth_session(uint8_t dev_id,
2626                 enum rte_crypto_cipher_operation cipher_op,
2627                 enum rte_crypto_auth_operation auth_op,
2628                 enum rte_crypto_auth_algorithm auth_algo,
2629                 enum rte_crypto_cipher_algorithm cipher_algo,
2630                 const struct wireless_test_data *tdata)
2631 {
2632         const uint8_t key_len = tdata->key.len;
2633         uint8_t cipher_auth_key[key_len];
2634         int status;
2635
2636         struct crypto_testsuite_params *ts_params = &testsuite_params;
2637         struct crypto_unittest_params *ut_params = &unittest_params;
2638         const uint8_t *key = tdata->key.data;
2639         const uint8_t auth_len = tdata->digest.len;
2640         uint8_t cipher_iv_len = tdata->cipher_iv.len;
2641         uint8_t auth_iv_len = tdata->auth_iv.len;
2642
2643         memcpy(cipher_auth_key, key, key_len);
2644
2645         /* Setup Authentication Parameters */
2646         ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;
2647         ut_params->auth_xform.next = NULL;
2648
2649         ut_params->auth_xform.auth.op = auth_op;
2650         ut_params->auth_xform.auth.algo = auth_algo;
2651         ut_params->auth_xform.auth.key.length = key_len;
2652         /* Hash key = cipher key */
2653         ut_params->auth_xform.auth.key.data = cipher_auth_key;
2654         ut_params->auth_xform.auth.digest_length = auth_len;
2655         /* Auth IV will be after cipher IV */
2656         ut_params->auth_xform.auth.iv.offset = IV_OFFSET + cipher_iv_len;
2657         ut_params->auth_xform.auth.iv.length = auth_iv_len;
2658
2659         /* Setup Cipher Parameters */
2660         ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
2661         ut_params->cipher_xform.next = &ut_params->auth_xform;
2662
2663         ut_params->cipher_xform.cipher.algo = cipher_algo;
2664         ut_params->cipher_xform.cipher.op = cipher_op;
2665         ut_params->cipher_xform.cipher.key.data = cipher_auth_key;
2666         ut_params->cipher_xform.cipher.key.length = key_len;
2667         ut_params->cipher_xform.cipher.iv.offset = IV_OFFSET;
2668         ut_params->cipher_xform.cipher.iv.length = cipher_iv_len;
2669
2670
2671         debug_hexdump(stdout, "key:", key, key_len);
2672
2673         /* Create Crypto session*/
2674         ut_params->sess = rte_cryptodev_sym_session_create(
2675                         ts_params->session_mpool);
2676
2677         status = rte_cryptodev_sym_session_init(dev_id, ut_params->sess,
2678                         &ut_params->cipher_xform,
2679                         ts_params->session_priv_mpool);
2680         if (status == -ENOTSUP)
2681                 return TEST_SKIPPED;
2682
2683         TEST_ASSERT_EQUAL(status, 0, "session init failed");
2684         TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed");
2685         return 0;
2686 }
2687
2688 static int
2689 create_zuc_cipher_auth_encrypt_generate_session(uint8_t dev_id,
2690                 const struct wireless_test_data *tdata)
2691 {
2692         return create_wireless_cipher_auth_session(dev_id,
2693                 RTE_CRYPTO_CIPHER_OP_ENCRYPT,
2694                 RTE_CRYPTO_AUTH_OP_GENERATE, RTE_CRYPTO_AUTH_ZUC_EIA3,
2695                 RTE_CRYPTO_CIPHER_ZUC_EEA3, tdata);
2696 }
2697
2698 static int
2699 create_wireless_algo_auth_cipher_session(uint8_t dev_id,
2700                 enum rte_crypto_cipher_operation cipher_op,
2701                 enum rte_crypto_auth_operation auth_op,
2702                 enum rte_crypto_auth_algorithm auth_algo,
2703                 enum rte_crypto_cipher_algorithm cipher_algo,
2704                 const uint8_t *key, const uint8_t key_len,
2705                 uint8_t auth_iv_len, uint8_t auth_len,
2706                 uint8_t cipher_iv_len)
2707 {
2708         uint8_t auth_cipher_key[key_len];
2709         int status;
2710         struct crypto_testsuite_params *ts_params = &testsuite_params;
2711         struct crypto_unittest_params *ut_params = &unittest_params;
2712
2713         memcpy(auth_cipher_key, key, key_len);
2714
2715         /* Setup Authentication Parameters */
2716         ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;
2717         ut_params->auth_xform.auth.op = auth_op;
2718         ut_params->auth_xform.next = &ut_params->cipher_xform;
2719         ut_params->auth_xform.auth.algo = auth_algo;
2720         ut_params->auth_xform.auth.key.length = key_len;
2721         ut_params->auth_xform.auth.key.data = auth_cipher_key;
2722         ut_params->auth_xform.auth.digest_length = auth_len;
2723         /* Auth IV will be after cipher IV */
2724         ut_params->auth_xform.auth.iv.offset = IV_OFFSET + cipher_iv_len;
2725         ut_params->auth_xform.auth.iv.length = auth_iv_len;
2726
2727         /* Setup Cipher Parameters */
2728         ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
2729         ut_params->cipher_xform.next = NULL;
2730         ut_params->cipher_xform.cipher.algo = cipher_algo;
2731         ut_params->cipher_xform.cipher.op = cipher_op;
2732         ut_params->cipher_xform.cipher.key.data = auth_cipher_key;
2733         ut_params->cipher_xform.cipher.key.length = key_len;
2734         ut_params->cipher_xform.cipher.iv.offset = IV_OFFSET;
2735         ut_params->cipher_xform.cipher.iv.length = cipher_iv_len;
2736
2737         debug_hexdump(stdout, "key:", key, key_len);
2738
2739         /* Create Crypto session*/
2740         ut_params->sess = rte_cryptodev_sym_session_create(
2741                         ts_params->session_mpool);
2742         TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed");
2743
2744         if (cipher_op == RTE_CRYPTO_CIPHER_OP_DECRYPT) {
2745                 ut_params->auth_xform.next = NULL;
2746                 ut_params->cipher_xform.next = &ut_params->auth_xform;
2747                 status = rte_cryptodev_sym_session_init(dev_id, ut_params->sess,
2748                                 &ut_params->cipher_xform,
2749                                 ts_params->session_priv_mpool);
2750
2751         } else
2752                 status = rte_cryptodev_sym_session_init(dev_id, ut_params->sess,
2753                                 &ut_params->auth_xform,
2754                                 ts_params->session_priv_mpool);
2755
2756         if (status == -ENOTSUP)
2757                 return TEST_SKIPPED;
2758
2759         TEST_ASSERT_EQUAL(status, 0, "session init failed");
2760
2761         return 0;
2762 }
2763
2764 static int
2765 create_wireless_algo_hash_operation(const uint8_t *auth_tag,
2766                 unsigned int auth_tag_len,
2767                 const uint8_t *iv, unsigned int iv_len,
2768                 unsigned int data_pad_len,
2769                 enum rte_crypto_auth_operation op,
2770                 unsigned int auth_len, unsigned int auth_offset)
2771 {
2772         struct crypto_testsuite_params *ts_params = &testsuite_params;
2773
2774         struct crypto_unittest_params *ut_params = &unittest_params;
2775
2776         /* Generate Crypto op data structure */
2777         ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
2778                         RTE_CRYPTO_OP_TYPE_SYMMETRIC);
2779         TEST_ASSERT_NOT_NULL(ut_params->op,
2780                 "Failed to allocate pktmbuf offload");
2781
2782         /* Set crypto operation data parameters */
2783         rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
2784
2785         struct rte_crypto_sym_op *sym_op = ut_params->op->sym;
2786
2787         /* set crypto operation source mbuf */
2788         sym_op->m_src = ut_params->ibuf;
2789
2790         /* iv */
2791         rte_memcpy(rte_crypto_op_ctod_offset(ut_params->op, uint8_t *, IV_OFFSET),
2792                         iv, iv_len);
2793         /* digest */
2794         sym_op->auth.digest.data = (uint8_t *)rte_pktmbuf_append(
2795                                         ut_params->ibuf, auth_tag_len);
2796
2797         TEST_ASSERT_NOT_NULL(sym_op->auth.digest.data,
2798                                 "no room to append auth tag");
2799         ut_params->digest = sym_op->auth.digest.data;
2800         sym_op->auth.digest.phys_addr = rte_pktmbuf_iova_offset(
2801                         ut_params->ibuf, data_pad_len);
2802         if (op == RTE_CRYPTO_AUTH_OP_GENERATE)
2803                 memset(sym_op->auth.digest.data, 0, auth_tag_len);
2804         else
2805                 rte_memcpy(sym_op->auth.digest.data, auth_tag, auth_tag_len);
2806
2807         debug_hexdump(stdout, "digest:",
2808                 sym_op->auth.digest.data,
2809                 auth_tag_len);
2810
2811         sym_op->auth.data.length = auth_len;
2812         sym_op->auth.data.offset = auth_offset;
2813
2814         return 0;
2815 }
2816
2817 static int
2818 create_wireless_cipher_hash_operation(const struct wireless_test_data *tdata,
2819         enum rte_crypto_auth_operation op)
2820 {
2821         struct crypto_testsuite_params *ts_params = &testsuite_params;
2822         struct crypto_unittest_params *ut_params = &unittest_params;
2823
2824         const uint8_t *auth_tag = tdata->digest.data;
2825         const unsigned int auth_tag_len = tdata->digest.len;
2826         unsigned int plaintext_len = ceil_byte_length(tdata->plaintext.len);
2827         unsigned int data_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16);
2828
2829         const uint8_t *cipher_iv = tdata->cipher_iv.data;
2830         const uint8_t cipher_iv_len = tdata->cipher_iv.len;
2831         const uint8_t *auth_iv = tdata->auth_iv.data;
2832         const uint8_t auth_iv_len = tdata->auth_iv.len;
2833         const unsigned int cipher_len = tdata->validCipherLenInBits.len;
2834         const unsigned int auth_len = tdata->validAuthLenInBits.len;
2835
2836         /* Generate Crypto op data structure */
2837         ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
2838                         RTE_CRYPTO_OP_TYPE_SYMMETRIC);
2839         TEST_ASSERT_NOT_NULL(ut_params->op,
2840                         "Failed to allocate pktmbuf offload");
2841         /* Set crypto operation data parameters */
2842         rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
2843
2844         struct rte_crypto_sym_op *sym_op = ut_params->op->sym;
2845
2846         /* set crypto operation source mbuf */
2847         sym_op->m_src = ut_params->ibuf;
2848
2849         /* digest */
2850         sym_op->auth.digest.data = (uint8_t *)rte_pktmbuf_append(
2851                         ut_params->ibuf, auth_tag_len);
2852
2853         TEST_ASSERT_NOT_NULL(sym_op->auth.digest.data,
2854                         "no room to append auth tag");
2855         ut_params->digest = sym_op->auth.digest.data;
2856         sym_op->auth.digest.phys_addr = rte_pktmbuf_iova_offset(
2857                         ut_params->ibuf, data_pad_len);
2858         if (op == RTE_CRYPTO_AUTH_OP_GENERATE)
2859                 memset(sym_op->auth.digest.data, 0, auth_tag_len);
2860         else
2861                 rte_memcpy(sym_op->auth.digest.data, auth_tag, auth_tag_len);
2862
2863         debug_hexdump(stdout, "digest:",
2864                 sym_op->auth.digest.data,
2865                 auth_tag_len);
2866
2867         /* Copy cipher and auth IVs at the end of the crypto operation */
2868         uint8_t *iv_ptr = rte_crypto_op_ctod_offset(ut_params->op, uint8_t *,
2869                                                 IV_OFFSET);
2870         rte_memcpy(iv_ptr, cipher_iv, cipher_iv_len);
2871         iv_ptr += cipher_iv_len;
2872         rte_memcpy(iv_ptr, auth_iv, auth_iv_len);
2873
2874         sym_op->cipher.data.length = cipher_len;
2875         sym_op->cipher.data.offset = 0;
2876         sym_op->auth.data.length = auth_len;
2877         sym_op->auth.data.offset = 0;
2878
2879         return 0;
2880 }
2881
2882 static int
2883 create_zuc_cipher_hash_generate_operation(
2884                 const struct wireless_test_data *tdata)
2885 {
2886         return create_wireless_cipher_hash_operation(tdata,
2887                 RTE_CRYPTO_AUTH_OP_GENERATE);
2888 }
2889
2890 static int
2891 create_wireless_algo_cipher_hash_operation(const uint8_t *auth_tag,
2892                 const unsigned auth_tag_len,
2893                 const uint8_t *auth_iv, uint8_t auth_iv_len,
2894                 unsigned data_pad_len,
2895                 enum rte_crypto_auth_operation op,
2896                 const uint8_t *cipher_iv, uint8_t cipher_iv_len,
2897                 const unsigned cipher_len, const unsigned cipher_offset,
2898                 const unsigned auth_len, const unsigned auth_offset)
2899 {
2900         struct crypto_testsuite_params *ts_params = &testsuite_params;
2901         struct crypto_unittest_params *ut_params = &unittest_params;
2902
2903         enum rte_crypto_cipher_algorithm cipher_algo =
2904                         ut_params->cipher_xform.cipher.algo;
2905         enum rte_crypto_auth_algorithm auth_algo =
2906                         ut_params->auth_xform.auth.algo;
2907
2908         /* Generate Crypto op data structure */
2909         ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
2910                         RTE_CRYPTO_OP_TYPE_SYMMETRIC);
2911         TEST_ASSERT_NOT_NULL(ut_params->op,
2912                         "Failed to allocate pktmbuf offload");
2913         /* Set crypto operation data parameters */
2914         rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
2915
2916         struct rte_crypto_sym_op *sym_op = ut_params->op->sym;
2917
2918         /* set crypto operation source mbuf */
2919         sym_op->m_src = ut_params->ibuf;
2920
2921         /* digest */
2922         sym_op->auth.digest.data = (uint8_t *)rte_pktmbuf_append(
2923                         ut_params->ibuf, auth_tag_len);
2924
2925         TEST_ASSERT_NOT_NULL(sym_op->auth.digest.data,
2926                         "no room to append auth tag");
2927         ut_params->digest = sym_op->auth.digest.data;
2928
2929         if (rte_pktmbuf_is_contiguous(ut_params->ibuf)) {
2930                 sym_op->auth.digest.phys_addr = rte_pktmbuf_iova_offset(
2931                                 ut_params->ibuf, data_pad_len);
2932         } else {
2933                 struct rte_mbuf *m = ut_params->ibuf;
2934                 unsigned int offset = data_pad_len;
2935
2936                 while (offset > m->data_len && m->next != NULL) {
2937                         offset -= m->data_len;
2938                         m = m->next;
2939                 }
2940                 sym_op->auth.digest.phys_addr = rte_pktmbuf_iova_offset(
2941                         m, offset);
2942         }
2943
2944         if (op == RTE_CRYPTO_AUTH_OP_GENERATE)
2945                 memset(sym_op->auth.digest.data, 0, auth_tag_len);
2946         else
2947                 rte_memcpy(sym_op->auth.digest.data, auth_tag, auth_tag_len);
2948
2949         debug_hexdump(stdout, "digest:",
2950                 sym_op->auth.digest.data,
2951                 auth_tag_len);
2952
2953         /* Copy cipher and auth IVs at the end of the crypto operation */
2954         uint8_t *iv_ptr = rte_crypto_op_ctod_offset(ut_params->op, uint8_t *,
2955                                                 IV_OFFSET);
2956         rte_memcpy(iv_ptr, cipher_iv, cipher_iv_len);
2957         iv_ptr += cipher_iv_len;
2958         rte_memcpy(iv_ptr, auth_iv, auth_iv_len);
2959
2960         if (cipher_algo == RTE_CRYPTO_CIPHER_SNOW3G_UEA2 ||
2961                 cipher_algo == RTE_CRYPTO_CIPHER_KASUMI_F8 ||
2962                 cipher_algo == RTE_CRYPTO_CIPHER_ZUC_EEA3) {
2963                 sym_op->cipher.data.length = cipher_len;
2964                 sym_op->cipher.data.offset = cipher_offset;
2965         } else {
2966                 sym_op->cipher.data.length = cipher_len >> 3;
2967                 sym_op->cipher.data.offset = cipher_offset >> 3;
2968         }
2969
2970         if (auth_algo == RTE_CRYPTO_AUTH_SNOW3G_UIA2 ||
2971                 auth_algo == RTE_CRYPTO_AUTH_KASUMI_F9 ||
2972                 auth_algo == RTE_CRYPTO_AUTH_ZUC_EIA3) {
2973                 sym_op->auth.data.length = auth_len;
2974                 sym_op->auth.data.offset = auth_offset;
2975         } else {
2976                 sym_op->auth.data.length = auth_len >> 3;
2977                 sym_op->auth.data.offset = auth_offset >> 3;
2978         }
2979
2980         return 0;
2981 }
2982
2983 static int
2984 create_wireless_algo_auth_cipher_operation(
2985                 const uint8_t *auth_tag, unsigned int auth_tag_len,
2986                 const uint8_t *cipher_iv, uint8_t cipher_iv_len,
2987                 const uint8_t *auth_iv, uint8_t auth_iv_len,
2988                 unsigned int data_pad_len,
2989                 unsigned int cipher_len, unsigned int cipher_offset,
2990                 unsigned int auth_len, unsigned int auth_offset,
2991                 uint8_t op_mode, uint8_t do_sgl, uint8_t verify)
2992 {
2993         struct crypto_testsuite_params *ts_params = &testsuite_params;
2994         struct crypto_unittest_params *ut_params = &unittest_params;
2995
2996         enum rte_crypto_cipher_algorithm cipher_algo =
2997                         ut_params->cipher_xform.cipher.algo;
2998         enum rte_crypto_auth_algorithm auth_algo =
2999                         ut_params->auth_xform.auth.algo;
3000
3001         /* Generate Crypto op data structure */
3002         ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
3003                         RTE_CRYPTO_OP_TYPE_SYMMETRIC);
3004         TEST_ASSERT_NOT_NULL(ut_params->op,
3005                         "Failed to allocate pktmbuf offload");
3006
3007         /* Set crypto operation data parameters */
3008         rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
3009
3010         struct rte_crypto_sym_op *sym_op = ut_params->op->sym;
3011
3012         /* set crypto operation mbufs */
3013         sym_op->m_src = ut_params->ibuf;
3014         if (op_mode == OUT_OF_PLACE)
3015                 sym_op->m_dst = ut_params->obuf;
3016
3017         /* digest */
3018         if (!do_sgl) {
3019                 sym_op->auth.digest.data = rte_pktmbuf_mtod_offset(
3020                         (op_mode == IN_PLACE ?
3021                                 ut_params->ibuf : ut_params->obuf),
3022                         uint8_t *, data_pad_len);
3023                 sym_op->auth.digest.phys_addr = rte_pktmbuf_iova_offset(
3024                         (op_mode == IN_PLACE ?
3025                                 ut_params->ibuf : ut_params->obuf),
3026                         data_pad_len);
3027                 memset(sym_op->auth.digest.data, 0, auth_tag_len);
3028         } else {
3029                 uint16_t remaining_off = (auth_offset >> 3) + (auth_len >> 3);
3030                 struct rte_mbuf *sgl_buf = (op_mode == IN_PLACE ?
3031                                 sym_op->m_src : sym_op->m_dst);
3032                 while (remaining_off >= rte_pktmbuf_data_len(sgl_buf)) {
3033                         remaining_off -= rte_pktmbuf_data_len(sgl_buf);
3034                         sgl_buf = sgl_buf->next;
3035                 }
3036                 sym_op->auth.digest.data = rte_pktmbuf_mtod_offset(sgl_buf,
3037                                 uint8_t *, remaining_off);
3038                 sym_op->auth.digest.phys_addr = rte_pktmbuf_iova_offset(sgl_buf,
3039                                 remaining_off);
3040                 memset(sym_op->auth.digest.data, 0, remaining_off);
3041                 while (sgl_buf->next != NULL) {
3042                         memset(rte_pktmbuf_mtod(sgl_buf, uint8_t *),
3043                                 0, rte_pktmbuf_data_len(sgl_buf));
3044                         sgl_buf = sgl_buf->next;
3045                 }
3046         }
3047
3048         /* Copy digest for the verification */
3049         if (verify)
3050                 memcpy(sym_op->auth.digest.data, auth_tag, auth_tag_len);
3051
3052         /* Copy cipher and auth IVs at the end of the crypto operation */
3053         uint8_t *iv_ptr = rte_crypto_op_ctod_offset(
3054                         ut_params->op, uint8_t *, IV_OFFSET);
3055
3056         rte_memcpy(iv_ptr, cipher_iv, cipher_iv_len);
3057         iv_ptr += cipher_iv_len;
3058         rte_memcpy(iv_ptr, auth_iv, auth_iv_len);
3059
3060         /* Only copy over the offset data needed from src to dst in OOP,
3061          * if the auth and cipher offsets are not aligned
3062          */
3063         if (op_mode == OUT_OF_PLACE) {
3064                 if (cipher_offset > auth_offset)
3065                         rte_memcpy(
3066                                 rte_pktmbuf_mtod_offset(
3067                                         sym_op->m_dst,
3068                                         uint8_t *, auth_offset >> 3),
3069                                 rte_pktmbuf_mtod_offset(
3070                                         sym_op->m_src,
3071                                         uint8_t *, auth_offset >> 3),
3072                                 ((cipher_offset >> 3) - (auth_offset >> 3)));
3073         }
3074
3075         if (cipher_algo == RTE_CRYPTO_CIPHER_SNOW3G_UEA2 ||
3076                 cipher_algo == RTE_CRYPTO_CIPHER_KASUMI_F8 ||
3077                 cipher_algo == RTE_CRYPTO_CIPHER_ZUC_EEA3) {
3078                 sym_op->cipher.data.length = cipher_len;
3079                 sym_op->cipher.data.offset = cipher_offset;
3080         } else {
3081                 sym_op->cipher.data.length = cipher_len >> 3;
3082                 sym_op->cipher.data.offset = cipher_offset >> 3;
3083         }
3084
3085         if (auth_algo == RTE_CRYPTO_AUTH_SNOW3G_UIA2 ||
3086                 auth_algo == RTE_CRYPTO_AUTH_KASUMI_F9 ||
3087                 auth_algo == RTE_CRYPTO_AUTH_ZUC_EIA3) {
3088                 sym_op->auth.data.length = auth_len;
3089                 sym_op->auth.data.offset = auth_offset;
3090         } else {
3091                 sym_op->auth.data.length = auth_len >> 3;
3092                 sym_op->auth.data.offset = auth_offset >> 3;
3093         }
3094
3095         return 0;
3096 }
3097
3098 static int
3099 test_snow3g_authentication(const struct snow3g_hash_test_data *tdata)
3100 {
3101         struct crypto_testsuite_params *ts_params = &testsuite_params;
3102         struct crypto_unittest_params *ut_params = &unittest_params;
3103
3104         int retval;
3105         unsigned plaintext_pad_len;
3106         unsigned plaintext_len;
3107         uint8_t *plaintext;
3108         struct rte_cryptodev_info dev_info;
3109
3110         rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
3111         uint64_t feat_flags = dev_info.feature_flags;
3112
3113         if (!(feat_flags & RTE_CRYPTODEV_FF_NON_BYTE_ALIGNED_DATA) &&
3114                         ((tdata->validAuthLenInBits.len % 8) != 0)) {
3115                 printf("Device doesn't support NON-Byte Aligned Data.\n");
3116                 return TEST_SKIPPED;
3117         }
3118
3119         if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
3120                         (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
3121                 printf("Device doesn't support RAW data-path APIs.\n");
3122                 return TEST_SKIPPED;
3123         }
3124
3125         if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
3126                 return TEST_SKIPPED;
3127
3128         /* Verify the capabilities */
3129         struct rte_cryptodev_sym_capability_idx cap_idx;
3130         cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
3131         cap_idx.algo.auth = RTE_CRYPTO_AUTH_SNOW3G_UIA2;
3132         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
3133                         &cap_idx) == NULL)
3134                 return TEST_SKIPPED;
3135
3136         /* Create SNOW 3G session */
3137         retval = create_wireless_algo_hash_session(ts_params->valid_devs[0],
3138                         tdata->key.data, tdata->key.len,
3139                         tdata->auth_iv.len, tdata->digest.len,
3140                         RTE_CRYPTO_AUTH_OP_GENERATE,
3141                         RTE_CRYPTO_AUTH_SNOW3G_UIA2);
3142         if (retval < 0)
3143                 return retval;
3144
3145         /* alloc mbuf and set payload */
3146         ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
3147
3148         memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
3149         rte_pktmbuf_tailroom(ut_params->ibuf));
3150
3151         plaintext_len = ceil_byte_length(tdata->plaintext.len);
3152         /* Append data which is padded to a multiple of */
3153         /* the algorithms block size */
3154         plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16);
3155         plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
3156                                 plaintext_pad_len);
3157         memcpy(plaintext, tdata->plaintext.data, plaintext_len);
3158
3159         /* Create SNOW 3G operation */
3160         retval = create_wireless_algo_hash_operation(NULL, tdata->digest.len,
3161                         tdata->auth_iv.data, tdata->auth_iv.len,
3162                         plaintext_pad_len, RTE_CRYPTO_AUTH_OP_GENERATE,
3163                         tdata->validAuthLenInBits.len,
3164                         0);
3165         if (retval < 0)
3166                 return retval;
3167
3168         if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
3169                 process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
3170                                 ut_params->op, 0, 1, 1, 0);
3171         else
3172                 ut_params->op = process_crypto_request(ts_params->valid_devs[0],
3173                                 ut_params->op);
3174         ut_params->obuf = ut_params->op->sym->m_src;
3175         TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
3176         ut_params->digest = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *)
3177                         + plaintext_pad_len;
3178
3179         /* Validate obuf */
3180         TEST_ASSERT_BUFFERS_ARE_EQUAL(
3181         ut_params->digest,
3182         tdata->digest.data,
3183         DIGEST_BYTE_LENGTH_SNOW3G_UIA2,
3184         "SNOW 3G Generated auth tag not as expected");
3185
3186         return 0;
3187 }
3188
3189 static int
3190 test_snow3g_authentication_verify(const struct snow3g_hash_test_data *tdata)
3191 {
3192         struct crypto_testsuite_params *ts_params = &testsuite_params;
3193         struct crypto_unittest_params *ut_params = &unittest_params;
3194
3195         int retval;
3196         unsigned plaintext_pad_len;
3197         unsigned plaintext_len;
3198         uint8_t *plaintext;
3199         struct rte_cryptodev_info dev_info;
3200
3201         rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
3202         uint64_t feat_flags = dev_info.feature_flags;
3203
3204         if (!(feat_flags & RTE_CRYPTODEV_FF_NON_BYTE_ALIGNED_DATA) &&
3205                         ((tdata->validAuthLenInBits.len % 8) != 0)) {
3206                 printf("Device doesn't support NON-Byte Aligned Data.\n");
3207                 return TEST_SKIPPED;
3208         }
3209
3210         if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
3211                         (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
3212                 printf("Device doesn't support RAW data-path APIs.\n");
3213                 return TEST_SKIPPED;
3214         }
3215
3216         if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
3217                 return TEST_SKIPPED;
3218
3219         /* Verify the capabilities */
3220         struct rte_cryptodev_sym_capability_idx cap_idx;
3221         cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
3222         cap_idx.algo.auth = RTE_CRYPTO_AUTH_SNOW3G_UIA2;
3223         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
3224                         &cap_idx) == NULL)
3225                 return TEST_SKIPPED;
3226
3227         /* Create SNOW 3G session */
3228         retval = create_wireless_algo_hash_session(ts_params->valid_devs[0],
3229                                 tdata->key.data, tdata->key.len,
3230                                 tdata->auth_iv.len, tdata->digest.len,
3231                                 RTE_CRYPTO_AUTH_OP_VERIFY,
3232                                 RTE_CRYPTO_AUTH_SNOW3G_UIA2);
3233         if (retval < 0)
3234                 return retval;
3235         /* alloc mbuf and set payload */
3236         ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
3237
3238         memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
3239         rte_pktmbuf_tailroom(ut_params->ibuf));
3240
3241         plaintext_len = ceil_byte_length(tdata->plaintext.len);
3242         /* Append data which is padded to a multiple of */
3243         /* the algorithms block size */
3244         plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16);
3245         plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
3246                                 plaintext_pad_len);
3247         memcpy(plaintext, tdata->plaintext.data, plaintext_len);
3248
3249         /* Create SNOW 3G operation */
3250         retval = create_wireless_algo_hash_operation(tdata->digest.data,
3251                         tdata->digest.len,
3252                         tdata->auth_iv.data, tdata->auth_iv.len,
3253                         plaintext_pad_len,
3254                         RTE_CRYPTO_AUTH_OP_VERIFY,
3255                         tdata->validAuthLenInBits.len,
3256                         0);
3257         if (retval < 0)
3258                 return retval;
3259
3260         if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
3261                 process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
3262                                 ut_params->op, 0, 1, 1, 0);
3263         else
3264                 ut_params->op = process_crypto_request(ts_params->valid_devs[0],
3265                                 ut_params->op);
3266         TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
3267         ut_params->obuf = ut_params->op->sym->m_src;
3268         ut_params->digest = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *)
3269                                 + plaintext_pad_len;
3270
3271         /* Validate obuf */
3272         if (ut_params->op->status == RTE_CRYPTO_OP_STATUS_SUCCESS)
3273                 return 0;
3274         else
3275                 return -1;
3276
3277         return 0;
3278 }
3279
3280 static int
3281 test_kasumi_authentication(const struct kasumi_hash_test_data *tdata)
3282 {
3283         struct crypto_testsuite_params *ts_params = &testsuite_params;
3284         struct crypto_unittest_params *ut_params = &unittest_params;
3285
3286         int retval;
3287         unsigned plaintext_pad_len;
3288         unsigned plaintext_len;
3289         uint8_t *plaintext;
3290         struct rte_cryptodev_info dev_info;
3291
3292         rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
3293         uint64_t feat_flags = dev_info.feature_flags;
3294
3295         if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
3296                         (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
3297                 printf("Device doesn't support RAW data-path APIs.\n");
3298                 return TEST_SKIPPED;
3299         }
3300
3301         if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
3302                 return TEST_SKIPPED;
3303
3304         /* Verify the capabilities */
3305         struct rte_cryptodev_sym_capability_idx cap_idx;
3306         cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
3307         cap_idx.algo.auth = RTE_CRYPTO_AUTH_KASUMI_F9;
3308         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
3309                         &cap_idx) == NULL)
3310                 return TEST_SKIPPED;
3311
3312         /* Create KASUMI session */
3313         retval = create_wireless_algo_hash_session(ts_params->valid_devs[0],
3314                         tdata->key.data, tdata->key.len,
3315                         0, tdata->digest.len,
3316                         RTE_CRYPTO_AUTH_OP_GENERATE,
3317                         RTE_CRYPTO_AUTH_KASUMI_F9);
3318         if (retval < 0)
3319                 return retval;
3320
3321         /* alloc mbuf and set payload */
3322         ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
3323
3324         memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
3325         rte_pktmbuf_tailroom(ut_params->ibuf));
3326
3327         plaintext_len = ceil_byte_length(tdata->plaintext.len);
3328         /* Append data which is padded to a multiple of */
3329         /* the algorithms block size */
3330         plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 8);
3331         plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
3332                                 plaintext_pad_len);
3333         memcpy(plaintext, tdata->plaintext.data, plaintext_len);
3334
3335         /* Create KASUMI operation */
3336         retval = create_wireless_algo_hash_operation(NULL, tdata->digest.len,
3337                         NULL, 0,
3338                         plaintext_pad_len, RTE_CRYPTO_AUTH_OP_GENERATE,
3339                         tdata->plaintext.len,
3340                         0);
3341         if (retval < 0)
3342                 return retval;
3343
3344         if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
3345                 process_cpu_crypt_auth_op(ts_params->valid_devs[0],
3346                         ut_params->op);
3347         else if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
3348                 process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
3349                                 ut_params->op, 0, 1, 1, 0);
3350         else
3351                 ut_params->op = process_crypto_request(ts_params->valid_devs[0],
3352                         ut_params->op);
3353
3354         ut_params->obuf = ut_params->op->sym->m_src;
3355         TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
3356         ut_params->digest = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *)
3357                         + plaintext_pad_len;
3358
3359         /* Validate obuf */
3360         TEST_ASSERT_BUFFERS_ARE_EQUAL(
3361         ut_params->digest,
3362         tdata->digest.data,
3363         DIGEST_BYTE_LENGTH_KASUMI_F9,
3364         "KASUMI Generated auth tag not as expected");
3365
3366         return 0;
3367 }
3368
3369 static int
3370 test_kasumi_authentication_verify(const struct kasumi_hash_test_data *tdata)
3371 {
3372         struct crypto_testsuite_params *ts_params = &testsuite_params;
3373         struct crypto_unittest_params *ut_params = &unittest_params;
3374
3375         int retval;
3376         unsigned plaintext_pad_len;
3377         unsigned plaintext_len;
3378         uint8_t *plaintext;
3379         struct rte_cryptodev_info dev_info;
3380
3381         rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
3382         uint64_t feat_flags = dev_info.feature_flags;
3383
3384         if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
3385                         (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
3386                 printf("Device doesn't support RAW data-path APIs.\n");
3387                 return TEST_SKIPPED;
3388         }
3389
3390         if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
3391                 return TEST_SKIPPED;
3392
3393         /* Verify the capabilities */
3394         struct rte_cryptodev_sym_capability_idx cap_idx;
3395         cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
3396         cap_idx.algo.auth = RTE_CRYPTO_AUTH_KASUMI_F9;
3397         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
3398                         &cap_idx) == NULL)
3399                 return TEST_SKIPPED;
3400
3401         /* Create KASUMI session */
3402         retval = create_wireless_algo_hash_session(ts_params->valid_devs[0],
3403                                 tdata->key.data, tdata->key.len,
3404                                 0, tdata->digest.len,
3405                                 RTE_CRYPTO_AUTH_OP_VERIFY,
3406                                 RTE_CRYPTO_AUTH_KASUMI_F9);
3407         if (retval < 0)
3408                 return retval;
3409         /* alloc mbuf and set payload */
3410         ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
3411
3412         memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
3413         rte_pktmbuf_tailroom(ut_params->ibuf));
3414
3415         plaintext_len = ceil_byte_length(tdata->plaintext.len);
3416         /* Append data which is padded to a multiple */
3417         /* of the algorithms block size */
3418         plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 8);
3419         plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
3420                                 plaintext_pad_len);
3421         memcpy(plaintext, tdata->plaintext.data, plaintext_len);
3422
3423         /* Create KASUMI operation */
3424         retval = create_wireless_algo_hash_operation(tdata->digest.data,
3425                         tdata->digest.len,
3426                         NULL, 0,
3427                         plaintext_pad_len,
3428                         RTE_CRYPTO_AUTH_OP_VERIFY,
3429                         tdata->plaintext.len,
3430                         0);
3431         if (retval < 0)
3432                 return retval;
3433
3434         if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
3435                 process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
3436                                 ut_params->op, 0, 1, 1, 0);
3437         else
3438                 ut_params->op = process_crypto_request(ts_params->valid_devs[0],
3439                                 ut_params->op);
3440         TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
3441         ut_params->obuf = ut_params->op->sym->m_src;
3442         ut_params->digest = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *)
3443                                 + plaintext_pad_len;
3444
3445         /* Validate obuf */
3446         if (ut_params->op->status == RTE_CRYPTO_OP_STATUS_SUCCESS)
3447                 return 0;
3448         else
3449                 return -1;
3450
3451         return 0;
3452 }
3453
3454 static int
3455 test_snow3g_hash_generate_test_case_1(void)
3456 {
3457         return test_snow3g_authentication(&snow3g_hash_test_case_1);
3458 }
3459
3460 static int
3461 test_snow3g_hash_generate_test_case_2(void)
3462 {
3463         return test_snow3g_authentication(&snow3g_hash_test_case_2);
3464 }
3465
3466 static int
3467 test_snow3g_hash_generate_test_case_3(void)
3468 {
3469         return test_snow3g_authentication(&snow3g_hash_test_case_3);
3470 }
3471
3472 static int
3473 test_snow3g_hash_generate_test_case_4(void)
3474 {
3475         return test_snow3g_authentication(&snow3g_hash_test_case_4);
3476 }
3477
3478 static int
3479 test_snow3g_hash_generate_test_case_5(void)
3480 {
3481         return test_snow3g_authentication(&snow3g_hash_test_case_5);
3482 }
3483
3484 static int
3485 test_snow3g_hash_generate_test_case_6(void)
3486 {
3487         return test_snow3g_authentication(&snow3g_hash_test_case_6);
3488 }
3489
3490 static int
3491 test_snow3g_hash_verify_test_case_1(void)
3492 {
3493         return test_snow3g_authentication_verify(&snow3g_hash_test_case_1);
3494
3495 }
3496
3497 static int
3498 test_snow3g_hash_verify_test_case_2(void)
3499 {
3500         return test_snow3g_authentication_verify(&snow3g_hash_test_case_2);
3501 }
3502
3503 static int
3504 test_snow3g_hash_verify_test_case_3(void)
3505 {
3506         return test_snow3g_authentication_verify(&snow3g_hash_test_case_3);
3507 }
3508
3509 static int
3510 test_snow3g_hash_verify_test_case_4(void)
3511 {
3512         return test_snow3g_authentication_verify(&snow3g_hash_test_case_4);
3513 }
3514
3515 static int
3516 test_snow3g_hash_verify_test_case_5(void)
3517 {
3518         return test_snow3g_authentication_verify(&snow3g_hash_test_case_5);
3519 }
3520
3521 static int
3522 test_snow3g_hash_verify_test_case_6(void)
3523 {
3524         return test_snow3g_authentication_verify(&snow3g_hash_test_case_6);
3525 }
3526
3527 static int
3528 test_kasumi_hash_generate_test_case_1(void)
3529 {
3530         return test_kasumi_authentication(&kasumi_hash_test_case_1);
3531 }
3532
3533 static int
3534 test_kasumi_hash_generate_test_case_2(void)
3535 {
3536         return test_kasumi_authentication(&kasumi_hash_test_case_2);
3537 }
3538
3539 static int
3540 test_kasumi_hash_generate_test_case_3(void)
3541 {
3542         return test_kasumi_authentication(&kasumi_hash_test_case_3);
3543 }
3544
3545 static int
3546 test_kasumi_hash_generate_test_case_4(void)
3547 {
3548         return test_kasumi_authentication(&kasumi_hash_test_case_4);
3549 }
3550
3551 static int
3552 test_kasumi_hash_generate_test_case_5(void)
3553 {
3554         return test_kasumi_authentication(&kasumi_hash_test_case_5);
3555 }
3556
3557 static int
3558 test_kasumi_hash_generate_test_case_6(void)
3559 {
3560         return test_kasumi_authentication(&kasumi_hash_test_case_6);
3561 }
3562
3563 static int
3564 test_kasumi_hash_verify_test_case_1(void)
3565 {
3566         return test_kasumi_authentication_verify(&kasumi_hash_test_case_1);
3567 }
3568
3569 static int
3570 test_kasumi_hash_verify_test_case_2(void)
3571 {
3572         return test_kasumi_authentication_verify(&kasumi_hash_test_case_2);
3573 }
3574
3575 static int
3576 test_kasumi_hash_verify_test_case_3(void)
3577 {
3578         return test_kasumi_authentication_verify(&kasumi_hash_test_case_3);
3579 }
3580
3581 static int
3582 test_kasumi_hash_verify_test_case_4(void)
3583 {
3584         return test_kasumi_authentication_verify(&kasumi_hash_test_case_4);
3585 }
3586
3587 static int
3588 test_kasumi_hash_verify_test_case_5(void)
3589 {
3590         return test_kasumi_authentication_verify(&kasumi_hash_test_case_5);
3591 }
3592
3593 static int
3594 test_kasumi_encryption(const struct kasumi_test_data *tdata)
3595 {
3596         struct crypto_testsuite_params *ts_params = &testsuite_params;
3597         struct crypto_unittest_params *ut_params = &unittest_params;
3598
3599         int retval;
3600         uint8_t *plaintext, *ciphertext;
3601         unsigned plaintext_pad_len;
3602         unsigned plaintext_len;
3603         struct rte_cryptodev_info dev_info;
3604
3605         rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
3606         uint64_t feat_flags = dev_info.feature_flags;
3607
3608         if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
3609                         (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
3610                 printf("Device doesn't support RAW data-path APIs.\n");
3611                 return TEST_SKIPPED;
3612         }
3613
3614         if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
3615                 return TEST_SKIPPED;
3616
3617         /* Verify the capabilities */
3618         struct rte_cryptodev_sym_capability_idx cap_idx;
3619         cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
3620         cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_KASUMI_F8;
3621         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
3622                         &cap_idx) == NULL)
3623                 return TEST_SKIPPED;
3624
3625         /* Create KASUMI session */
3626         retval = create_wireless_algo_cipher_session(ts_params->valid_devs[0],
3627                                         RTE_CRYPTO_CIPHER_OP_ENCRYPT,
3628                                         RTE_CRYPTO_CIPHER_KASUMI_F8,
3629                                         tdata->key.data, tdata->key.len,
3630                                         tdata->cipher_iv.len);
3631         if (retval < 0)
3632                 return retval;
3633
3634         ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
3635
3636         /* Clear mbuf payload */
3637         memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
3638                rte_pktmbuf_tailroom(ut_params->ibuf));
3639
3640         plaintext_len = ceil_byte_length(tdata->plaintext.len);
3641         /* Append data which is padded to a multiple */
3642         /* of the algorithms block size */
3643         plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 8);
3644         plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
3645                                 plaintext_pad_len);
3646         memcpy(plaintext, tdata->plaintext.data, plaintext_len);
3647
3648         debug_hexdump(stdout, "plaintext:", plaintext, plaintext_len);
3649
3650         /* Create KASUMI operation */
3651         retval = create_wireless_algo_cipher_operation(tdata->cipher_iv.data,
3652                                 tdata->cipher_iv.len,
3653                                 RTE_ALIGN_CEIL(tdata->validCipherLenInBits.len, 8),
3654                                 tdata->validCipherOffsetInBits.len);
3655         if (retval < 0)
3656                 return retval;
3657
3658         if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
3659                 process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
3660                                 ut_params->op, 1, 0, 1, tdata->cipher_iv.len);
3661         else
3662                 ut_params->op = process_crypto_request(ts_params->valid_devs[0],
3663                                 ut_params->op);
3664         TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
3665
3666         ut_params->obuf = ut_params->op->sym->m_dst;
3667         if (ut_params->obuf)
3668                 ciphertext = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *);
3669         else
3670                 ciphertext = plaintext + (tdata->validCipherOffsetInBits.len >> 3);
3671
3672         debug_hexdump(stdout, "ciphertext:", ciphertext, plaintext_len);
3673
3674         const uint8_t *reference_ciphertext = tdata->ciphertext.data +
3675                                 (tdata->validCipherOffsetInBits.len >> 3);
3676         /* Validate obuf */
3677         TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
3678                 ciphertext,
3679                 reference_ciphertext,
3680                 tdata->validCipherLenInBits.len,
3681                 "KASUMI Ciphertext data not as expected");
3682         return 0;
3683 }
3684
3685 static int
3686 test_kasumi_encryption_sgl(const struct kasumi_test_data *tdata)
3687 {
3688         struct crypto_testsuite_params *ts_params = &testsuite_params;
3689         struct crypto_unittest_params *ut_params = &unittest_params;
3690
3691         int retval;
3692
3693         unsigned int plaintext_pad_len;
3694         unsigned int plaintext_len;
3695
3696         uint8_t buffer[10000];
3697         const uint8_t *ciphertext;
3698
3699         struct rte_cryptodev_info dev_info;
3700
3701         /* Verify the capabilities */
3702         struct rte_cryptodev_sym_capability_idx cap_idx;
3703         cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
3704         cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_KASUMI_F8;
3705         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
3706                         &cap_idx) == NULL)
3707                 return TEST_SKIPPED;
3708
3709         rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
3710
3711         uint64_t feat_flags = dev_info.feature_flags;
3712
3713         if (!(feat_flags & RTE_CRYPTODEV_FF_IN_PLACE_SGL)) {
3714                 printf("Device doesn't support in-place scatter-gather. "
3715                                 "Test Skipped.\n");
3716                 return TEST_SKIPPED;
3717         }
3718
3719         if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
3720                         (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
3721                 printf("Device doesn't support RAW data-path APIs.\n");
3722                 return TEST_SKIPPED;
3723         }
3724
3725         if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
3726                 return TEST_SKIPPED;
3727
3728         /* Create KASUMI session */
3729         retval = create_wireless_algo_cipher_session(ts_params->valid_devs[0],
3730                                         RTE_CRYPTO_CIPHER_OP_ENCRYPT,
3731                                         RTE_CRYPTO_CIPHER_KASUMI_F8,
3732                                         tdata->key.data, tdata->key.len,
3733                                         tdata->cipher_iv.len);
3734         if (retval < 0)
3735                 return retval;
3736
3737         plaintext_len = ceil_byte_length(tdata->plaintext.len);
3738
3739
3740         /* Append data which is padded to a multiple */
3741         /* of the algorithms block size */
3742         plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 8);
3743
3744         ut_params->ibuf = create_segmented_mbuf(ts_params->mbuf_pool,
3745                         plaintext_pad_len, 10, 0);
3746
3747         pktmbuf_write(ut_params->ibuf, 0, plaintext_len, tdata->plaintext.data);
3748
3749         /* Create KASUMI operation */
3750         retval = create_wireless_algo_cipher_operation(tdata->cipher_iv.data,
3751                                 tdata->cipher_iv.len,
3752                                 RTE_ALIGN_CEIL(tdata->validCipherLenInBits.len, 8),
3753                                 tdata->validCipherOffsetInBits.len);
3754         if (retval < 0)
3755                 return retval;
3756
3757         if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
3758                 process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
3759                                 ut_params->op, 1, 0, 1, tdata->cipher_iv.len);
3760         else
3761                 ut_params->op = process_crypto_request(ts_params->valid_devs[0],
3762                                                 ut_params->op);
3763         TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
3764
3765         ut_params->obuf = ut_params->op->sym->m_dst;
3766
3767         if (ut_params->obuf)
3768                 ciphertext = rte_pktmbuf_read(ut_params->obuf, 0,
3769                                 plaintext_len, buffer);
3770         else
3771                 ciphertext = rte_pktmbuf_read(ut_params->ibuf,
3772                                 tdata->validCipherOffsetInBits.len >> 3,
3773                                 plaintext_len, buffer);
3774
3775         /* Validate obuf */
3776         debug_hexdump(stdout, "ciphertext:", ciphertext, plaintext_len);
3777
3778         const uint8_t *reference_ciphertext = tdata->ciphertext.data +
3779                                 (tdata->validCipherOffsetInBits.len >> 3);
3780         /* Validate obuf */
3781         TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
3782                 ciphertext,
3783                 reference_ciphertext,
3784                 tdata->validCipherLenInBits.len,
3785                 "KASUMI Ciphertext data not as expected");
3786         return 0;
3787 }
3788
3789 static int
3790 test_kasumi_encryption_oop(const struct kasumi_test_data *tdata)
3791 {
3792         struct crypto_testsuite_params *ts_params = &testsuite_params;
3793         struct crypto_unittest_params *ut_params = &unittest_params;
3794
3795         int retval;
3796         uint8_t *plaintext, *ciphertext;
3797         unsigned plaintext_pad_len;
3798         unsigned plaintext_len;
3799
3800         /* Verify the capabilities */
3801         struct rte_cryptodev_sym_capability_idx cap_idx;
3802         cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
3803         cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_KASUMI_F8;
3804         /* Data-path service does not support OOP */
3805         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
3806                         &cap_idx) == NULL)
3807                 return TEST_SKIPPED;
3808
3809         if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
3810                 return TEST_SKIPPED;
3811
3812         if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
3813                 return TEST_SKIPPED;
3814
3815         /* Create KASUMI session */
3816         retval = create_wireless_algo_cipher_session(ts_params->valid_devs[0],
3817                                         RTE_CRYPTO_CIPHER_OP_ENCRYPT,
3818                                         RTE_CRYPTO_CIPHER_KASUMI_F8,
3819                                         tdata->key.data, tdata->key.len,
3820                                         tdata->cipher_iv.len);
3821         if (retval < 0)
3822                 return retval;
3823
3824         ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
3825         ut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
3826
3827         /* Clear mbuf payload */
3828         memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
3829                rte_pktmbuf_tailroom(ut_params->ibuf));
3830
3831         plaintext_len = ceil_byte_length(tdata->plaintext.len);
3832         /* Append data which is padded to a multiple */
3833         /* of the algorithms block size */
3834         plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 8);
3835         plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
3836                                 plaintext_pad_len);
3837         rte_pktmbuf_append(ut_params->obuf, plaintext_pad_len);
3838         memcpy(plaintext, tdata->plaintext.data, plaintext_len);
3839
3840         debug_hexdump(stdout, "plaintext:", plaintext, plaintext_len);
3841
3842         /* Create KASUMI operation */
3843         retval = create_wireless_algo_cipher_operation_oop(tdata->cipher_iv.data,
3844                                 tdata->cipher_iv.len,
3845                                 RTE_ALIGN_CEIL(tdata->validCipherLenInBits.len, 8),
3846                                 tdata->validCipherOffsetInBits.len);
3847         if (retval < 0)
3848                 return retval;
3849
3850         ut_params->op = process_crypto_request(ts_params->valid_devs[0],
3851                                                 ut_params->op);
3852         TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
3853
3854         ut_params->obuf = ut_params->op->sym->m_dst;
3855         if (ut_params->obuf)
3856                 ciphertext = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *);
3857         else
3858                 ciphertext = plaintext + (tdata->validCipherOffsetInBits.len >> 3);
3859
3860         debug_hexdump(stdout, "ciphertext:", ciphertext, plaintext_len);
3861
3862         const uint8_t *reference_ciphertext = tdata->ciphertext.data +
3863                                 (tdata->validCipherOffsetInBits.len >> 3);
3864         /* Validate obuf */
3865         TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
3866                 ciphertext,
3867                 reference_ciphertext,
3868                 tdata->validCipherLenInBits.len,
3869                 "KASUMI Ciphertext data not as expected");
3870         return 0;
3871 }
3872
3873 static int
3874 test_kasumi_encryption_oop_sgl(const struct kasumi_test_data *tdata)
3875 {
3876         struct crypto_testsuite_params *ts_params = &testsuite_params;
3877         struct crypto_unittest_params *ut_params = &unittest_params;
3878
3879         int retval;
3880         unsigned int plaintext_pad_len;
3881         unsigned int plaintext_len;
3882
3883         const uint8_t *ciphertext;
3884         uint8_t buffer[2048];
3885
3886         struct rte_cryptodev_info dev_info;
3887
3888         /* Verify the capabilities */
3889         struct rte_cryptodev_sym_capability_idx cap_idx;
3890         cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
3891         cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_KASUMI_F8;
3892         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
3893                         &cap_idx) == NULL)
3894                 return TEST_SKIPPED;
3895
3896         if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
3897                 return TEST_SKIPPED;
3898
3899         if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
3900                 return TEST_SKIPPED;
3901
3902         rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
3903
3904         uint64_t feat_flags = dev_info.feature_flags;
3905         if (!(feat_flags & RTE_CRYPTODEV_FF_OOP_SGL_IN_SGL_OUT)) {
3906                 printf("Device doesn't support out-of-place scatter-gather "
3907                                 "in both input and output mbufs. "
3908                                 "Test Skipped.\n");
3909                 return TEST_SKIPPED;
3910         }
3911
3912         /* Create KASUMI session */
3913         retval = create_wireless_algo_cipher_session(ts_params->valid_devs[0],
3914                                         RTE_CRYPTO_CIPHER_OP_ENCRYPT,
3915                                         RTE_CRYPTO_CIPHER_KASUMI_F8,
3916                                         tdata->key.data, tdata->key.len,
3917                                         tdata->cipher_iv.len);
3918         if (retval < 0)
3919                 return retval;
3920
3921         plaintext_len = ceil_byte_length(tdata->plaintext.len);
3922         /* Append data which is padded to a multiple */
3923         /* of the algorithms block size */
3924         plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 8);
3925
3926         ut_params->ibuf = create_segmented_mbuf(ts_params->mbuf_pool,
3927                         plaintext_pad_len, 10, 0);
3928         ut_params->obuf = create_segmented_mbuf(ts_params->mbuf_pool,
3929                         plaintext_pad_len, 3, 0);
3930
3931         /* Append data which is padded to a multiple */
3932         /* of the algorithms block size */
3933         pktmbuf_write(ut_params->ibuf, 0, plaintext_len, tdata->plaintext.data);
3934
3935         /* Create KASUMI operation */
3936         retval = create_wireless_algo_cipher_operation_oop(tdata->cipher_iv.data,
3937                                 tdata->cipher_iv.len,
3938                                 RTE_ALIGN_CEIL(tdata->validCipherLenInBits.len, 8),
3939                                 tdata->validCipherOffsetInBits.len);
3940         if (retval < 0)
3941                 return retval;
3942
3943         ut_params->op = process_crypto_request(ts_params->valid_devs[0],
3944                                                 ut_params->op);
3945         TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
3946
3947         ut_params->obuf = ut_params->op->sym->m_dst;
3948         if (ut_params->obuf)
3949                 ciphertext = rte_pktmbuf_read(ut_params->obuf, 0,
3950                                 plaintext_pad_len, buffer);
3951         else
3952                 ciphertext = rte_pktmbuf_read(ut_params->ibuf,
3953                                 tdata->validCipherOffsetInBits.len >> 3,
3954                                 plaintext_pad_len, buffer);
3955
3956         const uint8_t *reference_ciphertext = tdata->ciphertext.data +
3957                                 (tdata->validCipherOffsetInBits.len >> 3);
3958         /* Validate obuf */
3959         TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
3960                 ciphertext,
3961                 reference_ciphertext,
3962                 tdata->validCipherLenInBits.len,
3963                 "KASUMI Ciphertext data not as expected");
3964         return 0;
3965 }
3966
3967
3968 static int
3969 test_kasumi_decryption_oop(const struct kasumi_test_data *tdata)
3970 {
3971         struct crypto_testsuite_params *ts_params = &testsuite_params;
3972         struct crypto_unittest_params *ut_params = &unittest_params;
3973
3974         int retval;
3975         uint8_t *ciphertext, *plaintext;
3976         unsigned ciphertext_pad_len;
3977         unsigned ciphertext_len;
3978
3979         /* Verify the capabilities */
3980         struct rte_cryptodev_sym_capability_idx cap_idx;
3981         cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
3982         cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_KASUMI_F8;
3983         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
3984                         &cap_idx) == NULL)
3985                 return TEST_SKIPPED;
3986
3987         if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
3988                 return TEST_SKIPPED;
3989
3990         if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
3991                 return TEST_SKIPPED;
3992
3993         /* Create KASUMI session */
3994         retval = create_wireless_algo_cipher_session(ts_params->valid_devs[0],
3995                                         RTE_CRYPTO_CIPHER_OP_DECRYPT,
3996                                         RTE_CRYPTO_CIPHER_KASUMI_F8,
3997                                         tdata->key.data, tdata->key.len,
3998                                         tdata->cipher_iv.len);
3999         if (retval < 0)
4000                 return retval;
4001
4002         ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
4003         ut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
4004
4005         /* Clear mbuf payload */
4006         memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
4007                rte_pktmbuf_tailroom(ut_params->ibuf));
4008
4009         ciphertext_len = ceil_byte_length(tdata->ciphertext.len);
4010         /* Append data which is padded to a multiple */
4011         /* of the algorithms block size */
4012         ciphertext_pad_len = RTE_ALIGN_CEIL(ciphertext_len, 8);
4013         ciphertext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
4014                                 ciphertext_pad_len);
4015         rte_pktmbuf_append(ut_params->obuf, ciphertext_pad_len);
4016         memcpy(ciphertext, tdata->ciphertext.data, ciphertext_len);
4017
4018         debug_hexdump(stdout, "ciphertext:", ciphertext, ciphertext_len);
4019
4020         /* Create KASUMI operation */
4021         retval = create_wireless_algo_cipher_operation_oop(tdata->cipher_iv.data,
4022                                 tdata->cipher_iv.len,
4023                                 RTE_ALIGN_CEIL(tdata->validCipherLenInBits.len, 8),
4024                                 tdata->validCipherOffsetInBits.len);
4025         if (retval < 0)
4026                 return retval;
4027
4028         ut_params->op = process_crypto_request(ts_params->valid_devs[0],
4029                                                 ut_params->op);
4030         TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
4031
4032         ut_params->obuf = ut_params->op->sym->m_dst;
4033         if (ut_params->obuf)
4034                 plaintext = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *);
4035         else
4036                 plaintext = ciphertext + (tdata->validCipherOffsetInBits.len >> 3);
4037
4038         debug_hexdump(stdout, "plaintext:", plaintext, ciphertext_len);
4039
4040         const uint8_t *reference_plaintext = tdata->plaintext.data +
4041                                 (tdata->validCipherOffsetInBits.len >> 3);
4042         /* Validate obuf */
4043         TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
4044                 plaintext,
4045                 reference_plaintext,
4046                 tdata->validCipherLenInBits.len,
4047                 "KASUMI Plaintext data not as expected");
4048         return 0;
4049 }
4050
4051 static int
4052 test_kasumi_decryption(const struct kasumi_test_data *tdata)
4053 {
4054         struct crypto_testsuite_params *ts_params = &testsuite_params;
4055         struct crypto_unittest_params *ut_params = &unittest_params;
4056
4057         int retval;
4058         uint8_t *ciphertext, *plaintext;
4059         unsigned ciphertext_pad_len;
4060         unsigned ciphertext_len;
4061         struct rte_cryptodev_info dev_info;
4062
4063         rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
4064         uint64_t feat_flags = dev_info.feature_flags;
4065
4066         if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
4067                         (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
4068                 printf("Device doesn't support RAW data-path APIs.\n");
4069                 return TEST_SKIPPED;
4070         }
4071
4072         if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
4073                 return TEST_SKIPPED;
4074
4075         /* Verify the capabilities */
4076         struct rte_cryptodev_sym_capability_idx cap_idx;
4077         cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
4078         cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_KASUMI_F8;
4079         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
4080                         &cap_idx) == NULL)
4081                 return TEST_SKIPPED;
4082
4083         /* Create KASUMI session */
4084         retval = create_wireless_algo_cipher_session(ts_params->valid_devs[0],
4085                                         RTE_CRYPTO_CIPHER_OP_DECRYPT,
4086                                         RTE_CRYPTO_CIPHER_KASUMI_F8,
4087                                         tdata->key.data, tdata->key.len,
4088                                         tdata->cipher_iv.len);
4089         if (retval < 0)
4090                 return retval;
4091
4092         ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
4093
4094         /* Clear mbuf payload */
4095         memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
4096                rte_pktmbuf_tailroom(ut_params->ibuf));
4097
4098         ciphertext_len = ceil_byte_length(tdata->ciphertext.len);
4099         /* Append data which is padded to a multiple */
4100         /* of the algorithms block size */
4101         ciphertext_pad_len = RTE_ALIGN_CEIL(ciphertext_len, 8);
4102         ciphertext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
4103                                 ciphertext_pad_len);
4104         memcpy(ciphertext, tdata->ciphertext.data, ciphertext_len);
4105
4106         debug_hexdump(stdout, "ciphertext:", ciphertext, ciphertext_len);
4107
4108         /* Create KASUMI operation */
4109         retval = create_wireless_algo_cipher_operation(tdata->cipher_iv.data,
4110                         tdata->cipher_iv.len,
4111                         RTE_ALIGN_CEIL(tdata->validCipherLenInBits.len, 8),
4112                         tdata->validCipherOffsetInBits.len);
4113         if (retval < 0)
4114                 return retval;
4115
4116         if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
4117                 process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
4118                                 ut_params->op, 1, 0, 1, 0);
4119         else
4120                 ut_params->op = process_crypto_request(ts_params->valid_devs[0],
4121                                                 ut_params->op);
4122         TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
4123
4124         ut_params->obuf = ut_params->op->sym->m_dst;
4125         if (ut_params->obuf)
4126                 plaintext = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *);
4127         else
4128                 plaintext = ciphertext + (tdata->validCipherOffsetInBits.len >> 3);
4129
4130         debug_hexdump(stdout, "plaintext:", plaintext, ciphertext_len);
4131
4132         const uint8_t *reference_plaintext = tdata->plaintext.data +
4133                                 (tdata->validCipherOffsetInBits.len >> 3);
4134         /* Validate obuf */
4135         TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
4136                 plaintext,
4137                 reference_plaintext,
4138                 tdata->validCipherLenInBits.len,
4139                 "KASUMI Plaintext data not as expected");
4140         return 0;
4141 }
4142
4143 static int
4144 test_snow3g_encryption(const struct snow3g_test_data *tdata)
4145 {
4146         struct crypto_testsuite_params *ts_params = &testsuite_params;
4147         struct crypto_unittest_params *ut_params = &unittest_params;
4148
4149         int retval;
4150         uint8_t *plaintext, *ciphertext;
4151         unsigned plaintext_pad_len;
4152         unsigned plaintext_len;
4153         struct rte_cryptodev_info dev_info;
4154
4155         rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
4156         uint64_t feat_flags = dev_info.feature_flags;
4157
4158         if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
4159                         (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
4160                 printf("Device doesn't support RAW data-path APIs.\n");
4161                 return TEST_SKIPPED;
4162         }
4163
4164         if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
4165                 return TEST_SKIPPED;
4166
4167         /* Verify the capabilities */
4168         struct rte_cryptodev_sym_capability_idx cap_idx;
4169         cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
4170         cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_SNOW3G_UEA2;
4171         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
4172                         &cap_idx) == NULL)
4173                 return TEST_SKIPPED;
4174
4175         /* Create SNOW 3G session */
4176         retval = create_wireless_algo_cipher_session(ts_params->valid_devs[0],
4177                                         RTE_CRYPTO_CIPHER_OP_ENCRYPT,
4178                                         RTE_CRYPTO_CIPHER_SNOW3G_UEA2,
4179                                         tdata->key.data, tdata->key.len,
4180                                         tdata->cipher_iv.len);
4181         if (retval < 0)
4182                 return retval;
4183
4184         ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
4185
4186         /* Clear mbuf payload */
4187         memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
4188                rte_pktmbuf_tailroom(ut_params->ibuf));
4189
4190         plaintext_len = ceil_byte_length(tdata->plaintext.len);
4191         /* Append data which is padded to a multiple of */
4192         /* the algorithms block size */
4193         plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16);
4194         plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
4195                                 plaintext_pad_len);
4196         memcpy(plaintext, tdata->plaintext.data, plaintext_len);
4197
4198         debug_hexdump(stdout, "plaintext:", plaintext, plaintext_len);
4199
4200         /* Create SNOW 3G operation */
4201         retval = create_wireless_algo_cipher_operation(tdata->cipher_iv.data,
4202                                         tdata->cipher_iv.len,
4203                                         tdata->validCipherLenInBits.len,
4204                                         0);
4205         if (retval < 0)
4206                 return retval;
4207
4208         if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
4209                 process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
4210                                 ut_params->op, 1, 0, 1, tdata->cipher_iv.len);
4211         else
4212                 ut_params->op = process_crypto_request(ts_params->valid_devs[0],
4213                                                 ut_params->op);
4214         TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
4215
4216         ut_params->obuf = ut_params->op->sym->m_dst;
4217         if (ut_params->obuf)
4218                 ciphertext = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *);
4219         else
4220                 ciphertext = plaintext;
4221
4222         debug_hexdump(stdout, "ciphertext:", ciphertext, plaintext_len);
4223
4224         /* Validate obuf */
4225         TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
4226                 ciphertext,
4227                 tdata->ciphertext.data,
4228                 tdata->validDataLenInBits.len,
4229                 "SNOW 3G Ciphertext data not as expected");
4230         return 0;
4231 }
4232
4233
4234 static int
4235 test_snow3g_encryption_oop(const struct snow3g_test_data *tdata)
4236 {
4237         struct crypto_testsuite_params *ts_params = &testsuite_params;
4238         struct crypto_unittest_params *ut_params = &unittest_params;
4239         uint8_t *plaintext, *ciphertext;
4240
4241         int retval;
4242         unsigned plaintext_pad_len;
4243         unsigned plaintext_len;
4244         struct rte_cryptodev_info dev_info;
4245
4246         rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
4247         uint64_t feat_flags = dev_info.feature_flags;
4248
4249         if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
4250                         (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
4251                 printf("Device does not support RAW data-path APIs.\n");
4252                 return -ENOTSUP;
4253         }
4254
4255         /* Verify the capabilities */
4256         struct rte_cryptodev_sym_capability_idx cap_idx;
4257         cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
4258         cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_SNOW3G_UEA2;
4259         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
4260                         &cap_idx) == NULL)
4261                 return TEST_SKIPPED;
4262
4263         if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
4264                 return TEST_SKIPPED;
4265
4266         if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
4267                 return TEST_SKIPPED;
4268
4269         /* Create SNOW 3G session */
4270         retval = create_wireless_algo_cipher_session(ts_params->valid_devs[0],
4271                                         RTE_CRYPTO_CIPHER_OP_ENCRYPT,
4272                                         RTE_CRYPTO_CIPHER_SNOW3G_UEA2,
4273                                         tdata->key.data, tdata->key.len,
4274                                         tdata->cipher_iv.len);
4275         if (retval < 0)
4276                 return retval;
4277
4278         ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
4279         ut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
4280
4281         TEST_ASSERT_NOT_NULL(ut_params->ibuf,
4282                         "Failed to allocate input buffer in mempool");
4283         TEST_ASSERT_NOT_NULL(ut_params->obuf,
4284                         "Failed to allocate output buffer in mempool");
4285
4286         /* Clear mbuf payload */
4287         memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
4288                rte_pktmbuf_tailroom(ut_params->ibuf));
4289
4290         plaintext_len = ceil_byte_length(tdata->plaintext.len);
4291         /* Append data which is padded to a multiple of */
4292         /* the algorithms block size */
4293         plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16);
4294         plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
4295                                 plaintext_pad_len);
4296         rte_pktmbuf_append(ut_params->obuf, plaintext_pad_len);
4297         memcpy(plaintext, tdata->plaintext.data, plaintext_len);
4298
4299         debug_hexdump(stdout, "plaintext:", plaintext, plaintext_len);
4300
4301         /* Create SNOW 3G operation */
4302         retval = create_wireless_algo_cipher_operation_oop(tdata->cipher_iv.data,
4303                                         tdata->cipher_iv.len,
4304                                         tdata->validCipherLenInBits.len,
4305                                         0);
4306         if (retval < 0)
4307                 return retval;
4308
4309         if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
4310                 process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
4311                         ut_params->op, 1, 0, 1, tdata->cipher_iv.len);
4312         else
4313                 ut_params->op = process_crypto_request(ts_params->valid_devs[0],
4314                                                 ut_params->op);
4315         TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
4316
4317         ut_params->obuf = ut_params->op->sym->m_dst;
4318         if (ut_params->obuf)
4319                 ciphertext = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *);
4320         else
4321                 ciphertext = plaintext;
4322
4323         debug_hexdump(stdout, "ciphertext:", ciphertext, plaintext_len);
4324
4325         /* Validate obuf */
4326         TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
4327                 ciphertext,
4328                 tdata->ciphertext.data,
4329                 tdata->validDataLenInBits.len,
4330                 "SNOW 3G Ciphertext data not as expected");
4331         return 0;
4332 }
4333
4334 static int
4335 test_snow3g_encryption_oop_sgl(const struct snow3g_test_data *tdata)
4336 {
4337         struct crypto_testsuite_params *ts_params = &testsuite_params;
4338         struct crypto_unittest_params *ut_params = &unittest_params;
4339
4340         int retval;
4341         unsigned int plaintext_pad_len;
4342         unsigned int plaintext_len;
4343         uint8_t buffer[10000];
4344         const uint8_t *ciphertext;
4345
4346         struct rte_cryptodev_info dev_info;
4347
4348         /* Verify the capabilities */
4349         struct rte_cryptodev_sym_capability_idx cap_idx;
4350         cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
4351         cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_SNOW3G_UEA2;
4352         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
4353                         &cap_idx) == NULL)
4354                 return TEST_SKIPPED;
4355
4356         if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
4357                 return TEST_SKIPPED;
4358
4359         if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
4360                 return TEST_SKIPPED;
4361
4362         rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
4363
4364         uint64_t feat_flags = dev_info.feature_flags;
4365
4366         if (!(feat_flags & RTE_CRYPTODEV_FF_OOP_SGL_IN_SGL_OUT)) {
4367                 printf("Device doesn't support out-of-place scatter-gather "
4368                                 "in both input and output mbufs. "
4369                                 "Test Skipped.\n");
4370                 return TEST_SKIPPED;
4371         }
4372
4373         if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
4374                         (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
4375                 printf("Device does not support RAW data-path APIs.\n");
4376                 return -ENOTSUP;
4377         }
4378
4379         /* Create SNOW 3G session */
4380         retval = create_wireless_algo_cipher_session(ts_params->valid_devs[0],
4381                                         RTE_CRYPTO_CIPHER_OP_ENCRYPT,
4382                                         RTE_CRYPTO_CIPHER_SNOW3G_UEA2,
4383                                         tdata->key.data, tdata->key.len,
4384                                         tdata->cipher_iv.len);
4385         if (retval < 0)
4386                 return retval;
4387
4388         plaintext_len = ceil_byte_length(tdata->plaintext.len);
4389         /* Append data which is padded to a multiple of */
4390         /* the algorithms block size */
4391         plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16);
4392
4393         ut_params->ibuf = create_segmented_mbuf(ts_params->mbuf_pool,
4394                         plaintext_pad_len, 10, 0);
4395         ut_params->obuf = create_segmented_mbuf(ts_params->mbuf_pool,
4396                         plaintext_pad_len, 3, 0);
4397
4398         TEST_ASSERT_NOT_NULL(ut_params->ibuf,
4399                         "Failed to allocate input buffer in mempool");
4400         TEST_ASSERT_NOT_NULL(ut_params->obuf,
4401                         "Failed to allocate output buffer in mempool");
4402
4403         pktmbuf_write(ut_params->ibuf, 0, plaintext_len, tdata->plaintext.data);
4404
4405         /* Create SNOW 3G operation */
4406         retval = create_wireless_algo_cipher_operation_oop(tdata->cipher_iv.data,
4407                                         tdata->cipher_iv.len,
4408                                         tdata->validCipherLenInBits.len,
4409                                         0);
4410         if (retval < 0)
4411                 return retval;
4412
4413         if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
4414                 process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
4415                         ut_params->op, 1, 0, 1, tdata->cipher_iv.len);
4416         else
4417                 ut_params->op = process_crypto_request(ts_params->valid_devs[0],
4418                                                 ut_params->op);
4419         TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
4420
4421         ut_params->obuf = ut_params->op->sym->m_dst;
4422         if (ut_params->obuf)
4423                 ciphertext = rte_pktmbuf_read(ut_params->obuf, 0,
4424                                 plaintext_len, buffer);
4425         else
4426                 ciphertext = rte_pktmbuf_read(ut_params->ibuf, 0,
4427                                 plaintext_len, buffer);
4428
4429         debug_hexdump(stdout, "ciphertext:", ciphertext, plaintext_len);
4430
4431         /* Validate obuf */
4432         TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
4433                 ciphertext,
4434                 tdata->ciphertext.data,
4435                 tdata->validDataLenInBits.len,
4436                 "SNOW 3G Ciphertext data not as expected");
4437
4438         return 0;
4439 }
4440
4441 /* Shift right a buffer by "offset" bits, "offset" < 8 */
4442 static void
4443 buffer_shift_right(uint8_t *buffer, uint32_t length, uint8_t offset)
4444 {
4445         uint8_t curr_byte, prev_byte;
4446         uint32_t length_in_bytes = ceil_byte_length(length + offset);
4447         uint8_t lower_byte_mask = (1 << offset) - 1;
4448         unsigned i;
4449
4450         prev_byte = buffer[0];
4451         buffer[0] >>= offset;
4452
4453         for (i = 1; i < length_in_bytes; i++) {
4454                 curr_byte = buffer[i];
4455                 buffer[i] = ((prev_byte & lower_byte_mask) << (8 - offset)) |
4456                                 (curr_byte >> offset);
4457                 prev_byte = curr_byte;
4458         }
4459 }
4460
4461 static int
4462 test_snow3g_encryption_offset_oop(const struct snow3g_test_data *tdata)
4463 {
4464         struct crypto_testsuite_params *ts_params = &testsuite_params;
4465         struct crypto_unittest_params *ut_params = &unittest_params;
4466         uint8_t *plaintext, *ciphertext;
4467         int retval;
4468         uint32_t plaintext_len;
4469         uint32_t plaintext_pad_len;
4470         uint8_t extra_offset = 4;
4471         uint8_t *expected_ciphertext_shifted;
4472         struct rte_cryptodev_info dev_info;
4473
4474         rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
4475         uint64_t feat_flags = dev_info.feature_flags;
4476
4477         if (!(feat_flags & RTE_CRYPTODEV_FF_NON_BYTE_ALIGNED_DATA) &&
4478                         ((tdata->validDataLenInBits.len % 8) != 0)) {
4479                 printf("Device doesn't support NON-Byte Aligned Data.\n");
4480                 return TEST_SKIPPED;
4481         }
4482
4483         /* Verify the capabilities */
4484         struct rte_cryptodev_sym_capability_idx cap_idx;
4485         cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
4486         cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_SNOW3G_UEA2;
4487         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
4488                         &cap_idx) == NULL)
4489                 return TEST_SKIPPED;
4490
4491         if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
4492                 return TEST_SKIPPED;
4493
4494         if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
4495                 return TEST_SKIPPED;
4496
4497         /* Create SNOW 3G session */
4498         retval = create_wireless_algo_cipher_session(ts_params->valid_devs[0],
4499                                         RTE_CRYPTO_CIPHER_OP_ENCRYPT,
4500                                         RTE_CRYPTO_CIPHER_SNOW3G_UEA2,
4501                                         tdata->key.data, tdata->key.len,
4502                                         tdata->cipher_iv.len);
4503         if (retval < 0)
4504                 return retval;
4505
4506         ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
4507         ut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
4508
4509         TEST_ASSERT_NOT_NULL(ut_params->ibuf,
4510                         "Failed to allocate input buffer in mempool");
4511         TEST_ASSERT_NOT_NULL(ut_params->obuf,
4512                         "Failed to allocate output buffer in mempool");
4513
4514         /* Clear mbuf payload */
4515         memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
4516                rte_pktmbuf_tailroom(ut_params->ibuf));
4517
4518         plaintext_len = ceil_byte_length(tdata->plaintext.len + extra_offset);
4519         /*
4520          * Append data which is padded to a
4521          * multiple of the algorithms block size
4522          */
4523         plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16);
4524
4525         plaintext = (uint8_t *) rte_pktmbuf_append(ut_params->ibuf,
4526                                                 plaintext_pad_len);
4527
4528         rte_pktmbuf_append(ut_params->obuf, plaintext_pad_len);
4529
4530         memcpy(plaintext, tdata->plaintext.data, (tdata->plaintext.len >> 3));
4531         buffer_shift_right(plaintext, tdata->plaintext.len, extra_offset);
4532
4533 #ifdef RTE_APP_TEST_DEBUG
4534         rte_hexdump(stdout, "plaintext:", plaintext, tdata->plaintext.len);
4535 #endif
4536         /* Create SNOW 3G operation */
4537         retval = create_wireless_algo_cipher_operation_oop(tdata->cipher_iv.data,
4538                                         tdata->cipher_iv.len,
4539                                         tdata->validCipherLenInBits.len,
4540                                         extra_offset);
4541         if (retval < 0)
4542                 return retval;
4543
4544         if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
4545                 process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
4546                         ut_params->op, 1, 0, 1, tdata->cipher_iv.len);
4547         else
4548                 ut_params->op = process_crypto_request(ts_params->valid_devs[0],
4549                                                 ut_params->op);
4550         TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
4551
4552         ut_params->obuf = ut_params->op->sym->m_dst;
4553         if (ut_params->obuf)
4554                 ciphertext = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *);
4555         else
4556                 ciphertext = plaintext;
4557
4558 #ifdef RTE_APP_TEST_DEBUG
4559         rte_hexdump(stdout, "ciphertext:", ciphertext, plaintext_len);
4560 #endif
4561
4562         expected_ciphertext_shifted = rte_malloc(NULL, plaintext_len, 8);
4563
4564         TEST_ASSERT_NOT_NULL(expected_ciphertext_shifted,
4565                         "failed to reserve memory for ciphertext shifted\n");
4566
4567         memcpy(expected_ciphertext_shifted, tdata->ciphertext.data,
4568                         ceil_byte_length(tdata->ciphertext.len));
4569         buffer_shift_right(expected_ciphertext_shifted, tdata->ciphertext.len,
4570                         extra_offset);
4571         /* Validate obuf */
4572         TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT_OFFSET(
4573                 ciphertext,
4574                 expected_ciphertext_shifted,
4575                 tdata->validDataLenInBits.len,
4576                 extra_offset,
4577                 "SNOW 3G Ciphertext data not as expected");
4578         return 0;
4579 }
4580
4581 static int test_snow3g_decryption(const struct snow3g_test_data *tdata)
4582 {
4583         struct crypto_testsuite_params *ts_params = &testsuite_params;
4584         struct crypto_unittest_params *ut_params = &unittest_params;
4585
4586         int retval;
4587
4588         uint8_t *plaintext, *ciphertext;
4589         unsigned ciphertext_pad_len;
4590         unsigned ciphertext_len;
4591         struct rte_cryptodev_info dev_info;
4592
4593         rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
4594         uint64_t feat_flags = dev_info.feature_flags;
4595
4596         if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
4597                         (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
4598                 printf("Device doesn't support RAW data-path APIs.\n");
4599                 return TEST_SKIPPED;
4600         }
4601
4602         if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
4603                 return TEST_SKIPPED;
4604
4605         /* Verify the capabilities */
4606         struct rte_cryptodev_sym_capability_idx cap_idx;
4607         cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
4608         cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_SNOW3G_UEA2;
4609         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
4610                         &cap_idx) == NULL)
4611                 return TEST_SKIPPED;
4612
4613         /* Create SNOW 3G session */
4614         retval = create_wireless_algo_cipher_session(ts_params->valid_devs[0],
4615                                         RTE_CRYPTO_CIPHER_OP_DECRYPT,
4616                                         RTE_CRYPTO_CIPHER_SNOW3G_UEA2,
4617                                         tdata->key.data, tdata->key.len,
4618                                         tdata->cipher_iv.len);
4619         if (retval < 0)
4620                 return retval;
4621
4622         ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
4623
4624         /* Clear mbuf payload */
4625         memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
4626                rte_pktmbuf_tailroom(ut_params->ibuf));
4627
4628         ciphertext_len = ceil_byte_length(tdata->ciphertext.len);
4629         /* Append data which is padded to a multiple of */
4630         /* the algorithms block size */
4631         ciphertext_pad_len = RTE_ALIGN_CEIL(ciphertext_len, 16);
4632         ciphertext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
4633                                 ciphertext_pad_len);
4634         memcpy(ciphertext, tdata->ciphertext.data, ciphertext_len);
4635
4636         debug_hexdump(stdout, "ciphertext:", ciphertext, ciphertext_len);
4637
4638         /* Create SNOW 3G operation */
4639         retval = create_wireless_algo_cipher_operation(tdata->cipher_iv.data,
4640                                         tdata->cipher_iv.len,
4641                                         tdata->validCipherLenInBits.len,
4642                                         tdata->cipher.offset_bits);
4643         if (retval < 0)
4644                 return retval;
4645
4646         if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
4647                 process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
4648                                 ut_params->op, 1, 0, 1, tdata->cipher_iv.len);
4649         else
4650                 ut_params->op = process_crypto_request(ts_params->valid_devs[0],
4651                                                 ut_params->op);
4652         TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
4653         ut_params->obuf = ut_params->op->sym->m_dst;
4654         if (ut_params->obuf)
4655                 plaintext = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *);
4656         else
4657                 plaintext = ciphertext;
4658
4659         debug_hexdump(stdout, "plaintext:", plaintext, ciphertext_len);
4660
4661         /* Validate obuf */
4662         TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(plaintext,
4663                                 tdata->plaintext.data,
4664                                 tdata->validDataLenInBits.len,
4665                                 "SNOW 3G Plaintext data not as expected");
4666         return 0;
4667 }
4668
4669 static int test_snow3g_decryption_oop(const struct snow3g_test_data *tdata)
4670 {
4671         struct crypto_testsuite_params *ts_params = &testsuite_params;
4672         struct crypto_unittest_params *ut_params = &unittest_params;
4673
4674         int retval;
4675
4676         uint8_t *plaintext, *ciphertext;
4677         unsigned ciphertext_pad_len;
4678         unsigned ciphertext_len;
4679         struct rte_cryptodev_info dev_info;
4680
4681         rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
4682         uint64_t feat_flags = dev_info.feature_flags;
4683
4684         if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
4685                         (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
4686                 printf("Device does not support RAW data-path APIs.\n");
4687                 return -ENOTSUP;
4688         }
4689         /* Verify the capabilities */
4690         struct rte_cryptodev_sym_capability_idx cap_idx;
4691         cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
4692         cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_SNOW3G_UEA2;
4693         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
4694                         &cap_idx) == NULL)
4695                 return TEST_SKIPPED;
4696
4697         if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
4698                 return TEST_SKIPPED;
4699
4700         if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
4701                 return TEST_SKIPPED;
4702
4703         /* Create SNOW 3G session */
4704         retval = create_wireless_algo_cipher_session(ts_params->valid_devs[0],
4705                                         RTE_CRYPTO_CIPHER_OP_DECRYPT,
4706                                         RTE_CRYPTO_CIPHER_SNOW3G_UEA2,
4707                                         tdata->key.data, tdata->key.len,
4708                                         tdata->cipher_iv.len);
4709         if (retval < 0)
4710                 return retval;
4711
4712         ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
4713         ut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
4714
4715         TEST_ASSERT_NOT_NULL(ut_params->ibuf,
4716                         "Failed to allocate input buffer");
4717         TEST_ASSERT_NOT_NULL(ut_params->obuf,
4718                         "Failed to allocate output buffer");
4719
4720         /* Clear mbuf payload */
4721         memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
4722                rte_pktmbuf_tailroom(ut_params->ibuf));
4723
4724         memset(rte_pktmbuf_mtod(ut_params->obuf, uint8_t *), 0,
4725                        rte_pktmbuf_tailroom(ut_params->obuf));
4726
4727         ciphertext_len = ceil_byte_length(tdata->ciphertext.len);
4728         /* Append data which is padded to a multiple of */
4729         /* the algorithms block size */
4730         ciphertext_pad_len = RTE_ALIGN_CEIL(ciphertext_len, 16);
4731         ciphertext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
4732                                 ciphertext_pad_len);
4733         rte_pktmbuf_append(ut_params->obuf, ciphertext_pad_len);
4734         memcpy(ciphertext, tdata->ciphertext.data, ciphertext_len);
4735
4736         debug_hexdump(stdout, "ciphertext:", ciphertext, ciphertext_len);
4737
4738         /* Create SNOW 3G operation */
4739         retval = create_wireless_algo_cipher_operation_oop(tdata->cipher_iv.data,
4740                                         tdata->cipher_iv.len,
4741                                         tdata->validCipherLenInBits.len,
4742                                         0);
4743         if (retval < 0)
4744                 return retval;
4745
4746         if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
4747                 process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
4748                         ut_params->op, 1, 0, 1, tdata->cipher_iv.len);
4749         else
4750                 ut_params->op = process_crypto_request(ts_params->valid_devs[0],
4751                                                 ut_params->op);
4752         TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
4753         ut_params->obuf = ut_params->op->sym->m_dst;
4754         if (ut_params->obuf)
4755                 plaintext = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *);
4756         else
4757                 plaintext = ciphertext;
4758
4759         debug_hexdump(stdout, "plaintext:", plaintext, ciphertext_len);
4760
4761         /* Validate obuf */
4762         TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(plaintext,
4763                                 tdata->plaintext.data,
4764                                 tdata->validDataLenInBits.len,
4765                                 "SNOW 3G Plaintext data not as expected");
4766         return 0;
4767 }
4768
4769 static int
4770 test_zuc_cipher_auth(const struct wireless_test_data *tdata)
4771 {
4772         struct crypto_testsuite_params *ts_params = &testsuite_params;
4773         struct crypto_unittest_params *ut_params = &unittest_params;
4774
4775         int retval;
4776
4777         uint8_t *plaintext, *ciphertext;
4778         unsigned int plaintext_pad_len;
4779         unsigned int plaintext_len;
4780
4781         struct rte_cryptodev_info dev_info;
4782         struct rte_cryptodev_sym_capability_idx cap_idx;
4783
4784         rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
4785         uint64_t feat_flags = dev_info.feature_flags;
4786
4787         if (!(feat_flags & RTE_CRYPTODEV_FF_NON_BYTE_ALIGNED_DATA) &&
4788                         ((tdata->validAuthLenInBits.len % 8 != 0) ||
4789                         (tdata->validDataLenInBits.len % 8 != 0))) {
4790                 printf("Device doesn't support NON-Byte Aligned Data.\n");
4791                 return TEST_SKIPPED;
4792         }
4793
4794         if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
4795                         (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
4796                 printf("Device doesn't support RAW data-path APIs.\n");
4797                 return TEST_SKIPPED;
4798         }
4799
4800         if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
4801                 return TEST_SKIPPED;
4802
4803         /* Check if device supports ZUC EEA3 */
4804         cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
4805         cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_ZUC_EEA3;
4806
4807         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
4808                         &cap_idx) == NULL)
4809                 return TEST_SKIPPED;
4810
4811         /* Check if device supports ZUC EIA3 */
4812         cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
4813         cap_idx.algo.auth = RTE_CRYPTO_AUTH_ZUC_EIA3;
4814
4815         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
4816                         &cap_idx) == NULL)
4817                 return TEST_SKIPPED;
4818
4819         /* Create ZUC session */
4820         retval = create_zuc_cipher_auth_encrypt_generate_session(
4821                         ts_params->valid_devs[0],
4822                         tdata);
4823         if (retval != 0)
4824                 return retval;
4825         ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
4826
4827         /* clear mbuf payload */
4828         memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
4829                         rte_pktmbuf_tailroom(ut_params->ibuf));
4830
4831         plaintext_len = ceil_byte_length(tdata->plaintext.len);
4832         /* Append data which is padded to a multiple of */
4833         /* the algorithms block size */
4834         plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16);
4835         plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
4836                                 plaintext_pad_len);
4837         memcpy(plaintext, tdata->plaintext.data, plaintext_len);
4838
4839         debug_hexdump(stdout, "plaintext:", plaintext, plaintext_len);
4840
4841         /* Create ZUC operation */
4842         retval = create_zuc_cipher_hash_generate_operation(tdata);
4843         if (retval < 0)
4844                 return retval;
4845
4846         if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
4847                 process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
4848                                 ut_params->op, 1, 1, 1, tdata->cipher_iv.len);
4849         else
4850                 ut_params->op = process_crypto_request(ts_params->valid_devs[0],
4851                         ut_params->op);
4852         TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
4853         ut_params->obuf = ut_params->op->sym->m_src;
4854         if (ut_params->obuf)
4855                 ciphertext = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *);
4856         else
4857                 ciphertext = plaintext;
4858
4859         debug_hexdump(stdout, "ciphertext:", ciphertext, plaintext_len);
4860         /* Validate obuf */
4861         TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
4862                         ciphertext,
4863                         tdata->ciphertext.data,
4864                         tdata->validDataLenInBits.len,
4865                         "ZUC Ciphertext data not as expected");
4866
4867         ut_params->digest = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *)
4868             + plaintext_pad_len;
4869
4870         /* Validate obuf */
4871         TEST_ASSERT_BUFFERS_ARE_EQUAL(
4872                         ut_params->digest,
4873                         tdata->digest.data,
4874                         4,
4875                         "ZUC Generated auth tag not as expected");
4876         return 0;
4877 }
4878
4879 static int
4880 test_snow3g_cipher_auth(const struct snow3g_test_data *tdata)
4881 {
4882         struct crypto_testsuite_params *ts_params = &testsuite_params;
4883         struct crypto_unittest_params *ut_params = &unittest_params;
4884
4885         int retval;
4886
4887         uint8_t *plaintext, *ciphertext;
4888         unsigned plaintext_pad_len;
4889         unsigned plaintext_len;
4890         struct rte_cryptodev_info dev_info;
4891
4892         rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
4893         uint64_t feat_flags = dev_info.feature_flags;
4894
4895         if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
4896                         (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
4897                 printf("Device doesn't support RAW data-path APIs.\n");
4898                 return TEST_SKIPPED;
4899         }
4900
4901         if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
4902                 return TEST_SKIPPED;
4903
4904         /* Verify the capabilities */
4905         struct rte_cryptodev_sym_capability_idx cap_idx;
4906         cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
4907         cap_idx.algo.auth = RTE_CRYPTO_AUTH_SNOW3G_UIA2;
4908         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
4909                         &cap_idx) == NULL)
4910                 return TEST_SKIPPED;
4911         cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
4912         cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_SNOW3G_UEA2;
4913         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
4914                         &cap_idx) == NULL)
4915                 return TEST_SKIPPED;
4916
4917         /* Create SNOW 3G session */
4918         retval = create_wireless_algo_cipher_auth_session(ts_params->valid_devs[0],
4919                         RTE_CRYPTO_CIPHER_OP_ENCRYPT,
4920                         RTE_CRYPTO_AUTH_OP_GENERATE,
4921                         RTE_CRYPTO_AUTH_SNOW3G_UIA2,
4922                         RTE_CRYPTO_CIPHER_SNOW3G_UEA2,
4923                         tdata->key.data, tdata->key.len,
4924                         tdata->auth_iv.len, tdata->digest.len,
4925                         tdata->cipher_iv.len);
4926         if (retval != 0)
4927                 return retval;
4928         ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
4929
4930         /* clear mbuf payload */
4931         memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
4932                         rte_pktmbuf_tailroom(ut_params->ibuf));
4933
4934         plaintext_len = ceil_byte_length(tdata->plaintext.len);
4935         /* Append data which is padded to a multiple of */
4936         /* the algorithms block size */
4937         plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16);
4938         plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
4939                                 plaintext_pad_len);
4940         memcpy(plaintext, tdata->plaintext.data, plaintext_len);
4941
4942         debug_hexdump(stdout, "plaintext:", plaintext, plaintext_len);
4943
4944         /* Create SNOW 3G operation */
4945         retval = create_wireless_algo_cipher_hash_operation(tdata->digest.data,
4946                         tdata->digest.len, tdata->auth_iv.data,
4947                         tdata->auth_iv.len,
4948                         plaintext_pad_len, RTE_CRYPTO_AUTH_OP_GENERATE,
4949                         tdata->cipher_iv.data, tdata->cipher_iv.len,
4950                         tdata->validCipherLenInBits.len,
4951                         0,
4952                         tdata->validAuthLenInBits.len,
4953                         0
4954                         );
4955         if (retval < 0)
4956                 return retval;
4957
4958         if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
4959                 process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
4960                                 ut_params->op, 1, 1, 1, tdata->cipher_iv.len);
4961         else
4962                 ut_params->op = process_crypto_request(ts_params->valid_devs[0],
4963                         ut_params->op);
4964         TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
4965         ut_params->obuf = ut_params->op->sym->m_src;
4966         if (ut_params->obuf)
4967                 ciphertext = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *);
4968         else
4969                 ciphertext = plaintext;
4970
4971         debug_hexdump(stdout, "ciphertext:", ciphertext, plaintext_len);
4972         /* Validate obuf */
4973         TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
4974                         ciphertext,
4975                         tdata->ciphertext.data,
4976                         tdata->validDataLenInBits.len,
4977                         "SNOW 3G Ciphertext data not as expected");
4978
4979         ut_params->digest = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *)
4980             + plaintext_pad_len;
4981
4982         /* Validate obuf */
4983         TEST_ASSERT_BUFFERS_ARE_EQUAL(
4984                         ut_params->digest,
4985                         tdata->digest.data,
4986                         DIGEST_BYTE_LENGTH_SNOW3G_UIA2,
4987                         "SNOW 3G Generated auth tag not as expected");
4988         return 0;
4989 }
4990
4991 static int
4992 test_snow3g_auth_cipher(const struct snow3g_test_data *tdata,
4993         uint8_t op_mode, uint8_t verify)
4994 {
4995         struct crypto_testsuite_params *ts_params = &testsuite_params;
4996         struct crypto_unittest_params *ut_params = &unittest_params;
4997
4998         int retval;
4999
5000         uint8_t *plaintext = NULL, *ciphertext = NULL;
5001         unsigned int plaintext_pad_len;
5002         unsigned int plaintext_len;
5003         unsigned int ciphertext_pad_len;
5004         unsigned int ciphertext_len;
5005
5006         struct rte_cryptodev_info dev_info;
5007
5008         /* Verify the capabilities */
5009         struct rte_cryptodev_sym_capability_idx cap_idx;
5010         cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
5011         cap_idx.algo.auth = RTE_CRYPTO_AUTH_SNOW3G_UIA2;
5012         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
5013                         &cap_idx) == NULL)
5014                 return TEST_SKIPPED;
5015         cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
5016         cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_SNOW3G_UEA2;
5017         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
5018                         &cap_idx) == NULL)
5019                 return TEST_SKIPPED;
5020
5021         if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
5022                 return TEST_SKIPPED;
5023
5024         rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
5025
5026         uint64_t feat_flags = dev_info.feature_flags;
5027
5028         if (op_mode == OUT_OF_PLACE) {
5029                 if (!(feat_flags & RTE_CRYPTODEV_FF_DIGEST_ENCRYPTED)) {
5030                         printf("Device doesn't support digest encrypted.\n");
5031                         return TEST_SKIPPED;
5032                 }
5033                 if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
5034                         return TEST_SKIPPED;
5035         }
5036
5037         if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
5038                         (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
5039                 printf("Device doesn't support RAW data-path APIs.\n");
5040                 return TEST_SKIPPED;
5041         }
5042
5043         /* Create SNOW 3G session */
5044         retval = create_wireless_algo_auth_cipher_session(
5045                         ts_params->valid_devs[0],
5046                         (verify ? RTE_CRYPTO_CIPHER_OP_DECRYPT
5047                                         : RTE_CRYPTO_CIPHER_OP_ENCRYPT),
5048                         (verify ? RTE_CRYPTO_AUTH_OP_VERIFY
5049                                         : RTE_CRYPTO_AUTH_OP_GENERATE),
5050                         RTE_CRYPTO_AUTH_SNOW3G_UIA2,
5051                         RTE_CRYPTO_CIPHER_SNOW3G_UEA2,
5052                         tdata->key.data, tdata->key.len,
5053                         tdata->auth_iv.len, tdata->digest.len,
5054                         tdata->cipher_iv.len);
5055         if (retval != 0)
5056                 return retval;
5057
5058         ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
5059         if (op_mode == OUT_OF_PLACE)
5060                 ut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
5061
5062         /* clear mbuf payload */
5063         memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
5064                 rte_pktmbuf_tailroom(ut_params->ibuf));
5065         if (op_mode == OUT_OF_PLACE)
5066                 memset(rte_pktmbuf_mtod(ut_params->obuf, uint8_t *), 0,
5067                         rte_pktmbuf_tailroom(ut_params->obuf));
5068
5069         ciphertext_len = ceil_byte_length(tdata->ciphertext.len);
5070         plaintext_len = ceil_byte_length(tdata->plaintext.len);
5071         ciphertext_pad_len = RTE_ALIGN_CEIL(ciphertext_len, 16);
5072         plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16);
5073
5074         if (verify) {
5075                 ciphertext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
5076                                         ciphertext_pad_len);
5077                 memcpy(ciphertext, tdata->ciphertext.data, ciphertext_len);
5078                 if (op_mode == OUT_OF_PLACE)
5079                         rte_pktmbuf_append(ut_params->obuf, ciphertext_pad_len);
5080                 debug_hexdump(stdout, "ciphertext:", ciphertext,
5081                         ciphertext_len);
5082         } else {
5083                 plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
5084                                         plaintext_pad_len);
5085                 memcpy(plaintext, tdata->plaintext.data, plaintext_len);
5086                 if (op_mode == OUT_OF_PLACE)
5087                         rte_pktmbuf_append(ut_params->obuf, plaintext_pad_len);
5088                 debug_hexdump(stdout, "plaintext:", plaintext, plaintext_len);
5089         }
5090
5091         /* Create SNOW 3G operation */
5092         retval = create_wireless_algo_auth_cipher_operation(
5093                 tdata->digest.data, tdata->digest.len,
5094                 tdata->cipher_iv.data, tdata->cipher_iv.len,
5095                 tdata->auth_iv.data, tdata->auth_iv.len,
5096                 (tdata->digest.offset_bytes == 0 ?
5097                 (verify ? ciphertext_pad_len : plaintext_pad_len)
5098                         : tdata->digest.offset_bytes),
5099                 tdata->validCipherLenInBits.len,
5100                 tdata->cipher.offset_bits,
5101                 tdata->validAuthLenInBits.len,
5102                 tdata->auth.offset_bits,
5103                 op_mode, 0, verify);
5104
5105         if (retval < 0)
5106                 return retval;
5107
5108         if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
5109                 process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
5110                                 ut_params->op, 1, 1, 1, tdata->cipher_iv.len);
5111         else
5112                 ut_params->op = process_crypto_request(ts_params->valid_devs[0],
5113                         ut_params->op);
5114
5115         TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
5116
5117         ut_params->obuf = (op_mode == IN_PLACE ?
5118                 ut_params->op->sym->m_src : ut_params->op->sym->m_dst);
5119
5120         if (verify) {
5121                 if (ut_params->obuf)
5122                         plaintext = rte_pktmbuf_mtod(ut_params->obuf,
5123                                                         uint8_t *);
5124                 else
5125                         plaintext = ciphertext +
5126                                 (tdata->cipher.offset_bits >> 3);
5127
5128                 debug_hexdump(stdout, "plaintext:", plaintext,
5129                         (tdata->plaintext.len >> 3) - tdata->digest.len);
5130                 debug_hexdump(stdout, "plaintext expected:",
5131                         tdata->plaintext.data,
5132                         (tdata->plaintext.len >> 3) - tdata->digest.len);
5133         } else {
5134                 if (ut_params->obuf)
5135                         ciphertext = rte_pktmbuf_mtod(ut_params->obuf,
5136                                                         uint8_t *);
5137                 else
5138                         ciphertext = plaintext;
5139
5140                 debug_hexdump(stdout, "ciphertext:", ciphertext,
5141                         ciphertext_len);
5142                 debug_hexdump(stdout, "ciphertext expected:",
5143                         tdata->ciphertext.data, tdata->ciphertext.len >> 3);
5144
5145                 ut_params->digest = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *)
5146                         + (tdata->digest.offset_bytes == 0 ?
5147                 plaintext_pad_len : tdata->digest.offset_bytes);
5148
5149                 debug_hexdump(stdout, "digest:", ut_params->digest,
5150                         tdata->digest.len);
5151                 debug_hexdump(stdout, "digest expected:", tdata->digest.data,
5152                                 tdata->digest.len);
5153         }
5154
5155         /* Validate obuf */
5156         if (verify) {
5157                 TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT_OFFSET(
5158                         plaintext,
5159                         tdata->plaintext.data,
5160                         (tdata->plaintext.len - tdata->cipher.offset_bits -
5161                          (tdata->digest.len << 3)),
5162                         tdata->cipher.offset_bits,
5163                         "SNOW 3G Plaintext data not as expected");
5164         } else {
5165                 TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT_OFFSET(
5166                         ciphertext,
5167                         tdata->ciphertext.data,
5168                         (tdata->validDataLenInBits.len -
5169                          tdata->cipher.offset_bits),
5170                         tdata->cipher.offset_bits,
5171                         "SNOW 3G Ciphertext data not as expected");
5172
5173                 TEST_ASSERT_BUFFERS_ARE_EQUAL(
5174                         ut_params->digest,
5175                         tdata->digest.data,
5176                         DIGEST_BYTE_LENGTH_SNOW3G_UIA2,
5177                         "SNOW 3G Generated auth tag not as expected");
5178         }
5179         return 0;
5180 }
5181
5182 static int
5183 test_snow3g_auth_cipher_sgl(const struct snow3g_test_data *tdata,
5184         uint8_t op_mode, uint8_t verify)
5185 {
5186         struct crypto_testsuite_params *ts_params = &testsuite_params;
5187         struct crypto_unittest_params *ut_params = &unittest_params;
5188
5189         int retval;
5190
5191         const uint8_t *plaintext = NULL;
5192         const uint8_t *ciphertext = NULL;
5193         const uint8_t *digest = NULL;
5194         unsigned int plaintext_pad_len;
5195         unsigned int plaintext_len;
5196         unsigned int ciphertext_pad_len;
5197         unsigned int ciphertext_len;
5198         uint8_t buffer[10000];
5199         uint8_t digest_buffer[10000];
5200
5201         struct rte_cryptodev_info dev_info;
5202
5203         /* Verify the capabilities */
5204         struct rte_cryptodev_sym_capability_idx cap_idx;
5205         cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
5206         cap_idx.algo.auth = RTE_CRYPTO_AUTH_SNOW3G_UIA2;
5207         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
5208                         &cap_idx) == NULL)
5209                 return TEST_SKIPPED;
5210         cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
5211         cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_SNOW3G_UEA2;
5212         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
5213                         &cap_idx) == NULL)
5214                 return TEST_SKIPPED;
5215
5216         if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
5217                 return TEST_SKIPPED;
5218
5219         rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
5220
5221         uint64_t feat_flags = dev_info.feature_flags;
5222
5223         if (op_mode == IN_PLACE) {
5224                 if (!(feat_flags & RTE_CRYPTODEV_FF_IN_PLACE_SGL)) {
5225                         printf("Device doesn't support in-place scatter-gather "
5226                                         "in both input and output mbufs.\n");
5227                         return TEST_SKIPPED;
5228                 }
5229                 if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
5230                         (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
5231                         printf("Device doesn't support RAW data-path APIs.\n");
5232                         return TEST_SKIPPED;
5233                 }
5234         } else {
5235                 if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
5236                         return TEST_SKIPPED;
5237                 if (!(feat_flags & RTE_CRYPTODEV_FF_OOP_SGL_IN_SGL_OUT)) {
5238                         printf("Device doesn't support out-of-place scatter-gather "
5239                                         "in both input and output mbufs.\n");
5240                         return TEST_SKIPPED;
5241                 }
5242                 if (!(feat_flags & RTE_CRYPTODEV_FF_DIGEST_ENCRYPTED)) {
5243                         printf("Device doesn't support digest encrypted.\n");
5244                         return TEST_SKIPPED;
5245                 }
5246         }
5247
5248         /* Create SNOW 3G session */
5249         retval = create_wireless_algo_auth_cipher_session(
5250                         ts_params->valid_devs[0],
5251                         (verify ? RTE_CRYPTO_CIPHER_OP_DECRYPT
5252                                         : RTE_CRYPTO_CIPHER_OP_ENCRYPT),
5253                         (verify ? RTE_CRYPTO_AUTH_OP_VERIFY
5254                                         : RTE_CRYPTO_AUTH_OP_GENERATE),
5255                         RTE_CRYPTO_AUTH_SNOW3G_UIA2,
5256                         RTE_CRYPTO_CIPHER_SNOW3G_UEA2,
5257                         tdata->key.data, tdata->key.len,
5258                         tdata->auth_iv.len, tdata->digest.len,
5259                         tdata->cipher_iv.len);
5260
5261         if (retval != 0)
5262                 return retval;
5263
5264         ciphertext_len = ceil_byte_length(tdata->ciphertext.len);
5265         plaintext_len = ceil_byte_length(tdata->plaintext.len);
5266         ciphertext_pad_len = RTE_ALIGN_CEIL(ciphertext_len, 16);
5267         plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16);
5268
5269         ut_params->ibuf = create_segmented_mbuf(ts_params->mbuf_pool,
5270                         plaintext_pad_len, 15, 0);
5271         TEST_ASSERT_NOT_NULL(ut_params->ibuf,
5272                         "Failed to allocate input buffer in mempool");
5273
5274         if (op_mode == OUT_OF_PLACE) {
5275                 ut_params->obuf = create_segmented_mbuf(ts_params->mbuf_pool,
5276                                 plaintext_pad_len, 15, 0);
5277                 TEST_ASSERT_NOT_NULL(ut_params->obuf,
5278                                 "Failed to allocate output buffer in mempool");
5279         }
5280
5281         if (verify) {
5282                 pktmbuf_write(ut_params->ibuf, 0, ciphertext_len,
5283                         tdata->ciphertext.data);
5284                 ciphertext = rte_pktmbuf_read(ut_params->ibuf, 0,
5285                                         ciphertext_len, buffer);
5286                 debug_hexdump(stdout, "ciphertext:", ciphertext,
5287                         ciphertext_len);
5288         } else {
5289                 pktmbuf_write(ut_params->ibuf, 0, plaintext_len,
5290                         tdata->plaintext.data);
5291                 plaintext = rte_pktmbuf_read(ut_params->ibuf, 0,
5292                                         plaintext_len, buffer);
5293                 debug_hexdump(stdout, "plaintext:", plaintext,
5294                         plaintext_len);
5295         }
5296         memset(buffer, 0, sizeof(buffer));
5297
5298         /* Create SNOW 3G operation */
5299         retval = create_wireless_algo_auth_cipher_operation(
5300                 tdata->digest.data, tdata->digest.len,
5301                 tdata->cipher_iv.data, tdata->cipher_iv.len,
5302                 tdata->auth_iv.data, tdata->auth_iv.len,
5303                 (tdata->digest.offset_bytes == 0 ?
5304                 (verify ? ciphertext_pad_len : plaintext_pad_len)
5305                         : tdata->digest.offset_bytes),
5306                 tdata->validCipherLenInBits.len,
5307                 tdata->cipher.offset_bits,
5308                 tdata->validAuthLenInBits.len,
5309                 tdata->auth.offset_bits,
5310                 op_mode, 1, verify);
5311
5312         if (retval < 0)
5313                 return retval;
5314
5315         if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
5316                 process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
5317                                 ut_params->op, 1, 1, 1, tdata->cipher_iv.len);
5318         else
5319                 ut_params->op = process_crypto_request(ts_params->valid_devs[0],
5320                         ut_params->op);
5321
5322         TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
5323
5324         ut_params->obuf = (op_mode == IN_PLACE ?
5325                 ut_params->op->sym->m_src : ut_params->op->sym->m_dst);
5326
5327         if (verify) {
5328                 if (ut_params->obuf)
5329                         plaintext = rte_pktmbuf_read(ut_params->obuf, 0,
5330                                         plaintext_len, buffer);
5331                 else
5332                         plaintext = rte_pktmbuf_read(ut_params->ibuf, 0,
5333                                         plaintext_len, buffer);
5334
5335                 debug_hexdump(stdout, "plaintext:", plaintext,
5336                         (tdata->plaintext.len >> 3) - tdata->digest.len);
5337                 debug_hexdump(stdout, "plaintext expected:",
5338                         tdata->plaintext.data,
5339                         (tdata->plaintext.len >> 3) - tdata->digest.len);
5340         } else {
5341                 if (ut_params->obuf)
5342                         ciphertext = rte_pktmbuf_read(ut_params->obuf, 0,
5343                                         ciphertext_len, buffer);
5344                 else
5345                         ciphertext = rte_pktmbuf_read(ut_params->ibuf, 0,
5346                                         ciphertext_len, buffer);
5347
5348                 debug_hexdump(stdout, "ciphertext:", ciphertext,
5349                         ciphertext_len);
5350                 debug_hexdump(stdout, "ciphertext expected:",
5351                         tdata->ciphertext.data, tdata->ciphertext.len >> 3);
5352
5353                 if (ut_params->obuf)
5354                         digest = rte_pktmbuf_read(ut_params->obuf,
5355                                 (tdata->digest.offset_bytes == 0 ?
5356                                 plaintext_pad_len : tdata->digest.offset_bytes),
5357                                 tdata->digest.len, digest_buffer);
5358                 else
5359                         digest = rte_pktmbuf_read(ut_params->ibuf,
5360                                 (tdata->digest.offset_bytes == 0 ?
5361                                 plaintext_pad_len : tdata->digest.offset_bytes),
5362                                 tdata->digest.len, digest_buffer);
5363
5364                 debug_hexdump(stdout, "digest:", digest,
5365                         tdata->digest.len);
5366                 debug_hexdump(stdout, "digest expected:",
5367                         tdata->digest.data, tdata->digest.len);
5368         }
5369
5370         /* Validate obuf */
5371         if (verify) {
5372                 TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT_OFFSET(
5373                         plaintext,
5374                         tdata->plaintext.data,
5375                         (tdata->plaintext.len - tdata->cipher.offset_bits -
5376                          (tdata->digest.len << 3)),
5377                         tdata->cipher.offset_bits,
5378                         "SNOW 3G Plaintext data not as expected");
5379         } else {
5380                 TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT_OFFSET(
5381                         ciphertext,
5382                         tdata->ciphertext.data,
5383                         (tdata->validDataLenInBits.len -
5384                          tdata->cipher.offset_bits),
5385                         tdata->cipher.offset_bits,
5386                         "SNOW 3G Ciphertext data not as expected");
5387
5388                 TEST_ASSERT_BUFFERS_ARE_EQUAL(
5389                         digest,
5390                         tdata->digest.data,
5391                         DIGEST_BYTE_LENGTH_SNOW3G_UIA2,
5392                         "SNOW 3G Generated auth tag not as expected");
5393         }
5394         return 0;
5395 }
5396
5397 static int
5398 test_kasumi_auth_cipher(const struct kasumi_test_data *tdata,
5399         uint8_t op_mode, uint8_t verify)
5400 {
5401         struct crypto_testsuite_params *ts_params = &testsuite_params;
5402         struct crypto_unittest_params *ut_params = &unittest_params;
5403
5404         int retval;
5405
5406         uint8_t *plaintext = NULL, *ciphertext = NULL;
5407         unsigned int plaintext_pad_len;
5408         unsigned int plaintext_len;
5409         unsigned int ciphertext_pad_len;
5410         unsigned int ciphertext_len;
5411
5412         struct rte_cryptodev_info dev_info;
5413
5414         /* Verify the capabilities */
5415         struct rte_cryptodev_sym_capability_idx cap_idx;
5416         cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
5417         cap_idx.algo.auth = RTE_CRYPTO_AUTH_KASUMI_F9;
5418         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
5419                         &cap_idx) == NULL)
5420                 return TEST_SKIPPED;
5421         cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
5422         cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_KASUMI_F8;
5423         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
5424                         &cap_idx) == NULL)
5425                 return TEST_SKIPPED;
5426
5427         rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
5428
5429         uint64_t feat_flags = dev_info.feature_flags;
5430
5431         if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
5432                         (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
5433                 printf("Device doesn't support RAW data-path APIs.\n");
5434                 return TEST_SKIPPED;
5435         }
5436
5437         if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
5438                 return TEST_SKIPPED;
5439
5440         if (op_mode == OUT_OF_PLACE) {
5441                 if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
5442                         return TEST_SKIPPED;
5443                 if (!(feat_flags & RTE_CRYPTODEV_FF_DIGEST_ENCRYPTED)) {
5444                         printf("Device doesn't support digest encrypted.\n");
5445                         return TEST_SKIPPED;
5446                 }
5447         }
5448
5449         /* Create KASUMI session */
5450         retval = create_wireless_algo_auth_cipher_session(
5451                         ts_params->valid_devs[0],
5452                         (verify ? RTE_CRYPTO_CIPHER_OP_DECRYPT
5453                                         : RTE_CRYPTO_CIPHER_OP_ENCRYPT),
5454                         (verify ? RTE_CRYPTO_AUTH_OP_VERIFY
5455                                         : RTE_CRYPTO_AUTH_OP_GENERATE),
5456                         RTE_CRYPTO_AUTH_KASUMI_F9,
5457                         RTE_CRYPTO_CIPHER_KASUMI_F8,
5458                         tdata->key.data, tdata->key.len,
5459                         0, tdata->digest.len,
5460                         tdata->cipher_iv.len);
5461
5462         if (retval != 0)
5463                 return retval;
5464
5465         ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
5466         if (op_mode == OUT_OF_PLACE)
5467                 ut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
5468
5469         /* clear mbuf payload */
5470         memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
5471                 rte_pktmbuf_tailroom(ut_params->ibuf));
5472         if (op_mode == OUT_OF_PLACE)
5473                 memset(rte_pktmbuf_mtod(ut_params->obuf, uint8_t *), 0,
5474                         rte_pktmbuf_tailroom(ut_params->obuf));
5475
5476         ciphertext_len = ceil_byte_length(tdata->ciphertext.len);
5477         plaintext_len = ceil_byte_length(tdata->plaintext.len);
5478         ciphertext_pad_len = RTE_ALIGN_CEIL(ciphertext_len, 16);
5479         plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16);
5480
5481         if (verify) {
5482                 ciphertext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
5483                                         ciphertext_pad_len);
5484                 memcpy(ciphertext, tdata->ciphertext.data, ciphertext_len);
5485                 if (op_mode == OUT_OF_PLACE)
5486                         rte_pktmbuf_append(ut_params->obuf, ciphertext_pad_len);
5487                 debug_hexdump(stdout, "ciphertext:", ciphertext,
5488                         ciphertext_len);
5489         } else {
5490                 plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
5491                                         plaintext_pad_len);
5492                 memcpy(plaintext, tdata->plaintext.data, plaintext_len);
5493                 if (op_mode == OUT_OF_PLACE)
5494                         rte_pktmbuf_append(ut_params->obuf, plaintext_pad_len);
5495                 debug_hexdump(stdout, "plaintext:", plaintext,
5496                         plaintext_len);
5497         }
5498
5499         /* Create KASUMI operation */
5500         retval = create_wireless_algo_auth_cipher_operation(
5501                 tdata->digest.data, tdata->digest.len,
5502                 tdata->cipher_iv.data, tdata->cipher_iv.len,
5503                 NULL, 0,
5504                 (tdata->digest.offset_bytes == 0 ?
5505                 (verify ? ciphertext_pad_len : plaintext_pad_len)
5506                         : tdata->digest.offset_bytes),
5507                 tdata->validCipherLenInBits.len,
5508                 tdata->validCipherOffsetInBits.len,
5509                 tdata->validAuthLenInBits.len,
5510                 0,
5511                 op_mode, 0, verify);
5512
5513         if (retval < 0)
5514                 return retval;
5515
5516         if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
5517                 process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
5518                                 ut_params->op, 1, 1, 1, tdata->cipher_iv.len);
5519         else
5520                 ut_params->op = process_crypto_request(ts_params->valid_devs[0],
5521                         ut_params->op);
5522
5523         TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
5524
5525         ut_params->obuf = (op_mode == IN_PLACE ?
5526                 ut_params->op->sym->m_src : ut_params->op->sym->m_dst);
5527
5528
5529         if (verify) {
5530                 if (ut_params->obuf)
5531                         plaintext = rte_pktmbuf_mtod(ut_params->obuf,
5532                                                         uint8_t *);
5533                 else
5534                         plaintext = ciphertext;
5535
5536                 debug_hexdump(stdout, "plaintext:", plaintext,
5537                         (tdata->plaintext.len >> 3) - tdata->digest.len);
5538                 debug_hexdump(stdout, "plaintext expected:",
5539                         tdata->plaintext.data,
5540                         (tdata->plaintext.len >> 3) - tdata->digest.len);
5541         } else {
5542                 if (ut_params->obuf)
5543                         ciphertext = rte_pktmbuf_mtod(ut_params->obuf,
5544                                                         uint8_t *);
5545                 else
5546                         ciphertext = plaintext;
5547
5548                 debug_hexdump(stdout, "ciphertext:", ciphertext,
5549                         ciphertext_len);
5550                 debug_hexdump(stdout, "ciphertext expected:",
5551                         tdata->ciphertext.data, tdata->ciphertext.len >> 3);
5552
5553                 ut_params->digest = rte_pktmbuf_mtod(
5554                         ut_params->obuf, uint8_t *) +
5555                         (tdata->digest.offset_bytes == 0 ?
5556                         plaintext_pad_len : tdata->digest.offset_bytes);
5557
5558                 debug_hexdump(stdout, "digest:", ut_params->digest,
5559                         tdata->digest.len);
5560                 debug_hexdump(stdout, "digest expected:",
5561                         tdata->digest.data, tdata->digest.len);
5562         }
5563
5564         /* Validate obuf */
5565         if (verify) {
5566                 TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
5567                         plaintext,
5568                         tdata->plaintext.data,
5569                         tdata->plaintext.len >> 3,
5570                         "KASUMI Plaintext data not as expected");
5571         } else {
5572                 TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
5573                         ciphertext,
5574                         tdata->ciphertext.data,
5575                         tdata->ciphertext.len >> 3,
5576                         "KASUMI Ciphertext data not as expected");
5577
5578                 TEST_ASSERT_BUFFERS_ARE_EQUAL(
5579                         ut_params->digest,
5580                         tdata->digest.data,
5581                         DIGEST_BYTE_LENGTH_KASUMI_F9,
5582                         "KASUMI Generated auth tag not as expected");
5583         }
5584         return 0;
5585 }
5586
5587 static int
5588 test_kasumi_auth_cipher_sgl(const struct kasumi_test_data *tdata,
5589         uint8_t op_mode, uint8_t verify)
5590 {
5591         struct crypto_testsuite_params *ts_params = &testsuite_params;
5592         struct crypto_unittest_params *ut_params = &unittest_params;
5593
5594         int retval;
5595
5596         const uint8_t *plaintext = NULL;
5597         const uint8_t *ciphertext = NULL;
5598         const uint8_t *digest = NULL;
5599         unsigned int plaintext_pad_len;
5600         unsigned int plaintext_len;
5601         unsigned int ciphertext_pad_len;
5602         unsigned int ciphertext_len;
5603         uint8_t buffer[10000];
5604         uint8_t digest_buffer[10000];
5605
5606         struct rte_cryptodev_info dev_info;
5607
5608         /* Verify the capabilities */
5609         struct rte_cryptodev_sym_capability_idx cap_idx;
5610         cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
5611         cap_idx.algo.auth = RTE_CRYPTO_AUTH_KASUMI_F9;
5612         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
5613                         &cap_idx) == NULL)
5614                 return TEST_SKIPPED;
5615         cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
5616         cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_KASUMI_F8;
5617         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
5618                         &cap_idx) == NULL)
5619                 return TEST_SKIPPED;
5620
5621         if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
5622                 return TEST_SKIPPED;
5623
5624         rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
5625
5626         uint64_t feat_flags = dev_info.feature_flags;
5627
5628         if (op_mode == IN_PLACE) {
5629                 if (!(feat_flags & RTE_CRYPTODEV_FF_IN_PLACE_SGL)) {
5630                         printf("Device doesn't support in-place scatter-gather "
5631                                         "in both input and output mbufs.\n");
5632                         return TEST_SKIPPED;
5633                 }
5634                 if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
5635                         (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
5636                         printf("Device doesn't support RAW data-path APIs.\n");
5637                         return TEST_SKIPPED;
5638                 }
5639         } else {
5640                 if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
5641                         return TEST_SKIPPED;
5642                 if (!(feat_flags & RTE_CRYPTODEV_FF_OOP_SGL_IN_SGL_OUT)) {
5643                         printf("Device doesn't support out-of-place scatter-gather "
5644                                         "in both input and output mbufs.\n");
5645                         return TEST_SKIPPED;
5646                 }
5647                 if (!(feat_flags & RTE_CRYPTODEV_FF_DIGEST_ENCRYPTED)) {
5648                         printf("Device doesn't support digest encrypted.\n");
5649                         return TEST_SKIPPED;
5650                 }
5651         }
5652
5653         /* Create KASUMI session */
5654         retval = create_wireless_algo_auth_cipher_session(
5655                         ts_params->valid_devs[0],
5656                         (verify ? RTE_CRYPTO_CIPHER_OP_DECRYPT
5657                                         : RTE_CRYPTO_CIPHER_OP_ENCRYPT),
5658                         (verify ? RTE_CRYPTO_AUTH_OP_VERIFY
5659                                         : RTE_CRYPTO_AUTH_OP_GENERATE),
5660                         RTE_CRYPTO_AUTH_KASUMI_F9,
5661                         RTE_CRYPTO_CIPHER_KASUMI_F8,
5662                         tdata->key.data, tdata->key.len,
5663                         0, tdata->digest.len,
5664                         tdata->cipher_iv.len);
5665
5666         if (retval != 0)
5667                 return retval;
5668
5669         ciphertext_len = ceil_byte_length(tdata->ciphertext.len);
5670         plaintext_len = ceil_byte_length(tdata->plaintext.len);
5671         ciphertext_pad_len = RTE_ALIGN_CEIL(ciphertext_len, 16);
5672         plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16);
5673
5674         ut_params->ibuf = create_segmented_mbuf(ts_params->mbuf_pool,
5675                         plaintext_pad_len, 15, 0);
5676         TEST_ASSERT_NOT_NULL(ut_params->ibuf,
5677                         "Failed to allocate input buffer in mempool");
5678
5679         if (op_mode == OUT_OF_PLACE) {
5680                 ut_params->obuf = create_segmented_mbuf(ts_params->mbuf_pool,
5681                                 plaintext_pad_len, 15, 0);
5682                 TEST_ASSERT_NOT_NULL(ut_params->obuf,
5683                                 "Failed to allocate output buffer in mempool");
5684         }
5685
5686         if (verify) {
5687                 pktmbuf_write(ut_params->ibuf, 0, ciphertext_len,
5688                         tdata->ciphertext.data);
5689                 ciphertext = rte_pktmbuf_read(ut_params->ibuf, 0,
5690                                         ciphertext_len, buffer);
5691                 debug_hexdump(stdout, "ciphertext:", ciphertext,
5692                         ciphertext_len);
5693         } else {
5694                 pktmbuf_write(ut_params->ibuf, 0, plaintext_len,
5695                         tdata->plaintext.data);
5696                 plaintext = rte_pktmbuf_read(ut_params->ibuf, 0,
5697                                         plaintext_len, buffer);
5698                 debug_hexdump(stdout, "plaintext:", plaintext,
5699                         plaintext_len);
5700         }
5701         memset(buffer, 0, sizeof(buffer));
5702
5703         /* Create KASUMI operation */
5704         retval = create_wireless_algo_auth_cipher_operation(
5705                 tdata->digest.data, tdata->digest.len,
5706                 tdata->cipher_iv.data, tdata->cipher_iv.len,
5707                 NULL, 0,
5708                 (tdata->digest.offset_bytes == 0 ?
5709                 (verify ? ciphertext_pad_len : plaintext_pad_len)
5710                         : tdata->digest.offset_bytes),
5711                 tdata->validCipherLenInBits.len,
5712                 tdata->validCipherOffsetInBits.len,
5713                 tdata->validAuthLenInBits.len,
5714                 0,
5715                 op_mode, 1, verify);
5716
5717         if (retval < 0)
5718                 return retval;
5719
5720         if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
5721                 process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
5722                                 ut_params->op, 1, 1, 1, tdata->cipher_iv.len);
5723         else
5724                 ut_params->op = process_crypto_request(ts_params->valid_devs[0],
5725                         ut_params->op);
5726
5727         TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
5728
5729         ut_params->obuf = (op_mode == IN_PLACE ?
5730                 ut_params->op->sym->m_src : ut_params->op->sym->m_dst);
5731
5732         if (verify) {
5733                 if (ut_params->obuf)
5734                         plaintext = rte_pktmbuf_read(ut_params->obuf, 0,
5735                                         plaintext_len, buffer);
5736                 else
5737                         plaintext = rte_pktmbuf_read(ut_params->ibuf, 0,
5738                                         plaintext_len, buffer);
5739
5740                 debug_hexdump(stdout, "plaintext:", plaintext,
5741                         (tdata->plaintext.len >> 3) - tdata->digest.len);
5742                 debug_hexdump(stdout, "plaintext expected:",
5743                         tdata->plaintext.data,
5744                         (tdata->plaintext.len >> 3) - tdata->digest.len);
5745         } else {
5746                 if (ut_params->obuf)
5747                         ciphertext = rte_pktmbuf_read(ut_params->obuf, 0,
5748                                         ciphertext_len, buffer);
5749                 else
5750                         ciphertext = rte_pktmbuf_read(ut_params->ibuf, 0,
5751                                         ciphertext_len, buffer);
5752
5753                 debug_hexdump(stdout, "ciphertext:", ciphertext,
5754                         ciphertext_len);
5755                 debug_hexdump(stdout, "ciphertext expected:",
5756                         tdata->ciphertext.data, tdata->ciphertext.len >> 3);
5757
5758                 if (ut_params->obuf)
5759                         digest = rte_pktmbuf_read(ut_params->obuf,
5760                                 (tdata->digest.offset_bytes == 0 ?
5761                                 plaintext_pad_len : tdata->digest.offset_bytes),
5762                                 tdata->digest.len, digest_buffer);
5763                 else
5764                         digest = rte_pktmbuf_read(ut_params->ibuf,
5765                                 (tdata->digest.offset_bytes == 0 ?
5766                                 plaintext_pad_len : tdata->digest.offset_bytes),
5767                                 tdata->digest.len, digest_buffer);
5768
5769                 debug_hexdump(stdout, "digest:", digest,
5770                         tdata->digest.len);
5771                 debug_hexdump(stdout, "digest expected:",
5772                         tdata->digest.data, tdata->digest.len);
5773         }
5774
5775         /* Validate obuf */
5776         if (verify) {
5777                 TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
5778                         plaintext,
5779                         tdata->plaintext.data,
5780                         tdata->plaintext.len >> 3,
5781                         "KASUMI Plaintext data not as expected");
5782         } else {
5783                 TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
5784                         ciphertext,
5785                         tdata->ciphertext.data,
5786                         tdata->validDataLenInBits.len,
5787                         "KASUMI Ciphertext data not as expected");
5788
5789                 TEST_ASSERT_BUFFERS_ARE_EQUAL(
5790                         digest,
5791                         tdata->digest.data,
5792                         DIGEST_BYTE_LENGTH_KASUMI_F9,
5793                         "KASUMI Generated auth tag not as expected");
5794         }
5795         return 0;
5796 }
5797
5798 static int
5799 test_kasumi_cipher_auth(const struct kasumi_test_data *tdata)
5800 {
5801         struct crypto_testsuite_params *ts_params = &testsuite_params;
5802         struct crypto_unittest_params *ut_params = &unittest_params;
5803
5804         int retval;
5805
5806         uint8_t *plaintext, *ciphertext;
5807         unsigned plaintext_pad_len;
5808         unsigned plaintext_len;
5809         struct rte_cryptodev_info dev_info;
5810
5811         rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
5812         uint64_t feat_flags = dev_info.feature_flags;
5813
5814         if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
5815                         (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
5816                 printf("Device doesn't support RAW data-path APIs.\n");
5817                 return TEST_SKIPPED;
5818         }
5819
5820         if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
5821                 return TEST_SKIPPED;
5822
5823         /* Verify the capabilities */
5824         struct rte_cryptodev_sym_capability_idx cap_idx;
5825         cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
5826         cap_idx.algo.auth = RTE_CRYPTO_AUTH_KASUMI_F9;
5827         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
5828                         &cap_idx) == NULL)
5829                 return TEST_SKIPPED;
5830         cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
5831         cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_KASUMI_F8;
5832         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
5833                         &cap_idx) == NULL)
5834                 return TEST_SKIPPED;
5835
5836         /* Create KASUMI session */
5837         retval = create_wireless_algo_cipher_auth_session(
5838                         ts_params->valid_devs[0],
5839                         RTE_CRYPTO_CIPHER_OP_ENCRYPT,
5840                         RTE_CRYPTO_AUTH_OP_GENERATE,
5841                         RTE_CRYPTO_AUTH_KASUMI_F9,
5842                         RTE_CRYPTO_CIPHER_KASUMI_F8,
5843                         tdata->key.data, tdata->key.len,
5844                         0, tdata->digest.len,
5845                         tdata->cipher_iv.len);
5846         if (retval != 0)
5847                 return retval;
5848
5849         ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
5850
5851         /* clear mbuf payload */
5852         memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
5853                         rte_pktmbuf_tailroom(ut_params->ibuf));
5854
5855         plaintext_len = ceil_byte_length(tdata->plaintext.len);
5856         /* Append data which is padded to a multiple of */
5857         /* the algorithms block size */
5858         plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16);
5859         plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
5860                                 plaintext_pad_len);
5861         memcpy(plaintext, tdata->plaintext.data, plaintext_len);
5862
5863         debug_hexdump(stdout, "plaintext:", plaintext, plaintext_len);
5864
5865         /* Create KASUMI operation */
5866         retval = create_wireless_algo_cipher_hash_operation(tdata->digest.data,
5867                                 tdata->digest.len, NULL, 0,
5868                                 plaintext_pad_len, RTE_CRYPTO_AUTH_OP_GENERATE,
5869                                 tdata->cipher_iv.data, tdata->cipher_iv.len,
5870                                 RTE_ALIGN_CEIL(tdata->validCipherLenInBits.len, 8),
5871                                 tdata->validCipherOffsetInBits.len,
5872                                 tdata->validAuthLenInBits.len,
5873                                 0
5874                                 );
5875         if (retval < 0)
5876                 return retval;
5877
5878         if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
5879                 process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
5880                                 ut_params->op, 1, 1, 1, tdata->cipher_iv.len);
5881         else
5882                 ut_params->op = process_crypto_request(ts_params->valid_devs[0],
5883                         ut_params->op);
5884         TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
5885
5886         if (ut_params->op->sym->m_dst)
5887                 ut_params->obuf = ut_params->op->sym->m_dst;
5888         else
5889                 ut_params->obuf = ut_params->op->sym->m_src;
5890
5891         ciphertext = rte_pktmbuf_mtod_offset(ut_params->obuf, uint8_t *,
5892                                 tdata->validCipherOffsetInBits.len >> 3);
5893
5894         ut_params->digest = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *)
5895                         + plaintext_pad_len;
5896
5897         const uint8_t *reference_ciphertext = tdata->ciphertext.data +
5898                                 (tdata->validCipherOffsetInBits.len >> 3);
5899         /* Validate obuf */
5900         TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
5901                 ciphertext,
5902                 reference_ciphertext,
5903                 tdata->validCipherLenInBits.len,
5904                 "KASUMI Ciphertext data not as expected");
5905
5906         /* Validate obuf */
5907         TEST_ASSERT_BUFFERS_ARE_EQUAL(
5908                 ut_params->digest,
5909                 tdata->digest.data,
5910                 DIGEST_BYTE_LENGTH_SNOW3G_UIA2,
5911                 "KASUMI Generated auth tag not as expected");
5912         return 0;
5913 }
5914
5915 static int
5916 check_cipher_capability(const struct crypto_testsuite_params *ts_params,
5917                         const enum rte_crypto_cipher_algorithm cipher_algo,
5918                         const uint16_t key_size, const uint16_t iv_size)
5919 {
5920         struct rte_cryptodev_sym_capability_idx cap_idx;
5921         const struct rte_cryptodev_symmetric_capability *cap;
5922
5923         /* Check if device supports the algorithm */
5924         cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
5925         cap_idx.algo.cipher = cipher_algo;
5926
5927         cap = rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
5928                         &cap_idx);
5929
5930         if (cap == NULL)
5931                 return -1;
5932
5933         /* Check if device supports key size and IV size */
5934         if (rte_cryptodev_sym_capability_check_cipher(cap, key_size,
5935                         iv_size) < 0) {
5936                 return -1;
5937         }
5938
5939         return 0;
5940 }
5941
5942 static int
5943 check_auth_capability(const struct crypto_testsuite_params *ts_params,
5944                         const enum rte_crypto_auth_algorithm auth_algo,
5945                         const uint16_t key_size, const uint16_t iv_size,
5946                         const uint16_t tag_size)
5947 {
5948         struct rte_cryptodev_sym_capability_idx cap_idx;
5949         const struct rte_cryptodev_symmetric_capability *cap;
5950
5951         /* Check if device supports the algorithm */
5952         cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
5953         cap_idx.algo.auth = auth_algo;
5954
5955         cap = rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
5956                         &cap_idx);
5957
5958         if (cap == NULL)
5959                 return -1;
5960
5961         /* Check if device supports key size and IV size */
5962         if (rte_cryptodev_sym_capability_check_auth(cap, key_size,
5963                         tag_size, iv_size) < 0) {
5964                 return -1;
5965         }
5966
5967         return 0;
5968 }
5969
5970 static int
5971 test_zuc_encryption(const struct wireless_test_data *tdata)
5972 {
5973         struct crypto_testsuite_params *ts_params = &testsuite_params;
5974         struct crypto_unittest_params *ut_params = &unittest_params;
5975
5976         int retval;
5977         uint8_t *plaintext, *ciphertext;
5978         unsigned plaintext_pad_len;
5979         unsigned plaintext_len;
5980         struct rte_cryptodev_info dev_info;
5981
5982         rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
5983         uint64_t feat_flags = dev_info.feature_flags;
5984
5985         if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
5986                         (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
5987                 printf("Device doesn't support RAW data-path APIs.\n");
5988                 return TEST_SKIPPED;
5989         }
5990
5991         if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
5992                 return TEST_SKIPPED;
5993
5994         /* Check if device supports ZUC EEA3 */
5995         if (check_cipher_capability(ts_params, RTE_CRYPTO_CIPHER_ZUC_EEA3,
5996                         tdata->key.len, tdata->cipher_iv.len) < 0)
5997                 return TEST_SKIPPED;
5998
5999         /* Create ZUC session */
6000         retval = create_wireless_algo_cipher_session(ts_params->valid_devs[0],
6001                                         RTE_CRYPTO_CIPHER_OP_ENCRYPT,
6002                                         RTE_CRYPTO_CIPHER_ZUC_EEA3,
6003                                         tdata->key.data, tdata->key.len,
6004                                         tdata->cipher_iv.len);
6005         if (retval != 0)
6006                 return retval;
6007
6008         ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
6009
6010         /* Clear mbuf payload */
6011         memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
6012                rte_pktmbuf_tailroom(ut_params->ibuf));
6013
6014         plaintext_len = ceil_byte_length(tdata->plaintext.len);
6015         /* Append data which is padded to a multiple */
6016         /* of the algorithms block size */
6017         plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 8);
6018         plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
6019                                 plaintext_pad_len);
6020         memcpy(plaintext, tdata->plaintext.data, plaintext_len);
6021
6022         debug_hexdump(stdout, "plaintext:", plaintext, plaintext_len);
6023
6024         /* Create ZUC operation */
6025         retval = create_wireless_algo_cipher_operation(tdata->cipher_iv.data,
6026                                         tdata->cipher_iv.len,
6027                                         tdata->plaintext.len,
6028                                         0);
6029         if (retval < 0)
6030                 return retval;
6031
6032         if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
6033                 process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
6034                                 ut_params->op, 1, 0, 1, tdata->cipher_iv.len);
6035         else
6036                 ut_params->op = process_crypto_request(ts_params->valid_devs[0],
6037                                                 ut_params->op);
6038         TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
6039
6040         ut_params->obuf = ut_params->op->sym->m_dst;
6041         if (ut_params->obuf)
6042                 ciphertext = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *);
6043         else
6044                 ciphertext = plaintext;
6045
6046         debug_hexdump(stdout, "ciphertext:", ciphertext, plaintext_len);
6047
6048         /* Validate obuf */
6049         TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
6050                 ciphertext,
6051                 tdata->ciphertext.data,
6052                 tdata->validCipherLenInBits.len,
6053                 "ZUC Ciphertext data not as expected");
6054         return 0;
6055 }
6056
6057 static int
6058 test_zuc_encryption_sgl(const struct wireless_test_data *tdata)
6059 {
6060         struct crypto_testsuite_params *ts_params = &testsuite_params;
6061         struct crypto_unittest_params *ut_params = &unittest_params;
6062
6063         int retval;
6064
6065         unsigned int plaintext_pad_len;
6066         unsigned int plaintext_len;
6067         const uint8_t *ciphertext;
6068         uint8_t ciphertext_buffer[2048];
6069         struct rte_cryptodev_info dev_info;
6070
6071         /* Check if device supports ZUC EEA3 */
6072         if (check_cipher_capability(ts_params, RTE_CRYPTO_CIPHER_ZUC_EEA3,
6073                         tdata->key.len, tdata->cipher_iv.len) < 0)
6074                 return TEST_SKIPPED;
6075
6076         if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
6077                 return TEST_SKIPPED;
6078
6079         rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
6080
6081         uint64_t feat_flags = dev_info.feature_flags;
6082
6083         if (!(feat_flags & RTE_CRYPTODEV_FF_IN_PLACE_SGL)) {
6084                 printf("Device doesn't support in-place scatter-gather. "
6085                                 "Test Skipped.\n");
6086                 return TEST_SKIPPED;
6087         }
6088
6089         if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
6090                         (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
6091                 printf("Device doesn't support RAW data-path APIs.\n");
6092                 return TEST_SKIPPED;
6093         }
6094
6095         plaintext_len = ceil_byte_length(tdata->plaintext.len);
6096
6097         /* Append data which is padded to a multiple */
6098         /* of the algorithms block size */
6099         plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 8);
6100
6101         ut_params->ibuf = create_segmented_mbuf(ts_params->mbuf_pool,
6102                         plaintext_pad_len, 10, 0);
6103
6104         pktmbuf_write(ut_params->ibuf, 0, plaintext_len,
6105                         tdata->plaintext.data);
6106
6107         /* Create ZUC session */
6108         retval = create_wireless_algo_cipher_session(ts_params->valid_devs[0],
6109                         RTE_CRYPTO_CIPHER_OP_ENCRYPT,
6110                         RTE_CRYPTO_CIPHER_ZUC_EEA3,
6111                         tdata->key.data, tdata->key.len,
6112                         tdata->cipher_iv.len);
6113         if (retval < 0)
6114                 return retval;
6115
6116         /* Clear mbuf payload */
6117
6118         pktmbuf_write(ut_params->ibuf, 0, plaintext_len, tdata->plaintext.data);
6119
6120         /* Create ZUC operation */
6121         retval = create_wireless_algo_cipher_operation(tdata->cipher_iv.data,
6122                         tdata->cipher_iv.len, tdata->plaintext.len,
6123                         0);
6124         if (retval < 0)
6125                 return retval;
6126
6127         if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
6128                 process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
6129                                 ut_params->op, 1, 0, 1, tdata->cipher_iv.len);
6130         else
6131                 ut_params->op = process_crypto_request(ts_params->valid_devs[0],
6132                                                 ut_params->op);
6133         TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
6134
6135         ut_params->obuf = ut_params->op->sym->m_dst;
6136         if (ut_params->obuf)
6137                 ciphertext = rte_pktmbuf_read(ut_params->obuf,
6138                         0, plaintext_len, ciphertext_buffer);
6139         else
6140                 ciphertext = rte_pktmbuf_read(ut_params->ibuf,
6141                         0, plaintext_len, ciphertext_buffer);
6142
6143         /* Validate obuf */
6144         debug_hexdump(stdout, "ciphertext:", ciphertext, plaintext_len);
6145
6146         /* Validate obuf */
6147         TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
6148                 ciphertext,
6149                 tdata->ciphertext.data,
6150                 tdata->validCipherLenInBits.len,
6151                 "ZUC Ciphertext data not as expected");
6152
6153         return 0;
6154 }
6155
6156 static int
6157 test_zuc_authentication(const struct wireless_test_data *tdata)
6158 {
6159         struct crypto_testsuite_params *ts_params = &testsuite_params;
6160         struct crypto_unittest_params *ut_params = &unittest_params;
6161
6162         int retval;
6163         unsigned plaintext_pad_len;
6164         unsigned plaintext_len;
6165         uint8_t *plaintext;
6166
6167         struct rte_cryptodev_info dev_info;
6168
6169         rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
6170         uint64_t feat_flags = dev_info.feature_flags;
6171
6172         if (!(feat_flags & RTE_CRYPTODEV_FF_NON_BYTE_ALIGNED_DATA) &&
6173                         (tdata->validAuthLenInBits.len % 8 != 0)) {
6174                 printf("Device doesn't support NON-Byte Aligned Data.\n");
6175                 return TEST_SKIPPED;
6176         }
6177
6178         if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
6179                         (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
6180                 printf("Device doesn't support RAW data-path APIs.\n");
6181                 return TEST_SKIPPED;
6182         }
6183
6184         if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
6185                 return TEST_SKIPPED;
6186
6187         /* Check if device supports ZUC EIA3 */
6188         if (check_auth_capability(ts_params, RTE_CRYPTO_AUTH_ZUC_EIA3,
6189                         tdata->key.len, tdata->auth_iv.len,
6190                         tdata->digest.len) < 0)
6191                 return TEST_SKIPPED;
6192
6193         /* Create ZUC session */
6194         retval = create_wireless_algo_hash_session(ts_params->valid_devs[0],
6195                         tdata->key.data, tdata->key.len,
6196                         tdata->auth_iv.len, tdata->digest.len,
6197                         RTE_CRYPTO_AUTH_OP_GENERATE,
6198                         RTE_CRYPTO_AUTH_ZUC_EIA3);
6199         if (retval != 0)
6200                 return retval;
6201
6202         /* alloc mbuf and set payload */
6203         ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
6204
6205         memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
6206         rte_pktmbuf_tailroom(ut_params->ibuf));
6207
6208         plaintext_len = ceil_byte_length(tdata->plaintext.len);
6209         /* Append data which is padded to a multiple of */
6210         /* the algorithms block size */
6211         plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 8);
6212         plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
6213                                 plaintext_pad_len);
6214         memcpy(plaintext, tdata->plaintext.data, plaintext_len);
6215
6216         /* Create ZUC operation */
6217         retval = create_wireless_algo_hash_operation(NULL, tdata->digest.len,
6218                         tdata->auth_iv.data, tdata->auth_iv.len,
6219                         plaintext_pad_len, RTE_CRYPTO_AUTH_OP_GENERATE,
6220                         tdata->validAuthLenInBits.len,
6221                         0);
6222         if (retval < 0)
6223                 return retval;
6224
6225         if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
6226                 process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
6227                                 ut_params->op, 0, 1, 1, 0);
6228         else
6229                 ut_params->op = process_crypto_request(ts_params->valid_devs[0],
6230                                 ut_params->op);
6231         ut_params->obuf = ut_params->op->sym->m_src;
6232         TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
6233         ut_params->digest = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *)
6234                         + plaintext_pad_len;
6235
6236         /* Validate obuf */
6237         TEST_ASSERT_BUFFERS_ARE_EQUAL(
6238         ut_params->digest,
6239         tdata->digest.data,
6240         tdata->digest.len,
6241         "ZUC Generated auth tag not as expected");
6242
6243         return 0;
6244 }
6245
6246 static int
6247 test_zuc_auth_cipher(const struct wireless_test_data *tdata,
6248         uint8_t op_mode, uint8_t verify)
6249 {
6250         struct crypto_testsuite_params *ts_params = &testsuite_params;
6251         struct crypto_unittest_params *ut_params = &unittest_params;
6252
6253         int retval;
6254
6255         uint8_t *plaintext = NULL, *ciphertext = NULL;
6256         unsigned int plaintext_pad_len;
6257         unsigned int plaintext_len;
6258         unsigned int ciphertext_pad_len;
6259         unsigned int ciphertext_len;
6260
6261         struct rte_cryptodev_info dev_info;
6262
6263         /* Check if device supports ZUC EEA3 */
6264         if (check_cipher_capability(ts_params, RTE_CRYPTO_CIPHER_ZUC_EEA3,
6265                         tdata->key.len, tdata->cipher_iv.len) < 0)
6266                 return TEST_SKIPPED;
6267
6268         /* Check if device supports ZUC EIA3 */
6269         if (check_auth_capability(ts_params, RTE_CRYPTO_AUTH_ZUC_EIA3,
6270                         tdata->key.len, tdata->auth_iv.len,
6271                         tdata->digest.len) < 0)
6272                 return TEST_SKIPPED;
6273
6274         rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
6275
6276         uint64_t feat_flags = dev_info.feature_flags;
6277
6278         if (!(feat_flags & RTE_CRYPTODEV_FF_DIGEST_ENCRYPTED)) {
6279                 printf("Device doesn't support digest encrypted.\n");
6280                 return TEST_SKIPPED;
6281         }
6282         if (op_mode == IN_PLACE) {
6283                 if (!(feat_flags & RTE_CRYPTODEV_FF_IN_PLACE_SGL)) {
6284                         printf("Device doesn't support in-place scatter-gather "
6285                                         "in both input and output mbufs.\n");
6286                         return TEST_SKIPPED;
6287                 }
6288
6289                 if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
6290                         (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
6291                         printf("Device doesn't support RAW data-path APIs.\n");
6292                         return TEST_SKIPPED;
6293                 }
6294         } else {
6295                 if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
6296                         return TEST_SKIPPED;
6297                 if (!(feat_flags & RTE_CRYPTODEV_FF_OOP_SGL_IN_SGL_OUT)) {
6298                         printf("Device doesn't support out-of-place scatter-gather "
6299                                         "in both input and output mbufs.\n");
6300                         return TEST_SKIPPED;
6301                 }
6302         }
6303
6304         /* Create ZUC session */
6305         retval = create_wireless_algo_auth_cipher_session(
6306                         ts_params->valid_devs[0],
6307                         (verify ? RTE_CRYPTO_CIPHER_OP_DECRYPT
6308                                         : RTE_CRYPTO_CIPHER_OP_ENCRYPT),
6309                         (verify ? RTE_CRYPTO_AUTH_OP_VERIFY
6310                                         : RTE_CRYPTO_AUTH_OP_GENERATE),
6311                         RTE_CRYPTO_AUTH_ZUC_EIA3,
6312                         RTE_CRYPTO_CIPHER_ZUC_EEA3,
6313                         tdata->key.data, tdata->key.len,
6314                         tdata->auth_iv.len, tdata->digest.len,
6315                         tdata->cipher_iv.len);
6316
6317         if (retval != 0)
6318                 return retval;
6319
6320         ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
6321         if (op_mode == OUT_OF_PLACE)
6322                 ut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
6323
6324         /* clear mbuf payload */
6325         memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
6326                 rte_pktmbuf_tailroom(ut_params->ibuf));
6327         if (op_mode == OUT_OF_PLACE)
6328                 memset(rte_pktmbuf_mtod(ut_params->obuf, uint8_t *), 0,
6329                         rte_pktmbuf_tailroom(ut_params->obuf));
6330
6331         ciphertext_len = ceil_byte_length(tdata->ciphertext.len);
6332         plaintext_len = ceil_byte_length(tdata->plaintext.len);
6333         ciphertext_pad_len = RTE_ALIGN_CEIL(ciphertext_len, 16);
6334         plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16);
6335
6336         if (verify) {
6337                 ciphertext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
6338                                         ciphertext_pad_len);
6339                 memcpy(ciphertext, tdata->ciphertext.data, ciphertext_len);
6340                 debug_hexdump(stdout, "ciphertext:", ciphertext,
6341                         ciphertext_len);
6342         } else {
6343                 /* make sure enough space to cover partial digest verify case */
6344                 plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
6345                                         ciphertext_pad_len);
6346                 memcpy(plaintext, tdata->plaintext.data, plaintext_len);
6347                 debug_hexdump(stdout, "plaintext:", plaintext,
6348                         plaintext_len);
6349         }
6350
6351         if (op_mode == OUT_OF_PLACE)
6352                 rte_pktmbuf_append(ut_params->obuf, ciphertext_pad_len);
6353
6354         /* Create ZUC operation */
6355         retval = create_wireless_algo_auth_cipher_operation(
6356                 tdata->digest.data, tdata->digest.len,
6357                 tdata->cipher_iv.data, tdata->cipher_iv.len,
6358                 tdata->auth_iv.data, tdata->auth_iv.len,
6359                 (tdata->digest.offset_bytes == 0 ?
6360                 (verify ? ciphertext_pad_len : plaintext_pad_len)
6361                         : tdata->digest.offset_bytes),
6362                 tdata->validCipherLenInBits.len,
6363                 tdata->validCipherOffsetInBits.len,
6364                 tdata->validAuthLenInBits.len,
6365                 0,
6366                 op_mode, 0, verify);
6367
6368         if (retval < 0)
6369                 return retval;
6370
6371         if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
6372                 process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
6373                                 ut_params->op, 1, 1, 1, tdata->cipher_iv.len);
6374         else
6375                 ut_params->op = process_crypto_request(ts_params->valid_devs[0],
6376                         ut_params->op);
6377
6378         TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
6379
6380         ut_params->obuf = (op_mode == IN_PLACE ?
6381                 ut_params->op->sym->m_src : ut_params->op->sym->m_dst);
6382
6383
6384         if (verify) {
6385                 if (ut_params->obuf)
6386                         plaintext = rte_pktmbuf_mtod(ut_params->obuf,
6387                                                         uint8_t *);
6388                 else
6389                         plaintext = ciphertext;
6390
6391                 debug_hexdump(stdout, "plaintext:", plaintext,
6392                         (tdata->plaintext.len >> 3) - tdata->digest.len);
6393                 debug_hexdump(stdout, "plaintext expected:",
6394                         tdata->plaintext.data,
6395                         (tdata->plaintext.len >> 3) - tdata->digest.len);
6396         } else {
6397                 if (ut_params->obuf)
6398                         ciphertext = rte_pktmbuf_mtod(ut_params->obuf,
6399                                                         uint8_t *);
6400                 else
6401                         ciphertext = plaintext;
6402
6403                 debug_hexdump(stdout, "ciphertext:", ciphertext,
6404                         ciphertext_len);
6405                 debug_hexdump(stdout, "ciphertext expected:",
6406                         tdata->ciphertext.data, tdata->ciphertext.len >> 3);
6407
6408                 ut_params->digest = rte_pktmbuf_mtod(
6409                         ut_params->obuf, uint8_t *) +
6410                         (tdata->digest.offset_bytes == 0 ?
6411                         plaintext_pad_len : tdata->digest.offset_bytes);
6412
6413                 debug_hexdump(stdout, "digest:", ut_params->digest,
6414                         tdata->digest.len);
6415                 debug_hexdump(stdout, "digest expected:",
6416                         tdata->digest.data, tdata->digest.len);
6417         }
6418
6419         /* Validate obuf */
6420         if (verify) {
6421                 TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
6422                         plaintext,
6423                         tdata->plaintext.data,
6424                         tdata->plaintext.len >> 3,
6425                         "ZUC Plaintext data not as expected");
6426         } else {
6427                 TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
6428                         ciphertext,
6429                         tdata->ciphertext.data,
6430                         tdata->ciphertext.len >> 3,
6431                         "ZUC Ciphertext data not as expected");
6432
6433                 TEST_ASSERT_BUFFERS_ARE_EQUAL(
6434                         ut_params->digest,
6435                         tdata->digest.data,
6436                         DIGEST_BYTE_LENGTH_KASUMI_F9,
6437                         "ZUC Generated auth tag not as expected");
6438         }
6439         return 0;
6440 }
6441
6442 static int
6443 test_zuc_auth_cipher_sgl(const struct wireless_test_data *tdata,
6444         uint8_t op_mode, uint8_t verify)
6445 {
6446         struct crypto_testsuite_params *ts_params = &testsuite_params;
6447         struct crypto_unittest_params *ut_params = &unittest_params;
6448
6449         int retval;
6450
6451         const uint8_t *plaintext = NULL;
6452         const uint8_t *ciphertext = NULL;
6453         const uint8_t *digest = NULL;
6454         unsigned int plaintext_pad_len;
6455         unsigned int plaintext_len;
6456         unsigned int ciphertext_pad_len;
6457         unsigned int ciphertext_len;
6458         uint8_t buffer[10000];
6459         uint8_t digest_buffer[10000];
6460
6461         struct rte_cryptodev_info dev_info;
6462
6463         /* Check if device supports ZUC EEA3 */
6464         if (check_cipher_capability(ts_params, RTE_CRYPTO_CIPHER_ZUC_EEA3,
6465                         tdata->key.len, tdata->cipher_iv.len) < 0)
6466                 return TEST_SKIPPED;
6467
6468         /* Check if device supports ZUC EIA3 */
6469         if (check_auth_capability(ts_params, RTE_CRYPTO_AUTH_ZUC_EIA3,
6470                         tdata->key.len, tdata->auth_iv.len,
6471                         tdata->digest.len) < 0)
6472                 return TEST_SKIPPED;
6473
6474         rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
6475
6476         uint64_t feat_flags = dev_info.feature_flags;
6477
6478         if (op_mode == IN_PLACE) {
6479                 if (!(feat_flags & RTE_CRYPTODEV_FF_IN_PLACE_SGL)) {
6480                         printf("Device doesn't support in-place scatter-gather "
6481                                         "in both input and output mbufs.\n");
6482                         return TEST_SKIPPED;
6483                 }
6484
6485                 if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
6486                         (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
6487                         printf("Device doesn't support RAW data-path APIs.\n");
6488                         return TEST_SKIPPED;
6489                 }
6490         } else {
6491                 if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
6492                         return TEST_SKIPPED;
6493                 if (!(feat_flags & RTE_CRYPTODEV_FF_OOP_SGL_IN_SGL_OUT)) {
6494                         printf("Device doesn't support out-of-place scatter-gather "
6495                                         "in both input and output mbufs.\n");
6496                         return TEST_SKIPPED;
6497                 }
6498                 if (!(feat_flags & RTE_CRYPTODEV_FF_DIGEST_ENCRYPTED)) {
6499                         printf("Device doesn't support digest encrypted.\n");
6500                         return TEST_SKIPPED;
6501                 }
6502         }
6503
6504         /* Create ZUC session */
6505         retval = create_wireless_algo_auth_cipher_session(
6506                         ts_params->valid_devs[0],
6507                         (verify ? RTE_CRYPTO_CIPHER_OP_DECRYPT
6508                                         : RTE_CRYPTO_CIPHER_OP_ENCRYPT),
6509                         (verify ? RTE_CRYPTO_AUTH_OP_VERIFY
6510                                         : RTE_CRYPTO_AUTH_OP_GENERATE),
6511                         RTE_CRYPTO_AUTH_ZUC_EIA3,
6512                         RTE_CRYPTO_CIPHER_ZUC_EEA3,
6513                         tdata->key.data, tdata->key.len,
6514                         tdata->auth_iv.len, tdata->digest.len,
6515                         tdata->cipher_iv.len);
6516
6517         if (retval != 0)
6518                 return retval;
6519
6520         ciphertext_len = ceil_byte_length(tdata->ciphertext.len);
6521         plaintext_len = ceil_byte_length(tdata->plaintext.len);
6522         ciphertext_pad_len = RTE_ALIGN_CEIL(ciphertext_len, 16);
6523         plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16);
6524
6525         ut_params->ibuf = create_segmented_mbuf(ts_params->mbuf_pool,
6526                         plaintext_pad_len, 15, 0);
6527         TEST_ASSERT_NOT_NULL(ut_params->ibuf,
6528                         "Failed to allocate input buffer in mempool");
6529
6530         if (op_mode == OUT_OF_PLACE) {
6531                 ut_params->obuf = create_segmented_mbuf(ts_params->mbuf_pool,
6532                                 plaintext_pad_len, 15, 0);
6533                 TEST_ASSERT_NOT_NULL(ut_params->obuf,
6534                                 "Failed to allocate output buffer in mempool");
6535         }
6536
6537         if (verify) {
6538                 pktmbuf_write(ut_params->ibuf, 0, ciphertext_len,
6539                         tdata->ciphertext.data);
6540                 ciphertext = rte_pktmbuf_read(ut_params->ibuf, 0,
6541                                         ciphertext_len, buffer);
6542                 debug_hexdump(stdout, "ciphertext:", ciphertext,
6543                         ciphertext_len);
6544         } else {
6545                 pktmbuf_write(ut_params->ibuf, 0, plaintext_len,
6546                         tdata->plaintext.data);
6547                 plaintext = rte_pktmbuf_read(ut_params->ibuf, 0,
6548                                         plaintext_len, buffer);
6549                 debug_hexdump(stdout, "plaintext:", plaintext,
6550                         plaintext_len);
6551         }
6552         memset(buffer, 0, sizeof(buffer));
6553
6554         /* Create ZUC operation */
6555         retval = create_wireless_algo_auth_cipher_operation(
6556                 tdata->digest.data, tdata->digest.len,
6557                 tdata->cipher_iv.data, tdata->cipher_iv.len,
6558                 NULL, 0,
6559                 (tdata->digest.offset_bytes == 0 ?
6560                 (verify ? ciphertext_pad_len : plaintext_pad_len)
6561                         : tdata->digest.offset_bytes),
6562                 tdata->validCipherLenInBits.len,
6563                 tdata->validCipherOffsetInBits.len,
6564                 tdata->validAuthLenInBits.len,
6565                 0,
6566                 op_mode, 1, verify);
6567
6568         if (retval < 0)
6569                 return retval;
6570
6571         if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
6572                 process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
6573                                 ut_params->op, 1, 1, 1, tdata->cipher_iv.len);
6574         else
6575                 ut_params->op = process_crypto_request(ts_params->valid_devs[0],
6576                         ut_params->op);
6577
6578         TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
6579
6580         ut_params->obuf = (op_mode == IN_PLACE ?
6581                 ut_params->op->sym->m_src : ut_params->op->sym->m_dst);
6582
6583         if (verify) {
6584                 if (ut_params->obuf)
6585                         plaintext = rte_pktmbuf_read(ut_params->obuf, 0,
6586                                         plaintext_len, buffer);
6587                 else
6588                         plaintext = rte_pktmbuf_read(ut_params->ibuf, 0,
6589                                         plaintext_len, buffer);
6590
6591                 debug_hexdump(stdout, "plaintext:", plaintext,
6592                         (tdata->plaintext.len >> 3) - tdata->digest.len);
6593                 debug_hexdump(stdout, "plaintext expected:",
6594                         tdata->plaintext.data,
6595                         (tdata->plaintext.len >> 3) - tdata->digest.len);
6596         } else {
6597                 if (ut_params->obuf)
6598                         ciphertext = rte_pktmbuf_read(ut_params->obuf, 0,
6599                                         ciphertext_len, buffer);
6600                 else
6601                         ciphertext = rte_pktmbuf_read(ut_params->ibuf, 0,
6602                                         ciphertext_len, buffer);
6603
6604                 debug_hexdump(stdout, "ciphertext:", ciphertext,
6605                         ciphertext_len);
6606                 debug_hexdump(stdout, "ciphertext expected:",
6607                         tdata->ciphertext.data, tdata->ciphertext.len >> 3);
6608
6609                 if (ut_params->obuf)
6610                         digest = rte_pktmbuf_read(ut_params->obuf,
6611                                 (tdata->digest.offset_bytes == 0 ?
6612                                 plaintext_pad_len : tdata->digest.offset_bytes),
6613                                 tdata->digest.len, digest_buffer);
6614                 else
6615                         digest = rte_pktmbuf_read(ut_params->ibuf,
6616                                 (tdata->digest.offset_bytes == 0 ?
6617                                 plaintext_pad_len : tdata->digest.offset_bytes),
6618                                 tdata->digest.len, digest_buffer);
6619
6620                 debug_hexdump(stdout, "digest:", digest,
6621                         tdata->digest.len);
6622                 debug_hexdump(stdout, "digest expected:",
6623                         tdata->digest.data, tdata->digest.len);
6624         }
6625
6626         /* Validate obuf */
6627         if (verify) {
6628                 TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
6629                         plaintext,
6630                         tdata->plaintext.data,
6631                         tdata->plaintext.len >> 3,
6632                         "ZUC Plaintext data not as expected");
6633         } else {
6634                 TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
6635                         ciphertext,
6636                         tdata->ciphertext.data,
6637                         tdata->validDataLenInBits.len,
6638                         "ZUC Ciphertext data not as expected");
6639
6640                 TEST_ASSERT_BUFFERS_ARE_EQUAL(
6641                         digest,
6642                         tdata->digest.data,
6643                         DIGEST_BYTE_LENGTH_KASUMI_F9,
6644                         "ZUC Generated auth tag not as expected");
6645         }
6646         return 0;
6647 }
6648
6649 static int
6650 test_kasumi_encryption_test_case_1(void)
6651 {
6652         return test_kasumi_encryption(&kasumi_test_case_1);
6653 }
6654
6655 static int
6656 test_kasumi_encryption_test_case_1_sgl(void)
6657 {
6658         return test_kasumi_encryption_sgl(&kasumi_test_case_1);
6659 }
6660
6661 static int
6662 test_kasumi_encryption_test_case_1_oop(void)
6663 {
6664         return test_kasumi_encryption_oop(&kasumi_test_case_1);
6665 }
6666
6667 static int
6668 test_kasumi_encryption_test_case_1_oop_sgl(void)
6669 {
6670         return test_kasumi_encryption_oop_sgl(&kasumi_test_case_1);
6671 }
6672
6673 static int
6674 test_kasumi_encryption_test_case_2(void)
6675 {
6676         return test_kasumi_encryption(&kasumi_test_case_2);
6677 }
6678
6679 static int
6680 test_kasumi_encryption_test_case_3(void)
6681 {
6682         return test_kasumi_encryption(&kasumi_test_case_3);
6683 }
6684
6685 static int
6686 test_kasumi_encryption_test_case_4(void)
6687 {
6688         return test_kasumi_encryption(&kasumi_test_case_4);
6689 }
6690
6691 static int
6692 test_kasumi_encryption_test_case_5(void)
6693 {
6694         return test_kasumi_encryption(&kasumi_test_case_5);
6695 }
6696
6697 static int
6698 test_kasumi_decryption_test_case_1(void)
6699 {
6700         return test_kasumi_decryption(&kasumi_test_case_1);
6701 }
6702
6703 static int
6704 test_kasumi_decryption_test_case_1_oop(void)
6705 {
6706         return test_kasumi_decryption_oop(&kasumi_test_case_1);
6707 }
6708
6709 static int
6710 test_kasumi_decryption_test_case_2(void)
6711 {
6712         return test_kasumi_decryption(&kasumi_test_case_2);
6713 }
6714
6715 static int
6716 test_kasumi_decryption_test_case_3(void)
6717 {
6718         /* rte_crypto_mbuf_to_vec does not support incomplete mbuf build */
6719         if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
6720                 return TEST_SKIPPED;
6721         return test_kasumi_decryption(&kasumi_test_case_3);
6722 }
6723
6724 static int
6725 test_kasumi_decryption_test_case_4(void)
6726 {
6727         return test_kasumi_decryption(&kasumi_test_case_4);
6728 }
6729
6730 static int
6731 test_kasumi_decryption_test_case_5(void)
6732 {
6733         return test_kasumi_decryption(&kasumi_test_case_5);
6734 }
6735 static int
6736 test_snow3g_encryption_test_case_1(void)
6737 {
6738         return test_snow3g_encryption(&snow3g_test_case_1);
6739 }
6740
6741 static int
6742 test_snow3g_encryption_test_case_1_oop(void)
6743 {
6744         return test_snow3g_encryption_oop(&snow3g_test_case_1);
6745 }
6746
6747 static int
6748 test_snow3g_encryption_test_case_1_oop_sgl(void)
6749 {
6750         return test_snow3g_encryption_oop_sgl(&snow3g_test_case_1);
6751 }
6752
6753
6754 static int
6755 test_snow3g_encryption_test_case_1_offset_oop(void)
6756 {
6757         return test_snow3g_encryption_offset_oop(&snow3g_test_case_1);
6758 }
6759
6760 static int
6761 test_snow3g_encryption_test_case_2(void)
6762 {
6763         return test_snow3g_encryption(&snow3g_test_case_2);
6764 }
6765
6766 static int
6767 test_snow3g_encryption_test_case_3(void)
6768 {
6769         return test_snow3g_encryption(&snow3g_test_case_3);
6770 }
6771
6772 static int
6773 test_snow3g_encryption_test_case_4(void)
6774 {
6775         return test_snow3g_encryption(&snow3g_test_case_4);
6776 }
6777
6778 static int
6779 test_snow3g_encryption_test_case_5(void)
6780 {
6781         return test_snow3g_encryption(&snow3g_test_case_5);
6782 }
6783
6784 static int
6785 test_snow3g_decryption_test_case_1(void)
6786 {
6787         return test_snow3g_decryption(&snow3g_test_case_1);
6788 }
6789
6790 static int
6791 test_snow3g_decryption_test_case_1_oop(void)
6792 {
6793         return test_snow3g_decryption_oop(&snow3g_test_case_1);
6794 }
6795
6796 static int
6797 test_snow3g_decryption_test_case_2(void)
6798 {
6799         return test_snow3g_decryption(&snow3g_test_case_2);
6800 }
6801
6802 static int
6803 test_snow3g_decryption_test_case_3(void)
6804 {
6805         return test_snow3g_decryption(&snow3g_test_case_3);
6806 }
6807
6808 static int
6809 test_snow3g_decryption_test_case_4(void)
6810 {
6811         return test_snow3g_decryption(&snow3g_test_case_4);
6812 }
6813
6814 static int
6815 test_snow3g_decryption_test_case_5(void)
6816 {
6817         return test_snow3g_decryption(&snow3g_test_case_5);
6818 }
6819
6820 /*
6821  * Function prepares snow3g_hash_test_data from snow3g_test_data.
6822  * Pattern digest from snow3g_test_data must be allocated as
6823  * 4 last bytes in plaintext.
6824  */
6825 static void
6826 snow3g_hash_test_vector_setup(const struct snow3g_test_data *pattern,
6827                 struct snow3g_hash_test_data *output)
6828 {
6829         if ((pattern != NULL) && (output != NULL)) {
6830                 output->key.len = pattern->key.len;
6831
6832                 memcpy(output->key.data,
6833                 pattern->key.data, pattern->key.len);
6834
6835                 output->auth_iv.len = pattern->auth_iv.len;
6836
6837                 memcpy(output->auth_iv.data,
6838                 pattern->auth_iv.data, pattern->auth_iv.len);
6839
6840                 output->plaintext.len = pattern->plaintext.len;
6841
6842                 memcpy(output->plaintext.data,
6843                 pattern->plaintext.data, pattern->plaintext.len >> 3);
6844
6845                 output->digest.len = pattern->digest.len;
6846
6847                 memcpy(output->digest.data,
6848                 &pattern->plaintext.data[pattern->digest.offset_bytes],
6849                 pattern->digest.len);
6850
6851                 output->validAuthLenInBits.len =
6852                 pattern->validAuthLenInBits.len;
6853         }
6854 }
6855
6856 /*
6857  * Test case verify computed cipher and digest from snow3g_test_case_7 data.
6858  */
6859 static int
6860 test_snow3g_decryption_with_digest_test_case_1(void)
6861 {
6862         struct snow3g_hash_test_data snow3g_hash_data;
6863         struct rte_cryptodev_info dev_info;
6864         struct crypto_testsuite_params *ts_params = &testsuite_params;
6865
6866         rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
6867         uint64_t feat_flags = dev_info.feature_flags;
6868
6869         if (!(feat_flags & RTE_CRYPTODEV_FF_DIGEST_ENCRYPTED)) {
6870                 printf("Device doesn't support encrypted digest operations.\n");
6871                 return TEST_SKIPPED;
6872         }
6873
6874         /*
6875          * Function prepare data for hash verification test case.
6876          * Digest is allocated in 4 last bytes in plaintext, pattern.
6877          */
6878         snow3g_hash_test_vector_setup(&snow3g_test_case_7, &snow3g_hash_data);
6879
6880         return test_snow3g_decryption(&snow3g_test_case_7) &
6881                         test_snow3g_authentication_verify(&snow3g_hash_data);
6882 }
6883
6884 static int
6885 test_snow3g_cipher_auth_test_case_1(void)
6886 {
6887         return test_snow3g_cipher_auth(&snow3g_test_case_3);
6888 }
6889
6890 static int
6891 test_snow3g_auth_cipher_test_case_1(void)
6892 {
6893         return test_snow3g_auth_cipher(
6894                 &snow3g_auth_cipher_test_case_1, IN_PLACE, 0);
6895 }
6896
6897 static int
6898 test_snow3g_auth_cipher_test_case_2(void)
6899 {
6900         return test_snow3g_auth_cipher(
6901                 &snow3g_auth_cipher_test_case_2, IN_PLACE, 0);
6902 }
6903
6904 static int
6905 test_snow3g_auth_cipher_test_case_2_oop(void)
6906 {
6907         return test_snow3g_auth_cipher(
6908                 &snow3g_auth_cipher_test_case_2, OUT_OF_PLACE, 0);
6909 }
6910
6911 static int
6912 test_snow3g_auth_cipher_part_digest_enc(void)
6913 {
6914         return test_snow3g_auth_cipher(
6915                 &snow3g_auth_cipher_partial_digest_encryption,
6916                         IN_PLACE, 0);
6917 }
6918
6919 static int
6920 test_snow3g_auth_cipher_part_digest_enc_oop(void)
6921 {
6922         return test_snow3g_auth_cipher(
6923                 &snow3g_auth_cipher_partial_digest_encryption,
6924                         OUT_OF_PLACE, 0);
6925 }
6926
6927 static int
6928 test_snow3g_auth_cipher_test_case_3_sgl(void)
6929 {
6930         /* rte_crypto_mbuf_to_vec does not support incomplete mbuf build */
6931         if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
6932                 return TEST_SKIPPED;
6933         return test_snow3g_auth_cipher_sgl(
6934                 &snow3g_auth_cipher_test_case_3, IN_PLACE, 0);
6935 }
6936
6937 static int
6938 test_snow3g_auth_cipher_test_case_3_oop_sgl(void)
6939 {
6940         return test_snow3g_auth_cipher_sgl(
6941                 &snow3g_auth_cipher_test_case_3, OUT_OF_PLACE, 0);
6942 }
6943
6944 static int
6945 test_snow3g_auth_cipher_part_digest_enc_sgl(void)
6946 {
6947         /* rte_crypto_mbuf_to_vec does not support incomplete mbuf build */
6948         if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
6949                 return TEST_SKIPPED;
6950         return test_snow3g_auth_cipher_sgl(
6951                 &snow3g_auth_cipher_partial_digest_encryption,
6952                         IN_PLACE, 0);
6953 }
6954
6955 static int
6956 test_snow3g_auth_cipher_part_digest_enc_oop_sgl(void)
6957 {
6958         return test_snow3g_auth_cipher_sgl(
6959                 &snow3g_auth_cipher_partial_digest_encryption,
6960                         OUT_OF_PLACE, 0);
6961 }
6962
6963 static int
6964 test_snow3g_auth_cipher_verify_test_case_1(void)
6965 {
6966         return test_snow3g_auth_cipher(
6967                 &snow3g_auth_cipher_test_case_1, IN_PLACE, 1);
6968 }
6969
6970 static int
6971 test_snow3g_auth_cipher_verify_test_case_2(void)
6972 {
6973         return test_snow3g_auth_cipher(
6974                 &snow3g_auth_cipher_test_case_2, IN_PLACE, 1);
6975 }
6976
6977 static int
6978 test_snow3g_auth_cipher_verify_test_case_2_oop(void)
6979 {
6980         return test_snow3g_auth_cipher(
6981                 &snow3g_auth_cipher_test_case_2, OUT_OF_PLACE, 1);
6982 }
6983
6984 static int
6985 test_snow3g_auth_cipher_verify_part_digest_enc(void)
6986 {
6987         return test_snow3g_auth_cipher(
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(void)
6994 {
6995         return test_snow3g_auth_cipher(
6996                 &snow3g_auth_cipher_partial_digest_encryption,
6997                         OUT_OF_PLACE, 1);
6998 }
6999
7000 static int
7001 test_snow3g_auth_cipher_verify_test_case_3_sgl(void)
7002 {
7003         return test_snow3g_auth_cipher_sgl(
7004                 &snow3g_auth_cipher_test_case_3, IN_PLACE, 1);
7005 }
7006
7007 static int
7008 test_snow3g_auth_cipher_verify_test_case_3_oop_sgl(void)
7009 {
7010         return test_snow3g_auth_cipher_sgl(
7011                 &snow3g_auth_cipher_test_case_3, OUT_OF_PLACE, 1);
7012 }
7013
7014 static int
7015 test_snow3g_auth_cipher_verify_part_digest_enc_sgl(void)
7016 {
7017         return test_snow3g_auth_cipher_sgl(
7018                 &snow3g_auth_cipher_partial_digest_encryption,
7019                         IN_PLACE, 1);
7020 }
7021
7022 static int
7023 test_snow3g_auth_cipher_verify_part_digest_enc_oop_sgl(void)
7024 {
7025         return test_snow3g_auth_cipher_sgl(
7026                 &snow3g_auth_cipher_partial_digest_encryption,
7027                         OUT_OF_PLACE, 1);
7028 }
7029
7030 static int
7031 test_snow3g_auth_cipher_with_digest_test_case_1(void)
7032 {
7033         return test_snow3g_auth_cipher(
7034                 &snow3g_test_case_7, IN_PLACE, 0);
7035 }
7036
7037 static int
7038 test_kasumi_auth_cipher_test_case_1(void)
7039 {
7040         return test_kasumi_auth_cipher(
7041                 &kasumi_test_case_3, IN_PLACE, 0);
7042 }
7043
7044 static int
7045 test_kasumi_auth_cipher_test_case_2(void)
7046 {
7047         return test_kasumi_auth_cipher(
7048                 &kasumi_auth_cipher_test_case_2, IN_PLACE, 0);
7049 }
7050
7051 static int
7052 test_kasumi_auth_cipher_test_case_2_oop(void)
7053 {
7054         return test_kasumi_auth_cipher(
7055                 &kasumi_auth_cipher_test_case_2, OUT_OF_PLACE, 0);
7056 }
7057
7058 static int
7059 test_kasumi_auth_cipher_test_case_2_sgl(void)
7060 {
7061         return test_kasumi_auth_cipher_sgl(
7062                 &kasumi_auth_cipher_test_case_2, IN_PLACE, 0);
7063 }
7064
7065 static int
7066 test_kasumi_auth_cipher_test_case_2_oop_sgl(void)
7067 {
7068         return test_kasumi_auth_cipher_sgl(
7069                 &kasumi_auth_cipher_test_case_2, OUT_OF_PLACE, 0);
7070 }
7071
7072 static int
7073 test_kasumi_auth_cipher_verify_test_case_1(void)
7074 {
7075         return test_kasumi_auth_cipher(
7076                 &kasumi_test_case_3, IN_PLACE, 1);
7077 }
7078
7079 static int
7080 test_kasumi_auth_cipher_verify_test_case_2(void)
7081 {
7082         return test_kasumi_auth_cipher(
7083                 &kasumi_auth_cipher_test_case_2, IN_PLACE, 1);
7084 }
7085
7086 static int
7087 test_kasumi_auth_cipher_verify_test_case_2_oop(void)
7088 {
7089         return test_kasumi_auth_cipher(
7090                 &kasumi_auth_cipher_test_case_2, OUT_OF_PLACE, 1);
7091 }
7092
7093 static int
7094 test_kasumi_auth_cipher_verify_test_case_2_sgl(void)
7095 {
7096         return test_kasumi_auth_cipher_sgl(
7097                 &kasumi_auth_cipher_test_case_2, IN_PLACE, 1);
7098 }
7099
7100 static int
7101 test_kasumi_auth_cipher_verify_test_case_2_oop_sgl(void)
7102 {
7103         return test_kasumi_auth_cipher_sgl(
7104                 &kasumi_auth_cipher_test_case_2, OUT_OF_PLACE, 1);
7105 }
7106
7107 static int
7108 test_kasumi_cipher_auth_test_case_1(void)
7109 {
7110         return test_kasumi_cipher_auth(&kasumi_test_case_6);
7111 }
7112
7113 static int
7114 test_zuc_encryption_test_case_1(void)
7115 {
7116         return test_zuc_encryption(&zuc_test_case_cipher_193b);
7117 }
7118
7119 static int
7120 test_zuc_encryption_test_case_2(void)
7121 {
7122         return test_zuc_encryption(&zuc_test_case_cipher_800b);
7123 }
7124
7125 static int
7126 test_zuc_encryption_test_case_3(void)
7127 {
7128         return test_zuc_encryption(&zuc_test_case_cipher_1570b);
7129 }
7130
7131 static int
7132 test_zuc_encryption_test_case_4(void)
7133 {
7134         return test_zuc_encryption(&zuc_test_case_cipher_2798b);
7135 }
7136
7137 static int
7138 test_zuc_encryption_test_case_5(void)
7139 {
7140         return test_zuc_encryption(&zuc_test_case_cipher_4019b);
7141 }
7142
7143 static int
7144 test_zuc_encryption_test_case_6_sgl(void)
7145 {
7146         return test_zuc_encryption_sgl(&zuc_test_case_cipher_193b);
7147 }
7148
7149 static int
7150 test_zuc_hash_generate_test_case_1(void)
7151 {
7152         return test_zuc_authentication(&zuc_test_case_auth_1b);
7153 }
7154
7155 static int
7156 test_zuc_hash_generate_test_case_2(void)
7157 {
7158         return test_zuc_authentication(&zuc_test_case_auth_90b);
7159 }
7160
7161 static int
7162 test_zuc_hash_generate_test_case_3(void)
7163 {
7164         return test_zuc_authentication(&zuc_test_case_auth_577b);
7165 }
7166
7167 static int
7168 test_zuc_hash_generate_test_case_4(void)
7169 {
7170         return test_zuc_authentication(&zuc_test_case_auth_2079b);
7171 }
7172
7173 static int
7174 test_zuc_hash_generate_test_case_5(void)
7175 {
7176         return test_zuc_authentication(&zuc_test_auth_5670b);
7177 }
7178
7179 static int
7180 test_zuc_hash_generate_test_case_6(void)
7181 {
7182         return test_zuc_authentication(&zuc_test_case_auth_128b);
7183 }
7184
7185 static int
7186 test_zuc_hash_generate_test_case_7(void)
7187 {
7188         return test_zuc_authentication(&zuc_test_case_auth_2080b);
7189 }
7190
7191 static int
7192 test_zuc_hash_generate_test_case_8(void)
7193 {
7194         return test_zuc_authentication(&zuc_test_case_auth_584b);
7195 }
7196
7197 static int
7198 test_zuc_hash_generate_test_case_9(void)
7199 {
7200         return test_zuc_authentication(&zuc_test_case_auth_4000b_mac_32b);
7201 }
7202
7203 static int
7204 test_zuc_hash_generate_test_case_10(void)
7205 {
7206         return test_zuc_authentication(&zuc_test_case_auth_4000b_mac_64b);
7207 }
7208
7209 static int
7210 test_zuc_hash_generate_test_case_11(void)
7211 {
7212         return test_zuc_authentication(&zuc_test_case_auth_4000b_mac_128b);
7213 }
7214
7215 static int
7216 test_zuc_cipher_auth_test_case_1(void)
7217 {
7218         return test_zuc_cipher_auth(&zuc_test_case_cipher_200b_auth_200b);
7219 }
7220
7221 static int
7222 test_zuc_cipher_auth_test_case_2(void)
7223 {
7224         return test_zuc_cipher_auth(&zuc_test_case_cipher_800b_auth_120b);
7225 }
7226
7227 static int
7228 test_zuc_auth_cipher_test_case_1(void)
7229 {
7230         return test_zuc_auth_cipher(
7231                 &zuc_auth_cipher_test_case_1, IN_PLACE, 0);
7232 }
7233
7234 static int
7235 test_zuc_auth_cipher_test_case_1_oop(void)
7236 {
7237         return test_zuc_auth_cipher(
7238                 &zuc_auth_cipher_test_case_1, OUT_OF_PLACE, 0);
7239 }
7240
7241 static int
7242 test_zuc_auth_cipher_test_case_1_sgl(void)
7243 {
7244         return test_zuc_auth_cipher_sgl(
7245                 &zuc_auth_cipher_test_case_1, IN_PLACE, 0);
7246 }
7247
7248 static int
7249 test_zuc_auth_cipher_test_case_1_oop_sgl(void)
7250 {
7251         return test_zuc_auth_cipher_sgl(
7252                 &zuc_auth_cipher_test_case_1, OUT_OF_PLACE, 0);
7253 }
7254
7255 static int
7256 test_zuc_auth_cipher_verify_test_case_1(void)
7257 {
7258         return test_zuc_auth_cipher(
7259                 &zuc_auth_cipher_test_case_1, IN_PLACE, 1);
7260 }
7261
7262 static int
7263 test_zuc_auth_cipher_verify_test_case_1_oop(void)
7264 {
7265         return test_zuc_auth_cipher(
7266                 &zuc_auth_cipher_test_case_1, OUT_OF_PLACE, 1);
7267 }
7268
7269 static int
7270 test_zuc_auth_cipher_verify_test_case_1_sgl(void)
7271 {
7272         return test_zuc_auth_cipher_sgl(
7273                 &zuc_auth_cipher_test_case_1, IN_PLACE, 1);
7274 }
7275
7276 static int
7277 test_zuc_auth_cipher_verify_test_case_1_oop_sgl(void)
7278 {
7279         return test_zuc_auth_cipher_sgl(
7280                 &zuc_auth_cipher_test_case_1, OUT_OF_PLACE, 1);
7281 }
7282
7283 static int
7284 test_zuc256_encryption_test_case_1(void)
7285 {
7286         return test_zuc_encryption(&zuc256_test_case_cipher_1);
7287 }
7288
7289 static int
7290 test_zuc256_encryption_test_case_2(void)
7291 {
7292         return test_zuc_encryption(&zuc256_test_case_cipher_2);
7293 }
7294
7295 static int
7296 test_zuc256_authentication_test_case_1(void)
7297 {
7298         return test_zuc_authentication(&zuc256_test_case_auth_1);
7299 }
7300
7301 static int
7302 test_zuc256_authentication_test_case_2(void)
7303 {
7304         return test_zuc_authentication(&zuc256_test_case_auth_2);
7305 }
7306
7307 static int
7308 test_mixed_check_if_unsupported(const struct mixed_cipher_auth_test_data *tdata)
7309 {
7310         uint8_t dev_id = testsuite_params.valid_devs[0];
7311
7312         struct rte_cryptodev_sym_capability_idx cap_idx;
7313
7314         /* Check if device supports particular cipher algorithm */
7315         cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
7316         cap_idx.algo.cipher = tdata->cipher_algo;
7317         if (rte_cryptodev_sym_capability_get(dev_id, &cap_idx) == NULL)
7318                 return TEST_SKIPPED;
7319
7320         /* Check if device supports particular hash algorithm */
7321         cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
7322         cap_idx.algo.auth = tdata->auth_algo;
7323         if (rte_cryptodev_sym_capability_get(dev_id, &cap_idx) == NULL)
7324                 return TEST_SKIPPED;
7325
7326         return 0;
7327 }
7328
7329 static int
7330 test_mixed_auth_cipher(const struct mixed_cipher_auth_test_data *tdata,
7331         uint8_t op_mode, uint8_t verify)
7332 {
7333         struct crypto_testsuite_params *ts_params = &testsuite_params;
7334         struct crypto_unittest_params *ut_params = &unittest_params;
7335
7336         int retval;
7337
7338         uint8_t *plaintext = NULL, *ciphertext = NULL;
7339         unsigned int plaintext_pad_len;
7340         unsigned int plaintext_len;
7341         unsigned int ciphertext_pad_len;
7342         unsigned int ciphertext_len;
7343
7344         struct rte_cryptodev_info dev_info;
7345         struct rte_crypto_op *op;
7346
7347         /* Check if device supports particular algorithms separately */
7348         if (test_mixed_check_if_unsupported(tdata))
7349                 return TEST_SKIPPED;
7350         if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
7351                 return TEST_SKIPPED;
7352
7353         rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
7354
7355         uint64_t feat_flags = dev_info.feature_flags;
7356
7357         if (!(feat_flags & RTE_CRYPTODEV_FF_DIGEST_ENCRYPTED)) {
7358                 printf("Device doesn't support digest encrypted.\n");
7359                 return TEST_SKIPPED;
7360         }
7361
7362         /* Create the session */
7363         if (verify)
7364                 retval = create_wireless_algo_cipher_auth_session(
7365                                 ts_params->valid_devs[0],
7366                                 RTE_CRYPTO_CIPHER_OP_DECRYPT,
7367                                 RTE_CRYPTO_AUTH_OP_VERIFY,
7368                                 tdata->auth_algo,
7369                                 tdata->cipher_algo,
7370                                 tdata->auth_key.data, tdata->auth_key.len,
7371                                 tdata->auth_iv.len, tdata->digest_enc.len,
7372                                 tdata->cipher_iv.len);
7373         else
7374                 retval = create_wireless_algo_auth_cipher_session(
7375                                 ts_params->valid_devs[0],
7376                                 RTE_CRYPTO_CIPHER_OP_ENCRYPT,
7377                                 RTE_CRYPTO_AUTH_OP_GENERATE,
7378                                 tdata->auth_algo,
7379                                 tdata->cipher_algo,
7380                                 tdata->auth_key.data, tdata->auth_key.len,
7381                                 tdata->auth_iv.len, tdata->digest_enc.len,
7382                                 tdata->cipher_iv.len);
7383         if (retval != 0)
7384                 return retval;
7385
7386         ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
7387         if (op_mode == OUT_OF_PLACE)
7388                 ut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
7389
7390         /* clear mbuf payload */
7391         memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
7392                 rte_pktmbuf_tailroom(ut_params->ibuf));
7393         if (op_mode == OUT_OF_PLACE) {
7394
7395                 memset(rte_pktmbuf_mtod(ut_params->obuf, uint8_t *), 0,
7396                                 rte_pktmbuf_tailroom(ut_params->obuf));
7397         }
7398
7399         ciphertext_len = ceil_byte_length(tdata->ciphertext.len_bits);
7400         plaintext_len = ceil_byte_length(tdata->plaintext.len_bits);
7401         ciphertext_pad_len = RTE_ALIGN_CEIL(ciphertext_len, 16);
7402         plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16);
7403
7404         if (verify) {
7405                 ciphertext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
7406                                 ciphertext_pad_len);
7407                 memcpy(ciphertext, tdata->ciphertext.data, ciphertext_len);
7408                 debug_hexdump(stdout, "ciphertext:", ciphertext,
7409                                 ciphertext_len);
7410         } else {
7411                 /* make sure enough space to cover partial digest verify case */
7412                 plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
7413                                 ciphertext_pad_len);
7414                 memcpy(plaintext, tdata->plaintext.data, plaintext_len);
7415                 debug_hexdump(stdout, "plaintext:", plaintext, plaintext_len);
7416         }
7417
7418         if (op_mode == OUT_OF_PLACE)
7419                 rte_pktmbuf_append(ut_params->obuf, ciphertext_pad_len);
7420
7421         /* Create the operation */
7422         retval = create_wireless_algo_auth_cipher_operation(
7423                         tdata->digest_enc.data, tdata->digest_enc.len,
7424                         tdata->cipher_iv.data, tdata->cipher_iv.len,
7425                         tdata->auth_iv.data, tdata->auth_iv.len,
7426                         (tdata->digest_enc.offset == 0 ?
7427                                 plaintext_pad_len
7428                                 : tdata->digest_enc.offset),
7429                         tdata->validCipherLen.len_bits,
7430                         tdata->cipher.offset_bits,
7431                         tdata->validAuthLen.len_bits,
7432                         tdata->auth.offset_bits,
7433                         op_mode, 0, verify);
7434
7435         if (retval < 0)
7436                 return retval;
7437
7438         op = process_crypto_request(ts_params->valid_devs[0], ut_params->op);
7439
7440         /* Check if the op failed because the device doesn't */
7441         /* support this particular combination of algorithms */
7442         if (op == NULL && ut_params->op->status ==
7443                         RTE_CRYPTO_OP_STATUS_INVALID_SESSION) {
7444                 printf("Device doesn't support this mixed combination. "
7445                                 "Test Skipped.\n");
7446                 return TEST_SKIPPED;
7447         }
7448         ut_params->op = op;
7449
7450         TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
7451
7452         ut_params->obuf = (op_mode == IN_PLACE ?
7453                         ut_params->op->sym->m_src : ut_params->op->sym->m_dst);
7454
7455         if (verify) {
7456                 if (ut_params->obuf)
7457                         plaintext = rte_pktmbuf_mtod(ut_params->obuf,
7458                                                         uint8_t *);
7459                 else
7460                         plaintext = ciphertext +
7461                                         (tdata->cipher.offset_bits >> 3);
7462
7463                 debug_hexdump(stdout, "plaintext:", plaintext,
7464                                 tdata->plaintext.len_bits >> 3);
7465                 debug_hexdump(stdout, "plaintext expected:",
7466                                 tdata->plaintext.data,
7467                                 tdata->plaintext.len_bits >> 3);
7468         } else {
7469                 if (ut_params->obuf)
7470                         ciphertext = rte_pktmbuf_mtod(ut_params->obuf,
7471                                         uint8_t *);
7472                 else
7473                         ciphertext = plaintext;
7474
7475                 debug_hexdump(stdout, "ciphertext:", ciphertext,
7476                                 ciphertext_len);
7477                 debug_hexdump(stdout, "ciphertext expected:",
7478                                 tdata->ciphertext.data,
7479                                 tdata->ciphertext.len_bits >> 3);
7480
7481                 ut_params->digest = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *)
7482                                 + (tdata->digest_enc.offset == 0 ?
7483                 plaintext_pad_len : tdata->digest_enc.offset);
7484
7485                 debug_hexdump(stdout, "digest:", ut_params->digest,
7486                                 tdata->digest_enc.len);
7487                 debug_hexdump(stdout, "digest expected:",
7488                                 tdata->digest_enc.data,
7489                                 tdata->digest_enc.len);
7490         }
7491
7492         if (!verify) {
7493                 TEST_ASSERT_BUFFERS_ARE_EQUAL(
7494                                 ut_params->digest,
7495                                 tdata->digest_enc.data,
7496                                 tdata->digest_enc.len,
7497                                 "Generated auth tag not as expected");
7498         }
7499
7500         if (tdata->cipher_algo != RTE_CRYPTO_CIPHER_NULL) {
7501                 if (verify) {
7502                         TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
7503                                         plaintext,
7504                                         tdata->plaintext.data,
7505                                         tdata->plaintext.len_bits >> 3,
7506                                         "Plaintext data not as expected");
7507                 } else {
7508                         TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
7509                                         ciphertext,
7510                                         tdata->ciphertext.data,
7511                                         tdata->validDataLen.len_bits,
7512                                         "Ciphertext data not as expected");
7513                 }
7514         }
7515
7516         TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
7517                         "crypto op processing failed");
7518
7519         return 0;
7520 }
7521
7522 static int
7523 test_mixed_auth_cipher_sgl(const struct mixed_cipher_auth_test_data *tdata,
7524         uint8_t op_mode, uint8_t verify)
7525 {
7526         struct crypto_testsuite_params *ts_params = &testsuite_params;
7527         struct crypto_unittest_params *ut_params = &unittest_params;
7528
7529         int retval;
7530
7531         const uint8_t *plaintext = NULL;
7532         const uint8_t *ciphertext = NULL;
7533         const uint8_t *digest = NULL;
7534         unsigned int plaintext_pad_len;
7535         unsigned int plaintext_len;
7536         unsigned int ciphertext_pad_len;
7537         unsigned int ciphertext_len;
7538         uint8_t buffer[10000];
7539         uint8_t digest_buffer[10000];
7540
7541         struct rte_cryptodev_info dev_info;
7542         struct rte_crypto_op *op;
7543
7544         /* Check if device supports particular algorithms */
7545         if (test_mixed_check_if_unsupported(tdata))
7546                 return TEST_SKIPPED;
7547         if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
7548                 return TEST_SKIPPED;
7549
7550         rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
7551
7552         uint64_t feat_flags = dev_info.feature_flags;
7553
7554         if (op_mode == IN_PLACE) {
7555                 if (!(feat_flags & RTE_CRYPTODEV_FF_IN_PLACE_SGL)) {
7556                         printf("Device doesn't support in-place scatter-gather "
7557                                         "in both input and output mbufs.\n");
7558                         return TEST_SKIPPED;
7559                 }
7560         } else {
7561                 if (!(feat_flags & RTE_CRYPTODEV_FF_OOP_SGL_IN_SGL_OUT)) {
7562                         printf("Device doesn't support out-of-place scatter-gather "
7563                                         "in both input and output mbufs.\n");
7564                         return TEST_SKIPPED;
7565                 }
7566                 if (!(feat_flags & RTE_CRYPTODEV_FF_DIGEST_ENCRYPTED)) {
7567                         printf("Device doesn't support digest encrypted.\n");
7568                         return TEST_SKIPPED;
7569                 }
7570         }
7571
7572         /* Create the session */
7573         if (verify)
7574                 retval = create_wireless_algo_cipher_auth_session(
7575                                 ts_params->valid_devs[0],
7576                                 RTE_CRYPTO_CIPHER_OP_DECRYPT,
7577                                 RTE_CRYPTO_AUTH_OP_VERIFY,
7578                                 tdata->auth_algo,
7579                                 tdata->cipher_algo,
7580                                 tdata->auth_key.data, tdata->auth_key.len,
7581                                 tdata->auth_iv.len, tdata->digest_enc.len,
7582                                 tdata->cipher_iv.len);
7583         else
7584                 retval = create_wireless_algo_auth_cipher_session(
7585                                 ts_params->valid_devs[0],
7586                                 RTE_CRYPTO_CIPHER_OP_ENCRYPT,
7587                                 RTE_CRYPTO_AUTH_OP_GENERATE,
7588                                 tdata->auth_algo,
7589                                 tdata->cipher_algo,
7590                                 tdata->auth_key.data, tdata->auth_key.len,
7591                                 tdata->auth_iv.len, tdata->digest_enc.len,
7592                                 tdata->cipher_iv.len);
7593         if (retval != 0)
7594                 return retval;
7595
7596         ciphertext_len = ceil_byte_length(tdata->ciphertext.len_bits);
7597         plaintext_len = ceil_byte_length(tdata->plaintext.len_bits);
7598         ciphertext_pad_len = RTE_ALIGN_CEIL(ciphertext_len, 16);
7599         plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16);
7600
7601         ut_params->ibuf = create_segmented_mbuf(ts_params->mbuf_pool,
7602                         ciphertext_pad_len, 15, 0);
7603         TEST_ASSERT_NOT_NULL(ut_params->ibuf,
7604                         "Failed to allocate input buffer in mempool");
7605
7606         if (op_mode == OUT_OF_PLACE) {
7607                 ut_params->obuf = create_segmented_mbuf(ts_params->mbuf_pool,
7608                                 plaintext_pad_len, 15, 0);
7609                 TEST_ASSERT_NOT_NULL(ut_params->obuf,
7610                                 "Failed to allocate output buffer in mempool");
7611         }
7612
7613         if (verify) {
7614                 pktmbuf_write(ut_params->ibuf, 0, ciphertext_len,
7615                         tdata->ciphertext.data);
7616                 ciphertext = rte_pktmbuf_read(ut_params->ibuf, 0,
7617                                         ciphertext_len, buffer);
7618                 debug_hexdump(stdout, "ciphertext:", ciphertext,
7619                         ciphertext_len);
7620         } else {
7621                 pktmbuf_write(ut_params->ibuf, 0, plaintext_len,
7622                         tdata->plaintext.data);
7623                 plaintext = rte_pktmbuf_read(ut_params->ibuf, 0,
7624                                         plaintext_len, buffer);
7625                 debug_hexdump(stdout, "plaintext:", plaintext,
7626                         plaintext_len);
7627         }
7628         memset(buffer, 0, sizeof(buffer));
7629
7630         /* Create the operation */
7631         retval = create_wireless_algo_auth_cipher_operation(
7632                         tdata->digest_enc.data, tdata->digest_enc.len,
7633                         tdata->cipher_iv.data, tdata->cipher_iv.len,
7634                         tdata->auth_iv.data, tdata->auth_iv.len,
7635                         (tdata->digest_enc.offset == 0 ?
7636                                 plaintext_pad_len
7637                                 : tdata->digest_enc.offset),
7638                         tdata->validCipherLen.len_bits,
7639                         tdata->cipher.offset_bits,
7640                         tdata->validAuthLen.len_bits,
7641                         tdata->auth.offset_bits,
7642                         op_mode, 1, verify);
7643
7644         if (retval < 0)
7645                 return retval;
7646
7647         op = process_crypto_request(ts_params->valid_devs[0], ut_params->op);
7648
7649         /* Check if the op failed because the device doesn't */
7650         /* support this particular combination of algorithms */
7651         if (op == NULL && ut_params->op->status ==
7652                         RTE_CRYPTO_OP_STATUS_INVALID_SESSION) {
7653                 printf("Device doesn't support this mixed combination. "
7654                                 "Test Skipped.\n");
7655                 return TEST_SKIPPED;
7656         }
7657         ut_params->op = op;
7658
7659         TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
7660
7661         ut_params->obuf = (op_mode == IN_PLACE ?
7662                         ut_params->op->sym->m_src : ut_params->op->sym->m_dst);
7663
7664         if (verify) {
7665                 if (ut_params->obuf)
7666                         plaintext = rte_pktmbuf_read(ut_params->obuf, 0,
7667                                         plaintext_len, buffer);
7668                 else
7669                         plaintext = rte_pktmbuf_read(ut_params->ibuf, 0,
7670                                         plaintext_len, buffer);
7671
7672                 debug_hexdump(stdout, "plaintext:", plaintext,
7673                                 (tdata->plaintext.len_bits >> 3) -
7674                                 tdata->digest_enc.len);
7675                 debug_hexdump(stdout, "plaintext expected:",
7676                                 tdata->plaintext.data,
7677                                 (tdata->plaintext.len_bits >> 3) -
7678                                 tdata->digest_enc.len);
7679         } else {
7680                 if (ut_params->obuf)
7681                         ciphertext = rte_pktmbuf_read(ut_params->obuf, 0,
7682                                         ciphertext_len, buffer);
7683                 else
7684                         ciphertext = rte_pktmbuf_read(ut_params->ibuf, 0,
7685                                         ciphertext_len, buffer);
7686
7687                 debug_hexdump(stdout, "ciphertext:", ciphertext,
7688                         ciphertext_len);
7689                 debug_hexdump(stdout, "ciphertext expected:",
7690                         tdata->ciphertext.data,
7691                         tdata->ciphertext.len_bits >> 3);
7692
7693                 if (ut_params->obuf)
7694                         digest = rte_pktmbuf_read(ut_params->obuf,
7695                                         (tdata->digest_enc.offset == 0 ?
7696                                                 plaintext_pad_len :
7697                                                 tdata->digest_enc.offset),
7698                                         tdata->digest_enc.len, digest_buffer);
7699                 else
7700                         digest = rte_pktmbuf_read(ut_params->ibuf,
7701                                         (tdata->digest_enc.offset == 0 ?
7702                                                 plaintext_pad_len :
7703                                                 tdata->digest_enc.offset),
7704                                         tdata->digest_enc.len, digest_buffer);
7705
7706                 debug_hexdump(stdout, "digest:", digest,
7707                                 tdata->digest_enc.len);
7708                 debug_hexdump(stdout, "digest expected:",
7709                                 tdata->digest_enc.data, tdata->digest_enc.len);
7710         }
7711
7712         if (!verify) {
7713                 TEST_ASSERT_BUFFERS_ARE_EQUAL(
7714                                 digest,
7715                                 tdata->digest_enc.data,
7716                                 tdata->digest_enc.len,
7717                                 "Generated auth tag not as expected");
7718         }
7719
7720         if (tdata->cipher_algo != RTE_CRYPTO_CIPHER_NULL) {
7721                 if (verify) {
7722                         TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
7723                                         plaintext,
7724                                         tdata->plaintext.data,
7725                                         tdata->plaintext.len_bits >> 3,
7726                                         "Plaintext data not as expected");
7727                 } else {
7728                         TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
7729                                         ciphertext,
7730                                         tdata->ciphertext.data,
7731                                         tdata->validDataLen.len_bits,
7732                                         "Ciphertext data not as expected");
7733                 }
7734         }
7735
7736         TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
7737                         "crypto op processing failed");
7738
7739         return 0;
7740 }
7741
7742 /** AUTH AES CMAC + CIPHER AES CTR */
7743
7744 static int
7745 test_aes_cmac_aes_ctr_digest_enc_test_case_1(void)
7746 {
7747         return test_mixed_auth_cipher(
7748                 &auth_aes_cmac_cipher_aes_ctr_test_case_1, IN_PLACE, 0);
7749 }
7750
7751 static int
7752 test_aes_cmac_aes_ctr_digest_enc_test_case_1_oop(void)
7753 {
7754         return test_mixed_auth_cipher(
7755                 &auth_aes_cmac_cipher_aes_ctr_test_case_1, OUT_OF_PLACE, 0);
7756 }
7757
7758 static int
7759 test_aes_cmac_aes_ctr_digest_enc_test_case_1_sgl(void)
7760 {
7761         return test_mixed_auth_cipher_sgl(
7762                 &auth_aes_cmac_cipher_aes_ctr_test_case_1, IN_PLACE, 0);
7763 }
7764
7765 static int
7766 test_aes_cmac_aes_ctr_digest_enc_test_case_1_oop_sgl(void)
7767 {
7768         return test_mixed_auth_cipher_sgl(
7769                 &auth_aes_cmac_cipher_aes_ctr_test_case_1, OUT_OF_PLACE, 0);
7770 }
7771
7772 static int
7773 test_verify_aes_cmac_aes_ctr_digest_enc_test_case_1(void)
7774 {
7775         return test_mixed_auth_cipher(
7776                 &auth_aes_cmac_cipher_aes_ctr_test_case_1, IN_PLACE, 1);
7777 }
7778
7779 static int
7780 test_verify_aes_cmac_aes_ctr_digest_enc_test_case_1_oop(void)
7781 {
7782         return test_mixed_auth_cipher(
7783                 &auth_aes_cmac_cipher_aes_ctr_test_case_1, OUT_OF_PLACE, 1);
7784 }
7785
7786 static int
7787 test_verify_aes_cmac_aes_ctr_digest_enc_test_case_1_sgl(void)
7788 {
7789         return test_mixed_auth_cipher_sgl(
7790                 &auth_aes_cmac_cipher_aes_ctr_test_case_1, IN_PLACE, 1);
7791 }
7792
7793 static int
7794 test_verify_aes_cmac_aes_ctr_digest_enc_test_case_1_oop_sgl(void)
7795 {
7796         return test_mixed_auth_cipher_sgl(
7797                 &auth_aes_cmac_cipher_aes_ctr_test_case_1, OUT_OF_PLACE, 1);
7798 }
7799
7800 /** MIXED AUTH + CIPHER */
7801
7802 static int
7803 test_auth_zuc_cipher_snow_test_case_1(void)
7804 {
7805         return test_mixed_auth_cipher(
7806                 &auth_zuc_cipher_snow_test_case_1, OUT_OF_PLACE, 0);
7807 }
7808
7809 static int
7810 test_verify_auth_zuc_cipher_snow_test_case_1(void)
7811 {
7812         return test_mixed_auth_cipher(
7813                 &auth_zuc_cipher_snow_test_case_1, OUT_OF_PLACE, 1);
7814 }
7815
7816 static int
7817 test_auth_aes_cmac_cipher_snow_test_case_1(void)
7818 {
7819         return test_mixed_auth_cipher(
7820                 &auth_aes_cmac_cipher_snow_test_case_1, OUT_OF_PLACE, 0);
7821 }
7822
7823 static int
7824 test_verify_auth_aes_cmac_cipher_snow_test_case_1(void)
7825 {
7826         return test_mixed_auth_cipher(
7827                 &auth_aes_cmac_cipher_snow_test_case_1, OUT_OF_PLACE, 1);
7828 }
7829
7830 static int
7831 test_auth_zuc_cipher_aes_ctr_test_case_1(void)
7832 {
7833         return test_mixed_auth_cipher(
7834                 &auth_zuc_cipher_aes_ctr_test_case_1, OUT_OF_PLACE, 0);
7835 }
7836
7837 static int
7838 test_verify_auth_zuc_cipher_aes_ctr_test_case_1(void)
7839 {
7840         return test_mixed_auth_cipher(
7841                 &auth_zuc_cipher_aes_ctr_test_case_1, OUT_OF_PLACE, 1);
7842 }
7843
7844 static int
7845 test_auth_snow_cipher_aes_ctr_test_case_1(void)
7846 {
7847         return test_mixed_auth_cipher(
7848                 &auth_snow_cipher_aes_ctr_test_case_1, OUT_OF_PLACE, 0);
7849 }
7850
7851 static int
7852 test_verify_auth_snow_cipher_aes_ctr_test_case_1(void)
7853 {
7854         return test_mixed_auth_cipher(
7855                 &auth_snow_cipher_aes_ctr_test_case_1, OUT_OF_PLACE, 1);
7856 }
7857
7858 static int
7859 test_auth_snow_cipher_zuc_test_case_1(void)
7860 {
7861         return test_mixed_auth_cipher(
7862                 &auth_snow_cipher_zuc_test_case_1, OUT_OF_PLACE, 0);
7863 }
7864
7865 static int
7866 test_verify_auth_snow_cipher_zuc_test_case_1(void)
7867 {
7868         return test_mixed_auth_cipher(
7869                 &auth_snow_cipher_zuc_test_case_1, OUT_OF_PLACE, 1);
7870 }
7871
7872 static int
7873 test_auth_aes_cmac_cipher_zuc_test_case_1(void)
7874 {
7875         return test_mixed_auth_cipher(
7876                 &auth_aes_cmac_cipher_zuc_test_case_1, OUT_OF_PLACE, 0);
7877 }
7878
7879 static int
7880 test_verify_auth_aes_cmac_cipher_zuc_test_case_1(void)
7881 {
7882         return test_mixed_auth_cipher(
7883                 &auth_aes_cmac_cipher_zuc_test_case_1, OUT_OF_PLACE, 1);
7884 }
7885
7886 static int
7887 test_auth_null_cipher_snow_test_case_1(void)
7888 {
7889         return test_mixed_auth_cipher(
7890                 &auth_null_cipher_snow_test_case_1, OUT_OF_PLACE, 0);
7891 }
7892
7893 static int
7894 test_verify_auth_null_cipher_snow_test_case_1(void)
7895 {
7896         return test_mixed_auth_cipher(
7897                 &auth_null_cipher_snow_test_case_1, OUT_OF_PLACE, 1);
7898 }
7899
7900 static int
7901 test_auth_null_cipher_zuc_test_case_1(void)
7902 {
7903         return test_mixed_auth_cipher(
7904                 &auth_null_cipher_zuc_test_case_1, OUT_OF_PLACE, 0);
7905 }
7906
7907 static int
7908 test_verify_auth_null_cipher_zuc_test_case_1(void)
7909 {
7910         return test_mixed_auth_cipher(
7911                 &auth_null_cipher_zuc_test_case_1, OUT_OF_PLACE, 1);
7912 }
7913
7914 static int
7915 test_auth_snow_cipher_null_test_case_1(void)
7916 {
7917         return test_mixed_auth_cipher(
7918                 &auth_snow_cipher_null_test_case_1, OUT_OF_PLACE, 0);
7919 }
7920
7921 static int
7922 test_verify_auth_snow_cipher_null_test_case_1(void)
7923 {
7924         return test_mixed_auth_cipher(
7925                 &auth_snow_cipher_null_test_case_1, OUT_OF_PLACE, 1);
7926 }
7927
7928 static int
7929 test_auth_zuc_cipher_null_test_case_1(void)
7930 {
7931         return test_mixed_auth_cipher(
7932                 &auth_zuc_cipher_null_test_case_1, OUT_OF_PLACE, 0);
7933 }
7934
7935 static int
7936 test_verify_auth_zuc_cipher_null_test_case_1(void)
7937 {
7938         return test_mixed_auth_cipher(
7939                 &auth_zuc_cipher_null_test_case_1, OUT_OF_PLACE, 1);
7940 }
7941
7942 static int
7943 test_auth_null_cipher_aes_ctr_test_case_1(void)
7944 {
7945         return test_mixed_auth_cipher(
7946                 &auth_null_cipher_aes_ctr_test_case_1, OUT_OF_PLACE, 0);
7947 }
7948
7949 static int
7950 test_verify_auth_null_cipher_aes_ctr_test_case_1(void)
7951 {
7952         return test_mixed_auth_cipher(
7953                 &auth_null_cipher_aes_ctr_test_case_1, OUT_OF_PLACE, 1);
7954 }
7955
7956 static int
7957 test_auth_aes_cmac_cipher_null_test_case_1(void)
7958 {
7959         return test_mixed_auth_cipher(
7960                 &auth_aes_cmac_cipher_null_test_case_1, OUT_OF_PLACE, 0);
7961 }
7962
7963 static int
7964 test_verify_auth_aes_cmac_cipher_null_test_case_1(void)
7965 {
7966         return test_mixed_auth_cipher(
7967                 &auth_aes_cmac_cipher_null_test_case_1, OUT_OF_PLACE, 1);
7968 }
7969
7970 /* ***** AEAD algorithm Tests ***** */
7971
7972 static int
7973 create_aead_session(uint8_t dev_id, enum rte_crypto_aead_algorithm algo,
7974                 enum rte_crypto_aead_operation op,
7975                 const uint8_t *key, const uint8_t key_len,
7976                 const uint16_t aad_len, const uint8_t auth_len,
7977                 uint8_t iv_len)
7978 {
7979         uint8_t aead_key[key_len];
7980         int status;
7981
7982         struct crypto_testsuite_params *ts_params = &testsuite_params;
7983         struct crypto_unittest_params *ut_params = &unittest_params;
7984
7985         memcpy(aead_key, key, key_len);
7986
7987         /* Setup AEAD Parameters */
7988         ut_params->aead_xform.type = RTE_CRYPTO_SYM_XFORM_AEAD;
7989         ut_params->aead_xform.next = NULL;
7990         ut_params->aead_xform.aead.algo = algo;
7991         ut_params->aead_xform.aead.op = op;
7992         ut_params->aead_xform.aead.key.data = aead_key;
7993         ut_params->aead_xform.aead.key.length = key_len;
7994         ut_params->aead_xform.aead.iv.offset = IV_OFFSET;
7995         ut_params->aead_xform.aead.iv.length = iv_len;
7996         ut_params->aead_xform.aead.digest_length = auth_len;
7997         ut_params->aead_xform.aead.aad_length = aad_len;
7998
7999         debug_hexdump(stdout, "key:", key, key_len);
8000
8001         /* Create Crypto session*/
8002         ut_params->sess = rte_cryptodev_sym_session_create(
8003                         ts_params->session_mpool);
8004         TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed");
8005
8006         status = rte_cryptodev_sym_session_init(dev_id, ut_params->sess,
8007                         &ut_params->aead_xform,
8008                         ts_params->session_priv_mpool);
8009
8010         return status;
8011 }
8012
8013 static int
8014 create_aead_xform(struct rte_crypto_op *op,
8015                 enum rte_crypto_aead_algorithm algo,
8016                 enum rte_crypto_aead_operation aead_op,
8017                 uint8_t *key, const uint8_t key_len,
8018                 const uint8_t aad_len, const uint8_t auth_len,
8019                 uint8_t iv_len)
8020 {
8021         TEST_ASSERT_NOT_NULL(rte_crypto_op_sym_xforms_alloc(op, 1),
8022                         "failed to allocate space for crypto transform");
8023
8024         struct rte_crypto_sym_op *sym_op = op->sym;
8025
8026         /* Setup AEAD Parameters */
8027         sym_op->xform->type = RTE_CRYPTO_SYM_XFORM_AEAD;
8028         sym_op->xform->next = NULL;
8029         sym_op->xform->aead.algo = algo;
8030         sym_op->xform->aead.op = aead_op;
8031         sym_op->xform->aead.key.data = key;
8032         sym_op->xform->aead.key.length = key_len;
8033         sym_op->xform->aead.iv.offset = IV_OFFSET;
8034         sym_op->xform->aead.iv.length = iv_len;
8035         sym_op->xform->aead.digest_length = auth_len;
8036         sym_op->xform->aead.aad_length = aad_len;
8037
8038         debug_hexdump(stdout, "key:", key, key_len);
8039
8040         return 0;
8041 }
8042
8043 static int
8044 create_aead_operation(enum rte_crypto_aead_operation op,
8045                 const struct aead_test_data *tdata)
8046 {
8047         struct crypto_testsuite_params *ts_params = &testsuite_params;
8048         struct crypto_unittest_params *ut_params = &unittest_params;
8049
8050         uint8_t *plaintext, *ciphertext;
8051         unsigned int aad_pad_len, plaintext_pad_len;
8052
8053         /* Generate Crypto op data structure */
8054         ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
8055                         RTE_CRYPTO_OP_TYPE_SYMMETRIC);
8056         TEST_ASSERT_NOT_NULL(ut_params->op,
8057                         "Failed to allocate symmetric crypto operation struct");
8058
8059         struct rte_crypto_sym_op *sym_op = ut_params->op->sym;
8060
8061         /* Append aad data */
8062         if (tdata->algo == RTE_CRYPTO_AEAD_AES_CCM) {
8063                 aad_pad_len = RTE_ALIGN_CEIL(tdata->aad.len + 18, 16);
8064                 sym_op->aead.aad.data = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
8065                                 aad_pad_len);
8066                 TEST_ASSERT_NOT_NULL(sym_op->aead.aad.data,
8067                                 "no room to append aad");
8068
8069                 sym_op->aead.aad.phys_addr =
8070                                 rte_pktmbuf_iova(ut_params->ibuf);
8071                 /* Copy AAD 18 bytes after the AAD pointer, according to the API */
8072                 memcpy(sym_op->aead.aad.data + 18, tdata->aad.data, tdata->aad.len);
8073                 debug_hexdump(stdout, "aad:", sym_op->aead.aad.data,
8074                         tdata->aad.len);
8075
8076                 /* Append IV at the end of the crypto operation*/
8077                 uint8_t *iv_ptr = rte_crypto_op_ctod_offset(ut_params->op,
8078                                 uint8_t *, IV_OFFSET);
8079
8080                 /* Copy IV 1 byte after the IV pointer, according to the API */
8081                 rte_memcpy(iv_ptr + 1, tdata->iv.data, tdata->iv.len);
8082                 debug_hexdump(stdout, "iv:", iv_ptr,
8083                         tdata->iv.len);
8084         } else {
8085                 aad_pad_len = RTE_ALIGN_CEIL(tdata->aad.len, 16);
8086                 sym_op->aead.aad.data = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
8087                                 aad_pad_len);
8088                 TEST_ASSERT_NOT_NULL(sym_op->aead.aad.data,
8089                                 "no room to append aad");
8090
8091                 sym_op->aead.aad.phys_addr =
8092                                 rte_pktmbuf_iova(ut_params->ibuf);
8093                 memcpy(sym_op->aead.aad.data, tdata->aad.data, tdata->aad.len);
8094                 debug_hexdump(stdout, "aad:", sym_op->aead.aad.data,
8095                         tdata->aad.len);
8096
8097                 /* Append IV at the end of the crypto operation*/
8098                 uint8_t *iv_ptr = rte_crypto_op_ctod_offset(ut_params->op,
8099                                 uint8_t *, IV_OFFSET);
8100
8101                 if (tdata->iv.len == 0) {
8102                         rte_memcpy(iv_ptr, tdata->iv.data, AES_GCM_J0_LENGTH);
8103                         debug_hexdump(stdout, "iv:", iv_ptr,
8104                                 AES_GCM_J0_LENGTH);
8105                 } else {
8106                         rte_memcpy(iv_ptr, tdata->iv.data, tdata->iv.len);
8107                         debug_hexdump(stdout, "iv:", iv_ptr,
8108                                 tdata->iv.len);
8109                 }
8110         }
8111
8112         /* Append plaintext/ciphertext */
8113         if (op == RTE_CRYPTO_AEAD_OP_ENCRYPT) {
8114                 plaintext_pad_len = RTE_ALIGN_CEIL(tdata->plaintext.len, 16);
8115                 plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
8116                                 plaintext_pad_len);
8117                 TEST_ASSERT_NOT_NULL(plaintext, "no room to append plaintext");
8118
8119                 memcpy(plaintext, tdata->plaintext.data, tdata->plaintext.len);
8120                 debug_hexdump(stdout, "plaintext:", plaintext,
8121                                 tdata->plaintext.len);
8122
8123                 if (ut_params->obuf) {
8124                         ciphertext = (uint8_t *)rte_pktmbuf_append(
8125                                         ut_params->obuf,
8126                                         plaintext_pad_len + aad_pad_len);
8127                         TEST_ASSERT_NOT_NULL(ciphertext,
8128                                         "no room to append ciphertext");
8129
8130                         memset(ciphertext + aad_pad_len, 0,
8131                                         tdata->ciphertext.len);
8132                 }
8133         } else {
8134                 plaintext_pad_len = RTE_ALIGN_CEIL(tdata->ciphertext.len, 16);
8135                 ciphertext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
8136                                 plaintext_pad_len);
8137                 TEST_ASSERT_NOT_NULL(ciphertext,
8138                                 "no room to append ciphertext");
8139
8140                 memcpy(ciphertext, tdata->ciphertext.data,
8141                                 tdata->ciphertext.len);
8142                 debug_hexdump(stdout, "ciphertext:", ciphertext,
8143                                 tdata->ciphertext.len);
8144
8145                 if (ut_params->obuf) {
8146                         plaintext = (uint8_t *)rte_pktmbuf_append(
8147                                         ut_params->obuf,
8148                                         plaintext_pad_len + aad_pad_len);
8149                         TEST_ASSERT_NOT_NULL(plaintext,
8150                                         "no room to append plaintext");
8151
8152                         memset(plaintext + aad_pad_len, 0,
8153                                         tdata->plaintext.len);
8154                 }
8155         }
8156
8157         /* Append digest data */
8158         if (op == RTE_CRYPTO_AEAD_OP_ENCRYPT) {
8159                 sym_op->aead.digest.data = (uint8_t *)rte_pktmbuf_append(
8160                                 ut_params->obuf ? ut_params->obuf :
8161                                                 ut_params->ibuf,
8162                                                 tdata->auth_tag.len);
8163                 TEST_ASSERT_NOT_NULL(sym_op->aead.digest.data,
8164                                 "no room to append digest");
8165                 memset(sym_op->aead.digest.data, 0, tdata->auth_tag.len);
8166                 sym_op->aead.digest.phys_addr = rte_pktmbuf_iova_offset(
8167                                 ut_params->obuf ? ut_params->obuf :
8168                                                 ut_params->ibuf,
8169                                                 plaintext_pad_len +
8170                                                 aad_pad_len);
8171         } else {
8172                 sym_op->aead.digest.data = (uint8_t *)rte_pktmbuf_append(
8173                                 ut_params->ibuf, tdata->auth_tag.len);
8174                 TEST_ASSERT_NOT_NULL(sym_op->aead.digest.data,
8175                                 "no room to append digest");
8176                 sym_op->aead.digest.phys_addr = rte_pktmbuf_iova_offset(
8177                                 ut_params->ibuf,
8178                                 plaintext_pad_len + aad_pad_len);
8179
8180                 rte_memcpy(sym_op->aead.digest.data, tdata->auth_tag.data,
8181                         tdata->auth_tag.len);
8182                 debug_hexdump(stdout, "digest:",
8183                         sym_op->aead.digest.data,
8184                         tdata->auth_tag.len);
8185         }
8186
8187         sym_op->aead.data.length = tdata->plaintext.len;
8188         sym_op->aead.data.offset = aad_pad_len;
8189
8190         return 0;
8191 }
8192
8193 static int
8194 test_authenticated_encryption(const struct aead_test_data *tdata)
8195 {
8196         struct crypto_testsuite_params *ts_params = &testsuite_params;
8197         struct crypto_unittest_params *ut_params = &unittest_params;
8198
8199         int retval;
8200         uint8_t *ciphertext, *auth_tag;
8201         uint16_t plaintext_pad_len;
8202         uint32_t i;
8203         struct rte_cryptodev_info dev_info;
8204
8205         rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
8206         uint64_t feat_flags = dev_info.feature_flags;
8207
8208         if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
8209                         (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
8210                 printf("Device doesn't support RAW data-path APIs.\n");
8211                 return TEST_SKIPPED;
8212         }
8213
8214         /* Verify the capabilities */
8215         struct rte_cryptodev_sym_capability_idx cap_idx;
8216         const struct rte_cryptodev_symmetric_capability *capability;
8217         cap_idx.type = RTE_CRYPTO_SYM_XFORM_AEAD;
8218         cap_idx.algo.aead = tdata->algo;
8219         capability = rte_cryptodev_sym_capability_get(
8220                         ts_params->valid_devs[0], &cap_idx);
8221         if (capability == NULL)
8222                 return TEST_SKIPPED;
8223         if (rte_cryptodev_sym_capability_check_aead(
8224                         capability, tdata->key.len, tdata->auth_tag.len,
8225                         tdata->aad.len, tdata->iv.len))
8226                 return TEST_SKIPPED;
8227
8228         /* Create AEAD session */
8229         retval = create_aead_session(ts_params->valid_devs[0],
8230                         tdata->algo,
8231                         RTE_CRYPTO_AEAD_OP_ENCRYPT,
8232                         tdata->key.data, tdata->key.len,
8233                         tdata->aad.len, tdata->auth_tag.len,
8234                         tdata->iv.len);
8235         if (retval < 0)
8236                 return retval;
8237
8238         if (tdata->aad.len > MBUF_SIZE) {
8239                 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->large_mbuf_pool);
8240                 /* Populate full size of add data */
8241                 for (i = 32; i < MAX_AAD_LENGTH; i += 32)
8242                         memcpy(&tdata->aad.data[i], &tdata->aad.data[0], 32);
8243         } else
8244                 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
8245
8246         /* clear mbuf payload */
8247         memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
8248                         rte_pktmbuf_tailroom(ut_params->ibuf));
8249
8250         /* Create AEAD operation */
8251         retval = create_aead_operation(RTE_CRYPTO_AEAD_OP_ENCRYPT, tdata);
8252         if (retval < 0)
8253                 return retval;
8254
8255         rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
8256
8257         ut_params->op->sym->m_src = ut_params->ibuf;
8258
8259         /* Process crypto operation */
8260         if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
8261                 process_cpu_aead_op(ts_params->valid_devs[0], ut_params->op);
8262         else if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
8263                 process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
8264                                 ut_params->op, 0, 0, 0, 0);
8265         else
8266                 TEST_ASSERT_NOT_NULL(
8267                         process_crypto_request(ts_params->valid_devs[0],
8268                         ut_params->op), "failed to process sym crypto op");
8269
8270         TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
8271                         "crypto op processing failed");
8272
8273         plaintext_pad_len = RTE_ALIGN_CEIL(tdata->plaintext.len, 16);
8274
8275         if (ut_params->op->sym->m_dst) {
8276                 ciphertext = rte_pktmbuf_mtod(ut_params->op->sym->m_dst,
8277                                 uint8_t *);
8278                 auth_tag = rte_pktmbuf_mtod_offset(ut_params->op->sym->m_dst,
8279                                 uint8_t *, plaintext_pad_len);
8280         } else {
8281                 ciphertext = rte_pktmbuf_mtod_offset(ut_params->op->sym->m_src,
8282                                 uint8_t *,
8283                                 ut_params->op->sym->cipher.data.offset);
8284                 auth_tag = ciphertext + plaintext_pad_len;
8285         }
8286
8287         debug_hexdump(stdout, "ciphertext:", ciphertext, tdata->ciphertext.len);
8288         debug_hexdump(stdout, "auth tag:", auth_tag, tdata->auth_tag.len);
8289
8290         /* Validate obuf */
8291         TEST_ASSERT_BUFFERS_ARE_EQUAL(
8292                         ciphertext,
8293                         tdata->ciphertext.data,
8294                         tdata->ciphertext.len,
8295                         "Ciphertext data not as expected");
8296
8297         TEST_ASSERT_BUFFERS_ARE_EQUAL(
8298                         auth_tag,
8299                         tdata->auth_tag.data,
8300                         tdata->auth_tag.len,
8301                         "Generated auth tag not as expected");
8302
8303         return 0;
8304
8305 }
8306
8307 #ifdef RTE_LIB_SECURITY
8308 static int
8309 security_proto_supported(enum rte_security_session_action_type action,
8310         enum rte_security_session_protocol proto)
8311 {
8312         struct crypto_testsuite_params *ts_params = &testsuite_params;
8313
8314         const struct rte_security_capability *capabilities;
8315         const struct rte_security_capability *capability;
8316         uint16_t i = 0;
8317
8318         struct rte_security_ctx *ctx = (struct rte_security_ctx *)
8319                                 rte_cryptodev_get_sec_ctx(
8320                                 ts_params->valid_devs[0]);
8321
8322
8323         capabilities = rte_security_capabilities_get(ctx);
8324
8325         if (capabilities == NULL)
8326                 return -ENOTSUP;
8327
8328         while ((capability = &capabilities[i++])->action !=
8329                         RTE_SECURITY_ACTION_TYPE_NONE) {
8330                 if (capability->action == action &&
8331                                 capability->protocol == proto)
8332                         return 0;
8333         }
8334
8335         return -ENOTSUP;
8336 }
8337
8338 /* Basic algorithm run function for async inplace mode.
8339  * Creates a session from input parameters and runs one operation
8340  * on input_vec. Checks the output of the crypto operation against
8341  * output_vec.
8342  */
8343 static int test_pdcp_proto(int i, int oop, enum rte_crypto_cipher_operation opc,
8344                            enum rte_crypto_auth_operation opa,
8345                            const uint8_t *input_vec, unsigned int input_vec_len,
8346                            const uint8_t *output_vec,
8347                            unsigned int output_vec_len,
8348                            enum rte_crypto_cipher_algorithm cipher_alg,
8349                            const uint8_t *cipher_key, uint32_t cipher_key_len,
8350                            enum rte_crypto_auth_algorithm auth_alg,
8351                            const uint8_t *auth_key, uint32_t auth_key_len,
8352                            uint8_t bearer, enum rte_security_pdcp_domain domain,
8353                            uint8_t packet_direction, uint8_t sn_size,
8354                            uint32_t hfn, uint32_t hfn_threshold, uint8_t sdap)
8355 {
8356         struct crypto_testsuite_params *ts_params = &testsuite_params;
8357         struct crypto_unittest_params *ut_params = &unittest_params;
8358         uint8_t *plaintext;
8359         int ret = TEST_SUCCESS;
8360         struct rte_security_ctx *ctx = (struct rte_security_ctx *)
8361                                 rte_cryptodev_get_sec_ctx(
8362                                 ts_params->valid_devs[0]);
8363
8364         /* Verify the capabilities */
8365         struct rte_security_capability_idx sec_cap_idx;
8366
8367         sec_cap_idx.action = ut_params->type;
8368         sec_cap_idx.protocol = RTE_SECURITY_PROTOCOL_PDCP;
8369         sec_cap_idx.pdcp.domain = domain;
8370         if (rte_security_capability_get(ctx, &sec_cap_idx) == NULL)
8371                 return TEST_SKIPPED;
8372
8373         /* Generate test mbuf data */
8374         ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
8375
8376         /* clear mbuf payload */
8377         memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
8378                         rte_pktmbuf_tailroom(ut_params->ibuf));
8379
8380         plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
8381                                                   input_vec_len);
8382         memcpy(plaintext, input_vec, input_vec_len);
8383
8384         /* Out of place support */
8385         if (oop) {
8386                 /*
8387                  * For out-op-place we need to alloc another mbuf
8388                  */
8389                 ut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
8390                 rte_pktmbuf_append(ut_params->obuf, output_vec_len);
8391         }
8392
8393         /* Setup Cipher Parameters */
8394         ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
8395         ut_params->cipher_xform.cipher.algo = cipher_alg;
8396         ut_params->cipher_xform.cipher.op = opc;
8397         ut_params->cipher_xform.cipher.key.data = cipher_key;
8398         ut_params->cipher_xform.cipher.key.length = cipher_key_len;
8399         ut_params->cipher_xform.cipher.iv.length =
8400                                 packet_direction ? 4 : 0;
8401         ut_params->cipher_xform.cipher.iv.offset = IV_OFFSET;
8402
8403         /* Setup HMAC Parameters if ICV header is required */
8404         if (auth_alg != 0) {
8405                 ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;
8406                 ut_params->auth_xform.next = NULL;
8407                 ut_params->auth_xform.auth.algo = auth_alg;
8408                 ut_params->auth_xform.auth.op = opa;
8409                 ut_params->auth_xform.auth.key.data = auth_key;
8410                 ut_params->auth_xform.auth.key.length = auth_key_len;
8411
8412                 ut_params->cipher_xform.next = &ut_params->auth_xform;
8413         } else {
8414                 ut_params->cipher_xform.next = NULL;
8415         }
8416
8417         struct rte_security_session_conf sess_conf = {
8418                 .action_type = ut_params->type,
8419                 .protocol = RTE_SECURITY_PROTOCOL_PDCP,
8420                 {.pdcp = {
8421                         .bearer = bearer,
8422                         .domain = domain,
8423                         .pkt_dir = packet_direction,
8424                         .sn_size = sn_size,
8425                         .hfn = packet_direction ? 0 : hfn,
8426                         /**
8427                          * hfn can be set as pdcp_test_hfn[i]
8428                          * if hfn_ovrd is not set. Here, PDCP
8429                          * packet direction is just used to
8430                          * run half of the cases with session
8431                          * HFN and other half with per packet
8432                          * HFN.
8433                          */
8434                         .hfn_threshold = hfn_threshold,
8435                         .hfn_ovrd = packet_direction ? 1 : 0,
8436                         .sdap_enabled = sdap,
8437                 } },
8438                 .crypto_xform = &ut_params->cipher_xform
8439         };
8440
8441         /* Create security session */
8442         ut_params->sec_session = rte_security_session_create(ctx,
8443                                 &sess_conf, ts_params->session_mpool,
8444                                 ts_params->session_priv_mpool);
8445
8446         if (!ut_params->sec_session) {
8447                 printf("TestCase %s()-%d line %d failed %s: ",
8448                         __func__, i, __LINE__, "Failed to allocate session");
8449                 ret = TEST_FAILED;
8450                 goto on_err;
8451         }
8452
8453         /* Generate crypto op data structure */
8454         ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
8455                         RTE_CRYPTO_OP_TYPE_SYMMETRIC);
8456         if (!ut_params->op) {
8457                 printf("TestCase %s()-%d line %d failed %s: ",
8458                         __func__, i, __LINE__,
8459                         "Failed to allocate symmetric crypto operation struct");
8460                 ret = TEST_FAILED;
8461                 goto on_err;
8462         }
8463
8464         uint32_t *per_pkt_hfn = rte_crypto_op_ctod_offset(ut_params->op,
8465                                         uint32_t *, IV_OFFSET);
8466         *per_pkt_hfn = packet_direction ? hfn : 0;
8467
8468         rte_security_attach_session(ut_params->op, ut_params->sec_session);
8469
8470         /* set crypto operation source mbuf */
8471         ut_params->op->sym->m_src = ut_params->ibuf;
8472         if (oop)
8473                 ut_params->op->sym->m_dst = ut_params->obuf;
8474
8475         /* Process crypto operation */
8476         if (process_crypto_request(ts_params->valid_devs[0], ut_params->op)
8477                 == NULL) {
8478                 printf("TestCase %s()-%d line %d failed %s: ",
8479                         __func__, i, __LINE__,
8480                         "failed to process sym crypto op");
8481                 ret = TEST_FAILED;
8482                 goto on_err;
8483         }
8484
8485         if (ut_params->op->status != RTE_CRYPTO_OP_STATUS_SUCCESS) {
8486                 printf("TestCase %s()-%d line %d failed %s: ",
8487                         __func__, i, __LINE__, "crypto op processing failed");
8488                 ret = TEST_FAILED;
8489                 goto on_err;
8490         }
8491
8492         /* Validate obuf */
8493         uint8_t *ciphertext = rte_pktmbuf_mtod(ut_params->op->sym->m_src,
8494                         uint8_t *);
8495         if (oop) {
8496                 ciphertext = rte_pktmbuf_mtod(ut_params->op->sym->m_dst,
8497                                 uint8_t *);
8498         }
8499
8500         if (memcmp(ciphertext, output_vec, output_vec_len)) {
8501                 printf("\n=======PDCP TestCase #%d failed: Data Mismatch ", i);
8502                 rte_hexdump(stdout, "encrypted", ciphertext, output_vec_len);
8503                 rte_hexdump(stdout, "reference", output_vec, output_vec_len);
8504                 ret = TEST_FAILED;
8505                 goto on_err;
8506         }
8507
8508 on_err:
8509         rte_crypto_op_free(ut_params->op);
8510         ut_params->op = NULL;
8511
8512         if (ut_params->sec_session)
8513                 rte_security_session_destroy(ctx, ut_params->sec_session);
8514         ut_params->sec_session = NULL;
8515
8516         rte_pktmbuf_free(ut_params->ibuf);
8517         ut_params->ibuf = NULL;
8518         if (oop) {
8519                 rte_pktmbuf_free(ut_params->obuf);
8520                 ut_params->obuf = NULL;
8521         }
8522
8523         return ret;
8524 }
8525
8526 static int
8527 test_pdcp_proto_SGL(int i, int oop,
8528         enum rte_crypto_cipher_operation opc,
8529         enum rte_crypto_auth_operation opa,
8530         uint8_t *input_vec,
8531         unsigned int input_vec_len,
8532         uint8_t *output_vec,
8533         unsigned int output_vec_len,
8534         uint32_t fragsz,
8535         uint32_t fragsz_oop)
8536 {
8537         struct crypto_testsuite_params *ts_params = &testsuite_params;
8538         struct crypto_unittest_params *ut_params = &unittest_params;
8539         uint8_t *plaintext;
8540         struct rte_mbuf *buf, *buf_oop = NULL;
8541         int ret = TEST_SUCCESS;
8542         int to_trn = 0;
8543         int to_trn_tbl[16];
8544         int segs = 1;
8545         unsigned int trn_data = 0;
8546         struct rte_cryptodev_info dev_info;
8547         uint64_t feat_flags;
8548         struct rte_security_ctx *ctx = (struct rte_security_ctx *)
8549                                 rte_cryptodev_get_sec_ctx(
8550                                 ts_params->valid_devs[0]);
8551         struct rte_mbuf *temp_mbuf;
8552
8553         rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
8554         feat_flags = dev_info.feature_flags;
8555
8556         if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
8557                         (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
8558                 printf("Device does not support RAW data-path APIs.\n");
8559                 return -ENOTSUP;
8560         }
8561         /* Verify the capabilities */
8562         struct rte_security_capability_idx sec_cap_idx;
8563
8564         sec_cap_idx.action = ut_params->type;
8565         sec_cap_idx.protocol = RTE_SECURITY_PROTOCOL_PDCP;
8566         sec_cap_idx.pdcp.domain = pdcp_test_params[i].domain;
8567         if (rte_security_capability_get(ctx, &sec_cap_idx) == NULL)
8568                 return TEST_SKIPPED;
8569
8570         if (fragsz > input_vec_len)
8571                 fragsz = input_vec_len;
8572
8573         uint16_t plaintext_len = fragsz;
8574         uint16_t frag_size_oop = fragsz_oop ? fragsz_oop : fragsz;
8575
8576         if (fragsz_oop > output_vec_len)
8577                 frag_size_oop = output_vec_len;
8578
8579         int ecx = 0;
8580         if (input_vec_len % fragsz != 0) {
8581                 if (input_vec_len / fragsz + 1 > 16)
8582                         return 1;
8583         } else if (input_vec_len / fragsz > 16)
8584                 return 1;
8585
8586         /* Out of place support */
8587         if (oop) {
8588                 /*
8589                  * For out-op-place we need to alloc another mbuf
8590                  */
8591                 ut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
8592                 rte_pktmbuf_append(ut_params->obuf, frag_size_oop);
8593                 buf_oop = ut_params->obuf;
8594         }
8595
8596         /* Generate test mbuf data */
8597         ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
8598
8599         /* clear mbuf payload */
8600         memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
8601                         rte_pktmbuf_tailroom(ut_params->ibuf));
8602
8603         plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
8604                                                   plaintext_len);
8605         memcpy(plaintext, input_vec, plaintext_len);
8606         trn_data += plaintext_len;
8607
8608         buf = ut_params->ibuf;
8609
8610         /*
8611          * Loop until no more fragments
8612          */
8613
8614         while (trn_data < input_vec_len) {
8615                 ++segs;
8616                 to_trn = (input_vec_len - trn_data < fragsz) ?
8617                                 (input_vec_len - trn_data) : fragsz;
8618
8619                 to_trn_tbl[ecx++] = to_trn;
8620
8621                 buf->next = rte_pktmbuf_alloc(ts_params->mbuf_pool);
8622                 buf = buf->next;
8623
8624                 memset(rte_pktmbuf_mtod(buf, uint8_t *), 0,
8625                                 rte_pktmbuf_tailroom(buf));
8626
8627                 /* OOP */
8628                 if (oop && !fragsz_oop) {
8629                         buf_oop->next =
8630                                         rte_pktmbuf_alloc(ts_params->mbuf_pool);
8631                         buf_oop = buf_oop->next;
8632                         memset(rte_pktmbuf_mtod(buf_oop, uint8_t *),
8633                                         0, rte_pktmbuf_tailroom(buf_oop));
8634                         rte_pktmbuf_append(buf_oop, to_trn);
8635                 }
8636
8637                 plaintext = (uint8_t *)rte_pktmbuf_append(buf,
8638                                 to_trn);
8639
8640                 memcpy(plaintext, input_vec + trn_data, to_trn);
8641                 trn_data += to_trn;
8642         }
8643
8644         ut_params->ibuf->nb_segs = segs;
8645
8646         segs = 1;
8647         if (fragsz_oop && oop) {
8648                 to_trn = 0;
8649                 ecx = 0;
8650
8651                 trn_data = frag_size_oop;
8652                 while (trn_data < output_vec_len) {
8653                         ++segs;
8654                         to_trn =
8655                                 (output_vec_len - trn_data <
8656                                                 frag_size_oop) ?
8657                                 (output_vec_len - trn_data) :
8658                                                 frag_size_oop;
8659
8660                         to_trn_tbl[ecx++] = to_trn;
8661
8662                         buf_oop->next =
8663                                 rte_pktmbuf_alloc(ts_params->mbuf_pool);
8664                         buf_oop = buf_oop->next;
8665                         memset(rte_pktmbuf_mtod(buf_oop, uint8_t *),
8666                                         0, rte_pktmbuf_tailroom(buf_oop));
8667                         rte_pktmbuf_append(buf_oop, to_trn);
8668
8669                         trn_data += to_trn;
8670                 }
8671                 ut_params->obuf->nb_segs = segs;
8672         }
8673
8674         /* Setup Cipher Parameters */
8675         ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
8676         ut_params->cipher_xform.cipher.algo = pdcp_test_params[i].cipher_alg;
8677         ut_params->cipher_xform.cipher.op = opc;
8678         ut_params->cipher_xform.cipher.key.data = pdcp_test_crypto_key[i];
8679         ut_params->cipher_xform.cipher.key.length =
8680                                         pdcp_test_params[i].cipher_key_len;
8681         ut_params->cipher_xform.cipher.iv.length = 0;
8682
8683         /* Setup HMAC Parameters if ICV header is required */
8684         if (pdcp_test_params[i].auth_alg != 0) {
8685                 ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;
8686                 ut_params->auth_xform.next = NULL;
8687                 ut_params->auth_xform.auth.algo = pdcp_test_params[i].auth_alg;
8688                 ut_params->auth_xform.auth.op = opa;
8689                 ut_params->auth_xform.auth.key.data = pdcp_test_auth_key[i];
8690                 ut_params->auth_xform.auth.key.length =
8691                                         pdcp_test_params[i].auth_key_len;
8692
8693                 ut_params->cipher_xform.next = &ut_params->auth_xform;
8694         } else {
8695                 ut_params->cipher_xform.next = NULL;
8696         }
8697
8698         struct rte_security_session_conf sess_conf = {
8699                 .action_type = ut_params->type,
8700                 .protocol = RTE_SECURITY_PROTOCOL_PDCP,
8701                 {.pdcp = {
8702                         .bearer = pdcp_test_bearer[i],
8703                         .domain = pdcp_test_params[i].domain,
8704                         .pkt_dir = pdcp_test_packet_direction[i],
8705                         .sn_size = pdcp_test_data_sn_size[i],
8706                         .hfn = pdcp_test_hfn[i],
8707                         .hfn_threshold = pdcp_test_hfn_threshold[i],
8708                         .hfn_ovrd = 0,
8709                 } },
8710                 .crypto_xform = &ut_params->cipher_xform
8711         };
8712
8713         /* Create security session */
8714         ut_params->sec_session = rte_security_session_create(ctx,
8715                                 &sess_conf, ts_params->session_mpool,
8716                                 ts_params->session_priv_mpool);
8717
8718         if (!ut_params->sec_session) {
8719                 printf("TestCase %s()-%d line %d failed %s: ",
8720                         __func__, i, __LINE__, "Failed to allocate session");
8721                 ret = TEST_FAILED;
8722                 goto on_err;
8723         }
8724
8725         /* Generate crypto op data structure */
8726         ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
8727                         RTE_CRYPTO_OP_TYPE_SYMMETRIC);
8728         if (!ut_params->op) {
8729                 printf("TestCase %s()-%d line %d failed %s: ",
8730                         __func__, i, __LINE__,
8731                         "Failed to allocate symmetric crypto operation struct");
8732                 ret = TEST_FAILED;
8733                 goto on_err;
8734         }
8735
8736         rte_security_attach_session(ut_params->op, ut_params->sec_session);
8737
8738         /* set crypto operation source mbuf */
8739         ut_params->op->sym->m_src = ut_params->ibuf;
8740         if (oop)
8741                 ut_params->op->sym->m_dst = ut_params->obuf;
8742
8743         /* Process crypto operation */
8744         temp_mbuf = ut_params->op->sym->m_src;
8745         if (global_api_test_type == CRYPTODEV_RAW_API_TEST) {
8746                 /* filling lengths */
8747                 while (temp_mbuf) {
8748                         ut_params->op->sym->cipher.data.length
8749                                 += temp_mbuf->pkt_len;
8750                         ut_params->op->sym->auth.data.length
8751                                 += temp_mbuf->pkt_len;
8752                         temp_mbuf = temp_mbuf->next;
8753                 }
8754                 process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
8755                         ut_params->op, 1, 1, 0, 0);
8756         } else {
8757                 ut_params->op = process_crypto_request(ts_params->valid_devs[0],
8758                                                         ut_params->op);
8759         }
8760         if (ut_params->op == NULL) {
8761                 printf("TestCase %s()-%d line %d failed %s: ",
8762                         __func__, i, __LINE__,
8763                         "failed to process sym crypto op");
8764                 ret = TEST_FAILED;
8765                 goto on_err;
8766         }
8767
8768         if (ut_params->op->status != RTE_CRYPTO_OP_STATUS_SUCCESS) {
8769                 printf("TestCase %s()-%d line %d failed %s: ",
8770                         __func__, i, __LINE__, "crypto op processing failed");
8771                 ret = TEST_FAILED;
8772                 goto on_err;
8773         }
8774
8775         /* Validate obuf */
8776         uint8_t *ciphertext = rte_pktmbuf_mtod(ut_params->op->sym->m_src,
8777                         uint8_t *);
8778         if (oop) {
8779                 ciphertext = rte_pktmbuf_mtod(ut_params->op->sym->m_dst,
8780                                 uint8_t *);
8781         }
8782         if (fragsz_oop)
8783                 fragsz = frag_size_oop;
8784         if (memcmp(ciphertext, output_vec, fragsz)) {
8785                 printf("\n=======PDCP TestCase #%d failed: Data Mismatch ", i);
8786                 rte_hexdump(stdout, "encrypted", ciphertext, fragsz);
8787                 rte_hexdump(stdout, "reference", output_vec, fragsz);
8788                 ret = TEST_FAILED;
8789                 goto on_err;
8790         }
8791
8792         buf = ut_params->op->sym->m_src->next;
8793         if (oop)
8794                 buf = ut_params->op->sym->m_dst->next;
8795
8796         unsigned int off = fragsz;
8797
8798         ecx = 0;
8799         while (buf) {
8800                 ciphertext = rte_pktmbuf_mtod(buf,
8801                                 uint8_t *);
8802                 if (memcmp(ciphertext, output_vec + off, to_trn_tbl[ecx])) {
8803                         printf("\n=======PDCP TestCase #%d failed: Data Mismatch ", i);
8804                         rte_hexdump(stdout, "encrypted", ciphertext, to_trn_tbl[ecx]);
8805                         rte_hexdump(stdout, "reference", output_vec + off,
8806                                         to_trn_tbl[ecx]);
8807                         ret = TEST_FAILED;
8808                         goto on_err;
8809                 }
8810                 off += to_trn_tbl[ecx++];
8811                 buf = buf->next;
8812         }
8813 on_err:
8814         rte_crypto_op_free(ut_params->op);
8815         ut_params->op = NULL;
8816
8817         if (ut_params->sec_session)
8818                 rte_security_session_destroy(ctx, ut_params->sec_session);
8819         ut_params->sec_session = NULL;
8820
8821         rte_pktmbuf_free(ut_params->ibuf);
8822         ut_params->ibuf = NULL;
8823         if (oop) {
8824                 rte_pktmbuf_free(ut_params->obuf);
8825                 ut_params->obuf = NULL;
8826         }
8827
8828         return ret;
8829 }
8830
8831 int
8832 test_pdcp_proto_cplane_encap(int i)
8833 {
8834         return test_pdcp_proto(
8835                 i, 0, RTE_CRYPTO_CIPHER_OP_ENCRYPT, RTE_CRYPTO_AUTH_OP_GENERATE,
8836                 pdcp_test_data_in[i], pdcp_test_data_in_len[i],
8837                 pdcp_test_data_out[i], pdcp_test_data_in_len[i] + 4,
8838                 pdcp_test_params[i].cipher_alg, pdcp_test_crypto_key[i],
8839                 pdcp_test_params[i].cipher_key_len,
8840                 pdcp_test_params[i].auth_alg, pdcp_test_auth_key[i],
8841                 pdcp_test_params[i].auth_key_len, pdcp_test_bearer[i],
8842                 pdcp_test_params[i].domain, pdcp_test_packet_direction[i],
8843                 pdcp_test_data_sn_size[i], pdcp_test_hfn[i],
8844                 pdcp_test_hfn_threshold[i], SDAP_DISABLED);
8845 }
8846
8847 int
8848 test_pdcp_proto_uplane_encap(int i)
8849 {
8850         return test_pdcp_proto(
8851                 i, 0, RTE_CRYPTO_CIPHER_OP_ENCRYPT, RTE_CRYPTO_AUTH_OP_GENERATE,
8852                 pdcp_test_data_in[i], pdcp_test_data_in_len[i],
8853                 pdcp_test_data_out[i], pdcp_test_data_in_len[i],
8854                 pdcp_test_params[i].cipher_alg, pdcp_test_crypto_key[i],
8855                 pdcp_test_params[i].cipher_key_len,
8856                 pdcp_test_params[i].auth_alg, pdcp_test_auth_key[i],
8857                 pdcp_test_params[i].auth_key_len, pdcp_test_bearer[i],
8858                 pdcp_test_params[i].domain, pdcp_test_packet_direction[i],
8859                 pdcp_test_data_sn_size[i], pdcp_test_hfn[i],
8860                 pdcp_test_hfn_threshold[i], SDAP_DISABLED);
8861 }
8862
8863 int
8864 test_pdcp_proto_uplane_encap_with_int(int i)
8865 {
8866         return test_pdcp_proto(
8867                 i, 0, RTE_CRYPTO_CIPHER_OP_ENCRYPT, RTE_CRYPTO_AUTH_OP_GENERATE,
8868                 pdcp_test_data_in[i], pdcp_test_data_in_len[i],
8869                 pdcp_test_data_out[i], pdcp_test_data_in_len[i] + 4,
8870                 pdcp_test_params[i].cipher_alg, pdcp_test_crypto_key[i],
8871                 pdcp_test_params[i].cipher_key_len,
8872                 pdcp_test_params[i].auth_alg, pdcp_test_auth_key[i],
8873                 pdcp_test_params[i].auth_key_len, pdcp_test_bearer[i],
8874                 pdcp_test_params[i].domain, pdcp_test_packet_direction[i],
8875                 pdcp_test_data_sn_size[i], pdcp_test_hfn[i],
8876                 pdcp_test_hfn_threshold[i], SDAP_DISABLED);
8877 }
8878
8879 int
8880 test_pdcp_proto_cplane_decap(int i)
8881 {
8882         return test_pdcp_proto(
8883                 i, 0, RTE_CRYPTO_CIPHER_OP_DECRYPT, RTE_CRYPTO_AUTH_OP_VERIFY,
8884                 pdcp_test_data_out[i], pdcp_test_data_in_len[i] + 4,
8885                 pdcp_test_data_in[i], pdcp_test_data_in_len[i],
8886                 pdcp_test_params[i].cipher_alg, pdcp_test_crypto_key[i],
8887                 pdcp_test_params[i].cipher_key_len,
8888                 pdcp_test_params[i].auth_alg, pdcp_test_auth_key[i],
8889                 pdcp_test_params[i].auth_key_len, pdcp_test_bearer[i],
8890                 pdcp_test_params[i].domain, pdcp_test_packet_direction[i],
8891                 pdcp_test_data_sn_size[i], pdcp_test_hfn[i],
8892                 pdcp_test_hfn_threshold[i], SDAP_DISABLED);
8893 }
8894
8895 int
8896 test_pdcp_proto_uplane_decap(int i)
8897 {
8898         return test_pdcp_proto(
8899                 i, 0, RTE_CRYPTO_CIPHER_OP_DECRYPT, RTE_CRYPTO_AUTH_OP_VERIFY,
8900                 pdcp_test_data_out[i], pdcp_test_data_in_len[i],
8901                 pdcp_test_data_in[i], pdcp_test_data_in_len[i],
8902                 pdcp_test_params[i].cipher_alg, pdcp_test_crypto_key[i],
8903                 pdcp_test_params[i].cipher_key_len,
8904                 pdcp_test_params[i].auth_alg, pdcp_test_auth_key[i],
8905                 pdcp_test_params[i].auth_key_len, pdcp_test_bearer[i],
8906                 pdcp_test_params[i].domain, pdcp_test_packet_direction[i],
8907                 pdcp_test_data_sn_size[i], pdcp_test_hfn[i],
8908                 pdcp_test_hfn_threshold[i], SDAP_DISABLED);
8909 }
8910
8911 int
8912 test_pdcp_proto_uplane_decap_with_int(int i)
8913 {
8914         return test_pdcp_proto(
8915                 i, 0, RTE_CRYPTO_CIPHER_OP_DECRYPT, RTE_CRYPTO_AUTH_OP_VERIFY,
8916                 pdcp_test_data_out[i], pdcp_test_data_in_len[i] + 4,
8917                 pdcp_test_data_in[i], pdcp_test_data_in_len[i],
8918                 pdcp_test_params[i].cipher_alg, pdcp_test_crypto_key[i],
8919                 pdcp_test_params[i].cipher_key_len,
8920                 pdcp_test_params[i].auth_alg, pdcp_test_auth_key[i],
8921                 pdcp_test_params[i].auth_key_len, pdcp_test_bearer[i],
8922                 pdcp_test_params[i].domain, pdcp_test_packet_direction[i],
8923                 pdcp_test_data_sn_size[i], pdcp_test_hfn[i],
8924                 pdcp_test_hfn_threshold[i], SDAP_DISABLED);
8925 }
8926
8927 static int
8928 test_PDCP_PROTO_SGL_in_place_32B(void)
8929 {
8930         /* i can be used for running any PDCP case
8931          * In this case it is uplane 12-bit AES-SNOW DL encap
8932          */
8933         int i = PDCP_UPLANE_12BIT_OFFSET + AES_ENC + SNOW_AUTH + DOWNLINK;
8934         return test_pdcp_proto_SGL(i, IN_PLACE,
8935                         RTE_CRYPTO_CIPHER_OP_ENCRYPT,
8936                         RTE_CRYPTO_AUTH_OP_GENERATE,
8937                         pdcp_test_data_in[i],
8938                         pdcp_test_data_in_len[i],
8939                         pdcp_test_data_out[i],
8940                         pdcp_test_data_in_len[i]+4,
8941                         32, 0);
8942 }
8943 static int
8944 test_PDCP_PROTO_SGL_oop_32B_128B(void)
8945 {
8946         /* i can be used for running any PDCP case
8947          * In this case it is uplane 18-bit NULL-NULL DL encap
8948          */
8949         int i = PDCP_UPLANE_18BIT_OFFSET + NULL_ENC + NULL_AUTH + DOWNLINK;
8950         return test_pdcp_proto_SGL(i, OUT_OF_PLACE,
8951                         RTE_CRYPTO_CIPHER_OP_ENCRYPT,
8952                         RTE_CRYPTO_AUTH_OP_GENERATE,
8953                         pdcp_test_data_in[i],
8954                         pdcp_test_data_in_len[i],
8955                         pdcp_test_data_out[i],
8956                         pdcp_test_data_in_len[i]+4,
8957                         32, 128);
8958 }
8959 static int
8960 test_PDCP_PROTO_SGL_oop_32B_40B(void)
8961 {
8962         /* i can be used for running any PDCP case
8963          * In this case it is uplane 18-bit AES DL encap
8964          */
8965         int i = PDCP_UPLANE_OFFSET + AES_ENC + EIGHTEEN_BIT_SEQ_NUM_OFFSET
8966                         + DOWNLINK;
8967         return test_pdcp_proto_SGL(i, OUT_OF_PLACE,
8968                         RTE_CRYPTO_CIPHER_OP_ENCRYPT,
8969                         RTE_CRYPTO_AUTH_OP_GENERATE,
8970                         pdcp_test_data_in[i],
8971                         pdcp_test_data_in_len[i],
8972                         pdcp_test_data_out[i],
8973                         pdcp_test_data_in_len[i],
8974                         32, 40);
8975 }
8976 static int
8977 test_PDCP_PROTO_SGL_oop_128B_32B(void)
8978 {
8979         /* i can be used for running any PDCP case
8980          * In this case it is cplane 12-bit AES-ZUC DL encap
8981          */
8982         int i = PDCP_CPLANE_LONG_SN_OFFSET + AES_ENC + ZUC_AUTH + DOWNLINK;
8983         return test_pdcp_proto_SGL(i, OUT_OF_PLACE,
8984                         RTE_CRYPTO_CIPHER_OP_ENCRYPT,
8985                         RTE_CRYPTO_AUTH_OP_GENERATE,
8986                         pdcp_test_data_in[i],
8987                         pdcp_test_data_in_len[i],
8988                         pdcp_test_data_out[i],
8989                         pdcp_test_data_in_len[i]+4,
8990                         128, 32);
8991 }
8992
8993 static int
8994 test_PDCP_SDAP_PROTO_encap_all(void)
8995 {
8996         int i = 0, size = 0;
8997         int err, all_err = TEST_SUCCESS;
8998         const struct pdcp_sdap_test *cur_test;
8999
9000         size = RTE_DIM(list_pdcp_sdap_tests);
9001
9002         for (i = 0; i < size; i++) {
9003                 cur_test = &list_pdcp_sdap_tests[i];
9004                 err = test_pdcp_proto(
9005                         i, 0, RTE_CRYPTO_CIPHER_OP_ENCRYPT,
9006                         RTE_CRYPTO_AUTH_OP_GENERATE, cur_test->data_in,
9007                         cur_test->in_len, cur_test->data_out,
9008                         cur_test->in_len + ((cur_test->auth_key) ? 4 : 0),
9009                         cur_test->param.cipher_alg, cur_test->cipher_key,
9010                         cur_test->param.cipher_key_len,
9011                         cur_test->param.auth_alg,
9012                         cur_test->auth_key, cur_test->param.auth_key_len,
9013                         cur_test->bearer, cur_test->param.domain,
9014                         cur_test->packet_direction, cur_test->sn_size,
9015                         cur_test->hfn,
9016                         cur_test->hfn_threshold, SDAP_ENABLED);
9017                 if (err) {
9018                         printf("\t%d) %s: Encapsulation failed\n",
9019                                         cur_test->test_idx,
9020                                         cur_test->param.name);
9021                         err = TEST_FAILED;
9022                 } else {
9023                         printf("\t%d) %s: Encap PASS\n", cur_test->test_idx,
9024                                         cur_test->param.name);
9025                         err = TEST_SUCCESS;
9026                 }
9027                 all_err += err;
9028         }
9029
9030         printf("Success: %d, Failure: %d\n", size + all_err, -all_err);
9031
9032         return (all_err == TEST_SUCCESS) ? TEST_SUCCESS : TEST_FAILED;
9033 }
9034
9035 static int
9036 test_PDCP_PROTO_short_mac(void)
9037 {
9038         int i = 0, size = 0;
9039         int err, all_err = TEST_SUCCESS;
9040         const struct pdcp_short_mac_test *cur_test;
9041
9042         size = RTE_DIM(list_pdcp_smac_tests);
9043
9044         for (i = 0; i < size; i++) {
9045                 cur_test = &list_pdcp_smac_tests[i];
9046                 err = test_pdcp_proto(
9047                         i, 0, RTE_CRYPTO_CIPHER_OP_ENCRYPT,
9048                         RTE_CRYPTO_AUTH_OP_GENERATE, cur_test->data_in,
9049                         cur_test->in_len, cur_test->data_out,
9050                         cur_test->in_len + ((cur_test->auth_key) ? 4 : 0),
9051                         RTE_CRYPTO_CIPHER_NULL, NULL,
9052                         0, cur_test->param.auth_alg,
9053                         cur_test->auth_key, cur_test->param.auth_key_len,
9054                         0, cur_test->param.domain, 0, 0,
9055                         0, 0, 0);
9056                 if (err) {
9057                         printf("\t%d) %s: Short MAC test failed\n",
9058                                         cur_test->test_idx,
9059                                         cur_test->param.name);
9060                         err = TEST_FAILED;
9061                 } else {
9062                         printf("\t%d) %s: Short MAC test PASS\n",
9063                                         cur_test->test_idx,
9064                                         cur_test->param.name);
9065                         rte_hexdump(stdout, "MAC I",
9066                                     cur_test->data_out + cur_test->in_len + 2,
9067                                     2);
9068                         err = TEST_SUCCESS;
9069                 }
9070                 all_err += err;
9071         }
9072
9073         printf("Success: %d, Failure: %d\n", size + all_err, -all_err);
9074
9075         return (all_err == TEST_SUCCESS) ? TEST_SUCCESS : TEST_FAILED;
9076
9077 }
9078
9079 static int
9080 test_PDCP_SDAP_PROTO_decap_all(void)
9081 {
9082         int i = 0, size = 0;
9083         int err, all_err = TEST_SUCCESS;
9084         const struct pdcp_sdap_test *cur_test;
9085
9086         size = RTE_DIM(list_pdcp_sdap_tests);
9087
9088         for (i = 0; i < size; i++) {
9089                 cur_test = &list_pdcp_sdap_tests[i];
9090                 err = test_pdcp_proto(
9091                         i, 0, RTE_CRYPTO_CIPHER_OP_DECRYPT,
9092                         RTE_CRYPTO_AUTH_OP_VERIFY,
9093                         cur_test->data_out,
9094                         cur_test->in_len + ((cur_test->auth_key) ? 4 : 0),
9095                         cur_test->data_in, cur_test->in_len,
9096                         cur_test->param.cipher_alg,
9097                         cur_test->cipher_key, cur_test->param.cipher_key_len,
9098                         cur_test->param.auth_alg, cur_test->auth_key,
9099                         cur_test->param.auth_key_len, cur_test->bearer,
9100                         cur_test->param.domain, cur_test->packet_direction,
9101                         cur_test->sn_size, cur_test->hfn,
9102                         cur_test->hfn_threshold, SDAP_ENABLED);
9103                 if (err) {
9104                         printf("\t%d) %s: Decapsulation failed\n",
9105                                         cur_test->test_idx,
9106                                         cur_test->param.name);
9107                         err = TEST_FAILED;
9108                 } else {
9109                         printf("\t%d) %s: Decap PASS\n", cur_test->test_idx,
9110                                         cur_test->param.name);
9111                         err = TEST_SUCCESS;
9112                 }
9113                 all_err += err;
9114         }
9115
9116         printf("Success: %d, Failure: %d\n", size + all_err, -all_err);
9117
9118         return (all_err == TEST_SUCCESS) ? TEST_SUCCESS : TEST_FAILED;
9119 }
9120
9121 static int
9122 test_ipsec_proto_process(const struct ipsec_test_data td[],
9123                          struct ipsec_test_data res_d[],
9124                          int nb_td,
9125                          bool silent,
9126                          const struct ipsec_test_flags *flags)
9127 {
9128         uint16_t v6_src[8] = {0x2607, 0xf8b0, 0x400c, 0x0c03, 0x0000, 0x0000,
9129                                 0x0000, 0x001a};
9130         uint16_t v6_dst[8] = {0x2001, 0x0470, 0xe5bf, 0xdead, 0x4957, 0x2174,
9131                                 0xe82c, 0x4887};
9132         struct crypto_testsuite_params *ts_params = &testsuite_params;
9133         struct crypto_unittest_params *ut_params = &unittest_params;
9134         struct rte_security_capability_idx sec_cap_idx;
9135         const struct rte_security_capability *sec_cap;
9136         struct rte_security_ipsec_xform ipsec_xform;
9137         uint8_t dev_id = ts_params->valid_devs[0];
9138         enum rte_security_ipsec_sa_direction dir;
9139         struct ipsec_test_data *res_d_tmp = NULL;
9140         uint32_t src = RTE_IPV4(192, 168, 1, 0);
9141         uint32_t dst = RTE_IPV4(192, 168, 1, 1);
9142         int salt_len, i, ret = TEST_SUCCESS;
9143         struct rte_security_ctx *ctx;
9144         uint8_t *input_text;
9145         uint32_t verify;
9146
9147         ut_params->type = RTE_SECURITY_ACTION_TYPE_LOOKASIDE_PROTOCOL;
9148         gbl_action_type = RTE_SECURITY_ACTION_TYPE_LOOKASIDE_PROTOCOL;
9149
9150         /* Use first test data to create session */
9151
9152         /* Copy IPsec xform */
9153         memcpy(&ipsec_xform, &td[0].ipsec_xform, sizeof(ipsec_xform));
9154
9155         dir = ipsec_xform.direction;
9156         verify = flags->tunnel_hdr_verify;
9157
9158         if ((dir == RTE_SECURITY_IPSEC_SA_DIR_INGRESS) && verify) {
9159                 if (verify == RTE_SECURITY_IPSEC_TUNNEL_VERIFY_SRC_DST_ADDR)
9160                         src += 1;
9161                 else if (verify == RTE_SECURITY_IPSEC_TUNNEL_VERIFY_DST_ADDR)
9162                         dst += 1;
9163         }
9164
9165         if (td->ipsec_xform.mode == RTE_SECURITY_IPSEC_SA_MODE_TUNNEL) {
9166                 if (td->ipsec_xform.tunnel.type ==
9167                                 RTE_SECURITY_IPSEC_TUNNEL_IPV4) {
9168                         memcpy(&ipsec_xform.tunnel.ipv4.src_ip, &src,
9169                                sizeof(src));
9170                         memcpy(&ipsec_xform.tunnel.ipv4.dst_ip, &dst,
9171                                sizeof(dst));
9172
9173                         if (flags->df == TEST_IPSEC_SET_DF_0_INNER_1)
9174                                 ipsec_xform.tunnel.ipv4.df = 0;
9175
9176                         if (flags->df == TEST_IPSEC_SET_DF_1_INNER_0)
9177                                 ipsec_xform.tunnel.ipv4.df = 1;
9178
9179                 } else {
9180                         memcpy(&ipsec_xform.tunnel.ipv6.src_addr, &v6_src,
9181                                sizeof(v6_src));
9182                         memcpy(&ipsec_xform.tunnel.ipv6.dst_addr, &v6_dst,
9183                                sizeof(v6_dst));
9184                 }
9185         }
9186
9187         ctx = rte_cryptodev_get_sec_ctx(dev_id);
9188
9189         sec_cap_idx.action = ut_params->type;
9190         sec_cap_idx.protocol = RTE_SECURITY_PROTOCOL_IPSEC;
9191         sec_cap_idx.ipsec.proto = ipsec_xform.proto;
9192         sec_cap_idx.ipsec.mode = ipsec_xform.mode;
9193         sec_cap_idx.ipsec.direction = ipsec_xform.direction;
9194
9195         if (flags->udp_encap)
9196                 ipsec_xform.options.udp_encap = 1;
9197
9198         sec_cap = rte_security_capability_get(ctx, &sec_cap_idx);
9199         if (sec_cap == NULL)
9200                 return TEST_SKIPPED;
9201
9202         /* Copy cipher session parameters */
9203         if (td[0].aead) {
9204                 memcpy(&ut_params->aead_xform, &td[0].xform.aead,
9205                        sizeof(ut_params->aead_xform));
9206                 ut_params->aead_xform.aead.key.data = td[0].key.data;
9207                 ut_params->aead_xform.aead.iv.offset = IV_OFFSET;
9208
9209                 /* Verify crypto capabilities */
9210                 if (test_ipsec_crypto_caps_aead_verify(
9211                                 sec_cap,
9212                                 &ut_params->aead_xform) != 0) {
9213                         if (!silent)
9214                                 RTE_LOG(INFO, USER1,
9215                                         "Crypto capabilities not supported\n");
9216                         return TEST_SKIPPED;
9217                 }
9218         } else {
9219                 memcpy(&ut_params->cipher_xform, &td[0].xform.chain.cipher,
9220                        sizeof(ut_params->cipher_xform));
9221                 memcpy(&ut_params->auth_xform, &td[0].xform.chain.auth,
9222                        sizeof(ut_params->auth_xform));
9223                 ut_params->cipher_xform.cipher.key.data = td[0].key.data;
9224                 ut_params->cipher_xform.cipher.iv.offset = IV_OFFSET;
9225                 ut_params->auth_xform.auth.key.data = td[0].auth_key.data;
9226
9227                 /* Verify crypto capabilities */
9228
9229                 if (test_ipsec_crypto_caps_cipher_verify(
9230                                 sec_cap,
9231                                 &ut_params->cipher_xform) != 0) {
9232                         if (!silent)
9233                                 RTE_LOG(INFO, USER1,
9234                                         "Cipher crypto capabilities not supported\n");
9235                         return TEST_SKIPPED;
9236                 }
9237
9238                 if (test_ipsec_crypto_caps_auth_verify(
9239                                 sec_cap,
9240                                 &ut_params->auth_xform) != 0) {
9241                         if (!silent)
9242                                 RTE_LOG(INFO, USER1,
9243                                         "Auth crypto capabilities not supported\n");
9244                         return TEST_SKIPPED;
9245                 }
9246         }
9247
9248         if (test_ipsec_sec_caps_verify(&ipsec_xform, sec_cap, silent) != 0)
9249                 return TEST_SKIPPED;
9250
9251         struct rte_security_session_conf sess_conf = {
9252                 .action_type = ut_params->type,
9253                 .protocol = RTE_SECURITY_PROTOCOL_IPSEC,
9254         };
9255
9256         if (td[0].aead) {
9257                 salt_len = RTE_MIN(sizeof(ipsec_xform.salt), td[0].salt.len);
9258                 memcpy(&ipsec_xform.salt, td[0].salt.data, salt_len);
9259                 sess_conf.ipsec = ipsec_xform;
9260                 sess_conf.crypto_xform = &ut_params->aead_xform;
9261         } else {
9262                 sess_conf.ipsec = ipsec_xform;
9263                 if (dir == RTE_SECURITY_IPSEC_SA_DIR_EGRESS) {
9264                         sess_conf.crypto_xform = &ut_params->cipher_xform;
9265                         ut_params->cipher_xform.next = &ut_params->auth_xform;
9266                 } else {
9267                         sess_conf.crypto_xform = &ut_params->auth_xform;
9268                         ut_params->auth_xform.next = &ut_params->cipher_xform;
9269                 }
9270         }
9271
9272         /* Create security session */
9273         ut_params->sec_session = rte_security_session_create(ctx, &sess_conf,
9274                                         ts_params->session_mpool,
9275                                         ts_params->session_priv_mpool);
9276
9277         if (ut_params->sec_session == NULL)
9278                 return TEST_SKIPPED;
9279
9280         for (i = 0; i < nb_td; i++) {
9281                 /* Setup source mbuf payload */
9282                 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
9283                 memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
9284                                 rte_pktmbuf_tailroom(ut_params->ibuf));
9285
9286                 input_text = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
9287                                 td[i].input_text.len);
9288
9289                 memcpy(input_text, td[i].input_text.data,
9290                        td[i].input_text.len);
9291
9292                 if (test_ipsec_pkt_update(input_text, flags))
9293                         return TEST_FAILED;
9294
9295                 /* Generate crypto op data structure */
9296                 ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
9297                                         RTE_CRYPTO_OP_TYPE_SYMMETRIC);
9298                 if (!ut_params->op) {
9299                         printf("TestCase %s line %d: %s\n",
9300                                 __func__, __LINE__,
9301                                 "failed to allocate crypto op");
9302                         ret = TEST_FAILED;
9303                         goto crypto_op_free;
9304                 }
9305
9306                 /* Attach session to operation */
9307                 rte_security_attach_session(ut_params->op,
9308                                             ut_params->sec_session);
9309
9310                 /* Set crypto operation mbufs */
9311                 ut_params->op->sym->m_src = ut_params->ibuf;
9312                 ut_params->op->sym->m_dst = NULL;
9313
9314                 /* Copy IV in crypto operation when IV generation is disabled */
9315                 if (dir == RTE_SECURITY_IPSEC_SA_DIR_EGRESS &&
9316                     ipsec_xform.options.iv_gen_disable == 1) {
9317                         uint8_t *iv = rte_crypto_op_ctod_offset(ut_params->op,
9318                                                                 uint8_t *,
9319                                                                 IV_OFFSET);
9320                         int len;
9321
9322                         if (td[i].aead)
9323                                 len = td[i].xform.aead.aead.iv.length;
9324                         else
9325                                 len = td[i].xform.chain.cipher.cipher.iv.length;
9326
9327                         memcpy(iv, td[i].iv.data, len);
9328                 }
9329
9330                 /* Process crypto operation */
9331                 process_crypto_request(dev_id, ut_params->op);
9332
9333                 ret = test_ipsec_status_check(ut_params->op, flags, dir, i + 1);
9334                 if (ret != TEST_SUCCESS)
9335                         goto crypto_op_free;
9336
9337                 if (res_d != NULL)
9338                         res_d_tmp = &res_d[i];
9339
9340                 ret = test_ipsec_post_process(ut_params->ibuf, &td[i],
9341                                               res_d_tmp, silent, flags);
9342                 if (ret != TEST_SUCCESS)
9343                         goto crypto_op_free;
9344
9345                 ret = test_ipsec_stats_verify(ctx, ut_params->sec_session,
9346                                               flags, dir);
9347                 if (ret != TEST_SUCCESS)
9348                         goto crypto_op_free;
9349
9350                 rte_crypto_op_free(ut_params->op);
9351                 ut_params->op = NULL;
9352
9353                 rte_pktmbuf_free(ut_params->ibuf);
9354                 ut_params->ibuf = NULL;
9355         }
9356
9357 crypto_op_free:
9358         rte_crypto_op_free(ut_params->op);
9359         ut_params->op = NULL;
9360
9361         rte_pktmbuf_free(ut_params->ibuf);
9362         ut_params->ibuf = NULL;
9363
9364         if (ut_params->sec_session)
9365                 rte_security_session_destroy(ctx, ut_params->sec_session);
9366         ut_params->sec_session = NULL;
9367
9368         return ret;
9369 }
9370
9371 static int
9372 test_ipsec_proto_known_vec(const void *test_data)
9373 {
9374         struct ipsec_test_data td_outb;
9375         struct ipsec_test_flags flags;
9376
9377         memset(&flags, 0, sizeof(flags));
9378
9379         memcpy(&td_outb, test_data, sizeof(td_outb));
9380
9381         if (td_outb.aead ||
9382             td_outb.xform.chain.cipher.cipher.algo != RTE_CRYPTO_CIPHER_NULL) {
9383                 /* Disable IV gen to be able to test with known vectors */
9384                 td_outb.ipsec_xform.options.iv_gen_disable = 1;
9385         }
9386
9387         return test_ipsec_proto_process(&td_outb, NULL, 1, false, &flags);
9388 }
9389
9390 static int
9391 test_ipsec_proto_known_vec_inb(const void *test_data)
9392 {
9393         const struct ipsec_test_data *td = test_data;
9394         struct ipsec_test_flags flags;
9395         struct ipsec_test_data td_inb;
9396
9397         memset(&flags, 0, sizeof(flags));
9398
9399         if (td->ipsec_xform.direction == RTE_SECURITY_IPSEC_SA_DIR_EGRESS)
9400                 test_ipsec_td_in_from_out(td, &td_inb);
9401         else
9402                 memcpy(&td_inb, td, sizeof(td_inb));
9403
9404         return test_ipsec_proto_process(&td_inb, NULL, 1, false, &flags);
9405 }
9406
9407 static int
9408 test_ipsec_proto_known_vec_fragmented(const void *test_data)
9409 {
9410         struct ipsec_test_data td_outb;
9411         struct ipsec_test_flags flags;
9412
9413         memset(&flags, 0, sizeof(flags));
9414         flags.fragment = true;
9415
9416         memcpy(&td_outb, test_data, sizeof(td_outb));
9417
9418         /* Disable IV gen to be able to test with known vectors */
9419         td_outb.ipsec_xform.options.iv_gen_disable = 1;
9420
9421         return test_ipsec_proto_process(&td_outb, NULL, 1, false, &flags);
9422 }
9423
9424 static int
9425 test_ipsec_proto_all(const struct ipsec_test_flags *flags)
9426 {
9427         struct ipsec_test_data td_outb[IPSEC_TEST_PACKETS_MAX];
9428         struct ipsec_test_data td_inb[IPSEC_TEST_PACKETS_MAX];
9429         unsigned int i, nb_pkts = 1, pass_cnt = 0;
9430         int ret;
9431
9432         if (flags->iv_gen ||
9433             flags->sa_expiry_pkts_soft ||
9434             flags->sa_expiry_pkts_hard)
9435                 nb_pkts = IPSEC_TEST_PACKETS_MAX;
9436
9437         for (i = 0; i < RTE_DIM(alg_list); i++) {
9438                 test_ipsec_td_prepare(alg_list[i].param1,
9439                                       alg_list[i].param2,
9440                                       flags,
9441                                       td_outb,
9442                                       nb_pkts);
9443
9444                 if (!td_outb->aead) {
9445                         enum rte_crypto_cipher_algorithm cipher_alg;
9446                         enum rte_crypto_auth_algorithm auth_alg;
9447
9448                         cipher_alg = td_outb->xform.chain.cipher.cipher.algo;
9449                         auth_alg = td_outb->xform.chain.auth.auth.algo;
9450
9451                         /* ICV is not applicable for NULL auth */
9452                         if (flags->icv_corrupt &&
9453                             auth_alg == RTE_CRYPTO_AUTH_NULL)
9454                                 continue;
9455
9456                         /* IV is not applicable for NULL cipher */
9457                         if (flags->iv_gen &&
9458                             cipher_alg == RTE_CRYPTO_CIPHER_NULL)
9459                                 continue;
9460                 }
9461
9462                 ret = test_ipsec_proto_process(td_outb, td_inb, nb_pkts, true,
9463                                                flags);
9464                 if (ret == TEST_SKIPPED)
9465                         continue;
9466
9467                 if (ret == TEST_FAILED)
9468                         return TEST_FAILED;
9469
9470                 test_ipsec_td_update(td_inb, td_outb, nb_pkts, flags);
9471
9472                 ret = test_ipsec_proto_process(td_inb, NULL, nb_pkts, true,
9473                                                flags);
9474                 if (ret == TEST_SKIPPED)
9475                         continue;
9476
9477                 if (ret == TEST_FAILED)
9478                         return TEST_FAILED;
9479
9480                 if (flags->display_alg)
9481                         test_ipsec_display_alg(alg_list[i].param1,
9482                                                alg_list[i].param2);
9483
9484                 pass_cnt++;
9485         }
9486
9487         if (pass_cnt > 0)
9488                 return TEST_SUCCESS;
9489         else
9490                 return TEST_SKIPPED;
9491 }
9492
9493 static int
9494 test_ipsec_proto_display_list(const void *data __rte_unused)
9495 {
9496         struct ipsec_test_flags flags;
9497
9498         memset(&flags, 0, sizeof(flags));
9499
9500         flags.display_alg = true;
9501
9502         return test_ipsec_proto_all(&flags);
9503 }
9504
9505 static int
9506 test_ipsec_proto_iv_gen(const void *data __rte_unused)
9507 {
9508         struct ipsec_test_flags flags;
9509
9510         memset(&flags, 0, sizeof(flags));
9511
9512         flags.iv_gen = true;
9513
9514         return test_ipsec_proto_all(&flags);
9515 }
9516
9517 static int
9518 test_ipsec_proto_sa_exp_pkts_soft(const void *data __rte_unused)
9519 {
9520         struct ipsec_test_flags flags;
9521
9522         memset(&flags, 0, sizeof(flags));
9523
9524         flags.sa_expiry_pkts_soft = true;
9525
9526         return test_ipsec_proto_all(&flags);
9527 }
9528
9529 static int
9530 test_ipsec_proto_sa_exp_pkts_hard(const void *data __rte_unused)
9531 {
9532         struct ipsec_test_flags flags;
9533
9534         memset(&flags, 0, sizeof(flags));
9535
9536         flags.sa_expiry_pkts_hard = true;
9537
9538         return test_ipsec_proto_all(&flags);
9539 }
9540
9541 static int
9542 test_ipsec_proto_err_icv_corrupt(const void *data __rte_unused)
9543 {
9544         struct ipsec_test_flags flags;
9545
9546         memset(&flags, 0, sizeof(flags));
9547
9548         flags.icv_corrupt = true;
9549
9550         return test_ipsec_proto_all(&flags);
9551 }
9552
9553 static int
9554 test_ipsec_proto_udp_encap(const void *data __rte_unused)
9555 {
9556         struct ipsec_test_flags flags;
9557
9558         memset(&flags, 0, sizeof(flags));
9559
9560         flags.udp_encap = true;
9561
9562         return test_ipsec_proto_all(&flags);
9563 }
9564
9565 static int
9566 test_ipsec_proto_tunnel_src_dst_addr_verify(const void *data __rte_unused)
9567 {
9568         struct ipsec_test_flags flags;
9569
9570         memset(&flags, 0, sizeof(flags));
9571
9572         flags.tunnel_hdr_verify = RTE_SECURITY_IPSEC_TUNNEL_VERIFY_SRC_DST_ADDR;
9573
9574         return test_ipsec_proto_all(&flags);
9575 }
9576
9577 static int
9578 test_ipsec_proto_tunnel_dst_addr_verify(const void *data __rte_unused)
9579 {
9580         struct ipsec_test_flags flags;
9581
9582         memset(&flags, 0, sizeof(flags));
9583
9584         flags.tunnel_hdr_verify = RTE_SECURITY_IPSEC_TUNNEL_VERIFY_DST_ADDR;
9585
9586         return test_ipsec_proto_all(&flags);
9587 }
9588
9589 static int
9590 test_ipsec_proto_udp_ports_verify(const void *data __rte_unused)
9591 {
9592         struct ipsec_test_flags flags;
9593
9594         memset(&flags, 0, sizeof(flags));
9595
9596         flags.udp_encap = true;
9597         flags.udp_ports_verify = true;
9598
9599         return test_ipsec_proto_all(&flags);
9600 }
9601
9602 static int
9603 test_ipsec_proto_inner_ip_csum(const void *data __rte_unused)
9604 {
9605         struct ipsec_test_flags flags;
9606
9607         memset(&flags, 0, sizeof(flags));
9608
9609         flags.ip_csum = true;
9610
9611         return test_ipsec_proto_all(&flags);
9612 }
9613
9614 static int
9615 test_ipsec_proto_inner_l4_csum(const void *data __rte_unused)
9616 {
9617         struct ipsec_test_flags flags;
9618
9619         memset(&flags, 0, sizeof(flags));
9620
9621         flags.l4_csum = true;
9622
9623         return test_ipsec_proto_all(&flags);
9624 }
9625
9626 static int
9627 test_ipsec_proto_tunnel_v4_in_v4(const void *data __rte_unused)
9628 {
9629         struct ipsec_test_flags flags;
9630
9631         memset(&flags, 0, sizeof(flags));
9632
9633         flags.ipv6 = false;
9634         flags.tunnel_ipv6 = false;
9635
9636         return test_ipsec_proto_all(&flags);
9637 }
9638
9639 static int
9640 test_ipsec_proto_tunnel_v6_in_v6(const void *data __rte_unused)
9641 {
9642         struct ipsec_test_flags flags;
9643
9644         memset(&flags, 0, sizeof(flags));
9645
9646         flags.ipv6 = true;
9647         flags.tunnel_ipv6 = true;
9648
9649         return test_ipsec_proto_all(&flags);
9650 }
9651
9652 static int
9653 test_ipsec_proto_tunnel_v4_in_v6(const void *data __rte_unused)
9654 {
9655         struct ipsec_test_flags flags;
9656
9657         memset(&flags, 0, sizeof(flags));
9658
9659         flags.ipv6 = false;
9660         flags.tunnel_ipv6 = true;
9661
9662         return test_ipsec_proto_all(&flags);
9663 }
9664
9665 static int
9666 test_ipsec_proto_tunnel_v6_in_v4(const void *data __rte_unused)
9667 {
9668         struct ipsec_test_flags flags;
9669
9670         memset(&flags, 0, sizeof(flags));
9671
9672         flags.ipv6 = true;
9673         flags.tunnel_ipv6 = false;
9674
9675         return test_ipsec_proto_all(&flags);
9676 }
9677
9678 static int
9679 test_ipsec_proto_transport_v4(const void *data __rte_unused)
9680 {
9681         struct ipsec_test_flags flags;
9682
9683         memset(&flags, 0, sizeof(flags));
9684
9685         flags.ipv6 = false;
9686         flags.transport = true;
9687
9688         return test_ipsec_proto_all(&flags);
9689 }
9690
9691 static int
9692 test_ipsec_proto_stats(const void *data __rte_unused)
9693 {
9694         struct ipsec_test_flags flags;
9695
9696         memset(&flags, 0, sizeof(flags));
9697
9698         flags.stats_success = true;
9699
9700         return test_ipsec_proto_all(&flags);
9701 }
9702
9703 static int
9704 test_ipsec_proto_pkt_fragment(const void *data __rte_unused)
9705 {
9706         struct ipsec_test_flags flags;
9707
9708         memset(&flags, 0, sizeof(flags));
9709
9710         flags.fragment = true;
9711
9712         return test_ipsec_proto_all(&flags);
9713
9714 }
9715
9716 static int
9717 test_ipsec_proto_copy_df_inner_0(const void *data __rte_unused)
9718 {
9719         struct ipsec_test_flags flags;
9720
9721         memset(&flags, 0, sizeof(flags));
9722
9723         flags.df = TEST_IPSEC_COPY_DF_INNER_0;
9724
9725         return test_ipsec_proto_all(&flags);
9726 }
9727
9728 static int
9729 test_ipsec_proto_copy_df_inner_1(const void *data __rte_unused)
9730 {
9731         struct ipsec_test_flags flags;
9732
9733         memset(&flags, 0, sizeof(flags));
9734
9735         flags.df = TEST_IPSEC_COPY_DF_INNER_1;
9736
9737         return test_ipsec_proto_all(&flags);
9738 }
9739
9740 static int
9741 test_ipsec_proto_set_df_0_inner_1(const void *data __rte_unused)
9742 {
9743         struct ipsec_test_flags flags;
9744
9745         memset(&flags, 0, sizeof(flags));
9746
9747         flags.df = TEST_IPSEC_SET_DF_0_INNER_1;
9748
9749         return test_ipsec_proto_all(&flags);
9750 }
9751
9752 static int
9753 test_ipsec_proto_set_df_1_inner_0(const void *data __rte_unused)
9754 {
9755         struct ipsec_test_flags flags;
9756
9757         memset(&flags, 0, sizeof(flags));
9758
9759         flags.df = TEST_IPSEC_SET_DF_1_INNER_0;
9760
9761         return test_ipsec_proto_all(&flags);
9762 }
9763
9764 static int
9765 test_PDCP_PROTO_all(void)
9766 {
9767         struct crypto_testsuite_params *ts_params = &testsuite_params;
9768         struct crypto_unittest_params *ut_params = &unittest_params;
9769         struct rte_cryptodev_info dev_info;
9770         int status;
9771
9772         rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
9773         uint64_t feat_flags = dev_info.feature_flags;
9774
9775         if (!(feat_flags & RTE_CRYPTODEV_FF_SECURITY))
9776                 return TEST_SKIPPED;
9777
9778         /* Set action type */
9779         ut_params->type = gbl_action_type == RTE_SECURITY_ACTION_TYPE_NONE ?
9780                 RTE_SECURITY_ACTION_TYPE_LOOKASIDE_PROTOCOL :
9781                 gbl_action_type;
9782
9783         if (security_proto_supported(ut_params->type,
9784                         RTE_SECURITY_PROTOCOL_PDCP) < 0)
9785                 return TEST_SKIPPED;
9786
9787         status = test_PDCP_PROTO_cplane_encap_all();
9788         status += test_PDCP_PROTO_cplane_decap_all();
9789         status += test_PDCP_PROTO_uplane_encap_all();
9790         status += test_PDCP_PROTO_uplane_decap_all();
9791         status += test_PDCP_PROTO_SGL_in_place_32B();
9792         status += test_PDCP_PROTO_SGL_oop_32B_128B();
9793         status += test_PDCP_PROTO_SGL_oop_32B_40B();
9794         status += test_PDCP_PROTO_SGL_oop_128B_32B();
9795         status += test_PDCP_SDAP_PROTO_encap_all();
9796         status += test_PDCP_SDAP_PROTO_decap_all();
9797         status += test_PDCP_PROTO_short_mac();
9798
9799         if (status)
9800                 return TEST_FAILED;
9801         else
9802                 return TEST_SUCCESS;
9803 }
9804
9805 static int
9806 test_docsis_proto_uplink(const void *data)
9807 {
9808         const struct docsis_test_data *d_td = data;
9809         struct crypto_testsuite_params *ts_params = &testsuite_params;
9810         struct crypto_unittest_params *ut_params = &unittest_params;
9811         uint8_t *plaintext = NULL;
9812         uint8_t *ciphertext = NULL;
9813         uint8_t *iv_ptr;
9814         int32_t cipher_len, crc_len;
9815         uint32_t crc_data_len;
9816         int ret = TEST_SUCCESS;
9817
9818         struct rte_security_ctx *ctx = (struct rte_security_ctx *)
9819                                         rte_cryptodev_get_sec_ctx(
9820                                                 ts_params->valid_devs[0]);
9821
9822         /* Verify the capabilities */
9823         struct rte_security_capability_idx sec_cap_idx;
9824         const struct rte_security_capability *sec_cap;
9825         const struct rte_cryptodev_capabilities *crypto_cap;
9826         const struct rte_cryptodev_symmetric_capability *sym_cap;
9827         int j = 0;
9828
9829         /* Set action type */
9830         ut_params->type = gbl_action_type == RTE_SECURITY_ACTION_TYPE_NONE ?
9831                 RTE_SECURITY_ACTION_TYPE_LOOKASIDE_PROTOCOL :
9832                 gbl_action_type;
9833
9834         if (security_proto_supported(ut_params->type,
9835                         RTE_SECURITY_PROTOCOL_DOCSIS) < 0)
9836                 return TEST_SKIPPED;
9837
9838         sec_cap_idx.action = ut_params->type;
9839         sec_cap_idx.protocol = RTE_SECURITY_PROTOCOL_DOCSIS;
9840         sec_cap_idx.docsis.direction = RTE_SECURITY_DOCSIS_UPLINK;
9841
9842         sec_cap = rte_security_capability_get(ctx, &sec_cap_idx);
9843         if (sec_cap == NULL)
9844                 return TEST_SKIPPED;
9845
9846         while ((crypto_cap = &sec_cap->crypto_capabilities[j++])->op !=
9847                         RTE_CRYPTO_OP_TYPE_UNDEFINED) {
9848                 if (crypto_cap->op == RTE_CRYPTO_OP_TYPE_SYMMETRIC &&
9849                                 crypto_cap->sym.xform_type ==
9850                                         RTE_CRYPTO_SYM_XFORM_CIPHER &&
9851                                 crypto_cap->sym.cipher.algo ==
9852                                         RTE_CRYPTO_CIPHER_AES_DOCSISBPI) {
9853                         sym_cap = &crypto_cap->sym;
9854                         if (rte_cryptodev_sym_capability_check_cipher(sym_cap,
9855                                                 d_td->key.len,
9856                                                 d_td->iv.len) == 0)
9857                                 break;
9858                 }
9859         }
9860
9861         if (crypto_cap->op == RTE_CRYPTO_OP_TYPE_UNDEFINED)
9862                 return TEST_SKIPPED;
9863
9864         /* Setup source mbuf payload */
9865         ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
9866         memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
9867                         rte_pktmbuf_tailroom(ut_params->ibuf));
9868
9869         ciphertext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
9870                         d_td->ciphertext.len);
9871
9872         memcpy(ciphertext, d_td->ciphertext.data, d_td->ciphertext.len);
9873
9874         /* Setup cipher session parameters */
9875         ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
9876         ut_params->cipher_xform.cipher.algo = RTE_CRYPTO_CIPHER_AES_DOCSISBPI;
9877         ut_params->cipher_xform.cipher.op = RTE_CRYPTO_CIPHER_OP_DECRYPT;
9878         ut_params->cipher_xform.cipher.key.data = d_td->key.data;
9879         ut_params->cipher_xform.cipher.key.length = d_td->key.len;
9880         ut_params->cipher_xform.cipher.iv.length = d_td->iv.len;
9881         ut_params->cipher_xform.cipher.iv.offset = IV_OFFSET;
9882         ut_params->cipher_xform.next = NULL;
9883
9884         /* Setup DOCSIS session parameters */
9885         ut_params->docsis_xform.direction = RTE_SECURITY_DOCSIS_UPLINK;
9886
9887         struct rte_security_session_conf sess_conf = {
9888                 .action_type = ut_params->type,
9889                 .protocol = RTE_SECURITY_PROTOCOL_DOCSIS,
9890                 .docsis = ut_params->docsis_xform,
9891                 .crypto_xform = &ut_params->cipher_xform,
9892         };
9893
9894         /* Create security session */
9895         ut_params->sec_session = rte_security_session_create(ctx, &sess_conf,
9896                                         ts_params->session_mpool,
9897                                         ts_params->session_priv_mpool);
9898
9899         if (!ut_params->sec_session) {
9900                 printf("Test function %s line %u: failed to allocate session\n",
9901                         __func__, __LINE__);
9902                 ret = TEST_FAILED;
9903                 goto on_err;
9904         }
9905
9906         /* Generate crypto op data structure */
9907         ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
9908                                 RTE_CRYPTO_OP_TYPE_SYMMETRIC);
9909         if (!ut_params->op) {
9910                 printf("Test function %s line %u: failed to allocate symmetric "
9911                         "crypto operation\n", __func__, __LINE__);
9912                 ret = TEST_FAILED;
9913                 goto on_err;
9914         }
9915
9916         /* Setup CRC operation parameters */
9917         crc_len = d_td->ciphertext.no_crc == false ?
9918                         (d_td->ciphertext.len -
9919                                 d_td->ciphertext.crc_offset -
9920                                 RTE_ETHER_CRC_LEN) :
9921                         0;
9922         crc_len = crc_len > 0 ? crc_len : 0;
9923         crc_data_len = crc_len == 0 ? 0 : RTE_ETHER_CRC_LEN;
9924         ut_params->op->sym->auth.data.length = crc_len;
9925         ut_params->op->sym->auth.data.offset = d_td->ciphertext.crc_offset;
9926
9927         /* Setup cipher operation parameters */
9928         cipher_len = d_td->ciphertext.no_cipher == false ?
9929                         (d_td->ciphertext.len -
9930                                 d_td->ciphertext.cipher_offset) :
9931                         0;
9932         cipher_len = cipher_len > 0 ? cipher_len : 0;
9933         ut_params->op->sym->cipher.data.length = cipher_len;
9934         ut_params->op->sym->cipher.data.offset = d_td->ciphertext.cipher_offset;
9935
9936         /* Setup cipher IV */
9937         iv_ptr = (uint8_t *)ut_params->op + IV_OFFSET;
9938         rte_memcpy(iv_ptr, d_td->iv.data, d_td->iv.len);
9939
9940         /* Attach session to operation */
9941         rte_security_attach_session(ut_params->op, ut_params->sec_session);
9942
9943         /* Set crypto operation mbufs */
9944         ut_params->op->sym->m_src = ut_params->ibuf;
9945         ut_params->op->sym->m_dst = NULL;
9946
9947         /* Process crypto operation */
9948         if (process_crypto_request(ts_params->valid_devs[0], ut_params->op) ==
9949                         NULL) {
9950                 printf("Test function %s line %u: failed to process security "
9951                         "crypto op\n", __func__, __LINE__);
9952                 ret = TEST_FAILED;
9953                 goto on_err;
9954         }
9955
9956         if (ut_params->op->status != RTE_CRYPTO_OP_STATUS_SUCCESS) {
9957                 printf("Test function %s line %u: failed to process crypto op\n",
9958                         __func__, __LINE__);
9959                 ret = TEST_FAILED;
9960                 goto on_err;
9961         }
9962
9963         /* Validate plaintext */
9964         plaintext = ciphertext;
9965
9966         if (memcmp(plaintext, d_td->plaintext.data,
9967                         d_td->plaintext.len - crc_data_len)) {
9968                 printf("Test function %s line %u: plaintext not as expected\n",
9969                         __func__, __LINE__);
9970                 rte_hexdump(stdout, "expected", d_td->plaintext.data,
9971                                 d_td->plaintext.len);
9972                 rte_hexdump(stdout, "actual", plaintext, d_td->plaintext.len);
9973                 ret = TEST_FAILED;
9974                 goto on_err;
9975         }
9976
9977 on_err:
9978         rte_crypto_op_free(ut_params->op);
9979         ut_params->op = NULL;
9980
9981         if (ut_params->sec_session)
9982                 rte_security_session_destroy(ctx, ut_params->sec_session);
9983         ut_params->sec_session = NULL;
9984
9985         rte_pktmbuf_free(ut_params->ibuf);
9986         ut_params->ibuf = NULL;
9987
9988         return ret;
9989 }
9990
9991 static int
9992 test_docsis_proto_downlink(const void *data)
9993 {
9994         const struct docsis_test_data *d_td = data;
9995         struct crypto_testsuite_params *ts_params = &testsuite_params;
9996         struct crypto_unittest_params *ut_params = &unittest_params;
9997         uint8_t *plaintext = NULL;
9998         uint8_t *ciphertext = NULL;
9999         uint8_t *iv_ptr;
10000         int32_t cipher_len, crc_len;
10001         int ret = TEST_SUCCESS;
10002
10003         struct rte_security_ctx *ctx = (struct rte_security_ctx *)
10004                                         rte_cryptodev_get_sec_ctx(
10005                                                 ts_params->valid_devs[0]);
10006
10007         /* Verify the capabilities */
10008         struct rte_security_capability_idx sec_cap_idx;
10009         const struct rte_security_capability *sec_cap;
10010         const struct rte_cryptodev_capabilities *crypto_cap;
10011         const struct rte_cryptodev_symmetric_capability *sym_cap;
10012         int j = 0;
10013
10014         /* Set action type */
10015         ut_params->type = gbl_action_type == RTE_SECURITY_ACTION_TYPE_NONE ?
10016                 RTE_SECURITY_ACTION_TYPE_LOOKASIDE_PROTOCOL :
10017                 gbl_action_type;
10018
10019         if (security_proto_supported(ut_params->type,
10020                         RTE_SECURITY_PROTOCOL_DOCSIS) < 0)
10021                 return TEST_SKIPPED;
10022
10023         sec_cap_idx.action = ut_params->type;
10024         sec_cap_idx.protocol = RTE_SECURITY_PROTOCOL_DOCSIS;
10025         sec_cap_idx.docsis.direction = RTE_SECURITY_DOCSIS_DOWNLINK;
10026
10027         sec_cap = rte_security_capability_get(ctx, &sec_cap_idx);
10028         if (sec_cap == NULL)
10029                 return TEST_SKIPPED;
10030
10031         while ((crypto_cap = &sec_cap->crypto_capabilities[j++])->op !=
10032                         RTE_CRYPTO_OP_TYPE_UNDEFINED) {
10033                 if (crypto_cap->op == RTE_CRYPTO_OP_TYPE_SYMMETRIC &&
10034                                 crypto_cap->sym.xform_type ==
10035                                         RTE_CRYPTO_SYM_XFORM_CIPHER &&
10036                                 crypto_cap->sym.cipher.algo ==
10037                                         RTE_CRYPTO_CIPHER_AES_DOCSISBPI) {
10038                         sym_cap = &crypto_cap->sym;
10039                         if (rte_cryptodev_sym_capability_check_cipher(sym_cap,
10040                                                 d_td->key.len,
10041                                                 d_td->iv.len) == 0)
10042                                 break;
10043                 }
10044         }
10045
10046         if (crypto_cap->op == RTE_CRYPTO_OP_TYPE_UNDEFINED)
10047                 return TEST_SKIPPED;
10048
10049         /* Setup source mbuf payload */
10050         ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
10051         memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
10052                         rte_pktmbuf_tailroom(ut_params->ibuf));
10053
10054         plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
10055                         d_td->plaintext.len);
10056
10057         memcpy(plaintext, d_td->plaintext.data, d_td->plaintext.len);
10058
10059         /* Setup cipher session parameters */
10060         ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
10061         ut_params->cipher_xform.cipher.algo = RTE_CRYPTO_CIPHER_AES_DOCSISBPI;
10062         ut_params->cipher_xform.cipher.op = RTE_CRYPTO_CIPHER_OP_ENCRYPT;
10063         ut_params->cipher_xform.cipher.key.data = d_td->key.data;
10064         ut_params->cipher_xform.cipher.key.length = d_td->key.len;
10065         ut_params->cipher_xform.cipher.iv.length = d_td->iv.len;
10066         ut_params->cipher_xform.cipher.iv.offset = IV_OFFSET;
10067         ut_params->cipher_xform.next = NULL;
10068
10069         /* Setup DOCSIS session parameters */
10070         ut_params->docsis_xform.direction = RTE_SECURITY_DOCSIS_DOWNLINK;
10071
10072         struct rte_security_session_conf sess_conf = {
10073                 .action_type = ut_params->type,
10074                 .protocol = RTE_SECURITY_PROTOCOL_DOCSIS,
10075                 .docsis = ut_params->docsis_xform,
10076                 .crypto_xform = &ut_params->cipher_xform,
10077         };
10078
10079         /* Create security session */
10080         ut_params->sec_session = rte_security_session_create(ctx, &sess_conf,
10081                                         ts_params->session_mpool,
10082                                         ts_params->session_priv_mpool);
10083
10084         if (!ut_params->sec_session) {
10085                 printf("Test function %s line %u: failed to allocate session\n",
10086                         __func__, __LINE__);
10087                 ret = TEST_FAILED;
10088                 goto on_err;
10089         }
10090
10091         /* Generate crypto op data structure */
10092         ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
10093                                 RTE_CRYPTO_OP_TYPE_SYMMETRIC);
10094         if (!ut_params->op) {
10095                 printf("Test function %s line %u: failed to allocate symmetric "
10096                         "crypto operation\n", __func__, __LINE__);
10097                 ret = TEST_FAILED;
10098                 goto on_err;
10099         }
10100
10101         /* Setup CRC operation parameters */
10102         crc_len = d_td->plaintext.no_crc == false ?
10103                         (d_td->plaintext.len -
10104                                 d_td->plaintext.crc_offset -
10105                                 RTE_ETHER_CRC_LEN) :
10106                         0;
10107         crc_len = crc_len > 0 ? crc_len : 0;
10108         ut_params->op->sym->auth.data.length = crc_len;
10109         ut_params->op->sym->auth.data.offset = d_td->plaintext.crc_offset;
10110
10111         /* Setup cipher operation parameters */
10112         cipher_len = d_td->plaintext.no_cipher == false ?
10113                         (d_td->plaintext.len -
10114                                 d_td->plaintext.cipher_offset) :
10115                         0;
10116         cipher_len = cipher_len > 0 ? cipher_len : 0;
10117         ut_params->op->sym->cipher.data.length = cipher_len;
10118         ut_params->op->sym->cipher.data.offset = d_td->plaintext.cipher_offset;
10119
10120         /* Setup cipher IV */
10121         iv_ptr = (uint8_t *)ut_params->op + IV_OFFSET;
10122         rte_memcpy(iv_ptr, d_td->iv.data, d_td->iv.len);
10123
10124         /* Attach session to operation */
10125         rte_security_attach_session(ut_params->op, ut_params->sec_session);
10126
10127         /* Set crypto operation mbufs */
10128         ut_params->op->sym->m_src = ut_params->ibuf;
10129         ut_params->op->sym->m_dst = NULL;
10130
10131         /* Process crypto operation */
10132         if (process_crypto_request(ts_params->valid_devs[0], ut_params->op) ==
10133                         NULL) {
10134                 printf("Test function %s line %u: failed to process crypto op\n",
10135                         __func__, __LINE__);
10136                 ret = TEST_FAILED;
10137                 goto on_err;
10138         }
10139
10140         if (ut_params->op->status != RTE_CRYPTO_OP_STATUS_SUCCESS) {
10141                 printf("Test function %s line %u: crypto op processing failed\n",
10142                         __func__, __LINE__);
10143                 ret = TEST_FAILED;
10144                 goto on_err;
10145         }
10146
10147         /* Validate ciphertext */
10148         ciphertext = plaintext;
10149
10150         if (memcmp(ciphertext, d_td->ciphertext.data, d_td->ciphertext.len)) {
10151                 printf("Test function %s line %u: plaintext not as expected\n",
10152                         __func__, __LINE__);
10153                 rte_hexdump(stdout, "expected", d_td->ciphertext.data,
10154                                 d_td->ciphertext.len);
10155                 rte_hexdump(stdout, "actual", ciphertext, d_td->ciphertext.len);
10156                 ret = TEST_FAILED;
10157                 goto on_err;
10158         }
10159
10160 on_err:
10161         rte_crypto_op_free(ut_params->op);
10162         ut_params->op = NULL;
10163
10164         if (ut_params->sec_session)
10165                 rte_security_session_destroy(ctx, ut_params->sec_session);
10166         ut_params->sec_session = NULL;
10167
10168         rte_pktmbuf_free(ut_params->ibuf);
10169         ut_params->ibuf = NULL;
10170
10171         return ret;
10172 }
10173 #endif
10174
10175 static int
10176 test_AES_GCM_authenticated_encryption_test_case_1(void)
10177 {
10178         return test_authenticated_encryption(&gcm_test_case_1);
10179 }
10180
10181 static int
10182 test_AES_GCM_authenticated_encryption_test_case_2(void)
10183 {
10184         return test_authenticated_encryption(&gcm_test_case_2);
10185 }
10186
10187 static int
10188 test_AES_GCM_authenticated_encryption_test_case_3(void)
10189 {
10190         return test_authenticated_encryption(&gcm_test_case_3);
10191 }
10192
10193 static int
10194 test_AES_GCM_authenticated_encryption_test_case_4(void)
10195 {
10196         return test_authenticated_encryption(&gcm_test_case_4);
10197 }
10198
10199 static int
10200 test_AES_GCM_authenticated_encryption_test_case_5(void)
10201 {
10202         return test_authenticated_encryption(&gcm_test_case_5);
10203 }
10204
10205 static int
10206 test_AES_GCM_authenticated_encryption_test_case_6(void)
10207 {
10208         return test_authenticated_encryption(&gcm_test_case_6);
10209 }
10210
10211 static int
10212 test_AES_GCM_authenticated_encryption_test_case_7(void)
10213 {
10214         return test_authenticated_encryption(&gcm_test_case_7);
10215 }
10216
10217 static int
10218 test_AES_GCM_authenticated_encryption_test_case_8(void)
10219 {
10220         return test_authenticated_encryption(&gcm_test_case_8);
10221 }
10222
10223 static int
10224 test_AES_GCM_J0_authenticated_encryption_test_case_1(void)
10225 {
10226         return test_authenticated_encryption(&gcm_J0_test_case_1);
10227 }
10228
10229 static int
10230 test_AES_GCM_auth_encryption_test_case_192_1(void)
10231 {
10232         return test_authenticated_encryption(&gcm_test_case_192_1);
10233 }
10234
10235 static int
10236 test_AES_GCM_auth_encryption_test_case_192_2(void)
10237 {
10238         return test_authenticated_encryption(&gcm_test_case_192_2);
10239 }
10240
10241 static int
10242 test_AES_GCM_auth_encryption_test_case_192_3(void)
10243 {
10244         return test_authenticated_encryption(&gcm_test_case_192_3);
10245 }
10246
10247 static int
10248 test_AES_GCM_auth_encryption_test_case_192_4(void)
10249 {
10250         return test_authenticated_encryption(&gcm_test_case_192_4);
10251 }
10252
10253 static int
10254 test_AES_GCM_auth_encryption_test_case_192_5(void)
10255 {
10256         return test_authenticated_encryption(&gcm_test_case_192_5);
10257 }
10258
10259 static int
10260 test_AES_GCM_auth_encryption_test_case_192_6(void)
10261 {
10262         return test_authenticated_encryption(&gcm_test_case_192_6);
10263 }
10264
10265 static int
10266 test_AES_GCM_auth_encryption_test_case_192_7(void)
10267 {
10268         return test_authenticated_encryption(&gcm_test_case_192_7);
10269 }
10270
10271 static int
10272 test_AES_GCM_auth_encryption_test_case_256_1(void)
10273 {
10274         return test_authenticated_encryption(&gcm_test_case_256_1);
10275 }
10276
10277 static int
10278 test_AES_GCM_auth_encryption_test_case_256_2(void)
10279 {
10280         return test_authenticated_encryption(&gcm_test_case_256_2);
10281 }
10282
10283 static int
10284 test_AES_GCM_auth_encryption_test_case_256_3(void)
10285 {
10286         return test_authenticated_encryption(&gcm_test_case_256_3);
10287 }
10288
10289 static int
10290 test_AES_GCM_auth_encryption_test_case_256_4(void)
10291 {
10292         return test_authenticated_encryption(&gcm_test_case_256_4);
10293 }
10294
10295 static int
10296 test_AES_GCM_auth_encryption_test_case_256_5(void)
10297 {
10298         return test_authenticated_encryption(&gcm_test_case_256_5);
10299 }
10300
10301 static int
10302 test_AES_GCM_auth_encryption_test_case_256_6(void)
10303 {
10304         return test_authenticated_encryption(&gcm_test_case_256_6);
10305 }
10306
10307 static int
10308 test_AES_GCM_auth_encryption_test_case_256_7(void)
10309 {
10310         return test_authenticated_encryption(&gcm_test_case_256_7);
10311 }
10312
10313 static int
10314 test_AES_GCM_auth_encryption_test_case_aad_1(void)
10315 {
10316         return test_authenticated_encryption(&gcm_test_case_aad_1);
10317 }
10318
10319 static int
10320 test_AES_GCM_auth_encryption_test_case_aad_2(void)
10321 {
10322         return test_authenticated_encryption(&gcm_test_case_aad_2);
10323 }
10324
10325 static int
10326 test_AES_GCM_auth_encryption_fail_iv_corrupt(void)
10327 {
10328         struct aead_test_data tdata;
10329         int res;
10330
10331         RTE_LOG(INFO, USER1, "This is a negative test, errors are expected\n");
10332         memcpy(&tdata, &gcm_test_case_7, sizeof(struct aead_test_data));
10333         tdata.iv.data[0] += 1;
10334         res = test_authenticated_encryption(&tdata);
10335         if (res == TEST_SKIPPED)
10336                 return res;
10337         TEST_ASSERT_EQUAL(res, TEST_FAILED, "encryption not failed");
10338         return TEST_SUCCESS;
10339 }
10340
10341 static int
10342 test_AES_GCM_auth_encryption_fail_in_data_corrupt(void)
10343 {
10344         struct aead_test_data tdata;
10345         int res;
10346
10347         RTE_LOG(INFO, USER1, "This is a negative test, errors are expected\n");
10348         memcpy(&tdata, &gcm_test_case_7, sizeof(struct aead_test_data));
10349         tdata.plaintext.data[0] += 1;
10350         res = test_authenticated_encryption(&tdata);
10351         if (res == TEST_SKIPPED)
10352                 return res;
10353         TEST_ASSERT_EQUAL(res, TEST_FAILED, "encryption not failed");
10354         return TEST_SUCCESS;
10355 }
10356
10357 static int
10358 test_AES_GCM_auth_encryption_fail_out_data_corrupt(void)
10359 {
10360         struct aead_test_data tdata;
10361         int res;
10362
10363         RTE_LOG(INFO, USER1, "This is a negative test, errors are expected\n");
10364         memcpy(&tdata, &gcm_test_case_7, sizeof(struct aead_test_data));
10365         tdata.ciphertext.data[0] += 1;
10366         res = test_authenticated_encryption(&tdata);
10367         if (res == TEST_SKIPPED)
10368                 return res;
10369         TEST_ASSERT_EQUAL(res, TEST_FAILED, "encryption not failed");
10370         return TEST_SUCCESS;
10371 }
10372
10373 static int
10374 test_AES_GCM_auth_encryption_fail_aad_len_corrupt(void)
10375 {
10376         struct aead_test_data tdata;
10377         int res;
10378
10379         RTE_LOG(INFO, USER1, "This is a negative test, errors are expected\n");
10380         memcpy(&tdata, &gcm_test_case_7, sizeof(struct aead_test_data));
10381         tdata.aad.len += 1;
10382         res = test_authenticated_encryption(&tdata);
10383         if (res == TEST_SKIPPED)
10384                 return res;
10385         TEST_ASSERT_EQUAL(res, TEST_FAILED, "encryption not failed");
10386         return TEST_SUCCESS;
10387 }
10388
10389 static int
10390 test_AES_GCM_auth_encryption_fail_aad_corrupt(void)
10391 {
10392         struct aead_test_data tdata;
10393         uint8_t aad[gcm_test_case_7.aad.len];
10394         int res;
10395
10396         RTE_LOG(INFO, USER1, "This is a negative test, errors are expected\n");
10397         memcpy(&tdata, &gcm_test_case_7, sizeof(struct aead_test_data));
10398         memcpy(aad, gcm_test_case_7.aad.data, gcm_test_case_7.aad.len);
10399         aad[0] += 1;
10400         tdata.aad.data = aad;
10401         res = test_authenticated_encryption(&tdata);
10402         if (res == TEST_SKIPPED)
10403                 return res;
10404         TEST_ASSERT_EQUAL(res, TEST_FAILED, "encryption not failed");
10405         return TEST_SUCCESS;
10406 }
10407
10408 static int
10409 test_AES_GCM_auth_encryption_fail_tag_corrupt(void)
10410 {
10411         struct aead_test_data tdata;
10412         int res;
10413
10414         RTE_LOG(INFO, USER1, "This is a negative test, errors are expected\n");
10415         memcpy(&tdata, &gcm_test_case_7, sizeof(struct aead_test_data));
10416         tdata.auth_tag.data[0] += 1;
10417         res = test_authenticated_encryption(&tdata);
10418         if (res == TEST_SKIPPED)
10419                 return res;
10420         TEST_ASSERT_EQUAL(res, TEST_FAILED, "encryption not failed");
10421         return TEST_SUCCESS;
10422 }
10423
10424 static int
10425 test_authenticated_decryption(const struct aead_test_data *tdata)
10426 {
10427         struct crypto_testsuite_params *ts_params = &testsuite_params;
10428         struct crypto_unittest_params *ut_params = &unittest_params;
10429
10430         int retval;
10431         uint8_t *plaintext;
10432         uint32_t i;
10433         struct rte_cryptodev_info dev_info;
10434
10435         rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
10436         uint64_t feat_flags = dev_info.feature_flags;
10437
10438         if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
10439                         (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
10440                 printf("Device doesn't support RAW data-path APIs.\n");
10441                 return TEST_SKIPPED;
10442         }
10443
10444         /* Verify the capabilities */
10445         struct rte_cryptodev_sym_capability_idx cap_idx;
10446         const struct rte_cryptodev_symmetric_capability *capability;
10447         cap_idx.type = RTE_CRYPTO_SYM_XFORM_AEAD;
10448         cap_idx.algo.aead = tdata->algo;
10449         capability = rte_cryptodev_sym_capability_get(
10450                         ts_params->valid_devs[0], &cap_idx);
10451         if (capability == NULL)
10452                 return TEST_SKIPPED;
10453         if (rte_cryptodev_sym_capability_check_aead(
10454                         capability, tdata->key.len, tdata->auth_tag.len,
10455                         tdata->aad.len, tdata->iv.len))
10456                 return TEST_SKIPPED;
10457
10458         /* Create AEAD session */
10459         retval = create_aead_session(ts_params->valid_devs[0],
10460                         tdata->algo,
10461                         RTE_CRYPTO_AEAD_OP_DECRYPT,
10462                         tdata->key.data, tdata->key.len,
10463                         tdata->aad.len, tdata->auth_tag.len,
10464                         tdata->iv.len);
10465         if (retval < 0)
10466                 return retval;
10467
10468         /* alloc mbuf and set payload */
10469         if (tdata->aad.len > MBUF_SIZE) {
10470                 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->large_mbuf_pool);
10471                 /* Populate full size of add data */
10472                 for (i = 32; i < MAX_AAD_LENGTH; i += 32)
10473                         memcpy(&tdata->aad.data[i], &tdata->aad.data[0], 32);
10474         } else
10475                 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
10476
10477         memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
10478                         rte_pktmbuf_tailroom(ut_params->ibuf));
10479
10480         /* Create AEAD operation */
10481         retval = create_aead_operation(RTE_CRYPTO_AEAD_OP_DECRYPT, tdata);
10482         if (retval < 0)
10483                 return retval;
10484
10485         rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
10486
10487         ut_params->op->sym->m_src = ut_params->ibuf;
10488
10489         /* Process crypto operation */
10490         if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
10491                 process_cpu_aead_op(ts_params->valid_devs[0], ut_params->op);
10492         else if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
10493                 process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
10494                                 ut_params->op, 0, 0, 0, 0);
10495         else
10496                 TEST_ASSERT_NOT_NULL(
10497                         process_crypto_request(ts_params->valid_devs[0],
10498                         ut_params->op), "failed to process sym crypto op");
10499
10500         TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
10501                         "crypto op processing failed");
10502
10503         if (ut_params->op->sym->m_dst)
10504                 plaintext = rte_pktmbuf_mtod(ut_params->op->sym->m_dst,
10505                                 uint8_t *);
10506         else
10507                 plaintext = rte_pktmbuf_mtod_offset(ut_params->op->sym->m_src,
10508                                 uint8_t *,
10509                                 ut_params->op->sym->cipher.data.offset);
10510
10511         debug_hexdump(stdout, "plaintext:", plaintext, tdata->ciphertext.len);
10512
10513         /* Validate obuf */
10514         TEST_ASSERT_BUFFERS_ARE_EQUAL(
10515                         plaintext,
10516                         tdata->plaintext.data,
10517                         tdata->plaintext.len,
10518                         "Plaintext data not as expected");
10519
10520         TEST_ASSERT_EQUAL(ut_params->op->status,
10521                         RTE_CRYPTO_OP_STATUS_SUCCESS,
10522                         "Authentication failed");
10523
10524         return 0;
10525 }
10526
10527 static int
10528 test_AES_GCM_authenticated_decryption_test_case_1(void)
10529 {
10530         return test_authenticated_decryption(&gcm_test_case_1);
10531 }
10532
10533 static int
10534 test_AES_GCM_authenticated_decryption_test_case_2(void)
10535 {
10536         return test_authenticated_decryption(&gcm_test_case_2);
10537 }
10538
10539 static int
10540 test_AES_GCM_authenticated_decryption_test_case_3(void)
10541 {
10542         return test_authenticated_decryption(&gcm_test_case_3);
10543 }
10544
10545 static int
10546 test_AES_GCM_authenticated_decryption_test_case_4(void)
10547 {
10548         return test_authenticated_decryption(&gcm_test_case_4);
10549 }
10550
10551 static int
10552 test_AES_GCM_authenticated_decryption_test_case_5(void)
10553 {
10554         return test_authenticated_decryption(&gcm_test_case_5);
10555 }
10556
10557 static int
10558 test_AES_GCM_authenticated_decryption_test_case_6(void)
10559 {
10560         return test_authenticated_decryption(&gcm_test_case_6);
10561 }
10562
10563 static int
10564 test_AES_GCM_authenticated_decryption_test_case_7(void)
10565 {
10566         return test_authenticated_decryption(&gcm_test_case_7);
10567 }
10568
10569 static int
10570 test_AES_GCM_authenticated_decryption_test_case_8(void)
10571 {
10572         return test_authenticated_decryption(&gcm_test_case_8);
10573 }
10574
10575 static int
10576 test_AES_GCM_J0_authenticated_decryption_test_case_1(void)
10577 {
10578         return test_authenticated_decryption(&gcm_J0_test_case_1);
10579 }
10580
10581 static int
10582 test_AES_GCM_auth_decryption_test_case_192_1(void)
10583 {
10584         return test_authenticated_decryption(&gcm_test_case_192_1);
10585 }
10586
10587 static int
10588 test_AES_GCM_auth_decryption_test_case_192_2(void)
10589 {
10590         return test_authenticated_decryption(&gcm_test_case_192_2);
10591 }
10592
10593 static int
10594 test_AES_GCM_auth_decryption_test_case_192_3(void)
10595 {
10596         return test_authenticated_decryption(&gcm_test_case_192_3);
10597 }
10598
10599 static int
10600 test_AES_GCM_auth_decryption_test_case_192_4(void)
10601 {
10602         return test_authenticated_decryption(&gcm_test_case_192_4);
10603 }
10604
10605 static int
10606 test_AES_GCM_auth_decryption_test_case_192_5(void)
10607 {
10608         return test_authenticated_decryption(&gcm_test_case_192_5);
10609 }
10610
10611 static int
10612 test_AES_GCM_auth_decryption_test_case_192_6(void)
10613 {
10614         return test_authenticated_decryption(&gcm_test_case_192_6);
10615 }
10616
10617 static int
10618 test_AES_GCM_auth_decryption_test_case_192_7(void)
10619 {
10620         return test_authenticated_decryption(&gcm_test_case_192_7);
10621 }
10622
10623 static int
10624 test_AES_GCM_auth_decryption_test_case_256_1(void)
10625 {
10626         return test_authenticated_decryption(&gcm_test_case_256_1);
10627 }
10628
10629 static int
10630 test_AES_GCM_auth_decryption_test_case_256_2(void)
10631 {
10632         return test_authenticated_decryption(&gcm_test_case_256_2);
10633 }
10634
10635 static int
10636 test_AES_GCM_auth_decryption_test_case_256_3(void)
10637 {
10638         return test_authenticated_decryption(&gcm_test_case_256_3);
10639 }
10640
10641 static int
10642 test_AES_GCM_auth_decryption_test_case_256_4(void)
10643 {
10644         return test_authenticated_decryption(&gcm_test_case_256_4);
10645 }
10646
10647 static int
10648 test_AES_GCM_auth_decryption_test_case_256_5(void)
10649 {
10650         return test_authenticated_decryption(&gcm_test_case_256_5);
10651 }
10652
10653 static int
10654 test_AES_GCM_auth_decryption_test_case_256_6(void)
10655 {
10656         return test_authenticated_decryption(&gcm_test_case_256_6);
10657 }
10658
10659 static int
10660 test_AES_GCM_auth_decryption_test_case_256_7(void)
10661 {
10662         return test_authenticated_decryption(&gcm_test_case_256_7);
10663 }
10664
10665 static int
10666 test_AES_GCM_auth_decryption_test_case_aad_1(void)
10667 {
10668         return test_authenticated_decryption(&gcm_test_case_aad_1);
10669 }
10670
10671 static int
10672 test_AES_GCM_auth_decryption_test_case_aad_2(void)
10673 {
10674         return test_authenticated_decryption(&gcm_test_case_aad_2);
10675 }
10676
10677 static int
10678 test_AES_GCM_auth_decryption_fail_iv_corrupt(void)
10679 {
10680         struct aead_test_data tdata;
10681         int res;
10682
10683         memcpy(&tdata, &gcm_test_case_7, sizeof(struct aead_test_data));
10684         tdata.iv.data[0] += 1;
10685         res = test_authenticated_decryption(&tdata);
10686         if (res == TEST_SKIPPED)
10687                 return res;
10688         TEST_ASSERT_EQUAL(res, TEST_FAILED, "decryption not failed");
10689         return TEST_SUCCESS;
10690 }
10691
10692 static int
10693 test_AES_GCM_auth_decryption_fail_in_data_corrupt(void)
10694 {
10695         struct aead_test_data tdata;
10696         int res;
10697
10698         RTE_LOG(INFO, USER1, "This is a negative test, errors are expected\n");
10699         memcpy(&tdata, &gcm_test_case_7, sizeof(struct aead_test_data));
10700         tdata.plaintext.data[0] += 1;
10701         res = test_authenticated_decryption(&tdata);
10702         if (res == TEST_SKIPPED)
10703                 return res;
10704         TEST_ASSERT_EQUAL(res, TEST_FAILED, "decryption not failed");
10705         return TEST_SUCCESS;
10706 }
10707
10708 static int
10709 test_AES_GCM_auth_decryption_fail_out_data_corrupt(void)
10710 {
10711         struct aead_test_data tdata;
10712         int res;
10713
10714         memcpy(&tdata, &gcm_test_case_7, sizeof(struct aead_test_data));
10715         tdata.ciphertext.data[0] += 1;
10716         res = test_authenticated_decryption(&tdata);
10717         if (res == TEST_SKIPPED)
10718                 return res;
10719         TEST_ASSERT_EQUAL(res, TEST_FAILED, "decryption not failed");
10720         return TEST_SUCCESS;
10721 }
10722
10723 static int
10724 test_AES_GCM_auth_decryption_fail_aad_len_corrupt(void)
10725 {
10726         struct aead_test_data tdata;
10727         int res;
10728
10729         memcpy(&tdata, &gcm_test_case_7, sizeof(struct aead_test_data));
10730         tdata.aad.len += 1;
10731         res = test_authenticated_decryption(&tdata);
10732         if (res == TEST_SKIPPED)
10733                 return res;
10734         TEST_ASSERT_EQUAL(res, TEST_FAILED, "decryption not failed");
10735         return TEST_SUCCESS;
10736 }
10737
10738 static int
10739 test_AES_GCM_auth_decryption_fail_aad_corrupt(void)
10740 {
10741         struct aead_test_data tdata;
10742         uint8_t aad[gcm_test_case_7.aad.len];
10743         int res;
10744
10745         memcpy(&tdata, &gcm_test_case_7, sizeof(struct aead_test_data));
10746         memcpy(aad, gcm_test_case_7.aad.data, gcm_test_case_7.aad.len);
10747         aad[0] += 1;
10748         tdata.aad.data = aad;
10749         res = test_authenticated_decryption(&tdata);
10750         if (res == TEST_SKIPPED)
10751                 return res;
10752         TEST_ASSERT_EQUAL(res, TEST_FAILED, "decryption not failed");
10753         return TEST_SUCCESS;
10754 }
10755
10756 static int
10757 test_AES_GCM_auth_decryption_fail_tag_corrupt(void)
10758 {
10759         struct aead_test_data tdata;
10760         int res;
10761
10762         memcpy(&tdata, &gcm_test_case_7, sizeof(struct aead_test_data));
10763         tdata.auth_tag.data[0] += 1;
10764         res = test_authenticated_decryption(&tdata);
10765         if (res == TEST_SKIPPED)
10766                 return res;
10767         TEST_ASSERT_EQUAL(res, TEST_FAILED, "authentication not failed");
10768         return TEST_SUCCESS;
10769 }
10770
10771 static int
10772 test_authenticated_encryption_oop(const struct aead_test_data *tdata)
10773 {
10774         struct crypto_testsuite_params *ts_params = &testsuite_params;
10775         struct crypto_unittest_params *ut_params = &unittest_params;
10776
10777         int retval;
10778         uint8_t *ciphertext, *auth_tag;
10779         uint16_t plaintext_pad_len;
10780         struct rte_cryptodev_info dev_info;
10781
10782         /* Verify the capabilities */
10783         struct rte_cryptodev_sym_capability_idx cap_idx;
10784         cap_idx.type = RTE_CRYPTO_SYM_XFORM_AEAD;
10785         cap_idx.algo.aead = tdata->algo;
10786         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
10787                         &cap_idx) == NULL)
10788                 return TEST_SKIPPED;
10789
10790         rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
10791         uint64_t feat_flags = dev_info.feature_flags;
10792
10793         if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
10794                         (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP)))
10795                 return TEST_SKIPPED;
10796
10797         /* not supported with CPU crypto */
10798         if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
10799                 return TEST_SKIPPED;
10800
10801         /* Create AEAD session */
10802         retval = create_aead_session(ts_params->valid_devs[0],
10803                         tdata->algo,
10804                         RTE_CRYPTO_AEAD_OP_ENCRYPT,
10805                         tdata->key.data, tdata->key.len,
10806                         tdata->aad.len, tdata->auth_tag.len,
10807                         tdata->iv.len);
10808         if (retval < 0)
10809                 return retval;
10810
10811         ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
10812         ut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
10813
10814         /* clear mbuf payload */
10815         memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
10816                         rte_pktmbuf_tailroom(ut_params->ibuf));
10817         memset(rte_pktmbuf_mtod(ut_params->obuf, uint8_t *), 0,
10818                         rte_pktmbuf_tailroom(ut_params->obuf));
10819
10820         /* Create AEAD operation */
10821         retval = create_aead_operation(RTE_CRYPTO_AEAD_OP_ENCRYPT, tdata);
10822         if (retval < 0)
10823                 return retval;
10824
10825         rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
10826
10827         ut_params->op->sym->m_src = ut_params->ibuf;
10828         ut_params->op->sym->m_dst = ut_params->obuf;
10829
10830         /* Process crypto operation */
10831         if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
10832                 process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
10833                         ut_params->op, 0, 0, 0, 0);
10834         else
10835                 TEST_ASSERT_NOT_NULL(process_crypto_request(ts_params->valid_devs[0],
10836                         ut_params->op), "failed to process sym crypto op");
10837
10838         TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
10839                         "crypto op processing failed");
10840
10841         plaintext_pad_len = RTE_ALIGN_CEIL(tdata->plaintext.len, 16);
10842
10843         ciphertext = rte_pktmbuf_mtod_offset(ut_params->obuf, uint8_t *,
10844                         ut_params->op->sym->cipher.data.offset);
10845         auth_tag = ciphertext + plaintext_pad_len;
10846
10847         debug_hexdump(stdout, "ciphertext:", ciphertext, tdata->ciphertext.len);
10848         debug_hexdump(stdout, "auth tag:", auth_tag, tdata->auth_tag.len);
10849
10850         /* Validate obuf */
10851         TEST_ASSERT_BUFFERS_ARE_EQUAL(
10852                         ciphertext,
10853                         tdata->ciphertext.data,
10854                         tdata->ciphertext.len,
10855                         "Ciphertext data not as expected");
10856
10857         TEST_ASSERT_BUFFERS_ARE_EQUAL(
10858                         auth_tag,
10859                         tdata->auth_tag.data,
10860                         tdata->auth_tag.len,
10861                         "Generated auth tag not as expected");
10862
10863         return 0;
10864
10865 }
10866
10867 static int
10868 test_AES_GCM_authenticated_encryption_oop_test_case_1(void)
10869 {
10870         return test_authenticated_encryption_oop(&gcm_test_case_5);
10871 }
10872
10873 static int
10874 test_authenticated_decryption_oop(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         struct rte_cryptodev_info dev_info;
10882
10883         rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
10884         uint64_t feat_flags = dev_info.feature_flags;
10885
10886         /* Verify the capabilities */
10887         struct rte_cryptodev_sym_capability_idx cap_idx;
10888         cap_idx.type = RTE_CRYPTO_SYM_XFORM_AEAD;
10889         cap_idx.algo.aead = tdata->algo;
10890         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
10891                         &cap_idx) == NULL)
10892                 return TEST_SKIPPED;
10893
10894         /* not supported with CPU crypto and raw data-path APIs*/
10895         if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO ||
10896                         global_api_test_type == CRYPTODEV_RAW_API_TEST)
10897                 return TEST_SKIPPED;
10898
10899         if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
10900                         (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
10901                 printf("Device does not support RAW data-path APIs.\n");
10902                 return TEST_SKIPPED;
10903         }
10904
10905         /* Create AEAD session */
10906         retval = create_aead_session(ts_params->valid_devs[0],
10907                         tdata->algo,
10908                         RTE_CRYPTO_AEAD_OP_DECRYPT,
10909                         tdata->key.data, tdata->key.len,
10910                         tdata->aad.len, tdata->auth_tag.len,
10911                         tdata->iv.len);
10912         if (retval < 0)
10913                 return retval;
10914
10915         /* alloc mbuf and set payload */
10916         ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
10917         ut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
10918
10919         memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
10920                         rte_pktmbuf_tailroom(ut_params->ibuf));
10921         memset(rte_pktmbuf_mtod(ut_params->obuf, uint8_t *), 0,
10922                         rte_pktmbuf_tailroom(ut_params->obuf));
10923
10924         /* Create AEAD operation */
10925         retval = create_aead_operation(RTE_CRYPTO_AEAD_OP_DECRYPT, tdata);
10926         if (retval < 0)
10927                 return retval;
10928
10929         rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
10930
10931         ut_params->op->sym->m_src = ut_params->ibuf;
10932         ut_params->op->sym->m_dst = ut_params->obuf;
10933
10934         /* Process crypto operation */
10935         if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
10936                 process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
10937                                 ut_params->op, 0, 0, 0, 0);
10938         else
10939                 TEST_ASSERT_NOT_NULL(process_crypto_request(ts_params->valid_devs[0],
10940                         ut_params->op), "failed to process sym crypto op");
10941
10942         TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
10943                         "crypto op processing failed");
10944
10945         plaintext = rte_pktmbuf_mtod_offset(ut_params->obuf, uint8_t *,
10946                         ut_params->op->sym->cipher.data.offset);
10947
10948         debug_hexdump(stdout, "plaintext:", plaintext, tdata->ciphertext.len);
10949
10950         /* Validate obuf */
10951         TEST_ASSERT_BUFFERS_ARE_EQUAL(
10952                         plaintext,
10953                         tdata->plaintext.data,
10954                         tdata->plaintext.len,
10955                         "Plaintext data not as expected");
10956
10957         TEST_ASSERT_EQUAL(ut_params->op->status,
10958                         RTE_CRYPTO_OP_STATUS_SUCCESS,
10959                         "Authentication failed");
10960         return 0;
10961 }
10962
10963 static int
10964 test_AES_GCM_authenticated_decryption_oop_test_case_1(void)
10965 {
10966         return test_authenticated_decryption_oop(&gcm_test_case_5);
10967 }
10968
10969 static int
10970 test_authenticated_encryption_sessionless(
10971                 const struct aead_test_data *tdata)
10972 {
10973         struct crypto_testsuite_params *ts_params = &testsuite_params;
10974         struct crypto_unittest_params *ut_params = &unittest_params;
10975
10976         int retval;
10977         uint8_t *ciphertext, *auth_tag;
10978         uint16_t plaintext_pad_len;
10979         uint8_t key[tdata->key.len + 1];
10980         struct rte_cryptodev_info dev_info;
10981
10982         rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
10983         uint64_t feat_flags = dev_info.feature_flags;
10984
10985         if (!(feat_flags & RTE_CRYPTODEV_FF_SYM_SESSIONLESS)) {
10986                 printf("Device doesn't support Sessionless ops.\n");
10987                 return TEST_SKIPPED;
10988         }
10989
10990         /* not supported with CPU crypto */
10991         if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
10992                 return TEST_SKIPPED;
10993
10994         /* Verify the capabilities */
10995         struct rte_cryptodev_sym_capability_idx cap_idx;
10996         cap_idx.type = RTE_CRYPTO_SYM_XFORM_AEAD;
10997         cap_idx.algo.aead = tdata->algo;
10998         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
10999                         &cap_idx) == NULL)
11000                 return TEST_SKIPPED;
11001
11002         ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
11003
11004         /* clear mbuf payload */
11005         memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
11006                         rte_pktmbuf_tailroom(ut_params->ibuf));
11007
11008         /* Create AEAD operation */
11009         retval = create_aead_operation(RTE_CRYPTO_AEAD_OP_ENCRYPT, tdata);
11010         if (retval < 0)
11011                 return retval;
11012
11013         /* Create GCM xform */
11014         memcpy(key, tdata->key.data, tdata->key.len);
11015         retval = create_aead_xform(ut_params->op,
11016                         tdata->algo,
11017                         RTE_CRYPTO_AEAD_OP_ENCRYPT,
11018                         key, tdata->key.len,
11019                         tdata->aad.len, tdata->auth_tag.len,
11020                         tdata->iv.len);
11021         if (retval < 0)
11022                 return retval;
11023
11024         ut_params->op->sym->m_src = ut_params->ibuf;
11025
11026         TEST_ASSERT_EQUAL(ut_params->op->sess_type,
11027                         RTE_CRYPTO_OP_SESSIONLESS,
11028                         "crypto op session type not sessionless");
11029
11030         /* Process crypto operation */
11031         TEST_ASSERT_NOT_NULL(process_crypto_request(ts_params->valid_devs[0],
11032                         ut_params->op), "failed to process sym crypto op");
11033
11034         TEST_ASSERT_NOT_NULL(ut_params->op, "failed crypto process");
11035
11036         TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
11037                         "crypto op status not success");
11038
11039         plaintext_pad_len = RTE_ALIGN_CEIL(tdata->plaintext.len, 16);
11040
11041         ciphertext = rte_pktmbuf_mtod_offset(ut_params->ibuf, uint8_t *,
11042                         ut_params->op->sym->cipher.data.offset);
11043         auth_tag = ciphertext + plaintext_pad_len;
11044
11045         debug_hexdump(stdout, "ciphertext:", ciphertext, tdata->ciphertext.len);
11046         debug_hexdump(stdout, "auth tag:", auth_tag, tdata->auth_tag.len);
11047
11048         /* Validate obuf */
11049         TEST_ASSERT_BUFFERS_ARE_EQUAL(
11050                         ciphertext,
11051                         tdata->ciphertext.data,
11052                         tdata->ciphertext.len,
11053                         "Ciphertext data not as expected");
11054
11055         TEST_ASSERT_BUFFERS_ARE_EQUAL(
11056                         auth_tag,
11057                         tdata->auth_tag.data,
11058                         tdata->auth_tag.len,
11059                         "Generated auth tag not as expected");
11060
11061         return 0;
11062
11063 }
11064
11065 static int
11066 test_AES_GCM_authenticated_encryption_sessionless_test_case_1(void)
11067 {
11068         return test_authenticated_encryption_sessionless(
11069                         &gcm_test_case_5);
11070 }
11071
11072 static int
11073 test_authenticated_decryption_sessionless(
11074                 const struct aead_test_data *tdata)
11075 {
11076         struct crypto_testsuite_params *ts_params = &testsuite_params;
11077         struct crypto_unittest_params *ut_params = &unittest_params;
11078
11079         int retval;
11080         uint8_t *plaintext;
11081         uint8_t key[tdata->key.len + 1];
11082         struct rte_cryptodev_info dev_info;
11083
11084         rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
11085         uint64_t feat_flags = dev_info.feature_flags;
11086
11087         if (!(feat_flags & RTE_CRYPTODEV_FF_SYM_SESSIONLESS)) {
11088                 printf("Device doesn't support Sessionless ops.\n");
11089                 return TEST_SKIPPED;
11090         }
11091
11092         if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
11093                         (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
11094                 printf("Device doesn't support RAW data-path APIs.\n");
11095                 return TEST_SKIPPED;
11096         }
11097
11098         /* not supported with CPU crypto */
11099         if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
11100                 return TEST_SKIPPED;
11101
11102         /* Verify the capabilities */
11103         struct rte_cryptodev_sym_capability_idx cap_idx;
11104         cap_idx.type = RTE_CRYPTO_SYM_XFORM_AEAD;
11105         cap_idx.algo.aead = tdata->algo;
11106         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
11107                         &cap_idx) == NULL)
11108                 return TEST_SKIPPED;
11109
11110         /* alloc mbuf and set payload */
11111         ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
11112
11113         memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
11114                         rte_pktmbuf_tailroom(ut_params->ibuf));
11115
11116         /* Create AEAD operation */
11117         retval = create_aead_operation(RTE_CRYPTO_AEAD_OP_DECRYPT, tdata);
11118         if (retval < 0)
11119                 return retval;
11120
11121         /* Create AEAD xform */
11122         memcpy(key, tdata->key.data, tdata->key.len);
11123         retval = create_aead_xform(ut_params->op,
11124                         tdata->algo,
11125                         RTE_CRYPTO_AEAD_OP_DECRYPT,
11126                         key, tdata->key.len,
11127                         tdata->aad.len, tdata->auth_tag.len,
11128                         tdata->iv.len);
11129         if (retval < 0)
11130                 return retval;
11131
11132         ut_params->op->sym->m_src = ut_params->ibuf;
11133
11134         TEST_ASSERT_EQUAL(ut_params->op->sess_type,
11135                         RTE_CRYPTO_OP_SESSIONLESS,
11136                         "crypto op session type not sessionless");
11137
11138         /* Process crypto operation */
11139         if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
11140                 process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
11141                                 ut_params->op, 0, 0, 0, 0);
11142         else
11143                 TEST_ASSERT_NOT_NULL(process_crypto_request(
11144                         ts_params->valid_devs[0], ut_params->op),
11145                                 "failed to process sym crypto op");
11146
11147         TEST_ASSERT_NOT_NULL(ut_params->op, "failed crypto process");
11148
11149         TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
11150                         "crypto op status not success");
11151
11152         plaintext = rte_pktmbuf_mtod_offset(ut_params->ibuf, uint8_t *,
11153                         ut_params->op->sym->cipher.data.offset);
11154
11155         debug_hexdump(stdout, "plaintext:", plaintext, tdata->ciphertext.len);
11156
11157         /* Validate obuf */
11158         TEST_ASSERT_BUFFERS_ARE_EQUAL(
11159                         plaintext,
11160                         tdata->plaintext.data,
11161                         tdata->plaintext.len,
11162                         "Plaintext data not as expected");
11163
11164         TEST_ASSERT_EQUAL(ut_params->op->status,
11165                         RTE_CRYPTO_OP_STATUS_SUCCESS,
11166                         "Authentication failed");
11167         return 0;
11168 }
11169
11170 static int
11171 test_AES_GCM_authenticated_decryption_sessionless_test_case_1(void)
11172 {
11173         return test_authenticated_decryption_sessionless(
11174                         &gcm_test_case_5);
11175 }
11176
11177 static int
11178 test_AES_CCM_authenticated_encryption_test_case_128_1(void)
11179 {
11180         return test_authenticated_encryption(&ccm_test_case_128_1);
11181 }
11182
11183 static int
11184 test_AES_CCM_authenticated_encryption_test_case_128_2(void)
11185 {
11186         return test_authenticated_encryption(&ccm_test_case_128_2);
11187 }
11188
11189 static int
11190 test_AES_CCM_authenticated_encryption_test_case_128_3(void)
11191 {
11192         return test_authenticated_encryption(&ccm_test_case_128_3);
11193 }
11194
11195 static int
11196 test_AES_CCM_authenticated_decryption_test_case_128_1(void)
11197 {
11198         return test_authenticated_decryption(&ccm_test_case_128_1);
11199 }
11200
11201 static int
11202 test_AES_CCM_authenticated_decryption_test_case_128_2(void)
11203 {
11204         return test_authenticated_decryption(&ccm_test_case_128_2);
11205 }
11206
11207 static int
11208 test_AES_CCM_authenticated_decryption_test_case_128_3(void)
11209 {
11210         return test_authenticated_decryption(&ccm_test_case_128_3);
11211 }
11212
11213 static int
11214 test_AES_CCM_authenticated_encryption_test_case_192_1(void)
11215 {
11216         return test_authenticated_encryption(&ccm_test_case_192_1);
11217 }
11218
11219 static int
11220 test_AES_CCM_authenticated_encryption_test_case_192_2(void)
11221 {
11222         return test_authenticated_encryption(&ccm_test_case_192_2);
11223 }
11224
11225 static int
11226 test_AES_CCM_authenticated_encryption_test_case_192_3(void)
11227 {
11228         return test_authenticated_encryption(&ccm_test_case_192_3);
11229 }
11230
11231 static int
11232 test_AES_CCM_authenticated_decryption_test_case_192_1(void)
11233 {
11234         return test_authenticated_decryption(&ccm_test_case_192_1);
11235 }
11236
11237 static int
11238 test_AES_CCM_authenticated_decryption_test_case_192_2(void)
11239 {
11240         return test_authenticated_decryption(&ccm_test_case_192_2);
11241 }
11242
11243 static int
11244 test_AES_CCM_authenticated_decryption_test_case_192_3(void)
11245 {
11246         return test_authenticated_decryption(&ccm_test_case_192_3);
11247 }
11248
11249 static int
11250 test_AES_CCM_authenticated_encryption_test_case_256_1(void)
11251 {
11252         return test_authenticated_encryption(&ccm_test_case_256_1);
11253 }
11254
11255 static int
11256 test_AES_CCM_authenticated_encryption_test_case_256_2(void)
11257 {
11258         return test_authenticated_encryption(&ccm_test_case_256_2);
11259 }
11260
11261 static int
11262 test_AES_CCM_authenticated_encryption_test_case_256_3(void)
11263 {
11264         return test_authenticated_encryption(&ccm_test_case_256_3);
11265 }
11266
11267 static int
11268 test_AES_CCM_authenticated_decryption_test_case_256_1(void)
11269 {
11270         return test_authenticated_decryption(&ccm_test_case_256_1);
11271 }
11272
11273 static int
11274 test_AES_CCM_authenticated_decryption_test_case_256_2(void)
11275 {
11276         return test_authenticated_decryption(&ccm_test_case_256_2);
11277 }
11278
11279 static int
11280 test_AES_CCM_authenticated_decryption_test_case_256_3(void)
11281 {
11282         return test_authenticated_decryption(&ccm_test_case_256_3);
11283 }
11284
11285 static int
11286 test_stats(void)
11287 {
11288         struct crypto_testsuite_params *ts_params = &testsuite_params;
11289         struct rte_cryptodev_stats stats;
11290
11291         if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
11292                 return TEST_SKIPPED;
11293
11294         /* Verify the capabilities */
11295         struct rte_cryptodev_sym_capability_idx cap_idx;
11296         cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
11297         cap_idx.algo.auth = RTE_CRYPTO_AUTH_SHA1_HMAC;
11298         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
11299                         &cap_idx) == NULL)
11300                 return TEST_SKIPPED;
11301         cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
11302         cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_AES_CBC;
11303         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
11304                         &cap_idx) == NULL)
11305                 return TEST_SKIPPED;
11306
11307         if (rte_cryptodev_stats_get(ts_params->valid_devs[0], &stats)
11308                         == -ENOTSUP)
11309                 return TEST_SKIPPED;
11310
11311         rte_cryptodev_stats_reset(ts_params->valid_devs[0]);
11312         TEST_ASSERT((rte_cryptodev_stats_get(ts_params->valid_devs[0] + 600,
11313                         &stats) == -ENODEV),
11314                 "rte_cryptodev_stats_get invalid dev failed");
11315         TEST_ASSERT((rte_cryptodev_stats_get(ts_params->valid_devs[0], 0) != 0),
11316                 "rte_cryptodev_stats_get invalid Param failed");
11317
11318         /* Test expected values */
11319         test_AES_CBC_HMAC_SHA1_encrypt_digest();
11320         TEST_ASSERT_SUCCESS(rte_cryptodev_stats_get(ts_params->valid_devs[0],
11321                         &stats),
11322                 "rte_cryptodev_stats_get failed");
11323         TEST_ASSERT((stats.enqueued_count == 1),
11324                 "rte_cryptodev_stats_get returned unexpected enqueued stat");
11325         TEST_ASSERT((stats.dequeued_count == 1),
11326                 "rte_cryptodev_stats_get returned unexpected enqueued stat");
11327         TEST_ASSERT((stats.enqueue_err_count == 0),
11328                 "rte_cryptodev_stats_get returned unexpected enqueued stat");
11329         TEST_ASSERT((stats.dequeue_err_count == 0),
11330                 "rte_cryptodev_stats_get returned unexpected enqueued stat");
11331
11332         /* invalid device but should ignore and not reset device stats*/
11333         rte_cryptodev_stats_reset(ts_params->valid_devs[0] + 300);
11334         TEST_ASSERT_SUCCESS(rte_cryptodev_stats_get(ts_params->valid_devs[0],
11335                         &stats),
11336                 "rte_cryptodev_stats_get failed");
11337         TEST_ASSERT((stats.enqueued_count == 1),
11338                 "rte_cryptodev_stats_get returned unexpected enqueued stat");
11339
11340         /* check that a valid reset clears stats */
11341         rte_cryptodev_stats_reset(ts_params->valid_devs[0]);
11342         TEST_ASSERT_SUCCESS(rte_cryptodev_stats_get(ts_params->valid_devs[0],
11343                         &stats),
11344                                           "rte_cryptodev_stats_get failed");
11345         TEST_ASSERT((stats.enqueued_count == 0),
11346                 "rte_cryptodev_stats_get returned unexpected enqueued stat");
11347         TEST_ASSERT((stats.dequeued_count == 0),
11348                 "rte_cryptodev_stats_get returned unexpected enqueued stat");
11349
11350         return TEST_SUCCESS;
11351 }
11352
11353 static int MD5_HMAC_create_session(struct crypto_testsuite_params *ts_params,
11354                                    struct crypto_unittest_params *ut_params,
11355                                    enum rte_crypto_auth_operation op,
11356                                    const struct HMAC_MD5_vector *test_case)
11357 {
11358         uint8_t key[64];
11359         int status;
11360
11361         memcpy(key, test_case->key.data, test_case->key.len);
11362
11363         ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;
11364         ut_params->auth_xform.next = NULL;
11365         ut_params->auth_xform.auth.op = op;
11366
11367         ut_params->auth_xform.auth.algo = RTE_CRYPTO_AUTH_MD5_HMAC;
11368
11369         ut_params->auth_xform.auth.digest_length = MD5_DIGEST_LEN;
11370         ut_params->auth_xform.auth.key.length = test_case->key.len;
11371         ut_params->auth_xform.auth.key.data = key;
11372
11373         ut_params->sess = rte_cryptodev_sym_session_create(
11374                         ts_params->session_mpool);
11375         TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed");
11376         if (ut_params->sess == NULL)
11377                 return TEST_FAILED;
11378
11379         status = rte_cryptodev_sym_session_init(ts_params->valid_devs[0],
11380                         ut_params->sess, &ut_params->auth_xform,
11381                         ts_params->session_priv_mpool);
11382         if (status == -ENOTSUP)
11383                 return TEST_SKIPPED;
11384
11385         ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
11386
11387         memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
11388                         rte_pktmbuf_tailroom(ut_params->ibuf));
11389
11390         return 0;
11391 }
11392
11393 static int MD5_HMAC_create_op(struct crypto_unittest_params *ut_params,
11394                               const struct HMAC_MD5_vector *test_case,
11395                               uint8_t **plaintext)
11396 {
11397         uint16_t plaintext_pad_len;
11398
11399         struct rte_crypto_sym_op *sym_op = ut_params->op->sym;
11400
11401         plaintext_pad_len = RTE_ALIGN_CEIL(test_case->plaintext.len,
11402                                 16);
11403
11404         *plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
11405                         plaintext_pad_len);
11406         memcpy(*plaintext, test_case->plaintext.data,
11407                         test_case->plaintext.len);
11408
11409         sym_op->auth.digest.data = (uint8_t *)rte_pktmbuf_append(
11410                         ut_params->ibuf, MD5_DIGEST_LEN);
11411         TEST_ASSERT_NOT_NULL(sym_op->auth.digest.data,
11412                         "no room to append digest");
11413         sym_op->auth.digest.phys_addr = rte_pktmbuf_iova_offset(
11414                         ut_params->ibuf, plaintext_pad_len);
11415
11416         if (ut_params->auth_xform.auth.op == RTE_CRYPTO_AUTH_OP_VERIFY) {
11417                 rte_memcpy(sym_op->auth.digest.data, test_case->auth_tag.data,
11418                            test_case->auth_tag.len);
11419         }
11420
11421         sym_op->auth.data.offset = 0;
11422         sym_op->auth.data.length = test_case->plaintext.len;
11423
11424         rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
11425         ut_params->op->sym->m_src = ut_params->ibuf;
11426
11427         return 0;
11428 }
11429
11430 static int
11431 test_MD5_HMAC_generate(const struct HMAC_MD5_vector *test_case)
11432 {
11433         uint16_t plaintext_pad_len;
11434         uint8_t *plaintext, *auth_tag;
11435
11436         struct crypto_testsuite_params *ts_params = &testsuite_params;
11437         struct crypto_unittest_params *ut_params = &unittest_params;
11438         struct rte_cryptodev_info dev_info;
11439
11440         rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
11441         uint64_t feat_flags = dev_info.feature_flags;
11442
11443         if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
11444                         (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
11445                 printf("Device doesn't support RAW data-path APIs.\n");
11446                 return TEST_SKIPPED;
11447         }
11448
11449         /* Verify the capabilities */
11450         struct rte_cryptodev_sym_capability_idx cap_idx;
11451         cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
11452         cap_idx.algo.auth = RTE_CRYPTO_AUTH_MD5_HMAC;
11453         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
11454                         &cap_idx) == NULL)
11455                 return TEST_SKIPPED;
11456
11457         if (MD5_HMAC_create_session(ts_params, ut_params,
11458                         RTE_CRYPTO_AUTH_OP_GENERATE, test_case))
11459                 return TEST_FAILED;
11460
11461         /* Generate Crypto op data structure */
11462         ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
11463                         RTE_CRYPTO_OP_TYPE_SYMMETRIC);
11464         TEST_ASSERT_NOT_NULL(ut_params->op,
11465                         "Failed to allocate symmetric crypto operation struct");
11466
11467         plaintext_pad_len = RTE_ALIGN_CEIL(test_case->plaintext.len,
11468                                 16);
11469
11470         if (MD5_HMAC_create_op(ut_params, test_case, &plaintext))
11471                 return TEST_FAILED;
11472
11473         if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
11474                 process_cpu_crypt_auth_op(ts_params->valid_devs[0],
11475                         ut_params->op);
11476         else if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
11477                 process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
11478                                 ut_params->op, 0, 1, 0, 0);
11479         else
11480                 TEST_ASSERT_NOT_NULL(
11481                         process_crypto_request(ts_params->valid_devs[0],
11482                                 ut_params->op),
11483                                 "failed to process sym crypto op");
11484
11485         TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
11486                         "crypto op processing failed");
11487
11488         if (ut_params->op->sym->m_dst) {
11489                 auth_tag = rte_pktmbuf_mtod_offset(ut_params->op->sym->m_dst,
11490                                 uint8_t *, plaintext_pad_len);
11491         } else {
11492                 auth_tag = plaintext + plaintext_pad_len;
11493         }
11494
11495         TEST_ASSERT_BUFFERS_ARE_EQUAL(
11496                         auth_tag,
11497                         test_case->auth_tag.data,
11498                         test_case->auth_tag.len,
11499                         "HMAC_MD5 generated tag not as expected");
11500
11501         return TEST_SUCCESS;
11502 }
11503
11504 static int
11505 test_MD5_HMAC_verify(const struct HMAC_MD5_vector *test_case)
11506 {
11507         uint8_t *plaintext;
11508
11509         struct crypto_testsuite_params *ts_params = &testsuite_params;
11510         struct crypto_unittest_params *ut_params = &unittest_params;
11511         struct rte_cryptodev_info dev_info;
11512
11513         rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
11514         uint64_t feat_flags = dev_info.feature_flags;
11515
11516         if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
11517                         (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
11518                 printf("Device doesn't support RAW data-path APIs.\n");
11519                 return TEST_SKIPPED;
11520         }
11521
11522         /* Verify the capabilities */
11523         struct rte_cryptodev_sym_capability_idx cap_idx;
11524         cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
11525         cap_idx.algo.auth = RTE_CRYPTO_AUTH_MD5_HMAC;
11526         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
11527                         &cap_idx) == NULL)
11528                 return TEST_SKIPPED;
11529
11530         if (MD5_HMAC_create_session(ts_params, ut_params,
11531                         RTE_CRYPTO_AUTH_OP_VERIFY, test_case)) {
11532                 return TEST_FAILED;
11533         }
11534
11535         /* Generate Crypto op data structure */
11536         ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
11537                         RTE_CRYPTO_OP_TYPE_SYMMETRIC);
11538         TEST_ASSERT_NOT_NULL(ut_params->op,
11539                         "Failed to allocate symmetric crypto operation struct");
11540
11541         if (MD5_HMAC_create_op(ut_params, test_case, &plaintext))
11542                 return TEST_FAILED;
11543
11544         if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
11545                 process_cpu_crypt_auth_op(ts_params->valid_devs[0],
11546                         ut_params->op);
11547         else if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
11548                 process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
11549                                 ut_params->op, 0, 1, 0, 0);
11550         else
11551                 TEST_ASSERT_NOT_NULL(
11552                         process_crypto_request(ts_params->valid_devs[0],
11553                                 ut_params->op),
11554                                 "failed to process sym crypto op");
11555
11556         TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
11557                         "HMAC_MD5 crypto op processing failed");
11558
11559         return TEST_SUCCESS;
11560 }
11561
11562 static int
11563 test_MD5_HMAC_generate_case_1(void)
11564 {
11565         return test_MD5_HMAC_generate(&HMAC_MD5_test_case_1);
11566 }
11567
11568 static int
11569 test_MD5_HMAC_verify_case_1(void)
11570 {
11571         return test_MD5_HMAC_verify(&HMAC_MD5_test_case_1);
11572 }
11573
11574 static int
11575 test_MD5_HMAC_generate_case_2(void)
11576 {
11577         return test_MD5_HMAC_generate(&HMAC_MD5_test_case_2);
11578 }
11579
11580 static int
11581 test_MD5_HMAC_verify_case_2(void)
11582 {
11583         return test_MD5_HMAC_verify(&HMAC_MD5_test_case_2);
11584 }
11585
11586 static int
11587 test_multi_session(void)
11588 {
11589         struct crypto_testsuite_params *ts_params = &testsuite_params;
11590         struct crypto_unittest_params *ut_params = &unittest_params;
11591
11592         struct rte_cryptodev_info dev_info;
11593         struct rte_cryptodev_sym_session **sessions;
11594
11595         uint16_t i;
11596         int status;
11597
11598         /* Verify the capabilities */
11599         struct rte_cryptodev_sym_capability_idx cap_idx;
11600         cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
11601         cap_idx.algo.auth = RTE_CRYPTO_AUTH_SHA512_HMAC;
11602         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
11603                         &cap_idx) == NULL)
11604                 return TEST_SKIPPED;
11605         cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
11606         cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_AES_CBC;
11607         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
11608                         &cap_idx) == NULL)
11609                 return TEST_SKIPPED;
11610
11611         test_AES_CBC_HMAC_SHA512_decrypt_create_session_params(ut_params,
11612                         aes_cbc_key, hmac_sha512_key);
11613
11614
11615         rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
11616
11617         sessions = rte_malloc(NULL,
11618                         sizeof(struct rte_cryptodev_sym_session *) *
11619                         (MAX_NB_SESSIONS + 1), 0);
11620
11621         /* Create multiple crypto sessions*/
11622         for (i = 0; i < MAX_NB_SESSIONS; i++) {
11623
11624                 sessions[i] = rte_cryptodev_sym_session_create(
11625                                 ts_params->session_mpool);
11626                 TEST_ASSERT_NOT_NULL(sessions[i],
11627                                 "Session creation failed at session number %u",
11628                                 i);
11629
11630                 status = rte_cryptodev_sym_session_init(
11631                                 ts_params->valid_devs[0],
11632                                 sessions[i], &ut_params->auth_xform,
11633                                 ts_params->session_priv_mpool);
11634                 if (status == -ENOTSUP)
11635                         return TEST_SKIPPED;
11636
11637                 /* Attempt to send a request on each session */
11638                 TEST_ASSERT_SUCCESS( test_AES_CBC_HMAC_SHA512_decrypt_perform(
11639                         sessions[i],
11640                         ut_params,
11641                         ts_params,
11642                         catch_22_quote_2_512_bytes_AES_CBC_ciphertext,
11643                         catch_22_quote_2_512_bytes_AES_CBC_HMAC_SHA512_digest,
11644                         aes_cbc_iv),
11645                         "Failed to perform decrypt on request number %u.", i);
11646                 /* free crypto operation structure */
11647                 if (ut_params->op)
11648                         rte_crypto_op_free(ut_params->op);
11649
11650                 /*
11651                  * free mbuf - both obuf and ibuf are usually the same,
11652                  * so check if they point at the same address is necessary,
11653                  * to avoid freeing the mbuf twice.
11654                  */
11655                 if (ut_params->obuf) {
11656                         rte_pktmbuf_free(ut_params->obuf);
11657                         if (ut_params->ibuf == ut_params->obuf)
11658                                 ut_params->ibuf = 0;
11659                         ut_params->obuf = 0;
11660                 }
11661                 if (ut_params->ibuf) {
11662                         rte_pktmbuf_free(ut_params->ibuf);
11663                         ut_params->ibuf = 0;
11664                 }
11665         }
11666
11667         sessions[i] = NULL;
11668         /* Next session create should fail */
11669         rte_cryptodev_sym_session_init(ts_params->valid_devs[0],
11670                         sessions[i], &ut_params->auth_xform,
11671                         ts_params->session_priv_mpool);
11672         TEST_ASSERT_NULL(sessions[i],
11673                         "Session creation succeeded unexpectedly!");
11674
11675         for (i = 0; i < MAX_NB_SESSIONS; i++) {
11676                 rte_cryptodev_sym_session_clear(ts_params->valid_devs[0],
11677                                 sessions[i]);
11678                 rte_cryptodev_sym_session_free(sessions[i]);
11679         }
11680
11681         rte_free(sessions);
11682
11683         return TEST_SUCCESS;
11684 }
11685
11686 struct multi_session_params {
11687         struct crypto_unittest_params ut_params;
11688         uint8_t *cipher_key;
11689         uint8_t *hmac_key;
11690         const uint8_t *cipher;
11691         const uint8_t *digest;
11692         uint8_t *iv;
11693 };
11694
11695 #define MB_SESSION_NUMBER 3
11696
11697 static int
11698 test_multi_session_random_usage(void)
11699 {
11700         struct crypto_testsuite_params *ts_params = &testsuite_params;
11701         struct rte_cryptodev_info dev_info;
11702         struct rte_cryptodev_sym_session **sessions;
11703         uint32_t i, j;
11704         struct multi_session_params ut_paramz[] = {
11705
11706                 {
11707                         .cipher_key = ms_aes_cbc_key0,
11708                         .hmac_key = ms_hmac_key0,
11709                         .cipher = ms_aes_cbc_cipher0,
11710                         .digest = ms_hmac_digest0,
11711                         .iv = ms_aes_cbc_iv0
11712                 },
11713                 {
11714                         .cipher_key = ms_aes_cbc_key1,
11715                         .hmac_key = ms_hmac_key1,
11716                         .cipher = ms_aes_cbc_cipher1,
11717                         .digest = ms_hmac_digest1,
11718                         .iv = ms_aes_cbc_iv1
11719                 },
11720                 {
11721                         .cipher_key = ms_aes_cbc_key2,
11722                         .hmac_key = ms_hmac_key2,
11723                         .cipher = ms_aes_cbc_cipher2,
11724                         .digest = ms_hmac_digest2,
11725                         .iv = ms_aes_cbc_iv2
11726                 },
11727
11728         };
11729         int status;
11730
11731         /* Verify the capabilities */
11732         struct rte_cryptodev_sym_capability_idx cap_idx;
11733         cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
11734         cap_idx.algo.auth = RTE_CRYPTO_AUTH_SHA512_HMAC;
11735         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
11736                         &cap_idx) == NULL)
11737                 return TEST_SKIPPED;
11738         cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
11739         cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_AES_CBC;
11740         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
11741                         &cap_idx) == NULL)
11742                 return TEST_SKIPPED;
11743
11744         rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
11745
11746         sessions = rte_malloc(NULL,
11747                         (sizeof(struct rte_cryptodev_sym_session *)
11748                                         * MAX_NB_SESSIONS) + 1, 0);
11749
11750         for (i = 0; i < MB_SESSION_NUMBER; i++) {
11751                 sessions[i] = rte_cryptodev_sym_session_create(
11752                                 ts_params->session_mpool);
11753                 TEST_ASSERT_NOT_NULL(sessions[i],
11754                                 "Session creation failed at session number %u",
11755                                 i);
11756
11757                 rte_memcpy(&ut_paramz[i].ut_params, &unittest_params,
11758                                 sizeof(struct crypto_unittest_params));
11759
11760                 test_AES_CBC_HMAC_SHA512_decrypt_create_session_params(
11761                                 &ut_paramz[i].ut_params,
11762                                 ut_paramz[i].cipher_key, ut_paramz[i].hmac_key);
11763
11764                 /* Create multiple crypto sessions*/
11765                 status = rte_cryptodev_sym_session_init(
11766                                 ts_params->valid_devs[0],
11767                                 sessions[i],
11768                                 &ut_paramz[i].ut_params.auth_xform,
11769                                 ts_params->session_priv_mpool);
11770
11771                 if (status == -ENOTSUP)
11772                         return TEST_SKIPPED;
11773
11774                 TEST_ASSERT_EQUAL(status, 0, "Session init failed");
11775         }
11776
11777         srand(time(NULL));
11778         for (i = 0; i < 40000; i++) {
11779
11780                 j = rand() % MB_SESSION_NUMBER;
11781
11782                 TEST_ASSERT_SUCCESS(
11783                         test_AES_CBC_HMAC_SHA512_decrypt_perform(
11784                                         sessions[j],
11785                                         &ut_paramz[j].ut_params,
11786                                         ts_params, ut_paramz[j].cipher,
11787                                         ut_paramz[j].digest,
11788                                         ut_paramz[j].iv),
11789                         "Failed to perform decrypt on request number %u.", i);
11790
11791                 if (ut_paramz[j].ut_params.op)
11792                         rte_crypto_op_free(ut_paramz[j].ut_params.op);
11793
11794                 /*
11795                  * free mbuf - both obuf and ibuf are usually the same,
11796                  * so check if they point at the same address is necessary,
11797                  * to avoid freeing the mbuf twice.
11798                  */
11799                 if (ut_paramz[j].ut_params.obuf) {
11800                         rte_pktmbuf_free(ut_paramz[j].ut_params.obuf);
11801                         if (ut_paramz[j].ut_params.ibuf
11802                                         == ut_paramz[j].ut_params.obuf)
11803                                 ut_paramz[j].ut_params.ibuf = 0;
11804                         ut_paramz[j].ut_params.obuf = 0;
11805                 }
11806                 if (ut_paramz[j].ut_params.ibuf) {
11807                         rte_pktmbuf_free(ut_paramz[j].ut_params.ibuf);
11808                         ut_paramz[j].ut_params.ibuf = 0;
11809                 }
11810         }
11811
11812         for (i = 0; i < MB_SESSION_NUMBER; i++) {
11813                 rte_cryptodev_sym_session_clear(ts_params->valid_devs[0],
11814                                 sessions[i]);
11815                 rte_cryptodev_sym_session_free(sessions[i]);
11816         }
11817
11818         rte_free(sessions);
11819
11820         return TEST_SUCCESS;
11821 }
11822
11823 uint8_t orig_data[] = {0xab, 0xab, 0xab, 0xab,
11824                         0xab, 0xab, 0xab, 0xab,
11825                         0xab, 0xab, 0xab, 0xab,
11826                         0xab, 0xab, 0xab, 0xab};
11827
11828 static int
11829 test_null_invalid_operation(void)
11830 {
11831         struct crypto_testsuite_params *ts_params = &testsuite_params;
11832         struct crypto_unittest_params *ut_params = &unittest_params;
11833         int ret;
11834
11835         /* This test is for NULL PMD only */
11836         if (gbl_driver_id != rte_cryptodev_driver_id_get(
11837                         RTE_STR(CRYPTODEV_NAME_NULL_PMD)))
11838                 return TEST_SKIPPED;
11839
11840         /* Setup Cipher Parameters */
11841         ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
11842         ut_params->cipher_xform.next = NULL;
11843
11844         ut_params->cipher_xform.cipher.algo = RTE_CRYPTO_CIPHER_AES_CBC;
11845         ut_params->cipher_xform.cipher.op = RTE_CRYPTO_CIPHER_OP_ENCRYPT;
11846
11847         ut_params->sess = rte_cryptodev_sym_session_create(
11848                         ts_params->session_mpool);
11849
11850         /* Create Crypto session*/
11851         ret = rte_cryptodev_sym_session_init(ts_params->valid_devs[0],
11852                         ut_params->sess, &ut_params->cipher_xform,
11853                         ts_params->session_priv_mpool);
11854         TEST_ASSERT(ret < 0,
11855                         "Session creation succeeded unexpectedly");
11856
11857
11858         /* Setup HMAC Parameters */
11859         ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;
11860         ut_params->auth_xform.next = NULL;
11861
11862         ut_params->auth_xform.auth.algo = RTE_CRYPTO_AUTH_SHA1_HMAC;
11863         ut_params->auth_xform.auth.op = RTE_CRYPTO_AUTH_OP_GENERATE;
11864
11865         ut_params->sess = rte_cryptodev_sym_session_create(
11866                         ts_params->session_mpool);
11867
11868         /* Create Crypto session*/
11869         ret = rte_cryptodev_sym_session_init(ts_params->valid_devs[0],
11870                         ut_params->sess, &ut_params->auth_xform,
11871                         ts_params->session_priv_mpool);
11872         TEST_ASSERT(ret < 0,
11873                         "Session creation succeeded unexpectedly");
11874
11875         return TEST_SUCCESS;
11876 }
11877
11878
11879 #define NULL_BURST_LENGTH (32)
11880
11881 static int
11882 test_null_burst_operation(void)
11883 {
11884         struct crypto_testsuite_params *ts_params = &testsuite_params;
11885         struct crypto_unittest_params *ut_params = &unittest_params;
11886         int status;
11887
11888         unsigned i, burst_len = NULL_BURST_LENGTH;
11889
11890         struct rte_crypto_op *burst[NULL_BURST_LENGTH] = { NULL };
11891         struct rte_crypto_op *burst_dequeued[NULL_BURST_LENGTH] = { NULL };
11892
11893         /* This test is for NULL PMD only */
11894         if (gbl_driver_id != rte_cryptodev_driver_id_get(
11895                         RTE_STR(CRYPTODEV_NAME_NULL_PMD)))
11896                 return TEST_SKIPPED;
11897
11898         /* Setup Cipher Parameters */
11899         ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
11900         ut_params->cipher_xform.next = &ut_params->auth_xform;
11901
11902         ut_params->cipher_xform.cipher.algo = RTE_CRYPTO_CIPHER_NULL;
11903         ut_params->cipher_xform.cipher.op = RTE_CRYPTO_CIPHER_OP_ENCRYPT;
11904
11905         /* Setup HMAC Parameters */
11906         ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;
11907         ut_params->auth_xform.next = NULL;
11908
11909         ut_params->auth_xform.auth.algo = RTE_CRYPTO_AUTH_NULL;
11910         ut_params->auth_xform.auth.op = RTE_CRYPTO_AUTH_OP_GENERATE;
11911
11912         ut_params->sess = rte_cryptodev_sym_session_create(
11913                         ts_params->session_mpool);
11914         TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed");
11915
11916         /* Create Crypto session*/
11917         status = rte_cryptodev_sym_session_init(ts_params->valid_devs[0],
11918                         ut_params->sess, &ut_params->cipher_xform,
11919                         ts_params->session_priv_mpool);
11920
11921         if (status == -ENOTSUP)
11922                 return TEST_SKIPPED;
11923
11924         TEST_ASSERT_EQUAL(status, 0, "Session init failed");
11925
11926         TEST_ASSERT_EQUAL(rte_crypto_op_bulk_alloc(ts_params->op_mpool,
11927                         RTE_CRYPTO_OP_TYPE_SYMMETRIC, burst, burst_len),
11928                         burst_len, "failed to generate burst of crypto ops");
11929
11930         /* Generate an operation for each mbuf in burst */
11931         for (i = 0; i < burst_len; i++) {
11932                 struct rte_mbuf *m = rte_pktmbuf_alloc(ts_params->mbuf_pool);
11933
11934                 TEST_ASSERT_NOT_NULL(m, "Failed to allocate mbuf");
11935
11936                 unsigned *data = (unsigned *)rte_pktmbuf_append(m,
11937                                 sizeof(unsigned));
11938                 *data = i;
11939
11940                 rte_crypto_op_attach_sym_session(burst[i], ut_params->sess);
11941
11942                 burst[i]->sym->m_src = m;
11943         }
11944
11945         /* Process crypto operation */
11946         TEST_ASSERT_EQUAL(rte_cryptodev_enqueue_burst(ts_params->valid_devs[0],
11947                         0, burst, burst_len),
11948                         burst_len,
11949                         "Error enqueuing burst");
11950
11951         TEST_ASSERT_EQUAL(rte_cryptodev_dequeue_burst(ts_params->valid_devs[0],
11952                         0, burst_dequeued, burst_len),
11953                         burst_len,
11954                         "Error dequeuing burst");
11955
11956
11957         for (i = 0; i < burst_len; i++) {
11958                 TEST_ASSERT_EQUAL(
11959                         *rte_pktmbuf_mtod(burst[i]->sym->m_src, uint32_t *),
11960                         *rte_pktmbuf_mtod(burst_dequeued[i]->sym->m_src,
11961                                         uint32_t *),
11962                         "data not as expected");
11963
11964                 rte_pktmbuf_free(burst[i]->sym->m_src);
11965                 rte_crypto_op_free(burst[i]);
11966         }
11967
11968         return TEST_SUCCESS;
11969 }
11970
11971 static uint16_t
11972 test_enq_callback(uint16_t dev_id, uint16_t qp_id, struct rte_crypto_op **ops,
11973                   uint16_t nb_ops, void *user_param)
11974 {
11975         RTE_SET_USED(dev_id);
11976         RTE_SET_USED(qp_id);
11977         RTE_SET_USED(ops);
11978         RTE_SET_USED(user_param);
11979
11980         printf("crypto enqueue callback called\n");
11981         return nb_ops;
11982 }
11983
11984 static uint16_t
11985 test_deq_callback(uint16_t dev_id, uint16_t qp_id, struct rte_crypto_op **ops,
11986                   uint16_t nb_ops, void *user_param)
11987 {
11988         RTE_SET_USED(dev_id);
11989         RTE_SET_USED(qp_id);
11990         RTE_SET_USED(ops);
11991         RTE_SET_USED(user_param);
11992
11993         printf("crypto dequeue callback called\n");
11994         return nb_ops;
11995 }
11996
11997 /*
11998  * Thread using enqueue/dequeue callback with RCU.
11999  */
12000 static int
12001 test_enqdeq_callback_thread(void *arg)
12002 {
12003         RTE_SET_USED(arg);
12004         /* DP thread calls rte_cryptodev_enqueue_burst()/
12005          * rte_cryptodev_dequeue_burst() and invokes callback.
12006          */
12007         test_null_burst_operation();
12008         return 0;
12009 }
12010
12011 static int
12012 test_enq_callback_setup(void)
12013 {
12014         struct crypto_testsuite_params *ts_params = &testsuite_params;
12015         struct rte_cryptodev_info dev_info;
12016         struct rte_cryptodev_qp_conf qp_conf = {
12017                 .nb_descriptors = MAX_NUM_OPS_INFLIGHT
12018         };
12019
12020         struct rte_cryptodev_cb *cb;
12021         uint16_t qp_id = 0;
12022
12023         /* Stop the device in case it's started so it can be configured */
12024         rte_cryptodev_stop(ts_params->valid_devs[0]);
12025
12026         rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
12027
12028         TEST_ASSERT_SUCCESS(rte_cryptodev_configure(ts_params->valid_devs[0],
12029                         &ts_params->conf),
12030                         "Failed to configure cryptodev %u",
12031                         ts_params->valid_devs[0]);
12032
12033         qp_conf.nb_descriptors = MAX_NUM_OPS_INFLIGHT;
12034         qp_conf.mp_session = ts_params->session_mpool;
12035         qp_conf.mp_session_private = ts_params->session_priv_mpool;
12036
12037         TEST_ASSERT_SUCCESS(rte_cryptodev_queue_pair_setup(
12038                         ts_params->valid_devs[0], qp_id, &qp_conf,
12039                         rte_cryptodev_socket_id(ts_params->valid_devs[0])),
12040                         "Failed test for "
12041                         "rte_cryptodev_queue_pair_setup: num_inflights "
12042                         "%u on qp %u on cryptodev %u",
12043                         qp_conf.nb_descriptors, qp_id,
12044                         ts_params->valid_devs[0]);
12045
12046         /* Test with invalid crypto device */
12047         cb = rte_cryptodev_add_enq_callback(RTE_CRYPTO_MAX_DEVS,
12048                         qp_id, test_enq_callback, NULL);
12049         TEST_ASSERT_NULL(cb, "Add callback on qp %u on "
12050                         "cryptodev %u did not fail",
12051                         qp_id, RTE_CRYPTO_MAX_DEVS);
12052
12053         /* Test with invalid queue pair */
12054         cb = rte_cryptodev_add_enq_callback(ts_params->valid_devs[0],
12055                         dev_info.max_nb_queue_pairs + 1,
12056                         test_enq_callback, NULL);
12057         TEST_ASSERT_NULL(cb, "Add callback on qp %u on "
12058                         "cryptodev %u did not fail",
12059                         dev_info.max_nb_queue_pairs + 1,
12060                         ts_params->valid_devs[0]);
12061
12062         /* Test with NULL callback */
12063         cb = rte_cryptodev_add_enq_callback(ts_params->valid_devs[0],
12064                         qp_id, NULL, NULL);
12065         TEST_ASSERT_NULL(cb, "Add callback on qp %u on "
12066                         "cryptodev %u did not fail",
12067                         qp_id, ts_params->valid_devs[0]);
12068
12069         /* Test with valid configuration */
12070         cb = rte_cryptodev_add_enq_callback(ts_params->valid_devs[0],
12071                         qp_id, test_enq_callback, NULL);
12072         TEST_ASSERT_NOT_NULL(cb, "Failed test to add callback on "
12073                         "qp %u on cryptodev %u",
12074                         qp_id, ts_params->valid_devs[0]);
12075
12076         rte_cryptodev_start(ts_params->valid_devs[0]);
12077
12078         /* Launch a thread */
12079         rte_eal_remote_launch(test_enqdeq_callback_thread, NULL,
12080                                 rte_get_next_lcore(-1, 1, 0));
12081
12082         /* Wait until reader exited. */
12083         rte_eal_mp_wait_lcore();
12084
12085         /* Test with invalid crypto device */
12086         TEST_ASSERT_FAIL(rte_cryptodev_remove_enq_callback(
12087                         RTE_CRYPTO_MAX_DEVS, qp_id, cb),
12088                         "Expected call to fail as crypto device is invalid");
12089
12090         /* Test with invalid queue pair */
12091         TEST_ASSERT_FAIL(rte_cryptodev_remove_enq_callback(
12092                         ts_params->valid_devs[0],
12093                         dev_info.max_nb_queue_pairs + 1, cb),
12094                         "Expected call to fail as queue pair is invalid");
12095
12096         /* Test with NULL callback */
12097         TEST_ASSERT_FAIL(rte_cryptodev_remove_enq_callback(
12098                         ts_params->valid_devs[0], qp_id, NULL),
12099                         "Expected call to fail as callback is NULL");
12100
12101         /* Test with valid configuration */
12102         TEST_ASSERT_SUCCESS(rte_cryptodev_remove_enq_callback(
12103                         ts_params->valid_devs[0], qp_id, cb),
12104                         "Failed test to remove callback on "
12105                         "qp %u on cryptodev %u",
12106                         qp_id, ts_params->valid_devs[0]);
12107
12108         return TEST_SUCCESS;
12109 }
12110
12111 static int
12112 test_deq_callback_setup(void)
12113 {
12114         struct crypto_testsuite_params *ts_params = &testsuite_params;
12115         struct rte_cryptodev_info dev_info;
12116         struct rte_cryptodev_qp_conf qp_conf = {
12117                 .nb_descriptors = MAX_NUM_OPS_INFLIGHT
12118         };
12119
12120         struct rte_cryptodev_cb *cb;
12121         uint16_t qp_id = 0;
12122
12123         /* Stop the device in case it's started so it can be configured */
12124         rte_cryptodev_stop(ts_params->valid_devs[0]);
12125
12126         rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
12127
12128         TEST_ASSERT_SUCCESS(rte_cryptodev_configure(ts_params->valid_devs[0],
12129                         &ts_params->conf),
12130                         "Failed to configure cryptodev %u",
12131                         ts_params->valid_devs[0]);
12132
12133         qp_conf.nb_descriptors = MAX_NUM_OPS_INFLIGHT;
12134         qp_conf.mp_session = ts_params->session_mpool;
12135         qp_conf.mp_session_private = ts_params->session_priv_mpool;
12136
12137         TEST_ASSERT_SUCCESS(rte_cryptodev_queue_pair_setup(
12138                         ts_params->valid_devs[0], qp_id, &qp_conf,
12139                         rte_cryptodev_socket_id(ts_params->valid_devs[0])),
12140                         "Failed test for "
12141                         "rte_cryptodev_queue_pair_setup: num_inflights "
12142                         "%u on qp %u on cryptodev %u",
12143                         qp_conf.nb_descriptors, qp_id,
12144                         ts_params->valid_devs[0]);
12145
12146         /* Test with invalid crypto device */
12147         cb = rte_cryptodev_add_deq_callback(RTE_CRYPTO_MAX_DEVS,
12148                         qp_id, test_deq_callback, NULL);
12149         TEST_ASSERT_NULL(cb, "Add callback on qp %u on "
12150                         "cryptodev %u did not fail",
12151                         qp_id, RTE_CRYPTO_MAX_DEVS);
12152
12153         /* Test with invalid queue pair */
12154         cb = rte_cryptodev_add_deq_callback(ts_params->valid_devs[0],
12155                         dev_info.max_nb_queue_pairs + 1,
12156                         test_deq_callback, NULL);
12157         TEST_ASSERT_NULL(cb, "Add callback on qp %u on "
12158                         "cryptodev %u did not fail",
12159                         dev_info.max_nb_queue_pairs + 1,
12160                         ts_params->valid_devs[0]);
12161
12162         /* Test with NULL callback */
12163         cb = rte_cryptodev_add_deq_callback(ts_params->valid_devs[0],
12164                         qp_id, NULL, NULL);
12165         TEST_ASSERT_NULL(cb, "Add callback on qp %u on "
12166                         "cryptodev %u did not fail",
12167                         qp_id, ts_params->valid_devs[0]);
12168
12169         /* Test with valid configuration */
12170         cb = rte_cryptodev_add_deq_callback(ts_params->valid_devs[0],
12171                         qp_id, test_deq_callback, NULL);
12172         TEST_ASSERT_NOT_NULL(cb, "Failed test to add callback on "
12173                         "qp %u on cryptodev %u",
12174                         qp_id, ts_params->valid_devs[0]);
12175
12176         rte_cryptodev_start(ts_params->valid_devs[0]);
12177
12178         /* Launch a thread */
12179         rte_eal_remote_launch(test_enqdeq_callback_thread, NULL,
12180                                 rte_get_next_lcore(-1, 1, 0));
12181
12182         /* Wait until reader exited. */
12183         rte_eal_mp_wait_lcore();
12184
12185         /* Test with invalid crypto device */
12186         TEST_ASSERT_FAIL(rte_cryptodev_remove_deq_callback(
12187                         RTE_CRYPTO_MAX_DEVS, qp_id, cb),
12188                         "Expected call to fail as crypto device is invalid");
12189
12190         /* Test with invalid queue pair */
12191         TEST_ASSERT_FAIL(rte_cryptodev_remove_deq_callback(
12192                         ts_params->valid_devs[0],
12193                         dev_info.max_nb_queue_pairs + 1, cb),
12194                         "Expected call to fail as queue pair is invalid");
12195
12196         /* Test with NULL callback */
12197         TEST_ASSERT_FAIL(rte_cryptodev_remove_deq_callback(
12198                         ts_params->valid_devs[0], qp_id, NULL),
12199                         "Expected call to fail as callback is NULL");
12200
12201         /* Test with valid configuration */
12202         TEST_ASSERT_SUCCESS(rte_cryptodev_remove_deq_callback(
12203                         ts_params->valid_devs[0], qp_id, cb),
12204                         "Failed test to remove callback on "
12205                         "qp %u on cryptodev %u",
12206                         qp_id, ts_params->valid_devs[0]);
12207
12208         return TEST_SUCCESS;
12209 }
12210
12211 static void
12212 generate_gmac_large_plaintext(uint8_t *data)
12213 {
12214         uint16_t i;
12215
12216         for (i = 32; i < GMAC_LARGE_PLAINTEXT_LENGTH; i += 32)
12217                 memcpy(&data[i], &data[0], 32);
12218 }
12219
12220 static int
12221 create_gmac_operation(enum rte_crypto_auth_operation op,
12222                 const struct gmac_test_data *tdata)
12223 {
12224         struct crypto_testsuite_params *ts_params = &testsuite_params;
12225         struct crypto_unittest_params *ut_params = &unittest_params;
12226         struct rte_crypto_sym_op *sym_op;
12227
12228         uint32_t plaintext_pad_len = RTE_ALIGN_CEIL(tdata->plaintext.len, 16);
12229
12230         /* Generate Crypto op data structure */
12231         ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
12232                         RTE_CRYPTO_OP_TYPE_SYMMETRIC);
12233         TEST_ASSERT_NOT_NULL(ut_params->op,
12234                         "Failed to allocate symmetric crypto operation struct");
12235
12236         sym_op = ut_params->op->sym;
12237
12238         sym_op->auth.digest.data = (uint8_t *)rte_pktmbuf_append(
12239                         ut_params->ibuf, tdata->gmac_tag.len);
12240         TEST_ASSERT_NOT_NULL(sym_op->auth.digest.data,
12241                         "no room to append digest");
12242
12243         sym_op->auth.digest.phys_addr = rte_pktmbuf_iova_offset(
12244                         ut_params->ibuf, plaintext_pad_len);
12245
12246         if (op == RTE_CRYPTO_AUTH_OP_VERIFY) {
12247                 rte_memcpy(sym_op->auth.digest.data, tdata->gmac_tag.data,
12248                                 tdata->gmac_tag.len);
12249                 debug_hexdump(stdout, "digest:",
12250                                 sym_op->auth.digest.data,
12251                                 tdata->gmac_tag.len);
12252         }
12253
12254         uint8_t *iv_ptr = rte_crypto_op_ctod_offset(ut_params->op,
12255                         uint8_t *, IV_OFFSET);
12256
12257         rte_memcpy(iv_ptr, tdata->iv.data, tdata->iv.len);
12258
12259         debug_hexdump(stdout, "iv:", iv_ptr, tdata->iv.len);
12260
12261         sym_op->cipher.data.length = 0;
12262         sym_op->cipher.data.offset = 0;
12263
12264         sym_op->auth.data.offset = 0;
12265         sym_op->auth.data.length = tdata->plaintext.len;
12266
12267         return 0;
12268 }
12269
12270 static int
12271 create_gmac_operation_sgl(enum rte_crypto_auth_operation op,
12272                 const struct gmac_test_data *tdata,
12273                 void *digest_mem, uint64_t digest_phys)
12274 {
12275         struct crypto_testsuite_params *ts_params = &testsuite_params;
12276         struct crypto_unittest_params *ut_params = &unittest_params;
12277         struct rte_crypto_sym_op *sym_op;
12278
12279         /* Generate Crypto op data structure */
12280         ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
12281                         RTE_CRYPTO_OP_TYPE_SYMMETRIC);
12282         TEST_ASSERT_NOT_NULL(ut_params->op,
12283                         "Failed to allocate symmetric crypto operation struct");
12284
12285         sym_op = ut_params->op->sym;
12286
12287         sym_op->auth.digest.data = digest_mem;
12288         TEST_ASSERT_NOT_NULL(sym_op->auth.digest.data,
12289                         "no room to append digest");
12290
12291         sym_op->auth.digest.phys_addr = digest_phys;
12292
12293         if (op == RTE_CRYPTO_AUTH_OP_VERIFY) {
12294                 rte_memcpy(sym_op->auth.digest.data, tdata->gmac_tag.data,
12295                                 tdata->gmac_tag.len);
12296                 debug_hexdump(stdout, "digest:",
12297                                 sym_op->auth.digest.data,
12298                                 tdata->gmac_tag.len);
12299         }
12300
12301         uint8_t *iv_ptr = rte_crypto_op_ctod_offset(ut_params->op,
12302                         uint8_t *, IV_OFFSET);
12303
12304         rte_memcpy(iv_ptr, tdata->iv.data, tdata->iv.len);
12305
12306         debug_hexdump(stdout, "iv:", iv_ptr, tdata->iv.len);
12307
12308         sym_op->cipher.data.length = 0;
12309         sym_op->cipher.data.offset = 0;
12310
12311         sym_op->auth.data.offset = 0;
12312         sym_op->auth.data.length = tdata->plaintext.len;
12313
12314         return 0;
12315 }
12316
12317 static int create_gmac_session(uint8_t dev_id,
12318                 const struct gmac_test_data *tdata,
12319                 enum rte_crypto_auth_operation auth_op)
12320 {
12321         uint8_t auth_key[tdata->key.len];
12322         int status;
12323
12324         struct crypto_testsuite_params *ts_params = &testsuite_params;
12325         struct crypto_unittest_params *ut_params = &unittest_params;
12326
12327         memcpy(auth_key, tdata->key.data, tdata->key.len);
12328
12329         ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;
12330         ut_params->auth_xform.next = NULL;
12331
12332         ut_params->auth_xform.auth.algo = RTE_CRYPTO_AUTH_AES_GMAC;
12333         ut_params->auth_xform.auth.op = auth_op;
12334         ut_params->auth_xform.auth.digest_length = tdata->gmac_tag.len;
12335         ut_params->auth_xform.auth.key.length = tdata->key.len;
12336         ut_params->auth_xform.auth.key.data = auth_key;
12337         ut_params->auth_xform.auth.iv.offset = IV_OFFSET;
12338         ut_params->auth_xform.auth.iv.length = tdata->iv.len;
12339
12340
12341         ut_params->sess = rte_cryptodev_sym_session_create(
12342                         ts_params->session_mpool);
12343         TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed");
12344
12345         status = rte_cryptodev_sym_session_init(dev_id, ut_params->sess,
12346                         &ut_params->auth_xform,
12347                         ts_params->session_priv_mpool);
12348
12349         return status;
12350 }
12351
12352 static int
12353 test_AES_GMAC_authentication(const struct gmac_test_data *tdata)
12354 {
12355         struct crypto_testsuite_params *ts_params = &testsuite_params;
12356         struct crypto_unittest_params *ut_params = &unittest_params;
12357         struct rte_cryptodev_info dev_info;
12358
12359         rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
12360         uint64_t feat_flags = dev_info.feature_flags;
12361
12362         if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
12363                         (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
12364                 printf("Device doesn't support RAW data-path APIs.\n");
12365                 return TEST_SKIPPED;
12366         }
12367
12368         int retval;
12369
12370         uint8_t *auth_tag, *plaintext;
12371         uint16_t plaintext_pad_len;
12372
12373         TEST_ASSERT_NOT_EQUAL(tdata->gmac_tag.len, 0,
12374                               "No GMAC length in the source data");
12375
12376         /* Verify the capabilities */
12377         struct rte_cryptodev_sym_capability_idx cap_idx;
12378         cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
12379         cap_idx.algo.auth = RTE_CRYPTO_AUTH_AES_GMAC;
12380         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
12381                         &cap_idx) == NULL)
12382                 return TEST_SKIPPED;
12383
12384         retval = create_gmac_session(ts_params->valid_devs[0],
12385                         tdata, RTE_CRYPTO_AUTH_OP_GENERATE);
12386
12387         if (retval == -ENOTSUP)
12388                 return TEST_SKIPPED;
12389         if (retval < 0)
12390                 return retval;
12391
12392         if (tdata->plaintext.len > MBUF_SIZE)
12393                 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->large_mbuf_pool);
12394         else
12395                 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
12396         TEST_ASSERT_NOT_NULL(ut_params->ibuf,
12397                         "Failed to allocate input buffer in mempool");
12398
12399         memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
12400                         rte_pktmbuf_tailroom(ut_params->ibuf));
12401
12402         plaintext_pad_len = RTE_ALIGN_CEIL(tdata->plaintext.len, 16);
12403         /*
12404          * Runtime generate the large plain text instead of use hard code
12405          * plain text vector. It is done to avoid create huge source file
12406          * with the test vector.
12407          */
12408         if (tdata->plaintext.len == GMAC_LARGE_PLAINTEXT_LENGTH)
12409                 generate_gmac_large_plaintext(tdata->plaintext.data);
12410
12411         plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
12412                                 plaintext_pad_len);
12413         TEST_ASSERT_NOT_NULL(plaintext, "no room to append plaintext");
12414
12415         memcpy(plaintext, tdata->plaintext.data, tdata->plaintext.len);
12416         debug_hexdump(stdout, "plaintext:", plaintext,
12417                         tdata->plaintext.len);
12418
12419         retval = create_gmac_operation(RTE_CRYPTO_AUTH_OP_GENERATE,
12420                         tdata);
12421
12422         if (retval < 0)
12423                 return retval;
12424
12425         rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
12426
12427         ut_params->op->sym->m_src = ut_params->ibuf;
12428
12429         if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
12430                 process_cpu_crypt_auth_op(ts_params->valid_devs[0],
12431                         ut_params->op);
12432         else if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
12433                 process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
12434                                 ut_params->op, 0, 1, 0, 0);
12435         else
12436                 TEST_ASSERT_NOT_NULL(
12437                         process_crypto_request(ts_params->valid_devs[0],
12438                         ut_params->op), "failed to process sym crypto op");
12439
12440         TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
12441                         "crypto op processing failed");
12442
12443         if (ut_params->op->sym->m_dst) {
12444                 auth_tag = rte_pktmbuf_mtod_offset(ut_params->op->sym->m_dst,
12445                                 uint8_t *, plaintext_pad_len);
12446         } else {
12447                 auth_tag = plaintext + plaintext_pad_len;
12448         }
12449
12450         debug_hexdump(stdout, "auth tag:", auth_tag, tdata->gmac_tag.len);
12451
12452         TEST_ASSERT_BUFFERS_ARE_EQUAL(
12453                         auth_tag,
12454                         tdata->gmac_tag.data,
12455                         tdata->gmac_tag.len,
12456                         "GMAC Generated auth tag not as expected");
12457
12458         return 0;
12459 }
12460
12461 static int
12462 test_AES_GMAC_authentication_test_case_1(void)
12463 {
12464         return test_AES_GMAC_authentication(&gmac_test_case_1);
12465 }
12466
12467 static int
12468 test_AES_GMAC_authentication_test_case_2(void)
12469 {
12470         return test_AES_GMAC_authentication(&gmac_test_case_2);
12471 }
12472
12473 static int
12474 test_AES_GMAC_authentication_test_case_3(void)
12475 {
12476         return test_AES_GMAC_authentication(&gmac_test_case_3);
12477 }
12478
12479 static int
12480 test_AES_GMAC_authentication_test_case_4(void)
12481 {
12482         return test_AES_GMAC_authentication(&gmac_test_case_4);
12483 }
12484
12485 static int
12486 test_AES_GMAC_authentication_verify(const struct gmac_test_data *tdata)
12487 {
12488         struct crypto_testsuite_params *ts_params = &testsuite_params;
12489         struct crypto_unittest_params *ut_params = &unittest_params;
12490         int retval;
12491         uint32_t plaintext_pad_len;
12492         uint8_t *plaintext;
12493         struct rte_cryptodev_info dev_info;
12494
12495         rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
12496         uint64_t feat_flags = dev_info.feature_flags;
12497
12498         if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
12499                         (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
12500                 printf("Device doesn't support RAW data-path APIs.\n");
12501                 return TEST_SKIPPED;
12502         }
12503
12504         TEST_ASSERT_NOT_EQUAL(tdata->gmac_tag.len, 0,
12505                               "No GMAC length in the source data");
12506
12507         /* Verify the capabilities */
12508         struct rte_cryptodev_sym_capability_idx cap_idx;
12509         cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
12510         cap_idx.algo.auth = RTE_CRYPTO_AUTH_AES_GMAC;
12511         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
12512                         &cap_idx) == NULL)
12513                 return TEST_SKIPPED;
12514
12515         retval = create_gmac_session(ts_params->valid_devs[0],
12516                         tdata, RTE_CRYPTO_AUTH_OP_VERIFY);
12517
12518         if (retval == -ENOTSUP)
12519                 return TEST_SKIPPED;
12520         if (retval < 0)
12521                 return retval;
12522
12523         if (tdata->plaintext.len > MBUF_SIZE)
12524                 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->large_mbuf_pool);
12525         else
12526                 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
12527         TEST_ASSERT_NOT_NULL(ut_params->ibuf,
12528                         "Failed to allocate input buffer in mempool");
12529
12530         memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
12531                         rte_pktmbuf_tailroom(ut_params->ibuf));
12532
12533         plaintext_pad_len = RTE_ALIGN_CEIL(tdata->plaintext.len, 16);
12534
12535         /*
12536          * Runtime generate the large plain text instead of use hard code
12537          * plain text vector. It is done to avoid create huge source file
12538          * with the test vector.
12539          */
12540         if (tdata->plaintext.len == GMAC_LARGE_PLAINTEXT_LENGTH)
12541                 generate_gmac_large_plaintext(tdata->plaintext.data);
12542
12543         plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
12544                                 plaintext_pad_len);
12545         TEST_ASSERT_NOT_NULL(plaintext, "no room to append plaintext");
12546
12547         memcpy(plaintext, tdata->plaintext.data, tdata->plaintext.len);
12548         debug_hexdump(stdout, "plaintext:", plaintext,
12549                         tdata->plaintext.len);
12550
12551         retval = create_gmac_operation(RTE_CRYPTO_AUTH_OP_VERIFY,
12552                         tdata);
12553
12554         if (retval < 0)
12555                 return retval;
12556
12557         rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
12558
12559         ut_params->op->sym->m_src = ut_params->ibuf;
12560
12561         if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
12562                 process_cpu_crypt_auth_op(ts_params->valid_devs[0],
12563                         ut_params->op);
12564         else if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
12565                 process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
12566                                 ut_params->op, 0, 1, 0, 0);
12567         else
12568                 TEST_ASSERT_NOT_NULL(
12569                         process_crypto_request(ts_params->valid_devs[0],
12570                         ut_params->op), "failed to process sym crypto op");
12571
12572         TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
12573                         "crypto op processing failed");
12574
12575         return 0;
12576
12577 }
12578
12579 static int
12580 test_AES_GMAC_authentication_verify_test_case_1(void)
12581 {
12582         return test_AES_GMAC_authentication_verify(&gmac_test_case_1);
12583 }
12584
12585 static int
12586 test_AES_GMAC_authentication_verify_test_case_2(void)
12587 {
12588         return test_AES_GMAC_authentication_verify(&gmac_test_case_2);
12589 }
12590
12591 static int
12592 test_AES_GMAC_authentication_verify_test_case_3(void)
12593 {
12594         return test_AES_GMAC_authentication_verify(&gmac_test_case_3);
12595 }
12596
12597 static int
12598 test_AES_GMAC_authentication_verify_test_case_4(void)
12599 {
12600         return test_AES_GMAC_authentication_verify(&gmac_test_case_4);
12601 }
12602
12603 static int
12604 test_AES_GMAC_authentication_SGL(const struct gmac_test_data *tdata,
12605                                 uint32_t fragsz)
12606 {
12607         struct crypto_testsuite_params *ts_params = &testsuite_params;
12608         struct crypto_unittest_params *ut_params = &unittest_params;
12609         struct rte_cryptodev_info dev_info;
12610         uint64_t feature_flags;
12611         unsigned int trn_data = 0;
12612         void *digest_mem = NULL;
12613         uint32_t segs = 1;
12614         unsigned int to_trn = 0;
12615         struct rte_mbuf *buf = NULL;
12616         uint8_t *auth_tag, *plaintext;
12617         int retval;
12618
12619         TEST_ASSERT_NOT_EQUAL(tdata->gmac_tag.len, 0,
12620                               "No GMAC length in the source data");
12621
12622         /* Verify the capabilities */
12623         struct rte_cryptodev_sym_capability_idx cap_idx;
12624         cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
12625         cap_idx.algo.auth = RTE_CRYPTO_AUTH_AES_GMAC;
12626         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
12627                         &cap_idx) == NULL)
12628                 return TEST_SKIPPED;
12629
12630         /* Check for any input SGL support */
12631         rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
12632         feature_flags = dev_info.feature_flags;
12633
12634         if ((!(feature_flags & RTE_CRYPTODEV_FF_IN_PLACE_SGL)) ||
12635                         (!(feature_flags & RTE_CRYPTODEV_FF_OOP_SGL_IN_LB_OUT)) ||
12636                         (!(feature_flags & RTE_CRYPTODEV_FF_OOP_SGL_IN_SGL_OUT)))
12637                 return TEST_SKIPPED;
12638
12639         if (fragsz > tdata->plaintext.len)
12640                 fragsz = tdata->plaintext.len;
12641
12642         uint16_t plaintext_len = fragsz;
12643
12644         retval = create_gmac_session(ts_params->valid_devs[0],
12645                         tdata, RTE_CRYPTO_AUTH_OP_GENERATE);
12646
12647         if (retval == -ENOTSUP)
12648                 return TEST_SKIPPED;
12649         if (retval < 0)
12650                 return retval;
12651
12652         ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
12653         TEST_ASSERT_NOT_NULL(ut_params->ibuf,
12654                         "Failed to allocate input buffer in mempool");
12655
12656         memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
12657                         rte_pktmbuf_tailroom(ut_params->ibuf));
12658
12659         plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
12660                                 plaintext_len);
12661         TEST_ASSERT_NOT_NULL(plaintext, "no room to append plaintext");
12662
12663         memcpy(plaintext, tdata->plaintext.data, plaintext_len);
12664
12665         trn_data += plaintext_len;
12666
12667         buf = ut_params->ibuf;
12668
12669         /*
12670          * Loop until no more fragments
12671          */
12672
12673         while (trn_data < tdata->plaintext.len) {
12674                 ++segs;
12675                 to_trn = (tdata->plaintext.len - trn_data < fragsz) ?
12676                                 (tdata->plaintext.len - trn_data) : fragsz;
12677
12678                 buf->next = rte_pktmbuf_alloc(ts_params->mbuf_pool);
12679                 buf = buf->next;
12680
12681                 memset(rte_pktmbuf_mtod(buf, uint8_t *), 0,
12682                                 rte_pktmbuf_tailroom(buf));
12683
12684                 plaintext = (uint8_t *)rte_pktmbuf_append(buf,
12685                                 to_trn);
12686
12687                 memcpy(plaintext, tdata->plaintext.data + trn_data,
12688                                 to_trn);
12689                 trn_data += to_trn;
12690                 if (trn_data  == tdata->plaintext.len)
12691                         digest_mem = (uint8_t *)rte_pktmbuf_append(buf,
12692                                         tdata->gmac_tag.len);
12693         }
12694         ut_params->ibuf->nb_segs = segs;
12695
12696         /*
12697          * Place digest at the end of the last buffer
12698          */
12699         uint64_t digest_phys = rte_pktmbuf_iova(buf) + to_trn;
12700
12701         if (!digest_mem) {
12702                 digest_mem = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
12703                                 + tdata->gmac_tag.len);
12704                 digest_phys = rte_pktmbuf_iova_offset(ut_params->ibuf,
12705                                 tdata->plaintext.len);
12706         }
12707
12708         retval = create_gmac_operation_sgl(RTE_CRYPTO_AUTH_OP_GENERATE,
12709                         tdata, digest_mem, digest_phys);
12710
12711         if (retval < 0)
12712                 return retval;
12713
12714         rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
12715
12716         ut_params->op->sym->m_src = ut_params->ibuf;
12717
12718         if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
12719                 return TEST_SKIPPED;
12720
12721         TEST_ASSERT_NOT_NULL(
12722                 process_crypto_request(ts_params->valid_devs[0],
12723                 ut_params->op), "failed to process sym crypto op");
12724
12725         TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
12726                         "crypto op processing failed");
12727
12728         auth_tag = digest_mem;
12729         debug_hexdump(stdout, "auth tag:", auth_tag, tdata->gmac_tag.len);
12730         TEST_ASSERT_BUFFERS_ARE_EQUAL(
12731                         auth_tag,
12732                         tdata->gmac_tag.data,
12733                         tdata->gmac_tag.len,
12734                         "GMAC Generated auth tag not as expected");
12735
12736         return 0;
12737 }
12738
12739 /* Segment size not multiple of block size (16B) */
12740 static int
12741 test_AES_GMAC_authentication_SGL_40B(void)
12742 {
12743         return test_AES_GMAC_authentication_SGL(&gmac_test_case_1, 40);
12744 }
12745
12746 static int
12747 test_AES_GMAC_authentication_SGL_80B(void)
12748 {
12749         return test_AES_GMAC_authentication_SGL(&gmac_test_case_1, 80);
12750 }
12751
12752 static int
12753 test_AES_GMAC_authentication_SGL_2048B(void)
12754 {
12755         return test_AES_GMAC_authentication_SGL(&gmac_test_case_5, 2048);
12756 }
12757
12758 /* Segment size not multiple of block size (16B) */
12759 static int
12760 test_AES_GMAC_authentication_SGL_2047B(void)
12761 {
12762         return test_AES_GMAC_authentication_SGL(&gmac_test_case_5, 2047);
12763 }
12764
12765 struct test_crypto_vector {
12766         enum rte_crypto_cipher_algorithm crypto_algo;
12767         unsigned int cipher_offset;
12768         unsigned int cipher_len;
12769
12770         struct {
12771                 uint8_t data[64];
12772                 unsigned int len;
12773         } cipher_key;
12774
12775         struct {
12776                 uint8_t data[64];
12777                 unsigned int len;
12778         } iv;
12779
12780         struct {
12781                 const uint8_t *data;
12782                 unsigned int len;
12783         } plaintext;
12784
12785         struct {
12786                 const uint8_t *data;
12787                 unsigned int len;
12788         } ciphertext;
12789
12790         enum rte_crypto_auth_algorithm auth_algo;
12791         unsigned int auth_offset;
12792
12793         struct {
12794                 uint8_t data[128];
12795                 unsigned int len;
12796         } auth_key;
12797
12798         struct {
12799                 const uint8_t *data;
12800                 unsigned int len;
12801         } aad;
12802
12803         struct {
12804                 uint8_t data[128];
12805                 unsigned int len;
12806         } digest;
12807 };
12808
12809 static const struct test_crypto_vector
12810 hmac_sha1_test_crypto_vector = {
12811         .auth_algo = RTE_CRYPTO_AUTH_SHA1_HMAC,
12812         .plaintext = {
12813                 .data = plaintext_hash,
12814                 .len = 512
12815         },
12816         .auth_key = {
12817                 .data = {
12818                         0xF8, 0x2A, 0xC7, 0x54, 0xDB, 0x96, 0x18, 0xAA,
12819                         0xC3, 0xA1, 0x53, 0xF6, 0x1F, 0x17, 0x60, 0xBD,
12820                         0xDE, 0xF4, 0xDE, 0xAD
12821                 },
12822                 .len = 20
12823         },
12824         .digest = {
12825                 .data = {
12826                         0xC4, 0xB7, 0x0E, 0x6B, 0xDE, 0xD1, 0xE7, 0x77,
12827                         0x7E, 0x2E, 0x8F, 0xFC, 0x48, 0x39, 0x46, 0x17,
12828                         0x3F, 0x91, 0x64, 0x59
12829                 },
12830                 .len = 20
12831         }
12832 };
12833
12834 static const struct test_crypto_vector
12835 aes128_gmac_test_vector = {
12836         .auth_algo = RTE_CRYPTO_AUTH_AES_GMAC,
12837         .plaintext = {
12838                 .data = plaintext_hash,
12839                 .len = 512
12840         },
12841         .iv = {
12842                 .data = {
12843                         0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
12844                         0x08, 0x09, 0x0A, 0x0B
12845                 },
12846                 .len = 12
12847         },
12848         .auth_key = {
12849                 .data = {
12850                         0x42, 0x1A, 0x7D, 0x3D, 0xF5, 0x82, 0x80, 0xF1,
12851                         0xF1, 0x35, 0x5C, 0x3B, 0xDD, 0x9A, 0x65, 0xBA
12852                 },
12853                 .len = 16
12854         },
12855         .digest = {
12856                 .data = {
12857                         0xCA, 0x00, 0x99, 0x8B, 0x30, 0x7E, 0x74, 0x56,
12858                         0x32, 0xA7, 0x87, 0xB5, 0xE9, 0xB2, 0x34, 0x5A
12859                 },
12860                 .len = 16
12861         }
12862 };
12863
12864 static const struct test_crypto_vector
12865 aes128cbc_hmac_sha1_test_vector = {
12866         .crypto_algo = RTE_CRYPTO_CIPHER_AES_CBC,
12867         .cipher_offset = 0,
12868         .cipher_len = 512,
12869         .cipher_key = {
12870                 .data = {
12871                         0xE4, 0x23, 0x33, 0x8A, 0x35, 0x64, 0x61, 0xE2,
12872                         0x49, 0x03, 0xDD, 0xC6, 0xB8, 0xCA, 0x55, 0x7A
12873                 },
12874                 .len = 16
12875         },
12876         .iv = {
12877                 .data = {
12878                         0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
12879                         0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F
12880                 },
12881                 .len = 16
12882         },
12883         .plaintext = {
12884                 .data = plaintext_hash,
12885                 .len = 512
12886         },
12887         .ciphertext = {
12888                 .data = ciphertext512_aes128cbc,
12889                 .len = 512
12890         },
12891         .auth_algo = RTE_CRYPTO_AUTH_SHA1_HMAC,
12892         .auth_offset = 0,
12893         .auth_key = {
12894                 .data = {
12895                         0xF8, 0x2A, 0xC7, 0x54, 0xDB, 0x96, 0x18, 0xAA,
12896                         0xC3, 0xA1, 0x53, 0xF6, 0x1F, 0x17, 0x60, 0xBD,
12897                         0xDE, 0xF4, 0xDE, 0xAD
12898                 },
12899                 .len = 20
12900         },
12901         .digest = {
12902                 .data = {
12903                         0x9A, 0x4F, 0x88, 0x1B, 0xB6, 0x8F, 0xD8, 0x60,
12904                         0x42, 0x1A, 0x7D, 0x3D, 0xF5, 0x82, 0x80, 0xF1,
12905                         0x18, 0x8C, 0x1D, 0x32
12906                 },
12907                 .len = 20
12908         }
12909 };
12910
12911 static const struct test_crypto_vector
12912 aes128cbc_hmac_sha1_aad_test_vector = {
12913         .crypto_algo = RTE_CRYPTO_CIPHER_AES_CBC,
12914         .cipher_offset = 8,
12915         .cipher_len = 496,
12916         .cipher_key = {
12917                 .data = {
12918                         0xE4, 0x23, 0x33, 0x8A, 0x35, 0x64, 0x61, 0xE2,
12919                         0x49, 0x03, 0xDD, 0xC6, 0xB8, 0xCA, 0x55, 0x7A
12920                 },
12921                 .len = 16
12922         },
12923         .iv = {
12924                 .data = {
12925                         0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
12926                         0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F
12927                 },
12928                 .len = 16
12929         },
12930         .plaintext = {
12931                 .data = plaintext_hash,
12932                 .len = 512
12933         },
12934         .ciphertext = {
12935                 .data = ciphertext512_aes128cbc_aad,
12936                 .len = 512
12937         },
12938         .auth_algo = RTE_CRYPTO_AUTH_SHA1_HMAC,
12939         .auth_offset = 0,
12940         .auth_key = {
12941                 .data = {
12942                         0xF8, 0x2A, 0xC7, 0x54, 0xDB, 0x96, 0x18, 0xAA,
12943                         0xC3, 0xA1, 0x53, 0xF6, 0x1F, 0x17, 0x60, 0xBD,
12944                         0xDE, 0xF4, 0xDE, 0xAD
12945                 },
12946                 .len = 20
12947         },
12948         .digest = {
12949                 .data = {
12950                         0x6D, 0xF3, 0x50, 0x79, 0x7A, 0x2A, 0xAC, 0x7F,
12951                         0xA6, 0xF0, 0xC6, 0x38, 0x1F, 0xA4, 0xDD, 0x9B,
12952                         0x62, 0x0F, 0xFB, 0x10
12953                 },
12954                 .len = 20
12955         }
12956 };
12957
12958 static void
12959 data_corruption(uint8_t *data)
12960 {
12961         data[0] += 1;
12962 }
12963
12964 static void
12965 tag_corruption(uint8_t *data, unsigned int tag_offset)
12966 {
12967         data[tag_offset] += 1;
12968 }
12969
12970 static int
12971 create_auth_session(struct crypto_unittest_params *ut_params,
12972                 uint8_t dev_id,
12973                 const struct test_crypto_vector *reference,
12974                 enum rte_crypto_auth_operation auth_op)
12975 {
12976         struct crypto_testsuite_params *ts_params = &testsuite_params;
12977         uint8_t auth_key[reference->auth_key.len + 1];
12978         int status;
12979
12980         memcpy(auth_key, reference->auth_key.data, reference->auth_key.len);
12981
12982         /* Setup Authentication Parameters */
12983         ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;
12984         ut_params->auth_xform.auth.op = auth_op;
12985         ut_params->auth_xform.next = NULL;
12986         ut_params->auth_xform.auth.algo = reference->auth_algo;
12987         ut_params->auth_xform.auth.key.length = reference->auth_key.len;
12988         ut_params->auth_xform.auth.key.data = auth_key;
12989         ut_params->auth_xform.auth.digest_length = reference->digest.len;
12990
12991         /* Create Crypto session*/
12992         ut_params->sess = rte_cryptodev_sym_session_create(
12993                         ts_params->session_mpool);
12994         TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed");
12995
12996         status = rte_cryptodev_sym_session_init(dev_id, ut_params->sess,
12997                                 &ut_params->auth_xform,
12998                                 ts_params->session_priv_mpool);
12999
13000         return status;
13001 }
13002
13003 static int
13004 create_auth_cipher_session(struct crypto_unittest_params *ut_params,
13005                 uint8_t dev_id,
13006                 const struct test_crypto_vector *reference,
13007                 enum rte_crypto_auth_operation auth_op,
13008                 enum rte_crypto_cipher_operation cipher_op)
13009 {
13010         struct crypto_testsuite_params *ts_params = &testsuite_params;
13011         uint8_t cipher_key[reference->cipher_key.len + 1];
13012         uint8_t auth_key[reference->auth_key.len + 1];
13013         int status;
13014
13015         memcpy(cipher_key, reference->cipher_key.data,
13016                         reference->cipher_key.len);
13017         memcpy(auth_key, reference->auth_key.data, reference->auth_key.len);
13018
13019         /* Setup Authentication Parameters */
13020         ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;
13021         ut_params->auth_xform.auth.op = auth_op;
13022         ut_params->auth_xform.auth.algo = reference->auth_algo;
13023         ut_params->auth_xform.auth.key.length = reference->auth_key.len;
13024         ut_params->auth_xform.auth.key.data = auth_key;
13025         ut_params->auth_xform.auth.digest_length = reference->digest.len;
13026
13027         if (reference->auth_algo == RTE_CRYPTO_AUTH_AES_GMAC) {
13028                 ut_params->auth_xform.auth.iv.offset = IV_OFFSET;
13029                 ut_params->auth_xform.auth.iv.length = reference->iv.len;
13030         } else {
13031                 ut_params->auth_xform.next = &ut_params->cipher_xform;
13032
13033                 /* Setup Cipher Parameters */
13034                 ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
13035                 ut_params->cipher_xform.next = NULL;
13036                 ut_params->cipher_xform.cipher.algo = reference->crypto_algo;
13037                 ut_params->cipher_xform.cipher.op = cipher_op;
13038                 ut_params->cipher_xform.cipher.key.data = cipher_key;
13039                 ut_params->cipher_xform.cipher.key.length = reference->cipher_key.len;
13040                 ut_params->cipher_xform.cipher.iv.offset = IV_OFFSET;
13041                 ut_params->cipher_xform.cipher.iv.length = reference->iv.len;
13042         }
13043
13044         /* Create Crypto session*/
13045         ut_params->sess = rte_cryptodev_sym_session_create(
13046                         ts_params->session_mpool);
13047         TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed");
13048
13049         status = rte_cryptodev_sym_session_init(dev_id, ut_params->sess,
13050                                 &ut_params->auth_xform,
13051                                 ts_params->session_priv_mpool);
13052
13053         return status;
13054 }
13055
13056 static int
13057 create_auth_operation(struct crypto_testsuite_params *ts_params,
13058                 struct crypto_unittest_params *ut_params,
13059                 const struct test_crypto_vector *reference,
13060                 unsigned int auth_generate)
13061 {
13062         /* Generate Crypto op data structure */
13063         ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
13064                         RTE_CRYPTO_OP_TYPE_SYMMETRIC);
13065         TEST_ASSERT_NOT_NULL(ut_params->op,
13066                         "Failed to allocate pktmbuf offload");
13067
13068         /* Set crypto operation data parameters */
13069         rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
13070
13071         struct rte_crypto_sym_op *sym_op = ut_params->op->sym;
13072
13073         /* set crypto operation source mbuf */
13074         sym_op->m_src = ut_params->ibuf;
13075
13076         /* digest */
13077         sym_op->auth.digest.data = (uint8_t *)rte_pktmbuf_append(
13078                         ut_params->ibuf, reference->digest.len);
13079
13080         TEST_ASSERT_NOT_NULL(sym_op->auth.digest.data,
13081                         "no room to append auth tag");
13082
13083         sym_op->auth.digest.phys_addr = rte_pktmbuf_iova_offset(
13084                         ut_params->ibuf, reference->plaintext.len);
13085
13086         if (auth_generate)
13087                 memset(sym_op->auth.digest.data, 0, reference->digest.len);
13088         else
13089                 memcpy(sym_op->auth.digest.data,
13090                                 reference->digest.data,
13091                                 reference->digest.len);
13092
13093         debug_hexdump(stdout, "digest:",
13094                         sym_op->auth.digest.data,
13095                         reference->digest.len);
13096
13097         sym_op->auth.data.length = reference->plaintext.len;
13098         sym_op->auth.data.offset = 0;
13099
13100         return 0;
13101 }
13102
13103 static int
13104 create_auth_GMAC_operation(struct crypto_testsuite_params *ts_params,
13105                 struct crypto_unittest_params *ut_params,
13106                 const struct test_crypto_vector *reference,
13107                 unsigned int auth_generate)
13108 {
13109         /* Generate Crypto op data structure */
13110         ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
13111                         RTE_CRYPTO_OP_TYPE_SYMMETRIC);
13112         TEST_ASSERT_NOT_NULL(ut_params->op,
13113                         "Failed to allocate pktmbuf offload");
13114
13115         /* Set crypto operation data parameters */
13116         rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
13117
13118         struct rte_crypto_sym_op *sym_op = ut_params->op->sym;
13119
13120         /* set crypto operation source mbuf */
13121         sym_op->m_src = ut_params->ibuf;
13122
13123         /* digest */
13124         sym_op->auth.digest.data = (uint8_t *)rte_pktmbuf_append(
13125                         ut_params->ibuf, reference->digest.len);
13126
13127         TEST_ASSERT_NOT_NULL(sym_op->auth.digest.data,
13128                         "no room to append auth tag");
13129
13130         sym_op->auth.digest.phys_addr = rte_pktmbuf_iova_offset(
13131                         ut_params->ibuf, reference->ciphertext.len);
13132
13133         if (auth_generate)
13134                 memset(sym_op->auth.digest.data, 0, reference->digest.len);
13135         else
13136                 memcpy(sym_op->auth.digest.data,
13137                                 reference->digest.data,
13138                                 reference->digest.len);
13139
13140         debug_hexdump(stdout, "digest:",
13141                         sym_op->auth.digest.data,
13142                         reference->digest.len);
13143
13144         rte_memcpy(rte_crypto_op_ctod_offset(ut_params->op, uint8_t *, IV_OFFSET),
13145                         reference->iv.data, reference->iv.len);
13146
13147         sym_op->cipher.data.length = 0;
13148         sym_op->cipher.data.offset = 0;
13149
13150         sym_op->auth.data.length = reference->plaintext.len;
13151         sym_op->auth.data.offset = 0;
13152
13153         return 0;
13154 }
13155
13156 static int
13157 create_cipher_auth_operation(struct crypto_testsuite_params *ts_params,
13158                 struct crypto_unittest_params *ut_params,
13159                 const struct test_crypto_vector *reference,
13160                 unsigned int auth_generate)
13161 {
13162         /* Generate Crypto op data structure */
13163         ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
13164                         RTE_CRYPTO_OP_TYPE_SYMMETRIC);
13165         TEST_ASSERT_NOT_NULL(ut_params->op,
13166                         "Failed to allocate pktmbuf offload");
13167
13168         /* Set crypto operation data parameters */
13169         rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
13170
13171         struct rte_crypto_sym_op *sym_op = ut_params->op->sym;
13172
13173         /* set crypto operation source mbuf */
13174         sym_op->m_src = ut_params->ibuf;
13175
13176         /* digest */
13177         sym_op->auth.digest.data = (uint8_t *)rte_pktmbuf_append(
13178                         ut_params->ibuf, reference->digest.len);
13179
13180         TEST_ASSERT_NOT_NULL(sym_op->auth.digest.data,
13181                         "no room to append auth tag");
13182
13183         sym_op->auth.digest.phys_addr = rte_pktmbuf_iova_offset(
13184                         ut_params->ibuf, reference->ciphertext.len);
13185
13186         if (auth_generate)
13187                 memset(sym_op->auth.digest.data, 0, reference->digest.len);
13188         else
13189                 memcpy(sym_op->auth.digest.data,
13190                                 reference->digest.data,
13191                                 reference->digest.len);
13192
13193         debug_hexdump(stdout, "digest:",
13194                         sym_op->auth.digest.data,
13195                         reference->digest.len);
13196
13197         rte_memcpy(rte_crypto_op_ctod_offset(ut_params->op, uint8_t *, IV_OFFSET),
13198                         reference->iv.data, reference->iv.len);
13199
13200         sym_op->cipher.data.length = reference->cipher_len;
13201         sym_op->cipher.data.offset = reference->cipher_offset;
13202
13203         sym_op->auth.data.length = reference->plaintext.len;
13204         sym_op->auth.data.offset = reference->auth_offset;
13205
13206         return 0;
13207 }
13208
13209 static int
13210 create_auth_verify_operation(struct crypto_testsuite_params *ts_params,
13211                 struct crypto_unittest_params *ut_params,
13212                 const struct test_crypto_vector *reference)
13213 {
13214         return create_auth_operation(ts_params, ut_params, reference, 0);
13215 }
13216
13217 static int
13218 create_auth_verify_GMAC_operation(
13219                 struct crypto_testsuite_params *ts_params,
13220                 struct crypto_unittest_params *ut_params,
13221                 const struct test_crypto_vector *reference)
13222 {
13223         return create_auth_GMAC_operation(ts_params, ut_params, reference, 0);
13224 }
13225
13226 static int
13227 create_cipher_auth_verify_operation(struct crypto_testsuite_params *ts_params,
13228                 struct crypto_unittest_params *ut_params,
13229                 const struct test_crypto_vector *reference)
13230 {
13231         return create_cipher_auth_operation(ts_params, ut_params, reference, 0);
13232 }
13233
13234 static int
13235 test_authentication_verify_fail_when_data_corruption(
13236                 struct crypto_testsuite_params *ts_params,
13237                 struct crypto_unittest_params *ut_params,
13238                 const struct test_crypto_vector *reference,
13239                 unsigned int data_corrupted)
13240 {
13241         int retval;
13242
13243         uint8_t *plaintext;
13244         struct rte_cryptodev_info dev_info;
13245
13246         rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
13247         uint64_t feat_flags = dev_info.feature_flags;
13248
13249         if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
13250                         (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
13251                 printf("Device doesn't support RAW data-path APIs.\n");
13252                 return TEST_SKIPPED;
13253         }
13254
13255         /* Verify the capabilities */
13256         struct rte_cryptodev_sym_capability_idx cap_idx;
13257         cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
13258         cap_idx.algo.auth = reference->auth_algo;
13259         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
13260                         &cap_idx) == NULL)
13261                 return TEST_SKIPPED;
13262
13263
13264         /* Create session */
13265         retval = create_auth_session(ut_params,
13266                         ts_params->valid_devs[0],
13267                         reference,
13268                         RTE_CRYPTO_AUTH_OP_VERIFY);
13269
13270         if (retval == -ENOTSUP)
13271                 return TEST_SKIPPED;
13272         if (retval < 0)
13273                 return retval;
13274
13275         ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
13276         TEST_ASSERT_NOT_NULL(ut_params->ibuf,
13277                         "Failed to allocate input buffer in mempool");
13278
13279         /* clear mbuf payload */
13280         memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
13281                         rte_pktmbuf_tailroom(ut_params->ibuf));
13282
13283         plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
13284                         reference->plaintext.len);
13285         TEST_ASSERT_NOT_NULL(plaintext, "no room to append plaintext");
13286         memcpy(plaintext, reference->plaintext.data, reference->plaintext.len);
13287
13288         debug_hexdump(stdout, "plaintext:", plaintext,
13289                 reference->plaintext.len);
13290
13291         /* Create operation */
13292         retval = create_auth_verify_operation(ts_params, ut_params, reference);
13293
13294         if (retval < 0)
13295                 return retval;
13296
13297         if (data_corrupted)
13298                 data_corruption(plaintext);
13299         else
13300                 tag_corruption(plaintext, reference->plaintext.len);
13301
13302         if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO) {
13303                 process_cpu_crypt_auth_op(ts_params->valid_devs[0],
13304                         ut_params->op);
13305                 TEST_ASSERT_NOT_EQUAL(ut_params->op->status,
13306                         RTE_CRYPTO_OP_STATUS_SUCCESS,
13307                         "authentication not failed");
13308         } else if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
13309                 process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
13310                                 ut_params->op, 0, 1, 0, 0);
13311         else {
13312                 ut_params->op = process_crypto_request(ts_params->valid_devs[0],
13313                         ut_params->op);
13314         }
13315         if (ut_params->op == NULL)
13316                 return 0;
13317         else if (ut_params->op->status != RTE_CRYPTO_OP_STATUS_SUCCESS)
13318                 return 0;
13319
13320         return -1;
13321 }
13322
13323 static int
13324 test_authentication_verify_GMAC_fail_when_corruption(
13325                 struct crypto_testsuite_params *ts_params,
13326                 struct crypto_unittest_params *ut_params,
13327                 const struct test_crypto_vector *reference,
13328                 unsigned int data_corrupted)
13329 {
13330         int retval;
13331         uint8_t *plaintext;
13332         struct rte_cryptodev_info dev_info;
13333
13334         rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
13335         uint64_t feat_flags = dev_info.feature_flags;
13336
13337         if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
13338                         (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
13339                 printf("Device doesn't support RAW data-path APIs.\n");
13340                 return TEST_SKIPPED;
13341         }
13342
13343         /* Verify the capabilities */
13344         struct rte_cryptodev_sym_capability_idx cap_idx;
13345         cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
13346         cap_idx.algo.auth = reference->auth_algo;
13347         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
13348                         &cap_idx) == NULL)
13349                 return TEST_SKIPPED;
13350
13351         /* Create session */
13352         retval = create_auth_cipher_session(ut_params,
13353                         ts_params->valid_devs[0],
13354                         reference,
13355                         RTE_CRYPTO_AUTH_OP_VERIFY,
13356                         RTE_CRYPTO_CIPHER_OP_DECRYPT);
13357         if (retval < 0)
13358                 return retval;
13359
13360         ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
13361         TEST_ASSERT_NOT_NULL(ut_params->ibuf,
13362                         "Failed to allocate input buffer in mempool");
13363
13364         /* clear mbuf payload */
13365         memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
13366                         rte_pktmbuf_tailroom(ut_params->ibuf));
13367
13368         plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
13369                         reference->plaintext.len);
13370         TEST_ASSERT_NOT_NULL(plaintext, "no room to append plaintext");
13371         memcpy(plaintext, reference->plaintext.data, reference->plaintext.len);
13372
13373         debug_hexdump(stdout, "plaintext:", plaintext,
13374                 reference->plaintext.len);
13375
13376         /* Create operation */
13377         retval = create_auth_verify_GMAC_operation(ts_params,
13378                         ut_params,
13379                         reference);
13380
13381         if (retval < 0)
13382                 return retval;
13383
13384         if (data_corrupted)
13385                 data_corruption(plaintext);
13386         else
13387                 tag_corruption(plaintext, reference->aad.len);
13388
13389         if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO) {
13390                 process_cpu_crypt_auth_op(ts_params->valid_devs[0],
13391                         ut_params->op);
13392                 TEST_ASSERT_NOT_EQUAL(ut_params->op->status,
13393                         RTE_CRYPTO_OP_STATUS_SUCCESS,
13394                         "authentication not failed");
13395         } else if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
13396                 process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
13397                                 ut_params->op, 0, 1, 0, 0);
13398         else {
13399                 ut_params->op = process_crypto_request(ts_params->valid_devs[0],
13400                         ut_params->op);
13401                 TEST_ASSERT_NULL(ut_params->op, "authentication not failed");
13402         }
13403
13404         return 0;
13405 }
13406
13407 static int
13408 test_authenticated_decryption_fail_when_corruption(
13409                 struct crypto_testsuite_params *ts_params,
13410                 struct crypto_unittest_params *ut_params,
13411                 const struct test_crypto_vector *reference,
13412                 unsigned int data_corrupted)
13413 {
13414         int retval;
13415
13416         uint8_t *ciphertext;
13417         struct rte_cryptodev_info dev_info;
13418
13419         rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
13420         uint64_t feat_flags = dev_info.feature_flags;
13421
13422         if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
13423                         (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
13424                 printf("Device doesn't support RAW data-path APIs.\n");
13425                 return TEST_SKIPPED;
13426         }
13427
13428         /* Verify the capabilities */
13429         struct rte_cryptodev_sym_capability_idx cap_idx;
13430         cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
13431         cap_idx.algo.auth = reference->auth_algo;
13432         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
13433                         &cap_idx) == NULL)
13434                 return TEST_SKIPPED;
13435         cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
13436         cap_idx.algo.cipher = reference->crypto_algo;
13437         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
13438                         &cap_idx) == NULL)
13439                 return TEST_SKIPPED;
13440
13441         /* Create session */
13442         retval = create_auth_cipher_session(ut_params,
13443                         ts_params->valid_devs[0],
13444                         reference,
13445                         RTE_CRYPTO_AUTH_OP_VERIFY,
13446                         RTE_CRYPTO_CIPHER_OP_DECRYPT);
13447
13448         if (retval == -ENOTSUP)
13449                 return TEST_SKIPPED;
13450         if (retval < 0)
13451                 return retval;
13452
13453         ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
13454         TEST_ASSERT_NOT_NULL(ut_params->ibuf,
13455                         "Failed to allocate input buffer in mempool");
13456
13457         /* clear mbuf payload */
13458         memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
13459                         rte_pktmbuf_tailroom(ut_params->ibuf));
13460
13461         ciphertext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
13462                         reference->ciphertext.len);
13463         TEST_ASSERT_NOT_NULL(ciphertext, "no room to append ciphertext");
13464         memcpy(ciphertext, reference->ciphertext.data,
13465                         reference->ciphertext.len);
13466
13467         /* Create operation */
13468         retval = create_cipher_auth_verify_operation(ts_params,
13469                         ut_params,
13470                         reference);
13471
13472         if (retval < 0)
13473                 return retval;
13474
13475         if (data_corrupted)
13476                 data_corruption(ciphertext);
13477         else
13478                 tag_corruption(ciphertext, reference->ciphertext.len);
13479
13480         if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO) {
13481                 process_cpu_crypt_auth_op(ts_params->valid_devs[0],
13482                         ut_params->op);
13483                 TEST_ASSERT_NOT_EQUAL(ut_params->op->status,
13484                         RTE_CRYPTO_OP_STATUS_SUCCESS,
13485                         "authentication not failed");
13486         } else if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
13487                 process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
13488                                 ut_params->op, 1, 1, 0, 0);
13489         else {
13490                 ut_params->op = process_crypto_request(ts_params->valid_devs[0],
13491                         ut_params->op);
13492                 TEST_ASSERT_NULL(ut_params->op, "authentication not failed");
13493         }
13494
13495         return 0;
13496 }
13497
13498 static int
13499 test_authenticated_encrypt_with_esn(
13500                 struct crypto_testsuite_params *ts_params,
13501                 struct crypto_unittest_params *ut_params,
13502                 const struct test_crypto_vector *reference)
13503 {
13504         int retval;
13505
13506         uint8_t *authciphertext, *plaintext, *auth_tag;
13507         uint16_t plaintext_pad_len;
13508         uint8_t cipher_key[reference->cipher_key.len + 1];
13509         uint8_t auth_key[reference->auth_key.len + 1];
13510         struct rte_cryptodev_info dev_info;
13511         int status;
13512
13513         rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
13514         uint64_t feat_flags = dev_info.feature_flags;
13515
13516         if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
13517                         (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
13518                 printf("Device doesn't support RAW data-path APIs.\n");
13519                 return TEST_SKIPPED;
13520         }
13521
13522         /* Verify the capabilities */
13523         struct rte_cryptodev_sym_capability_idx cap_idx;
13524         cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
13525         cap_idx.algo.auth = reference->auth_algo;
13526         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
13527                         &cap_idx) == NULL)
13528                 return TEST_SKIPPED;
13529         cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
13530         cap_idx.algo.cipher = reference->crypto_algo;
13531         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
13532                         &cap_idx) == NULL)
13533                 return TEST_SKIPPED;
13534
13535         /* Create session */
13536         memcpy(cipher_key, reference->cipher_key.data,
13537                         reference->cipher_key.len);
13538         memcpy(auth_key, reference->auth_key.data, reference->auth_key.len);
13539
13540         /* Setup Cipher Parameters */
13541         ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
13542         ut_params->cipher_xform.cipher.algo = reference->crypto_algo;
13543         ut_params->cipher_xform.cipher.op = RTE_CRYPTO_CIPHER_OP_ENCRYPT;
13544         ut_params->cipher_xform.cipher.key.data = cipher_key;
13545         ut_params->cipher_xform.cipher.key.length = reference->cipher_key.len;
13546         ut_params->cipher_xform.cipher.iv.offset = IV_OFFSET;
13547         ut_params->cipher_xform.cipher.iv.length = reference->iv.len;
13548
13549         ut_params->cipher_xform.next = &ut_params->auth_xform;
13550
13551         /* Setup Authentication Parameters */
13552         ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;
13553         ut_params->auth_xform.auth.op = RTE_CRYPTO_AUTH_OP_GENERATE;
13554         ut_params->auth_xform.auth.algo = reference->auth_algo;
13555         ut_params->auth_xform.auth.key.length = reference->auth_key.len;
13556         ut_params->auth_xform.auth.key.data = auth_key;
13557         ut_params->auth_xform.auth.digest_length = reference->digest.len;
13558         ut_params->auth_xform.next = NULL;
13559
13560         /* Create Crypto session*/
13561         ut_params->sess = rte_cryptodev_sym_session_create(
13562                         ts_params->session_mpool);
13563         TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed");
13564
13565         status = rte_cryptodev_sym_session_init(ts_params->valid_devs[0],
13566                                 ut_params->sess,
13567                                 &ut_params->cipher_xform,
13568                                 ts_params->session_priv_mpool);
13569
13570         if (status == -ENOTSUP)
13571                 return TEST_SKIPPED;
13572
13573         TEST_ASSERT_EQUAL(status, 0, "Session init failed");
13574
13575         ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
13576         TEST_ASSERT_NOT_NULL(ut_params->ibuf,
13577                         "Failed to allocate input buffer in mempool");
13578
13579         /* clear mbuf payload */
13580         memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
13581                         rte_pktmbuf_tailroom(ut_params->ibuf));
13582
13583         plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
13584                         reference->plaintext.len);
13585         TEST_ASSERT_NOT_NULL(plaintext, "no room to append plaintext");
13586         memcpy(plaintext, reference->plaintext.data, reference->plaintext.len);
13587
13588         /* Create operation */
13589         retval = create_cipher_auth_operation(ts_params,
13590                         ut_params,
13591                         reference, 0);
13592
13593         if (retval < 0)
13594                 return retval;
13595
13596         if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
13597                 process_cpu_crypt_auth_op(ts_params->valid_devs[0],
13598                         ut_params->op);
13599         else if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
13600                 process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
13601                                 ut_params->op, 1, 1, 0, 0);
13602         else
13603                 ut_params->op = process_crypto_request(
13604                         ts_params->valid_devs[0], ut_params->op);
13605
13606         TEST_ASSERT_NOT_NULL(ut_params->op, "no crypto operation returned");
13607
13608         TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
13609                         "crypto op processing failed");
13610
13611         plaintext_pad_len = RTE_ALIGN_CEIL(reference->plaintext.len, 16);
13612
13613         authciphertext = rte_pktmbuf_mtod_offset(ut_params->ibuf, uint8_t *,
13614                         ut_params->op->sym->auth.data.offset);
13615         auth_tag = authciphertext + plaintext_pad_len;
13616         debug_hexdump(stdout, "ciphertext:", authciphertext,
13617                         reference->ciphertext.len);
13618         debug_hexdump(stdout, "auth tag:", auth_tag, reference->digest.len);
13619
13620         /* Validate obuf */
13621         TEST_ASSERT_BUFFERS_ARE_EQUAL(
13622                         authciphertext,
13623                         reference->ciphertext.data,
13624                         reference->ciphertext.len,
13625                         "Ciphertext data not as expected");
13626
13627         TEST_ASSERT_BUFFERS_ARE_EQUAL(
13628                         auth_tag,
13629                         reference->digest.data,
13630                         reference->digest.len,
13631                         "Generated digest not as expected");
13632
13633         return TEST_SUCCESS;
13634
13635 }
13636
13637 static int
13638 test_authenticated_decrypt_with_esn(
13639                 struct crypto_testsuite_params *ts_params,
13640                 struct crypto_unittest_params *ut_params,
13641                 const struct test_crypto_vector *reference)
13642 {
13643         int retval;
13644
13645         uint8_t *ciphertext;
13646         uint8_t cipher_key[reference->cipher_key.len + 1];
13647         uint8_t auth_key[reference->auth_key.len + 1];
13648         struct rte_cryptodev_info dev_info;
13649
13650         rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
13651         uint64_t feat_flags = dev_info.feature_flags;
13652
13653         if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
13654                         (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
13655                 printf("Device doesn't support RAW data-path APIs.\n");
13656                 return TEST_SKIPPED;
13657         }
13658
13659         /* Verify the capabilities */
13660         struct rte_cryptodev_sym_capability_idx cap_idx;
13661         cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
13662         cap_idx.algo.auth = reference->auth_algo;
13663         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
13664                         &cap_idx) == NULL)
13665                 return TEST_SKIPPED;
13666         cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
13667         cap_idx.algo.cipher = reference->crypto_algo;
13668         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
13669                         &cap_idx) == NULL)
13670                 return TEST_SKIPPED;
13671
13672         /* Create session */
13673         memcpy(cipher_key, reference->cipher_key.data,
13674                         reference->cipher_key.len);
13675         memcpy(auth_key, reference->auth_key.data, reference->auth_key.len);
13676
13677         /* Setup Authentication Parameters */
13678         ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;
13679         ut_params->auth_xform.auth.op = RTE_CRYPTO_AUTH_OP_VERIFY;
13680         ut_params->auth_xform.auth.algo = reference->auth_algo;
13681         ut_params->auth_xform.auth.key.length = reference->auth_key.len;
13682         ut_params->auth_xform.auth.key.data = auth_key;
13683         ut_params->auth_xform.auth.digest_length = reference->digest.len;
13684         ut_params->auth_xform.next = &ut_params->cipher_xform;
13685
13686         /* Setup Cipher Parameters */
13687         ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
13688         ut_params->cipher_xform.next = NULL;
13689         ut_params->cipher_xform.cipher.algo = reference->crypto_algo;
13690         ut_params->cipher_xform.cipher.op = RTE_CRYPTO_CIPHER_OP_DECRYPT;
13691         ut_params->cipher_xform.cipher.key.data = cipher_key;
13692         ut_params->cipher_xform.cipher.key.length = reference->cipher_key.len;
13693         ut_params->cipher_xform.cipher.iv.offset = IV_OFFSET;
13694         ut_params->cipher_xform.cipher.iv.length = reference->iv.len;
13695
13696         /* Create Crypto session*/
13697         ut_params->sess = rte_cryptodev_sym_session_create(
13698                         ts_params->session_mpool);
13699         TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed");
13700
13701         retval = rte_cryptodev_sym_session_init(ts_params->valid_devs[0],
13702                                 ut_params->sess,
13703                                 &ut_params->auth_xform,
13704                                 ts_params->session_priv_mpool);
13705
13706         if (retval == -ENOTSUP)
13707                 return TEST_SKIPPED;
13708
13709         TEST_ASSERT_EQUAL(retval, 0, "Session init failed");
13710
13711         ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
13712         TEST_ASSERT_NOT_NULL(ut_params->ibuf,
13713                         "Failed to allocate input buffer in mempool");
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         ciphertext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
13720                         reference->ciphertext.len);
13721         TEST_ASSERT_NOT_NULL(ciphertext, "no room to append ciphertext");
13722         memcpy(ciphertext, reference->ciphertext.data,
13723                         reference->ciphertext.len);
13724
13725         /* Create operation */
13726         retval = create_cipher_auth_verify_operation(ts_params,
13727                         ut_params,
13728                         reference);
13729
13730         if (retval < 0)
13731                 return retval;
13732
13733         if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
13734                 process_cpu_crypt_auth_op(ts_params->valid_devs[0],
13735                         ut_params->op);
13736         else if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
13737                 process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
13738                                 ut_params->op, 1, 1, 0, 0);
13739         else
13740                 ut_params->op = process_crypto_request(ts_params->valid_devs[0],
13741                         ut_params->op);
13742
13743         TEST_ASSERT_NOT_NULL(ut_params->op, "failed crypto process");
13744         TEST_ASSERT_EQUAL(ut_params->op->status,
13745                         RTE_CRYPTO_OP_STATUS_SUCCESS,
13746                         "crypto op processing passed");
13747
13748         ut_params->obuf = ut_params->op->sym->m_src;
13749         TEST_ASSERT_NOT_NULL(ut_params->obuf, "failed to retrieve obuf");
13750
13751         return 0;
13752 }
13753
13754 static int
13755 create_aead_operation_SGL(enum rte_crypto_aead_operation op,
13756                 const struct aead_test_data *tdata,
13757                 void *digest_mem, uint64_t digest_phys)
13758 {
13759         struct crypto_testsuite_params *ts_params = &testsuite_params;
13760         struct crypto_unittest_params *ut_params = &unittest_params;
13761
13762         const unsigned int auth_tag_len = tdata->auth_tag.len;
13763         const unsigned int iv_len = tdata->iv.len;
13764         unsigned int aad_len = tdata->aad.len;
13765         unsigned int aad_len_pad = 0;
13766
13767         /* Generate Crypto op data structure */
13768         ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
13769                         RTE_CRYPTO_OP_TYPE_SYMMETRIC);
13770         TEST_ASSERT_NOT_NULL(ut_params->op,
13771                 "Failed to allocate symmetric crypto operation struct");
13772
13773         struct rte_crypto_sym_op *sym_op = ut_params->op->sym;
13774
13775         sym_op->aead.digest.data = digest_mem;
13776
13777         TEST_ASSERT_NOT_NULL(sym_op->aead.digest.data,
13778                         "no room to append digest");
13779
13780         sym_op->aead.digest.phys_addr = digest_phys;
13781
13782         if (op == RTE_CRYPTO_AEAD_OP_DECRYPT) {
13783                 rte_memcpy(sym_op->aead.digest.data, tdata->auth_tag.data,
13784                                 auth_tag_len);
13785                 debug_hexdump(stdout, "digest:",
13786                                 sym_op->aead.digest.data,
13787                                 auth_tag_len);
13788         }
13789
13790         /* Append aad data */
13791         if (tdata->algo == RTE_CRYPTO_AEAD_AES_CCM) {
13792                 uint8_t *iv_ptr = rte_crypto_op_ctod_offset(ut_params->op,
13793                                 uint8_t *, IV_OFFSET);
13794
13795                 /* Copy IV 1 byte after the IV pointer, according to the API */
13796                 rte_memcpy(iv_ptr + 1, tdata->iv.data, iv_len);
13797
13798                 aad_len = RTE_ALIGN_CEIL(aad_len + 18, 16);
13799
13800                 sym_op->aead.aad.data = (uint8_t *)rte_pktmbuf_prepend(
13801                                 ut_params->ibuf, aad_len);
13802                 TEST_ASSERT_NOT_NULL(sym_op->aead.aad.data,
13803                                 "no room to prepend aad");
13804                 sym_op->aead.aad.phys_addr = rte_pktmbuf_iova(
13805                                 ut_params->ibuf);
13806
13807                 memset(sym_op->aead.aad.data, 0, aad_len);
13808                 /* Copy AAD 18 bytes after the AAD pointer, according to the API */
13809                 rte_memcpy(sym_op->aead.aad.data, tdata->aad.data, aad_len);
13810
13811                 debug_hexdump(stdout, "iv:", iv_ptr, iv_len);
13812                 debug_hexdump(stdout, "aad:",
13813                                 sym_op->aead.aad.data, aad_len);
13814         } else {
13815                 uint8_t *iv_ptr = rte_crypto_op_ctod_offset(ut_params->op,
13816                                 uint8_t *, IV_OFFSET);
13817
13818                 rte_memcpy(iv_ptr, tdata->iv.data, iv_len);
13819
13820                 aad_len_pad = RTE_ALIGN_CEIL(aad_len, 16);
13821
13822                 sym_op->aead.aad.data = (uint8_t *)rte_pktmbuf_prepend(
13823                                 ut_params->ibuf, aad_len_pad);
13824                 TEST_ASSERT_NOT_NULL(sym_op->aead.aad.data,
13825                                 "no room to prepend aad");
13826                 sym_op->aead.aad.phys_addr = rte_pktmbuf_iova(
13827                                 ut_params->ibuf);
13828
13829                 memset(sym_op->aead.aad.data, 0, aad_len);
13830                 rte_memcpy(sym_op->aead.aad.data, tdata->aad.data, aad_len);
13831
13832                 debug_hexdump(stdout, "iv:", iv_ptr, iv_len);
13833                 debug_hexdump(stdout, "aad:",
13834                                 sym_op->aead.aad.data, aad_len);
13835         }
13836
13837         sym_op->aead.data.length = tdata->plaintext.len;
13838         sym_op->aead.data.offset = aad_len_pad;
13839
13840         return 0;
13841 }
13842
13843 #define SGL_MAX_NO      16
13844
13845 static int
13846 test_authenticated_encryption_SGL(const struct aead_test_data *tdata,
13847                 const int oop, uint32_t fragsz, uint32_t fragsz_oop)
13848 {
13849         struct crypto_testsuite_params *ts_params = &testsuite_params;
13850         struct crypto_unittest_params *ut_params = &unittest_params;
13851         struct rte_mbuf *buf, *buf_oop = NULL, *buf_last_oop = NULL;
13852         int retval;
13853         int to_trn = 0;
13854         int to_trn_tbl[SGL_MAX_NO];
13855         int segs = 1;
13856         unsigned int trn_data = 0;
13857         uint8_t *plaintext, *ciphertext, *auth_tag;
13858         struct rte_cryptodev_info dev_info;
13859
13860         /* Verify the capabilities */
13861         struct rte_cryptodev_sym_capability_idx cap_idx;
13862         cap_idx.type = RTE_CRYPTO_SYM_XFORM_AEAD;
13863         cap_idx.algo.aead = tdata->algo;
13864         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
13865                         &cap_idx) == NULL)
13866                 return TEST_SKIPPED;
13867
13868         /* OOP not supported with CPU crypto */
13869         if (oop && gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
13870                 return TEST_SKIPPED;
13871
13872         /* Detailed check for the particular SGL support flag */
13873         rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
13874         if (!oop) {
13875                 unsigned int sgl_in = fragsz < tdata->plaintext.len;
13876                 if (sgl_in && (!(dev_info.feature_flags &
13877                                 RTE_CRYPTODEV_FF_IN_PLACE_SGL)))
13878                         return TEST_SKIPPED;
13879
13880                 uint64_t feat_flags = dev_info.feature_flags;
13881
13882                 if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
13883                         (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
13884                         printf("Device doesn't support RAW data-path APIs.\n");
13885                         return TEST_SKIPPED;
13886                 }
13887         } else {
13888                 unsigned int sgl_in = fragsz < tdata->plaintext.len;
13889                 unsigned int sgl_out = (fragsz_oop ? fragsz_oop : fragsz) <
13890                                 tdata->plaintext.len;
13891                 /* Raw data path API does not support OOP */
13892                 if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
13893                         return TEST_SKIPPED;
13894                 if (sgl_in && !sgl_out) {
13895                         if (!(dev_info.feature_flags &
13896                                         RTE_CRYPTODEV_FF_OOP_SGL_IN_LB_OUT))
13897                                 return TEST_SKIPPED;
13898                 } else if (!sgl_in && sgl_out) {
13899                         if (!(dev_info.feature_flags &
13900                                         RTE_CRYPTODEV_FF_OOP_LB_IN_SGL_OUT))
13901                                 return TEST_SKIPPED;
13902                 } else if (sgl_in && sgl_out) {
13903                         if (!(dev_info.feature_flags &
13904                                         RTE_CRYPTODEV_FF_OOP_SGL_IN_SGL_OUT))
13905                                 return TEST_SKIPPED;
13906                 }
13907         }
13908
13909         if (fragsz > tdata->plaintext.len)
13910                 fragsz = tdata->plaintext.len;
13911
13912         uint16_t plaintext_len = fragsz;
13913         uint16_t frag_size_oop = fragsz_oop ? fragsz_oop : fragsz;
13914
13915         if (fragsz_oop > tdata->plaintext.len)
13916                 frag_size_oop = tdata->plaintext.len;
13917
13918         int ecx = 0;
13919         void *digest_mem = NULL;
13920
13921         uint32_t prepend_len = RTE_ALIGN_CEIL(tdata->aad.len, 16);
13922
13923         if (tdata->plaintext.len % fragsz != 0) {
13924                 if (tdata->plaintext.len / fragsz + 1 > SGL_MAX_NO)
13925                         return 1;
13926         }       else {
13927                 if (tdata->plaintext.len / fragsz > SGL_MAX_NO)
13928                         return 1;
13929         }
13930
13931         /*
13932          * For out-op-place we need to alloc another mbuf
13933          */
13934         if (oop) {
13935                 ut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
13936                 rte_pktmbuf_append(ut_params->obuf,
13937                                 frag_size_oop + prepend_len);
13938                 buf_oop = ut_params->obuf;
13939         }
13940
13941         /* Create AEAD session */
13942         retval = create_aead_session(ts_params->valid_devs[0],
13943                         tdata->algo,
13944                         RTE_CRYPTO_AEAD_OP_ENCRYPT,
13945                         tdata->key.data, tdata->key.len,
13946                         tdata->aad.len, tdata->auth_tag.len,
13947                         tdata->iv.len);
13948         if (retval < 0)
13949                 return retval;
13950
13951         ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
13952
13953         /* clear mbuf payload */
13954         memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
13955                         rte_pktmbuf_tailroom(ut_params->ibuf));
13956
13957         plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
13958                         plaintext_len);
13959
13960         memcpy(plaintext, tdata->plaintext.data, plaintext_len);
13961
13962         trn_data += plaintext_len;
13963
13964         buf = ut_params->ibuf;
13965
13966         /*
13967          * Loop until no more fragments
13968          */
13969
13970         while (trn_data < tdata->plaintext.len) {
13971                 ++segs;
13972                 to_trn = (tdata->plaintext.len - trn_data < fragsz) ?
13973                                 (tdata->plaintext.len - trn_data) : fragsz;
13974
13975                 to_trn_tbl[ecx++] = to_trn;
13976
13977                 buf->next = rte_pktmbuf_alloc(ts_params->mbuf_pool);
13978                 buf = buf->next;
13979
13980                 memset(rte_pktmbuf_mtod(buf, uint8_t *), 0,
13981                                 rte_pktmbuf_tailroom(buf));
13982
13983                 /* OOP */
13984                 if (oop && !fragsz_oop) {
13985                         buf_last_oop = buf_oop->next =
13986                                         rte_pktmbuf_alloc(ts_params->mbuf_pool);
13987                         buf_oop = buf_oop->next;
13988                         memset(rte_pktmbuf_mtod(buf_oop, uint8_t *),
13989                                         0, rte_pktmbuf_tailroom(buf_oop));
13990                         rte_pktmbuf_append(buf_oop, to_trn);
13991                 }
13992
13993                 plaintext = (uint8_t *)rte_pktmbuf_append(buf,
13994                                 to_trn);
13995
13996                 memcpy(plaintext, tdata->plaintext.data + trn_data,
13997                                 to_trn);
13998                 trn_data += to_trn;
13999                 if (trn_data  == tdata->plaintext.len) {
14000                         if (oop) {
14001                                 if (!fragsz_oop)
14002                                         digest_mem = rte_pktmbuf_append(buf_oop,
14003                                                 tdata->auth_tag.len);
14004                         } else
14005                                 digest_mem = (uint8_t *)rte_pktmbuf_append(buf,
14006                                         tdata->auth_tag.len);
14007                 }
14008         }
14009
14010         uint64_t digest_phys = 0;
14011
14012         ut_params->ibuf->nb_segs = segs;
14013
14014         segs = 1;
14015         if (fragsz_oop && oop) {
14016                 to_trn = 0;
14017                 ecx = 0;
14018
14019                 if (frag_size_oop == tdata->plaintext.len) {
14020                         digest_mem = rte_pktmbuf_append(ut_params->obuf,
14021                                 tdata->auth_tag.len);
14022
14023                         digest_phys = rte_pktmbuf_iova_offset(
14024                                         ut_params->obuf,
14025                                         tdata->plaintext.len + prepend_len);
14026                 }
14027
14028                 trn_data = frag_size_oop;
14029                 while (trn_data < tdata->plaintext.len) {
14030                         ++segs;
14031                         to_trn =
14032                                 (tdata->plaintext.len - trn_data <
14033                                                 frag_size_oop) ?
14034                                 (tdata->plaintext.len - trn_data) :
14035                                                 frag_size_oop;
14036
14037                         to_trn_tbl[ecx++] = to_trn;
14038
14039                         buf_last_oop = buf_oop->next =
14040                                         rte_pktmbuf_alloc(ts_params->mbuf_pool);
14041                         buf_oop = buf_oop->next;
14042                         memset(rte_pktmbuf_mtod(buf_oop, uint8_t *),
14043                                         0, rte_pktmbuf_tailroom(buf_oop));
14044                         rte_pktmbuf_append(buf_oop, to_trn);
14045
14046                         trn_data += to_trn;
14047
14048                         if (trn_data  == tdata->plaintext.len) {
14049                                 digest_mem = rte_pktmbuf_append(buf_oop,
14050                                         tdata->auth_tag.len);
14051                         }
14052                 }
14053
14054                 ut_params->obuf->nb_segs = segs;
14055         }
14056
14057         /*
14058          * Place digest at the end of the last buffer
14059          */
14060         if (!digest_phys)
14061                 digest_phys = rte_pktmbuf_iova(buf) + to_trn;
14062         if (oop && buf_last_oop)
14063                 digest_phys = rte_pktmbuf_iova(buf_last_oop) + to_trn;
14064
14065         if (!digest_mem && !oop) {
14066                 digest_mem = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
14067                                 + tdata->auth_tag.len);
14068                 digest_phys = rte_pktmbuf_iova_offset(ut_params->ibuf,
14069                                 tdata->plaintext.len);
14070         }
14071
14072         /* Create AEAD operation */
14073         retval = create_aead_operation_SGL(RTE_CRYPTO_AEAD_OP_ENCRYPT,
14074                         tdata, digest_mem, digest_phys);
14075
14076         if (retval < 0)
14077                 return retval;
14078
14079         rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
14080
14081         ut_params->op->sym->m_src = ut_params->ibuf;
14082         if (oop)
14083                 ut_params->op->sym->m_dst = ut_params->obuf;
14084
14085         /* Process crypto operation */
14086         if (oop == IN_PLACE &&
14087                         gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
14088                 process_cpu_aead_op(ts_params->valid_devs[0], ut_params->op);
14089         else if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
14090                 process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
14091                                 ut_params->op, 0, 0, 0, 0);
14092         else
14093                 TEST_ASSERT_NOT_NULL(
14094                         process_crypto_request(ts_params->valid_devs[0],
14095                         ut_params->op), "failed to process sym crypto op");
14096
14097         TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
14098                         "crypto op processing failed");
14099
14100
14101         ciphertext = rte_pktmbuf_mtod_offset(ut_params->op->sym->m_src,
14102                         uint8_t *, prepend_len);
14103         if (oop) {
14104                 ciphertext = rte_pktmbuf_mtod_offset(ut_params->op->sym->m_dst,
14105                                 uint8_t *, prepend_len);
14106         }
14107
14108         if (fragsz_oop)
14109                 fragsz = fragsz_oop;
14110
14111         TEST_ASSERT_BUFFERS_ARE_EQUAL(
14112                         ciphertext,
14113                         tdata->ciphertext.data,
14114                         fragsz,
14115                         "Ciphertext data not as expected");
14116
14117         buf = ut_params->op->sym->m_src->next;
14118         if (oop)
14119                 buf = ut_params->op->sym->m_dst->next;
14120
14121         unsigned int off = fragsz;
14122
14123         ecx = 0;
14124         while (buf) {
14125                 ciphertext = rte_pktmbuf_mtod(buf,
14126                                 uint8_t *);
14127
14128                 TEST_ASSERT_BUFFERS_ARE_EQUAL(
14129                                 ciphertext,
14130                                 tdata->ciphertext.data + off,
14131                                 to_trn_tbl[ecx],
14132                                 "Ciphertext data not as expected");
14133
14134                 off += to_trn_tbl[ecx++];
14135                 buf = buf->next;
14136         }
14137
14138         auth_tag = digest_mem;
14139         TEST_ASSERT_BUFFERS_ARE_EQUAL(
14140                         auth_tag,
14141                         tdata->auth_tag.data,
14142                         tdata->auth_tag.len,
14143                         "Generated auth tag not as expected");
14144
14145         return 0;
14146 }
14147
14148 static int
14149 test_AES_GCM_auth_encrypt_SGL_out_of_place_400B_400B(void)
14150 {
14151         return test_authenticated_encryption_SGL(
14152                         &gcm_test_case_SGL_1, OUT_OF_PLACE, 400, 400);
14153 }
14154
14155 static int
14156 test_AES_GCM_auth_encrypt_SGL_out_of_place_1500B_2000B(void)
14157 {
14158         return test_authenticated_encryption_SGL(
14159                         &gcm_test_case_SGL_1, OUT_OF_PLACE, 1500, 2000);
14160 }
14161
14162 static int
14163 test_AES_GCM_auth_encrypt_SGL_out_of_place_400B_1seg(void)
14164 {
14165         return test_authenticated_encryption_SGL(
14166                         &gcm_test_case_8, OUT_OF_PLACE, 400,
14167                         gcm_test_case_8.plaintext.len);
14168 }
14169
14170 static int
14171 test_AES_GCM_auth_encrypt_SGL_in_place_1500B(void)
14172 {
14173         /* This test is not for OPENSSL PMD */
14174         if (gbl_driver_id == rte_cryptodev_driver_id_get(
14175                         RTE_STR(CRYPTODEV_NAME_OPENSSL_PMD)))
14176                 return TEST_SKIPPED;
14177
14178         return test_authenticated_encryption_SGL(
14179                         &gcm_test_case_SGL_1, IN_PLACE, 1500, 0);
14180 }
14181
14182 static int
14183 test_authentication_verify_fail_when_data_corrupted(
14184                 struct crypto_testsuite_params *ts_params,
14185                 struct crypto_unittest_params *ut_params,
14186                 const struct test_crypto_vector *reference)
14187 {
14188         return test_authentication_verify_fail_when_data_corruption(
14189                         ts_params, ut_params, reference, 1);
14190 }
14191
14192 static int
14193 test_authentication_verify_fail_when_tag_corrupted(
14194                 struct crypto_testsuite_params *ts_params,
14195                 struct crypto_unittest_params *ut_params,
14196                 const struct test_crypto_vector *reference)
14197 {
14198         return test_authentication_verify_fail_when_data_corruption(
14199                         ts_params, ut_params, reference, 0);
14200 }
14201
14202 static int
14203 test_authentication_verify_GMAC_fail_when_data_corrupted(
14204                 struct crypto_testsuite_params *ts_params,
14205                 struct crypto_unittest_params *ut_params,
14206                 const struct test_crypto_vector *reference)
14207 {
14208         return test_authentication_verify_GMAC_fail_when_corruption(
14209                         ts_params, ut_params, reference, 1);
14210 }
14211
14212 static int
14213 test_authentication_verify_GMAC_fail_when_tag_corrupted(
14214                 struct crypto_testsuite_params *ts_params,
14215                 struct crypto_unittest_params *ut_params,
14216                 const struct test_crypto_vector *reference)
14217 {
14218         return test_authentication_verify_GMAC_fail_when_corruption(
14219                         ts_params, ut_params, reference, 0);
14220 }
14221
14222 static int
14223 test_authenticated_decryption_fail_when_data_corrupted(
14224                 struct crypto_testsuite_params *ts_params,
14225                 struct crypto_unittest_params *ut_params,
14226                 const struct test_crypto_vector *reference)
14227 {
14228         return test_authenticated_decryption_fail_when_corruption(
14229                         ts_params, ut_params, reference, 1);
14230 }
14231
14232 static int
14233 test_authenticated_decryption_fail_when_tag_corrupted(
14234                 struct crypto_testsuite_params *ts_params,
14235                 struct crypto_unittest_params *ut_params,
14236                 const struct test_crypto_vector *reference)
14237 {
14238         return test_authenticated_decryption_fail_when_corruption(
14239                         ts_params, ut_params, reference, 0);
14240 }
14241
14242 static int
14243 authentication_verify_HMAC_SHA1_fail_data_corrupt(void)
14244 {
14245         return test_authentication_verify_fail_when_data_corrupted(
14246                         &testsuite_params, &unittest_params,
14247                         &hmac_sha1_test_crypto_vector);
14248 }
14249
14250 static int
14251 authentication_verify_HMAC_SHA1_fail_tag_corrupt(void)
14252 {
14253         return test_authentication_verify_fail_when_tag_corrupted(
14254                         &testsuite_params, &unittest_params,
14255                         &hmac_sha1_test_crypto_vector);
14256 }
14257
14258 static int
14259 authentication_verify_AES128_GMAC_fail_data_corrupt(void)
14260 {
14261         return test_authentication_verify_GMAC_fail_when_data_corrupted(
14262                         &testsuite_params, &unittest_params,
14263                         &aes128_gmac_test_vector);
14264 }
14265
14266 static int
14267 authentication_verify_AES128_GMAC_fail_tag_corrupt(void)
14268 {
14269         return test_authentication_verify_GMAC_fail_when_tag_corrupted(
14270                         &testsuite_params, &unittest_params,
14271                         &aes128_gmac_test_vector);
14272 }
14273
14274 static int
14275 auth_decryption_AES128CBC_HMAC_SHA1_fail_data_corrupt(void)
14276 {
14277         return test_authenticated_decryption_fail_when_data_corrupted(
14278                         &testsuite_params,
14279                         &unittest_params,
14280                         &aes128cbc_hmac_sha1_test_vector);
14281 }
14282
14283 static int
14284 auth_decryption_AES128CBC_HMAC_SHA1_fail_tag_corrupt(void)
14285 {
14286         return test_authenticated_decryption_fail_when_tag_corrupted(
14287                         &testsuite_params,
14288                         &unittest_params,
14289                         &aes128cbc_hmac_sha1_test_vector);
14290 }
14291
14292 static int
14293 auth_encrypt_AES128CBC_HMAC_SHA1_esn_check(void)
14294 {
14295         return test_authenticated_encrypt_with_esn(
14296                         &testsuite_params,
14297                         &unittest_params,
14298                         &aes128cbc_hmac_sha1_aad_test_vector);
14299 }
14300
14301 static int
14302 auth_decrypt_AES128CBC_HMAC_SHA1_esn_check(void)
14303 {
14304         return test_authenticated_decrypt_with_esn(
14305                         &testsuite_params,
14306                         &unittest_params,
14307                         &aes128cbc_hmac_sha1_aad_test_vector);
14308 }
14309
14310 static int
14311 test_chacha20_poly1305_encrypt_test_case_rfc8439(void)
14312 {
14313         return test_authenticated_encryption(&chacha20_poly1305_case_rfc8439);
14314 }
14315
14316 static int
14317 test_chacha20_poly1305_decrypt_test_case_rfc8439(void)
14318 {
14319         return test_authenticated_decryption(&chacha20_poly1305_case_rfc8439);
14320 }
14321
14322 static int
14323 test_chacha20_poly1305_encrypt_SGL_out_of_place(void)
14324 {
14325         return test_authenticated_encryption_SGL(
14326                 &chacha20_poly1305_case_2, OUT_OF_PLACE, 32,
14327                 chacha20_poly1305_case_2.plaintext.len);
14328 }
14329
14330 #ifdef RTE_CRYPTO_SCHEDULER
14331
14332 /* global AESNI worker IDs for the scheduler test */
14333 uint8_t aesni_ids[2];
14334
14335 static int
14336 scheduler_testsuite_setup(void)
14337 {
14338         uint32_t i = 0;
14339         int32_t nb_devs, ret;
14340         char vdev_args[VDEV_ARGS_SIZE] = {""};
14341         char temp_str[VDEV_ARGS_SIZE] = {"mode=multi-core,"
14342                 "ordering=enable,name=cryptodev_test_scheduler,corelist="};
14343         uint16_t worker_core_count = 0;
14344         uint16_t socket_id = 0;
14345
14346         if (gbl_driver_id == rte_cryptodev_driver_id_get(
14347                         RTE_STR(CRYPTODEV_NAME_SCHEDULER_PMD))) {
14348
14349                 /* Identify the Worker Cores
14350                  * Use 2 worker cores for the device args
14351                  */
14352                 RTE_LCORE_FOREACH_WORKER(i) {
14353                         if (worker_core_count > 1)
14354                                 break;
14355                         snprintf(vdev_args, sizeof(vdev_args),
14356                                         "%s%d", temp_str, i);
14357                         strcpy(temp_str, vdev_args);
14358                         strlcat(temp_str, ";", sizeof(temp_str));
14359                         worker_core_count++;
14360                         socket_id = rte_lcore_to_socket_id(i);
14361                 }
14362                 if (worker_core_count != 2) {
14363                         RTE_LOG(ERR, USER1,
14364                                 "Cryptodev scheduler test require at least "
14365                                 "two worker cores to run. "
14366                                 "Please use the correct coremask.\n");
14367                         return TEST_FAILED;
14368                 }
14369                 strcpy(temp_str, vdev_args);
14370                 snprintf(vdev_args, sizeof(vdev_args), "%s,socket_id=%d",
14371                                 temp_str, socket_id);
14372                 RTE_LOG(DEBUG, USER1, "vdev_args: %s\n", vdev_args);
14373                 nb_devs = rte_cryptodev_device_count_by_driver(
14374                                 rte_cryptodev_driver_id_get(
14375                                 RTE_STR(CRYPTODEV_NAME_SCHEDULER_PMD)));
14376                 if (nb_devs < 1) {
14377                         ret = rte_vdev_init(
14378                                 RTE_STR(CRYPTODEV_NAME_SCHEDULER_PMD),
14379                                         vdev_args);
14380                         TEST_ASSERT(ret == 0,
14381                                 "Failed to create instance %u of pmd : %s",
14382                                 i, RTE_STR(CRYPTODEV_NAME_SCHEDULER_PMD));
14383                 }
14384         }
14385         return testsuite_setup();
14386 }
14387
14388 static int
14389 test_scheduler_attach_worker_op(void)
14390 {
14391         struct crypto_testsuite_params *ts_params = &testsuite_params;
14392         uint8_t sched_id = ts_params->valid_devs[0];
14393         uint32_t i, nb_devs_attached = 0;
14394         int ret;
14395         char vdev_name[32];
14396         unsigned int count = rte_cryptodev_count();
14397
14398         /* create 2 AESNI_MB vdevs on top of existing devices */
14399         for (i = count; i < count + 2; i++) {
14400                 snprintf(vdev_name, sizeof(vdev_name), "%s_%u",
14401                                 RTE_STR(CRYPTODEV_NAME_AESNI_MB_PMD),
14402                                 i);
14403                 ret = rte_vdev_init(vdev_name, NULL);
14404
14405                 TEST_ASSERT(ret == 0,
14406                         "Failed to create instance %u of"
14407                         " pmd : %s",
14408                         i, RTE_STR(CRYPTODEV_NAME_AESNI_MB_PMD));
14409
14410                 if (ret < 0) {
14411                         RTE_LOG(ERR, USER1,
14412                                 "Failed to create 2 AESNI MB PMDs.\n");
14413                         return TEST_SKIPPED;
14414                 }
14415         }
14416
14417         /* attach 2 AESNI_MB cdevs */
14418         for (i = count; i < count + 2; i++) {
14419                 struct rte_cryptodev_info info;
14420                 unsigned int session_size;
14421
14422                 rte_cryptodev_info_get(i, &info);
14423                 if (info.driver_id != rte_cryptodev_driver_id_get(
14424                                 RTE_STR(CRYPTODEV_NAME_AESNI_MB_PMD)))
14425                         continue;
14426
14427                 session_size = rte_cryptodev_sym_get_private_session_size(i);
14428                 /*
14429                  * Create the session mempool again, since now there are new devices
14430                  * to use the mempool.
14431                  */
14432                 if (ts_params->session_mpool) {
14433                         rte_mempool_free(ts_params->session_mpool);
14434                         ts_params->session_mpool = NULL;
14435                 }
14436                 if (ts_params->session_priv_mpool) {
14437                         rte_mempool_free(ts_params->session_priv_mpool);
14438                         ts_params->session_priv_mpool = NULL;
14439                 }
14440
14441                 if (info.sym.max_nb_sessions != 0 &&
14442                                 info.sym.max_nb_sessions < MAX_NB_SESSIONS) {
14443                         RTE_LOG(ERR, USER1,
14444                                         "Device does not support "
14445                                         "at least %u sessions\n",
14446                                         MAX_NB_SESSIONS);
14447                         return TEST_FAILED;
14448                 }
14449                 /*
14450                  * Create mempool with maximum number of sessions,
14451                  * to include the session headers
14452                  */
14453                 if (ts_params->session_mpool == NULL) {
14454                         ts_params->session_mpool =
14455                                 rte_cryptodev_sym_session_pool_create(
14456                                                 "test_sess_mp",
14457                                                 MAX_NB_SESSIONS, 0, 0, 0,
14458                                                 SOCKET_ID_ANY);
14459                         TEST_ASSERT_NOT_NULL(ts_params->session_mpool,
14460                                         "session mempool allocation failed");
14461                 }
14462
14463                 /*
14464                  * Create mempool with maximum number of sessions,
14465                  * to include device specific session private data
14466                  */
14467                 if (ts_params->session_priv_mpool == NULL) {
14468                         ts_params->session_priv_mpool = rte_mempool_create(
14469                                         "test_sess_mp_priv",
14470                                         MAX_NB_SESSIONS,
14471                                         session_size,
14472                                         0, 0, NULL, NULL, NULL,
14473                                         NULL, SOCKET_ID_ANY,
14474                                         0);
14475
14476                         TEST_ASSERT_NOT_NULL(ts_params->session_priv_mpool,
14477                                         "session mempool allocation failed");
14478                 }
14479
14480                 ts_params->qp_conf.mp_session = ts_params->session_mpool;
14481                 ts_params->qp_conf.mp_session_private =
14482                                 ts_params->session_priv_mpool;
14483
14484                 ret = rte_cryptodev_scheduler_worker_attach(sched_id,
14485                                 (uint8_t)i);
14486
14487                 TEST_ASSERT(ret == 0,
14488                         "Failed to attach device %u of pmd : %s", i,
14489                         RTE_STR(CRYPTODEV_NAME_AESNI_MB_PMD));
14490
14491                 aesni_ids[nb_devs_attached] = (uint8_t)i;
14492
14493                 nb_devs_attached++;
14494         }
14495
14496         return 0;
14497 }
14498
14499 static int
14500 test_scheduler_detach_worker_op(void)
14501 {
14502         struct crypto_testsuite_params *ts_params = &testsuite_params;
14503         uint8_t sched_id = ts_params->valid_devs[0];
14504         uint32_t i;
14505         int ret;
14506
14507         for (i = 0; i < 2; i++) {
14508                 ret = rte_cryptodev_scheduler_worker_detach(sched_id,
14509                                 aesni_ids[i]);
14510                 TEST_ASSERT(ret == 0,
14511                         "Failed to detach device %u", aesni_ids[i]);
14512         }
14513
14514         return 0;
14515 }
14516
14517 static int
14518 test_scheduler_mode_op(enum rte_cryptodev_scheduler_mode scheduler_mode)
14519 {
14520         struct crypto_testsuite_params *ts_params = &testsuite_params;
14521         uint8_t sched_id = ts_params->valid_devs[0];
14522         /* set mode */
14523         return rte_cryptodev_scheduler_mode_set(sched_id,
14524                 scheduler_mode);
14525 }
14526
14527 static int
14528 test_scheduler_mode_roundrobin_op(void)
14529 {
14530         TEST_ASSERT(test_scheduler_mode_op(CDEV_SCHED_MODE_ROUNDROBIN) ==
14531                         0, "Failed to set roundrobin mode");
14532         return 0;
14533
14534 }
14535
14536 static int
14537 test_scheduler_mode_multicore_op(void)
14538 {
14539         TEST_ASSERT(test_scheduler_mode_op(CDEV_SCHED_MODE_MULTICORE) ==
14540                         0, "Failed to set multicore mode");
14541
14542         return 0;
14543 }
14544
14545 static int
14546 test_scheduler_mode_failover_op(void)
14547 {
14548         TEST_ASSERT(test_scheduler_mode_op(CDEV_SCHED_MODE_FAILOVER) ==
14549                         0, "Failed to set failover mode");
14550
14551         return 0;
14552 }
14553
14554 static int
14555 test_scheduler_mode_pkt_size_distr_op(void)
14556 {
14557         TEST_ASSERT(test_scheduler_mode_op(CDEV_SCHED_MODE_PKT_SIZE_DISTR) ==
14558                         0, "Failed to set pktsize mode");
14559
14560         return 0;
14561 }
14562
14563 static int
14564 scheduler_multicore_testsuite_setup(void)
14565 {
14566         if (test_scheduler_attach_worker_op() < 0)
14567                 return TEST_SKIPPED;
14568         if (test_scheduler_mode_op(CDEV_SCHED_MODE_MULTICORE) < 0)
14569                 return TEST_SKIPPED;
14570         return 0;
14571 }
14572
14573 static int
14574 scheduler_roundrobin_testsuite_setup(void)
14575 {
14576         if (test_scheduler_attach_worker_op() < 0)
14577                 return TEST_SKIPPED;
14578         if (test_scheduler_mode_op(CDEV_SCHED_MODE_ROUNDROBIN) < 0)
14579                 return TEST_SKIPPED;
14580         return 0;
14581 }
14582
14583 static int
14584 scheduler_failover_testsuite_setup(void)
14585 {
14586         if (test_scheduler_attach_worker_op() < 0)
14587                 return TEST_SKIPPED;
14588         if (test_scheduler_mode_op(CDEV_SCHED_MODE_FAILOVER) < 0)
14589                 return TEST_SKIPPED;
14590         return 0;
14591 }
14592
14593 static int
14594 scheduler_pkt_size_distr_testsuite_setup(void)
14595 {
14596         if (test_scheduler_attach_worker_op() < 0)
14597                 return TEST_SKIPPED;
14598         if (test_scheduler_mode_op(CDEV_SCHED_MODE_PKT_SIZE_DISTR) < 0)
14599                 return TEST_SKIPPED;
14600         return 0;
14601 }
14602
14603 static void
14604 scheduler_mode_testsuite_teardown(void)
14605 {
14606         test_scheduler_detach_worker_op();
14607 }
14608
14609 #endif /* RTE_CRYPTO_SCHEDULER */
14610
14611 static struct unit_test_suite end_testsuite = {
14612         .suite_name = NULL,
14613         .setup = NULL,
14614         .teardown = NULL,
14615         .unit_test_suites = NULL
14616 };
14617
14618 #ifdef RTE_LIB_SECURITY
14619 static struct unit_test_suite ipsec_proto_testsuite  = {
14620         .suite_name = "IPsec Proto Unit Test Suite",
14621         .setup = ipsec_proto_testsuite_setup,
14622         .unit_test_cases = {
14623                 TEST_CASE_NAMED_WITH_DATA(
14624                         "Outbound known vector (ESP tunnel mode IPv4 AES-GCM 128)",
14625                         ut_setup_security, ut_teardown,
14626                         test_ipsec_proto_known_vec, &pkt_aes_128_gcm),
14627                 TEST_CASE_NAMED_WITH_DATA(
14628                         "Outbound known vector (ESP tunnel mode IPv4 AES-GCM 192)",
14629                         ut_setup_security, ut_teardown,
14630                         test_ipsec_proto_known_vec, &pkt_aes_192_gcm),
14631                 TEST_CASE_NAMED_WITH_DATA(
14632                         "Outbound known vector (ESP tunnel mode IPv4 AES-GCM 256)",
14633                         ut_setup_security, ut_teardown,
14634                         test_ipsec_proto_known_vec, &pkt_aes_256_gcm),
14635                 TEST_CASE_NAMED_WITH_DATA(
14636                         "Outbound known vector (ESP tunnel mode IPv4 AES-CBC 128 HMAC-SHA256 [16B ICV])",
14637                         ut_setup_security, ut_teardown,
14638                         test_ipsec_proto_known_vec,
14639                         &pkt_aes_128_cbc_hmac_sha256),
14640                 TEST_CASE_NAMED_WITH_DATA(
14641                         "Outbound known vector (ESP tunnel mode IPv4 AES-CBC 128 HMAC-SHA384 [24B ICV])",
14642                         ut_setup_security, ut_teardown,
14643                         test_ipsec_proto_known_vec,
14644                         &pkt_aes_128_cbc_hmac_sha384),
14645                 TEST_CASE_NAMED_WITH_DATA(
14646                         "Outbound known vector (ESP tunnel mode IPv4 AES-CBC 128 HMAC-SHA512 [32B ICV])",
14647                         ut_setup_security, ut_teardown,
14648                         test_ipsec_proto_known_vec,
14649                         &pkt_aes_128_cbc_hmac_sha512),
14650                 TEST_CASE_NAMED_WITH_DATA(
14651                         "Outbound known vector (ESP tunnel mode IPv6 AES-GCM 128)",
14652                         ut_setup_security, ut_teardown,
14653                         test_ipsec_proto_known_vec, &pkt_aes_256_gcm_v6),
14654                 TEST_CASE_NAMED_WITH_DATA(
14655                         "Outbound known vector (ESP tunnel mode IPv6 AES-CBC 128 HMAC-SHA256 [16B ICV])",
14656                         ut_setup_security, ut_teardown,
14657                         test_ipsec_proto_known_vec,
14658                         &pkt_aes_128_cbc_hmac_sha256_v6),
14659                 TEST_CASE_NAMED_WITH_DATA(
14660                         "Outbound known vector (ESP tunnel mode IPv4 NULL AES-XCBC-MAC [12B ICV])",
14661                         ut_setup_security, ut_teardown,
14662                         test_ipsec_proto_known_vec,
14663                         &pkt_null_aes_xcbc),
14664                 TEST_CASE_NAMED_WITH_DATA(
14665                         "Outbound fragmented packet",
14666                         ut_setup_security, ut_teardown,
14667                         test_ipsec_proto_known_vec_fragmented,
14668                         &pkt_aes_128_gcm_frag),
14669                 TEST_CASE_NAMED_WITH_DATA(
14670                         "Inbound known vector (ESP tunnel mode IPv4 AES-GCM 128)",
14671                         ut_setup_security, ut_teardown,
14672                         test_ipsec_proto_known_vec_inb, &pkt_aes_128_gcm),
14673                 TEST_CASE_NAMED_WITH_DATA(
14674                         "Inbound known vector (ESP tunnel mode IPv4 AES-GCM 192)",
14675                         ut_setup_security, ut_teardown,
14676                         test_ipsec_proto_known_vec_inb, &pkt_aes_192_gcm),
14677                 TEST_CASE_NAMED_WITH_DATA(
14678                         "Inbound known vector (ESP tunnel mode IPv4 AES-GCM 256)",
14679                         ut_setup_security, ut_teardown,
14680                         test_ipsec_proto_known_vec_inb, &pkt_aes_256_gcm),
14681                 TEST_CASE_NAMED_WITH_DATA(
14682                         "Inbound known vector (ESP tunnel mode IPv4 AES-CBC 128)",
14683                         ut_setup_security, ut_teardown,
14684                         test_ipsec_proto_known_vec_inb, &pkt_aes_128_cbc_null),
14685                 TEST_CASE_NAMED_WITH_DATA(
14686                         "Inbound known vector (ESP tunnel mode IPv4 AES-CBC 128 HMAC-SHA256 [16B ICV])",
14687                         ut_setup_security, ut_teardown,
14688                         test_ipsec_proto_known_vec_inb,
14689                         &pkt_aes_128_cbc_hmac_sha256),
14690                 TEST_CASE_NAMED_WITH_DATA(
14691                         "Inbound known vector (ESP tunnel mode IPv4 AES-CBC 128 HMAC-SHA384 [24B ICV])",
14692                         ut_setup_security, ut_teardown,
14693                         test_ipsec_proto_known_vec_inb,
14694                         &pkt_aes_128_cbc_hmac_sha384),
14695                 TEST_CASE_NAMED_WITH_DATA(
14696                         "Inbound known vector (ESP tunnel mode IPv4 AES-CBC 128 HMAC-SHA512 [32B ICV])",
14697                         ut_setup_security, ut_teardown,
14698                         test_ipsec_proto_known_vec_inb,
14699                         &pkt_aes_128_cbc_hmac_sha512),
14700                 TEST_CASE_NAMED_WITH_DATA(
14701                         "Inbound known vector (ESP tunnel mode IPv6 AES-GCM 128)",
14702                         ut_setup_security, ut_teardown,
14703                         test_ipsec_proto_known_vec_inb, &pkt_aes_256_gcm_v6),
14704                 TEST_CASE_NAMED_WITH_DATA(
14705                         "Inbound known vector (ESP tunnel mode IPv6 AES-CBC 128 HMAC-SHA256 [16B ICV])",
14706                         ut_setup_security, ut_teardown,
14707                         test_ipsec_proto_known_vec_inb,
14708                         &pkt_aes_128_cbc_hmac_sha256_v6),
14709                 TEST_CASE_NAMED_WITH_DATA(
14710                         "Inbound known vector (ESP tunnel mode IPv4 NULL AES-XCBC-MAC [12B ICV])",
14711                         ut_setup_security, ut_teardown,
14712                         test_ipsec_proto_known_vec_inb,
14713                         &pkt_null_aes_xcbc),
14714                 TEST_CASE_NAMED_ST(
14715                         "Combined test alg list",
14716                         ut_setup_security, ut_teardown,
14717                         test_ipsec_proto_display_list),
14718                 TEST_CASE_NAMED_ST(
14719                         "IV generation",
14720                         ut_setup_security, ut_teardown,
14721                         test_ipsec_proto_iv_gen),
14722                 TEST_CASE_NAMED_ST(
14723                         "UDP encapsulation",
14724                         ut_setup_security, ut_teardown,
14725                         test_ipsec_proto_udp_encap),
14726                 TEST_CASE_NAMED_ST(
14727                         "UDP encapsulation ports verification test",
14728                         ut_setup_security, ut_teardown,
14729                         test_ipsec_proto_udp_ports_verify),
14730                 TEST_CASE_NAMED_ST(
14731                         "SA expiry packets soft",
14732                         ut_setup_security, ut_teardown,
14733                         test_ipsec_proto_sa_exp_pkts_soft),
14734                 TEST_CASE_NAMED_ST(
14735                         "SA expiry packets hard",
14736                         ut_setup_security, ut_teardown,
14737                         test_ipsec_proto_sa_exp_pkts_hard),
14738                 TEST_CASE_NAMED_ST(
14739                         "Negative test: ICV corruption",
14740                         ut_setup_security, ut_teardown,
14741                         test_ipsec_proto_err_icv_corrupt),
14742                 TEST_CASE_NAMED_ST(
14743                         "Tunnel dst addr verification",
14744                         ut_setup_security, ut_teardown,
14745                         test_ipsec_proto_tunnel_dst_addr_verify),
14746                 TEST_CASE_NAMED_ST(
14747                         "Tunnel src and dst addr verification",
14748                         ut_setup_security, ut_teardown,
14749                         test_ipsec_proto_tunnel_src_dst_addr_verify),
14750                 TEST_CASE_NAMED_ST(
14751                         "Inner IP checksum",
14752                         ut_setup_security, ut_teardown,
14753                         test_ipsec_proto_inner_ip_csum),
14754                 TEST_CASE_NAMED_ST(
14755                         "Inner L4 checksum",
14756                         ut_setup_security, ut_teardown,
14757                         test_ipsec_proto_inner_l4_csum),
14758                 TEST_CASE_NAMED_ST(
14759                         "Tunnel IPv4 in IPv4",
14760                         ut_setup_security, ut_teardown,
14761                         test_ipsec_proto_tunnel_v4_in_v4),
14762                 TEST_CASE_NAMED_ST(
14763                         "Tunnel IPv6 in IPv6",
14764                         ut_setup_security, ut_teardown,
14765                         test_ipsec_proto_tunnel_v6_in_v6),
14766                 TEST_CASE_NAMED_ST(
14767                         "Tunnel IPv4 in IPv6",
14768                         ut_setup_security, ut_teardown,
14769                         test_ipsec_proto_tunnel_v4_in_v6),
14770                 TEST_CASE_NAMED_ST(
14771                         "Tunnel IPv6 in IPv4",
14772                         ut_setup_security, ut_teardown,
14773                         test_ipsec_proto_tunnel_v6_in_v4),
14774                 TEST_CASE_NAMED_ST(
14775                         "Transport IPv4",
14776                         ut_setup_security, ut_teardown,
14777                         test_ipsec_proto_transport_v4),
14778                 TEST_CASE_NAMED_ST(
14779                         "Statistics: success",
14780                         ut_setup_security, ut_teardown,
14781                         test_ipsec_proto_stats),
14782                 TEST_CASE_NAMED_ST(
14783                         "Fragmented packet",
14784                         ut_setup_security, ut_teardown,
14785                         test_ipsec_proto_pkt_fragment),
14786                 TEST_CASE_NAMED_ST(
14787                         "Tunnel header copy DF (inner 0)",
14788                         ut_setup_security, ut_teardown,
14789                         test_ipsec_proto_copy_df_inner_0),
14790                 TEST_CASE_NAMED_ST(
14791                         "Tunnel header copy DF (inner 1)",
14792                         ut_setup_security, ut_teardown,
14793                         test_ipsec_proto_copy_df_inner_1),
14794                 TEST_CASE_NAMED_ST(
14795                         "Tunnel header set DF 0 (inner 1)",
14796                         ut_setup_security, ut_teardown,
14797                         test_ipsec_proto_set_df_0_inner_1),
14798                 TEST_CASE_NAMED_ST(
14799                         "Tunnel header set DF 1 (inner 0)",
14800                         ut_setup_security, ut_teardown,
14801                         test_ipsec_proto_set_df_1_inner_0),
14802                 TEST_CASES_END() /**< NULL terminate unit test array */
14803         }
14804 };
14805
14806 static struct unit_test_suite pdcp_proto_testsuite  = {
14807         .suite_name = "PDCP Proto Unit Test Suite",
14808         .setup = pdcp_proto_testsuite_setup,
14809         .unit_test_cases = {
14810                 TEST_CASE_ST(ut_setup_security, ut_teardown,
14811                         test_PDCP_PROTO_all),
14812                 TEST_CASES_END() /**< NULL terminate unit test array */
14813         }
14814 };
14815
14816 #define ADD_UPLINK_TESTCASE(data)                                               \
14817         TEST_CASE_NAMED_WITH_DATA(data.test_descr_uplink, ut_setup_security,    \
14818         ut_teardown, test_docsis_proto_uplink, (const void *) &data),           \
14819
14820 #define ADD_DOWNLINK_TESTCASE(data)                                             \
14821         TEST_CASE_NAMED_WITH_DATA(data.test_descr_downlink, ut_setup_security,  \
14822         ut_teardown, test_docsis_proto_downlink, (const void *) &data),         \
14823
14824 static struct unit_test_suite docsis_proto_testsuite  = {
14825         .suite_name = "DOCSIS Proto Unit Test Suite",
14826         .setup = docsis_proto_testsuite_setup,
14827         .unit_test_cases = {
14828                 /* Uplink */
14829                 ADD_UPLINK_TESTCASE(docsis_test_case_1)
14830                 ADD_UPLINK_TESTCASE(docsis_test_case_2)
14831                 ADD_UPLINK_TESTCASE(docsis_test_case_3)
14832                 ADD_UPLINK_TESTCASE(docsis_test_case_4)
14833                 ADD_UPLINK_TESTCASE(docsis_test_case_5)
14834                 ADD_UPLINK_TESTCASE(docsis_test_case_6)
14835                 ADD_UPLINK_TESTCASE(docsis_test_case_7)
14836                 ADD_UPLINK_TESTCASE(docsis_test_case_8)
14837                 ADD_UPLINK_TESTCASE(docsis_test_case_9)
14838                 ADD_UPLINK_TESTCASE(docsis_test_case_10)
14839                 ADD_UPLINK_TESTCASE(docsis_test_case_11)
14840                 ADD_UPLINK_TESTCASE(docsis_test_case_12)
14841                 ADD_UPLINK_TESTCASE(docsis_test_case_13)
14842                 ADD_UPLINK_TESTCASE(docsis_test_case_14)
14843                 ADD_UPLINK_TESTCASE(docsis_test_case_15)
14844                 ADD_UPLINK_TESTCASE(docsis_test_case_16)
14845                 ADD_UPLINK_TESTCASE(docsis_test_case_17)
14846                 ADD_UPLINK_TESTCASE(docsis_test_case_18)
14847                 ADD_UPLINK_TESTCASE(docsis_test_case_19)
14848                 ADD_UPLINK_TESTCASE(docsis_test_case_20)
14849                 ADD_UPLINK_TESTCASE(docsis_test_case_21)
14850                 ADD_UPLINK_TESTCASE(docsis_test_case_22)
14851                 ADD_UPLINK_TESTCASE(docsis_test_case_23)
14852                 ADD_UPLINK_TESTCASE(docsis_test_case_24)
14853                 ADD_UPLINK_TESTCASE(docsis_test_case_25)
14854                 ADD_UPLINK_TESTCASE(docsis_test_case_26)
14855                 /* Downlink */
14856                 ADD_DOWNLINK_TESTCASE(docsis_test_case_1)
14857                 ADD_DOWNLINK_TESTCASE(docsis_test_case_2)
14858                 ADD_DOWNLINK_TESTCASE(docsis_test_case_3)
14859                 ADD_DOWNLINK_TESTCASE(docsis_test_case_4)
14860                 ADD_DOWNLINK_TESTCASE(docsis_test_case_5)
14861                 ADD_DOWNLINK_TESTCASE(docsis_test_case_6)
14862                 ADD_DOWNLINK_TESTCASE(docsis_test_case_7)
14863                 ADD_DOWNLINK_TESTCASE(docsis_test_case_8)
14864                 ADD_DOWNLINK_TESTCASE(docsis_test_case_9)
14865                 ADD_DOWNLINK_TESTCASE(docsis_test_case_10)
14866                 ADD_DOWNLINK_TESTCASE(docsis_test_case_11)
14867                 ADD_DOWNLINK_TESTCASE(docsis_test_case_12)
14868                 ADD_DOWNLINK_TESTCASE(docsis_test_case_13)
14869                 ADD_DOWNLINK_TESTCASE(docsis_test_case_14)
14870                 ADD_DOWNLINK_TESTCASE(docsis_test_case_15)
14871                 ADD_DOWNLINK_TESTCASE(docsis_test_case_16)
14872                 ADD_DOWNLINK_TESTCASE(docsis_test_case_17)
14873                 ADD_DOWNLINK_TESTCASE(docsis_test_case_18)
14874                 ADD_DOWNLINK_TESTCASE(docsis_test_case_19)
14875                 ADD_DOWNLINK_TESTCASE(docsis_test_case_20)
14876                 ADD_DOWNLINK_TESTCASE(docsis_test_case_21)
14877                 ADD_DOWNLINK_TESTCASE(docsis_test_case_22)
14878                 ADD_DOWNLINK_TESTCASE(docsis_test_case_23)
14879                 ADD_DOWNLINK_TESTCASE(docsis_test_case_24)
14880                 ADD_DOWNLINK_TESTCASE(docsis_test_case_25)
14881                 ADD_DOWNLINK_TESTCASE(docsis_test_case_26)
14882                 TEST_CASES_END() /**< NULL terminate unit test array */
14883         }
14884 };
14885 #endif
14886
14887 static struct unit_test_suite cryptodev_gen_testsuite  = {
14888         .suite_name = "Crypto General Unit Test Suite",
14889         .setup = crypto_gen_testsuite_setup,
14890         .unit_test_cases = {
14891                 TEST_CASE_ST(ut_setup, ut_teardown,
14892                                 test_device_configure_invalid_dev_id),
14893                 TEST_CASE_ST(ut_setup, ut_teardown,
14894                                 test_queue_pair_descriptor_setup),
14895                 TEST_CASE_ST(ut_setup, ut_teardown,
14896                                 test_device_configure_invalid_queue_pair_ids),
14897                 TEST_CASE_ST(ut_setup, ut_teardown, test_stats),
14898                 TEST_CASE_ST(ut_setup, ut_teardown, test_enq_callback_setup),
14899                 TEST_CASE_ST(ut_setup, ut_teardown, test_deq_callback_setup),
14900                 TEST_CASES_END() /**< NULL terminate unit test array */
14901         }
14902 };
14903
14904 static struct unit_test_suite cryptodev_negative_hmac_sha1_testsuite = {
14905         .suite_name = "Negative HMAC SHA1 Unit Test Suite",
14906         .setup = negative_hmac_sha1_testsuite_setup,
14907         .unit_test_cases = {
14908                 /** Negative tests */
14909                 TEST_CASE_ST(ut_setup, ut_teardown,
14910                         authentication_verify_HMAC_SHA1_fail_data_corrupt),
14911                 TEST_CASE_ST(ut_setup, ut_teardown,
14912                         authentication_verify_HMAC_SHA1_fail_tag_corrupt),
14913                 TEST_CASE_ST(ut_setup, ut_teardown,
14914                         auth_decryption_AES128CBC_HMAC_SHA1_fail_data_corrupt),
14915                 TEST_CASE_ST(ut_setup, ut_teardown,
14916                         auth_decryption_AES128CBC_HMAC_SHA1_fail_tag_corrupt),
14917
14918                 TEST_CASES_END() /**< NULL terminate unit test array */
14919         }
14920 };
14921
14922 static struct unit_test_suite cryptodev_multi_session_testsuite = {
14923         .suite_name = "Multi Session Unit Test Suite",
14924         .setup = multi_session_testsuite_setup,
14925         .unit_test_cases = {
14926                 TEST_CASE_ST(ut_setup, ut_teardown, test_multi_session),
14927                 TEST_CASE_ST(ut_setup, ut_teardown,
14928                                 test_multi_session_random_usage),
14929
14930                 TEST_CASES_END() /**< NULL terminate unit test array */
14931         }
14932 };
14933
14934 static struct unit_test_suite cryptodev_null_testsuite  = {
14935         .suite_name = "NULL Test Suite",
14936         .setup = null_testsuite_setup,
14937         .unit_test_cases = {
14938                 TEST_CASE_ST(ut_setup, ut_teardown,
14939                         test_null_invalid_operation),
14940                 TEST_CASE_ST(ut_setup, ut_teardown, test_null_burst_operation),
14941                 TEST_CASES_END()
14942         }
14943 };
14944
14945 static struct unit_test_suite cryptodev_aes_ccm_auth_testsuite  = {
14946         .suite_name = "AES CCM Authenticated Test Suite",
14947         .setup = aes_ccm_auth_testsuite_setup,
14948         .unit_test_cases = {
14949                 /** AES CCM Authenticated Encryption 128 bits key*/
14950                 TEST_CASE_ST(ut_setup, ut_teardown,
14951                         test_AES_CCM_authenticated_encryption_test_case_128_1),
14952                 TEST_CASE_ST(ut_setup, ut_teardown,
14953                         test_AES_CCM_authenticated_encryption_test_case_128_2),
14954                 TEST_CASE_ST(ut_setup, ut_teardown,
14955                         test_AES_CCM_authenticated_encryption_test_case_128_3),
14956
14957                 /** AES CCM Authenticated Decryption 128 bits key*/
14958                 TEST_CASE_ST(ut_setup, ut_teardown,
14959                         test_AES_CCM_authenticated_decryption_test_case_128_1),
14960                 TEST_CASE_ST(ut_setup, ut_teardown,
14961                         test_AES_CCM_authenticated_decryption_test_case_128_2),
14962                 TEST_CASE_ST(ut_setup, ut_teardown,
14963                         test_AES_CCM_authenticated_decryption_test_case_128_3),
14964
14965                 /** AES CCM Authenticated Encryption 192 bits key */
14966                 TEST_CASE_ST(ut_setup, ut_teardown,
14967                         test_AES_CCM_authenticated_encryption_test_case_192_1),
14968                 TEST_CASE_ST(ut_setup, ut_teardown,
14969                         test_AES_CCM_authenticated_encryption_test_case_192_2),
14970                 TEST_CASE_ST(ut_setup, ut_teardown,
14971                         test_AES_CCM_authenticated_encryption_test_case_192_3),
14972
14973                 /** AES CCM Authenticated Decryption 192 bits key*/
14974                 TEST_CASE_ST(ut_setup, ut_teardown,
14975                         test_AES_CCM_authenticated_decryption_test_case_192_1),
14976                 TEST_CASE_ST(ut_setup, ut_teardown,
14977                         test_AES_CCM_authenticated_decryption_test_case_192_2),
14978                 TEST_CASE_ST(ut_setup, ut_teardown,
14979                         test_AES_CCM_authenticated_decryption_test_case_192_3),
14980
14981                 /** AES CCM Authenticated Encryption 256 bits key */
14982                 TEST_CASE_ST(ut_setup, ut_teardown,
14983                         test_AES_CCM_authenticated_encryption_test_case_256_1),
14984                 TEST_CASE_ST(ut_setup, ut_teardown,
14985                         test_AES_CCM_authenticated_encryption_test_case_256_2),
14986                 TEST_CASE_ST(ut_setup, ut_teardown,
14987                         test_AES_CCM_authenticated_encryption_test_case_256_3),
14988
14989                 /** AES CCM Authenticated Decryption 256 bits key*/
14990                 TEST_CASE_ST(ut_setup, ut_teardown,
14991                         test_AES_CCM_authenticated_decryption_test_case_256_1),
14992                 TEST_CASE_ST(ut_setup, ut_teardown,
14993                         test_AES_CCM_authenticated_decryption_test_case_256_2),
14994                 TEST_CASE_ST(ut_setup, ut_teardown,
14995                         test_AES_CCM_authenticated_decryption_test_case_256_3),
14996                 TEST_CASES_END()
14997         }
14998 };
14999
15000 static struct unit_test_suite cryptodev_aes_gcm_auth_testsuite  = {
15001         .suite_name = "AES GCM Authenticated Test Suite",
15002         .setup = aes_gcm_auth_testsuite_setup,
15003         .unit_test_cases = {
15004                 /** AES GCM Authenticated Encryption */
15005                 TEST_CASE_ST(ut_setup, ut_teardown,
15006                         test_AES_GCM_auth_encrypt_SGL_in_place_1500B),
15007                 TEST_CASE_ST(ut_setup, ut_teardown,
15008                         test_AES_GCM_auth_encrypt_SGL_out_of_place_400B_400B),
15009                 TEST_CASE_ST(ut_setup, ut_teardown,
15010                         test_AES_GCM_auth_encrypt_SGL_out_of_place_1500B_2000B),
15011                 TEST_CASE_ST(ut_setup, ut_teardown,
15012                         test_AES_GCM_auth_encrypt_SGL_out_of_place_400B_1seg),
15013                 TEST_CASE_ST(ut_setup, ut_teardown,
15014                         test_AES_GCM_authenticated_encryption_test_case_1),
15015                 TEST_CASE_ST(ut_setup, ut_teardown,
15016                         test_AES_GCM_authenticated_encryption_test_case_2),
15017                 TEST_CASE_ST(ut_setup, ut_teardown,
15018                         test_AES_GCM_authenticated_encryption_test_case_3),
15019                 TEST_CASE_ST(ut_setup, ut_teardown,
15020                         test_AES_GCM_authenticated_encryption_test_case_4),
15021                 TEST_CASE_ST(ut_setup, ut_teardown,
15022                         test_AES_GCM_authenticated_encryption_test_case_5),
15023                 TEST_CASE_ST(ut_setup, ut_teardown,
15024                         test_AES_GCM_authenticated_encryption_test_case_6),
15025                 TEST_CASE_ST(ut_setup, ut_teardown,
15026                         test_AES_GCM_authenticated_encryption_test_case_7),
15027                 TEST_CASE_ST(ut_setup, ut_teardown,
15028                         test_AES_GCM_authenticated_encryption_test_case_8),
15029                 TEST_CASE_ST(ut_setup, ut_teardown,
15030                         test_AES_GCM_J0_authenticated_encryption_test_case_1),
15031
15032                 /** AES GCM Authenticated Decryption */
15033                 TEST_CASE_ST(ut_setup, ut_teardown,
15034                         test_AES_GCM_authenticated_decryption_test_case_1),
15035                 TEST_CASE_ST(ut_setup, ut_teardown,
15036                         test_AES_GCM_authenticated_decryption_test_case_2),
15037                 TEST_CASE_ST(ut_setup, ut_teardown,
15038                         test_AES_GCM_authenticated_decryption_test_case_3),
15039                 TEST_CASE_ST(ut_setup, ut_teardown,
15040                         test_AES_GCM_authenticated_decryption_test_case_4),
15041                 TEST_CASE_ST(ut_setup, ut_teardown,
15042                         test_AES_GCM_authenticated_decryption_test_case_5),
15043                 TEST_CASE_ST(ut_setup, ut_teardown,
15044                         test_AES_GCM_authenticated_decryption_test_case_6),
15045                 TEST_CASE_ST(ut_setup, ut_teardown,
15046                         test_AES_GCM_authenticated_decryption_test_case_7),
15047                 TEST_CASE_ST(ut_setup, ut_teardown,
15048                         test_AES_GCM_authenticated_decryption_test_case_8),
15049                 TEST_CASE_ST(ut_setup, ut_teardown,
15050                         test_AES_GCM_J0_authenticated_decryption_test_case_1),
15051
15052                 /** AES GCM Authenticated Encryption 192 bits key */
15053                 TEST_CASE_ST(ut_setup, ut_teardown,
15054                         test_AES_GCM_auth_encryption_test_case_192_1),
15055                 TEST_CASE_ST(ut_setup, ut_teardown,
15056                         test_AES_GCM_auth_encryption_test_case_192_2),
15057                 TEST_CASE_ST(ut_setup, ut_teardown,
15058                         test_AES_GCM_auth_encryption_test_case_192_3),
15059                 TEST_CASE_ST(ut_setup, ut_teardown,
15060                         test_AES_GCM_auth_encryption_test_case_192_4),
15061                 TEST_CASE_ST(ut_setup, ut_teardown,
15062                         test_AES_GCM_auth_encryption_test_case_192_5),
15063                 TEST_CASE_ST(ut_setup, ut_teardown,
15064                         test_AES_GCM_auth_encryption_test_case_192_6),
15065                 TEST_CASE_ST(ut_setup, ut_teardown,
15066                         test_AES_GCM_auth_encryption_test_case_192_7),
15067
15068                 /** AES GCM Authenticated Decryption 192 bits key */
15069                 TEST_CASE_ST(ut_setup, ut_teardown,
15070                         test_AES_GCM_auth_decryption_test_case_192_1),
15071                 TEST_CASE_ST(ut_setup, ut_teardown,
15072                         test_AES_GCM_auth_decryption_test_case_192_2),
15073                 TEST_CASE_ST(ut_setup, ut_teardown,
15074                         test_AES_GCM_auth_decryption_test_case_192_3),
15075                 TEST_CASE_ST(ut_setup, ut_teardown,
15076                         test_AES_GCM_auth_decryption_test_case_192_4),
15077                 TEST_CASE_ST(ut_setup, ut_teardown,
15078                         test_AES_GCM_auth_decryption_test_case_192_5),
15079                 TEST_CASE_ST(ut_setup, ut_teardown,
15080                         test_AES_GCM_auth_decryption_test_case_192_6),
15081                 TEST_CASE_ST(ut_setup, ut_teardown,
15082                         test_AES_GCM_auth_decryption_test_case_192_7),
15083
15084                 /** AES GCM Authenticated Encryption 256 bits key */
15085                 TEST_CASE_ST(ut_setup, ut_teardown,
15086                         test_AES_GCM_auth_encryption_test_case_256_1),
15087                 TEST_CASE_ST(ut_setup, ut_teardown,
15088                         test_AES_GCM_auth_encryption_test_case_256_2),
15089                 TEST_CASE_ST(ut_setup, ut_teardown,
15090                         test_AES_GCM_auth_encryption_test_case_256_3),
15091                 TEST_CASE_ST(ut_setup, ut_teardown,
15092                         test_AES_GCM_auth_encryption_test_case_256_4),
15093                 TEST_CASE_ST(ut_setup, ut_teardown,
15094                         test_AES_GCM_auth_encryption_test_case_256_5),
15095                 TEST_CASE_ST(ut_setup, ut_teardown,
15096                         test_AES_GCM_auth_encryption_test_case_256_6),
15097                 TEST_CASE_ST(ut_setup, ut_teardown,
15098                         test_AES_GCM_auth_encryption_test_case_256_7),
15099
15100                 /** AES GCM Authenticated Decryption 256 bits key */
15101                 TEST_CASE_ST(ut_setup, ut_teardown,
15102                         test_AES_GCM_auth_decryption_test_case_256_1),
15103                 TEST_CASE_ST(ut_setup, ut_teardown,
15104                         test_AES_GCM_auth_decryption_test_case_256_2),
15105                 TEST_CASE_ST(ut_setup, ut_teardown,
15106                         test_AES_GCM_auth_decryption_test_case_256_3),
15107                 TEST_CASE_ST(ut_setup, ut_teardown,
15108                         test_AES_GCM_auth_decryption_test_case_256_4),
15109                 TEST_CASE_ST(ut_setup, ut_teardown,
15110                         test_AES_GCM_auth_decryption_test_case_256_5),
15111                 TEST_CASE_ST(ut_setup, ut_teardown,
15112                         test_AES_GCM_auth_decryption_test_case_256_6),
15113                 TEST_CASE_ST(ut_setup, ut_teardown,
15114                         test_AES_GCM_auth_decryption_test_case_256_7),
15115
15116                 /** AES GCM Authenticated Encryption big aad size */
15117                 TEST_CASE_ST(ut_setup, ut_teardown,
15118                         test_AES_GCM_auth_encryption_test_case_aad_1),
15119                 TEST_CASE_ST(ut_setup, ut_teardown,
15120                         test_AES_GCM_auth_encryption_test_case_aad_2),
15121
15122                 /** AES GCM Authenticated Decryption big aad size */
15123                 TEST_CASE_ST(ut_setup, ut_teardown,
15124                         test_AES_GCM_auth_decryption_test_case_aad_1),
15125                 TEST_CASE_ST(ut_setup, ut_teardown,
15126                         test_AES_GCM_auth_decryption_test_case_aad_2),
15127
15128                 /** Out of place tests */
15129                 TEST_CASE_ST(ut_setup, ut_teardown,
15130                         test_AES_GCM_authenticated_encryption_oop_test_case_1),
15131                 TEST_CASE_ST(ut_setup, ut_teardown,
15132                         test_AES_GCM_authenticated_decryption_oop_test_case_1),
15133
15134                 /** Session-less tests */
15135                 TEST_CASE_ST(ut_setup, ut_teardown,
15136                         test_AES_GCM_authenticated_encryption_sessionless_test_case_1),
15137                 TEST_CASE_ST(ut_setup, ut_teardown,
15138                         test_AES_GCM_authenticated_decryption_sessionless_test_case_1),
15139
15140                 TEST_CASES_END()
15141         }
15142 };
15143
15144 static struct unit_test_suite cryptodev_aes_gmac_auth_testsuite  = {
15145         .suite_name = "AES GMAC Authentication Test Suite",
15146         .setup = aes_gmac_auth_testsuite_setup,
15147         .unit_test_cases = {
15148                 TEST_CASE_ST(ut_setup, ut_teardown,
15149                         test_AES_GMAC_authentication_test_case_1),
15150                 TEST_CASE_ST(ut_setup, ut_teardown,
15151                         test_AES_GMAC_authentication_verify_test_case_1),
15152                 TEST_CASE_ST(ut_setup, ut_teardown,
15153                         test_AES_GMAC_authentication_test_case_2),
15154                 TEST_CASE_ST(ut_setup, ut_teardown,
15155                         test_AES_GMAC_authentication_verify_test_case_2),
15156                 TEST_CASE_ST(ut_setup, ut_teardown,
15157                         test_AES_GMAC_authentication_test_case_3),
15158                 TEST_CASE_ST(ut_setup, ut_teardown,
15159                         test_AES_GMAC_authentication_verify_test_case_3),
15160                 TEST_CASE_ST(ut_setup, ut_teardown,
15161                         test_AES_GMAC_authentication_test_case_4),
15162                 TEST_CASE_ST(ut_setup, ut_teardown,
15163                         test_AES_GMAC_authentication_verify_test_case_4),
15164                 TEST_CASE_ST(ut_setup, ut_teardown,
15165                         test_AES_GMAC_authentication_SGL_40B),
15166                 TEST_CASE_ST(ut_setup, ut_teardown,
15167                         test_AES_GMAC_authentication_SGL_80B),
15168                 TEST_CASE_ST(ut_setup, ut_teardown,
15169                         test_AES_GMAC_authentication_SGL_2048B),
15170                 TEST_CASE_ST(ut_setup, ut_teardown,
15171                         test_AES_GMAC_authentication_SGL_2047B),
15172
15173                 TEST_CASES_END()
15174         }
15175 };
15176
15177 static struct unit_test_suite cryptodev_chacha20_poly1305_testsuite  = {
15178         .suite_name = "Chacha20-Poly1305 Test Suite",
15179         .setup = chacha20_poly1305_testsuite_setup,
15180         .unit_test_cases = {
15181                 TEST_CASE_ST(ut_setup, ut_teardown,
15182                         test_chacha20_poly1305_encrypt_test_case_rfc8439),
15183                 TEST_CASE_ST(ut_setup, ut_teardown,
15184                         test_chacha20_poly1305_decrypt_test_case_rfc8439),
15185                 TEST_CASE_ST(ut_setup, ut_teardown,
15186                         test_chacha20_poly1305_encrypt_SGL_out_of_place),
15187                 TEST_CASES_END()
15188         }
15189 };
15190
15191 static struct unit_test_suite cryptodev_snow3g_testsuite  = {
15192         .suite_name = "SNOW 3G Test Suite",
15193         .setup = snow3g_testsuite_setup,
15194         .unit_test_cases = {
15195                 /** SNOW 3G encrypt only (UEA2) */
15196                 TEST_CASE_ST(ut_setup, ut_teardown,
15197                         test_snow3g_encryption_test_case_1),
15198                 TEST_CASE_ST(ut_setup, ut_teardown,
15199                         test_snow3g_encryption_test_case_2),
15200                 TEST_CASE_ST(ut_setup, ut_teardown,
15201                         test_snow3g_encryption_test_case_3),
15202                 TEST_CASE_ST(ut_setup, ut_teardown,
15203                         test_snow3g_encryption_test_case_4),
15204                 TEST_CASE_ST(ut_setup, ut_teardown,
15205                         test_snow3g_encryption_test_case_5),
15206
15207                 TEST_CASE_ST(ut_setup, ut_teardown,
15208                         test_snow3g_encryption_test_case_1_oop),
15209                 TEST_CASE_ST(ut_setup, ut_teardown,
15210                         test_snow3g_encryption_test_case_1_oop_sgl),
15211                 TEST_CASE_ST(ut_setup, ut_teardown,
15212                         test_snow3g_encryption_test_case_1_offset_oop),
15213                 TEST_CASE_ST(ut_setup, ut_teardown,
15214                         test_snow3g_decryption_test_case_1_oop),
15215
15216                 /** SNOW 3G generate auth, then encrypt (UEA2) */
15217                 TEST_CASE_ST(ut_setup, ut_teardown,
15218                         test_snow3g_auth_cipher_test_case_1),
15219                 TEST_CASE_ST(ut_setup, ut_teardown,
15220                         test_snow3g_auth_cipher_test_case_2),
15221                 TEST_CASE_ST(ut_setup, ut_teardown,
15222                         test_snow3g_auth_cipher_test_case_2_oop),
15223                 TEST_CASE_ST(ut_setup, ut_teardown,
15224                         test_snow3g_auth_cipher_part_digest_enc),
15225                 TEST_CASE_ST(ut_setup, ut_teardown,
15226                         test_snow3g_auth_cipher_part_digest_enc_oop),
15227                 TEST_CASE_ST(ut_setup, ut_teardown,
15228                         test_snow3g_auth_cipher_test_case_3_sgl),
15229                 TEST_CASE_ST(ut_setup, ut_teardown,
15230                         test_snow3g_auth_cipher_test_case_3_oop_sgl),
15231                 TEST_CASE_ST(ut_setup, ut_teardown,
15232                         test_snow3g_auth_cipher_part_digest_enc_sgl),
15233                 TEST_CASE_ST(ut_setup, ut_teardown,
15234                         test_snow3g_auth_cipher_part_digest_enc_oop_sgl),
15235
15236                 /** SNOW 3G decrypt (UEA2), then verify auth */
15237                 TEST_CASE_ST(ut_setup, ut_teardown,
15238                         test_snow3g_auth_cipher_verify_test_case_1),
15239                 TEST_CASE_ST(ut_setup, ut_teardown,
15240                         test_snow3g_auth_cipher_verify_test_case_2),
15241                 TEST_CASE_ST(ut_setup, ut_teardown,
15242                         test_snow3g_auth_cipher_verify_test_case_2_oop),
15243                 TEST_CASE_ST(ut_setup, ut_teardown,
15244                         test_snow3g_auth_cipher_verify_part_digest_enc),
15245                 TEST_CASE_ST(ut_setup, ut_teardown,
15246                         test_snow3g_auth_cipher_verify_part_digest_enc_oop),
15247                 TEST_CASE_ST(ut_setup, ut_teardown,
15248                         test_snow3g_auth_cipher_verify_test_case_3_sgl),
15249                 TEST_CASE_ST(ut_setup, ut_teardown,
15250                         test_snow3g_auth_cipher_verify_test_case_3_oop_sgl),
15251                 TEST_CASE_ST(ut_setup, ut_teardown,
15252                         test_snow3g_auth_cipher_verify_part_digest_enc_sgl),
15253                 TEST_CASE_ST(ut_setup, ut_teardown,
15254                         test_snow3g_auth_cipher_verify_part_digest_enc_oop_sgl),
15255
15256                 /** SNOW 3G decrypt only (UEA2) */
15257                 TEST_CASE_ST(ut_setup, ut_teardown,
15258                         test_snow3g_decryption_test_case_1),
15259                 TEST_CASE_ST(ut_setup, ut_teardown,
15260                         test_snow3g_decryption_test_case_2),
15261                 TEST_CASE_ST(ut_setup, ut_teardown,
15262                         test_snow3g_decryption_test_case_3),
15263                 TEST_CASE_ST(ut_setup, ut_teardown,
15264                         test_snow3g_decryption_test_case_4),
15265                 TEST_CASE_ST(ut_setup, ut_teardown,
15266                         test_snow3g_decryption_test_case_5),
15267                 TEST_CASE_ST(ut_setup, ut_teardown,
15268                         test_snow3g_decryption_with_digest_test_case_1),
15269                 TEST_CASE_ST(ut_setup, ut_teardown,
15270                         test_snow3g_hash_generate_test_case_1),
15271                 TEST_CASE_ST(ut_setup, ut_teardown,
15272                         test_snow3g_hash_generate_test_case_2),
15273                 TEST_CASE_ST(ut_setup, ut_teardown,
15274                         test_snow3g_hash_generate_test_case_3),
15275
15276                 /* Tests with buffers which length is not byte-aligned */
15277                 TEST_CASE_ST(ut_setup, ut_teardown,
15278                         test_snow3g_hash_generate_test_case_4),
15279                 TEST_CASE_ST(ut_setup, ut_teardown,
15280                         test_snow3g_hash_generate_test_case_5),
15281                 TEST_CASE_ST(ut_setup, ut_teardown,
15282                         test_snow3g_hash_generate_test_case_6),
15283                 TEST_CASE_ST(ut_setup, ut_teardown,
15284                         test_snow3g_hash_verify_test_case_1),
15285                 TEST_CASE_ST(ut_setup, ut_teardown,
15286                         test_snow3g_hash_verify_test_case_2),
15287                 TEST_CASE_ST(ut_setup, ut_teardown,
15288                         test_snow3g_hash_verify_test_case_3),
15289
15290                 /* Tests with buffers which length is not byte-aligned */
15291                 TEST_CASE_ST(ut_setup, ut_teardown,
15292                         test_snow3g_hash_verify_test_case_4),
15293                 TEST_CASE_ST(ut_setup, ut_teardown,
15294                         test_snow3g_hash_verify_test_case_5),
15295                 TEST_CASE_ST(ut_setup, ut_teardown,
15296                         test_snow3g_hash_verify_test_case_6),
15297                 TEST_CASE_ST(ut_setup, ut_teardown,
15298                         test_snow3g_cipher_auth_test_case_1),
15299                 TEST_CASE_ST(ut_setup, ut_teardown,
15300                         test_snow3g_auth_cipher_with_digest_test_case_1),
15301                 TEST_CASES_END()
15302         }
15303 };
15304
15305 static struct unit_test_suite cryptodev_zuc_testsuite  = {
15306         .suite_name = "ZUC Test Suite",
15307         .setup = zuc_testsuite_setup,
15308         .unit_test_cases = {
15309                 /** ZUC encrypt only (EEA3) */
15310                 TEST_CASE_ST(ut_setup, ut_teardown,
15311                         test_zuc_encryption_test_case_1),
15312                 TEST_CASE_ST(ut_setup, ut_teardown,
15313                         test_zuc_encryption_test_case_2),
15314                 TEST_CASE_ST(ut_setup, ut_teardown,
15315                         test_zuc_encryption_test_case_3),
15316                 TEST_CASE_ST(ut_setup, ut_teardown,
15317                         test_zuc_encryption_test_case_4),
15318                 TEST_CASE_ST(ut_setup, ut_teardown,
15319                         test_zuc_encryption_test_case_5),
15320                 TEST_CASE_ST(ut_setup, ut_teardown,
15321                         test_zuc_encryption_test_case_6_sgl),
15322
15323                 /** ZUC authenticate (EIA3) */
15324                 TEST_CASE_ST(ut_setup, ut_teardown,
15325                         test_zuc_hash_generate_test_case_1),
15326                 TEST_CASE_ST(ut_setup, ut_teardown,
15327                         test_zuc_hash_generate_test_case_2),
15328                 TEST_CASE_ST(ut_setup, ut_teardown,
15329                         test_zuc_hash_generate_test_case_3),
15330                 TEST_CASE_ST(ut_setup, ut_teardown,
15331                         test_zuc_hash_generate_test_case_4),
15332                 TEST_CASE_ST(ut_setup, ut_teardown,
15333                         test_zuc_hash_generate_test_case_5),
15334                 TEST_CASE_ST(ut_setup, ut_teardown,
15335                         test_zuc_hash_generate_test_case_6),
15336                 TEST_CASE_ST(ut_setup, ut_teardown,
15337                         test_zuc_hash_generate_test_case_7),
15338                 TEST_CASE_ST(ut_setup, ut_teardown,
15339                         test_zuc_hash_generate_test_case_8),
15340                 TEST_CASE_ST(ut_setup, ut_teardown,
15341                         test_zuc_hash_generate_test_case_9),
15342                 TEST_CASE_ST(ut_setup, ut_teardown,
15343                         test_zuc_hash_generate_test_case_10),
15344                 TEST_CASE_ST(ut_setup, ut_teardown,
15345                         test_zuc_hash_generate_test_case_11),
15346
15347
15348                 /** ZUC alg-chain (EEA3/EIA3) */
15349                 TEST_CASE_ST(ut_setup, ut_teardown,
15350                         test_zuc_cipher_auth_test_case_1),
15351                 TEST_CASE_ST(ut_setup, ut_teardown,
15352                         test_zuc_cipher_auth_test_case_2),
15353
15354                 /** ZUC generate auth, then encrypt (EEA3) */
15355                 TEST_CASE_ST(ut_setup, ut_teardown,
15356                         test_zuc_auth_cipher_test_case_1),
15357                 TEST_CASE_ST(ut_setup, ut_teardown,
15358                         test_zuc_auth_cipher_test_case_1_oop),
15359                 TEST_CASE_ST(ut_setup, ut_teardown,
15360                         test_zuc_auth_cipher_test_case_1_sgl),
15361                 TEST_CASE_ST(ut_setup, ut_teardown,
15362                         test_zuc_auth_cipher_test_case_1_oop_sgl),
15363
15364                 /** ZUC decrypt (EEA3), then verify auth */
15365                 TEST_CASE_ST(ut_setup, ut_teardown,
15366                         test_zuc_auth_cipher_verify_test_case_1),
15367                 TEST_CASE_ST(ut_setup, ut_teardown,
15368                         test_zuc_auth_cipher_verify_test_case_1_oop),
15369                 TEST_CASE_ST(ut_setup, ut_teardown,
15370                         test_zuc_auth_cipher_verify_test_case_1_sgl),
15371                 TEST_CASE_ST(ut_setup, ut_teardown,
15372                         test_zuc_auth_cipher_verify_test_case_1_oop_sgl),
15373
15374                 /** ZUC-256 encrypt only **/
15375                 TEST_CASE_ST(ut_setup, ut_teardown,
15376                         test_zuc256_encryption_test_case_1),
15377                 TEST_CASE_ST(ut_setup, ut_teardown,
15378                         test_zuc256_encryption_test_case_2),
15379
15380                 /** ZUC-256 authentication only **/
15381                 TEST_CASE_ST(ut_setup, ut_teardown,
15382                         test_zuc256_authentication_test_case_1),
15383                 TEST_CASE_ST(ut_setup, ut_teardown,
15384                         test_zuc256_authentication_test_case_2),
15385
15386                 TEST_CASES_END()
15387         }
15388 };
15389
15390 static struct unit_test_suite cryptodev_hmac_md5_auth_testsuite  = {
15391         .suite_name = "HMAC_MD5 Authentication Test Suite",
15392         .setup = hmac_md5_auth_testsuite_setup,
15393         .unit_test_cases = {
15394                 TEST_CASE_ST(ut_setup, ut_teardown,
15395                         test_MD5_HMAC_generate_case_1),
15396                 TEST_CASE_ST(ut_setup, ut_teardown,
15397                         test_MD5_HMAC_verify_case_1),
15398                 TEST_CASE_ST(ut_setup, ut_teardown,
15399                         test_MD5_HMAC_generate_case_2),
15400                 TEST_CASE_ST(ut_setup, ut_teardown,
15401                         test_MD5_HMAC_verify_case_2),
15402                 TEST_CASES_END()
15403         }
15404 };
15405
15406 static struct unit_test_suite cryptodev_kasumi_testsuite  = {
15407         .suite_name = "Kasumi Test Suite",
15408         .setup = kasumi_testsuite_setup,
15409         .unit_test_cases = {
15410                 /** KASUMI hash only (UIA1) */
15411                 TEST_CASE_ST(ut_setup, ut_teardown,
15412                         test_kasumi_hash_generate_test_case_1),
15413                 TEST_CASE_ST(ut_setup, ut_teardown,
15414                         test_kasumi_hash_generate_test_case_2),
15415                 TEST_CASE_ST(ut_setup, ut_teardown,
15416                         test_kasumi_hash_generate_test_case_3),
15417                 TEST_CASE_ST(ut_setup, ut_teardown,
15418                         test_kasumi_hash_generate_test_case_4),
15419                 TEST_CASE_ST(ut_setup, ut_teardown,
15420                         test_kasumi_hash_generate_test_case_5),
15421                 TEST_CASE_ST(ut_setup, ut_teardown,
15422                         test_kasumi_hash_generate_test_case_6),
15423
15424                 TEST_CASE_ST(ut_setup, ut_teardown,
15425                         test_kasumi_hash_verify_test_case_1),
15426                 TEST_CASE_ST(ut_setup, ut_teardown,
15427                         test_kasumi_hash_verify_test_case_2),
15428                 TEST_CASE_ST(ut_setup, ut_teardown,
15429                         test_kasumi_hash_verify_test_case_3),
15430                 TEST_CASE_ST(ut_setup, ut_teardown,
15431                         test_kasumi_hash_verify_test_case_4),
15432                 TEST_CASE_ST(ut_setup, ut_teardown,
15433                         test_kasumi_hash_verify_test_case_5),
15434
15435                 /** KASUMI encrypt only (UEA1) */
15436                 TEST_CASE_ST(ut_setup, ut_teardown,
15437                         test_kasumi_encryption_test_case_1),
15438                 TEST_CASE_ST(ut_setup, ut_teardown,
15439                         test_kasumi_encryption_test_case_1_sgl),
15440                 TEST_CASE_ST(ut_setup, ut_teardown,
15441                         test_kasumi_encryption_test_case_1_oop),
15442                 TEST_CASE_ST(ut_setup, ut_teardown,
15443                         test_kasumi_encryption_test_case_1_oop_sgl),
15444                 TEST_CASE_ST(ut_setup, ut_teardown,
15445                         test_kasumi_encryption_test_case_2),
15446                 TEST_CASE_ST(ut_setup, ut_teardown,
15447                         test_kasumi_encryption_test_case_3),
15448                 TEST_CASE_ST(ut_setup, ut_teardown,
15449                         test_kasumi_encryption_test_case_4),
15450                 TEST_CASE_ST(ut_setup, ut_teardown,
15451                         test_kasumi_encryption_test_case_5),
15452
15453                 /** KASUMI decrypt only (UEA1) */
15454                 TEST_CASE_ST(ut_setup, ut_teardown,
15455                         test_kasumi_decryption_test_case_1),
15456                 TEST_CASE_ST(ut_setup, ut_teardown,
15457                         test_kasumi_decryption_test_case_2),
15458                 TEST_CASE_ST(ut_setup, ut_teardown,
15459                         test_kasumi_decryption_test_case_3),
15460                 TEST_CASE_ST(ut_setup, ut_teardown,
15461                         test_kasumi_decryption_test_case_4),
15462                 TEST_CASE_ST(ut_setup, ut_teardown,
15463                         test_kasumi_decryption_test_case_5),
15464                 TEST_CASE_ST(ut_setup, ut_teardown,
15465                         test_kasumi_decryption_test_case_1_oop),
15466                 TEST_CASE_ST(ut_setup, ut_teardown,
15467                         test_kasumi_cipher_auth_test_case_1),
15468
15469                 /** KASUMI generate auth, then encrypt (F8) */
15470                 TEST_CASE_ST(ut_setup, ut_teardown,
15471                         test_kasumi_auth_cipher_test_case_1),
15472                 TEST_CASE_ST(ut_setup, ut_teardown,
15473                         test_kasumi_auth_cipher_test_case_2),
15474                 TEST_CASE_ST(ut_setup, ut_teardown,
15475                         test_kasumi_auth_cipher_test_case_2_oop),
15476                 TEST_CASE_ST(ut_setup, ut_teardown,
15477                         test_kasumi_auth_cipher_test_case_2_sgl),
15478                 TEST_CASE_ST(ut_setup, ut_teardown,
15479                         test_kasumi_auth_cipher_test_case_2_oop_sgl),
15480
15481                 /** KASUMI decrypt (F8), then verify auth */
15482                 TEST_CASE_ST(ut_setup, ut_teardown,
15483                         test_kasumi_auth_cipher_verify_test_case_1),
15484                 TEST_CASE_ST(ut_setup, ut_teardown,
15485                         test_kasumi_auth_cipher_verify_test_case_2),
15486                 TEST_CASE_ST(ut_setup, ut_teardown,
15487                         test_kasumi_auth_cipher_verify_test_case_2_oop),
15488                 TEST_CASE_ST(ut_setup, ut_teardown,
15489                         test_kasumi_auth_cipher_verify_test_case_2_sgl),
15490                 TEST_CASE_ST(ut_setup, ut_teardown,
15491                         test_kasumi_auth_cipher_verify_test_case_2_oop_sgl),
15492
15493                 TEST_CASES_END()
15494         }
15495 };
15496
15497 static struct unit_test_suite cryptodev_esn_testsuite  = {
15498         .suite_name = "ESN Test Suite",
15499         .setup = esn_testsuite_setup,
15500         .unit_test_cases = {
15501                 TEST_CASE_ST(ut_setup, ut_teardown,
15502                         auth_encrypt_AES128CBC_HMAC_SHA1_esn_check),
15503                 TEST_CASE_ST(ut_setup, ut_teardown,
15504                         auth_decrypt_AES128CBC_HMAC_SHA1_esn_check),
15505                 TEST_CASES_END()
15506         }
15507 };
15508
15509 static struct unit_test_suite cryptodev_negative_aes_gcm_testsuite  = {
15510         .suite_name = "Negative AES GCM Test Suite",
15511         .setup = negative_aes_gcm_testsuite_setup,
15512         .unit_test_cases = {
15513                 TEST_CASE_ST(ut_setup, ut_teardown,
15514                         test_AES_GCM_auth_encryption_fail_iv_corrupt),
15515                 TEST_CASE_ST(ut_setup, ut_teardown,
15516                         test_AES_GCM_auth_encryption_fail_in_data_corrupt),
15517                 TEST_CASE_ST(ut_setup, ut_teardown,
15518                         test_AES_GCM_auth_encryption_fail_out_data_corrupt),
15519                 TEST_CASE_ST(ut_setup, ut_teardown,
15520                         test_AES_GCM_auth_encryption_fail_aad_len_corrupt),
15521                 TEST_CASE_ST(ut_setup, ut_teardown,
15522                         test_AES_GCM_auth_encryption_fail_aad_corrupt),
15523                 TEST_CASE_ST(ut_setup, ut_teardown,
15524                         test_AES_GCM_auth_encryption_fail_tag_corrupt),
15525                 TEST_CASE_ST(ut_setup, ut_teardown,
15526                         test_AES_GCM_auth_decryption_fail_iv_corrupt),
15527                 TEST_CASE_ST(ut_setup, ut_teardown,
15528                         test_AES_GCM_auth_decryption_fail_in_data_corrupt),
15529                 TEST_CASE_ST(ut_setup, ut_teardown,
15530                         test_AES_GCM_auth_decryption_fail_out_data_corrupt),
15531                 TEST_CASE_ST(ut_setup, ut_teardown,
15532                         test_AES_GCM_auth_decryption_fail_aad_len_corrupt),
15533                 TEST_CASE_ST(ut_setup, ut_teardown,
15534                         test_AES_GCM_auth_decryption_fail_aad_corrupt),
15535                 TEST_CASE_ST(ut_setup, ut_teardown,
15536                         test_AES_GCM_auth_decryption_fail_tag_corrupt),
15537
15538                 TEST_CASES_END()
15539         }
15540 };
15541
15542 static struct unit_test_suite cryptodev_negative_aes_gmac_testsuite  = {
15543         .suite_name = "Negative AES GMAC Test Suite",
15544         .setup = negative_aes_gmac_testsuite_setup,
15545         .unit_test_cases = {
15546                 TEST_CASE_ST(ut_setup, ut_teardown,
15547                         authentication_verify_AES128_GMAC_fail_data_corrupt),
15548                 TEST_CASE_ST(ut_setup, ut_teardown,
15549                         authentication_verify_AES128_GMAC_fail_tag_corrupt),
15550
15551                 TEST_CASES_END()
15552         }
15553 };
15554
15555 static struct unit_test_suite cryptodev_mixed_cipher_hash_testsuite  = {
15556         .suite_name = "Mixed CIPHER + HASH algorithms Test Suite",
15557         .setup = mixed_cipher_hash_testsuite_setup,
15558         .unit_test_cases = {
15559                 /** AUTH AES CMAC + CIPHER AES CTR */
15560                 TEST_CASE_ST(ut_setup, ut_teardown,
15561                         test_aes_cmac_aes_ctr_digest_enc_test_case_1),
15562                 TEST_CASE_ST(ut_setup, ut_teardown,
15563                         test_aes_cmac_aes_ctr_digest_enc_test_case_1_oop),
15564                 TEST_CASE_ST(ut_setup, ut_teardown,
15565                         test_aes_cmac_aes_ctr_digest_enc_test_case_1_sgl),
15566                 TEST_CASE_ST(ut_setup, ut_teardown,
15567                         test_aes_cmac_aes_ctr_digest_enc_test_case_1_oop_sgl),
15568                 TEST_CASE_ST(ut_setup, ut_teardown,
15569                         test_verify_aes_cmac_aes_ctr_digest_enc_test_case_1),
15570                 TEST_CASE_ST(ut_setup, ut_teardown,
15571                         test_verify_aes_cmac_aes_ctr_digest_enc_test_case_1_oop),
15572                 TEST_CASE_ST(ut_setup, ut_teardown,
15573                         test_verify_aes_cmac_aes_ctr_digest_enc_test_case_1_sgl),
15574                 TEST_CASE_ST(ut_setup, ut_teardown,
15575                         test_verify_aes_cmac_aes_ctr_digest_enc_test_case_1_oop_sgl),
15576
15577                 /** AUTH ZUC + CIPHER SNOW3G */
15578                 TEST_CASE_ST(ut_setup, ut_teardown,
15579                         test_auth_zuc_cipher_snow_test_case_1),
15580                 TEST_CASE_ST(ut_setup, ut_teardown,
15581                         test_verify_auth_zuc_cipher_snow_test_case_1),
15582                 /** AUTH AES CMAC + CIPHER SNOW3G */
15583                 TEST_CASE_ST(ut_setup, ut_teardown,
15584                         test_auth_aes_cmac_cipher_snow_test_case_1),
15585                 TEST_CASE_ST(ut_setup, ut_teardown,
15586                         test_verify_auth_aes_cmac_cipher_snow_test_case_1),
15587                 /** AUTH ZUC + CIPHER AES CTR */
15588                 TEST_CASE_ST(ut_setup, ut_teardown,
15589                         test_auth_zuc_cipher_aes_ctr_test_case_1),
15590                 TEST_CASE_ST(ut_setup, ut_teardown,
15591                         test_verify_auth_zuc_cipher_aes_ctr_test_case_1),
15592                 /** AUTH SNOW3G + CIPHER AES CTR */
15593                 TEST_CASE_ST(ut_setup, ut_teardown,
15594                         test_auth_snow_cipher_aes_ctr_test_case_1),
15595                 TEST_CASE_ST(ut_setup, ut_teardown,
15596                         test_verify_auth_snow_cipher_aes_ctr_test_case_1),
15597                 /** AUTH SNOW3G + CIPHER ZUC */
15598                 TEST_CASE_ST(ut_setup, ut_teardown,
15599                         test_auth_snow_cipher_zuc_test_case_1),
15600                 TEST_CASE_ST(ut_setup, ut_teardown,
15601                         test_verify_auth_snow_cipher_zuc_test_case_1),
15602                 /** AUTH AES CMAC + CIPHER ZUC */
15603                 TEST_CASE_ST(ut_setup, ut_teardown,
15604                         test_auth_aes_cmac_cipher_zuc_test_case_1),
15605                 TEST_CASE_ST(ut_setup, ut_teardown,
15606                         test_verify_auth_aes_cmac_cipher_zuc_test_case_1),
15607
15608                 /** AUTH NULL + CIPHER SNOW3G */
15609                 TEST_CASE_ST(ut_setup, ut_teardown,
15610                         test_auth_null_cipher_snow_test_case_1),
15611                 TEST_CASE_ST(ut_setup, ut_teardown,
15612                         test_verify_auth_null_cipher_snow_test_case_1),
15613                 /** AUTH NULL + CIPHER ZUC */
15614                 TEST_CASE_ST(ut_setup, ut_teardown,
15615                         test_auth_null_cipher_zuc_test_case_1),
15616                 TEST_CASE_ST(ut_setup, ut_teardown,
15617                         test_verify_auth_null_cipher_zuc_test_case_1),
15618                 /** AUTH SNOW3G + CIPHER NULL */
15619                 TEST_CASE_ST(ut_setup, ut_teardown,
15620                         test_auth_snow_cipher_null_test_case_1),
15621                 TEST_CASE_ST(ut_setup, ut_teardown,
15622                         test_verify_auth_snow_cipher_null_test_case_1),
15623                 /** AUTH ZUC + CIPHER NULL */
15624                 TEST_CASE_ST(ut_setup, ut_teardown,
15625                         test_auth_zuc_cipher_null_test_case_1),
15626                 TEST_CASE_ST(ut_setup, ut_teardown,
15627                         test_verify_auth_zuc_cipher_null_test_case_1),
15628                 /** AUTH NULL + CIPHER AES CTR */
15629                 TEST_CASE_ST(ut_setup, ut_teardown,
15630                         test_auth_null_cipher_aes_ctr_test_case_1),
15631                 TEST_CASE_ST(ut_setup, ut_teardown,
15632                         test_verify_auth_null_cipher_aes_ctr_test_case_1),
15633                 /** AUTH AES CMAC + CIPHER NULL */
15634                 TEST_CASE_ST(ut_setup, ut_teardown,
15635                         test_auth_aes_cmac_cipher_null_test_case_1),
15636                 TEST_CASE_ST(ut_setup, ut_teardown,
15637                         test_verify_auth_aes_cmac_cipher_null_test_case_1),
15638                 TEST_CASES_END()
15639         }
15640 };
15641
15642 static int
15643 run_cryptodev_testsuite(const char *pmd_name)
15644 {
15645         uint8_t ret, j, i = 0, blk_start_idx = 0;
15646         const enum blockcipher_test_type blk_suites[] = {
15647                 BLKCIPHER_AES_CHAIN_TYPE,
15648                 BLKCIPHER_AES_CIPHERONLY_TYPE,
15649                 BLKCIPHER_AES_DOCSIS_TYPE,
15650                 BLKCIPHER_3DES_CHAIN_TYPE,
15651                 BLKCIPHER_3DES_CIPHERONLY_TYPE,
15652                 BLKCIPHER_DES_CIPHERONLY_TYPE,
15653                 BLKCIPHER_DES_DOCSIS_TYPE,
15654                 BLKCIPHER_AUTHONLY_TYPE};
15655         struct unit_test_suite *static_suites[] = {
15656                 &cryptodev_multi_session_testsuite,
15657                 &cryptodev_null_testsuite,
15658                 &cryptodev_aes_ccm_auth_testsuite,
15659                 &cryptodev_aes_gcm_auth_testsuite,
15660                 &cryptodev_aes_gmac_auth_testsuite,
15661                 &cryptodev_snow3g_testsuite,
15662                 &cryptodev_chacha20_poly1305_testsuite,
15663                 &cryptodev_zuc_testsuite,
15664                 &cryptodev_hmac_md5_auth_testsuite,
15665                 &cryptodev_kasumi_testsuite,
15666                 &cryptodev_esn_testsuite,
15667                 &cryptodev_negative_aes_gcm_testsuite,
15668                 &cryptodev_negative_aes_gmac_testsuite,
15669                 &cryptodev_mixed_cipher_hash_testsuite,
15670                 &cryptodev_negative_hmac_sha1_testsuite,
15671                 &cryptodev_gen_testsuite,
15672 #ifdef RTE_LIB_SECURITY
15673                 &ipsec_proto_testsuite,
15674                 &pdcp_proto_testsuite,
15675                 &docsis_proto_testsuite,
15676 #endif
15677                 &end_testsuite
15678         };
15679         static struct unit_test_suite ts = {
15680                 .suite_name = "Cryptodev Unit Test Suite",
15681                 .setup = testsuite_setup,
15682                 .teardown = testsuite_teardown,
15683                 .unit_test_cases = {TEST_CASES_END()}
15684         };
15685
15686         gbl_driver_id = rte_cryptodev_driver_id_get(pmd_name);
15687
15688         if (gbl_driver_id == -1) {
15689                 RTE_LOG(ERR, USER1, "%s PMD must be loaded.\n", pmd_name);
15690                 return TEST_SKIPPED;
15691         }
15692
15693         ts.unit_test_suites = malloc(sizeof(struct unit_test_suite *) *
15694                         (RTE_DIM(blk_suites) + RTE_DIM(static_suites)));
15695
15696         ADD_BLOCKCIPHER_TESTSUITE(i, ts, blk_suites, RTE_DIM(blk_suites));
15697         ADD_STATIC_TESTSUITE(i, ts, static_suites, RTE_DIM(static_suites));
15698         ret = unit_test_suite_runner(&ts);
15699
15700         FREE_BLOCKCIPHER_TESTSUITE(blk_start_idx, ts, RTE_DIM(blk_suites));
15701         free(ts.unit_test_suites);
15702         return ret;
15703 }
15704
15705 static int
15706 require_feature_flag(const char *pmd_name, uint64_t flag, const char *flag_name)
15707 {
15708         struct rte_cryptodev_info dev_info;
15709         uint8_t i, nb_devs;
15710         int driver_id;
15711
15712         driver_id = rte_cryptodev_driver_id_get(pmd_name);
15713         if (driver_id == -1) {
15714                 RTE_LOG(WARNING, USER1, "%s PMD must be loaded.\n", pmd_name);
15715                 return TEST_SKIPPED;
15716         }
15717
15718         nb_devs = rte_cryptodev_count();
15719         if (nb_devs < 1) {
15720                 RTE_LOG(WARNING, USER1, "No crypto devices found?\n");
15721                 return TEST_SKIPPED;
15722         }
15723
15724         for (i = 0; i < nb_devs; i++) {
15725                 rte_cryptodev_info_get(i, &dev_info);
15726                 if (dev_info.driver_id == driver_id) {
15727                         if (!(dev_info.feature_flags & flag)) {
15728                                 RTE_LOG(INFO, USER1, "%s not supported\n",
15729                                                 flag_name);
15730                                 return TEST_SKIPPED;
15731                         }
15732                         return 0; /* found */
15733                 }
15734         }
15735
15736         RTE_LOG(INFO, USER1, "%s not supported\n", flag_name);
15737         return TEST_SKIPPED;
15738 }
15739
15740 static int
15741 test_cryptodev_qat(void)
15742 {
15743         return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_QAT_SYM_PMD));
15744 }
15745
15746 static int
15747 test_cryptodev_virtio(void)
15748 {
15749         return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_VIRTIO_PMD));
15750 }
15751
15752 static int
15753 test_cryptodev_aesni_mb(void)
15754 {
15755         return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_AESNI_MB_PMD));
15756 }
15757
15758 static int
15759 test_cryptodev_cpu_aesni_mb(void)
15760 {
15761         int32_t rc;
15762         enum rte_security_session_action_type at = gbl_action_type;
15763         gbl_action_type = RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO;
15764         rc = run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_AESNI_MB_PMD));
15765         gbl_action_type = at;
15766         return rc;
15767 }
15768
15769 static int
15770 test_cryptodev_chacha_poly_mb(void)
15771 {
15772         int32_t rc;
15773         enum rte_security_session_action_type at = gbl_action_type;
15774         rc = run_cryptodev_testsuite(
15775                         RTE_STR(CRYPTODEV_NAME_CHACHA20_POLY1305_PMD));
15776         gbl_action_type = at;
15777         return rc;
15778 }
15779
15780 static int
15781 test_cryptodev_openssl(void)
15782 {
15783         return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_OPENSSL_PMD));
15784 }
15785
15786 static int
15787 test_cryptodev_aesni_gcm(void)
15788 {
15789         return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_AESNI_GCM_PMD));
15790 }
15791
15792 static int
15793 test_cryptodev_cpu_aesni_gcm(void)
15794 {
15795         int32_t rc;
15796         enum rte_security_session_action_type at = gbl_action_type;
15797         gbl_action_type = RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO;
15798         rc  = run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_AESNI_GCM_PMD));
15799         gbl_action_type = at;
15800         return rc;
15801 }
15802
15803 static int
15804 test_cryptodev_mlx5(void)
15805 {
15806         return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_MLX5_PMD));
15807 }
15808
15809 static int
15810 test_cryptodev_null(void)
15811 {
15812         return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_NULL_PMD));
15813 }
15814
15815 static int
15816 test_cryptodev_sw_snow3g(void)
15817 {
15818         return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_SNOW3G_PMD));
15819 }
15820
15821 static int
15822 test_cryptodev_sw_kasumi(void)
15823 {
15824         return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_KASUMI_PMD));
15825 }
15826
15827 static int
15828 test_cryptodev_sw_zuc(void)
15829 {
15830         return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_ZUC_PMD));
15831 }
15832
15833 static int
15834 test_cryptodev_armv8(void)
15835 {
15836         return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_ARMV8_PMD));
15837 }
15838
15839 static int
15840 test_cryptodev_mrvl(void)
15841 {
15842         return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_MVSAM_PMD));
15843 }
15844
15845 #ifdef RTE_CRYPTO_SCHEDULER
15846
15847 static int
15848 test_cryptodev_scheduler(void)
15849 {
15850         uint8_t ret, sched_i, j, i = 0, blk_start_idx = 0;
15851         const enum blockcipher_test_type blk_suites[] = {
15852                 BLKCIPHER_AES_CHAIN_TYPE,
15853                 BLKCIPHER_AES_CIPHERONLY_TYPE,
15854                 BLKCIPHER_AUTHONLY_TYPE
15855         };
15856         static struct unit_test_suite scheduler_multicore = {
15857                 .suite_name = "Scheduler Multicore Unit Test Suite",
15858                 .setup = scheduler_multicore_testsuite_setup,
15859                 .teardown = scheduler_mode_testsuite_teardown,
15860                 .unit_test_cases = {TEST_CASES_END()}
15861         };
15862         static struct unit_test_suite scheduler_round_robin = {
15863                 .suite_name = "Scheduler Round Robin Unit Test Suite",
15864                 .setup = scheduler_roundrobin_testsuite_setup,
15865                 .teardown = scheduler_mode_testsuite_teardown,
15866                 .unit_test_cases = {TEST_CASES_END()}
15867         };
15868         static struct unit_test_suite scheduler_failover = {
15869                 .suite_name = "Scheduler Failover Unit Test Suite",
15870                 .setup = scheduler_failover_testsuite_setup,
15871                 .teardown = scheduler_mode_testsuite_teardown,
15872                 .unit_test_cases = {TEST_CASES_END()}
15873         };
15874         static struct unit_test_suite scheduler_pkt_size_distr = {
15875                 .suite_name = "Scheduler Pkt Size Distr Unit Test Suite",
15876                 .setup = scheduler_pkt_size_distr_testsuite_setup,
15877                 .teardown = scheduler_mode_testsuite_teardown,
15878                 .unit_test_cases = {TEST_CASES_END()}
15879         };
15880         struct unit_test_suite *sched_mode_suites[] = {
15881                 &scheduler_multicore,
15882                 &scheduler_round_robin,
15883                 &scheduler_failover,
15884                 &scheduler_pkt_size_distr
15885         };
15886         static struct unit_test_suite scheduler_config = {
15887                 .suite_name = "Crypto Device Scheduler Config Unit Test Suite",
15888                 .unit_test_cases = {
15889                         TEST_CASE(test_scheduler_attach_worker_op),
15890                         TEST_CASE(test_scheduler_mode_multicore_op),
15891                         TEST_CASE(test_scheduler_mode_roundrobin_op),
15892                         TEST_CASE(test_scheduler_mode_failover_op),
15893                         TEST_CASE(test_scheduler_mode_pkt_size_distr_op),
15894                         TEST_CASE(test_scheduler_detach_worker_op),
15895
15896                         TEST_CASES_END() /**< NULL terminate array */
15897                 }
15898         };
15899         struct unit_test_suite *static_suites[] = {
15900                 &scheduler_config,
15901                 &end_testsuite
15902         };
15903         static struct unit_test_suite ts = {
15904                 .suite_name = "Scheduler Unit Test Suite",
15905                 .setup = scheduler_testsuite_setup,
15906                 .teardown = testsuite_teardown,
15907                 .unit_test_cases = {TEST_CASES_END()}
15908         };
15909
15910         gbl_driver_id = rte_cryptodev_driver_id_get(
15911                         RTE_STR(CRYPTODEV_NAME_SCHEDULER_PMD));
15912
15913         if (gbl_driver_id == -1) {
15914                 RTE_LOG(ERR, USER1, "SCHEDULER PMD must be loaded.\n");
15915                 return TEST_SKIPPED;
15916         }
15917
15918         if (rte_cryptodev_driver_id_get(
15919                                 RTE_STR(CRYPTODEV_NAME_AESNI_MB_PMD)) == -1) {
15920                 RTE_LOG(ERR, USER1, "AESNI MB PMD must be loaded.\n");
15921                 return TEST_SKIPPED;
15922         }
15923
15924         for (sched_i = 0; sched_i < RTE_DIM(sched_mode_suites); sched_i++) {
15925                 uint8_t blk_i = 0;
15926                 sched_mode_suites[sched_i]->unit_test_suites = malloc(sizeof
15927                                 (struct unit_test_suite *) *
15928                                 (RTE_DIM(blk_suites) + 1));
15929                 ADD_BLOCKCIPHER_TESTSUITE(blk_i, (*sched_mode_suites[sched_i]),
15930                                 blk_suites, RTE_DIM(blk_suites));
15931                 sched_mode_suites[sched_i]->unit_test_suites[blk_i] = &end_testsuite;
15932         }
15933
15934         ts.unit_test_suites = malloc(sizeof(struct unit_test_suite *) *
15935                         (RTE_DIM(static_suites) + RTE_DIM(sched_mode_suites)));
15936         ADD_STATIC_TESTSUITE(i, ts, sched_mode_suites,
15937                         RTE_DIM(sched_mode_suites));
15938         ADD_STATIC_TESTSUITE(i, ts, static_suites, RTE_DIM(static_suites));
15939         ret = unit_test_suite_runner(&ts);
15940
15941         for (sched_i = 0; sched_i < RTE_DIM(sched_mode_suites); sched_i++) {
15942                 FREE_BLOCKCIPHER_TESTSUITE(blk_start_idx,
15943                                 (*sched_mode_suites[sched_i]),
15944                                 RTE_DIM(blk_suites));
15945                 free(sched_mode_suites[sched_i]->unit_test_suites);
15946         }
15947         free(ts.unit_test_suites);
15948         return ret;
15949 }
15950
15951 REGISTER_TEST_COMMAND(cryptodev_scheduler_autotest, test_cryptodev_scheduler);
15952
15953 #endif
15954
15955 static int
15956 test_cryptodev_dpaa2_sec(void)
15957 {
15958         return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_DPAA2_SEC_PMD));
15959 }
15960
15961 static int
15962 test_cryptodev_dpaa_sec(void)
15963 {
15964         return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_DPAA_SEC_PMD));
15965 }
15966
15967 static int
15968 test_cryptodev_ccp(void)
15969 {
15970         return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_CCP_PMD));
15971 }
15972
15973 static int
15974 test_cryptodev_octeontx(void)
15975 {
15976         return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_OCTEONTX_SYM_PMD));
15977 }
15978
15979 static int
15980 test_cryptodev_caam_jr(void)
15981 {
15982         return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_CAAM_JR_PMD));
15983 }
15984
15985 static int
15986 test_cryptodev_nitrox(void)
15987 {
15988         return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_NITROX_PMD));
15989 }
15990
15991 static int
15992 test_cryptodev_bcmfs(void)
15993 {
15994         return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_BCMFS_PMD));
15995 }
15996
15997 static int
15998 test_cryptodev_qat_raw_api(void)
15999 {
16000         static const char *pmd_name = RTE_STR(CRYPTODEV_NAME_QAT_SYM_PMD);
16001         int ret;
16002
16003         ret = require_feature_flag(pmd_name, RTE_CRYPTODEV_FF_SYM_RAW_DP,
16004                         "RAW API");
16005         if (ret)
16006                 return ret;
16007
16008         global_api_test_type = CRYPTODEV_RAW_API_TEST;
16009         ret = run_cryptodev_testsuite(pmd_name);
16010         global_api_test_type = CRYPTODEV_API_TEST;
16011
16012         return ret;
16013 }
16014
16015 static int
16016 test_cryptodev_cn9k(void)
16017 {
16018         return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_CN9K_PMD));
16019 }
16020
16021 static int
16022 test_cryptodev_cn10k(void)
16023 {
16024         return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_CN10K_PMD));
16025 }
16026
16027 static int
16028 test_cryptodev_dpaa2_sec_raw_api(void)
16029 {
16030         static const char *pmd_name = RTE_STR(CRYPTODEV_NAME_DPAA2_SEC_PMD);
16031         int ret;
16032
16033         ret = require_feature_flag(pmd_name, RTE_CRYPTODEV_FF_SYM_RAW_DP,
16034                         "RAW API");
16035         if (ret)
16036                 return ret;
16037
16038         global_api_test_type = CRYPTODEV_RAW_API_TEST;
16039         ret = run_cryptodev_testsuite(pmd_name);
16040         global_api_test_type = CRYPTODEV_API_TEST;
16041
16042         return ret;
16043 }
16044
16045 static int
16046 test_cryptodev_dpaa_sec_raw_api(void)
16047 {
16048         static const char *pmd_name = RTE_STR(CRYPTODEV_NAME_DPAA2_SEC_PMD);
16049         int ret;
16050
16051         ret = require_feature_flag(pmd_name, RTE_CRYPTODEV_FF_SYM_RAW_DP,
16052                         "RAW API");
16053         if (ret)
16054                 return ret;
16055
16056         global_api_test_type = CRYPTODEV_RAW_API_TEST;
16057         ret = run_cryptodev_testsuite(pmd_name);
16058         global_api_test_type = CRYPTODEV_API_TEST;
16059
16060         return ret;
16061 }
16062
16063 REGISTER_TEST_COMMAND(cryptodev_dpaa2_sec_raw_api_autotest,
16064                 test_cryptodev_dpaa2_sec_raw_api);
16065 REGISTER_TEST_COMMAND(cryptodev_dpaa_sec_raw_api_autotest,
16066                 test_cryptodev_dpaa_sec_raw_api);
16067 REGISTER_TEST_COMMAND(cryptodev_qat_raw_api_autotest,
16068                 test_cryptodev_qat_raw_api);
16069 REGISTER_TEST_COMMAND(cryptodev_qat_autotest, test_cryptodev_qat);
16070 REGISTER_TEST_COMMAND(cryptodev_aesni_mb_autotest, test_cryptodev_aesni_mb);
16071 REGISTER_TEST_COMMAND(cryptodev_cpu_aesni_mb_autotest,
16072         test_cryptodev_cpu_aesni_mb);
16073 REGISTER_TEST_COMMAND(cryptodev_chacha_poly_mb_autotest,
16074         test_cryptodev_chacha_poly_mb);
16075 REGISTER_TEST_COMMAND(cryptodev_openssl_autotest, test_cryptodev_openssl);
16076 REGISTER_TEST_COMMAND(cryptodev_aesni_gcm_autotest, test_cryptodev_aesni_gcm);
16077 REGISTER_TEST_COMMAND(cryptodev_cpu_aesni_gcm_autotest,
16078         test_cryptodev_cpu_aesni_gcm);
16079 REGISTER_TEST_COMMAND(cryptodev_mlx5_autotest, test_cryptodev_mlx5);
16080 REGISTER_TEST_COMMAND(cryptodev_null_autotest, test_cryptodev_null);
16081 REGISTER_TEST_COMMAND(cryptodev_sw_snow3g_autotest, test_cryptodev_sw_snow3g);
16082 REGISTER_TEST_COMMAND(cryptodev_sw_kasumi_autotest, test_cryptodev_sw_kasumi);
16083 REGISTER_TEST_COMMAND(cryptodev_sw_zuc_autotest, test_cryptodev_sw_zuc);
16084 REGISTER_TEST_COMMAND(cryptodev_sw_armv8_autotest, test_cryptodev_armv8);
16085 REGISTER_TEST_COMMAND(cryptodev_sw_mvsam_autotest, test_cryptodev_mrvl);
16086 REGISTER_TEST_COMMAND(cryptodev_dpaa2_sec_autotest, test_cryptodev_dpaa2_sec);
16087 REGISTER_TEST_COMMAND(cryptodev_dpaa_sec_autotest, test_cryptodev_dpaa_sec);
16088 REGISTER_TEST_COMMAND(cryptodev_ccp_autotest, test_cryptodev_ccp);
16089 REGISTER_TEST_COMMAND(cryptodev_virtio_autotest, test_cryptodev_virtio);
16090 REGISTER_TEST_COMMAND(cryptodev_octeontx_autotest, test_cryptodev_octeontx);
16091 REGISTER_TEST_COMMAND(cryptodev_caam_jr_autotest, test_cryptodev_caam_jr);
16092 REGISTER_TEST_COMMAND(cryptodev_nitrox_autotest, test_cryptodev_nitrox);
16093 REGISTER_TEST_COMMAND(cryptodev_bcmfs_autotest, test_cryptodev_bcmfs);
16094 REGISTER_TEST_COMMAND(cryptodev_cn9k_autotest, test_cryptodev_cn9k);
16095 REGISTER_TEST_COMMAND(cryptodev_cn10k_autotest, test_cryptodev_cn10k);