a4116c6524d4efe89a1a152991ee6df4fa94d410
[deb_dpdk.git] / test / test / test_cryptodev.c
1 /*-
2  *   BSD LICENSE
3  *
4  *   Copyright(c) 2015-2017 Intel Corporation. All rights reserved.
5  *
6  *   Redistribution and use in source and binary forms, with or without
7  *   modification, are permitted provided that the following conditions
8  *   are met:
9  *
10  *       * Redistributions of source code must retain the above copyright
11  *         notice, this list of conditions and the following disclaimer.
12  *       * Redistributions in binary form must reproduce the above copyright
13  *         notice, this list of conditions and the following disclaimer in
14  *         the documentation and/or other materials provided with the
15  *         distribution.
16  *       * Neither the name of Intel Corporation nor the names of its
17  *         contributors may be used to endorse or promote products derived
18  *         from this software without specific prior written permission.
19  *
20  *   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
21  *   "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
22  *   LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
23  *   A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
24  *   OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
25  *   SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
26  *   LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
27  *   DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
28  *   THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
29  *   (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
30  *   OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
31  */
32
33 #include <rte_common.h>
34 #include <rte_hexdump.h>
35 #include <rte_mbuf.h>
36 #include <rte_malloc.h>
37 #include <rte_memcpy.h>
38 #include <rte_pause.h>
39
40 #include <rte_crypto.h>
41 #include <rte_cryptodev.h>
42 #include <rte_cryptodev_pmd.h>
43
44 #ifdef RTE_LIBRTE_PMD_CRYPTO_SCHEDULER
45 #include <rte_cryptodev_scheduler.h>
46 #include <rte_cryptodev_scheduler_operations.h>
47 #endif
48
49 #include "test.h"
50 #include "test_cryptodev.h"
51
52 #include "test_cryptodev_blockcipher.h"
53 #include "test_cryptodev_aes_test_vectors.h"
54 #include "test_cryptodev_des_test_vectors.h"
55 #include "test_cryptodev_hash_test_vectors.h"
56 #include "test_cryptodev_kasumi_test_vectors.h"
57 #include "test_cryptodev_kasumi_hash_test_vectors.h"
58 #include "test_cryptodev_snow3g_test_vectors.h"
59 #include "test_cryptodev_snow3g_hash_test_vectors.h"
60 #include "test_cryptodev_zuc_test_vectors.h"
61 #include "test_cryptodev_gcm_test_vectors.h"
62 #include "test_cryptodev_hmac_test_vectors.h"
63
64 static int gbl_driver_id;
65
66 struct crypto_testsuite_params {
67         struct rte_mempool *mbuf_pool;
68         struct rte_mempool *large_mbuf_pool;
69         struct rte_mempool *op_mpool;
70         struct rte_mempool *session_mpool;
71         struct rte_cryptodev_config conf;
72         struct rte_cryptodev_qp_conf qp_conf;
73
74         uint8_t valid_devs[RTE_CRYPTO_MAX_DEVS];
75         uint8_t valid_dev_count;
76 };
77
78 struct crypto_unittest_params {
79         struct rte_crypto_sym_xform cipher_xform;
80         struct rte_crypto_sym_xform auth_xform;
81         struct rte_crypto_sym_xform aead_xform;
82
83         struct rte_cryptodev_sym_session *sess;
84
85         struct rte_crypto_op *op;
86
87         struct rte_mbuf *obuf, *ibuf;
88
89         uint8_t *digest;
90 };
91
92 #define ALIGN_POW2_ROUNDUP(num, align) \
93         (((num) + (align) - 1) & ~((align) - 1))
94
95 /*
96  * Forward declarations.
97  */
98 static int
99 test_AES_CBC_HMAC_SHA512_decrypt_create_session_params(
100                 struct crypto_unittest_params *ut_params, uint8_t *cipher_key,
101                 uint8_t *hmac_key);
102
103 static int
104 test_AES_CBC_HMAC_SHA512_decrypt_perform(struct rte_cryptodev_sym_session *sess,
105                 struct crypto_unittest_params *ut_params,
106                 struct crypto_testsuite_params *ts_param,
107                 const uint8_t *cipher,
108                 const uint8_t *digest,
109                 const uint8_t *iv);
110
111 static struct rte_mbuf *
112 setup_test_string(struct rte_mempool *mpool,
113                 const char *string, size_t len, uint8_t blocksize)
114 {
115         struct rte_mbuf *m = rte_pktmbuf_alloc(mpool);
116         size_t t_len = len - (blocksize ? (len % blocksize) : 0);
117
118         memset(m->buf_addr, 0, m->buf_len);
119         if (m) {
120                 char *dst = rte_pktmbuf_append(m, t_len);
121
122                 if (!dst) {
123                         rte_pktmbuf_free(m);
124                         return NULL;
125                 }
126                 if (string != NULL)
127                         rte_memcpy(dst, string, t_len);
128                 else
129                         memset(dst, 0, t_len);
130         }
131
132         return m;
133 }
134
135 /* Get number of bytes in X bits (rounding up) */
136 static uint32_t
137 ceil_byte_length(uint32_t num_bits)
138 {
139         if (num_bits % 8)
140                 return ((num_bits >> 3) + 1);
141         else
142                 return (num_bits >> 3);
143 }
144
145 static struct rte_crypto_op *
146 process_crypto_request(uint8_t dev_id, struct rte_crypto_op *op)
147 {
148         if (rte_cryptodev_enqueue_burst(dev_id, 0, &op, 1) != 1) {
149                 printf("Error sending packet for encryption");
150                 return NULL;
151         }
152
153         op = NULL;
154
155         while (rte_cryptodev_dequeue_burst(dev_id, 0, &op, 1) == 0)
156                 rte_pause();
157
158         return op;
159 }
160
161 static struct crypto_testsuite_params testsuite_params = { NULL };
162 static struct crypto_unittest_params unittest_params;
163
164 static int
165 testsuite_setup(void)
166 {
167         struct crypto_testsuite_params *ts_params = &testsuite_params;
168         struct rte_cryptodev_info info;
169         uint32_t i = 0, nb_devs, dev_id;
170         int ret;
171         uint16_t qp_id;
172
173         memset(ts_params, 0, sizeof(*ts_params));
174
175         ts_params->mbuf_pool = rte_mempool_lookup("CRYPTO_MBUFPOOL");
176         if (ts_params->mbuf_pool == NULL) {
177                 /* Not already created so create */
178                 ts_params->mbuf_pool = rte_pktmbuf_pool_create(
179                                 "CRYPTO_MBUFPOOL",
180                                 NUM_MBUFS, MBUF_CACHE_SIZE, 0, MBUF_SIZE,
181                                 rte_socket_id());
182                 if (ts_params->mbuf_pool == NULL) {
183                         RTE_LOG(ERR, USER1, "Can't create CRYPTO_MBUFPOOL\n");
184                         return TEST_FAILED;
185                 }
186         }
187
188         ts_params->large_mbuf_pool = rte_mempool_lookup(
189                         "CRYPTO_LARGE_MBUFPOOL");
190         if (ts_params->large_mbuf_pool == NULL) {
191                 /* Not already created so create */
192                 ts_params->large_mbuf_pool = rte_pktmbuf_pool_create(
193                                 "CRYPTO_LARGE_MBUFPOOL",
194                                 1, 0, 0, UINT16_MAX,
195                                 rte_socket_id());
196                 if (ts_params->large_mbuf_pool == NULL) {
197                         RTE_LOG(ERR, USER1,
198                                 "Can't create CRYPTO_LARGE_MBUFPOOL\n");
199                         return TEST_FAILED;
200                 }
201         }
202
203         ts_params->op_mpool = rte_crypto_op_pool_create(
204                         "MBUF_CRYPTO_SYM_OP_POOL",
205                         RTE_CRYPTO_OP_TYPE_SYMMETRIC,
206                         NUM_MBUFS, MBUF_CACHE_SIZE,
207                         DEFAULT_NUM_XFORMS *
208                         sizeof(struct rte_crypto_sym_xform) +
209                         MAXIMUM_IV_LENGTH,
210                         rte_socket_id());
211         if (ts_params->op_mpool == NULL) {
212                 RTE_LOG(ERR, USER1, "Can't create CRYPTO_OP_POOL\n");
213                 return TEST_FAILED;
214         }
215
216         /* Create an AESNI MB device if required */
217         if (gbl_driver_id == rte_cryptodev_driver_id_get(
218                         RTE_STR(CRYPTODEV_NAME_AESNI_MB_PMD))) {
219                 nb_devs = rte_cryptodev_device_count_by_driver(
220                                 rte_cryptodev_driver_id_get(
221                                 RTE_STR(CRYPTODEV_NAME_AESNI_MB_PMD)));
222                 if (nb_devs < 1) {
223                         ret = rte_vdev_init(
224                                 RTE_STR(CRYPTODEV_NAME_AESNI_MB_PMD), NULL);
225
226                         TEST_ASSERT(ret == 0,
227                                 "Failed to create instance of"
228                                 " pmd : %s",
229                                 RTE_STR(CRYPTODEV_NAME_AESNI_MB_PMD));
230                 }
231         }
232
233         /* Create an AESNI GCM device if required */
234         if (gbl_driver_id == rte_cryptodev_driver_id_get(
235                         RTE_STR(CRYPTODEV_NAME_AESNI_GCM_PMD))) {
236                 nb_devs = rte_cryptodev_device_count_by_driver(
237                                 rte_cryptodev_driver_id_get(
238                                 RTE_STR(CRYPTODEV_NAME_AESNI_GCM_PMD)));
239                 if (nb_devs < 1) {
240                         TEST_ASSERT_SUCCESS(rte_vdev_init(
241                                 RTE_STR(CRYPTODEV_NAME_AESNI_GCM_PMD), NULL),
242                                 "Failed to create instance of"
243                                 " pmd : %s",
244                                 RTE_STR(CRYPTODEV_NAME_AESNI_GCM_PMD));
245                 }
246         }
247
248         /* Create a SNOW 3G device if required */
249         if (gbl_driver_id == rte_cryptodev_driver_id_get(
250                         RTE_STR(CRYPTODEV_NAME_SNOW3G_PMD))) {
251                 nb_devs = rte_cryptodev_device_count_by_driver(
252                                 rte_cryptodev_driver_id_get(
253                                 RTE_STR(CRYPTODEV_NAME_SNOW3G_PMD)));
254                 if (nb_devs < 1) {
255                         TEST_ASSERT_SUCCESS(rte_vdev_init(
256                                 RTE_STR(CRYPTODEV_NAME_SNOW3G_PMD), NULL),
257                                 "Failed to create instance of"
258                                 " pmd : %s",
259                                 RTE_STR(CRYPTODEV_NAME_SNOW3G_PMD));
260                 }
261         }
262
263         /* Create a KASUMI device if required */
264         if (gbl_driver_id == rte_cryptodev_driver_id_get(
265                         RTE_STR(CRYPTODEV_NAME_KASUMI_PMD))) {
266                 nb_devs = rte_cryptodev_device_count_by_driver(
267                                 rte_cryptodev_driver_id_get(
268                                 RTE_STR(CRYPTODEV_NAME_KASUMI_PMD)));
269                 if (nb_devs < 1) {
270                         TEST_ASSERT_SUCCESS(rte_vdev_init(
271                                 RTE_STR(CRYPTODEV_NAME_KASUMI_PMD), NULL),
272                                 "Failed to create instance of"
273                                 " pmd : %s",
274                                 RTE_STR(CRYPTODEV_NAME_KASUMI_PMD));
275                 }
276         }
277
278         /* Create a ZUC device if required */
279         if (gbl_driver_id == rte_cryptodev_driver_id_get(
280                         RTE_STR(CRYPTODEV_NAME_ZUC_PMD))) {
281                 nb_devs = rte_cryptodev_device_count_by_driver(
282                                 rte_cryptodev_driver_id_get(
283                                 RTE_STR(CRYPTODEV_NAME_ZUC_PMD)));
284                 if (nb_devs < 1) {
285                         TEST_ASSERT_SUCCESS(rte_vdev_init(
286                                 RTE_STR(CRYPTODEV_NAME_ZUC_PMD), NULL),
287                                 "Failed to create instance of"
288                                 " pmd : %s",
289                                 RTE_STR(CRYPTODEV_NAME_ZUC_PMD));
290                 }
291         }
292
293         /* Create a NULL device if required */
294         if (gbl_driver_id == rte_cryptodev_driver_id_get(
295                         RTE_STR(CRYPTODEV_NAME_NULL_PMD))) {
296                 nb_devs = rte_cryptodev_device_count_by_driver(
297                                 rte_cryptodev_driver_id_get(
298                                 RTE_STR(CRYPTODEV_NAME_NULL_PMD)));
299                 if (nb_devs < 1) {
300                         ret = rte_vdev_init(
301                                 RTE_STR(CRYPTODEV_NAME_NULL_PMD), NULL);
302
303                         TEST_ASSERT(ret == 0,
304                                 "Failed to create instance of"
305                                 " pmd : %s",
306                                 RTE_STR(CRYPTODEV_NAME_NULL_PMD));
307                 }
308         }
309
310         /* Create an OPENSSL device if required */
311         if (gbl_driver_id == rte_cryptodev_driver_id_get(
312                         RTE_STR(CRYPTODEV_NAME_OPENSSL_PMD))) {
313                 nb_devs = rte_cryptodev_device_count_by_driver(
314                                 rte_cryptodev_driver_id_get(
315                                 RTE_STR(CRYPTODEV_NAME_OPENSSL_PMD)));
316                 if (nb_devs < 1) {
317                         ret = rte_vdev_init(
318                                 RTE_STR(CRYPTODEV_NAME_OPENSSL_PMD),
319                                 NULL);
320
321                         TEST_ASSERT(ret == 0, "Failed to create "
322                                 "instance of pmd : %s",
323                                 RTE_STR(CRYPTODEV_NAME_OPENSSL_PMD));
324                 }
325         }
326
327         /* Create a ARMv8 device if required */
328         if (gbl_driver_id == rte_cryptodev_driver_id_get(
329                         RTE_STR(CRYPTODEV_NAME_ARMV8_PMD))) {
330                 nb_devs = rte_cryptodev_device_count_by_driver(
331                                 rte_cryptodev_driver_id_get(
332                                 RTE_STR(CRYPTODEV_NAME_ARMV8_PMD)));
333                 if (nb_devs < 1) {
334                         ret = rte_vdev_init(
335                                 RTE_STR(CRYPTODEV_NAME_ARMV8_PMD),
336                                 NULL);
337
338                         TEST_ASSERT(ret == 0, "Failed to create "
339                                 "instance of pmd : %s",
340                                 RTE_STR(CRYPTODEV_NAME_ARMV8_PMD));
341                 }
342         }
343
344 #ifdef RTE_LIBRTE_PMD_CRYPTO_SCHEDULER
345         if (gbl_driver_id == rte_cryptodev_driver_id_get(
346                         RTE_STR(CRYPTODEV_NAME_SCHEDULER_PMD))) {
347
348                 nb_devs = rte_cryptodev_device_count_by_driver(
349                                 rte_cryptodev_driver_id_get(
350                                 RTE_STR(CRYPTODEV_NAME_SCHEDULER_PMD)));
351                 if (nb_devs < 1) {
352                         ret = rte_vdev_init(
353                                 RTE_STR(CRYPTODEV_NAME_SCHEDULER_PMD),
354                                 NULL);
355
356                         TEST_ASSERT(ret == 0,
357                                 "Failed to create instance %u of"
358                                 " pmd : %s",
359                                 i, RTE_STR(CRYPTODEV_NAME_SCHEDULER_PMD));
360                 }
361         }
362 #endif /* RTE_LIBRTE_PMD_CRYPTO_SCHEDULER */
363
364         nb_devs = rte_cryptodev_count();
365         if (nb_devs < 1) {
366                 RTE_LOG(ERR, USER1, "No crypto devices found?\n");
367                 return TEST_FAILED;
368         }
369
370         /* Create list of valid crypto devs */
371         for (i = 0; i < nb_devs; i++) {
372                 rte_cryptodev_info_get(i, &info);
373                 if (info.driver_id == gbl_driver_id)
374                         ts_params->valid_devs[ts_params->valid_dev_count++] = i;
375         }
376
377         if (ts_params->valid_dev_count < 1)
378                 return TEST_FAILED;
379
380         /* Set up all the qps on the first of the valid devices found */
381
382         dev_id = ts_params->valid_devs[0];
383
384         rte_cryptodev_info_get(dev_id, &info);
385
386         ts_params->conf.nb_queue_pairs = info.max_nb_queue_pairs;
387         ts_params->conf.socket_id = SOCKET_ID_ANY;
388
389         unsigned int session_size = rte_cryptodev_get_private_session_size(dev_id);
390
391         /*
392          * Create mempool with maximum number of sessions * 2,
393          * to include the session headers
394          */
395         ts_params->session_mpool = rte_mempool_create(
396                                 "test_sess_mp",
397                                 info.sym.max_nb_sessions * 2,
398                                 session_size,
399                                 0, 0, NULL, NULL, NULL,
400                                 NULL, SOCKET_ID_ANY,
401                                 0);
402
403         TEST_ASSERT_NOT_NULL(ts_params->session_mpool,
404                         "session mempool allocation failed");
405
406         TEST_ASSERT_SUCCESS(rte_cryptodev_configure(dev_id,
407                         &ts_params->conf),
408                         "Failed to configure cryptodev %u with %u qps",
409                         dev_id, ts_params->conf.nb_queue_pairs);
410
411         ts_params->qp_conf.nb_descriptors = DEFAULT_NUM_OPS_INFLIGHT;
412
413         for (qp_id = 0; qp_id < info.max_nb_queue_pairs; qp_id++) {
414                 TEST_ASSERT_SUCCESS(rte_cryptodev_queue_pair_setup(
415                         dev_id, qp_id, &ts_params->qp_conf,
416                         rte_cryptodev_socket_id(dev_id),
417                         ts_params->session_mpool),
418                         "Failed to setup queue pair %u on cryptodev %u",
419                         qp_id, dev_id);
420         }
421
422         return TEST_SUCCESS;
423 }
424
425 static void
426 testsuite_teardown(void)
427 {
428         struct crypto_testsuite_params *ts_params = &testsuite_params;
429
430         if (ts_params->mbuf_pool != NULL) {
431                 RTE_LOG(DEBUG, USER1, "CRYPTO_MBUFPOOL count %u\n",
432                 rte_mempool_avail_count(ts_params->mbuf_pool));
433         }
434
435         if (ts_params->op_mpool != NULL) {
436                 RTE_LOG(DEBUG, USER1, "CRYPTO_OP_POOL count %u\n",
437                 rte_mempool_avail_count(ts_params->op_mpool));
438         }
439
440         /* Free session mempools */
441         if (ts_params->session_mpool != NULL) {
442                 rte_mempool_free(ts_params->session_mpool);
443                 ts_params->session_mpool = NULL;
444         }
445 }
446
447 static int
448 ut_setup(void)
449 {
450         struct crypto_testsuite_params *ts_params = &testsuite_params;
451         struct crypto_unittest_params *ut_params = &unittest_params;
452
453         uint16_t qp_id;
454
455         /* Clear unit test parameters before running test */
456         memset(ut_params, 0, sizeof(*ut_params));
457
458         /* Reconfigure device to default parameters */
459         ts_params->conf.socket_id = SOCKET_ID_ANY;
460
461         TEST_ASSERT_SUCCESS(rte_cryptodev_configure(ts_params->valid_devs[0],
462                         &ts_params->conf),
463                         "Failed to configure cryptodev %u",
464                         ts_params->valid_devs[0]);
465
466         for (qp_id = 0; qp_id < ts_params->conf.nb_queue_pairs ; qp_id++) {
467                 TEST_ASSERT_SUCCESS(rte_cryptodev_queue_pair_setup(
468                         ts_params->valid_devs[0], qp_id,
469                         &ts_params->qp_conf,
470                         rte_cryptodev_socket_id(ts_params->valid_devs[0]),
471                         ts_params->session_mpool),
472                         "Failed to setup queue pair %u on cryptodev %u",
473                         qp_id, ts_params->valid_devs[0]);
474         }
475
476
477         rte_cryptodev_stats_reset(ts_params->valid_devs[0]);
478
479         /* Start the device */
480         TEST_ASSERT_SUCCESS(rte_cryptodev_start(ts_params->valid_devs[0]),
481                         "Failed to start cryptodev %u",
482                         ts_params->valid_devs[0]);
483
484         return TEST_SUCCESS;
485 }
486
487 static void
488 ut_teardown(void)
489 {
490         struct crypto_testsuite_params *ts_params = &testsuite_params;
491         struct crypto_unittest_params *ut_params = &unittest_params;
492         struct rte_cryptodev_stats stats;
493
494         /* free crypto session structure */
495         if (ut_params->sess) {
496                 rte_cryptodev_sym_session_clear(ts_params->valid_devs[0],
497                                 ut_params->sess);
498                 rte_cryptodev_sym_session_free(ut_params->sess);
499                 ut_params->sess = NULL;
500         }
501
502         /* free crypto operation structure */
503         if (ut_params->op)
504                 rte_crypto_op_free(ut_params->op);
505
506         /*
507          * free mbuf - both obuf and ibuf are usually the same,
508          * so check if they point at the same address is necessary,
509          * to avoid freeing the mbuf twice.
510          */
511         if (ut_params->obuf) {
512                 rte_pktmbuf_free(ut_params->obuf);
513                 if (ut_params->ibuf == ut_params->obuf)
514                         ut_params->ibuf = 0;
515                 ut_params->obuf = 0;
516         }
517         if (ut_params->ibuf) {
518                 rte_pktmbuf_free(ut_params->ibuf);
519                 ut_params->ibuf = 0;
520         }
521
522         if (ts_params->mbuf_pool != NULL)
523                 RTE_LOG(DEBUG, USER1, "CRYPTO_MBUFPOOL count %u\n",
524                         rte_mempool_avail_count(ts_params->mbuf_pool));
525
526         rte_cryptodev_stats_get(ts_params->valid_devs[0], &stats);
527
528         /* Stop the device */
529         rte_cryptodev_stop(ts_params->valid_devs[0]);
530 }
531
532 static int
533 test_device_configure_invalid_dev_id(void)
534 {
535         struct crypto_testsuite_params *ts_params = &testsuite_params;
536         uint16_t dev_id, num_devs = 0;
537
538         TEST_ASSERT((num_devs = rte_cryptodev_count()) >= 1,
539                         "Need at least %d devices for test", 1);
540
541         /* valid dev_id values */
542         dev_id = ts_params->valid_devs[ts_params->valid_dev_count - 1];
543
544         /* Stop the device in case it's started so it can be configured */
545         rte_cryptodev_stop(ts_params->valid_devs[dev_id]);
546
547         TEST_ASSERT_SUCCESS(rte_cryptodev_configure(dev_id, &ts_params->conf),
548                         "Failed test for rte_cryptodev_configure: "
549                         "invalid dev_num %u", dev_id);
550
551         /* invalid dev_id values */
552         dev_id = num_devs;
553
554         TEST_ASSERT_FAIL(rte_cryptodev_configure(dev_id, &ts_params->conf),
555                         "Failed test for rte_cryptodev_configure: "
556                         "invalid dev_num %u", dev_id);
557
558         dev_id = 0xff;
559
560         TEST_ASSERT_FAIL(rte_cryptodev_configure(dev_id, &ts_params->conf),
561                         "Failed test for rte_cryptodev_configure:"
562                         "invalid dev_num %u", dev_id);
563
564         return TEST_SUCCESS;
565 }
566
567 static int
568 test_device_configure_invalid_queue_pair_ids(void)
569 {
570         struct crypto_testsuite_params *ts_params = &testsuite_params;
571         uint16_t orig_nb_qps = ts_params->conf.nb_queue_pairs;
572
573         /* Stop the device in case it's started so it can be configured */
574         rte_cryptodev_stop(ts_params->valid_devs[0]);
575
576         /* valid - one queue pairs */
577         ts_params->conf.nb_queue_pairs = 1;
578
579         TEST_ASSERT_SUCCESS(rte_cryptodev_configure(ts_params->valid_devs[0],
580                         &ts_params->conf),
581                         "Failed to configure cryptodev: dev_id %u, qp_id %u",
582                         ts_params->valid_devs[0], ts_params->conf.nb_queue_pairs);
583
584
585         /* valid - max value queue pairs */
586         ts_params->conf.nb_queue_pairs = MAX_NUM_QPS_PER_QAT_DEVICE;
587
588         TEST_ASSERT_SUCCESS(rte_cryptodev_configure(ts_params->valid_devs[0],
589                         &ts_params->conf),
590                         "Failed to configure cryptodev: dev_id %u, qp_id %u",
591                         ts_params->valid_devs[0],
592                         ts_params->conf.nb_queue_pairs);
593
594
595         /* invalid - zero queue pairs */
596         ts_params->conf.nb_queue_pairs = 0;
597
598         TEST_ASSERT_FAIL(rte_cryptodev_configure(ts_params->valid_devs[0],
599                         &ts_params->conf),
600                         "Failed test for rte_cryptodev_configure, dev_id %u,"
601                         " invalid qps: %u",
602                         ts_params->valid_devs[0],
603                         ts_params->conf.nb_queue_pairs);
604
605
606         /* invalid - max value supported by field queue pairs */
607         ts_params->conf.nb_queue_pairs = UINT16_MAX;
608
609         TEST_ASSERT_FAIL(rte_cryptodev_configure(ts_params->valid_devs[0],
610                         &ts_params->conf),
611                         "Failed test for rte_cryptodev_configure, dev_id %u,"
612                         " invalid qps: %u",
613                         ts_params->valid_devs[0],
614                         ts_params->conf.nb_queue_pairs);
615
616
617         /* invalid - max value + 1 queue pairs */
618         ts_params->conf.nb_queue_pairs = MAX_NUM_QPS_PER_QAT_DEVICE + 1;
619
620         TEST_ASSERT_FAIL(rte_cryptodev_configure(ts_params->valid_devs[0],
621                         &ts_params->conf),
622                         "Failed test for rte_cryptodev_configure, dev_id %u,"
623                         " invalid qps: %u",
624                         ts_params->valid_devs[0],
625                         ts_params->conf.nb_queue_pairs);
626
627         /* revert to original testsuite value */
628         ts_params->conf.nb_queue_pairs = orig_nb_qps;
629
630         return TEST_SUCCESS;
631 }
632
633 static int
634 test_queue_pair_descriptor_setup(void)
635 {
636         struct crypto_testsuite_params *ts_params = &testsuite_params;
637         struct rte_cryptodev_info dev_info;
638         struct rte_cryptodev_qp_conf qp_conf = {
639                 .nb_descriptors = MAX_NUM_OPS_INFLIGHT
640         };
641
642         uint16_t qp_id;
643
644         /* Stop the device in case it's started so it can be configured */
645         rte_cryptodev_stop(ts_params->valid_devs[0]);
646
647
648         rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
649
650         TEST_ASSERT_SUCCESS(rte_cryptodev_configure(ts_params->valid_devs[0],
651                         &ts_params->conf),
652                         "Failed to configure cryptodev %u",
653                         ts_params->valid_devs[0]);
654
655         /*
656          * Test various ring sizes on this device. memzones can't be
657          * freed so are re-used if ring is released and re-created.
658          */
659         qp_conf.nb_descriptors = MIN_NUM_OPS_INFLIGHT; /* min size*/
660
661         for (qp_id = 0; qp_id < ts_params->conf.nb_queue_pairs; qp_id++) {
662                 TEST_ASSERT_SUCCESS(rte_cryptodev_queue_pair_setup(
663                                 ts_params->valid_devs[0], qp_id, &qp_conf,
664                                 rte_cryptodev_socket_id(
665                                                 ts_params->valid_devs[0]),
666                                 ts_params->session_mpool),
667                                 "Failed test for "
668                                 "rte_cryptodev_queue_pair_setup: num_inflights "
669                                 "%u on qp %u on cryptodev %u",
670                                 qp_conf.nb_descriptors, qp_id,
671                                 ts_params->valid_devs[0]);
672         }
673
674         qp_conf.nb_descriptors = (uint32_t)(MAX_NUM_OPS_INFLIGHT / 2);
675
676         for (qp_id = 0; qp_id < ts_params->conf.nb_queue_pairs; qp_id++) {
677                 TEST_ASSERT_SUCCESS(rte_cryptodev_queue_pair_setup(
678                                 ts_params->valid_devs[0], qp_id, &qp_conf,
679                                 rte_cryptodev_socket_id(
680                                                 ts_params->valid_devs[0]),
681                                 ts_params->session_mpool),
682                                 "Failed test for"
683                                 " rte_cryptodev_queue_pair_setup: num_inflights"
684                                 " %u on qp %u on cryptodev %u",
685                                 qp_conf.nb_descriptors, qp_id,
686                                 ts_params->valid_devs[0]);
687         }
688
689         qp_conf.nb_descriptors = MAX_NUM_OPS_INFLIGHT; /* valid */
690
691         for (qp_id = 0; qp_id < ts_params->conf.nb_queue_pairs; qp_id++) {
692                 TEST_ASSERT_SUCCESS(rte_cryptodev_queue_pair_setup(
693                                 ts_params->valid_devs[0], qp_id, &qp_conf,
694                                 rte_cryptodev_socket_id(
695                                                 ts_params->valid_devs[0]),
696                                 ts_params->session_mpool),
697                                 "Failed test for "
698                                 "rte_cryptodev_queue_pair_setup: num_inflights"
699                                 " %u on qp %u on cryptodev %u",
700                                 qp_conf.nb_descriptors, qp_id,
701                                 ts_params->valid_devs[0]);
702         }
703
704         /* invalid number of descriptors - max supported + 2 */
705         qp_conf.nb_descriptors = MAX_NUM_OPS_INFLIGHT + 2;
706
707         for (qp_id = 0; qp_id < ts_params->conf.nb_queue_pairs; qp_id++) {
708                 TEST_ASSERT_FAIL(rte_cryptodev_queue_pair_setup(
709                                 ts_params->valid_devs[0], qp_id, &qp_conf,
710                                 rte_cryptodev_socket_id(
711                                                 ts_params->valid_devs[0]),
712                                 ts_params->session_mpool),
713                                 "Unexpectedly passed test for "
714                                 "rte_cryptodev_queue_pair_setup:"
715                                 "num_inflights %u on qp %u on cryptodev %u",
716                                 qp_conf.nb_descriptors, qp_id,
717                                 ts_params->valid_devs[0]);
718         }
719
720         /* invalid number of descriptors - max value of parameter */
721         qp_conf.nb_descriptors = UINT32_MAX-1;
722
723         for (qp_id = 0; qp_id < ts_params->conf.nb_queue_pairs; qp_id++) {
724                 TEST_ASSERT_FAIL(rte_cryptodev_queue_pair_setup(
725                                 ts_params->valid_devs[0], qp_id, &qp_conf,
726                                 rte_cryptodev_socket_id(
727                                                 ts_params->valid_devs[0]),
728                                 ts_params->session_mpool),
729                                 "Unexpectedly passed test for "
730                                 "rte_cryptodev_queue_pair_setup:"
731                                 "num_inflights %u on qp %u on cryptodev %u",
732                                 qp_conf.nb_descriptors, qp_id,
733                                 ts_params->valid_devs[0]);
734         }
735
736         qp_conf.nb_descriptors = DEFAULT_NUM_OPS_INFLIGHT;
737
738         for (qp_id = 0; qp_id < ts_params->conf.nb_queue_pairs; qp_id++) {
739                 TEST_ASSERT_SUCCESS(rte_cryptodev_queue_pair_setup(
740                                 ts_params->valid_devs[0], qp_id, &qp_conf,
741                                 rte_cryptodev_socket_id(
742                                                 ts_params->valid_devs[0]),
743                                 ts_params->session_mpool),
744                                 "Failed test for"
745                                 " rte_cryptodev_queue_pair_setup:"
746                                 "num_inflights %u on qp %u on cryptodev %u",
747                                 qp_conf.nb_descriptors, qp_id,
748                                 ts_params->valid_devs[0]);
749         }
750
751         /* invalid number of descriptors - max supported + 1 */
752         qp_conf.nb_descriptors = DEFAULT_NUM_OPS_INFLIGHT + 1;
753
754         for (qp_id = 0; qp_id < ts_params->conf.nb_queue_pairs; qp_id++) {
755                 TEST_ASSERT_FAIL(rte_cryptodev_queue_pair_setup(
756                                 ts_params->valid_devs[0], qp_id, &qp_conf,
757                                 rte_cryptodev_socket_id(
758                                                 ts_params->valid_devs[0]),
759                                 ts_params->session_mpool),
760                                 "Unexpectedly passed test for "
761                                 "rte_cryptodev_queue_pair_setup:"
762                                 "num_inflights %u on qp %u on cryptodev %u",
763                                 qp_conf.nb_descriptors, qp_id,
764                                 ts_params->valid_devs[0]);
765         }
766
767         /* test invalid queue pair id */
768         qp_conf.nb_descriptors = DEFAULT_NUM_OPS_INFLIGHT;      /*valid */
769
770         qp_id = DEFAULT_NUM_QPS_PER_QAT_DEVICE;         /*invalid */
771
772         TEST_ASSERT_FAIL(rte_cryptodev_queue_pair_setup(
773                         ts_params->valid_devs[0],
774                         qp_id, &qp_conf,
775                         rte_cryptodev_socket_id(ts_params->valid_devs[0]),
776                         ts_params->session_mpool),
777                         "Failed test for rte_cryptodev_queue_pair_setup:"
778                         "invalid qp %u on cryptodev %u",
779                         qp_id, ts_params->valid_devs[0]);
780
781         qp_id = 0xffff; /*invalid*/
782
783         TEST_ASSERT_FAIL(rte_cryptodev_queue_pair_setup(
784                         ts_params->valid_devs[0],
785                         qp_id, &qp_conf,
786                         rte_cryptodev_socket_id(ts_params->valid_devs[0]),
787                         ts_params->session_mpool),
788                         "Failed test for rte_cryptodev_queue_pair_setup:"
789                         "invalid qp %u on cryptodev %u",
790                         qp_id, ts_params->valid_devs[0]);
791
792         return TEST_SUCCESS;
793 }
794
795 /* ***** Plaintext data for tests ***** */
796
797 const char catch_22_quote_1[] =
798                 "There was only one catch and that was Catch-22, which "
799                 "specified that a concern for one's safety in the face of "
800                 "dangers that were real and immediate was the process of a "
801                 "rational mind. Orr was crazy and could be grounded. All he "
802                 "had to do was ask; and as soon as he did, he would no longer "
803                 "be crazy and would have to fly more missions. Orr would be "
804                 "crazy to fly more missions and sane if he didn't, but if he "
805                 "was sane he had to fly them. If he flew them he was crazy "
806                 "and didn't have to; but if he didn't want to he was sane and "
807                 "had to. Yossarian was moved very deeply by the absolute "
808                 "simplicity of this clause of Catch-22 and let out a "
809                 "respectful whistle. \"That's some catch, that Catch-22\", he "
810                 "observed. \"It's the best there is,\" Doc Daneeka agreed.";
811
812 const char catch_22_quote[] =
813                 "What a lousy earth! He wondered how many people were "
814                 "destitute that same night even in his own prosperous country, "
815                 "how many homes were shanties, how many husbands were drunk "
816                 "and wives socked, and how many children were bullied, abused, "
817                 "or abandoned. How many families hungered for food they could "
818                 "not afford to buy? How many hearts were broken? How many "
819                 "suicides would take place that same night, how many people "
820                 "would go insane? How many cockroaches and landlords would "
821                 "triumph? How many winners were losers, successes failures, "
822                 "and rich men poor men? How many wise guys were stupid? How "
823                 "many happy endings were unhappy endings? How many honest men "
824                 "were liars, brave men cowards, loyal men traitors, how many "
825                 "sainted men were corrupt, how many people in positions of "
826                 "trust had sold their souls to bodyguards, how many had never "
827                 "had souls? How many straight-and-narrow paths were crooked "
828                 "paths? How many best families were worst families and how "
829                 "many good people were bad people? When you added them all up "
830                 "and then subtracted, you might be left with only the children, "
831                 "and perhaps with Albert Einstein and an old violinist or "
832                 "sculptor somewhere.";
833
834 #define QUOTE_480_BYTES         (480)
835 #define QUOTE_512_BYTES         (512)
836 #define QUOTE_768_BYTES         (768)
837 #define QUOTE_1024_BYTES        (1024)
838
839
840
841 /* ***** SHA1 Hash Tests ***** */
842
843 #define HMAC_KEY_LENGTH_SHA1    (DIGEST_BYTE_LENGTH_SHA1)
844
845 static uint8_t hmac_sha1_key[] = {
846         0xF8, 0x2A, 0xC7, 0x54, 0xDB, 0x96, 0x18, 0xAA,
847         0xC3, 0xA1, 0x53, 0xF6, 0x1F, 0x17, 0x60, 0xBD,
848         0xDE, 0xF4, 0xDE, 0xAD };
849
850 /* ***** SHA224 Hash Tests ***** */
851
852 #define HMAC_KEY_LENGTH_SHA224  (DIGEST_BYTE_LENGTH_SHA224)
853
854
855 /* ***** AES-CBC Cipher Tests ***** */
856
857 #define CIPHER_KEY_LENGTH_AES_CBC       (16)
858 #define CIPHER_IV_LENGTH_AES_CBC        (CIPHER_KEY_LENGTH_AES_CBC)
859
860 static uint8_t aes_cbc_key[] = {
861         0xE4, 0x23, 0x33, 0x8A, 0x35, 0x64, 0x61, 0xE2,
862         0x49, 0x03, 0xDD, 0xC6, 0xB8, 0xCA, 0x55, 0x7A };
863
864 static uint8_t aes_cbc_iv[] = {
865         0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
866         0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f };
867
868
869 /* ***** AES-CBC / HMAC-SHA1 Hash Tests ***** */
870
871 static const uint8_t catch_22_quote_2_512_bytes_AES_CBC_ciphertext[] = {
872         0x8B, 0x4D, 0xDA, 0x1B, 0xCF, 0x04, 0xA0, 0x31,
873         0xB4, 0xBF, 0xBD, 0x68, 0x43, 0x20, 0x7E, 0x76,
874         0xB1, 0x96, 0x8B, 0xA2, 0x7C, 0xA2, 0x83, 0x9E,
875         0x39, 0x5A, 0x2F, 0x7E, 0x92, 0xB4, 0x48, 0x1A,
876         0x3F, 0x6B, 0x5D, 0xDF, 0x52, 0x85, 0x5F, 0x8E,
877         0x42, 0x3C, 0xFB, 0xE9, 0x1A, 0x24, 0xD6, 0x08,
878         0xDD, 0xFD, 0x16, 0xFB, 0xE9, 0x55, 0xEF, 0xF0,
879         0xA0, 0x8D, 0x13, 0xAB, 0x81, 0xC6, 0x90, 0x01,
880         0xB5, 0x18, 0x84, 0xB3, 0xF6, 0xE6, 0x11, 0x57,
881         0xD6, 0x71, 0xC6, 0x3C, 0x3F, 0x2F, 0x33, 0xEE,
882         0x24, 0x42, 0x6E, 0xAC, 0x0B, 0xCA, 0xEC, 0xF9,
883         0x84, 0xF8, 0x22, 0xAA, 0x60, 0xF0, 0x32, 0xA9,
884         0x75, 0x75, 0x3B, 0xCB, 0x70, 0x21, 0x0A, 0x8D,
885         0x0F, 0xE0, 0xC4, 0x78, 0x2B, 0xF8, 0x97, 0xE3,
886         0xE4, 0x26, 0x4B, 0x29, 0xDA, 0x88, 0xCD, 0x46,
887         0xEC, 0xAA, 0xF9, 0x7F, 0xF1, 0x15, 0xEA, 0xC3,
888         0x87, 0xE6, 0x31, 0xF2, 0xCF, 0xDE, 0x4D, 0x80,
889         0x70, 0x91, 0x7E, 0x0C, 0xF7, 0x26, 0x3A, 0x92,
890         0x4F, 0x18, 0x83, 0xC0, 0x8F, 0x59, 0x01, 0xA5,
891         0x88, 0xD1, 0xDB, 0x26, 0x71, 0x27, 0x16, 0xF5,
892         0xEE, 0x10, 0x82, 0xAC, 0x68, 0x26, 0x9B, 0xE2,
893         0x6D, 0xD8, 0x9A, 0x80, 0xDF, 0x04, 0x31, 0xD5,
894         0xF1, 0x35, 0x5C, 0x3B, 0xDD, 0x9A, 0x65, 0xBA,
895         0x58, 0x34, 0x85, 0x61, 0x1C, 0x42, 0x10, 0x76,
896         0x73, 0x02, 0x42, 0xC9, 0x23, 0x18, 0x8E, 0xB4,
897         0x6F, 0xB4, 0xA3, 0x54, 0x6E, 0x88, 0x3B, 0x62,
898         0x7C, 0x02, 0x8D, 0x4C, 0x9F, 0xC8, 0x45, 0xF4,
899         0xC9, 0xDE, 0x4F, 0xEB, 0x22, 0x83, 0x1B, 0xE4,
900         0x49, 0x37, 0xE4, 0xAD, 0xE7, 0xCD, 0x21, 0x54,
901         0xBC, 0x1C, 0xC2, 0x04, 0x97, 0xB4, 0x10, 0x61,
902         0xF0, 0xE4, 0xEF, 0x27, 0x63, 0x3A, 0xDA, 0x91,
903         0x41, 0x25, 0x62, 0x1C, 0x5C, 0xB6, 0x38, 0x4A,
904         0x88, 0x71, 0x59, 0x5A, 0x8D, 0xA0, 0x09, 0xAF,
905         0x72, 0x94, 0xD7, 0x79, 0x5C, 0x60, 0x7C, 0x8F,
906         0x4C, 0xF5, 0xD9, 0xA1, 0x39, 0x6D, 0x81, 0x28,
907         0xEF, 0x13, 0x28, 0xDF, 0xF5, 0x3E, 0xF7, 0x8E,
908         0x09, 0x9C, 0x78, 0x18, 0x79, 0xB8, 0x68, 0xD7,
909         0xA8, 0x29, 0x62, 0xAD, 0xDE, 0xE1, 0x61, 0x76,
910         0x1B, 0x05, 0x16, 0xCD, 0xBF, 0x02, 0x8E, 0xA6,
911         0x43, 0x6E, 0x92, 0x55, 0x4F, 0x60, 0x9C, 0x03,
912         0xB8, 0x4F, 0xA3, 0x02, 0xAC, 0xA8, 0xA7, 0x0C,
913         0x1E, 0xB5, 0x6B, 0xF8, 0xC8, 0x4D, 0xDE, 0xD2,
914         0xB0, 0x29, 0x6E, 0x40, 0xE6, 0xD6, 0xC9, 0xE6,
915         0xB9, 0x0F, 0xB6, 0x63, 0xF5, 0xAA, 0x2B, 0x96,
916         0xA7, 0x16, 0xAC, 0x4E, 0x0A, 0x33, 0x1C, 0xA6,
917         0xE6, 0xBD, 0x8A, 0xCF, 0x40, 0xA9, 0xB2, 0xFA,
918         0x63, 0x27, 0xFD, 0x9B, 0xD9, 0xFC, 0xD5, 0x87,
919         0x8D, 0x4C, 0xB6, 0xA4, 0xCB, 0xE7, 0x74, 0x55,
920         0xF4, 0xFB, 0x41, 0x25, 0xB5, 0x4B, 0x0A, 0x1B,
921         0xB1, 0xD6, 0xB7, 0xD9, 0x47, 0x2A, 0xC3, 0x98,
922         0x6A, 0xC4, 0x03, 0x73, 0x1F, 0x93, 0x6E, 0x53,
923         0x19, 0x25, 0x64, 0x15, 0x83, 0xF9, 0x73, 0x2A,
924         0x74, 0xB4, 0x93, 0x69, 0xC4, 0x72, 0xFC, 0x26,
925         0xA2, 0x9F, 0x43, 0x45, 0xDD, 0xB9, 0xEF, 0x36,
926         0xC8, 0x3A, 0xCD, 0x99, 0x9B, 0x54, 0x1A, 0x36,
927         0xC1, 0x59, 0xF8, 0x98, 0xA8, 0xCC, 0x28, 0x0D,
928         0x73, 0x4C, 0xEE, 0x98, 0xCB, 0x7C, 0x58, 0x7E,
929         0x20, 0x75, 0x1E, 0xB7, 0xC9, 0xF8, 0xF2, 0x0E,
930         0x63, 0x9E, 0x05, 0x78, 0x1A, 0xB6, 0xA8, 0x7A,
931         0xF9, 0x98, 0x6A, 0xA6, 0x46, 0x84, 0x2E, 0xF6,
932         0x4B, 0xDC, 0x9B, 0x8F, 0x9B, 0x8F, 0xEE, 0xB4,
933         0xAA, 0x3F, 0xEE, 0xC0, 0x37, 0x27, 0x76, 0xC7,
934         0x95, 0xBB, 0x26, 0x74, 0x69, 0x12, 0x7F, 0xF1,
935         0xBB, 0xFF, 0xAE, 0xB5, 0x99, 0x6E, 0xCB, 0x0C
936 };
937
938 static const uint8_t catch_22_quote_2_512_bytes_AES_CBC_HMAC_SHA1_digest[] = {
939         0x9a, 0x4f, 0x88, 0x1b, 0xb6, 0x8f, 0xd8, 0x60,
940         0x42, 0x1a, 0x7d, 0x3d, 0xf5, 0x82, 0x80, 0xf1,
941         0x18, 0x8c, 0x1d, 0x32
942 };
943
944
945 /* Multisession Vector context Test */
946 /*Begin Session 0 */
947 static uint8_t ms_aes_cbc_key0[] = {
948         0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7,
949         0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff
950 };
951
952 static uint8_t ms_aes_cbc_iv0[] = {
953         0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7,
954         0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff
955 };
956
957 static const uint8_t ms_aes_cbc_cipher0[] = {
958                 0x3C, 0xE4, 0xEE, 0x42, 0xB6, 0x9B, 0xC3, 0x38,
959                 0x5F, 0xAD, 0x54, 0xDC, 0xA8, 0x32, 0x81, 0xDC,
960                 0x7A, 0x6F, 0x85, 0x58, 0x07, 0x35, 0xED, 0xEB,
961                 0xAD, 0x79, 0x79, 0x96, 0xD3, 0x0E, 0xA6, 0xD9,
962                 0xAA, 0x86, 0xA4, 0x8F, 0xB5, 0xD6, 0x6E, 0x6D,
963                 0x0C, 0x91, 0x2F, 0xC4, 0x67, 0x98, 0x0E, 0xC4,
964                 0x8D, 0x83, 0x68, 0x69, 0xC4, 0xD3, 0x94, 0x34,
965                 0xC4, 0x5D, 0x60, 0x55, 0x22, 0x87, 0x8F, 0x6F,
966                 0x17, 0x8E, 0x75, 0xE4, 0x02, 0xF5, 0x1B, 0x99,
967                 0xC8, 0x39, 0xA9, 0xAB, 0x23, 0x91, 0x12, 0xED,
968                 0x08, 0xE7, 0xD9, 0x25, 0x89, 0x24, 0x4F, 0x8D,
969                 0x68, 0xF3, 0x10, 0x39, 0x0A, 0xEE, 0x45, 0x24,
970                 0xDF, 0x7A, 0x9D, 0x00, 0x25, 0xE5, 0x35, 0x71,
971                 0x4E, 0x40, 0x59, 0x6F, 0x0A, 0x13, 0xB3, 0x72,
972                 0x1D, 0x98, 0x63, 0x94, 0x89, 0xA5, 0x39, 0x8E,
973                 0xD3, 0x9C, 0x8A, 0x7F, 0x71, 0x2F, 0xC7, 0xCD,
974                 0x81, 0x05, 0xDC, 0xC0, 0x8D, 0xCE, 0x6D, 0x18,
975                 0x30, 0xC4, 0x72, 0x51, 0xF0, 0x27, 0xC8, 0xF6,
976                 0x60, 0x5B, 0x7C, 0xB2, 0xE3, 0x49, 0x0C, 0x29,
977                 0xC6, 0x9F, 0x39, 0x57, 0x80, 0x55, 0x24, 0x2C,
978                 0x9B, 0x0F, 0x5A, 0xB3, 0x89, 0x55, 0x31, 0x96,
979                 0x0D, 0xCD, 0xF6, 0x51, 0x03, 0x2D, 0x89, 0x26,
980                 0x74, 0x44, 0xD6, 0xE8, 0xDC, 0xEA, 0x44, 0x55,
981                 0x64, 0x71, 0x9C, 0x9F, 0x5D, 0xBA, 0x39, 0x46,
982                 0xA8, 0x17, 0xA1, 0x9C, 0x52, 0x9D, 0xBC, 0x6B,
983                 0x4A, 0x98, 0xE6, 0xEA, 0x33, 0xEC, 0x58, 0xB4,
984                 0x43, 0xF0, 0x32, 0x45, 0xA4, 0xC1, 0x55, 0xB7,
985                 0x5D, 0xB5, 0x59, 0xB2, 0xE3, 0x96, 0xFF, 0xA5,
986                 0xAF, 0xE1, 0x86, 0x1B, 0x42, 0xE6, 0x3B, 0xA0,
987                 0x90, 0x4A, 0xE8, 0x8C, 0x21, 0x7F, 0x36, 0x1E,
988                 0x5B, 0x65, 0x25, 0xD1, 0xC1, 0x5A, 0xCA, 0x3D,
989                 0x10, 0xED, 0x2D, 0x79, 0xD0, 0x0F, 0x58, 0x44,
990                 0x69, 0x81, 0xF5, 0xD4, 0xC9, 0x0F, 0x90, 0x76,
991                 0x1F, 0x54, 0xD2, 0xD5, 0x97, 0xCE, 0x2C, 0xE3,
992                 0xEF, 0xF4, 0xB7, 0xC6, 0x3A, 0x87, 0x7F, 0x83,
993                 0x2A, 0xAF, 0xCD, 0x90, 0x12, 0xA7, 0x7D, 0x85,
994                 0x1D, 0x62, 0xD3, 0x85, 0x25, 0x05, 0xDB, 0x45,
995                 0x92, 0xA3, 0xF6, 0xA2, 0xA8, 0x41, 0xE4, 0x25,
996                 0x86, 0x87, 0x67, 0x24, 0xEC, 0x89, 0x23, 0x2A,
997                 0x9B, 0x20, 0x4D, 0x93, 0xEE, 0xE2, 0x2E, 0xC1,
998                 0x0B, 0x15, 0x33, 0xCF, 0x00, 0xD1, 0x1A, 0xDA,
999                 0x93, 0xFD, 0x28, 0x21, 0x5B, 0xCF, 0xD1, 0xF3,
1000                 0x5A, 0x81, 0xBA, 0x82, 0x5E, 0x2F, 0x61, 0xB4,
1001                 0x05, 0x71, 0xB5, 0xF4, 0x39, 0x3C, 0x1F, 0x60,
1002                 0x00, 0x7A, 0xC4, 0xF8, 0x35, 0x20, 0x6C, 0x3A,
1003                 0xCC, 0x03, 0x8F, 0x7B, 0xA2, 0xB6, 0x65, 0x8A,
1004                 0xB6, 0x5F, 0xFD, 0x25, 0xD3, 0x5F, 0x92, 0xF9,
1005                 0xAE, 0x17, 0x9B, 0x5E, 0x6E, 0x9A, 0xE4, 0x55,
1006                 0x10, 0x25, 0x07, 0xA4, 0xAF, 0x21, 0x69, 0x13,
1007                 0xD8, 0xFA, 0x31, 0xED, 0xF7, 0xA7, 0xA7, 0x3B,
1008                 0xB8, 0x96, 0x8E, 0x10, 0x86, 0x74, 0xD8, 0xB1,
1009                 0x34, 0x9E, 0x9B, 0x6A, 0x26, 0xA8, 0xD4, 0xD0,
1010                 0xB5, 0xF6, 0xDE, 0xE7, 0xCA, 0x06, 0xDC, 0xA3,
1011                 0x6F, 0xEE, 0x6B, 0x1E, 0xB5, 0x30, 0x99, 0x23,
1012                 0xF9, 0x76, 0xF0, 0xA0, 0xCF, 0x3B, 0x94, 0x7B,
1013                 0x19, 0x8D, 0xA5, 0x0C, 0x18, 0xA6, 0x1D, 0x07,
1014                 0x89, 0xBE, 0x5B, 0x61, 0xE5, 0xF1, 0x42, 0xDB,
1015                 0xD4, 0x2E, 0x02, 0x1F, 0xCE, 0xEF, 0x92, 0xB1,
1016                 0x1B, 0x56, 0x50, 0xF2, 0x16, 0xE5, 0xE7, 0x4F,
1017                 0xFD, 0xBB, 0x3E, 0xD2, 0xFC, 0x3C, 0xC6, 0x0F,
1018                 0xF9, 0x12, 0x4E, 0xCB, 0x1E, 0x0C, 0x15, 0x84,
1019                 0x2A, 0x14, 0x8A, 0x02, 0xE4, 0x7E, 0x95, 0x5B,
1020                 0x86, 0xDB, 0x9B, 0x62, 0x5B, 0x19, 0xD2, 0x17,
1021                 0xFA, 0x13, 0xBB, 0x6B, 0x3F, 0x45, 0x9F, 0xBF
1022 };
1023
1024
1025 static  uint8_t ms_hmac_key0[] = {
1026                 0xFF, 0x1A, 0x7D, 0x3D, 0xF5, 0x82, 0x80, 0xF1,
1027                 0xF1, 0x35, 0x5C, 0x3B, 0xDD, 0x9A, 0x65, 0xBA,
1028                 0x58, 0x34, 0x85, 0x65, 0x1C, 0x42, 0x50, 0x76,
1029                 0x9A, 0xAF, 0x88, 0x1B, 0xB6, 0x8F, 0xF8, 0x60,
1030                 0xA2, 0x5A, 0x7F, 0x3F, 0xF4, 0x72, 0x70, 0xF1,
1031                 0xF5, 0x35, 0x4C, 0x3B, 0xDD, 0x90, 0x65, 0xB0,
1032                 0x47, 0x3A, 0x75, 0x61, 0x5C, 0xA2, 0x10, 0x76,
1033                 0x9A, 0xAF, 0x77, 0x5B, 0xB6, 0x7F, 0xF7, 0x60
1034 };
1035
1036 static const uint8_t ms_hmac_digest0[] = {
1037                 0x43, 0x52, 0xED, 0x34, 0xAB, 0x36, 0xB2, 0x51,
1038                 0xFB, 0xA3, 0xA6, 0x7C, 0x38, 0xFC, 0x42, 0x8F,
1039                 0x57, 0x64, 0xAB, 0x81, 0xA7, 0x89, 0xB7, 0x6C,
1040                 0xA0, 0xDC, 0xB9, 0x4D, 0xC4, 0x30, 0xF9, 0xD4,
1041                 0x10, 0x82, 0x55, 0xD0, 0xAB, 0x32, 0xFB, 0x56,
1042                 0x0D, 0xE4, 0x68, 0x3D, 0x76, 0xD0, 0x7B, 0xE4,
1043                 0xA6, 0x2C, 0x34, 0x9E, 0x8C, 0x41, 0xF8, 0x23,
1044                 0x28, 0x1B, 0x3A, 0x90, 0x26, 0x34, 0x47, 0x90
1045                 };
1046
1047 /* End Session 0 */
1048 /* Begin session 1 */
1049
1050 static  uint8_t ms_aes_cbc_key1[] = {
1051                 0xf1, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7,
1052                 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff
1053 };
1054
1055 static  uint8_t ms_aes_cbc_iv1[] = {
1056         0xf1, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7,
1057         0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff
1058 };
1059
1060 static const uint8_t ms_aes_cbc_cipher1[] = {
1061                 0x5A, 0x7A, 0x67, 0x5D, 0xB8, 0xE1, 0xDC, 0x71,
1062                 0x39, 0xA8, 0x74, 0x93, 0x9C, 0x4C, 0xFE, 0x23,
1063                 0x61, 0xCD, 0xA4, 0xB3, 0xD9, 0xCE, 0x99, 0x09,
1064                 0x2A, 0x23, 0xF3, 0x29, 0xBF, 0x4C, 0xB4, 0x6A,
1065                 0x1B, 0x6B, 0x73, 0x4D, 0x48, 0x0C, 0xCF, 0x6C,
1066                 0x5E, 0x34, 0x9E, 0x7F, 0xBC, 0x8F, 0xCC, 0x8F,
1067                 0x75, 0x1D, 0x3D, 0x77, 0x10, 0x76, 0xC8, 0xB9,
1068                 0x99, 0x6F, 0xD6, 0x56, 0x75, 0xA9, 0xB2, 0x66,
1069                 0xC2, 0x24, 0x2B, 0x9C, 0xFE, 0x40, 0x8E, 0x43,
1070                 0x20, 0x97, 0x1B, 0xFA, 0xD0, 0xCF, 0x04, 0xAB,
1071                 0xBB, 0xF6, 0x5D, 0xF5, 0xA0, 0x19, 0x7C, 0x23,
1072                 0x5D, 0x80, 0x8C, 0x49, 0xF6, 0x76, 0x88, 0x29,
1073                 0x27, 0x4C, 0x59, 0x2B, 0x43, 0xA6, 0xB2, 0x26,
1074                 0x27, 0x78, 0xBE, 0x1B, 0xE1, 0x4F, 0x5A, 0x1F,
1075                 0xFC, 0x68, 0x08, 0xE7, 0xC4, 0xD1, 0x34, 0x68,
1076                 0xB7, 0x13, 0x14, 0x41, 0x62, 0x6B, 0x1F, 0x77,
1077                 0x0C, 0x68, 0x1D, 0x0D, 0xED, 0x89, 0xAA, 0xD8,
1078                 0x97, 0x02, 0xBA, 0x5E, 0xD4, 0x84, 0x25, 0x97,
1079                 0x03, 0xA5, 0xA6, 0x13, 0x66, 0x02, 0xF4, 0xC3,
1080                 0xF3, 0xD3, 0xCC, 0x95, 0xC3, 0x87, 0x46, 0x90,
1081                 0x1F, 0x6E, 0x14, 0xA8, 0x00, 0xF2, 0x6F, 0xD5,
1082                 0xA1, 0xAD, 0xD5, 0x40, 0xA2, 0x0F, 0x32, 0x7E,
1083                 0x99, 0xA3, 0xF5, 0x53, 0xC3, 0x26, 0xA1, 0x45,
1084                 0x01, 0x88, 0x57, 0x84, 0x3E, 0x7B, 0x4E, 0x0B,
1085                 0x3C, 0xB5, 0x3E, 0x9E, 0xE9, 0x78, 0x77, 0xC5,
1086                 0xC0, 0x89, 0xA8, 0xF8, 0xF1, 0xA5, 0x2D, 0x5D,
1087                 0xF9, 0xC6, 0xFB, 0xCB, 0x05, 0x23, 0xBD, 0x6E,
1088                 0x5E, 0x14, 0xC6, 0x57, 0x73, 0xCF, 0x98, 0xBD,
1089                 0x10, 0x8B, 0x18, 0xA6, 0x01, 0x5B, 0x13, 0xAE,
1090                 0x8E, 0xDE, 0x1F, 0xB5, 0xB7, 0x40, 0x6C, 0xC1,
1091                 0x1E, 0xA1, 0x19, 0x20, 0x9E, 0x95, 0xE0, 0x2F,
1092                 0x1C, 0xF5, 0xD9, 0xD0, 0x2B, 0x1E, 0x82, 0x25,
1093                 0x62, 0xB4, 0xEB, 0xA1, 0x1F, 0xCE, 0x44, 0xA1,
1094                 0xCB, 0x92, 0x01, 0x6B, 0xE4, 0x26, 0x23, 0xE3,
1095                 0xC5, 0x67, 0x35, 0x55, 0xDA, 0xE5, 0x27, 0xEE,
1096                 0x8D, 0x12, 0x84, 0xB7, 0xBA, 0xA7, 0x1C, 0xD6,
1097                 0x32, 0x3F, 0x67, 0xED, 0xFB, 0x5B, 0x8B, 0x52,
1098                 0x46, 0x8C, 0xF9, 0x69, 0xCD, 0xAE, 0x79, 0xAA,
1099                 0x37, 0x78, 0x49, 0xEB, 0xC6, 0x8E, 0x76, 0x63,
1100                 0x84, 0xFF, 0x9D, 0x22, 0x99, 0x51, 0xB7, 0x5E,
1101                 0x83, 0x4C, 0x8B, 0xDF, 0x5A, 0x07, 0xCC, 0xBA,
1102                 0x42, 0xA5, 0x98, 0xB6, 0x47, 0x0E, 0x66, 0xEB,
1103                 0x23, 0x0E, 0xBA, 0x44, 0xA8, 0xAA, 0x20, 0x71,
1104                 0x79, 0x9C, 0x77, 0x5F, 0xF5, 0xFE, 0xEC, 0xEF,
1105                 0xC6, 0x64, 0x3D, 0x84, 0xD0, 0x2B, 0xA7, 0x0A,
1106                 0xC3, 0x72, 0x5B, 0x9C, 0xFA, 0xA8, 0x87, 0x95,
1107                 0x94, 0x11, 0x38, 0xA7, 0x1E, 0x58, 0xE3, 0x73,
1108                 0xC6, 0xC9, 0xD1, 0x7B, 0x92, 0xDB, 0x0F, 0x49,
1109                 0x74, 0xC2, 0xA2, 0x0E, 0x35, 0x57, 0xAC, 0xDB,
1110                 0x9A, 0x1C, 0xCF, 0x5A, 0x32, 0x3E, 0x26, 0x9B,
1111                 0xEC, 0xB3, 0xEF, 0x9C, 0xFE, 0xBE, 0x52, 0xAC,
1112                 0xB1, 0x29, 0xDD, 0xFD, 0x07, 0xE2, 0xEE, 0xED,
1113                 0xE4, 0x46, 0x37, 0xFE, 0xD1, 0xDC, 0xCD, 0x02,
1114                 0xF9, 0x31, 0xB0, 0xFB, 0x36, 0xB7, 0x34, 0xA4,
1115                 0x76, 0xE8, 0x57, 0xBF, 0x99, 0x92, 0xC7, 0xAF,
1116                 0x98, 0x10, 0xE2, 0x70, 0xCA, 0xC9, 0x2B, 0x82,
1117                 0x06, 0x96, 0x88, 0x0D, 0xB3, 0xAC, 0x9E, 0x6D,
1118                 0x43, 0xBC, 0x5B, 0x31, 0xCF, 0x65, 0x8D, 0xA6,
1119                 0xC7, 0xFE, 0x73, 0xE1, 0x54, 0xF7, 0x10, 0xF9,
1120                 0x86, 0xF7, 0xDF, 0xA1, 0xA1, 0xD8, 0xAE, 0x35,
1121                 0xB3, 0x90, 0xDC, 0x6F, 0x43, 0x7A, 0x8B, 0xE0,
1122                 0xFE, 0x8F, 0x33, 0x4D, 0x29, 0x6C, 0x45, 0x53,
1123                 0x73, 0xDD, 0x21, 0x0B, 0x85, 0x30, 0xB5, 0xA5,
1124                 0xF3, 0x5D, 0xEC, 0x79, 0x61, 0x9D, 0x9E, 0xB3
1125
1126 };
1127
1128 static uint8_t ms_hmac_key1[] = {
1129                 0xFE, 0x1A, 0x7D, 0x3D, 0xF5, 0x82, 0x80, 0xF1,
1130                 0xF1, 0x35, 0x5C, 0x3B, 0xDD, 0x9A, 0x65, 0xBA,
1131                 0x58, 0x34, 0x85, 0x65, 0x1C, 0x42, 0x50, 0x76,
1132                 0x9A, 0xAF, 0x88, 0x1B, 0xB6, 0x8F, 0xF8, 0x60,
1133                 0xA2, 0x5A, 0x7F, 0x3F, 0xF4, 0x72, 0x70, 0xF1,
1134                 0xF5, 0x35, 0x4C, 0x3B, 0xDD, 0x90, 0x65, 0xB0,
1135                 0x47, 0x3A, 0x75, 0x61, 0x5C, 0xA2, 0x10, 0x76,
1136                 0x9A, 0xAF, 0x77, 0x5B, 0xB6, 0x7F, 0xF7, 0x60
1137 };
1138
1139 static const uint8_t ms_hmac_digest1[] = {
1140                 0xCE, 0x6E, 0x5F, 0x77, 0x96, 0x9A, 0xB1, 0x69,
1141                 0x2D, 0x5E, 0xF3, 0x2F, 0x32, 0x10, 0xCB, 0x50,
1142                 0x0E, 0x09, 0x56, 0x25, 0x07, 0x34, 0xC9, 0x20,
1143                 0xEC, 0x13, 0x43, 0x23, 0x5C, 0x08, 0x8B, 0xCD,
1144                 0xDC, 0x86, 0x8C, 0xEE, 0x0A, 0x95, 0x2E, 0xB9,
1145                 0x8C, 0x7B, 0x02, 0x7A, 0xD4, 0xE1, 0x49, 0xB4,
1146                 0x45, 0xB5, 0x52, 0x37, 0xC6, 0xFF, 0xFE, 0xAA,
1147                 0x0A, 0x87, 0xB8, 0x51, 0xF9, 0x2A, 0x01, 0x8F
1148 };
1149 /* End Session 1  */
1150 /* Begin Session 2 */
1151 static  uint8_t ms_aes_cbc_key2[] = {
1152                 0xff, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7,
1153                 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff
1154 };
1155
1156 static  uint8_t ms_aes_cbc_iv2[] = {
1157                 0xff, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7,
1158                 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff
1159 };
1160
1161 static const uint8_t ms_aes_cbc_cipher2[] = {
1162                 0xBB, 0x3C, 0x68, 0x25, 0xFD, 0xB6, 0xA2, 0x91,
1163                 0x20, 0x56, 0xF6, 0x30, 0x35, 0xFC, 0x9E, 0x97,
1164                 0xF2, 0x90, 0xFC, 0x7E, 0x3E, 0x0A, 0x75, 0xC8,
1165                 0x4C, 0xF2, 0x2D, 0xAC, 0xD3, 0x93, 0xF0, 0xC5,
1166                 0x14, 0x88, 0x8A, 0x23, 0xC2, 0x59, 0x9A, 0x98,
1167                 0x4B, 0xD5, 0x2C, 0xDA, 0x43, 0xA9, 0x34, 0x69,
1168                 0x7C, 0x6D, 0xDB, 0xDC, 0xCB, 0xC0, 0xA0, 0x09,
1169                 0xA7, 0x86, 0x16, 0x4B, 0xBF, 0xA8, 0xB6, 0xCF,
1170                 0x7F, 0x74, 0x1F, 0x22, 0xF0, 0xF6, 0xBB, 0x44,
1171                 0x8B, 0x4C, 0x9E, 0x23, 0xF8, 0x9F, 0xFC, 0x5B,
1172                 0x9E, 0x9C, 0x2A, 0x79, 0x30, 0x8F, 0xBF, 0xA9,
1173                 0x68, 0xA1, 0x20, 0x71, 0x7C, 0x77, 0x22, 0x34,
1174                 0x07, 0xCD, 0xC6, 0xF6, 0x50, 0x0A, 0x08, 0x99,
1175                 0x17, 0x98, 0xE3, 0x93, 0x8A, 0xB0, 0xEE, 0xDF,
1176                 0xC2, 0xBA, 0x3B, 0x44, 0x73, 0xDF, 0xDD, 0xDC,
1177                 0x14, 0x4D, 0x3B, 0xBB, 0x5E, 0x58, 0xC1, 0x26,
1178                 0xA7, 0xAE, 0x47, 0xF3, 0x24, 0x6D, 0x4F, 0xD3,
1179                 0x6E, 0x3E, 0x33, 0xE6, 0x7F, 0xCA, 0x50, 0xAF,
1180                 0x5D, 0x3D, 0xA0, 0xDD, 0xC9, 0xF3, 0x30, 0xD3,
1181                 0x6E, 0x8B, 0x2E, 0x12, 0x24, 0x34, 0xF0, 0xD3,
1182                 0xC7, 0x8D, 0x23, 0x29, 0xAA, 0x05, 0xE1, 0xFA,
1183                 0x2E, 0xF6, 0x8D, 0x37, 0x86, 0xC0, 0x6D, 0x13,
1184                 0x2D, 0x98, 0xF3, 0x52, 0x39, 0x22, 0xCE, 0x38,
1185                 0xC2, 0x1A, 0x72, 0xED, 0xFB, 0xCC, 0xE4, 0x71,
1186                 0x5A, 0x0C, 0x0D, 0x09, 0xF8, 0xE8, 0x1B, 0xBC,
1187                 0x53, 0xC8, 0xD8, 0x8F, 0xE5, 0x98, 0x5A, 0xB1,
1188                 0x06, 0xA6, 0x5B, 0xE6, 0xA2, 0x88, 0x21, 0x9E,
1189                 0x36, 0xC0, 0x34, 0xF9, 0xFB, 0x3B, 0x0A, 0x22,
1190                 0x00, 0x00, 0x39, 0x48, 0x8D, 0x23, 0x74, 0x62,
1191                 0x72, 0x91, 0xE6, 0x36, 0xAA, 0x77, 0x9C, 0x72,
1192                 0x9D, 0xA8, 0xC3, 0xA9, 0xD5, 0x44, 0x72, 0xA6,
1193                 0xB9, 0x28, 0x8F, 0x64, 0x4C, 0x8A, 0x64, 0xE6,
1194                 0x4E, 0xFA, 0xEF, 0x87, 0xDE, 0x7B, 0x22, 0x44,
1195                 0xB0, 0xDF, 0x2E, 0x5F, 0x0B, 0xA5, 0xF2, 0x24,
1196                 0x07, 0x5C, 0x2D, 0x39, 0xB7, 0x3D, 0x8A, 0xE5,
1197                 0x0E, 0x9D, 0x4E, 0x50, 0xED, 0x03, 0x99, 0x8E,
1198                 0xF0, 0x06, 0x55, 0x4E, 0xA2, 0x24, 0xE7, 0x17,
1199                 0x46, 0xDF, 0x6C, 0xCD, 0xC6, 0x44, 0xE8, 0xF9,
1200                 0xB9, 0x1B, 0x36, 0xF6, 0x7F, 0x10, 0xA4, 0x7D,
1201                 0x90, 0xBD, 0xE4, 0xAA, 0xD6, 0x9E, 0x18, 0x9D,
1202                 0x22, 0x35, 0xD6, 0x55, 0x54, 0xAA, 0xF7, 0x22,
1203                 0xA3, 0x3E, 0xEF, 0xC8, 0xA2, 0x34, 0x8D, 0xA9,
1204                 0x37, 0x63, 0xA6, 0xC3, 0x57, 0xCB, 0x0C, 0x49,
1205                 0x7D, 0x02, 0xBE, 0xAA, 0x13, 0x75, 0xB7, 0x4E,
1206                 0x52, 0x62, 0xA5, 0xC2, 0x33, 0xC7, 0x6C, 0x1B,
1207                 0xF6, 0x34, 0xF6, 0x09, 0xA5, 0x0C, 0xC7, 0xA2,
1208                 0x61, 0x48, 0x62, 0x7D, 0x17, 0x15, 0xE3, 0x95,
1209                 0xC8, 0x63, 0xD2, 0xA4, 0x43, 0xA9, 0x49, 0x07,
1210                 0xB2, 0x3B, 0x2B, 0x62, 0x7D, 0xCB, 0x51, 0xB3,
1211                 0x25, 0x33, 0x47, 0x0E, 0x14, 0x67, 0xDC, 0x6A,
1212                 0x9B, 0x51, 0xAC, 0x9D, 0x8F, 0xA2, 0x2B, 0x57,
1213                 0x8C, 0x5C, 0x5F, 0x76, 0x23, 0x92, 0x0F, 0x84,
1214                 0x46, 0x0E, 0x40, 0x85, 0x38, 0x60, 0xFA, 0x61,
1215                 0x20, 0xC5, 0xE3, 0xF1, 0x70, 0xAC, 0x1B, 0xBF,
1216                 0xC4, 0x2B, 0xC5, 0x67, 0xD1, 0x43, 0xC5, 0x17,
1217                 0x74, 0x71, 0x69, 0x6F, 0x82, 0x89, 0x19, 0x8A,
1218                 0x70, 0x43, 0x92, 0x01, 0xC4, 0x63, 0x7E, 0xB1,
1219                 0x59, 0x4E, 0xCD, 0xEA, 0x93, 0xA4, 0x52, 0x53,
1220                 0x9B, 0x61, 0x5B, 0xD2, 0x3E, 0x19, 0x39, 0xB7,
1221                 0x32, 0xEA, 0x8E, 0xF8, 0x1D, 0x76, 0x5C, 0xB2,
1222                 0x73, 0x2D, 0x91, 0xC0, 0x18, 0xED, 0x25, 0x2A,
1223                 0x53, 0x64, 0xF0, 0x92, 0x31, 0x55, 0x21, 0xA8,
1224                 0x24, 0xA9, 0xD1, 0x02, 0xF6, 0x6C, 0x2B, 0x70,
1225                 0xA9, 0x59, 0xC1, 0xD6, 0xC3, 0x57, 0x5B, 0x92
1226 };
1227
1228 static  uint8_t ms_hmac_key2[] = {
1229                 0xFC, 0x1A, 0x7D, 0x3D, 0xF5, 0x82, 0x80, 0xF1,
1230                 0xF1, 0x35, 0x5C, 0x3B, 0xDD, 0x9A, 0x65, 0xBA,
1231                 0x58, 0x34, 0x85, 0x65, 0x1C, 0x42, 0x50, 0x76,
1232                 0x9A, 0xAF, 0x88, 0x1B, 0xB6, 0x8F, 0xF8, 0x60,
1233                 0xA2, 0x5A, 0x7F, 0x3F, 0xF4, 0x72, 0x70, 0xF1,
1234                 0xF5, 0x35, 0x4C, 0x3B, 0xDD, 0x90, 0x65, 0xB0,
1235                 0x47, 0x3A, 0x75, 0x61, 0x5C, 0xA2, 0x10, 0x76,
1236                 0x9A, 0xAF, 0x77, 0x5B, 0xB6, 0x7F, 0xF7, 0x60
1237 };
1238
1239 static const uint8_t ms_hmac_digest2[] = {
1240                 0xA5, 0x0F, 0x9C, 0xFB, 0x08, 0x62, 0x59, 0xFF,
1241                 0x80, 0x2F, 0xEB, 0x4B, 0xE1, 0x46, 0x21, 0xD6,
1242                 0x02, 0x98, 0xF2, 0x8E, 0xF4, 0xEC, 0xD4, 0x77,
1243                 0x86, 0x4C, 0x31, 0x28, 0xC8, 0x25, 0x80, 0x27,
1244                 0x3A, 0x72, 0x5D, 0x6A, 0x56, 0x8A, 0xD3, 0x82,
1245                 0xB0, 0xEC, 0x31, 0x6D, 0x8B, 0x6B, 0xB4, 0x24,
1246                 0xE7, 0x62, 0xC1, 0x52, 0xBC, 0x14, 0x1B, 0x8E,
1247                 0xEC, 0x9A, 0xF1, 0x47, 0x80, 0xD2, 0xB0, 0x59
1248 };
1249
1250 /* End Session 2 */
1251
1252
1253 static int
1254 test_AES_CBC_HMAC_SHA1_encrypt_digest(void)
1255 {
1256         struct crypto_testsuite_params *ts_params = &testsuite_params;
1257         struct crypto_unittest_params *ut_params = &unittest_params;
1258
1259         /* Generate test mbuf data and space for digest */
1260         ut_params->ibuf = setup_test_string(ts_params->mbuf_pool,
1261                         catch_22_quote, QUOTE_512_BYTES, 0);
1262
1263         ut_params->digest = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
1264                         DIGEST_BYTE_LENGTH_SHA1);
1265         TEST_ASSERT_NOT_NULL(ut_params->digest, "no room to append digest");
1266
1267         /* Setup Cipher Parameters */
1268         ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
1269         ut_params->cipher_xform.next = &ut_params->auth_xform;
1270
1271         ut_params->cipher_xform.cipher.algo = RTE_CRYPTO_CIPHER_AES_CBC;
1272         ut_params->cipher_xform.cipher.op = RTE_CRYPTO_CIPHER_OP_ENCRYPT;
1273         ut_params->cipher_xform.cipher.key.data = aes_cbc_key;
1274         ut_params->cipher_xform.cipher.key.length = CIPHER_KEY_LENGTH_AES_CBC;
1275         ut_params->cipher_xform.cipher.iv.offset = IV_OFFSET;
1276         ut_params->cipher_xform.cipher.iv.length = CIPHER_IV_LENGTH_AES_CBC;
1277
1278         /* Setup HMAC Parameters */
1279         ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;
1280
1281         ut_params->auth_xform.next = NULL;
1282
1283         ut_params->auth_xform.auth.op = RTE_CRYPTO_AUTH_OP_GENERATE;
1284         ut_params->auth_xform.auth.algo = RTE_CRYPTO_AUTH_SHA1_HMAC;
1285         ut_params->auth_xform.auth.key.length = HMAC_KEY_LENGTH_SHA1;
1286         ut_params->auth_xform.auth.key.data = hmac_sha1_key;
1287         ut_params->auth_xform.auth.digest_length = DIGEST_BYTE_LENGTH_SHA1;
1288
1289         ut_params->sess = rte_cryptodev_sym_session_create(
1290                         ts_params->session_mpool);
1291
1292         /* Create crypto session*/
1293         rte_cryptodev_sym_session_init(ts_params->valid_devs[0],
1294                         ut_params->sess, &ut_params->cipher_xform,
1295                         ts_params->session_mpool);
1296         TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed");
1297
1298         /* Generate crypto op data structure */
1299         ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
1300                         RTE_CRYPTO_OP_TYPE_SYMMETRIC);
1301         TEST_ASSERT_NOT_NULL(ut_params->op,
1302                         "Failed to allocate symmetric crypto operation struct");
1303
1304         rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
1305
1306         struct rte_crypto_sym_op *sym_op = ut_params->op->sym;
1307
1308         /* set crypto operation source mbuf */
1309         sym_op->m_src = ut_params->ibuf;
1310
1311         /* Set crypto operation authentication parameters */
1312         sym_op->auth.digest.data = ut_params->digest;
1313         sym_op->auth.digest.phys_addr = rte_pktmbuf_mtophys_offset(
1314                         ut_params->ibuf, QUOTE_512_BYTES);
1315
1316         sym_op->auth.data.offset = 0;
1317         sym_op->auth.data.length = QUOTE_512_BYTES;
1318
1319         /* Copy IV at the end of the crypto operation */
1320         rte_memcpy(rte_crypto_op_ctod_offset(ut_params->op, uint8_t *, IV_OFFSET),
1321                         aes_cbc_iv, CIPHER_IV_LENGTH_AES_CBC);
1322
1323         /* Set crypto operation cipher parameters */
1324         sym_op->cipher.data.offset = 0;
1325         sym_op->cipher.data.length = QUOTE_512_BYTES;
1326
1327         /* Process crypto operation */
1328         TEST_ASSERT_NOT_NULL(process_crypto_request(ts_params->valid_devs[0],
1329                         ut_params->op), "failed to process sym crypto op");
1330
1331         TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
1332                         "crypto op processing failed");
1333
1334         /* Validate obuf */
1335         uint8_t *ciphertext = rte_pktmbuf_mtod(ut_params->op->sym->m_src,
1336                         uint8_t *);
1337
1338         TEST_ASSERT_BUFFERS_ARE_EQUAL(ciphertext,
1339                         catch_22_quote_2_512_bytes_AES_CBC_ciphertext,
1340                         QUOTE_512_BYTES,
1341                         "ciphertext data not as expected");
1342
1343         uint8_t *digest = ciphertext + QUOTE_512_BYTES;
1344
1345         TEST_ASSERT_BUFFERS_ARE_EQUAL(digest,
1346                         catch_22_quote_2_512_bytes_AES_CBC_HMAC_SHA1_digest,
1347                         gbl_driver_id == rte_cryptodev_driver_id_get(
1348                                         RTE_STR(CRYPTODEV_NAME_AESNI_MB_PMD)) ?
1349                                         TRUNCATED_DIGEST_BYTE_LENGTH_SHA1 :
1350                                         DIGEST_BYTE_LENGTH_SHA1,
1351                         "Generated digest data not as expected");
1352
1353         return TEST_SUCCESS;
1354 }
1355
1356 /* ***** AES-CBC / HMAC-SHA512 Hash Tests ***** */
1357
1358 #define HMAC_KEY_LENGTH_SHA512  (DIGEST_BYTE_LENGTH_SHA512)
1359
1360 static uint8_t hmac_sha512_key[] = {
1361         0x42, 0x1a, 0x7d, 0x3d, 0xf5, 0x82, 0x80, 0xf1,
1362         0xF1, 0x35, 0x5C, 0x3B, 0xDD, 0x9A, 0x65, 0xBA,
1363         0x58, 0x34, 0x85, 0x65, 0x1C, 0x42, 0x50, 0x76,
1364         0x9a, 0xaf, 0x88, 0x1b, 0xb6, 0x8f, 0xf8, 0x60,
1365         0xa2, 0x5a, 0x7f, 0x3f, 0xf4, 0x72, 0x70, 0xf1,
1366         0xF5, 0x35, 0x4C, 0x3B, 0xDD, 0x90, 0x65, 0xB0,
1367         0x47, 0x3a, 0x75, 0x61, 0x5C, 0xa2, 0x10, 0x76,
1368         0x9a, 0xaf, 0x77, 0x5b, 0xb6, 0x7f, 0xf7, 0x60 };
1369
1370 static const uint8_t catch_22_quote_2_512_bytes_AES_CBC_HMAC_SHA512_digest[] = {
1371         0x5D, 0x54, 0x66, 0xC1, 0x6E, 0xBC, 0x04, 0xB8,
1372         0x46, 0xB8, 0x08, 0x6E, 0xE0, 0xF0, 0x43, 0x48,
1373         0x37, 0x96, 0x9C, 0xC6, 0x9C, 0xC2, 0x1E, 0xE8,
1374         0xF2, 0x0C, 0x0B, 0xEF, 0x86, 0xA2, 0xE3, 0x70,
1375         0x95, 0xC8, 0xB3, 0x06, 0x47, 0xA9, 0x90, 0xE8,
1376         0xA0, 0xC6, 0x72, 0x69, 0x05, 0xC0, 0x0D, 0x0E,
1377         0x21, 0x96, 0x65, 0x93, 0x74, 0x43, 0x2A, 0x1D,
1378         0x2E, 0xBF, 0xC2, 0xC2, 0xEE, 0xCC, 0x2F, 0x0A };
1379
1380
1381
1382 static int
1383 test_AES_CBC_HMAC_SHA512_decrypt_create_session_params(
1384                 struct crypto_unittest_params *ut_params,
1385                 uint8_t *cipher_key,
1386                 uint8_t *hmac_key);
1387
1388 static int
1389 test_AES_CBC_HMAC_SHA512_decrypt_perform(struct rte_cryptodev_sym_session *sess,
1390                 struct crypto_unittest_params *ut_params,
1391                 struct crypto_testsuite_params *ts_params,
1392                 const uint8_t *cipher,
1393                 const uint8_t *digest,
1394                 const uint8_t *iv);
1395
1396
1397 static int
1398 test_AES_CBC_HMAC_SHA512_decrypt_create_session_params(
1399                 struct crypto_unittest_params *ut_params,
1400                 uint8_t *cipher_key,
1401                 uint8_t *hmac_key)
1402 {
1403
1404         /* Setup Cipher Parameters */
1405         ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
1406         ut_params->cipher_xform.next = NULL;
1407
1408         ut_params->cipher_xform.cipher.algo = RTE_CRYPTO_CIPHER_AES_CBC;
1409         ut_params->cipher_xform.cipher.op = RTE_CRYPTO_CIPHER_OP_DECRYPT;
1410         ut_params->cipher_xform.cipher.key.data = cipher_key;
1411         ut_params->cipher_xform.cipher.key.length = CIPHER_KEY_LENGTH_AES_CBC;
1412         ut_params->cipher_xform.cipher.iv.offset = IV_OFFSET;
1413         ut_params->cipher_xform.cipher.iv.length = CIPHER_IV_LENGTH_AES_CBC;
1414
1415         /* Setup HMAC Parameters */
1416         ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;
1417         ut_params->auth_xform.next = &ut_params->cipher_xform;
1418
1419         ut_params->auth_xform.auth.op = RTE_CRYPTO_AUTH_OP_VERIFY;
1420         ut_params->auth_xform.auth.algo = RTE_CRYPTO_AUTH_SHA512_HMAC;
1421         ut_params->auth_xform.auth.key.data = hmac_key;
1422         ut_params->auth_xform.auth.key.length = HMAC_KEY_LENGTH_SHA512;
1423         ut_params->auth_xform.auth.digest_length = DIGEST_BYTE_LENGTH_SHA512;
1424
1425         return TEST_SUCCESS;
1426 }
1427
1428
1429 static int
1430 test_AES_CBC_HMAC_SHA512_decrypt_perform(struct rte_cryptodev_sym_session *sess,
1431                 struct crypto_unittest_params *ut_params,
1432                 struct crypto_testsuite_params *ts_params,
1433                 const uint8_t *cipher,
1434                 const uint8_t *digest,
1435                 const uint8_t *iv)
1436 {
1437         /* Generate test mbuf data and digest */
1438         ut_params->ibuf = setup_test_string(ts_params->mbuf_pool,
1439                         (const char *)
1440                         cipher,
1441                         QUOTE_512_BYTES, 0);
1442
1443         ut_params->digest = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
1444                         DIGEST_BYTE_LENGTH_SHA512);
1445         TEST_ASSERT_NOT_NULL(ut_params->digest, "no room to append digest");
1446
1447         rte_memcpy(ut_params->digest,
1448                         digest,
1449                         DIGEST_BYTE_LENGTH_SHA512);
1450
1451         /* Generate Crypto op data structure */
1452         ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
1453                         RTE_CRYPTO_OP_TYPE_SYMMETRIC);
1454         TEST_ASSERT_NOT_NULL(ut_params->op,
1455                         "Failed to allocate symmetric crypto operation struct");
1456
1457         rte_crypto_op_attach_sym_session(ut_params->op, sess);
1458
1459         struct rte_crypto_sym_op *sym_op = ut_params->op->sym;
1460
1461         /* set crypto operation source mbuf */
1462         sym_op->m_src = ut_params->ibuf;
1463
1464         sym_op->auth.digest.data = ut_params->digest;
1465         sym_op->auth.digest.phys_addr = rte_pktmbuf_mtophys_offset(
1466                         ut_params->ibuf, QUOTE_512_BYTES);
1467
1468         sym_op->auth.data.offset = 0;
1469         sym_op->auth.data.length = QUOTE_512_BYTES;
1470
1471         /* Copy IV at the end of the crypto operation */
1472         rte_memcpy(rte_crypto_op_ctod_offset(ut_params->op, uint8_t *, IV_OFFSET),
1473                         iv, CIPHER_IV_LENGTH_AES_CBC);
1474
1475         sym_op->cipher.data.offset = 0;
1476         sym_op->cipher.data.length = QUOTE_512_BYTES;
1477
1478         /* Process crypto operation */
1479         TEST_ASSERT_NOT_NULL(process_crypto_request(ts_params->valid_devs[0],
1480                         ut_params->op), "failed to process sym crypto op");
1481
1482         TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
1483                         "crypto op processing failed");
1484
1485         ut_params->obuf = ut_params->op->sym->m_src;
1486
1487         /* Validate obuf */
1488         TEST_ASSERT_BUFFERS_ARE_EQUAL(
1489                         rte_pktmbuf_mtod(ut_params->obuf, uint8_t *),
1490                         catch_22_quote,
1491                         QUOTE_512_BYTES,
1492                         "Plaintext data not as expected");
1493
1494         /* Validate obuf */
1495         TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
1496                         "Digest verification failed");
1497
1498         return TEST_SUCCESS;
1499 }
1500
1501 static int
1502 test_AES_cipheronly_mb_all(void)
1503 {
1504         struct crypto_testsuite_params *ts_params = &testsuite_params;
1505         int status;
1506
1507         status = test_blockcipher_all_tests(ts_params->mbuf_pool,
1508                 ts_params->op_mpool,
1509                 ts_params->session_mpool,
1510                 ts_params->valid_devs[0],
1511                 rte_cryptodev_driver_id_get(
1512                 RTE_STR(CRYPTODEV_NAME_AESNI_MB_PMD)),
1513                 BLKCIPHER_AES_CIPHERONLY_TYPE);
1514
1515         TEST_ASSERT_EQUAL(status, 0, "Test failed");
1516
1517         return TEST_SUCCESS;
1518 }
1519
1520 static int
1521 test_AES_docsis_mb_all(void)
1522 {
1523         struct crypto_testsuite_params *ts_params = &testsuite_params;
1524         int status;
1525
1526         status = test_blockcipher_all_tests(ts_params->mbuf_pool,
1527                 ts_params->op_mpool,
1528                 ts_params->session_mpool,
1529                 ts_params->valid_devs[0],
1530                 rte_cryptodev_driver_id_get(
1531                 RTE_STR(CRYPTODEV_NAME_AESNI_MB_PMD)),
1532                 BLKCIPHER_AES_DOCSIS_TYPE);
1533
1534         TEST_ASSERT_EQUAL(status, 0, "Test failed");
1535
1536         return TEST_SUCCESS;
1537 }
1538
1539 static int
1540 test_AES_docsis_qat_all(void)
1541 {
1542         struct crypto_testsuite_params *ts_params = &testsuite_params;
1543         int status;
1544
1545         status = test_blockcipher_all_tests(ts_params->mbuf_pool,
1546                 ts_params->op_mpool,
1547                 ts_params->session_mpool,
1548                 ts_params->valid_devs[0],
1549                 rte_cryptodev_driver_id_get(
1550                 RTE_STR(CRYPTODEV_NAME_QAT_SYM_PMD)),
1551                 BLKCIPHER_AES_DOCSIS_TYPE);
1552
1553         TEST_ASSERT_EQUAL(status, 0, "Test failed");
1554
1555         return TEST_SUCCESS;
1556 }
1557
1558 static int
1559 test_DES_docsis_qat_all(void)
1560 {
1561         struct crypto_testsuite_params *ts_params = &testsuite_params;
1562         int status;
1563
1564         status = test_blockcipher_all_tests(ts_params->mbuf_pool,
1565                 ts_params->op_mpool,
1566                 ts_params->session_mpool,
1567                 ts_params->valid_devs[0],
1568                 rte_cryptodev_driver_id_get(
1569                 RTE_STR(CRYPTODEV_NAME_QAT_SYM_PMD)),
1570                 BLKCIPHER_DES_DOCSIS_TYPE);
1571
1572         TEST_ASSERT_EQUAL(status, 0, "Test failed");
1573
1574         return TEST_SUCCESS;
1575 }
1576
1577 static int
1578 test_authonly_mb_all(void)
1579 {
1580         struct crypto_testsuite_params *ts_params = &testsuite_params;
1581         int status;
1582
1583         status = test_blockcipher_all_tests(ts_params->mbuf_pool,
1584                 ts_params->op_mpool,
1585                 ts_params->session_mpool,
1586                 ts_params->valid_devs[0],
1587                 rte_cryptodev_driver_id_get(
1588                 RTE_STR(CRYPTODEV_NAME_AESNI_MB_PMD)),
1589                 BLKCIPHER_AUTHONLY_TYPE);
1590
1591         TEST_ASSERT_EQUAL(status, 0, "Test failed");
1592
1593         return TEST_SUCCESS;
1594 }
1595
1596 static int
1597 test_authonly_qat_all(void)
1598 {
1599         struct crypto_testsuite_params *ts_params = &testsuite_params;
1600         int status;
1601
1602         status = test_blockcipher_all_tests(ts_params->mbuf_pool,
1603                 ts_params->op_mpool,
1604                 ts_params->session_mpool,
1605                 ts_params->valid_devs[0],
1606                 rte_cryptodev_driver_id_get(
1607                 RTE_STR(CRYPTODEV_NAME_QAT_SYM_PMD)),
1608                 BLKCIPHER_AUTHONLY_TYPE);
1609
1610         TEST_ASSERT_EQUAL(status, 0, "Test failed");
1611
1612         return TEST_SUCCESS;
1613 }
1614 static int
1615 test_AES_chain_mb_all(void)
1616 {
1617         struct crypto_testsuite_params *ts_params = &testsuite_params;
1618         int status;
1619
1620         status = test_blockcipher_all_tests(ts_params->mbuf_pool,
1621                 ts_params->op_mpool,
1622                 ts_params->session_mpool,
1623                 ts_params->valid_devs[0],
1624                 rte_cryptodev_driver_id_get(
1625                 RTE_STR(CRYPTODEV_NAME_AESNI_MB_PMD)),
1626                 BLKCIPHER_AES_CHAIN_TYPE);
1627
1628         TEST_ASSERT_EQUAL(status, 0, "Test failed");
1629
1630         return TEST_SUCCESS;
1631 }
1632
1633 #ifdef RTE_LIBRTE_PMD_CRYPTO_SCHEDULER
1634
1635 static int
1636 test_AES_cipheronly_scheduler_all(void)
1637 {
1638         struct crypto_testsuite_params *ts_params = &testsuite_params;
1639         int status;
1640
1641         status = test_blockcipher_all_tests(ts_params->mbuf_pool,
1642                 ts_params->op_mpool,
1643                 ts_params->session_mpool,
1644                 ts_params->valid_devs[0],
1645                 rte_cryptodev_driver_id_get(
1646                 RTE_STR(CRYPTODEV_NAME_SCHEDULER_PMD)),
1647                 BLKCIPHER_AES_CIPHERONLY_TYPE);
1648
1649         TEST_ASSERT_EQUAL(status, 0, "Test failed");
1650
1651         return TEST_SUCCESS;
1652 }
1653
1654 static int
1655 test_AES_chain_scheduler_all(void)
1656 {
1657         struct crypto_testsuite_params *ts_params = &testsuite_params;
1658         int status;
1659
1660         status = test_blockcipher_all_tests(ts_params->mbuf_pool,
1661                 ts_params->op_mpool,
1662                 ts_params->session_mpool,
1663                 ts_params->valid_devs[0],
1664                 rte_cryptodev_driver_id_get(
1665                 RTE_STR(CRYPTODEV_NAME_SCHEDULER_PMD)),
1666                 BLKCIPHER_AES_CHAIN_TYPE);
1667
1668         TEST_ASSERT_EQUAL(status, 0, "Test failed");
1669
1670         return TEST_SUCCESS;
1671 }
1672
1673 static int
1674 test_authonly_scheduler_all(void)
1675 {
1676         struct crypto_testsuite_params *ts_params = &testsuite_params;
1677         int status;
1678
1679         status = test_blockcipher_all_tests(ts_params->mbuf_pool,
1680                 ts_params->op_mpool,
1681                 ts_params->session_mpool,
1682                 ts_params->valid_devs[0],
1683                 rte_cryptodev_driver_id_get(
1684                 RTE_STR(CRYPTODEV_NAME_SCHEDULER_PMD)),
1685                 BLKCIPHER_AUTHONLY_TYPE);
1686
1687         TEST_ASSERT_EQUAL(status, 0, "Test failed");
1688
1689         return TEST_SUCCESS;
1690 }
1691
1692 #endif /* RTE_LIBRTE_PMD_CRYPTO_SCHEDULER */
1693
1694 static int
1695 test_AES_chain_openssl_all(void)
1696 {
1697         struct crypto_testsuite_params *ts_params = &testsuite_params;
1698         int status;
1699
1700         status = test_blockcipher_all_tests(ts_params->mbuf_pool,
1701                 ts_params->op_mpool,
1702                 ts_params->session_mpool,
1703                 ts_params->valid_devs[0],
1704                 rte_cryptodev_driver_id_get(
1705                 RTE_STR(CRYPTODEV_NAME_OPENSSL_PMD)),
1706                 BLKCIPHER_AES_CHAIN_TYPE);
1707
1708         TEST_ASSERT_EQUAL(status, 0, "Test failed");
1709
1710         return TEST_SUCCESS;
1711 }
1712
1713 static int
1714 test_AES_cipheronly_openssl_all(void)
1715 {
1716         struct crypto_testsuite_params *ts_params = &testsuite_params;
1717         int status;
1718
1719         status = test_blockcipher_all_tests(ts_params->mbuf_pool,
1720                 ts_params->op_mpool,
1721                 ts_params->session_mpool,
1722                 ts_params->valid_devs[0],
1723                 rte_cryptodev_driver_id_get(
1724                 RTE_STR(CRYPTODEV_NAME_OPENSSL_PMD)),
1725                 BLKCIPHER_AES_CIPHERONLY_TYPE);
1726
1727         TEST_ASSERT_EQUAL(status, 0, "Test failed");
1728
1729         return TEST_SUCCESS;
1730 }
1731
1732 static int
1733 test_AES_chain_qat_all(void)
1734 {
1735         struct crypto_testsuite_params *ts_params = &testsuite_params;
1736         int status;
1737
1738         status = test_blockcipher_all_tests(ts_params->mbuf_pool,
1739                 ts_params->op_mpool,
1740                 ts_params->session_mpool,
1741                 ts_params->valid_devs[0],
1742                 rte_cryptodev_driver_id_get(
1743                 RTE_STR(CRYPTODEV_NAME_QAT_SYM_PMD)),
1744                 BLKCIPHER_AES_CHAIN_TYPE);
1745
1746         TEST_ASSERT_EQUAL(status, 0, "Test failed");
1747
1748         return TEST_SUCCESS;
1749 }
1750
1751 static int
1752 test_AES_cipheronly_qat_all(void)
1753 {
1754         struct crypto_testsuite_params *ts_params = &testsuite_params;
1755         int status;
1756
1757         status = test_blockcipher_all_tests(ts_params->mbuf_pool,
1758                 ts_params->op_mpool,
1759                 ts_params->session_mpool,
1760                 ts_params->valid_devs[0],
1761                 rte_cryptodev_driver_id_get(
1762                 RTE_STR(CRYPTODEV_NAME_QAT_SYM_PMD)),
1763                 BLKCIPHER_AES_CIPHERONLY_TYPE);
1764
1765         TEST_ASSERT_EQUAL(status, 0, "Test failed");
1766
1767         return TEST_SUCCESS;
1768 }
1769
1770 static int
1771 test_AES_chain_dpaa2_sec_all(void)
1772 {
1773         struct crypto_testsuite_params *ts_params = &testsuite_params;
1774         int status;
1775
1776         status = test_blockcipher_all_tests(ts_params->mbuf_pool,
1777                 ts_params->op_mpool,
1778                 ts_params->session_mpool,
1779                 ts_params->valid_devs[0],
1780                 rte_cryptodev_driver_id_get(
1781                 RTE_STR(CRYPTODEV_NAME_DPAA2_SEC_PMD)),
1782                 BLKCIPHER_AES_CHAIN_TYPE);
1783
1784         TEST_ASSERT_EQUAL(status, 0, "Test failed");
1785
1786         return TEST_SUCCESS;
1787 }
1788
1789 static int
1790 test_AES_cipheronly_dpaa2_sec_all(void)
1791 {
1792         struct crypto_testsuite_params *ts_params = &testsuite_params;
1793         int status;
1794
1795         status = test_blockcipher_all_tests(ts_params->mbuf_pool,
1796                 ts_params->op_mpool,
1797                 ts_params->session_mpool,
1798                 ts_params->valid_devs[0],
1799                 rte_cryptodev_driver_id_get(
1800                 RTE_STR(CRYPTODEV_NAME_DPAA2_SEC_PMD)),
1801                 BLKCIPHER_AES_CIPHERONLY_TYPE);
1802
1803         TEST_ASSERT_EQUAL(status, 0, "Test failed");
1804
1805         return TEST_SUCCESS;
1806 }
1807
1808 static int
1809 test_authonly_dpaa2_sec_all(void)
1810 {
1811         struct crypto_testsuite_params *ts_params = &testsuite_params;
1812         int status;
1813
1814         status = test_blockcipher_all_tests(ts_params->mbuf_pool,
1815                 ts_params->op_mpool,
1816                 ts_params->session_mpool,
1817                 ts_params->valid_devs[0],
1818                 rte_cryptodev_driver_id_get(
1819                 RTE_STR(RTE_CRYPTODEV_DPAA2_SEC_PMD)),
1820                 BLKCIPHER_AUTHONLY_TYPE);
1821
1822         TEST_ASSERT_EQUAL(status, 0, "Test failed");
1823
1824         return TEST_SUCCESS;
1825 }
1826
1827 static int
1828 test_authonly_openssl_all(void)
1829 {
1830         struct crypto_testsuite_params *ts_params = &testsuite_params;
1831         int status;
1832
1833         status = test_blockcipher_all_tests(ts_params->mbuf_pool,
1834                 ts_params->op_mpool,
1835                 ts_params->session_mpool,
1836                 ts_params->valid_devs[0],
1837                 rte_cryptodev_driver_id_get(
1838                 RTE_STR(CRYPTODEV_NAME_OPENSSL_PMD)),
1839                 BLKCIPHER_AUTHONLY_TYPE);
1840
1841         TEST_ASSERT_EQUAL(status, 0, "Test failed");
1842
1843         return TEST_SUCCESS;
1844 }
1845
1846 static int
1847 test_AES_chain_armv8_all(void)
1848 {
1849         struct crypto_testsuite_params *ts_params = &testsuite_params;
1850         int status;
1851
1852         status = test_blockcipher_all_tests(ts_params->mbuf_pool,
1853                 ts_params->op_mpool,
1854                 ts_params->session_mpool,
1855                 ts_params->valid_devs[0],
1856                 rte_cryptodev_driver_id_get(
1857                 RTE_STR(CRYPTODEV_NAME_ARMV8_PMD)),
1858                 BLKCIPHER_AES_CHAIN_TYPE);
1859
1860         TEST_ASSERT_EQUAL(status, 0, "Test failed");
1861
1862         return TEST_SUCCESS;
1863 }
1864
1865 /* ***** SNOW 3G Tests ***** */
1866 static int
1867 create_wireless_algo_hash_session(uint8_t dev_id,
1868         const uint8_t *key, const uint8_t key_len,
1869         const uint8_t iv_len, const uint8_t auth_len,
1870         enum rte_crypto_auth_operation op,
1871         enum rte_crypto_auth_algorithm algo)
1872 {
1873         uint8_t hash_key[key_len];
1874
1875         struct crypto_testsuite_params *ts_params = &testsuite_params;
1876         struct crypto_unittest_params *ut_params = &unittest_params;
1877
1878         memcpy(hash_key, key, key_len);
1879
1880         TEST_HEXDUMP(stdout, "key:", key, key_len);
1881
1882         /* Setup Authentication Parameters */
1883         ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;
1884         ut_params->auth_xform.next = NULL;
1885
1886         ut_params->auth_xform.auth.op = op;
1887         ut_params->auth_xform.auth.algo = algo;
1888         ut_params->auth_xform.auth.key.length = key_len;
1889         ut_params->auth_xform.auth.key.data = hash_key;
1890         ut_params->auth_xform.auth.digest_length = auth_len;
1891         ut_params->auth_xform.auth.iv.offset = IV_OFFSET;
1892         ut_params->auth_xform.auth.iv.length = iv_len;
1893         ut_params->sess = rte_cryptodev_sym_session_create(
1894                         ts_params->session_mpool);
1895
1896         rte_cryptodev_sym_session_init(dev_id, ut_params->sess,
1897                         &ut_params->auth_xform, ts_params->session_mpool);
1898         TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed");
1899         return 0;
1900 }
1901
1902 static int
1903 create_wireless_algo_cipher_session(uint8_t dev_id,
1904                         enum rte_crypto_cipher_operation op,
1905                         enum rte_crypto_cipher_algorithm algo,
1906                         const uint8_t *key, const uint8_t key_len,
1907                         uint8_t iv_len)
1908 {
1909         uint8_t cipher_key[key_len];
1910
1911         struct crypto_testsuite_params *ts_params = &testsuite_params;
1912         struct crypto_unittest_params *ut_params = &unittest_params;
1913
1914         memcpy(cipher_key, key, key_len);
1915
1916         /* Setup Cipher Parameters */
1917         ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
1918         ut_params->cipher_xform.next = NULL;
1919
1920         ut_params->cipher_xform.cipher.algo = algo;
1921         ut_params->cipher_xform.cipher.op = op;
1922         ut_params->cipher_xform.cipher.key.data = cipher_key;
1923         ut_params->cipher_xform.cipher.key.length = key_len;
1924         ut_params->cipher_xform.cipher.iv.offset = IV_OFFSET;
1925         ut_params->cipher_xform.cipher.iv.length = iv_len;
1926
1927         TEST_HEXDUMP(stdout, "key:", key, key_len);
1928
1929         /* Create Crypto session */
1930         ut_params->sess = rte_cryptodev_sym_session_create(
1931                         ts_params->session_mpool);
1932
1933         rte_cryptodev_sym_session_init(dev_id, ut_params->sess,
1934                         &ut_params->cipher_xform, ts_params->session_mpool);
1935         TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed");
1936         return 0;
1937 }
1938
1939 static int
1940 create_wireless_algo_cipher_operation(const uint8_t *iv, uint8_t iv_len,
1941                         unsigned int cipher_len,
1942                         unsigned int cipher_offset)
1943 {
1944         struct crypto_testsuite_params *ts_params = &testsuite_params;
1945         struct crypto_unittest_params *ut_params = &unittest_params;
1946
1947         /* Generate Crypto op data structure */
1948         ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
1949                                 RTE_CRYPTO_OP_TYPE_SYMMETRIC);
1950         TEST_ASSERT_NOT_NULL(ut_params->op,
1951                                 "Failed to allocate pktmbuf offload");
1952
1953         /* Set crypto operation data parameters */
1954         rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
1955
1956         struct rte_crypto_sym_op *sym_op = ut_params->op->sym;
1957
1958         /* set crypto operation source mbuf */
1959         sym_op->m_src = ut_params->ibuf;
1960
1961         /* iv */
1962         rte_memcpy(rte_crypto_op_ctod_offset(ut_params->op, uint8_t *, IV_OFFSET),
1963                         iv, iv_len);
1964         sym_op->cipher.data.length = cipher_len;
1965         sym_op->cipher.data.offset = cipher_offset;
1966         return 0;
1967 }
1968
1969 static int
1970 create_wireless_algo_cipher_operation_oop(const uint8_t *iv, uint8_t iv_len,
1971                         unsigned int cipher_len,
1972                         unsigned int cipher_offset)
1973 {
1974         struct crypto_testsuite_params *ts_params = &testsuite_params;
1975         struct crypto_unittest_params *ut_params = &unittest_params;
1976
1977         /* Generate Crypto op data structure */
1978         ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
1979                                 RTE_CRYPTO_OP_TYPE_SYMMETRIC);
1980         TEST_ASSERT_NOT_NULL(ut_params->op,
1981                                 "Failed to allocate pktmbuf offload");
1982
1983         /* Set crypto operation data parameters */
1984         rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
1985
1986         struct rte_crypto_sym_op *sym_op = ut_params->op->sym;
1987
1988         /* set crypto operation source mbuf */
1989         sym_op->m_src = ut_params->ibuf;
1990         sym_op->m_dst = ut_params->obuf;
1991
1992         /* iv */
1993         rte_memcpy(rte_crypto_op_ctod_offset(ut_params->op, uint8_t *, IV_OFFSET),
1994                         iv, iv_len);
1995         sym_op->cipher.data.length = cipher_len;
1996         sym_op->cipher.data.offset = cipher_offset;
1997         return 0;
1998 }
1999
2000 static int
2001 create_wireless_algo_cipher_auth_session(uint8_t dev_id,
2002                 enum rte_crypto_cipher_operation cipher_op,
2003                 enum rte_crypto_auth_operation auth_op,
2004                 enum rte_crypto_auth_algorithm auth_algo,
2005                 enum rte_crypto_cipher_algorithm cipher_algo,
2006                 const uint8_t *key, uint8_t key_len,
2007                 uint8_t auth_iv_len, uint8_t auth_len,
2008                 uint8_t cipher_iv_len)
2009
2010 {
2011         uint8_t cipher_auth_key[key_len];
2012
2013         struct crypto_testsuite_params *ts_params = &testsuite_params;
2014         struct crypto_unittest_params *ut_params = &unittest_params;
2015
2016         memcpy(cipher_auth_key, key, key_len);
2017
2018         /* Setup Authentication Parameters */
2019         ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;
2020         ut_params->auth_xform.next = NULL;
2021
2022         ut_params->auth_xform.auth.op = auth_op;
2023         ut_params->auth_xform.auth.algo = auth_algo;
2024         ut_params->auth_xform.auth.key.length = key_len;
2025         /* Hash key = cipher key */
2026         ut_params->auth_xform.auth.key.data = cipher_auth_key;
2027         ut_params->auth_xform.auth.digest_length = auth_len;
2028         /* Auth IV will be after cipher IV */
2029         ut_params->auth_xform.auth.iv.offset = IV_OFFSET + cipher_iv_len;
2030         ut_params->auth_xform.auth.iv.length = auth_iv_len;
2031
2032         /* Setup Cipher Parameters */
2033         ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
2034         ut_params->cipher_xform.next = &ut_params->auth_xform;
2035
2036         ut_params->cipher_xform.cipher.algo = cipher_algo;
2037         ut_params->cipher_xform.cipher.op = cipher_op;
2038         ut_params->cipher_xform.cipher.key.data = cipher_auth_key;
2039         ut_params->cipher_xform.cipher.key.length = key_len;
2040         ut_params->cipher_xform.cipher.iv.offset = IV_OFFSET;
2041         ut_params->cipher_xform.cipher.iv.length = cipher_iv_len;
2042
2043         TEST_HEXDUMP(stdout, "key:", key, key_len);
2044
2045         /* Create Crypto session*/
2046         ut_params->sess = rte_cryptodev_sym_session_create(
2047                         ts_params->session_mpool);
2048
2049         rte_cryptodev_sym_session_init(dev_id, ut_params->sess,
2050                         &ut_params->cipher_xform, ts_params->session_mpool);
2051
2052         TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed");
2053         return 0;
2054 }
2055
2056 static int
2057 create_wireless_cipher_auth_session(uint8_t dev_id,
2058                 enum rte_crypto_cipher_operation cipher_op,
2059                 enum rte_crypto_auth_operation auth_op,
2060                 enum rte_crypto_auth_algorithm auth_algo,
2061                 enum rte_crypto_cipher_algorithm cipher_algo,
2062                 const struct wireless_test_data *tdata)
2063 {
2064         const uint8_t key_len = tdata->key.len;
2065         uint8_t cipher_auth_key[key_len];
2066
2067         struct crypto_testsuite_params *ts_params = &testsuite_params;
2068         struct crypto_unittest_params *ut_params = &unittest_params;
2069         const uint8_t *key = tdata->key.data;
2070         const uint8_t auth_len = tdata->digest.len;
2071         uint8_t cipher_iv_len = tdata->cipher_iv.len;
2072         uint8_t auth_iv_len = tdata->auth_iv.len;
2073
2074         memcpy(cipher_auth_key, key, key_len);
2075
2076         /* Setup Authentication Parameters */
2077         ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;
2078         ut_params->auth_xform.next = NULL;
2079
2080         ut_params->auth_xform.auth.op = auth_op;
2081         ut_params->auth_xform.auth.algo = auth_algo;
2082         ut_params->auth_xform.auth.key.length = key_len;
2083         /* Hash key = cipher key */
2084         ut_params->auth_xform.auth.key.data = cipher_auth_key;
2085         ut_params->auth_xform.auth.digest_length = auth_len;
2086         /* Auth IV will be after cipher IV */
2087         ut_params->auth_xform.auth.iv.offset = IV_OFFSET + cipher_iv_len;
2088         ut_params->auth_xform.auth.iv.length = auth_iv_len;
2089
2090         /* Setup Cipher Parameters */
2091         ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
2092         ut_params->cipher_xform.next = &ut_params->auth_xform;
2093
2094         ut_params->cipher_xform.cipher.algo = cipher_algo;
2095         ut_params->cipher_xform.cipher.op = cipher_op;
2096         ut_params->cipher_xform.cipher.key.data = cipher_auth_key;
2097         ut_params->cipher_xform.cipher.key.length = key_len;
2098         ut_params->cipher_xform.cipher.iv.offset = IV_OFFSET;
2099         ut_params->cipher_xform.cipher.iv.length = cipher_iv_len;
2100
2101
2102         TEST_HEXDUMP(stdout, "key:", key, key_len);
2103
2104         /* Create Crypto session*/
2105         ut_params->sess = rte_cryptodev_sym_session_create(
2106                         ts_params->session_mpool);
2107
2108         rte_cryptodev_sym_session_init(dev_id, ut_params->sess,
2109                         &ut_params->cipher_xform, ts_params->session_mpool);
2110
2111         TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed");
2112         return 0;
2113 }
2114
2115 static int
2116 create_zuc_cipher_auth_encrypt_generate_session(uint8_t dev_id,
2117                 const struct wireless_test_data *tdata)
2118 {
2119         return create_wireless_cipher_auth_session(dev_id,
2120                 RTE_CRYPTO_CIPHER_OP_ENCRYPT,
2121                 RTE_CRYPTO_AUTH_OP_GENERATE, RTE_CRYPTO_AUTH_ZUC_EIA3,
2122                 RTE_CRYPTO_CIPHER_ZUC_EEA3, tdata);
2123 }
2124
2125 static int
2126 create_wireless_algo_auth_cipher_session(uint8_t dev_id,
2127                 enum rte_crypto_cipher_operation cipher_op,
2128                 enum rte_crypto_auth_operation auth_op,
2129                 enum rte_crypto_auth_algorithm auth_algo,
2130                 enum rte_crypto_cipher_algorithm cipher_algo,
2131                 const uint8_t *key, const uint8_t key_len,
2132                 uint8_t auth_iv_len, uint8_t auth_len,
2133                 uint8_t cipher_iv_len)
2134 {
2135         uint8_t auth_cipher_key[key_len];
2136
2137         struct crypto_testsuite_params *ts_params = &testsuite_params;
2138         struct crypto_unittest_params *ut_params = &unittest_params;
2139
2140         memcpy(auth_cipher_key, key, key_len);
2141
2142         /* Setup Authentication Parameters */
2143         ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;
2144         ut_params->auth_xform.auth.op = auth_op;
2145         ut_params->auth_xform.next = &ut_params->cipher_xform;
2146         ut_params->auth_xform.auth.algo = auth_algo;
2147         ut_params->auth_xform.auth.key.length = key_len;
2148         ut_params->auth_xform.auth.key.data = auth_cipher_key;
2149         ut_params->auth_xform.auth.digest_length = auth_len;
2150         /* Auth IV will be after cipher IV */
2151         ut_params->auth_xform.auth.iv.offset = IV_OFFSET + cipher_iv_len;
2152         ut_params->auth_xform.auth.iv.length = auth_iv_len;
2153
2154         /* Setup Cipher Parameters */
2155         ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
2156         ut_params->cipher_xform.next = NULL;
2157         ut_params->cipher_xform.cipher.algo = cipher_algo;
2158         ut_params->cipher_xform.cipher.op = cipher_op;
2159         ut_params->cipher_xform.cipher.key.data = auth_cipher_key;
2160         ut_params->cipher_xform.cipher.key.length = key_len;
2161         ut_params->cipher_xform.cipher.iv.offset = IV_OFFSET;
2162         ut_params->cipher_xform.cipher.iv.length = cipher_iv_len;
2163
2164         TEST_HEXDUMP(stdout, "key:", key, key_len);
2165
2166         /* Create Crypto session*/
2167         ut_params->sess = rte_cryptodev_sym_session_create(
2168                         ts_params->session_mpool);
2169
2170         rte_cryptodev_sym_session_init(dev_id, ut_params->sess,
2171                         &ut_params->auth_xform, ts_params->session_mpool);
2172
2173         TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed");
2174
2175         return 0;
2176 }
2177
2178 static int
2179 create_wireless_algo_hash_operation(const uint8_t *auth_tag,
2180                 unsigned int auth_tag_len,
2181                 const uint8_t *iv, unsigned int iv_len,
2182                 unsigned int data_pad_len,
2183                 enum rte_crypto_auth_operation op,
2184                 unsigned int auth_len, unsigned int auth_offset)
2185 {
2186         struct crypto_testsuite_params *ts_params = &testsuite_params;
2187
2188         struct crypto_unittest_params *ut_params = &unittest_params;
2189
2190         /* Generate Crypto op data structure */
2191         ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
2192                         RTE_CRYPTO_OP_TYPE_SYMMETRIC);
2193         TEST_ASSERT_NOT_NULL(ut_params->op,
2194                 "Failed to allocate pktmbuf offload");
2195
2196         /* Set crypto operation data parameters */
2197         rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
2198
2199         struct rte_crypto_sym_op *sym_op = ut_params->op->sym;
2200
2201         /* set crypto operation source mbuf */
2202         sym_op->m_src = ut_params->ibuf;
2203
2204         /* iv */
2205         rte_memcpy(rte_crypto_op_ctod_offset(ut_params->op, uint8_t *, IV_OFFSET),
2206                         iv, iv_len);
2207         /* digest */
2208         sym_op->auth.digest.data = (uint8_t *)rte_pktmbuf_append(
2209                                         ut_params->ibuf, auth_tag_len);
2210
2211         TEST_ASSERT_NOT_NULL(sym_op->auth.digest.data,
2212                                 "no room to append auth tag");
2213         ut_params->digest = sym_op->auth.digest.data;
2214         sym_op->auth.digest.phys_addr = rte_pktmbuf_mtophys_offset(
2215                         ut_params->ibuf, data_pad_len);
2216         if (op == RTE_CRYPTO_AUTH_OP_GENERATE)
2217                 memset(sym_op->auth.digest.data, 0, auth_tag_len);
2218         else
2219                 rte_memcpy(sym_op->auth.digest.data, auth_tag, auth_tag_len);
2220
2221         TEST_HEXDUMP(stdout, "digest:",
2222                 sym_op->auth.digest.data,
2223                 auth_tag_len);
2224
2225         sym_op->auth.data.length = auth_len;
2226         sym_op->auth.data.offset = auth_offset;
2227
2228         return 0;
2229 }
2230
2231 static int
2232 create_wireless_cipher_hash_operation(const struct wireless_test_data *tdata,
2233         enum rte_crypto_auth_operation op)
2234 {
2235         struct crypto_testsuite_params *ts_params = &testsuite_params;
2236         struct crypto_unittest_params *ut_params = &unittest_params;
2237
2238         const uint8_t *auth_tag = tdata->digest.data;
2239         const unsigned int auth_tag_len = tdata->digest.len;
2240         unsigned int plaintext_len = ceil_byte_length(tdata->plaintext.len);
2241         unsigned int data_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16);
2242
2243         const uint8_t *cipher_iv = tdata->cipher_iv.data;
2244         const uint8_t cipher_iv_len = tdata->cipher_iv.len;
2245         const uint8_t *auth_iv = tdata->auth_iv.data;
2246         const uint8_t auth_iv_len = tdata->auth_iv.len;
2247         const unsigned int cipher_len = tdata->validCipherLenInBits.len;
2248         const unsigned int auth_len = tdata->validAuthLenInBits.len;
2249
2250         /* Generate Crypto op data structure */
2251         ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
2252                         RTE_CRYPTO_OP_TYPE_SYMMETRIC);
2253         TEST_ASSERT_NOT_NULL(ut_params->op,
2254                         "Failed to allocate pktmbuf offload");
2255         /* Set crypto operation data parameters */
2256         rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
2257
2258         struct rte_crypto_sym_op *sym_op = ut_params->op->sym;
2259
2260         /* set crypto operation source mbuf */
2261         sym_op->m_src = ut_params->ibuf;
2262
2263         /* digest */
2264         sym_op->auth.digest.data = (uint8_t *)rte_pktmbuf_append(
2265                         ut_params->ibuf, auth_tag_len);
2266
2267         TEST_ASSERT_NOT_NULL(sym_op->auth.digest.data,
2268                         "no room to append auth tag");
2269         ut_params->digest = sym_op->auth.digest.data;
2270         sym_op->auth.digest.phys_addr = rte_pktmbuf_mtophys_offset(
2271                         ut_params->ibuf, data_pad_len);
2272         if (op == RTE_CRYPTO_AUTH_OP_GENERATE)
2273                 memset(sym_op->auth.digest.data, 0, auth_tag_len);
2274         else
2275                 rte_memcpy(sym_op->auth.digest.data, auth_tag, auth_tag_len);
2276
2277         TEST_HEXDUMP(stdout, "digest:",
2278                 sym_op->auth.digest.data,
2279                 auth_tag_len);
2280
2281         /* Copy cipher and auth IVs at the end of the crypto operation */
2282         uint8_t *iv_ptr = rte_crypto_op_ctod_offset(ut_params->op, uint8_t *,
2283                                                 IV_OFFSET);
2284         rte_memcpy(iv_ptr, cipher_iv, cipher_iv_len);
2285         iv_ptr += cipher_iv_len;
2286         rte_memcpy(iv_ptr, auth_iv, auth_iv_len);
2287
2288         sym_op->cipher.data.length = cipher_len;
2289         sym_op->cipher.data.offset = 0;
2290         sym_op->auth.data.length = auth_len;
2291         sym_op->auth.data.offset = 0;
2292
2293         return 0;
2294 }
2295
2296 static int
2297 create_zuc_cipher_hash_generate_operation(
2298                 const struct wireless_test_data *tdata)
2299 {
2300         return create_wireless_cipher_hash_operation(tdata,
2301                 RTE_CRYPTO_AUTH_OP_GENERATE);
2302 }
2303
2304 static int
2305 create_wireless_algo_cipher_hash_operation(const uint8_t *auth_tag,
2306                 const unsigned auth_tag_len,
2307                 const uint8_t *auth_iv, uint8_t auth_iv_len,
2308                 unsigned data_pad_len,
2309                 enum rte_crypto_auth_operation op,
2310                 const uint8_t *cipher_iv, uint8_t cipher_iv_len,
2311                 const unsigned cipher_len, const unsigned cipher_offset,
2312                 const unsigned auth_len, const unsigned auth_offset)
2313 {
2314         struct crypto_testsuite_params *ts_params = &testsuite_params;
2315         struct crypto_unittest_params *ut_params = &unittest_params;
2316
2317         /* Generate Crypto op data structure */
2318         ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
2319                         RTE_CRYPTO_OP_TYPE_SYMMETRIC);
2320         TEST_ASSERT_NOT_NULL(ut_params->op,
2321                         "Failed to allocate pktmbuf offload");
2322         /* Set crypto operation data parameters */
2323         rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
2324
2325         struct rte_crypto_sym_op *sym_op = ut_params->op->sym;
2326
2327         /* set crypto operation source mbuf */
2328         sym_op->m_src = ut_params->ibuf;
2329
2330         /* digest */
2331         sym_op->auth.digest.data = (uint8_t *)rte_pktmbuf_append(
2332                         ut_params->ibuf, auth_tag_len);
2333
2334         TEST_ASSERT_NOT_NULL(sym_op->auth.digest.data,
2335                         "no room to append auth tag");
2336         ut_params->digest = sym_op->auth.digest.data;
2337         sym_op->auth.digest.phys_addr = rte_pktmbuf_mtophys_offset(
2338                         ut_params->ibuf, data_pad_len);
2339         if (op == RTE_CRYPTO_AUTH_OP_GENERATE)
2340                 memset(sym_op->auth.digest.data, 0, auth_tag_len);
2341         else
2342                 rte_memcpy(sym_op->auth.digest.data, auth_tag, auth_tag_len);
2343
2344         TEST_HEXDUMP(stdout, "digest:",
2345                 sym_op->auth.digest.data,
2346                 auth_tag_len);
2347
2348         /* Copy cipher and auth IVs at the end of the crypto operation */
2349         uint8_t *iv_ptr = rte_crypto_op_ctod_offset(ut_params->op, uint8_t *,
2350                                                 IV_OFFSET);
2351         rte_memcpy(iv_ptr, cipher_iv, cipher_iv_len);
2352         iv_ptr += cipher_iv_len;
2353         rte_memcpy(iv_ptr, auth_iv, auth_iv_len);
2354
2355         sym_op->cipher.data.length = cipher_len;
2356         sym_op->cipher.data.offset = cipher_offset;
2357         sym_op->auth.data.length = auth_len;
2358         sym_op->auth.data.offset = auth_offset;
2359
2360         return 0;
2361 }
2362
2363 static int
2364 create_wireless_algo_auth_cipher_operation(unsigned int auth_tag_len,
2365                 const uint8_t *cipher_iv, uint8_t cipher_iv_len,
2366                 const uint8_t *auth_iv, uint8_t auth_iv_len,
2367                 unsigned int data_pad_len,
2368                 unsigned int cipher_len, unsigned int cipher_offset,
2369                 unsigned int auth_len, unsigned int auth_offset)
2370 {
2371         struct crypto_testsuite_params *ts_params = &testsuite_params;
2372         struct crypto_unittest_params *ut_params = &unittest_params;
2373
2374         /* Generate Crypto op data structure */
2375         ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
2376                         RTE_CRYPTO_OP_TYPE_SYMMETRIC);
2377         TEST_ASSERT_NOT_NULL(ut_params->op,
2378                         "Failed to allocate pktmbuf offload");
2379
2380         /* Set crypto operation data parameters */
2381         rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
2382
2383         struct rte_crypto_sym_op *sym_op = ut_params->op->sym;
2384
2385         /* set crypto operation source mbuf */
2386         sym_op->m_src = ut_params->ibuf;
2387
2388         /* digest */
2389         sym_op->auth.digest.data = (uint8_t *)rte_pktmbuf_append(
2390                         ut_params->ibuf, auth_tag_len);
2391
2392         TEST_ASSERT_NOT_NULL(sym_op->auth.digest.data,
2393                         "no room to append auth tag");
2394
2395         sym_op->auth.digest.phys_addr = rte_pktmbuf_mtophys_offset(
2396                         ut_params->ibuf, data_pad_len);
2397
2398         memset(sym_op->auth.digest.data, 0, auth_tag_len);
2399
2400         TEST_HEXDUMP(stdout, "digest:",
2401                         sym_op->auth.digest.data,
2402                         auth_tag_len);
2403
2404         /* Copy cipher and auth IVs at the end of the crypto operation */
2405         uint8_t *iv_ptr = rte_crypto_op_ctod_offset(ut_params->op, uint8_t *,
2406                                                 IV_OFFSET);
2407         rte_memcpy(iv_ptr, cipher_iv, cipher_iv_len);
2408         iv_ptr += cipher_iv_len;
2409         rte_memcpy(iv_ptr, auth_iv, auth_iv_len);
2410
2411         sym_op->cipher.data.length = cipher_len;
2412         sym_op->cipher.data.offset = cipher_offset;
2413
2414         sym_op->auth.data.length = auth_len;
2415         sym_op->auth.data.offset = auth_offset;
2416
2417         return 0;
2418 }
2419
2420 static int
2421 test_snow3g_authentication(const struct snow3g_hash_test_data *tdata)
2422 {
2423         struct crypto_testsuite_params *ts_params = &testsuite_params;
2424         struct crypto_unittest_params *ut_params = &unittest_params;
2425
2426         int retval;
2427         unsigned plaintext_pad_len;
2428         unsigned plaintext_len;
2429         uint8_t *plaintext;
2430
2431         /* Create SNOW 3G session */
2432         retval = create_wireless_algo_hash_session(ts_params->valid_devs[0],
2433                         tdata->key.data, tdata->key.len,
2434                         tdata->auth_iv.len, tdata->digest.len,
2435                         RTE_CRYPTO_AUTH_OP_GENERATE,
2436                         RTE_CRYPTO_AUTH_SNOW3G_UIA2);
2437         if (retval < 0)
2438                 return retval;
2439
2440         /* alloc mbuf and set payload */
2441         ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
2442
2443         memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
2444         rte_pktmbuf_tailroom(ut_params->ibuf));
2445
2446         plaintext_len = ceil_byte_length(tdata->plaintext.len);
2447         /* Append data which is padded to a multiple of */
2448         /* the algorithms block size */
2449         plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16);
2450         plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
2451                                 plaintext_pad_len);
2452         memcpy(plaintext, tdata->plaintext.data, plaintext_len);
2453
2454         /* Create SNOW 3G operation */
2455         retval = create_wireless_algo_hash_operation(NULL, tdata->digest.len,
2456                         tdata->auth_iv.data, tdata->auth_iv.len,
2457                         plaintext_pad_len, RTE_CRYPTO_AUTH_OP_GENERATE,
2458                         tdata->validAuthLenInBits.len,
2459                         0);
2460         if (retval < 0)
2461                 return retval;
2462
2463         ut_params->op = process_crypto_request(ts_params->valid_devs[0],
2464                                 ut_params->op);
2465         ut_params->obuf = ut_params->op->sym->m_src;
2466         TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
2467         ut_params->digest = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *)
2468                         + plaintext_pad_len;
2469
2470         /* Validate obuf */
2471         TEST_ASSERT_BUFFERS_ARE_EQUAL(
2472         ut_params->digest,
2473         tdata->digest.data,
2474         DIGEST_BYTE_LENGTH_SNOW3G_UIA2,
2475         "SNOW 3G Generated auth tag not as expected");
2476
2477         return 0;
2478 }
2479
2480 static int
2481 test_snow3g_authentication_verify(const struct snow3g_hash_test_data *tdata)
2482 {
2483         struct crypto_testsuite_params *ts_params = &testsuite_params;
2484         struct crypto_unittest_params *ut_params = &unittest_params;
2485
2486         int retval;
2487         unsigned plaintext_pad_len;
2488         unsigned plaintext_len;
2489         uint8_t *plaintext;
2490
2491         /* Create SNOW 3G session */
2492         retval = create_wireless_algo_hash_session(ts_params->valid_devs[0],
2493                                 tdata->key.data, tdata->key.len,
2494                                 tdata->auth_iv.len, tdata->digest.len,
2495                                 RTE_CRYPTO_AUTH_OP_VERIFY,
2496                                 RTE_CRYPTO_AUTH_SNOW3G_UIA2);
2497         if (retval < 0)
2498                 return retval;
2499         /* alloc mbuf and set payload */
2500         ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
2501
2502         memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
2503         rte_pktmbuf_tailroom(ut_params->ibuf));
2504
2505         plaintext_len = ceil_byte_length(tdata->plaintext.len);
2506         /* Append data which is padded to a multiple of */
2507         /* the algorithms block size */
2508         plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16);
2509         plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
2510                                 plaintext_pad_len);
2511         memcpy(plaintext, tdata->plaintext.data, plaintext_len);
2512
2513         /* Create SNOW 3G operation */
2514         retval = create_wireless_algo_hash_operation(tdata->digest.data,
2515                         tdata->digest.len,
2516                         tdata->auth_iv.data, tdata->auth_iv.len,
2517                         plaintext_pad_len,
2518                         RTE_CRYPTO_AUTH_OP_VERIFY,
2519                         tdata->validAuthLenInBits.len,
2520                         0);
2521         if (retval < 0)
2522                 return retval;
2523
2524         ut_params->op = process_crypto_request(ts_params->valid_devs[0],
2525                                 ut_params->op);
2526         TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
2527         ut_params->obuf = ut_params->op->sym->m_src;
2528         ut_params->digest = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *)
2529                                 + plaintext_pad_len;
2530
2531         /* Validate obuf */
2532         if (ut_params->op->status == RTE_CRYPTO_OP_STATUS_SUCCESS)
2533                 return 0;
2534         else
2535                 return -1;
2536
2537         return 0;
2538 }
2539
2540 static int
2541 test_kasumi_authentication(const struct kasumi_hash_test_data *tdata)
2542 {
2543         struct crypto_testsuite_params *ts_params = &testsuite_params;
2544         struct crypto_unittest_params *ut_params = &unittest_params;
2545
2546         int retval;
2547         unsigned plaintext_pad_len;
2548         unsigned plaintext_len;
2549         uint8_t *plaintext;
2550
2551         /* Create KASUMI session */
2552         retval = create_wireless_algo_hash_session(ts_params->valid_devs[0],
2553                         tdata->key.data, tdata->key.len,
2554                         0, tdata->digest.len,
2555                         RTE_CRYPTO_AUTH_OP_GENERATE,
2556                         RTE_CRYPTO_AUTH_KASUMI_F9);
2557         if (retval < 0)
2558                 return retval;
2559
2560         /* alloc mbuf and set payload */
2561         ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
2562
2563         memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
2564         rte_pktmbuf_tailroom(ut_params->ibuf));
2565
2566         plaintext_len = ceil_byte_length(tdata->plaintext.len);
2567         /* Append data which is padded to a multiple of */
2568         /* the algorithms block size */
2569         plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 8);
2570         plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
2571                                 plaintext_pad_len);
2572         memcpy(plaintext, tdata->plaintext.data, plaintext_len);
2573
2574         /* Create KASUMI operation */
2575         retval = create_wireless_algo_hash_operation(NULL, tdata->digest.len,
2576                         NULL, 0,
2577                         plaintext_pad_len, RTE_CRYPTO_AUTH_OP_GENERATE,
2578                         tdata->plaintext.len,
2579                         0);
2580         if (retval < 0)
2581                 return retval;
2582
2583         ut_params->op = process_crypto_request(ts_params->valid_devs[0],
2584                                 ut_params->op);
2585         ut_params->obuf = ut_params->op->sym->m_src;
2586         TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
2587         ut_params->digest = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *)
2588                         + plaintext_pad_len;
2589
2590         /* Validate obuf */
2591         TEST_ASSERT_BUFFERS_ARE_EQUAL(
2592         ut_params->digest,
2593         tdata->digest.data,
2594         DIGEST_BYTE_LENGTH_KASUMI_F9,
2595         "KASUMI Generated auth tag not as expected");
2596
2597         return 0;
2598 }
2599
2600 static int
2601 test_kasumi_authentication_verify(const struct kasumi_hash_test_data *tdata)
2602 {
2603         struct crypto_testsuite_params *ts_params = &testsuite_params;
2604         struct crypto_unittest_params *ut_params = &unittest_params;
2605
2606         int retval;
2607         unsigned plaintext_pad_len;
2608         unsigned plaintext_len;
2609         uint8_t *plaintext;
2610
2611         /* Create KASUMI session */
2612         retval = create_wireless_algo_hash_session(ts_params->valid_devs[0],
2613                                 tdata->key.data, tdata->key.len,
2614                                 0, tdata->digest.len,
2615                                 RTE_CRYPTO_AUTH_OP_VERIFY,
2616                                 RTE_CRYPTO_AUTH_KASUMI_F9);
2617         if (retval < 0)
2618                 return retval;
2619         /* alloc mbuf and set payload */
2620         ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
2621
2622         memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
2623         rte_pktmbuf_tailroom(ut_params->ibuf));
2624
2625         plaintext_len = ceil_byte_length(tdata->plaintext.len);
2626         /* Append data which is padded to a multiple */
2627         /* of the algorithms block size */
2628         plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 8);
2629         plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
2630                                 plaintext_pad_len);
2631         memcpy(plaintext, tdata->plaintext.data, plaintext_len);
2632
2633         /* Create KASUMI operation */
2634         retval = create_wireless_algo_hash_operation(tdata->digest.data,
2635                         tdata->digest.len,
2636                         NULL, 0,
2637                         plaintext_pad_len,
2638                         RTE_CRYPTO_AUTH_OP_VERIFY,
2639                         tdata->plaintext.len,
2640                         0);
2641         if (retval < 0)
2642                 return retval;
2643
2644         ut_params->op = process_crypto_request(ts_params->valid_devs[0],
2645                                 ut_params->op);
2646         TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
2647         ut_params->obuf = ut_params->op->sym->m_src;
2648         ut_params->digest = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *)
2649                                 + plaintext_pad_len;
2650
2651         /* Validate obuf */
2652         if (ut_params->op->status == RTE_CRYPTO_OP_STATUS_SUCCESS)
2653                 return 0;
2654         else
2655                 return -1;
2656
2657         return 0;
2658 }
2659
2660 static int
2661 test_snow3g_hash_generate_test_case_1(void)
2662 {
2663         return test_snow3g_authentication(&snow3g_hash_test_case_1);
2664 }
2665
2666 static int
2667 test_snow3g_hash_generate_test_case_2(void)
2668 {
2669         return test_snow3g_authentication(&snow3g_hash_test_case_2);
2670 }
2671
2672 static int
2673 test_snow3g_hash_generate_test_case_3(void)
2674 {
2675         return test_snow3g_authentication(&snow3g_hash_test_case_3);
2676 }
2677
2678 static int
2679 test_snow3g_hash_generate_test_case_4(void)
2680 {
2681         return test_snow3g_authentication(&snow3g_hash_test_case_4);
2682 }
2683
2684 static int
2685 test_snow3g_hash_generate_test_case_5(void)
2686 {
2687         return test_snow3g_authentication(&snow3g_hash_test_case_5);
2688 }
2689
2690 static int
2691 test_snow3g_hash_generate_test_case_6(void)
2692 {
2693         return test_snow3g_authentication(&snow3g_hash_test_case_6);
2694 }
2695
2696 static int
2697 test_snow3g_hash_verify_test_case_1(void)
2698 {
2699         return test_snow3g_authentication_verify(&snow3g_hash_test_case_1);
2700
2701 }
2702
2703 static int
2704 test_snow3g_hash_verify_test_case_2(void)
2705 {
2706         return test_snow3g_authentication_verify(&snow3g_hash_test_case_2);
2707 }
2708
2709 static int
2710 test_snow3g_hash_verify_test_case_3(void)
2711 {
2712         return test_snow3g_authentication_verify(&snow3g_hash_test_case_3);
2713 }
2714
2715 static int
2716 test_snow3g_hash_verify_test_case_4(void)
2717 {
2718         return test_snow3g_authentication_verify(&snow3g_hash_test_case_4);
2719 }
2720
2721 static int
2722 test_snow3g_hash_verify_test_case_5(void)
2723 {
2724         return test_snow3g_authentication_verify(&snow3g_hash_test_case_5);
2725 }
2726
2727 static int
2728 test_snow3g_hash_verify_test_case_6(void)
2729 {
2730         return test_snow3g_authentication_verify(&snow3g_hash_test_case_6);
2731 }
2732
2733 static int
2734 test_kasumi_hash_generate_test_case_1(void)
2735 {
2736         return test_kasumi_authentication(&kasumi_hash_test_case_1);
2737 }
2738
2739 static int
2740 test_kasumi_hash_generate_test_case_2(void)
2741 {
2742         return test_kasumi_authentication(&kasumi_hash_test_case_2);
2743 }
2744
2745 static int
2746 test_kasumi_hash_generate_test_case_3(void)
2747 {
2748         return test_kasumi_authentication(&kasumi_hash_test_case_3);
2749 }
2750
2751 static int
2752 test_kasumi_hash_generate_test_case_4(void)
2753 {
2754         return test_kasumi_authentication(&kasumi_hash_test_case_4);
2755 }
2756
2757 static int
2758 test_kasumi_hash_generate_test_case_5(void)
2759 {
2760         return test_kasumi_authentication(&kasumi_hash_test_case_5);
2761 }
2762
2763 static int
2764 test_kasumi_hash_generate_test_case_6(void)
2765 {
2766         return test_kasumi_authentication(&kasumi_hash_test_case_6);
2767 }
2768
2769 static int
2770 test_kasumi_hash_verify_test_case_1(void)
2771 {
2772         return test_kasumi_authentication_verify(&kasumi_hash_test_case_1);
2773 }
2774
2775 static int
2776 test_kasumi_hash_verify_test_case_2(void)
2777 {
2778         return test_kasumi_authentication_verify(&kasumi_hash_test_case_2);
2779 }
2780
2781 static int
2782 test_kasumi_hash_verify_test_case_3(void)
2783 {
2784         return test_kasumi_authentication_verify(&kasumi_hash_test_case_3);
2785 }
2786
2787 static int
2788 test_kasumi_hash_verify_test_case_4(void)
2789 {
2790         return test_kasumi_authentication_verify(&kasumi_hash_test_case_4);
2791 }
2792
2793 static int
2794 test_kasumi_hash_verify_test_case_5(void)
2795 {
2796         return test_kasumi_authentication_verify(&kasumi_hash_test_case_5);
2797 }
2798
2799 static int
2800 test_kasumi_encryption(const struct kasumi_test_data *tdata)
2801 {
2802         struct crypto_testsuite_params *ts_params = &testsuite_params;
2803         struct crypto_unittest_params *ut_params = &unittest_params;
2804
2805         int retval;
2806         uint8_t *plaintext, *ciphertext;
2807         unsigned plaintext_pad_len;
2808         unsigned plaintext_len;
2809
2810         /* Create KASUMI session */
2811         retval = create_wireless_algo_cipher_session(ts_params->valid_devs[0],
2812                                         RTE_CRYPTO_CIPHER_OP_ENCRYPT,
2813                                         RTE_CRYPTO_CIPHER_KASUMI_F8,
2814                                         tdata->key.data, tdata->key.len,
2815                                         tdata->cipher_iv.len);
2816         if (retval < 0)
2817                 return retval;
2818
2819         ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
2820
2821         /* Clear mbuf payload */
2822         memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
2823                rte_pktmbuf_tailroom(ut_params->ibuf));
2824
2825         plaintext_len = ceil_byte_length(tdata->plaintext.len);
2826         /* Append data which is padded to a multiple */
2827         /* of the algorithms block size */
2828         plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 8);
2829         plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
2830                                 plaintext_pad_len);
2831         memcpy(plaintext, tdata->plaintext.data, plaintext_len);
2832
2833         TEST_HEXDUMP(stdout, "plaintext:", plaintext, plaintext_len);
2834
2835         /* Create KASUMI operation */
2836         retval = create_wireless_algo_cipher_operation(tdata->cipher_iv.data,
2837                                 tdata->cipher_iv.len,
2838                                 RTE_ALIGN_CEIL(tdata->validCipherLenInBits.len, 8),
2839                                 tdata->validCipherOffsetInBits.len);
2840         if (retval < 0)
2841                 return retval;
2842
2843         ut_params->op = process_crypto_request(ts_params->valid_devs[0],
2844                                                 ut_params->op);
2845         TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
2846
2847         ut_params->obuf = ut_params->op->sym->m_dst;
2848         if (ut_params->obuf)
2849                 ciphertext = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *);
2850         else
2851                 ciphertext = plaintext + (tdata->validCipherOffsetInBits.len >> 3);
2852
2853         TEST_HEXDUMP(stdout, "ciphertext:", ciphertext, plaintext_len);
2854
2855         const uint8_t *reference_ciphertext = tdata->ciphertext.data +
2856                                 (tdata->validCipherOffsetInBits.len >> 3);
2857         /* Validate obuf */
2858         TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
2859                 ciphertext,
2860                 reference_ciphertext,
2861                 tdata->validCipherLenInBits.len,
2862                 "KASUMI Ciphertext data not as expected");
2863         return 0;
2864 }
2865
2866 static int
2867 test_kasumi_encryption_sgl(const struct kasumi_test_data *tdata)
2868 {
2869         struct crypto_testsuite_params *ts_params = &testsuite_params;
2870         struct crypto_unittest_params *ut_params = &unittest_params;
2871
2872         int retval;
2873
2874         unsigned int plaintext_pad_len;
2875         unsigned int plaintext_len;
2876
2877         uint8_t buffer[10000];
2878         const uint8_t *ciphertext;
2879
2880         struct rte_cryptodev_info dev_info;
2881
2882         rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
2883         if (!(dev_info.feature_flags & RTE_CRYPTODEV_FF_MBUF_SCATTER_GATHER)) {
2884                 printf("Device doesn't support scatter-gather. "
2885                                 "Test Skipped.\n");
2886                 return 0;
2887         }
2888
2889         /* Create KASUMI session */
2890         retval = create_wireless_algo_cipher_session(ts_params->valid_devs[0],
2891                                         RTE_CRYPTO_CIPHER_OP_ENCRYPT,
2892                                         RTE_CRYPTO_CIPHER_KASUMI_F8,
2893                                         tdata->key.data, tdata->key.len,
2894                                         tdata->cipher_iv.len);
2895         if (retval < 0)
2896                 return retval;
2897
2898         plaintext_len = ceil_byte_length(tdata->plaintext.len);
2899
2900
2901         /* Append data which is padded to a multiple */
2902         /* of the algorithms block size */
2903         plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 8);
2904
2905         ut_params->ibuf = create_segmented_mbuf(ts_params->mbuf_pool,
2906                         plaintext_pad_len, 10, 0);
2907
2908         pktmbuf_write(ut_params->ibuf, 0, plaintext_len, tdata->plaintext.data);
2909
2910         /* Create KASUMI operation */
2911         retval = create_wireless_algo_cipher_operation(tdata->cipher_iv.data,
2912                                 tdata->cipher_iv.len,
2913                                 RTE_ALIGN_CEIL(tdata->validCipherLenInBits.len, 8),
2914                                 tdata->validCipherOffsetInBits.len);
2915         if (retval < 0)
2916                 return retval;
2917
2918         ut_params->op = process_crypto_request(ts_params->valid_devs[0],
2919                                                 ut_params->op);
2920         TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
2921
2922         ut_params->obuf = ut_params->op->sym->m_dst;
2923
2924         if (ut_params->obuf)
2925                 ciphertext = rte_pktmbuf_read(ut_params->obuf, 0,
2926                                 plaintext_len, buffer);
2927         else
2928                 ciphertext = rte_pktmbuf_read(ut_params->ibuf,
2929                                 tdata->validCipherOffsetInBits.len >> 3,
2930                                 plaintext_len, buffer);
2931
2932         /* Validate obuf */
2933         TEST_HEXDUMP(stdout, "ciphertext:", ciphertext, plaintext_len);
2934
2935         const uint8_t *reference_ciphertext = tdata->ciphertext.data +
2936                                 (tdata->validCipherOffsetInBits.len >> 3);
2937         /* Validate obuf */
2938         TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
2939                 ciphertext,
2940                 reference_ciphertext,
2941                 tdata->validCipherLenInBits.len,
2942                 "KASUMI Ciphertext data not as expected");
2943         return 0;
2944 }
2945
2946 static int
2947 test_kasumi_encryption_oop(const struct kasumi_test_data *tdata)
2948 {
2949         struct crypto_testsuite_params *ts_params = &testsuite_params;
2950         struct crypto_unittest_params *ut_params = &unittest_params;
2951
2952         int retval;
2953         uint8_t *plaintext, *ciphertext;
2954         unsigned plaintext_pad_len;
2955         unsigned plaintext_len;
2956
2957         /* Create KASUMI session */
2958         retval = create_wireless_algo_cipher_session(ts_params->valid_devs[0],
2959                                         RTE_CRYPTO_CIPHER_OP_ENCRYPT,
2960                                         RTE_CRYPTO_CIPHER_KASUMI_F8,
2961                                         tdata->key.data, tdata->key.len,
2962                                         tdata->cipher_iv.len);
2963         if (retval < 0)
2964                 return retval;
2965
2966         ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
2967         ut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
2968
2969         /* Clear mbuf payload */
2970         memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
2971                rte_pktmbuf_tailroom(ut_params->ibuf));
2972
2973         plaintext_len = ceil_byte_length(tdata->plaintext.len);
2974         /* Append data which is padded to a multiple */
2975         /* of the algorithms block size */
2976         plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 8);
2977         plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
2978                                 plaintext_pad_len);
2979         rte_pktmbuf_append(ut_params->obuf, plaintext_pad_len);
2980         memcpy(plaintext, tdata->plaintext.data, plaintext_len);
2981
2982         TEST_HEXDUMP(stdout, "plaintext:", plaintext, plaintext_len);
2983
2984         /* Create KASUMI operation */
2985         retval = create_wireless_algo_cipher_operation_oop(tdata->cipher_iv.data,
2986                                 tdata->cipher_iv.len,
2987                                 RTE_ALIGN_CEIL(tdata->validCipherLenInBits.len, 8),
2988                                 tdata->validCipherOffsetInBits.len);
2989         if (retval < 0)
2990                 return retval;
2991
2992         ut_params->op = process_crypto_request(ts_params->valid_devs[0],
2993                                                 ut_params->op);
2994         TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
2995
2996         ut_params->obuf = ut_params->op->sym->m_dst;
2997         if (ut_params->obuf)
2998                 ciphertext = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *);
2999         else
3000                 ciphertext = plaintext + (tdata->validCipherOffsetInBits.len >> 3);
3001
3002         TEST_HEXDUMP(stdout, "ciphertext:", ciphertext, plaintext_len);
3003
3004         const uint8_t *reference_ciphertext = tdata->ciphertext.data +
3005                                 (tdata->validCipherOffsetInBits.len >> 3);
3006         /* Validate obuf */
3007         TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
3008                 ciphertext,
3009                 reference_ciphertext,
3010                 tdata->validCipherLenInBits.len,
3011                 "KASUMI Ciphertext data not as expected");
3012         return 0;
3013 }
3014
3015 static int
3016 test_kasumi_encryption_oop_sgl(const struct kasumi_test_data *tdata)
3017 {
3018         struct crypto_testsuite_params *ts_params = &testsuite_params;
3019         struct crypto_unittest_params *ut_params = &unittest_params;
3020
3021         int retval;
3022         unsigned int plaintext_pad_len;
3023         unsigned int plaintext_len;
3024
3025         const uint8_t *ciphertext;
3026         uint8_t buffer[2048];
3027
3028         struct rte_cryptodev_info dev_info;
3029
3030         rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
3031         if (!(dev_info.feature_flags & RTE_CRYPTODEV_FF_MBUF_SCATTER_GATHER)) {
3032                 printf("Device doesn't support scatter-gather. "
3033                                 "Test Skipped.\n");
3034                 return 0;
3035         }
3036
3037         /* Create KASUMI session */
3038         retval = create_wireless_algo_cipher_session(ts_params->valid_devs[0],
3039                                         RTE_CRYPTO_CIPHER_OP_ENCRYPT,
3040                                         RTE_CRYPTO_CIPHER_KASUMI_F8,
3041                                         tdata->key.data, tdata->key.len,
3042                                         tdata->cipher_iv.len);
3043         if (retval < 0)
3044                 return retval;
3045
3046         plaintext_len = ceil_byte_length(tdata->plaintext.len);
3047         /* Append data which is padded to a multiple */
3048         /* of the algorithms block size */
3049         plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 8);
3050
3051         ut_params->ibuf = create_segmented_mbuf(ts_params->mbuf_pool,
3052                         plaintext_pad_len, 10, 0);
3053         ut_params->obuf = create_segmented_mbuf(ts_params->mbuf_pool,
3054                         plaintext_pad_len, 3, 0);
3055
3056         /* Append data which is padded to a multiple */
3057         /* of the algorithms block size */
3058         pktmbuf_write(ut_params->ibuf, 0, plaintext_len, tdata->plaintext.data);
3059
3060         /* Create KASUMI operation */
3061         retval = create_wireless_algo_cipher_operation_oop(tdata->cipher_iv.data,
3062                                 tdata->cipher_iv.len,
3063                                 RTE_ALIGN_CEIL(tdata->validCipherLenInBits.len, 8),
3064                                 tdata->validCipherOffsetInBits.len);
3065         if (retval < 0)
3066                 return retval;
3067
3068         ut_params->op = process_crypto_request(ts_params->valid_devs[0],
3069                                                 ut_params->op);
3070         TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
3071
3072         ut_params->obuf = ut_params->op->sym->m_dst;
3073         if (ut_params->obuf)
3074                 ciphertext = rte_pktmbuf_read(ut_params->obuf, 0,
3075                                 plaintext_pad_len, buffer);
3076         else
3077                 ciphertext = rte_pktmbuf_read(ut_params->ibuf,
3078                                 tdata->validCipherOffsetInBits.len >> 3,
3079                                 plaintext_pad_len, buffer);
3080
3081         const uint8_t *reference_ciphertext = tdata->ciphertext.data +
3082                                 (tdata->validCipherOffsetInBits.len >> 3);
3083         /* Validate obuf */
3084         TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
3085                 ciphertext,
3086                 reference_ciphertext,
3087                 tdata->validCipherLenInBits.len,
3088                 "KASUMI Ciphertext data not as expected");
3089         return 0;
3090 }
3091
3092
3093 static int
3094 test_kasumi_decryption_oop(const struct kasumi_test_data *tdata)
3095 {
3096         struct crypto_testsuite_params *ts_params = &testsuite_params;
3097         struct crypto_unittest_params *ut_params = &unittest_params;
3098
3099         int retval;
3100         uint8_t *ciphertext, *plaintext;
3101         unsigned ciphertext_pad_len;
3102         unsigned ciphertext_len;
3103
3104         /* Create KASUMI session */
3105         retval = create_wireless_algo_cipher_session(ts_params->valid_devs[0],
3106                                         RTE_CRYPTO_CIPHER_OP_DECRYPT,
3107                                         RTE_CRYPTO_CIPHER_KASUMI_F8,
3108                                         tdata->key.data, tdata->key.len,
3109                                         tdata->cipher_iv.len);
3110         if (retval < 0)
3111                 return retval;
3112
3113         ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
3114         ut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
3115
3116         /* Clear mbuf payload */
3117         memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
3118                rte_pktmbuf_tailroom(ut_params->ibuf));
3119
3120         ciphertext_len = ceil_byte_length(tdata->ciphertext.len);
3121         /* Append data which is padded to a multiple */
3122         /* of the algorithms block size */
3123         ciphertext_pad_len = RTE_ALIGN_CEIL(ciphertext_len, 8);
3124         ciphertext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
3125                                 ciphertext_pad_len);
3126         rte_pktmbuf_append(ut_params->obuf, ciphertext_pad_len);
3127         memcpy(ciphertext, tdata->ciphertext.data, ciphertext_len);
3128
3129         TEST_HEXDUMP(stdout, "ciphertext:", ciphertext, ciphertext_len);
3130
3131         /* Create KASUMI operation */
3132         retval = create_wireless_algo_cipher_operation_oop(tdata->cipher_iv.data,
3133                                 tdata->cipher_iv.len,
3134                                 RTE_ALIGN_CEIL(tdata->validCipherLenInBits.len, 8),
3135                                 tdata->validCipherOffsetInBits.len);
3136         if (retval < 0)
3137                 return retval;
3138
3139         ut_params->op = process_crypto_request(ts_params->valid_devs[0],
3140                                                 ut_params->op);
3141         TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
3142
3143         ut_params->obuf = ut_params->op->sym->m_dst;
3144         if (ut_params->obuf)
3145                 plaintext = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *);
3146         else
3147                 plaintext = ciphertext + (tdata->validCipherOffsetInBits.len >> 3);
3148
3149         TEST_HEXDUMP(stdout, "plaintext:", plaintext, ciphertext_len);
3150
3151         const uint8_t *reference_plaintext = tdata->plaintext.data +
3152                                 (tdata->validCipherOffsetInBits.len >> 3);
3153         /* Validate obuf */
3154         TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
3155                 plaintext,
3156                 reference_plaintext,
3157                 tdata->validCipherLenInBits.len,
3158                 "KASUMI Plaintext data not as expected");
3159         return 0;
3160 }
3161
3162 static int
3163 test_kasumi_decryption(const struct kasumi_test_data *tdata)
3164 {
3165         struct crypto_testsuite_params *ts_params = &testsuite_params;
3166         struct crypto_unittest_params *ut_params = &unittest_params;
3167
3168         int retval;
3169         uint8_t *ciphertext, *plaintext;
3170         unsigned ciphertext_pad_len;
3171         unsigned ciphertext_len;
3172
3173         /* Create KASUMI session */
3174         retval = create_wireless_algo_cipher_session(ts_params->valid_devs[0],
3175                                         RTE_CRYPTO_CIPHER_OP_DECRYPT,
3176                                         RTE_CRYPTO_CIPHER_KASUMI_F8,
3177                                         tdata->key.data, tdata->key.len,
3178                                         tdata->cipher_iv.len);
3179         if (retval < 0)
3180                 return retval;
3181
3182         ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
3183
3184         /* Clear mbuf payload */
3185         memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
3186                rte_pktmbuf_tailroom(ut_params->ibuf));
3187
3188         ciphertext_len = ceil_byte_length(tdata->ciphertext.len);
3189         /* Append data which is padded to a multiple */
3190         /* of the algorithms block size */
3191         ciphertext_pad_len = RTE_ALIGN_CEIL(ciphertext_len, 8);
3192         ciphertext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
3193                                 ciphertext_pad_len);
3194         memcpy(ciphertext, tdata->ciphertext.data, ciphertext_len);
3195
3196         TEST_HEXDUMP(stdout, "ciphertext:", ciphertext, ciphertext_len);
3197
3198         /* Create KASUMI operation */
3199         retval = create_wireless_algo_cipher_operation(tdata->cipher_iv.data,
3200                                         tdata->cipher_iv.len,
3201                                         tdata->ciphertext.len,
3202                                         tdata->validCipherOffsetInBits.len);
3203         if (retval < 0)
3204                 return retval;
3205
3206         ut_params->op = process_crypto_request(ts_params->valid_devs[0],
3207                                                 ut_params->op);
3208         TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
3209
3210         ut_params->obuf = ut_params->op->sym->m_dst;
3211         if (ut_params->obuf)
3212                 plaintext = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *);
3213         else
3214                 plaintext = ciphertext + (tdata->validCipherOffsetInBits.len >> 3);
3215
3216         TEST_HEXDUMP(stdout, "plaintext:", plaintext, ciphertext_len);
3217
3218         const uint8_t *reference_plaintext = tdata->plaintext.data +
3219                                 (tdata->validCipherOffsetInBits.len >> 3);
3220         /* Validate obuf */
3221         TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
3222                 plaintext,
3223                 reference_plaintext,
3224                 tdata->validCipherLenInBits.len,
3225                 "KASUMI Plaintext data not as expected");
3226         return 0;
3227 }
3228
3229 static int
3230 test_snow3g_encryption(const struct snow3g_test_data *tdata)
3231 {
3232         struct crypto_testsuite_params *ts_params = &testsuite_params;
3233         struct crypto_unittest_params *ut_params = &unittest_params;
3234
3235         int retval;
3236         uint8_t *plaintext, *ciphertext;
3237         unsigned plaintext_pad_len;
3238         unsigned plaintext_len;
3239
3240         /* Create SNOW 3G session */
3241         retval = create_wireless_algo_cipher_session(ts_params->valid_devs[0],
3242                                         RTE_CRYPTO_CIPHER_OP_ENCRYPT,
3243                                         RTE_CRYPTO_CIPHER_SNOW3G_UEA2,
3244                                         tdata->key.data, tdata->key.len,
3245                                         tdata->cipher_iv.len);
3246         if (retval < 0)
3247                 return retval;
3248
3249         ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
3250
3251         /* Clear mbuf payload */
3252         memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
3253                rte_pktmbuf_tailroom(ut_params->ibuf));
3254
3255         plaintext_len = ceil_byte_length(tdata->plaintext.len);
3256         /* Append data which is padded to a multiple of */
3257         /* the algorithms block size */
3258         plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16);
3259         plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
3260                                 plaintext_pad_len);
3261         memcpy(plaintext, tdata->plaintext.data, plaintext_len);
3262
3263         TEST_HEXDUMP(stdout, "plaintext:", plaintext, plaintext_len);
3264
3265         /* Create SNOW 3G operation */
3266         retval = create_wireless_algo_cipher_operation(tdata->cipher_iv.data,
3267                                         tdata->cipher_iv.len,
3268                                         tdata->validCipherLenInBits.len,
3269                                         0);
3270         if (retval < 0)
3271                 return retval;
3272
3273         ut_params->op = process_crypto_request(ts_params->valid_devs[0],
3274                                                 ut_params->op);
3275         TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
3276
3277         ut_params->obuf = ut_params->op->sym->m_dst;
3278         if (ut_params->obuf)
3279                 ciphertext = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *);
3280         else
3281                 ciphertext = plaintext;
3282
3283         TEST_HEXDUMP(stdout, "ciphertext:", ciphertext, plaintext_len);
3284
3285         /* Validate obuf */
3286         TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
3287                 ciphertext,
3288                 tdata->ciphertext.data,
3289                 tdata->validDataLenInBits.len,
3290                 "SNOW 3G Ciphertext data not as expected");
3291         return 0;
3292 }
3293
3294
3295 static int
3296 test_snow3g_encryption_oop(const struct snow3g_test_data *tdata)
3297 {
3298         struct crypto_testsuite_params *ts_params = &testsuite_params;
3299         struct crypto_unittest_params *ut_params = &unittest_params;
3300         uint8_t *plaintext, *ciphertext;
3301
3302         int retval;
3303         unsigned plaintext_pad_len;
3304         unsigned plaintext_len;
3305
3306         /* Create SNOW 3G session */
3307         retval = create_wireless_algo_cipher_session(ts_params->valid_devs[0],
3308                                         RTE_CRYPTO_CIPHER_OP_ENCRYPT,
3309                                         RTE_CRYPTO_CIPHER_SNOW3G_UEA2,
3310                                         tdata->key.data, tdata->key.len,
3311                                         tdata->cipher_iv.len);
3312         if (retval < 0)
3313                 return retval;
3314
3315         ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
3316         ut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
3317
3318         TEST_ASSERT_NOT_NULL(ut_params->ibuf,
3319                         "Failed to allocate input buffer in mempool");
3320         TEST_ASSERT_NOT_NULL(ut_params->obuf,
3321                         "Failed to allocate output buffer in mempool");
3322
3323         /* Clear mbuf payload */
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, 16);
3331         plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
3332                                 plaintext_pad_len);
3333         rte_pktmbuf_append(ut_params->obuf, plaintext_pad_len);
3334         memcpy(plaintext, tdata->plaintext.data, plaintext_len);
3335
3336         TEST_HEXDUMP(stdout, "plaintext:", plaintext, plaintext_len);
3337
3338         /* Create SNOW 3G operation */
3339         retval = create_wireless_algo_cipher_operation_oop(tdata->cipher_iv.data,
3340                                         tdata->cipher_iv.len,
3341                                         tdata->validCipherLenInBits.len,
3342                                         0);
3343         if (retval < 0)
3344                 return retval;
3345
3346         ut_params->op = process_crypto_request(ts_params->valid_devs[0],
3347                                                 ut_params->op);
3348         TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
3349
3350         ut_params->obuf = ut_params->op->sym->m_dst;
3351         if (ut_params->obuf)
3352                 ciphertext = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *);
3353         else
3354                 ciphertext = plaintext;
3355
3356         TEST_HEXDUMP(stdout, "ciphertext:", ciphertext, plaintext_len);
3357
3358         /* Validate obuf */
3359         TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
3360                 ciphertext,
3361                 tdata->ciphertext.data,
3362                 tdata->validDataLenInBits.len,
3363                 "SNOW 3G Ciphertext data not as expected");
3364         return 0;
3365 }
3366
3367 static int
3368 test_snow3g_encryption_oop_sgl(const struct snow3g_test_data *tdata)
3369 {
3370         struct crypto_testsuite_params *ts_params = &testsuite_params;
3371         struct crypto_unittest_params *ut_params = &unittest_params;
3372
3373         int retval;
3374         unsigned int plaintext_pad_len;
3375         unsigned int plaintext_len;
3376         uint8_t buffer[10000];
3377         const uint8_t *ciphertext;
3378
3379         struct rte_cryptodev_info dev_info;
3380
3381         rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
3382         if (!(dev_info.feature_flags & RTE_CRYPTODEV_FF_MBUF_SCATTER_GATHER)) {
3383                 printf("Device doesn't support scatter-gather. "
3384                                 "Test Skipped.\n");
3385                 return 0;
3386         }
3387
3388         /* Create SNOW 3G session */
3389         retval = create_wireless_algo_cipher_session(ts_params->valid_devs[0],
3390                                         RTE_CRYPTO_CIPHER_OP_ENCRYPT,
3391                                         RTE_CRYPTO_CIPHER_SNOW3G_UEA2,
3392                                         tdata->key.data, tdata->key.len,
3393                                         tdata->cipher_iv.len);
3394         if (retval < 0)
3395                 return retval;
3396
3397         plaintext_len = ceil_byte_length(tdata->plaintext.len);
3398         /* Append data which is padded to a multiple of */
3399         /* the algorithms block size */
3400         plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16);
3401
3402         ut_params->ibuf = create_segmented_mbuf(ts_params->mbuf_pool,
3403                         plaintext_pad_len, 10, 0);
3404         ut_params->obuf = create_segmented_mbuf(ts_params->mbuf_pool,
3405                         plaintext_pad_len, 3, 0);
3406
3407         TEST_ASSERT_NOT_NULL(ut_params->ibuf,
3408                         "Failed to allocate input buffer in mempool");
3409         TEST_ASSERT_NOT_NULL(ut_params->obuf,
3410                         "Failed to allocate output buffer in mempool");
3411
3412         pktmbuf_write(ut_params->ibuf, 0, plaintext_len, tdata->plaintext.data);
3413
3414         /* Create SNOW 3G operation */
3415         retval = create_wireless_algo_cipher_operation_oop(tdata->cipher_iv.data,
3416                                         tdata->cipher_iv.len,
3417                                         tdata->validCipherLenInBits.len,
3418                                         0);
3419         if (retval < 0)
3420                 return retval;
3421
3422         ut_params->op = process_crypto_request(ts_params->valid_devs[0],
3423                                                 ut_params->op);
3424         TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
3425
3426         ut_params->obuf = ut_params->op->sym->m_dst;
3427         if (ut_params->obuf)
3428                 ciphertext = rte_pktmbuf_read(ut_params->obuf, 0,
3429                                 plaintext_len, buffer);
3430         else
3431                 ciphertext = rte_pktmbuf_read(ut_params->ibuf, 0,
3432                                 plaintext_len, buffer);
3433
3434         TEST_HEXDUMP(stdout, "ciphertext:", ciphertext, plaintext_len);
3435
3436         /* Validate obuf */
3437         TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
3438                 ciphertext,
3439                 tdata->ciphertext.data,
3440                 tdata->validDataLenInBits.len,
3441                 "SNOW 3G Ciphertext data not as expected");
3442
3443         return 0;
3444 }
3445
3446 /* Shift right a buffer by "offset" bits, "offset" < 8 */
3447 static void
3448 buffer_shift_right(uint8_t *buffer, uint32_t length, uint8_t offset)
3449 {
3450         uint8_t curr_byte, prev_byte;
3451         uint32_t length_in_bytes = ceil_byte_length(length + offset);
3452         uint8_t lower_byte_mask = (1 << offset) - 1;
3453         unsigned i;
3454
3455         prev_byte = buffer[0];
3456         buffer[0] >>= offset;
3457
3458         for (i = 1; i < length_in_bytes; i++) {
3459                 curr_byte = buffer[i];
3460                 buffer[i] = ((prev_byte & lower_byte_mask) << (8 - offset)) |
3461                                 (curr_byte >> offset);
3462                 prev_byte = curr_byte;
3463         }
3464 }
3465
3466 static int
3467 test_snow3g_encryption_offset_oop(const struct snow3g_test_data *tdata)
3468 {
3469         struct crypto_testsuite_params *ts_params = &testsuite_params;
3470         struct crypto_unittest_params *ut_params = &unittest_params;
3471         uint8_t *plaintext, *ciphertext;
3472         int retval;
3473         uint32_t plaintext_len;
3474         uint32_t plaintext_pad_len;
3475         uint8_t extra_offset = 4;
3476         uint8_t *expected_ciphertext_shifted;
3477
3478         /* Create SNOW 3G session */
3479         retval = create_wireless_algo_cipher_session(ts_params->valid_devs[0],
3480                                         RTE_CRYPTO_CIPHER_OP_ENCRYPT,
3481                                         RTE_CRYPTO_CIPHER_SNOW3G_UEA2,
3482                                         tdata->key.data, tdata->key.len,
3483                                         tdata->cipher_iv.len);
3484         if (retval < 0)
3485                 return retval;
3486
3487         ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
3488         ut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
3489
3490         TEST_ASSERT_NOT_NULL(ut_params->ibuf,
3491                         "Failed to allocate input buffer in mempool");
3492         TEST_ASSERT_NOT_NULL(ut_params->obuf,
3493                         "Failed to allocate output buffer in mempool");
3494
3495         /* Clear mbuf payload */
3496         memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
3497                rte_pktmbuf_tailroom(ut_params->ibuf));
3498
3499         plaintext_len = ceil_byte_length(tdata->plaintext.len + extra_offset);
3500         /*
3501          * Append data which is padded to a
3502          * multiple of the algorithms block size
3503          */
3504         plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16);
3505
3506         plaintext = (uint8_t *) rte_pktmbuf_append(ut_params->ibuf,
3507                                                 plaintext_pad_len);
3508
3509         rte_pktmbuf_append(ut_params->obuf, plaintext_pad_len);
3510
3511         memcpy(plaintext, tdata->plaintext.data, (tdata->plaintext.len >> 3));
3512         buffer_shift_right(plaintext, tdata->plaintext.len, extra_offset);
3513
3514 #ifdef RTE_APP_TEST_DEBUG
3515         rte_hexdump(stdout, "plaintext:", plaintext, tdata->plaintext.len);
3516 #endif
3517         /* Create SNOW 3G operation */
3518         retval = create_wireless_algo_cipher_operation_oop(tdata->cipher_iv.data,
3519                                         tdata->cipher_iv.len,
3520                                         tdata->validCipherLenInBits.len,
3521                                         extra_offset);
3522         if (retval < 0)
3523                 return retval;
3524
3525         ut_params->op = process_crypto_request(ts_params->valid_devs[0],
3526                                                 ut_params->op);
3527         TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
3528
3529         ut_params->obuf = ut_params->op->sym->m_dst;
3530         if (ut_params->obuf)
3531                 ciphertext = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *);
3532         else
3533                 ciphertext = plaintext;
3534
3535 #ifdef RTE_APP_TEST_DEBUG
3536         rte_hexdump(stdout, "ciphertext:", ciphertext, plaintext_len);
3537 #endif
3538
3539         expected_ciphertext_shifted = rte_malloc(NULL, plaintext_len, 8);
3540
3541         TEST_ASSERT_NOT_NULL(expected_ciphertext_shifted,
3542                         "failed to reserve memory for ciphertext shifted\n");
3543
3544         memcpy(expected_ciphertext_shifted, tdata->ciphertext.data,
3545                         ceil_byte_length(tdata->ciphertext.len));
3546         buffer_shift_right(expected_ciphertext_shifted, tdata->ciphertext.len,
3547                         extra_offset);
3548         /* Validate obuf */
3549         TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT_OFFSET(
3550                 ciphertext,
3551                 expected_ciphertext_shifted,
3552                 tdata->validDataLenInBits.len,
3553                 extra_offset,
3554                 "SNOW 3G Ciphertext data not as expected");
3555         return 0;
3556 }
3557
3558 static int test_snow3g_decryption(const struct snow3g_test_data *tdata)
3559 {
3560         struct crypto_testsuite_params *ts_params = &testsuite_params;
3561         struct crypto_unittest_params *ut_params = &unittest_params;
3562
3563         int retval;
3564
3565         uint8_t *plaintext, *ciphertext;
3566         unsigned ciphertext_pad_len;
3567         unsigned ciphertext_len;
3568
3569         /* Create SNOW 3G session */
3570         retval = create_wireless_algo_cipher_session(ts_params->valid_devs[0],
3571                                         RTE_CRYPTO_CIPHER_OP_DECRYPT,
3572                                         RTE_CRYPTO_CIPHER_SNOW3G_UEA2,
3573                                         tdata->key.data, tdata->key.len,
3574                                         tdata->cipher_iv.len);
3575         if (retval < 0)
3576                 return retval;
3577
3578         ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
3579
3580         /* Clear mbuf payload */
3581         memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
3582                rte_pktmbuf_tailroom(ut_params->ibuf));
3583
3584         ciphertext_len = ceil_byte_length(tdata->ciphertext.len);
3585         /* Append data which is padded to a multiple of */
3586         /* the algorithms block size */
3587         ciphertext_pad_len = RTE_ALIGN_CEIL(ciphertext_len, 16);
3588         ciphertext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
3589                                 ciphertext_pad_len);
3590         memcpy(ciphertext, tdata->ciphertext.data, ciphertext_len);
3591
3592         TEST_HEXDUMP(stdout, "ciphertext:", ciphertext, ciphertext_len);
3593
3594         /* Create SNOW 3G operation */
3595         retval = create_wireless_algo_cipher_operation(tdata->cipher_iv.data,
3596                                         tdata->cipher_iv.len,
3597                                         tdata->validCipherLenInBits.len,
3598                                         0);
3599         if (retval < 0)
3600                 return retval;
3601
3602         ut_params->op = process_crypto_request(ts_params->valid_devs[0],
3603                                                 ut_params->op);
3604         TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
3605         ut_params->obuf = ut_params->op->sym->m_dst;
3606         if (ut_params->obuf)
3607                 plaintext = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *);
3608         else
3609                 plaintext = ciphertext;
3610
3611         TEST_HEXDUMP(stdout, "plaintext:", plaintext, ciphertext_len);
3612
3613         /* Validate obuf */
3614         TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(plaintext,
3615                                 tdata->plaintext.data,
3616                                 tdata->validDataLenInBits.len,
3617                                 "SNOW 3G Plaintext data not as expected");
3618         return 0;
3619 }
3620
3621 static int test_snow3g_decryption_oop(const struct snow3g_test_data *tdata)
3622 {
3623         struct crypto_testsuite_params *ts_params = &testsuite_params;
3624         struct crypto_unittest_params *ut_params = &unittest_params;
3625
3626         int retval;
3627
3628         uint8_t *plaintext, *ciphertext;
3629         unsigned ciphertext_pad_len;
3630         unsigned ciphertext_len;
3631
3632         /* Create SNOW 3G session */
3633         retval = create_wireless_algo_cipher_session(ts_params->valid_devs[0],
3634                                         RTE_CRYPTO_CIPHER_OP_DECRYPT,
3635                                         RTE_CRYPTO_CIPHER_SNOW3G_UEA2,
3636                                         tdata->key.data, tdata->key.len,
3637                                         tdata->cipher_iv.len);
3638         if (retval < 0)
3639                 return retval;
3640
3641         ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
3642         ut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
3643
3644         TEST_ASSERT_NOT_NULL(ut_params->ibuf,
3645                         "Failed to allocate input buffer");
3646         TEST_ASSERT_NOT_NULL(ut_params->obuf,
3647                         "Failed to allocate output buffer");
3648
3649         /* Clear mbuf payload */
3650         memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
3651                rte_pktmbuf_tailroom(ut_params->ibuf));
3652
3653         memset(rte_pktmbuf_mtod(ut_params->obuf, uint8_t *), 0,
3654                        rte_pktmbuf_tailroom(ut_params->obuf));
3655
3656         ciphertext_len = ceil_byte_length(tdata->ciphertext.len);
3657         /* Append data which is padded to a multiple of */
3658         /* the algorithms block size */
3659         ciphertext_pad_len = RTE_ALIGN_CEIL(ciphertext_len, 16);
3660         ciphertext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
3661                                 ciphertext_pad_len);
3662         rte_pktmbuf_append(ut_params->obuf, ciphertext_pad_len);
3663         memcpy(ciphertext, tdata->ciphertext.data, ciphertext_len);
3664
3665         TEST_HEXDUMP(stdout, "ciphertext:", ciphertext, ciphertext_len);
3666
3667         /* Create SNOW 3G operation */
3668         retval = create_wireless_algo_cipher_operation_oop(tdata->cipher_iv.data,
3669                                         tdata->cipher_iv.len,
3670                                         tdata->validCipherLenInBits.len,
3671                                         0);
3672         if (retval < 0)
3673                 return retval;
3674
3675         ut_params->op = process_crypto_request(ts_params->valid_devs[0],
3676                                                 ut_params->op);
3677         TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
3678         ut_params->obuf = ut_params->op->sym->m_dst;
3679         if (ut_params->obuf)
3680                 plaintext = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *);
3681         else
3682                 plaintext = ciphertext;
3683
3684         TEST_HEXDUMP(stdout, "plaintext:", plaintext, ciphertext_len);
3685
3686         /* Validate obuf */
3687         TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(plaintext,
3688                                 tdata->plaintext.data,
3689                                 tdata->validDataLenInBits.len,
3690                                 "SNOW 3G Plaintext data not as expected");
3691         return 0;
3692 }
3693
3694 static int
3695 test_zuc_cipher_auth(const struct wireless_test_data *tdata)
3696 {
3697         struct crypto_testsuite_params *ts_params = &testsuite_params;
3698         struct crypto_unittest_params *ut_params = &unittest_params;
3699
3700         int retval;
3701
3702         uint8_t *plaintext, *ciphertext;
3703         unsigned int plaintext_pad_len;
3704         unsigned int plaintext_len;
3705
3706         struct rte_cryptodev_sym_capability_idx cap_idx;
3707
3708         /* Check if device supports ZUC EEA3 */
3709         cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
3710         cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_ZUC_EEA3;
3711
3712         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
3713                         &cap_idx) == NULL)
3714                 return -ENOTSUP;
3715
3716         /* Check if device supports ZUC EIA3 */
3717         cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
3718         cap_idx.algo.auth = RTE_CRYPTO_AUTH_ZUC_EIA3;
3719
3720         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
3721                         &cap_idx) == NULL)
3722                 return -ENOTSUP;
3723
3724         /* Create ZUC session */
3725         retval = create_zuc_cipher_auth_encrypt_generate_session(
3726                         ts_params->valid_devs[0],
3727                         tdata);
3728         if (retval < 0)
3729                 return retval;
3730         ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
3731
3732         /* clear mbuf payload */
3733         memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
3734                         rte_pktmbuf_tailroom(ut_params->ibuf));
3735
3736         plaintext_len = ceil_byte_length(tdata->plaintext.len);
3737         /* Append data which is padded to a multiple of */
3738         /* the algorithms block size */
3739         plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16);
3740         plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
3741                                 plaintext_pad_len);
3742         memcpy(plaintext, tdata->plaintext.data, plaintext_len);
3743
3744         TEST_HEXDUMP(stdout, "plaintext:", plaintext, plaintext_len);
3745
3746         /* Create ZUC operation */
3747         retval = create_zuc_cipher_hash_generate_operation(tdata);
3748         if (retval < 0)
3749                 return retval;
3750
3751         ut_params->op = process_crypto_request(ts_params->valid_devs[0],
3752                         ut_params->op);
3753         TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
3754         ut_params->obuf = ut_params->op->sym->m_src;
3755         if (ut_params->obuf)
3756                 ciphertext = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *);
3757         else
3758                 ciphertext = plaintext;
3759
3760         TEST_HEXDUMP(stdout, "ciphertext:", ciphertext, plaintext_len);
3761         /* Validate obuf */
3762         TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
3763                         ciphertext,
3764                         tdata->ciphertext.data,
3765                         tdata->validDataLenInBits.len,
3766                         "ZUC Ciphertext data not as expected");
3767
3768         ut_params->digest = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *)
3769             + plaintext_pad_len;
3770
3771         /* Validate obuf */
3772         TEST_ASSERT_BUFFERS_ARE_EQUAL(
3773                         ut_params->digest,
3774                         tdata->digest.data,
3775                         4,
3776                         "ZUC Generated auth tag not as expected");
3777         return 0;
3778 }
3779
3780 static int
3781 test_snow3g_cipher_auth(const struct snow3g_test_data *tdata)
3782 {
3783         struct crypto_testsuite_params *ts_params = &testsuite_params;
3784         struct crypto_unittest_params *ut_params = &unittest_params;
3785
3786         int retval;
3787
3788         uint8_t *plaintext, *ciphertext;
3789         unsigned plaintext_pad_len;
3790         unsigned plaintext_len;
3791
3792         /* Create SNOW 3G session */
3793         retval = create_wireless_algo_cipher_auth_session(ts_params->valid_devs[0],
3794                         RTE_CRYPTO_CIPHER_OP_ENCRYPT,
3795                         RTE_CRYPTO_AUTH_OP_GENERATE,
3796                         RTE_CRYPTO_AUTH_SNOW3G_UIA2,
3797                         RTE_CRYPTO_CIPHER_SNOW3G_UEA2,
3798                         tdata->key.data, tdata->key.len,
3799                         tdata->auth_iv.len, tdata->digest.len,
3800                         tdata->cipher_iv.len);
3801         if (retval < 0)
3802                 return retval;
3803         ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
3804
3805         /* clear mbuf payload */
3806         memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
3807                         rte_pktmbuf_tailroom(ut_params->ibuf));
3808
3809         plaintext_len = ceil_byte_length(tdata->plaintext.len);
3810         /* Append data which is padded to a multiple of */
3811         /* the algorithms block size */
3812         plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16);
3813         plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
3814                                 plaintext_pad_len);
3815         memcpy(plaintext, tdata->plaintext.data, plaintext_len);
3816
3817         TEST_HEXDUMP(stdout, "plaintext:", plaintext, plaintext_len);
3818
3819         /* Create SNOW 3G operation */
3820         retval = create_wireless_algo_cipher_hash_operation(tdata->digest.data,
3821                         tdata->digest.len, tdata->auth_iv.data,
3822                         tdata->auth_iv.len,
3823                         plaintext_pad_len, RTE_CRYPTO_AUTH_OP_GENERATE,
3824                         tdata->cipher_iv.data, tdata->cipher_iv.len,
3825                         tdata->validCipherLenInBits.len,
3826                         0,
3827                         tdata->validAuthLenInBits.len,
3828                         0
3829                         );
3830         if (retval < 0)
3831                 return retval;
3832
3833         ut_params->op = process_crypto_request(ts_params->valid_devs[0],
3834                         ut_params->op);
3835         TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
3836         ut_params->obuf = ut_params->op->sym->m_src;
3837         if (ut_params->obuf)
3838                 ciphertext = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *);
3839         else
3840                 ciphertext = plaintext;
3841
3842         TEST_HEXDUMP(stdout, "ciphertext:", ciphertext, plaintext_len);
3843         /* Validate obuf */
3844         TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
3845                         ciphertext,
3846                         tdata->ciphertext.data,
3847                         tdata->validDataLenInBits.len,
3848                         "SNOW 3G Ciphertext data not as expected");
3849
3850         ut_params->digest = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *)
3851             + plaintext_pad_len;
3852
3853         /* Validate obuf */
3854         TEST_ASSERT_BUFFERS_ARE_EQUAL(
3855                         ut_params->digest,
3856                         tdata->digest.data,
3857                         DIGEST_BYTE_LENGTH_SNOW3G_UIA2,
3858                         "SNOW 3G Generated auth tag not as expected");
3859         return 0;
3860 }
3861 static int
3862 test_snow3g_auth_cipher(const struct snow3g_test_data *tdata)
3863 {
3864         struct crypto_testsuite_params *ts_params = &testsuite_params;
3865         struct crypto_unittest_params *ut_params = &unittest_params;
3866
3867         int retval;
3868
3869         uint8_t *plaintext, *ciphertext;
3870         unsigned plaintext_pad_len;
3871         unsigned plaintext_len;
3872
3873         /* Create SNOW 3G session */
3874         retval = create_wireless_algo_auth_cipher_session(ts_params->valid_devs[0],
3875                         RTE_CRYPTO_CIPHER_OP_ENCRYPT,
3876                         RTE_CRYPTO_AUTH_OP_GENERATE,
3877                         RTE_CRYPTO_AUTH_SNOW3G_UIA2,
3878                         RTE_CRYPTO_CIPHER_SNOW3G_UEA2,
3879                         tdata->key.data, tdata->key.len,
3880                         tdata->auth_iv.len, tdata->digest.len,
3881                         tdata->cipher_iv.len);
3882         if (retval < 0)
3883                 return retval;
3884
3885         ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
3886
3887         /* clear mbuf payload */
3888         memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
3889                         rte_pktmbuf_tailroom(ut_params->ibuf));
3890
3891         plaintext_len = ceil_byte_length(tdata->plaintext.len);
3892         /* Append data which is padded to a multiple of */
3893         /* the algorithms block size */
3894         plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16);
3895         plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
3896                                 plaintext_pad_len);
3897         memcpy(plaintext, tdata->plaintext.data, plaintext_len);
3898
3899         TEST_HEXDUMP(stdout, "plaintext:", plaintext, plaintext_len);
3900
3901         /* Create SNOW 3G operation */
3902         retval = create_wireless_algo_auth_cipher_operation(
3903                 tdata->digest.len,
3904                 tdata->cipher_iv.data, tdata->cipher_iv.len,
3905                 tdata->auth_iv.data, tdata->auth_iv.len,
3906                 plaintext_pad_len,
3907                 tdata->validCipherLenInBits.len,
3908                 0,
3909                 tdata->validAuthLenInBits.len,
3910                 0);
3911
3912         if (retval < 0)
3913                 return retval;
3914
3915         ut_params->op = process_crypto_request(ts_params->valid_devs[0],
3916                         ut_params->op);
3917         TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
3918         ut_params->obuf = ut_params->op->sym->m_src;
3919         if (ut_params->obuf)
3920                 ciphertext = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *);
3921         else
3922                 ciphertext = plaintext;
3923
3924         ut_params->digest = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *)
3925                         + plaintext_pad_len;
3926         TEST_HEXDUMP(stdout, "ciphertext:", ciphertext, plaintext_len);
3927
3928         /* Validate obuf */
3929         TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
3930                 ciphertext,
3931                 tdata->ciphertext.data,
3932                 tdata->validDataLenInBits.len,
3933                 "SNOW 3G Ciphertext data not as expected");
3934
3935         /* Validate obuf */
3936         TEST_ASSERT_BUFFERS_ARE_EQUAL(
3937                 ut_params->digest,
3938                 tdata->digest.data,
3939                 DIGEST_BYTE_LENGTH_SNOW3G_UIA2,
3940                 "SNOW 3G Generated auth tag not as expected");
3941         return 0;
3942 }
3943
3944 static int
3945 test_kasumi_auth_cipher(const struct kasumi_test_data *tdata)
3946 {
3947         struct crypto_testsuite_params *ts_params = &testsuite_params;
3948         struct crypto_unittest_params *ut_params = &unittest_params;
3949
3950         int retval;
3951
3952         uint8_t *plaintext, *ciphertext;
3953         unsigned plaintext_pad_len;
3954         unsigned plaintext_len;
3955
3956         /* Create KASUMI session */
3957         retval = create_wireless_algo_auth_cipher_session(
3958                         ts_params->valid_devs[0],
3959                         RTE_CRYPTO_CIPHER_OP_ENCRYPT,
3960                         RTE_CRYPTO_AUTH_OP_GENERATE,
3961                         RTE_CRYPTO_AUTH_KASUMI_F9,
3962                         RTE_CRYPTO_CIPHER_KASUMI_F8,
3963                         tdata->key.data, tdata->key.len,
3964                         0, tdata->digest.len,
3965                         tdata->cipher_iv.len);
3966         if (retval < 0)
3967                 return retval;
3968         ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
3969
3970         /* clear mbuf payload */
3971         memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
3972                         rte_pktmbuf_tailroom(ut_params->ibuf));
3973
3974         plaintext_len = ceil_byte_length(tdata->plaintext.len);
3975         /* Append data which is padded to a multiple of */
3976         /* the algorithms block size */
3977         plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16);
3978         plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
3979                                 plaintext_pad_len);
3980         memcpy(plaintext, tdata->plaintext.data, plaintext_len);
3981
3982         TEST_HEXDUMP(stdout, "plaintext:", plaintext, plaintext_len);
3983
3984         /* Create KASUMI operation */
3985         retval = create_wireless_algo_auth_cipher_operation(tdata->digest.len,
3986                                 tdata->cipher_iv.data, tdata->cipher_iv.len,
3987                                 NULL, 0,
3988                                 plaintext_pad_len,
3989                                 tdata->validCipherLenInBits.len,
3990                                 tdata->validCipherOffsetInBits.len,
3991                                 tdata->validAuthLenInBits.len,
3992                                 0
3993                                 );
3994
3995         if (retval < 0)
3996                 return retval;
3997
3998         ut_params->op = process_crypto_request(ts_params->valid_devs[0],
3999                         ut_params->op);
4000         TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
4001         if (ut_params->op->sym->m_dst)
4002                 ut_params->obuf = ut_params->op->sym->m_dst;
4003         else
4004                 ut_params->obuf = ut_params->op->sym->m_src;
4005
4006         ciphertext = rte_pktmbuf_mtod_offset(ut_params->obuf, uint8_t *,
4007                                 tdata->validCipherOffsetInBits.len >> 3);
4008
4009         const uint8_t *reference_ciphertext = tdata->ciphertext.data +
4010                                 (tdata->validCipherOffsetInBits.len >> 3);
4011         /* Validate obuf */
4012         TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
4013                         ciphertext,
4014                         reference_ciphertext,
4015                         tdata->validCipherLenInBits.len,
4016                         "KASUMI Ciphertext data not as expected");
4017         ut_params->digest = rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *)
4018             + plaintext_pad_len;
4019
4020         /* Validate obuf */
4021         TEST_ASSERT_BUFFERS_ARE_EQUAL(
4022                         ut_params->digest,
4023                         tdata->digest.data,
4024                         DIGEST_BYTE_LENGTH_KASUMI_F9,
4025                         "KASUMI Generated auth tag not as expected");
4026         return 0;
4027 }
4028
4029 static int
4030 test_kasumi_cipher_auth(const struct kasumi_test_data *tdata)
4031 {
4032         struct crypto_testsuite_params *ts_params = &testsuite_params;
4033         struct crypto_unittest_params *ut_params = &unittest_params;
4034
4035         int retval;
4036
4037         uint8_t *plaintext, *ciphertext;
4038         unsigned plaintext_pad_len;
4039         unsigned plaintext_len;
4040
4041         /* Create KASUMI session */
4042         retval = create_wireless_algo_cipher_auth_session(
4043                         ts_params->valid_devs[0],
4044                         RTE_CRYPTO_CIPHER_OP_ENCRYPT,
4045                         RTE_CRYPTO_AUTH_OP_GENERATE,
4046                         RTE_CRYPTO_AUTH_KASUMI_F9,
4047                         RTE_CRYPTO_CIPHER_KASUMI_F8,
4048                         tdata->key.data, tdata->key.len,
4049                         0, tdata->digest.len,
4050                         tdata->cipher_iv.len);
4051         if (retval < 0)
4052                 return retval;
4053
4054         ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
4055
4056         /* clear mbuf payload */
4057         memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
4058                         rte_pktmbuf_tailroom(ut_params->ibuf));
4059
4060         plaintext_len = ceil_byte_length(tdata->plaintext.len);
4061         /* Append data which is padded to a multiple of */
4062         /* the algorithms block size */
4063         plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16);
4064         plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
4065                                 plaintext_pad_len);
4066         memcpy(plaintext, tdata->plaintext.data, plaintext_len);
4067
4068         TEST_HEXDUMP(stdout, "plaintext:", plaintext, plaintext_len);
4069
4070         /* Create KASUMI operation */
4071         retval = create_wireless_algo_cipher_hash_operation(tdata->digest.data,
4072                                 tdata->digest.len, NULL, 0,
4073                                 plaintext_pad_len, RTE_CRYPTO_AUTH_OP_GENERATE,
4074                                 tdata->cipher_iv.data, tdata->cipher_iv.len,
4075                                 RTE_ALIGN_CEIL(tdata->validCipherLenInBits.len, 8),
4076                                 tdata->validCipherOffsetInBits.len,
4077                                 tdata->validAuthLenInBits.len,
4078                                 0
4079                                 );
4080         if (retval < 0)
4081                 return retval;
4082
4083         ut_params->op = process_crypto_request(ts_params->valid_devs[0],
4084                         ut_params->op);
4085         TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
4086
4087         if (ut_params->op->sym->m_dst)
4088                 ut_params->obuf = ut_params->op->sym->m_dst;
4089         else
4090                 ut_params->obuf = ut_params->op->sym->m_src;
4091
4092         ciphertext = rte_pktmbuf_mtod_offset(ut_params->obuf, uint8_t *,
4093                                 tdata->validCipherOffsetInBits.len >> 3);
4094
4095         ut_params->digest = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *)
4096                         + plaintext_pad_len;
4097
4098         const uint8_t *reference_ciphertext = tdata->ciphertext.data +
4099                                 (tdata->validCipherOffsetInBits.len >> 3);
4100         /* Validate obuf */
4101         TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
4102                 ciphertext,
4103                 reference_ciphertext,
4104                 tdata->validCipherLenInBits.len,
4105                 "KASUMI Ciphertext data not as expected");
4106
4107         /* Validate obuf */
4108         TEST_ASSERT_BUFFERS_ARE_EQUAL(
4109                 ut_params->digest,
4110                 tdata->digest.data,
4111                 DIGEST_BYTE_LENGTH_SNOW3G_UIA2,
4112                 "KASUMI Generated auth tag not as expected");
4113         return 0;
4114 }
4115
4116 static int
4117 test_zuc_encryption(const struct wireless_test_data *tdata)
4118 {
4119         struct crypto_testsuite_params *ts_params = &testsuite_params;
4120         struct crypto_unittest_params *ut_params = &unittest_params;
4121
4122         int retval;
4123         uint8_t *plaintext, *ciphertext;
4124         unsigned plaintext_pad_len;
4125         unsigned plaintext_len;
4126
4127         struct rte_cryptodev_sym_capability_idx cap_idx;
4128
4129         /* Check if device supports ZUC EEA3 */
4130         cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
4131         cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_ZUC_EEA3;
4132
4133         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
4134                         &cap_idx) == NULL)
4135                 return -ENOTSUP;
4136
4137         /* Create ZUC session */
4138         retval = create_wireless_algo_cipher_session(ts_params->valid_devs[0],
4139                                         RTE_CRYPTO_CIPHER_OP_ENCRYPT,
4140                                         RTE_CRYPTO_CIPHER_ZUC_EEA3,
4141                                         tdata->key.data, tdata->key.len,
4142                                         tdata->cipher_iv.len);
4143         if (retval < 0)
4144                 return retval;
4145
4146         ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
4147
4148         /* Clear mbuf payload */
4149         memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
4150                rte_pktmbuf_tailroom(ut_params->ibuf));
4151
4152         plaintext_len = ceil_byte_length(tdata->plaintext.len);
4153         /* Append data which is padded to a multiple */
4154         /* of the algorithms block size */
4155         plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 8);
4156         plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
4157                                 plaintext_pad_len);
4158         memcpy(plaintext, tdata->plaintext.data, plaintext_len);
4159
4160         TEST_HEXDUMP(stdout, "plaintext:", plaintext, plaintext_len);
4161
4162         /* Create ZUC operation */
4163         retval = create_wireless_algo_cipher_operation(tdata->cipher_iv.data,
4164                                         tdata->cipher_iv.len,
4165                                         tdata->plaintext.len,
4166                                         0);
4167         if (retval < 0)
4168                 return retval;
4169
4170         ut_params->op = process_crypto_request(ts_params->valid_devs[0],
4171                                                 ut_params->op);
4172         TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
4173
4174         ut_params->obuf = ut_params->op->sym->m_dst;
4175         if (ut_params->obuf)
4176                 ciphertext = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *);
4177         else
4178                 ciphertext = plaintext;
4179
4180         TEST_HEXDUMP(stdout, "ciphertext:", ciphertext, plaintext_len);
4181
4182         /* Validate obuf */
4183         TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
4184                 ciphertext,
4185                 tdata->ciphertext.data,
4186                 tdata->validCipherLenInBits.len,
4187                 "ZUC Ciphertext data not as expected");
4188         return 0;
4189 }
4190
4191 static int
4192 test_zuc_encryption_sgl(const struct wireless_test_data *tdata)
4193 {
4194         struct crypto_testsuite_params *ts_params = &testsuite_params;
4195         struct crypto_unittest_params *ut_params = &unittest_params;
4196
4197         int retval;
4198
4199         unsigned int plaintext_pad_len;
4200         unsigned int plaintext_len;
4201         const uint8_t *ciphertext;
4202         uint8_t ciphertext_buffer[2048];
4203         struct rte_cryptodev_info dev_info;
4204
4205         struct rte_cryptodev_sym_capability_idx cap_idx;
4206
4207         /* Check if device supports ZUC EEA3 */
4208         cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
4209         cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_ZUC_EEA3;
4210
4211         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
4212                         &cap_idx) == NULL)
4213                 return -ENOTSUP;
4214
4215         rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
4216         if (!(dev_info.feature_flags & RTE_CRYPTODEV_FF_MBUF_SCATTER_GATHER)) {
4217                 printf("Device doesn't support scatter-gather. "
4218                                 "Test Skipped.\n");
4219                 return -ENOTSUP;
4220         }
4221
4222         plaintext_len = ceil_byte_length(tdata->plaintext.len);
4223
4224         /* Append data which is padded to a multiple */
4225         /* of the algorithms block size */
4226         plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 8);
4227
4228         ut_params->ibuf = create_segmented_mbuf(ts_params->mbuf_pool,
4229                         plaintext_pad_len, 10, 0);
4230
4231         pktmbuf_write(ut_params->ibuf, 0, plaintext_len,
4232                         tdata->plaintext.data);
4233
4234         /* Create ZUC session */
4235         retval = create_wireless_algo_cipher_session(ts_params->valid_devs[0],
4236                         RTE_CRYPTO_CIPHER_OP_ENCRYPT,
4237                         RTE_CRYPTO_CIPHER_ZUC_EEA3,
4238                         tdata->key.data, tdata->key.len,
4239                         tdata->cipher_iv.len);
4240         if (retval < 0)
4241                 return retval;
4242
4243         /* Clear mbuf payload */
4244
4245         pktmbuf_write(ut_params->ibuf, 0, plaintext_len, tdata->plaintext.data);
4246
4247         /* Create ZUC operation */
4248         retval = create_wireless_algo_cipher_operation(tdata->cipher_iv.data,
4249                         tdata->cipher_iv.len, tdata->plaintext.len,
4250                         0);
4251         if (retval < 0)
4252                 return retval;
4253
4254         ut_params->op = process_crypto_request(ts_params->valid_devs[0],
4255                                                 ut_params->op);
4256         TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
4257
4258         ut_params->obuf = ut_params->op->sym->m_dst;
4259         if (ut_params->obuf)
4260                 ciphertext = rte_pktmbuf_read(ut_params->obuf,
4261                         0, plaintext_len, ciphertext_buffer);
4262         else
4263                 ciphertext = rte_pktmbuf_read(ut_params->ibuf,
4264                         0, plaintext_len, ciphertext_buffer);
4265
4266         /* Validate obuf */
4267         TEST_HEXDUMP(stdout, "ciphertext:", ciphertext, plaintext_len);
4268
4269         /* Validate obuf */
4270         TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
4271                 ciphertext,
4272                 tdata->ciphertext.data,
4273                 tdata->validCipherLenInBits.len,
4274                 "ZUC Ciphertext data not as expected");
4275
4276         return 0;
4277 }
4278
4279 static int
4280 test_zuc_authentication(const struct wireless_test_data *tdata)
4281 {
4282         struct crypto_testsuite_params *ts_params = &testsuite_params;
4283         struct crypto_unittest_params *ut_params = &unittest_params;
4284
4285         int retval;
4286         unsigned plaintext_pad_len;
4287         unsigned plaintext_len;
4288         uint8_t *plaintext;
4289
4290         struct rte_cryptodev_sym_capability_idx cap_idx;
4291
4292         /* Check if device supports ZUC EIA3 */
4293         cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
4294         cap_idx.algo.auth = RTE_CRYPTO_AUTH_ZUC_EIA3;
4295
4296         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
4297                         &cap_idx) == NULL)
4298                 return -ENOTSUP;
4299
4300         /* Create ZUC session */
4301         retval = create_wireless_algo_hash_session(ts_params->valid_devs[0],
4302                         tdata->key.data, tdata->key.len,
4303                         tdata->auth_iv.len, tdata->digest.len,
4304                         RTE_CRYPTO_AUTH_OP_GENERATE,
4305                         RTE_CRYPTO_AUTH_ZUC_EIA3);
4306         if (retval < 0)
4307                 return retval;
4308
4309         /* alloc mbuf and set payload */
4310         ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
4311
4312         memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
4313         rte_pktmbuf_tailroom(ut_params->ibuf));
4314
4315         plaintext_len = ceil_byte_length(tdata->plaintext.len);
4316         /* Append data which is padded to a multiple of */
4317         /* the algorithms block size */
4318         plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 8);
4319         plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
4320                                 plaintext_pad_len);
4321         memcpy(plaintext, tdata->plaintext.data, plaintext_len);
4322
4323         /* Create ZUC operation */
4324         retval = create_wireless_algo_hash_operation(NULL, tdata->digest.len,
4325                         tdata->auth_iv.data, tdata->auth_iv.len,
4326                         plaintext_pad_len, RTE_CRYPTO_AUTH_OP_GENERATE,
4327                         tdata->validAuthLenInBits.len,
4328                         0);
4329         if (retval < 0)
4330                 return retval;
4331
4332         ut_params->op = process_crypto_request(ts_params->valid_devs[0],
4333                                 ut_params->op);
4334         ut_params->obuf = ut_params->op->sym->m_src;
4335         TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
4336         ut_params->digest = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *)
4337                         + plaintext_pad_len;
4338
4339         /* Validate obuf */
4340         TEST_ASSERT_BUFFERS_ARE_EQUAL(
4341         ut_params->digest,
4342         tdata->digest.data,
4343         DIGEST_BYTE_LENGTH_KASUMI_F9,
4344         "ZUC Generated auth tag not as expected");
4345
4346         return 0;
4347 }
4348
4349 static int
4350 test_kasumi_encryption_test_case_1(void)
4351 {
4352         return test_kasumi_encryption(&kasumi_test_case_1);
4353 }
4354
4355 static int
4356 test_kasumi_encryption_test_case_1_sgl(void)
4357 {
4358         return test_kasumi_encryption_sgl(&kasumi_test_case_1);
4359 }
4360
4361 static int
4362 test_kasumi_encryption_test_case_1_oop(void)
4363 {
4364         return test_kasumi_encryption_oop(&kasumi_test_case_1);
4365 }
4366
4367 static int
4368 test_kasumi_encryption_test_case_1_oop_sgl(void)
4369 {
4370         return test_kasumi_encryption_oop_sgl(&kasumi_test_case_1);
4371 }
4372
4373 static int
4374 test_kasumi_encryption_test_case_2(void)
4375 {
4376         return test_kasumi_encryption(&kasumi_test_case_2);
4377 }
4378
4379 static int
4380 test_kasumi_encryption_test_case_3(void)
4381 {
4382         return test_kasumi_encryption(&kasumi_test_case_3);
4383 }
4384
4385 static int
4386 test_kasumi_encryption_test_case_4(void)
4387 {
4388         return test_kasumi_encryption(&kasumi_test_case_4);
4389 }
4390
4391 static int
4392 test_kasumi_encryption_test_case_5(void)
4393 {
4394         return test_kasumi_encryption(&kasumi_test_case_5);
4395 }
4396
4397 static int
4398 test_kasumi_decryption_test_case_1(void)
4399 {
4400         return test_kasumi_decryption(&kasumi_test_case_1);
4401 }
4402
4403 static int
4404 test_kasumi_decryption_test_case_1_oop(void)
4405 {
4406         return test_kasumi_decryption_oop(&kasumi_test_case_1);
4407 }
4408
4409 static int
4410 test_kasumi_decryption_test_case_2(void)
4411 {
4412         return test_kasumi_decryption(&kasumi_test_case_2);
4413 }
4414
4415 static int
4416 test_kasumi_decryption_test_case_3(void)
4417 {
4418         return test_kasumi_decryption(&kasumi_test_case_3);
4419 }
4420
4421 static int
4422 test_kasumi_decryption_test_case_4(void)
4423 {
4424         return test_kasumi_decryption(&kasumi_test_case_4);
4425 }
4426
4427 static int
4428 test_kasumi_decryption_test_case_5(void)
4429 {
4430         return test_kasumi_decryption(&kasumi_test_case_5);
4431 }
4432 static int
4433 test_snow3g_encryption_test_case_1(void)
4434 {
4435         return test_snow3g_encryption(&snow3g_test_case_1);
4436 }
4437
4438 static int
4439 test_snow3g_encryption_test_case_1_oop(void)
4440 {
4441         return test_snow3g_encryption_oop(&snow3g_test_case_1);
4442 }
4443
4444 static int
4445 test_snow3g_encryption_test_case_1_oop_sgl(void)
4446 {
4447         return test_snow3g_encryption_oop_sgl(&snow3g_test_case_1);
4448 }
4449
4450
4451 static int
4452 test_snow3g_encryption_test_case_1_offset_oop(void)
4453 {
4454         return test_snow3g_encryption_offset_oop(&snow3g_test_case_1);
4455 }
4456
4457 static int
4458 test_snow3g_encryption_test_case_2(void)
4459 {
4460         return test_snow3g_encryption(&snow3g_test_case_2);
4461 }
4462
4463 static int
4464 test_snow3g_encryption_test_case_3(void)
4465 {
4466         return test_snow3g_encryption(&snow3g_test_case_3);
4467 }
4468
4469 static int
4470 test_snow3g_encryption_test_case_4(void)
4471 {
4472         return test_snow3g_encryption(&snow3g_test_case_4);
4473 }
4474
4475 static int
4476 test_snow3g_encryption_test_case_5(void)
4477 {
4478         return test_snow3g_encryption(&snow3g_test_case_5);
4479 }
4480
4481 static int
4482 test_snow3g_decryption_test_case_1(void)
4483 {
4484         return test_snow3g_decryption(&snow3g_test_case_1);
4485 }
4486
4487 static int
4488 test_snow3g_decryption_test_case_1_oop(void)
4489 {
4490         return test_snow3g_decryption_oop(&snow3g_test_case_1);
4491 }
4492
4493 static int
4494 test_snow3g_decryption_test_case_2(void)
4495 {
4496         return test_snow3g_decryption(&snow3g_test_case_2);
4497 }
4498
4499 static int
4500 test_snow3g_decryption_test_case_3(void)
4501 {
4502         return test_snow3g_decryption(&snow3g_test_case_3);
4503 }
4504
4505 static int
4506 test_snow3g_decryption_test_case_4(void)
4507 {
4508         return test_snow3g_decryption(&snow3g_test_case_4);
4509 }
4510
4511 static int
4512 test_snow3g_decryption_test_case_5(void)
4513 {
4514         return test_snow3g_decryption(&snow3g_test_case_5);
4515 }
4516 static int
4517 test_snow3g_cipher_auth_test_case_1(void)
4518 {
4519         return test_snow3g_cipher_auth(&snow3g_test_case_3);
4520 }
4521
4522 static int
4523 test_snow3g_auth_cipher_test_case_1(void)
4524 {
4525         return test_snow3g_auth_cipher(&snow3g_test_case_6);
4526 }
4527
4528 static int
4529 test_kasumi_auth_cipher_test_case_1(void)
4530 {
4531         return test_kasumi_auth_cipher(&kasumi_test_case_3);
4532 }
4533
4534 static int
4535 test_kasumi_cipher_auth_test_case_1(void)
4536 {
4537         return test_kasumi_cipher_auth(&kasumi_test_case_6);
4538 }
4539
4540 static int
4541 test_zuc_encryption_test_case_1(void)
4542 {
4543         return test_zuc_encryption(&zuc_test_case_cipher_193b);
4544 }
4545
4546 static int
4547 test_zuc_encryption_test_case_2(void)
4548 {
4549         return test_zuc_encryption(&zuc_test_case_cipher_800b);
4550 }
4551
4552 static int
4553 test_zuc_encryption_test_case_3(void)
4554 {
4555         return test_zuc_encryption(&zuc_test_case_cipher_1570b);
4556 }
4557
4558 static int
4559 test_zuc_encryption_test_case_4(void)
4560 {
4561         return test_zuc_encryption(&zuc_test_case_cipher_2798b);
4562 }
4563
4564 static int
4565 test_zuc_encryption_test_case_5(void)
4566 {
4567         return test_zuc_encryption(&zuc_test_case_cipher_4019b);
4568 }
4569
4570 static int
4571 test_zuc_encryption_test_case_6_sgl(void)
4572 {
4573         return test_zuc_encryption_sgl(&zuc_test_case_cipher_193b);
4574 }
4575
4576 static int
4577 test_zuc_hash_generate_test_case_1(void)
4578 {
4579         return test_zuc_authentication(&zuc_test_case_auth_1b);
4580 }
4581
4582 static int
4583 test_zuc_hash_generate_test_case_2(void)
4584 {
4585         return test_zuc_authentication(&zuc_test_case_auth_90b);
4586 }
4587
4588 static int
4589 test_zuc_hash_generate_test_case_3(void)
4590 {
4591         return test_zuc_authentication(&zuc_test_case_auth_577b);
4592 }
4593
4594 static int
4595 test_zuc_hash_generate_test_case_4(void)
4596 {
4597         return test_zuc_authentication(&zuc_test_case_auth_2079b);
4598 }
4599
4600 static int
4601 test_zuc_hash_generate_test_case_5(void)
4602 {
4603         return test_zuc_authentication(&zuc_test_auth_5670b);
4604 }
4605
4606 static int
4607 test_zuc_hash_generate_test_case_6(void)
4608 {
4609         return test_zuc_authentication(&zuc_test_case_auth_128b);
4610 }
4611
4612 static int
4613 test_zuc_hash_generate_test_case_7(void)
4614 {
4615         return test_zuc_authentication(&zuc_test_case_auth_2080b);
4616 }
4617
4618 static int
4619 test_zuc_hash_generate_test_case_8(void)
4620 {
4621         return test_zuc_authentication(&zuc_test_case_auth_584b);
4622 }
4623
4624 static int
4625 test_zuc_cipher_auth_test_case_1(void)
4626 {
4627         return test_zuc_cipher_auth(&zuc_test_case_cipher_200b_auth_200b);
4628 }
4629
4630 static int
4631 test_zuc_cipher_auth_test_case_2(void)
4632 {
4633         return test_zuc_cipher_auth(&zuc_test_case_cipher_800b_auth_120b);
4634 }
4635
4636 static int
4637 test_3DES_chain_qat_all(void)
4638 {
4639         struct crypto_testsuite_params *ts_params = &testsuite_params;
4640         int status;
4641
4642         status = test_blockcipher_all_tests(ts_params->mbuf_pool,
4643                 ts_params->op_mpool,
4644                 ts_params->session_mpool,
4645                 ts_params->valid_devs[0],
4646                 rte_cryptodev_driver_id_get(
4647                 RTE_STR(CRYPTODEV_NAME_QAT_SYM_PMD)),
4648                 BLKCIPHER_3DES_CHAIN_TYPE);
4649
4650         TEST_ASSERT_EQUAL(status, 0, "Test failed");
4651
4652         return TEST_SUCCESS;
4653 }
4654
4655 static int
4656 test_DES_cipheronly_qat_all(void)
4657 {
4658         struct crypto_testsuite_params *ts_params = &testsuite_params;
4659         int status;
4660
4661         status = test_blockcipher_all_tests(ts_params->mbuf_pool,
4662                 ts_params->op_mpool,
4663                 ts_params->session_mpool,
4664                 ts_params->valid_devs[0],
4665                 rte_cryptodev_driver_id_get(
4666                 RTE_STR(CRYPTODEV_NAME_QAT_SYM_PMD)),
4667                 BLKCIPHER_DES_CIPHERONLY_TYPE);
4668
4669         TEST_ASSERT_EQUAL(status, 0, "Test failed");
4670
4671         return TEST_SUCCESS;
4672 }
4673
4674 static int
4675 test_DES_docsis_openssl_all(void)
4676 {
4677         struct crypto_testsuite_params *ts_params = &testsuite_params;
4678         int status;
4679
4680         status = test_blockcipher_all_tests(ts_params->mbuf_pool,
4681                 ts_params->op_mpool,
4682                 ts_params->session_mpool,
4683                 ts_params->valid_devs[0],
4684                 rte_cryptodev_driver_id_get(
4685                 RTE_STR(CRYPTODEV_NAME_OPENSSL_PMD)),
4686                 BLKCIPHER_DES_DOCSIS_TYPE);
4687
4688         TEST_ASSERT_EQUAL(status, 0, "Test failed");
4689
4690         return TEST_SUCCESS;
4691 }
4692
4693 static int
4694 test_3DES_chain_dpaa2_sec_all(void)
4695 {
4696         struct crypto_testsuite_params *ts_params = &testsuite_params;
4697         int status;
4698
4699         status = test_blockcipher_all_tests(ts_params->mbuf_pool,
4700                 ts_params->op_mpool,
4701                 ts_params->session_mpool,
4702                 ts_params->valid_devs[0],
4703                 rte_cryptodev_driver_id_get(
4704                 RTE_STR(CRYPTODEV_NAME_DPAA2_SEC_PMD)),
4705                 BLKCIPHER_3DES_CHAIN_TYPE);
4706
4707         TEST_ASSERT_EQUAL(status, 0, "Test failed");
4708
4709         return TEST_SUCCESS;
4710 }
4711
4712 static int
4713 test_3DES_cipheronly_dpaa2_sec_all(void)
4714 {
4715         struct crypto_testsuite_params *ts_params = &testsuite_params;
4716         int status;
4717
4718         status = test_blockcipher_all_tests(ts_params->mbuf_pool,
4719                 ts_params->op_mpool,
4720                 ts_params->session_mpool,
4721                 ts_params->valid_devs[0],
4722                 rte_cryptodev_driver_id_get(
4723                 RTE_STR(CRYPTODEV_NAME_DPAA2_SEC_PMD)),
4724                 BLKCIPHER_3DES_CIPHERONLY_TYPE);
4725
4726         TEST_ASSERT_EQUAL(status, 0, "Test failed");
4727
4728         return TEST_SUCCESS;
4729 }
4730
4731 static int
4732 test_3DES_cipheronly_qat_all(void)
4733 {
4734         struct crypto_testsuite_params *ts_params = &testsuite_params;
4735         int status;
4736
4737         status = test_blockcipher_all_tests(ts_params->mbuf_pool,
4738                 ts_params->op_mpool,
4739                 ts_params->session_mpool,
4740                 ts_params->valid_devs[0],
4741                 rte_cryptodev_driver_id_get(
4742                 RTE_STR(CRYPTODEV_NAME_QAT_SYM_PMD)),
4743                 BLKCIPHER_3DES_CIPHERONLY_TYPE);
4744
4745         TEST_ASSERT_EQUAL(status, 0, "Test failed");
4746
4747         return TEST_SUCCESS;
4748 }
4749
4750 static int
4751 test_3DES_chain_openssl_all(void)
4752 {
4753         struct crypto_testsuite_params *ts_params = &testsuite_params;
4754         int status;
4755
4756         status = test_blockcipher_all_tests(ts_params->mbuf_pool,
4757                 ts_params->op_mpool,
4758                 ts_params->session_mpool,
4759                 ts_params->valid_devs[0],
4760                 rte_cryptodev_driver_id_get(
4761                 RTE_STR(CRYPTODEV_NAME_OPENSSL_PMD)),
4762                 BLKCIPHER_3DES_CHAIN_TYPE);
4763
4764         TEST_ASSERT_EQUAL(status, 0, "Test failed");
4765
4766         return TEST_SUCCESS;
4767 }
4768
4769 static int
4770 test_3DES_cipheronly_openssl_all(void)
4771 {
4772         struct crypto_testsuite_params *ts_params = &testsuite_params;
4773         int status;
4774
4775         status = test_blockcipher_all_tests(ts_params->mbuf_pool,
4776                 ts_params->op_mpool,
4777                 ts_params->session_mpool,
4778                 ts_params->valid_devs[0],
4779                 rte_cryptodev_driver_id_get(
4780                 RTE_STR(CRYPTODEV_NAME_OPENSSL_PMD)),
4781                 BLKCIPHER_3DES_CIPHERONLY_TYPE);
4782
4783         TEST_ASSERT_EQUAL(status, 0, "Test failed");
4784
4785         return TEST_SUCCESS;
4786 }
4787
4788 /* ***** AES-GCM Tests ***** */
4789
4790 static int
4791 create_gcm_session(uint8_t dev_id, enum rte_crypto_aead_operation op,
4792                 const uint8_t *key, const uint8_t key_len,
4793                 const uint16_t aad_len, const uint8_t auth_len,
4794                 uint8_t iv_len)
4795 {
4796         uint8_t aead_key[key_len];
4797
4798         struct crypto_testsuite_params *ts_params = &testsuite_params;
4799         struct crypto_unittest_params *ut_params = &unittest_params;
4800
4801         memcpy(aead_key, key, key_len);
4802
4803         /* Setup AEAD Parameters */
4804         ut_params->aead_xform.type = RTE_CRYPTO_SYM_XFORM_AEAD;
4805         ut_params->aead_xform.next = NULL;
4806         ut_params->aead_xform.aead.algo = RTE_CRYPTO_AEAD_AES_GCM;
4807         ut_params->aead_xform.aead.op = op;
4808         ut_params->aead_xform.aead.key.data = aead_key;
4809         ut_params->aead_xform.aead.key.length = key_len;
4810         ut_params->aead_xform.aead.iv.offset = IV_OFFSET;
4811         ut_params->aead_xform.aead.iv.length = iv_len;
4812         ut_params->aead_xform.aead.digest_length = auth_len;
4813         ut_params->aead_xform.aead.aad_length = aad_len;
4814
4815         TEST_HEXDUMP(stdout, "key:", key, key_len);
4816
4817         /* Create Crypto session*/
4818         ut_params->sess = rte_cryptodev_sym_session_create(
4819                         ts_params->session_mpool);
4820
4821         rte_cryptodev_sym_session_init(dev_id, ut_params->sess,
4822                         &ut_params->aead_xform, ts_params->session_mpool);
4823
4824         TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed");
4825
4826         return 0;
4827 }
4828
4829 static int
4830 create_gcm_xforms(struct rte_crypto_op *op,
4831                 enum rte_crypto_aead_operation aead_op,
4832                 uint8_t *key, const uint8_t key_len,
4833                 const uint8_t aad_len, const uint8_t auth_len,
4834                 uint8_t iv_len)
4835 {
4836         TEST_ASSERT_NOT_NULL(rte_crypto_op_sym_xforms_alloc(op, 1),
4837                         "failed to allocate space for crypto transform");
4838
4839         struct rte_crypto_sym_op *sym_op = op->sym;
4840
4841         /* Setup AEAD Parameters */
4842         sym_op->xform->type = RTE_CRYPTO_SYM_XFORM_AEAD;
4843         sym_op->xform->next = NULL;
4844         sym_op->xform->aead.algo = RTE_CRYPTO_AEAD_AES_GCM;
4845         sym_op->xform->aead.op = aead_op;
4846         sym_op->xform->aead.key.data = key;
4847         sym_op->xform->aead.key.length = key_len;
4848         sym_op->xform->aead.iv.offset = IV_OFFSET;
4849         sym_op->xform->aead.iv.length = iv_len;
4850         sym_op->xform->aead.digest_length = auth_len;
4851         sym_op->xform->aead.aad_length = aad_len;
4852
4853         TEST_HEXDUMP(stdout, "key:", key, key_len);
4854
4855         return 0;
4856 }
4857
4858 static int
4859 create_gcm_operation(enum rte_crypto_aead_operation op,
4860                 const struct gcm_test_data *tdata)
4861 {
4862         struct crypto_testsuite_params *ts_params = &testsuite_params;
4863         struct crypto_unittest_params *ut_params = &unittest_params;
4864
4865         uint8_t *plaintext, *ciphertext;
4866         unsigned int aad_pad_len, plaintext_pad_len;
4867
4868         /* Generate Crypto op data structure */
4869         ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
4870                         RTE_CRYPTO_OP_TYPE_SYMMETRIC);
4871         TEST_ASSERT_NOT_NULL(ut_params->op,
4872                         "Failed to allocate symmetric crypto operation struct");
4873
4874         struct rte_crypto_sym_op *sym_op = ut_params->op->sym;
4875
4876         /* Append aad data */
4877         aad_pad_len = RTE_ALIGN_CEIL(tdata->aad.len, 16);
4878         sym_op->aead.aad.data = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
4879                         aad_pad_len);
4880         TEST_ASSERT_NOT_NULL(sym_op->aead.aad.data,
4881                         "no room to append aad");
4882
4883         sym_op->aead.aad.phys_addr =
4884                         rte_pktmbuf_mtophys(ut_params->ibuf);
4885         memcpy(sym_op->aead.aad.data, tdata->aad.data, tdata->aad.len);
4886         TEST_HEXDUMP(stdout, "aad:", sym_op->aead.aad.data,
4887                 tdata->aad.len);
4888
4889         /* Append IV at the end of the crypto operation*/
4890         uint8_t *iv_ptr = rte_crypto_op_ctod_offset(ut_params->op,
4891                         uint8_t *, IV_OFFSET);
4892
4893         rte_memcpy(iv_ptr, tdata->iv.data, tdata->iv.len);
4894         TEST_HEXDUMP(stdout, "iv:", iv_ptr,
4895                 tdata->iv.len);
4896
4897         /* Append plaintext/ciphertext */
4898         if (op == RTE_CRYPTO_AEAD_OP_ENCRYPT) {
4899                 plaintext_pad_len = RTE_ALIGN_CEIL(tdata->plaintext.len, 16);
4900                 plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
4901                                 plaintext_pad_len);
4902                 TEST_ASSERT_NOT_NULL(plaintext, "no room to append plaintext");
4903
4904                 memcpy(plaintext, tdata->plaintext.data, tdata->plaintext.len);
4905                 TEST_HEXDUMP(stdout, "plaintext:", plaintext,
4906                                 tdata->plaintext.len);
4907
4908                 if (ut_params->obuf) {
4909                         ciphertext = (uint8_t *)rte_pktmbuf_append(
4910                                         ut_params->obuf,
4911                                         plaintext_pad_len + aad_pad_len);
4912                         TEST_ASSERT_NOT_NULL(ciphertext,
4913                                         "no room to append ciphertext");
4914
4915                         memset(ciphertext + aad_pad_len, 0,
4916                                         tdata->ciphertext.len);
4917                 }
4918         } else {
4919                 plaintext_pad_len = RTE_ALIGN_CEIL(tdata->ciphertext.len, 16);
4920                 ciphertext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
4921                                 plaintext_pad_len);
4922                 TEST_ASSERT_NOT_NULL(ciphertext,
4923                                 "no room to append ciphertext");
4924
4925                 memcpy(ciphertext, tdata->ciphertext.data,
4926                                 tdata->ciphertext.len);
4927                 TEST_HEXDUMP(stdout, "ciphertext:", ciphertext,
4928                                 tdata->ciphertext.len);
4929
4930                 if (ut_params->obuf) {
4931                         plaintext = (uint8_t *)rte_pktmbuf_append(
4932                                         ut_params->obuf,
4933                                         plaintext_pad_len + aad_pad_len);
4934                         TEST_ASSERT_NOT_NULL(plaintext,
4935                                         "no room to append plaintext");
4936
4937                         memset(plaintext + aad_pad_len, 0,
4938                                         tdata->plaintext.len);
4939                 }
4940         }
4941
4942         /* Append digest data */
4943         if (op == RTE_CRYPTO_AEAD_OP_ENCRYPT) {
4944                 sym_op->aead.digest.data = (uint8_t *)rte_pktmbuf_append(
4945                                 ut_params->obuf ? ut_params->obuf :
4946                                                 ut_params->ibuf,
4947                                                 tdata->auth_tag.len);
4948                 TEST_ASSERT_NOT_NULL(sym_op->aead.digest.data,
4949                                 "no room to append digest");
4950                 memset(sym_op->aead.digest.data, 0, tdata->auth_tag.len);
4951                 sym_op->aead.digest.phys_addr = rte_pktmbuf_mtophys_offset(
4952                                 ut_params->obuf ? ut_params->obuf :
4953                                                 ut_params->ibuf,
4954                                                 plaintext_pad_len +
4955                                                 aad_pad_len);
4956         } else {
4957                 sym_op->aead.digest.data = (uint8_t *)rte_pktmbuf_append(
4958                                 ut_params->ibuf, tdata->auth_tag.len);
4959                 TEST_ASSERT_NOT_NULL(sym_op->aead.digest.data,
4960                                 "no room to append digest");
4961                 sym_op->aead.digest.phys_addr = rte_pktmbuf_mtophys_offset(
4962                                 ut_params->ibuf,
4963                                 plaintext_pad_len + aad_pad_len);
4964
4965                 rte_memcpy(sym_op->aead.digest.data, tdata->auth_tag.data,
4966                         tdata->auth_tag.len);
4967                 TEST_HEXDUMP(stdout, "digest:",
4968                         sym_op->aead.digest.data,
4969                         tdata->auth_tag.len);
4970         }
4971
4972         sym_op->aead.data.length = tdata->plaintext.len;
4973         sym_op->aead.data.offset = aad_pad_len;
4974
4975         return 0;
4976 }
4977
4978 static int
4979 test_AES_GCM_authenticated_encryption(const struct gcm_test_data *tdata)
4980 {
4981         struct crypto_testsuite_params *ts_params = &testsuite_params;
4982         struct crypto_unittest_params *ut_params = &unittest_params;
4983
4984         int retval;
4985         uint8_t *ciphertext, *auth_tag;
4986         uint16_t plaintext_pad_len;
4987         uint32_t i;
4988
4989         /* Create GCM session */
4990         retval = create_gcm_session(ts_params->valid_devs[0],
4991                         RTE_CRYPTO_AEAD_OP_ENCRYPT,
4992                         tdata->key.data, tdata->key.len,
4993                         tdata->aad.len, tdata->auth_tag.len,
4994                         tdata->iv.len);
4995         if (retval < 0)
4996                 return retval;
4997
4998         if (tdata->aad.len > MBUF_SIZE) {
4999                 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->large_mbuf_pool);
5000                 /* Populate full size of add data */
5001                 for (i = 32; i < GCM_MAX_AAD_LENGTH; i += 32)
5002                         memcpy(&tdata->aad.data[i], &tdata->aad.data[0], 32);
5003         } else
5004                 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
5005
5006         /* clear mbuf payload */
5007         memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
5008                         rte_pktmbuf_tailroom(ut_params->ibuf));
5009
5010         /* Create GCM operation */
5011         retval = create_gcm_operation(RTE_CRYPTO_AEAD_OP_ENCRYPT, tdata);
5012         if (retval < 0)
5013                 return retval;
5014
5015         rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
5016
5017         ut_params->op->sym->m_src = ut_params->ibuf;
5018
5019         /* Process crypto operation */
5020         TEST_ASSERT_NOT_NULL(process_crypto_request(ts_params->valid_devs[0],
5021                         ut_params->op), "failed to process sym crypto op");
5022
5023         TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
5024                         "crypto op processing failed");
5025
5026         plaintext_pad_len = RTE_ALIGN_CEIL(tdata->plaintext.len, 16);
5027
5028         if (ut_params->op->sym->m_dst) {
5029                 ciphertext = rte_pktmbuf_mtod(ut_params->op->sym->m_dst,
5030                                 uint8_t *);
5031                 auth_tag = rte_pktmbuf_mtod_offset(ut_params->op->sym->m_dst,
5032                                 uint8_t *, plaintext_pad_len);
5033         } else {
5034                 ciphertext = rte_pktmbuf_mtod_offset(ut_params->op->sym->m_src,
5035                                 uint8_t *,
5036                                 ut_params->op->sym->cipher.data.offset);
5037                 auth_tag = ciphertext + plaintext_pad_len;
5038         }
5039
5040         TEST_HEXDUMP(stdout, "ciphertext:", ciphertext, tdata->ciphertext.len);
5041         TEST_HEXDUMP(stdout, "auth tag:", auth_tag, tdata->auth_tag.len);
5042
5043         /* Validate obuf */
5044         TEST_ASSERT_BUFFERS_ARE_EQUAL(
5045                         ciphertext,
5046                         tdata->ciphertext.data,
5047                         tdata->ciphertext.len,
5048                         "GCM Ciphertext data not as expected");
5049
5050         TEST_ASSERT_BUFFERS_ARE_EQUAL(
5051                         auth_tag,
5052                         tdata->auth_tag.data,
5053                         tdata->auth_tag.len,
5054                         "GCM Generated auth tag not as expected");
5055
5056         return 0;
5057
5058 }
5059
5060 static int
5061 test_AES_GCM_authenticated_encryption_test_case_1(void)
5062 {
5063         return test_AES_GCM_authenticated_encryption(&gcm_test_case_1);
5064 }
5065
5066 static int
5067 test_AES_GCM_authenticated_encryption_test_case_2(void)
5068 {
5069         return test_AES_GCM_authenticated_encryption(&gcm_test_case_2);
5070 }
5071
5072 static int
5073 test_AES_GCM_authenticated_encryption_test_case_3(void)
5074 {
5075         return test_AES_GCM_authenticated_encryption(&gcm_test_case_3);
5076 }
5077
5078 static int
5079 test_AES_GCM_authenticated_encryption_test_case_4(void)
5080 {
5081         return test_AES_GCM_authenticated_encryption(&gcm_test_case_4);
5082 }
5083
5084 static int
5085 test_AES_GCM_authenticated_encryption_test_case_5(void)
5086 {
5087         return test_AES_GCM_authenticated_encryption(&gcm_test_case_5);
5088 }
5089
5090 static int
5091 test_AES_GCM_authenticated_encryption_test_case_6(void)
5092 {
5093         return test_AES_GCM_authenticated_encryption(&gcm_test_case_6);
5094 }
5095
5096 static int
5097 test_AES_GCM_authenticated_encryption_test_case_7(void)
5098 {
5099         return test_AES_GCM_authenticated_encryption(&gcm_test_case_7);
5100 }
5101
5102 static int
5103 test_AES_GCM_auth_encryption_test_case_192_1(void)
5104 {
5105         return test_AES_GCM_authenticated_encryption(&gcm_test_case_192_1);
5106 }
5107
5108 static int
5109 test_AES_GCM_auth_encryption_test_case_192_2(void)
5110 {
5111         return test_AES_GCM_authenticated_encryption(&gcm_test_case_192_2);
5112 }
5113
5114 static int
5115 test_AES_GCM_auth_encryption_test_case_192_3(void)
5116 {
5117         return test_AES_GCM_authenticated_encryption(&gcm_test_case_192_3);
5118 }
5119
5120 static int
5121 test_AES_GCM_auth_encryption_test_case_192_4(void)
5122 {
5123         return test_AES_GCM_authenticated_encryption(&gcm_test_case_192_4);
5124 }
5125
5126 static int
5127 test_AES_GCM_auth_encryption_test_case_192_5(void)
5128 {
5129         return test_AES_GCM_authenticated_encryption(&gcm_test_case_192_5);
5130 }
5131
5132 static int
5133 test_AES_GCM_auth_encryption_test_case_192_6(void)
5134 {
5135         return test_AES_GCM_authenticated_encryption(&gcm_test_case_192_6);
5136 }
5137
5138 static int
5139 test_AES_GCM_auth_encryption_test_case_192_7(void)
5140 {
5141         return test_AES_GCM_authenticated_encryption(&gcm_test_case_192_7);
5142 }
5143
5144 static int
5145 test_AES_GCM_auth_encryption_test_case_256_1(void)
5146 {
5147         return test_AES_GCM_authenticated_encryption(&gcm_test_case_256_1);
5148 }
5149
5150 static int
5151 test_AES_GCM_auth_encryption_test_case_256_2(void)
5152 {
5153         return test_AES_GCM_authenticated_encryption(&gcm_test_case_256_2);
5154 }
5155
5156 static int
5157 test_AES_GCM_auth_encryption_test_case_256_3(void)
5158 {
5159         return test_AES_GCM_authenticated_encryption(&gcm_test_case_256_3);
5160 }
5161
5162 static int
5163 test_AES_GCM_auth_encryption_test_case_256_4(void)
5164 {
5165         return test_AES_GCM_authenticated_encryption(&gcm_test_case_256_4);
5166 }
5167
5168 static int
5169 test_AES_GCM_auth_encryption_test_case_256_5(void)
5170 {
5171         return test_AES_GCM_authenticated_encryption(&gcm_test_case_256_5);
5172 }
5173
5174 static int
5175 test_AES_GCM_auth_encryption_test_case_256_6(void)
5176 {
5177         return test_AES_GCM_authenticated_encryption(&gcm_test_case_256_6);
5178 }
5179
5180 static int
5181 test_AES_GCM_auth_encryption_test_case_256_7(void)
5182 {
5183         return test_AES_GCM_authenticated_encryption(&gcm_test_case_256_7);
5184 }
5185
5186 static int
5187 test_AES_GCM_auth_encryption_test_case_aad_1(void)
5188 {
5189         return test_AES_GCM_authenticated_encryption(&gcm_test_case_aad_1);
5190 }
5191
5192 static int
5193 test_AES_GCM_auth_encryption_test_case_aad_2(void)
5194 {
5195         return test_AES_GCM_authenticated_encryption(&gcm_test_case_aad_2);
5196 }
5197
5198 static int
5199 test_AES_GCM_authenticated_decryption(const struct gcm_test_data *tdata)
5200 {
5201         struct crypto_testsuite_params *ts_params = &testsuite_params;
5202         struct crypto_unittest_params *ut_params = &unittest_params;
5203
5204         int retval;
5205         uint8_t *plaintext;
5206         uint32_t i;
5207
5208         /* Create GCM session */
5209         retval = create_gcm_session(ts_params->valid_devs[0],
5210                         RTE_CRYPTO_AEAD_OP_DECRYPT,
5211                         tdata->key.data, tdata->key.len,
5212                         tdata->aad.len, tdata->auth_tag.len,
5213                         tdata->iv.len);
5214         if (retval < 0)
5215                 return retval;
5216
5217         /* alloc mbuf and set payload */
5218         if (tdata->aad.len > MBUF_SIZE) {
5219                 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->large_mbuf_pool);
5220                 /* Populate full size of add data */
5221                 for (i = 32; i < GCM_MAX_AAD_LENGTH; i += 32)
5222                         memcpy(&tdata->aad.data[i], &tdata->aad.data[0], 32);
5223         } else
5224                 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
5225
5226         memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
5227                         rte_pktmbuf_tailroom(ut_params->ibuf));
5228
5229         /* Create GCM operation */
5230         retval = create_gcm_operation(RTE_CRYPTO_AEAD_OP_DECRYPT, tdata);
5231         if (retval < 0)
5232                 return retval;
5233
5234         rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
5235
5236         ut_params->op->sym->m_src = ut_params->ibuf;
5237
5238         /* Process crypto operation */
5239         TEST_ASSERT_NOT_NULL(process_crypto_request(ts_params->valid_devs[0],
5240                         ut_params->op), "failed to process sym crypto op");
5241
5242         TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
5243                         "crypto op processing failed");
5244
5245         if (ut_params->op->sym->m_dst)
5246                 plaintext = rte_pktmbuf_mtod(ut_params->op->sym->m_dst,
5247                                 uint8_t *);
5248         else
5249                 plaintext = rte_pktmbuf_mtod_offset(ut_params->op->sym->m_src,
5250                                 uint8_t *,
5251                                 ut_params->op->sym->cipher.data.offset);
5252
5253         TEST_HEXDUMP(stdout, "plaintext:", plaintext, tdata->ciphertext.len);
5254
5255         /* Validate obuf */
5256         TEST_ASSERT_BUFFERS_ARE_EQUAL(
5257                         plaintext,
5258                         tdata->plaintext.data,
5259                         tdata->plaintext.len,
5260                         "GCM plaintext data not as expected");
5261
5262         TEST_ASSERT_EQUAL(ut_params->op->status,
5263                         RTE_CRYPTO_OP_STATUS_SUCCESS,
5264                         "GCM authentication failed");
5265         return 0;
5266 }
5267
5268 static int
5269 test_AES_GCM_authenticated_decryption_test_case_1(void)
5270 {
5271         return test_AES_GCM_authenticated_decryption(&gcm_test_case_1);
5272 }
5273
5274 static int
5275 test_AES_GCM_authenticated_decryption_test_case_2(void)
5276 {
5277         return test_AES_GCM_authenticated_decryption(&gcm_test_case_2);
5278 }
5279
5280 static int
5281 test_AES_GCM_authenticated_decryption_test_case_3(void)
5282 {
5283         return test_AES_GCM_authenticated_decryption(&gcm_test_case_3);
5284 }
5285
5286 static int
5287 test_AES_GCM_authenticated_decryption_test_case_4(void)
5288 {
5289         return test_AES_GCM_authenticated_decryption(&gcm_test_case_4);
5290 }
5291
5292 static int
5293 test_AES_GCM_authenticated_decryption_test_case_5(void)
5294 {
5295         return test_AES_GCM_authenticated_decryption(&gcm_test_case_5);
5296 }
5297
5298 static int
5299 test_AES_GCM_authenticated_decryption_test_case_6(void)
5300 {
5301         return test_AES_GCM_authenticated_decryption(&gcm_test_case_6);
5302 }
5303
5304 static int
5305 test_AES_GCM_authenticated_decryption_test_case_7(void)
5306 {
5307         return test_AES_GCM_authenticated_decryption(&gcm_test_case_7);
5308 }
5309
5310 static int
5311 test_AES_GCM_auth_decryption_test_case_192_1(void)
5312 {
5313         return test_AES_GCM_authenticated_decryption(&gcm_test_case_192_1);
5314 }
5315
5316 static int
5317 test_AES_GCM_auth_decryption_test_case_192_2(void)
5318 {
5319         return test_AES_GCM_authenticated_decryption(&gcm_test_case_192_2);
5320 }
5321
5322 static int
5323 test_AES_GCM_auth_decryption_test_case_192_3(void)
5324 {
5325         return test_AES_GCM_authenticated_decryption(&gcm_test_case_192_3);
5326 }
5327
5328 static int
5329 test_AES_GCM_auth_decryption_test_case_192_4(void)
5330 {
5331         return test_AES_GCM_authenticated_decryption(&gcm_test_case_192_4);
5332 }
5333
5334 static int
5335 test_AES_GCM_auth_decryption_test_case_192_5(void)
5336 {
5337         return test_AES_GCM_authenticated_decryption(&gcm_test_case_192_5);
5338 }
5339
5340 static int
5341 test_AES_GCM_auth_decryption_test_case_192_6(void)
5342 {
5343         return test_AES_GCM_authenticated_decryption(&gcm_test_case_192_6);
5344 }
5345
5346 static int
5347 test_AES_GCM_auth_decryption_test_case_192_7(void)
5348 {
5349         return test_AES_GCM_authenticated_decryption(&gcm_test_case_192_7);
5350 }
5351
5352 static int
5353 test_AES_GCM_auth_decryption_test_case_256_1(void)
5354 {
5355         return test_AES_GCM_authenticated_decryption(&gcm_test_case_256_1);
5356 }
5357
5358 static int
5359 test_AES_GCM_auth_decryption_test_case_256_2(void)
5360 {
5361         return test_AES_GCM_authenticated_decryption(&gcm_test_case_256_2);
5362 }
5363
5364 static int
5365 test_AES_GCM_auth_decryption_test_case_256_3(void)
5366 {
5367         return test_AES_GCM_authenticated_decryption(&gcm_test_case_256_3);
5368 }
5369
5370 static int
5371 test_AES_GCM_auth_decryption_test_case_256_4(void)
5372 {
5373         return test_AES_GCM_authenticated_decryption(&gcm_test_case_256_4);
5374 }
5375
5376 static int
5377 test_AES_GCM_auth_decryption_test_case_256_5(void)
5378 {
5379         return test_AES_GCM_authenticated_decryption(&gcm_test_case_256_5);
5380 }
5381
5382 static int
5383 test_AES_GCM_auth_decryption_test_case_256_6(void)
5384 {
5385         return test_AES_GCM_authenticated_decryption(&gcm_test_case_256_6);
5386 }
5387
5388 static int
5389 test_AES_GCM_auth_decryption_test_case_256_7(void)
5390 {
5391         return test_AES_GCM_authenticated_decryption(&gcm_test_case_256_7);
5392 }
5393
5394 static int
5395 test_AES_GCM_auth_decryption_test_case_aad_1(void)
5396 {
5397         return test_AES_GCM_authenticated_decryption(&gcm_test_case_aad_1);
5398 }
5399
5400 static int
5401 test_AES_GCM_auth_decryption_test_case_aad_2(void)
5402 {
5403         return test_AES_GCM_authenticated_decryption(&gcm_test_case_aad_2);
5404 }
5405
5406 static int
5407 test_AES_GCM_authenticated_encryption_oop(const struct gcm_test_data *tdata)
5408 {
5409         struct crypto_testsuite_params *ts_params = &testsuite_params;
5410         struct crypto_unittest_params *ut_params = &unittest_params;
5411
5412         int retval;
5413         uint8_t *ciphertext, *auth_tag;
5414         uint16_t plaintext_pad_len;
5415
5416         /* Create GCM session */
5417         retval = create_gcm_session(ts_params->valid_devs[0],
5418                         RTE_CRYPTO_AEAD_OP_ENCRYPT,
5419                         tdata->key.data, tdata->key.len,
5420                         tdata->aad.len, tdata->auth_tag.len,
5421                         tdata->iv.len);
5422         if (retval < 0)
5423                 return retval;
5424
5425         ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
5426         ut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
5427
5428         /* clear mbuf payload */
5429         memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
5430                         rte_pktmbuf_tailroom(ut_params->ibuf));
5431         memset(rte_pktmbuf_mtod(ut_params->obuf, uint8_t *), 0,
5432                         rte_pktmbuf_tailroom(ut_params->obuf));
5433
5434         /* Create GCM operation */
5435         retval = create_gcm_operation(RTE_CRYPTO_AEAD_OP_ENCRYPT, tdata);
5436         if (retval < 0)
5437                 return retval;
5438
5439         rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
5440
5441         ut_params->op->sym->m_src = ut_params->ibuf;
5442         ut_params->op->sym->m_dst = ut_params->obuf;
5443
5444         /* Process crypto operation */
5445         TEST_ASSERT_NOT_NULL(process_crypto_request(ts_params->valid_devs[0],
5446                         ut_params->op), "failed to process sym crypto op");
5447
5448         TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
5449                         "crypto op processing failed");
5450
5451         plaintext_pad_len = RTE_ALIGN_CEIL(tdata->plaintext.len, 16);
5452
5453         ciphertext = rte_pktmbuf_mtod_offset(ut_params->obuf, uint8_t *,
5454                         ut_params->op->sym->cipher.data.offset);
5455         auth_tag = ciphertext + plaintext_pad_len;
5456
5457         TEST_HEXDUMP(stdout, "ciphertext:", ciphertext, tdata->ciphertext.len);
5458         TEST_HEXDUMP(stdout, "auth tag:", auth_tag, tdata->auth_tag.len);
5459
5460         /* Validate obuf */
5461         TEST_ASSERT_BUFFERS_ARE_EQUAL(
5462                         ciphertext,
5463                         tdata->ciphertext.data,
5464                         tdata->ciphertext.len,
5465                         "GCM Ciphertext data not as expected");
5466
5467         TEST_ASSERT_BUFFERS_ARE_EQUAL(
5468                         auth_tag,
5469                         tdata->auth_tag.data,
5470                         tdata->auth_tag.len,
5471                         "GCM Generated auth tag not as expected");
5472
5473         return 0;
5474
5475 }
5476
5477 static int
5478 test_AES_GCM_authenticated_encryption_oop_test_case_1(void)
5479 {
5480         return test_AES_GCM_authenticated_encryption_oop(&gcm_test_case_5);
5481 }
5482
5483 static int
5484 test_AES_GCM_authenticated_decryption_oop(const struct gcm_test_data *tdata)
5485 {
5486         struct crypto_testsuite_params *ts_params = &testsuite_params;
5487         struct crypto_unittest_params *ut_params = &unittest_params;
5488
5489         int retval;
5490         uint8_t *plaintext;
5491
5492         /* Create GCM session */
5493         retval = create_gcm_session(ts_params->valid_devs[0],
5494                         RTE_CRYPTO_AEAD_OP_DECRYPT,
5495                         tdata->key.data, tdata->key.len,
5496                         tdata->aad.len, tdata->auth_tag.len,
5497                         tdata->iv.len);
5498         if (retval < 0)
5499                 return retval;
5500
5501         /* alloc mbuf and set payload */
5502         ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
5503         ut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
5504
5505         memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
5506                         rte_pktmbuf_tailroom(ut_params->ibuf));
5507         memset(rte_pktmbuf_mtod(ut_params->obuf, uint8_t *), 0,
5508                         rte_pktmbuf_tailroom(ut_params->obuf));
5509
5510         /* Create GCM operation */
5511         retval = create_gcm_operation(RTE_CRYPTO_AEAD_OP_DECRYPT, tdata);
5512         if (retval < 0)
5513                 return retval;
5514
5515         rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
5516
5517         ut_params->op->sym->m_src = ut_params->ibuf;
5518         ut_params->op->sym->m_dst = ut_params->obuf;
5519
5520         /* Process crypto operation */
5521         TEST_ASSERT_NOT_NULL(process_crypto_request(ts_params->valid_devs[0],
5522                         ut_params->op), "failed to process sym crypto op");
5523
5524         TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
5525                         "crypto op processing failed");
5526
5527         plaintext = rte_pktmbuf_mtod_offset(ut_params->obuf, uint8_t *,
5528                         ut_params->op->sym->cipher.data.offset);
5529
5530         TEST_HEXDUMP(stdout, "plaintext:", plaintext, tdata->ciphertext.len);
5531
5532         /* Validate obuf */
5533         TEST_ASSERT_BUFFERS_ARE_EQUAL(
5534                         plaintext,
5535                         tdata->plaintext.data,
5536                         tdata->plaintext.len,
5537                         "GCM plaintext data not as expected");
5538
5539         TEST_ASSERT_EQUAL(ut_params->op->status,
5540                         RTE_CRYPTO_OP_STATUS_SUCCESS,
5541                         "GCM authentication failed");
5542         return 0;
5543 }
5544
5545 static int
5546 test_AES_GCM_authenticated_decryption_oop_test_case_1(void)
5547 {
5548         return test_AES_GCM_authenticated_decryption_oop(&gcm_test_case_5);
5549 }
5550
5551 static int
5552 test_AES_GCM_authenticated_encryption_sessionless(
5553                 const struct gcm_test_data *tdata)
5554 {
5555         struct crypto_testsuite_params *ts_params = &testsuite_params;
5556         struct crypto_unittest_params *ut_params = &unittest_params;
5557
5558         int retval;
5559         uint8_t *ciphertext, *auth_tag;
5560         uint16_t plaintext_pad_len;
5561         uint8_t key[tdata->key.len + 1];
5562
5563         ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
5564
5565         /* clear mbuf payload */
5566         memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
5567                         rte_pktmbuf_tailroom(ut_params->ibuf));
5568
5569         /* Create GCM operation */
5570         retval = create_gcm_operation(RTE_CRYPTO_AEAD_OP_ENCRYPT, tdata);
5571         if (retval < 0)
5572                 return retval;
5573
5574         /* Create GCM xforms */
5575         memcpy(key, tdata->key.data, tdata->key.len);
5576         retval = create_gcm_xforms(ut_params->op,
5577                         RTE_CRYPTO_AEAD_OP_ENCRYPT,
5578                         key, tdata->key.len,
5579                         tdata->aad.len, tdata->auth_tag.len,
5580                         tdata->iv.len);
5581         if (retval < 0)
5582                 return retval;
5583
5584         ut_params->op->sym->m_src = ut_params->ibuf;
5585
5586         TEST_ASSERT_EQUAL(ut_params->op->sess_type,
5587                         RTE_CRYPTO_OP_SESSIONLESS,
5588                         "crypto op session type not sessionless");
5589
5590         /* Process crypto operation */
5591         TEST_ASSERT_NOT_NULL(process_crypto_request(ts_params->valid_devs[0],
5592                         ut_params->op), "failed to process sym crypto op");
5593
5594         TEST_ASSERT_NOT_NULL(ut_params->op, "failed crypto process");
5595
5596         TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
5597                         "crypto op status not success");
5598
5599         plaintext_pad_len = RTE_ALIGN_CEIL(tdata->plaintext.len, 16);
5600
5601         ciphertext = rte_pktmbuf_mtod_offset(ut_params->ibuf, uint8_t *,
5602                         ut_params->op->sym->cipher.data.offset);
5603         auth_tag = ciphertext + plaintext_pad_len;
5604
5605         TEST_HEXDUMP(stdout, "ciphertext:", ciphertext, tdata->ciphertext.len);
5606         TEST_HEXDUMP(stdout, "auth tag:", auth_tag, tdata->auth_tag.len);
5607
5608         /* Validate obuf */
5609         TEST_ASSERT_BUFFERS_ARE_EQUAL(
5610                         ciphertext,
5611                         tdata->ciphertext.data,
5612                         tdata->ciphertext.len,
5613                         "GCM Ciphertext data not as expected");
5614
5615         TEST_ASSERT_BUFFERS_ARE_EQUAL(
5616                         auth_tag,
5617                         tdata->auth_tag.data,
5618                         tdata->auth_tag.len,
5619                         "GCM Generated auth tag not as expected");
5620
5621         return 0;
5622
5623 }
5624
5625 static int
5626 test_AES_GCM_authenticated_encryption_sessionless_test_case_1(void)
5627 {
5628         return test_AES_GCM_authenticated_encryption_sessionless(
5629                         &gcm_test_case_5);
5630 }
5631
5632 static int
5633 test_AES_GCM_authenticated_decryption_sessionless(
5634                 const struct gcm_test_data *tdata)
5635 {
5636         struct crypto_testsuite_params *ts_params = &testsuite_params;
5637         struct crypto_unittest_params *ut_params = &unittest_params;
5638
5639         int retval;
5640         uint8_t *plaintext;
5641         uint8_t key[tdata->key.len + 1];
5642
5643         /* alloc mbuf and set payload */
5644         ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
5645
5646         memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
5647                         rte_pktmbuf_tailroom(ut_params->ibuf));
5648
5649         /* Create GCM operation */
5650         retval = create_gcm_operation(RTE_CRYPTO_AEAD_OP_DECRYPT, tdata);
5651         if (retval < 0)
5652                 return retval;
5653
5654         /* Create GCM xforms */
5655         memcpy(key, tdata->key.data, tdata->key.len);
5656         retval = create_gcm_xforms(ut_params->op,
5657                         RTE_CRYPTO_AEAD_OP_DECRYPT,
5658                         key, tdata->key.len,
5659                         tdata->aad.len, tdata->auth_tag.len,
5660                         tdata->iv.len);
5661         if (retval < 0)
5662                 return retval;
5663
5664         ut_params->op->sym->m_src = ut_params->ibuf;
5665
5666         TEST_ASSERT_EQUAL(ut_params->op->sess_type,
5667                         RTE_CRYPTO_OP_SESSIONLESS,
5668                         "crypto op session type not sessionless");
5669
5670         /* Process crypto operation */
5671         TEST_ASSERT_NOT_NULL(process_crypto_request(ts_params->valid_devs[0],
5672                         ut_params->op), "failed to process sym crypto op");
5673
5674         TEST_ASSERT_NOT_NULL(ut_params->op, "failed crypto process");
5675
5676         TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
5677                         "crypto op status not success");
5678
5679         plaintext = rte_pktmbuf_mtod_offset(ut_params->ibuf, uint8_t *,
5680                         ut_params->op->sym->cipher.data.offset);
5681
5682         TEST_HEXDUMP(stdout, "plaintext:", plaintext, tdata->ciphertext.len);
5683
5684         /* Validate obuf */
5685         TEST_ASSERT_BUFFERS_ARE_EQUAL(
5686                         plaintext,
5687                         tdata->plaintext.data,
5688                         tdata->plaintext.len,
5689                         "GCM plaintext data not as expected");
5690
5691         TEST_ASSERT_EQUAL(ut_params->op->status,
5692                         RTE_CRYPTO_OP_STATUS_SUCCESS,
5693                         "GCM authentication failed");
5694         return 0;
5695 }
5696
5697 static int
5698 test_AES_GCM_authenticated_decryption_sessionless_test_case_1(void)
5699 {
5700         return test_AES_GCM_authenticated_decryption_sessionless(
5701                         &gcm_test_case_5);
5702 }
5703
5704 static int
5705 test_stats(void)
5706 {
5707         struct crypto_testsuite_params *ts_params = &testsuite_params;
5708         struct rte_cryptodev_stats stats;
5709         struct rte_cryptodev *dev;
5710         cryptodev_stats_get_t temp_pfn;
5711
5712         rte_cryptodev_stats_reset(ts_params->valid_devs[0]);
5713         TEST_ASSERT((rte_cryptodev_stats_get(ts_params->valid_devs[0] + 600,
5714                         &stats) == -ENODEV),
5715                 "rte_cryptodev_stats_get invalid dev failed");
5716         TEST_ASSERT((rte_cryptodev_stats_get(ts_params->valid_devs[0], 0) != 0),
5717                 "rte_cryptodev_stats_get invalid Param failed");
5718         dev = &rte_cryptodevs[ts_params->valid_devs[0]];
5719         temp_pfn = dev->dev_ops->stats_get;
5720         dev->dev_ops->stats_get = (cryptodev_stats_get_t)0;
5721         TEST_ASSERT((rte_cryptodev_stats_get(ts_params->valid_devs[0], &stats)
5722                         == -ENOTSUP),
5723                 "rte_cryptodev_stats_get invalid Param failed");
5724         dev->dev_ops->stats_get = temp_pfn;
5725
5726         /* Test expected values */
5727         ut_setup();
5728         test_AES_CBC_HMAC_SHA1_encrypt_digest();
5729         ut_teardown();
5730         TEST_ASSERT_SUCCESS(rte_cryptodev_stats_get(ts_params->valid_devs[0],
5731                         &stats),
5732                 "rte_cryptodev_stats_get failed");
5733         TEST_ASSERT((stats.enqueued_count == 1),
5734                 "rte_cryptodev_stats_get returned unexpected enqueued stat");
5735         TEST_ASSERT((stats.dequeued_count == 1),
5736                 "rte_cryptodev_stats_get returned unexpected enqueued stat");
5737         TEST_ASSERT((stats.enqueue_err_count == 0),
5738                 "rte_cryptodev_stats_get returned unexpected enqueued stat");
5739         TEST_ASSERT((stats.dequeue_err_count == 0),
5740                 "rte_cryptodev_stats_get returned unexpected enqueued stat");
5741
5742         /* invalid device but should ignore and not reset device stats*/
5743         rte_cryptodev_stats_reset(ts_params->valid_devs[0] + 300);
5744         TEST_ASSERT_SUCCESS(rte_cryptodev_stats_get(ts_params->valid_devs[0],
5745                         &stats),
5746                 "rte_cryptodev_stats_get failed");
5747         TEST_ASSERT((stats.enqueued_count == 1),
5748                 "rte_cryptodev_stats_get returned unexpected enqueued stat");
5749
5750         /* check that a valid reset clears stats */
5751         rte_cryptodev_stats_reset(ts_params->valid_devs[0]);
5752         TEST_ASSERT_SUCCESS(rte_cryptodev_stats_get(ts_params->valid_devs[0],
5753                         &stats),
5754                                           "rte_cryptodev_stats_get failed");
5755         TEST_ASSERT((stats.enqueued_count == 0),
5756                 "rte_cryptodev_stats_get returned unexpected enqueued stat");
5757         TEST_ASSERT((stats.dequeued_count == 0),
5758                 "rte_cryptodev_stats_get returned unexpected enqueued stat");
5759
5760         return TEST_SUCCESS;
5761 }
5762
5763 static int MD5_HMAC_create_session(struct crypto_testsuite_params *ts_params,
5764                                    struct crypto_unittest_params *ut_params,
5765                                    enum rte_crypto_auth_operation op,
5766                                    const struct HMAC_MD5_vector *test_case)
5767 {
5768         uint8_t key[64];
5769
5770         memcpy(key, test_case->key.data, test_case->key.len);
5771
5772         ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;
5773         ut_params->auth_xform.next = NULL;
5774         ut_params->auth_xform.auth.op = op;
5775
5776         ut_params->auth_xform.auth.algo = RTE_CRYPTO_AUTH_MD5_HMAC;
5777
5778         ut_params->auth_xform.auth.digest_length = MD5_DIGEST_LEN;
5779         ut_params->auth_xform.auth.key.length = test_case->key.len;
5780         ut_params->auth_xform.auth.key.data = key;
5781
5782         ut_params->sess = rte_cryptodev_sym_session_create(
5783                         ts_params->session_mpool);
5784
5785         rte_cryptodev_sym_session_init(ts_params->valid_devs[0],
5786                         ut_params->sess, &ut_params->auth_xform,
5787                         ts_params->session_mpool);
5788
5789         if (ut_params->sess == NULL)
5790                 return TEST_FAILED;
5791
5792         ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
5793
5794         memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
5795                         rte_pktmbuf_tailroom(ut_params->ibuf));
5796
5797         return 0;
5798 }
5799
5800 static int MD5_HMAC_create_op(struct crypto_unittest_params *ut_params,
5801                               const struct HMAC_MD5_vector *test_case,
5802                               uint8_t **plaintext)
5803 {
5804         uint16_t plaintext_pad_len;
5805
5806         struct rte_crypto_sym_op *sym_op = ut_params->op->sym;
5807
5808         plaintext_pad_len = RTE_ALIGN_CEIL(test_case->plaintext.len,
5809                                 16);
5810
5811         *plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
5812                         plaintext_pad_len);
5813         memcpy(*plaintext, test_case->plaintext.data,
5814                         test_case->plaintext.len);
5815
5816         sym_op->auth.digest.data = (uint8_t *)rte_pktmbuf_append(
5817                         ut_params->ibuf, MD5_DIGEST_LEN);
5818         TEST_ASSERT_NOT_NULL(sym_op->auth.digest.data,
5819                         "no room to append digest");
5820         sym_op->auth.digest.phys_addr = rte_pktmbuf_mtophys_offset(
5821                         ut_params->ibuf, plaintext_pad_len);
5822
5823         if (ut_params->auth_xform.auth.op == RTE_CRYPTO_AUTH_OP_VERIFY) {
5824                 rte_memcpy(sym_op->auth.digest.data, test_case->auth_tag.data,
5825                            test_case->auth_tag.len);
5826         }
5827
5828         sym_op->auth.data.offset = 0;
5829         sym_op->auth.data.length = test_case->plaintext.len;
5830
5831         rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
5832         ut_params->op->sym->m_src = ut_params->ibuf;
5833
5834         return 0;
5835 }
5836
5837 static int
5838 test_MD5_HMAC_generate(const struct HMAC_MD5_vector *test_case)
5839 {
5840         uint16_t plaintext_pad_len;
5841         uint8_t *plaintext, *auth_tag;
5842
5843         struct crypto_testsuite_params *ts_params = &testsuite_params;
5844         struct crypto_unittest_params *ut_params = &unittest_params;
5845
5846         if (MD5_HMAC_create_session(ts_params, ut_params,
5847                         RTE_CRYPTO_AUTH_OP_GENERATE, test_case))
5848                 return TEST_FAILED;
5849
5850         /* Generate Crypto op data structure */
5851         ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
5852                         RTE_CRYPTO_OP_TYPE_SYMMETRIC);
5853         TEST_ASSERT_NOT_NULL(ut_params->op,
5854                         "Failed to allocate symmetric crypto operation struct");
5855
5856         plaintext_pad_len = RTE_ALIGN_CEIL(test_case->plaintext.len,
5857                                 16);
5858
5859         if (MD5_HMAC_create_op(ut_params, test_case, &plaintext))
5860                 return TEST_FAILED;
5861
5862         TEST_ASSERT_NOT_NULL(process_crypto_request(ts_params->valid_devs[0],
5863                         ut_params->op), "failed to process sym crypto op");
5864
5865         TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
5866                         "crypto op processing failed");
5867
5868         if (ut_params->op->sym->m_dst) {
5869                 auth_tag = rte_pktmbuf_mtod_offset(ut_params->op->sym->m_dst,
5870                                 uint8_t *, plaintext_pad_len);
5871         } else {
5872                 auth_tag = plaintext + plaintext_pad_len;
5873         }
5874
5875         TEST_ASSERT_BUFFERS_ARE_EQUAL(
5876                         auth_tag,
5877                         test_case->auth_tag.data,
5878                         test_case->auth_tag.len,
5879                         "HMAC_MD5 generated tag not as expected");
5880
5881         return TEST_SUCCESS;
5882 }
5883
5884 static int
5885 test_MD5_HMAC_verify(const struct HMAC_MD5_vector *test_case)
5886 {
5887         uint8_t *plaintext;
5888
5889         struct crypto_testsuite_params *ts_params = &testsuite_params;
5890         struct crypto_unittest_params *ut_params = &unittest_params;
5891
5892         if (MD5_HMAC_create_session(ts_params, ut_params,
5893                         RTE_CRYPTO_AUTH_OP_VERIFY, test_case)) {
5894                 return TEST_FAILED;
5895         }
5896
5897         /* Generate Crypto op data structure */
5898         ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
5899                         RTE_CRYPTO_OP_TYPE_SYMMETRIC);
5900         TEST_ASSERT_NOT_NULL(ut_params->op,
5901                         "Failed to allocate symmetric crypto operation struct");
5902
5903         if (MD5_HMAC_create_op(ut_params, test_case, &plaintext))
5904                 return TEST_FAILED;
5905
5906         TEST_ASSERT_NOT_NULL(process_crypto_request(ts_params->valid_devs[0],
5907                         ut_params->op), "failed to process sym crypto op");
5908
5909         TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
5910                         "HMAC_MD5 crypto op processing failed");
5911
5912         return TEST_SUCCESS;
5913 }
5914
5915 static int
5916 test_MD5_HMAC_generate_case_1(void)
5917 {
5918         return test_MD5_HMAC_generate(&HMAC_MD5_test_case_1);
5919 }
5920
5921 static int
5922 test_MD5_HMAC_verify_case_1(void)
5923 {
5924         return test_MD5_HMAC_verify(&HMAC_MD5_test_case_1);
5925 }
5926
5927 static int
5928 test_MD5_HMAC_generate_case_2(void)
5929 {
5930         return test_MD5_HMAC_generate(&HMAC_MD5_test_case_2);
5931 }
5932
5933 static int
5934 test_MD5_HMAC_verify_case_2(void)
5935 {
5936         return test_MD5_HMAC_verify(&HMAC_MD5_test_case_2);
5937 }
5938
5939 static int
5940 test_multi_session(void)
5941 {
5942         struct crypto_testsuite_params *ts_params = &testsuite_params;
5943         struct crypto_unittest_params *ut_params = &unittest_params;
5944
5945         struct rte_cryptodev_info dev_info;
5946         struct rte_cryptodev_sym_session **sessions;
5947
5948         uint16_t i;
5949
5950         test_AES_CBC_HMAC_SHA512_decrypt_create_session_params(ut_params,
5951                         aes_cbc_key, hmac_sha512_key);
5952
5953
5954         rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
5955
5956         sessions = rte_malloc(NULL,
5957                         (sizeof(struct rte_cryptodev_sym_session *) *
5958                         dev_info.sym.max_nb_sessions) + 1, 0);
5959
5960         /* Create multiple crypto sessions*/
5961         for (i = 0; i < dev_info.sym.max_nb_sessions; i++) {
5962
5963                 sessions[i] = rte_cryptodev_sym_session_create(
5964                                 ts_params->session_mpool);
5965
5966                 rte_cryptodev_sym_session_init(ts_params->valid_devs[0],
5967                                 sessions[i], &ut_params->auth_xform,
5968                                 ts_params->session_mpool);
5969                 TEST_ASSERT_NOT_NULL(sessions[i],
5970                                 "Session creation failed at session number %u",
5971                                 i);
5972
5973                 /* Attempt to send a request on each session */
5974                 TEST_ASSERT_SUCCESS( test_AES_CBC_HMAC_SHA512_decrypt_perform(
5975                         sessions[i],
5976                         ut_params,
5977                         ts_params,
5978                         catch_22_quote_2_512_bytes_AES_CBC_ciphertext,
5979                         catch_22_quote_2_512_bytes_AES_CBC_HMAC_SHA512_digest,
5980                         aes_cbc_iv),
5981                         "Failed to perform decrypt on request number %u.", i);
5982                 /* free crypto operation structure */
5983                 if (ut_params->op)
5984                         rte_crypto_op_free(ut_params->op);
5985
5986                 /*
5987                  * free mbuf - both obuf and ibuf are usually the same,
5988                  * so check if they point at the same address is necessary,
5989                  * to avoid freeing the mbuf twice.
5990                  */
5991                 if (ut_params->obuf) {
5992                         rte_pktmbuf_free(ut_params->obuf);
5993                         if (ut_params->ibuf == ut_params->obuf)
5994                                 ut_params->ibuf = 0;
5995                         ut_params->obuf = 0;
5996                 }
5997                 if (ut_params->ibuf) {
5998                         rte_pktmbuf_free(ut_params->ibuf);
5999                         ut_params->ibuf = 0;
6000                 }
6001         }
6002
6003         /* Next session create should fail */
6004         rte_cryptodev_sym_session_init(ts_params->valid_devs[0],
6005                         sessions[i], &ut_params->auth_xform,
6006                         ts_params->session_mpool);
6007         TEST_ASSERT_NULL(sessions[i],
6008                         "Session creation succeeded unexpectedly!");
6009
6010         for (i = 0; i < dev_info.sym.max_nb_sessions; i++) {
6011                 rte_cryptodev_sym_session_clear(ts_params->valid_devs[0],
6012                                 sessions[i]);
6013                 rte_cryptodev_sym_session_free(sessions[i]);
6014         }
6015
6016         rte_free(sessions);
6017
6018         return TEST_SUCCESS;
6019 }
6020
6021 struct multi_session_params {
6022         struct crypto_unittest_params ut_params;
6023         uint8_t *cipher_key;
6024         uint8_t *hmac_key;
6025         const uint8_t *cipher;
6026         const uint8_t *digest;
6027         uint8_t *iv;
6028 };
6029
6030 #define MB_SESSION_NUMBER 3
6031
6032 static int
6033 test_multi_session_random_usage(void)
6034 {
6035         struct crypto_testsuite_params *ts_params = &testsuite_params;
6036         struct rte_cryptodev_info dev_info;
6037         struct rte_cryptodev_sym_session **sessions;
6038         uint32_t i, j;
6039         struct multi_session_params ut_paramz[] = {
6040
6041                 {
6042                         .cipher_key = ms_aes_cbc_key0,
6043                         .hmac_key = ms_hmac_key0,
6044                         .cipher = ms_aes_cbc_cipher0,
6045                         .digest = ms_hmac_digest0,
6046                         .iv = ms_aes_cbc_iv0
6047                 },
6048                 {
6049                         .cipher_key = ms_aes_cbc_key1,
6050                         .hmac_key = ms_hmac_key1,
6051                         .cipher = ms_aes_cbc_cipher1,
6052                         .digest = ms_hmac_digest1,
6053                         .iv = ms_aes_cbc_iv1
6054                 },
6055                 {
6056                         .cipher_key = ms_aes_cbc_key2,
6057                         .hmac_key = ms_hmac_key2,
6058                         .cipher = ms_aes_cbc_cipher2,
6059                         .digest = ms_hmac_digest2,
6060                         .iv = ms_aes_cbc_iv2
6061                 },
6062
6063         };
6064
6065         rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
6066
6067         sessions = rte_malloc(NULL,
6068                         (sizeof(struct rte_cryptodev_sym_session *)
6069                                         * dev_info.sym.max_nb_sessions) + 1, 0);
6070
6071         for (i = 0; i < MB_SESSION_NUMBER; i++) {
6072                 sessions[i] = rte_cryptodev_sym_session_create(
6073                                 ts_params->session_mpool);
6074
6075                 rte_memcpy(&ut_paramz[i].ut_params, &testsuite_params,
6076                                 sizeof(struct crypto_unittest_params));
6077
6078                 test_AES_CBC_HMAC_SHA512_decrypt_create_session_params(
6079                                 &ut_paramz[i].ut_params,
6080                                 ut_paramz[i].cipher_key, ut_paramz[i].hmac_key);
6081
6082                 /* Create multiple crypto sessions*/
6083                 rte_cryptodev_sym_session_init(
6084                                 ts_params->valid_devs[0],
6085                                 sessions[i],
6086                                 &ut_paramz[i].ut_params.auth_xform,
6087                                 ts_params->session_mpool);
6088
6089                 TEST_ASSERT_NOT_NULL(sessions[i],
6090                                 "Session creation failed at session number %u",
6091                                 i);
6092
6093         }
6094
6095         srand(time(NULL));
6096         for (i = 0; i < 40000; i++) {
6097
6098                 j = rand() % MB_SESSION_NUMBER;
6099
6100                 TEST_ASSERT_SUCCESS(
6101                         test_AES_CBC_HMAC_SHA512_decrypt_perform(
6102                                         sessions[j],
6103                                         &ut_paramz[j].ut_params,
6104                                         ts_params, ut_paramz[j].cipher,
6105                                         ut_paramz[j].digest,
6106                                         ut_paramz[j].iv),
6107                         "Failed to perform decrypt on request number %u.", i);
6108
6109                 if (ut_paramz[j].ut_params.op)
6110                         rte_crypto_op_free(ut_paramz[j].ut_params.op);
6111
6112                 /*
6113                  * free mbuf - both obuf and ibuf are usually the same,
6114                  * so check if they point at the same address is necessary,
6115                  * to avoid freeing the mbuf twice.
6116                  */
6117                 if (ut_paramz[j].ut_params.obuf) {
6118                         rte_pktmbuf_free(ut_paramz[j].ut_params.obuf);
6119                         if (ut_paramz[j].ut_params.ibuf
6120                                         == ut_paramz[j].ut_params.obuf)
6121                                 ut_paramz[j].ut_params.ibuf = 0;
6122                         ut_paramz[j].ut_params.obuf = 0;
6123                 }
6124                 if (ut_paramz[j].ut_params.ibuf) {
6125                         rte_pktmbuf_free(ut_paramz[j].ut_params.ibuf);
6126                         ut_paramz[j].ut_params.ibuf = 0;
6127                 }
6128         }
6129
6130         for (i = 0; i < MB_SESSION_NUMBER; i++) {
6131                 rte_cryptodev_sym_session_clear(ts_params->valid_devs[0],
6132                                 sessions[i]);
6133                 rte_cryptodev_sym_session_free(sessions[i]);
6134         }
6135
6136         rte_free(sessions);
6137
6138         return TEST_SUCCESS;
6139 }
6140
6141 static int
6142 test_null_cipher_only_operation(void)
6143 {
6144         struct crypto_testsuite_params *ts_params = &testsuite_params;
6145         struct crypto_unittest_params *ut_params = &unittest_params;
6146
6147         /* Generate test mbuf data and space for digest */
6148         ut_params->ibuf = setup_test_string(ts_params->mbuf_pool,
6149                         catch_22_quote, QUOTE_512_BYTES, 0);
6150
6151         /* Setup Cipher Parameters */
6152         ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
6153         ut_params->cipher_xform.next = NULL;
6154
6155         ut_params->cipher_xform.cipher.algo = RTE_CRYPTO_CIPHER_NULL;
6156         ut_params->cipher_xform.cipher.op = RTE_CRYPTO_CIPHER_OP_ENCRYPT;
6157
6158         ut_params->sess = rte_cryptodev_sym_session_create(
6159                         ts_params->session_mpool);
6160
6161         /* Create Crypto session*/
6162         rte_cryptodev_sym_session_init(ts_params->valid_devs[0],
6163                                 ut_params->sess,
6164                                 &ut_params->cipher_xform,
6165                                 ts_params->session_mpool);
6166         TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed");
6167
6168         /* Generate Crypto op data structure */
6169         ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
6170                         RTE_CRYPTO_OP_TYPE_SYMMETRIC);
6171         TEST_ASSERT_NOT_NULL(ut_params->op,
6172                         "Failed to allocate symmetric crypto operation struct");
6173
6174         /* Set crypto operation data parameters */
6175         rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
6176
6177         struct rte_crypto_sym_op *sym_op = ut_params->op->sym;
6178
6179         /* set crypto operation source mbuf */
6180         sym_op->m_src = ut_params->ibuf;
6181
6182         sym_op->cipher.data.offset = 0;
6183         sym_op->cipher.data.length = QUOTE_512_BYTES;
6184
6185         /* Process crypto operation */
6186         ut_params->op = process_crypto_request(ts_params->valid_devs[0],
6187                         ut_params->op);
6188         TEST_ASSERT_NOT_NULL(ut_params->op, "no crypto operation returned");
6189
6190         TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
6191                         "crypto operation processing failed");
6192
6193         /* Validate obuf */
6194         TEST_ASSERT_BUFFERS_ARE_EQUAL(
6195                         rte_pktmbuf_mtod(ut_params->op->sym->m_src, uint8_t *),
6196                         catch_22_quote,
6197                         QUOTE_512_BYTES,
6198                         "Ciphertext data not as expected");
6199
6200         return TEST_SUCCESS;
6201 }
6202
6203 static int
6204 test_null_auth_only_operation(void)
6205 {
6206         struct crypto_testsuite_params *ts_params = &testsuite_params;
6207         struct crypto_unittest_params *ut_params = &unittest_params;
6208
6209         /* Generate test mbuf data and space for digest */
6210         ut_params->ibuf = setup_test_string(ts_params->mbuf_pool,
6211                         catch_22_quote, QUOTE_512_BYTES, 0);
6212
6213         /* Setup HMAC Parameters */
6214         ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;
6215         ut_params->auth_xform.next = NULL;
6216
6217         ut_params->auth_xform.auth.algo = RTE_CRYPTO_AUTH_NULL;
6218         ut_params->auth_xform.auth.op = RTE_CRYPTO_AUTH_OP_GENERATE;
6219
6220         ut_params->sess = rte_cryptodev_sym_session_create(
6221                         ts_params->session_mpool);
6222
6223         /* Create Crypto session*/
6224         rte_cryptodev_sym_session_init(ts_params->valid_devs[0],
6225                         ut_params->sess, &ut_params->auth_xform,
6226                         ts_params->session_mpool);
6227         TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed");
6228
6229         /* Generate Crypto op data structure */
6230         ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
6231                         RTE_CRYPTO_OP_TYPE_SYMMETRIC);
6232         TEST_ASSERT_NOT_NULL(ut_params->op,
6233                         "Failed to allocate symmetric crypto operation struct");
6234
6235         /* Set crypto operation data parameters */
6236         rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
6237
6238         struct rte_crypto_sym_op *sym_op = ut_params->op->sym;
6239
6240         sym_op->m_src = ut_params->ibuf;
6241
6242         sym_op->auth.data.offset = 0;
6243         sym_op->auth.data.length = QUOTE_512_BYTES;
6244
6245         /* Process crypto operation */
6246         ut_params->op = process_crypto_request(ts_params->valid_devs[0],
6247                         ut_params->op);
6248         TEST_ASSERT_NOT_NULL(ut_params->op, "no crypto operation returned");
6249
6250         TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
6251                         "crypto operation processing failed");
6252
6253         return TEST_SUCCESS;
6254 }
6255
6256 static int
6257 test_null_cipher_auth_operation(void)
6258 {
6259         struct crypto_testsuite_params *ts_params = &testsuite_params;
6260         struct crypto_unittest_params *ut_params = &unittest_params;
6261
6262         /* Generate test mbuf data and space for digest */
6263         ut_params->ibuf = setup_test_string(ts_params->mbuf_pool,
6264                         catch_22_quote, QUOTE_512_BYTES, 0);
6265
6266         /* Setup Cipher Parameters */
6267         ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
6268         ut_params->cipher_xform.next = &ut_params->auth_xform;
6269
6270         ut_params->cipher_xform.cipher.algo = RTE_CRYPTO_CIPHER_NULL;
6271         ut_params->cipher_xform.cipher.op = RTE_CRYPTO_CIPHER_OP_ENCRYPT;
6272
6273         /* Setup HMAC Parameters */
6274         ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;
6275         ut_params->auth_xform.next = NULL;
6276
6277         ut_params->auth_xform.auth.algo = RTE_CRYPTO_AUTH_NULL;
6278         ut_params->auth_xform.auth.op = RTE_CRYPTO_AUTH_OP_GENERATE;
6279
6280         ut_params->sess = rte_cryptodev_sym_session_create(
6281                         ts_params->session_mpool);
6282
6283         /* Create Crypto session*/
6284         rte_cryptodev_sym_session_init(ts_params->valid_devs[0],
6285                         ut_params->sess, &ut_params->cipher_xform,
6286                         ts_params->session_mpool);
6287         TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed");
6288
6289         /* Generate Crypto op data structure */
6290         ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
6291                         RTE_CRYPTO_OP_TYPE_SYMMETRIC);
6292         TEST_ASSERT_NOT_NULL(ut_params->op,
6293                         "Failed to allocate symmetric crypto operation struct");
6294
6295         /* Set crypto operation data parameters */
6296         rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
6297
6298         struct rte_crypto_sym_op *sym_op = ut_params->op->sym;
6299
6300         sym_op->m_src = ut_params->ibuf;
6301
6302         sym_op->cipher.data.offset = 0;
6303         sym_op->cipher.data.length = QUOTE_512_BYTES;
6304
6305         sym_op->auth.data.offset = 0;
6306         sym_op->auth.data.length = QUOTE_512_BYTES;
6307
6308         /* Process crypto operation */
6309         ut_params->op = process_crypto_request(ts_params->valid_devs[0],
6310                         ut_params->op);
6311         TEST_ASSERT_NOT_NULL(ut_params->op, "no crypto operation returned");
6312
6313         TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
6314                         "crypto operation processing failed");
6315
6316         /* Validate obuf */
6317         TEST_ASSERT_BUFFERS_ARE_EQUAL(
6318                         rte_pktmbuf_mtod(ut_params->op->sym->m_src, uint8_t *),
6319                         catch_22_quote,
6320                         QUOTE_512_BYTES,
6321                         "Ciphertext data not as expected");
6322
6323         return TEST_SUCCESS;
6324 }
6325
6326 static int
6327 test_null_auth_cipher_operation(void)
6328 {
6329         struct crypto_testsuite_params *ts_params = &testsuite_params;
6330         struct crypto_unittest_params *ut_params = &unittest_params;
6331
6332         /* Generate test mbuf data and space for digest */
6333         ut_params->ibuf = setup_test_string(ts_params->mbuf_pool,
6334                         catch_22_quote, QUOTE_512_BYTES, 0);
6335
6336         /* Setup Cipher Parameters */
6337         ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
6338         ut_params->cipher_xform.next = NULL;
6339
6340         ut_params->cipher_xform.cipher.algo = RTE_CRYPTO_CIPHER_NULL;
6341         ut_params->cipher_xform.cipher.op = RTE_CRYPTO_CIPHER_OP_ENCRYPT;
6342
6343         /* Setup HMAC Parameters */
6344         ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;
6345         ut_params->auth_xform.next = &ut_params->cipher_xform;
6346
6347         ut_params->auth_xform.auth.algo = RTE_CRYPTO_AUTH_NULL;
6348         ut_params->auth_xform.auth.op = RTE_CRYPTO_AUTH_OP_GENERATE;
6349
6350         ut_params->sess = rte_cryptodev_sym_session_create(
6351                         ts_params->session_mpool);
6352
6353         /* Create Crypto session*/
6354         rte_cryptodev_sym_session_init(ts_params->valid_devs[0],
6355                         ut_params->sess, &ut_params->cipher_xform,
6356                         ts_params->session_mpool);
6357         TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed");
6358
6359         /* Generate Crypto op data structure */
6360         ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
6361                         RTE_CRYPTO_OP_TYPE_SYMMETRIC);
6362         TEST_ASSERT_NOT_NULL(ut_params->op,
6363                         "Failed to allocate symmetric crypto operation struct");
6364
6365         /* Set crypto operation data parameters */
6366         rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
6367
6368         struct rte_crypto_sym_op *sym_op = ut_params->op->sym;
6369
6370         sym_op->m_src = ut_params->ibuf;
6371
6372         sym_op->cipher.data.offset = 0;
6373         sym_op->cipher.data.length = QUOTE_512_BYTES;
6374
6375         sym_op->auth.data.offset = 0;
6376         sym_op->auth.data.length = QUOTE_512_BYTES;
6377
6378         /* Process crypto operation */
6379         ut_params->op = process_crypto_request(ts_params->valid_devs[0],
6380                         ut_params->op);
6381         TEST_ASSERT_NOT_NULL(ut_params->op, "no crypto operation returned");
6382
6383         TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
6384                         "crypto operation processing failed");
6385
6386         /* Validate obuf */
6387         TEST_ASSERT_BUFFERS_ARE_EQUAL(
6388                         rte_pktmbuf_mtod(ut_params->op->sym->m_src, uint8_t *),
6389                         catch_22_quote,
6390                         QUOTE_512_BYTES,
6391                         "Ciphertext data not as expected");
6392
6393         return TEST_SUCCESS;
6394 }
6395
6396
6397 static int
6398 test_null_invalid_operation(void)
6399 {
6400         struct crypto_testsuite_params *ts_params = &testsuite_params;
6401         struct crypto_unittest_params *ut_params = &unittest_params;
6402         int ret;
6403
6404         /* Setup Cipher Parameters */
6405         ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
6406         ut_params->cipher_xform.next = NULL;
6407
6408         ut_params->cipher_xform.cipher.algo = RTE_CRYPTO_CIPHER_AES_CBC;
6409         ut_params->cipher_xform.cipher.op = RTE_CRYPTO_CIPHER_OP_ENCRYPT;
6410
6411         ut_params->sess = rte_cryptodev_sym_session_create(
6412                         ts_params->session_mpool);
6413
6414         /* Create Crypto session*/
6415         ret = rte_cryptodev_sym_session_init(ts_params->valid_devs[0],
6416                         ut_params->sess, &ut_params->cipher_xform,
6417                         ts_params->session_mpool);
6418         TEST_ASSERT(ret < 0,
6419                         "Session creation succeeded unexpectedly");
6420
6421
6422         /* Setup HMAC Parameters */
6423         ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;
6424         ut_params->auth_xform.next = NULL;
6425
6426         ut_params->auth_xform.auth.algo = RTE_CRYPTO_AUTH_SHA1_HMAC;
6427         ut_params->auth_xform.auth.op = RTE_CRYPTO_AUTH_OP_GENERATE;
6428
6429         ut_params->sess = rte_cryptodev_sym_session_create(
6430                         ts_params->session_mpool);
6431
6432         /* Create Crypto session*/
6433         ret = rte_cryptodev_sym_session_init(ts_params->valid_devs[0],
6434                         ut_params->sess, &ut_params->auth_xform,
6435                         ts_params->session_mpool);
6436         TEST_ASSERT(ret < 0,
6437                         "Session creation succeeded unexpectedly");
6438
6439         return TEST_SUCCESS;
6440 }
6441
6442
6443 #define NULL_BURST_LENGTH (32)
6444
6445 static int
6446 test_null_burst_operation(void)
6447 {
6448         struct crypto_testsuite_params *ts_params = &testsuite_params;
6449         struct crypto_unittest_params *ut_params = &unittest_params;
6450
6451         unsigned i, burst_len = NULL_BURST_LENGTH;
6452
6453         struct rte_crypto_op *burst[NULL_BURST_LENGTH] = { NULL };
6454         struct rte_crypto_op *burst_dequeued[NULL_BURST_LENGTH] = { NULL };
6455
6456         /* Setup Cipher Parameters */
6457         ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
6458         ut_params->cipher_xform.next = &ut_params->auth_xform;
6459
6460         ut_params->cipher_xform.cipher.algo = RTE_CRYPTO_CIPHER_NULL;
6461         ut_params->cipher_xform.cipher.op = RTE_CRYPTO_CIPHER_OP_ENCRYPT;
6462
6463         /* Setup HMAC Parameters */
6464         ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;
6465         ut_params->auth_xform.next = NULL;
6466
6467         ut_params->auth_xform.auth.algo = RTE_CRYPTO_AUTH_NULL;
6468         ut_params->auth_xform.auth.op = RTE_CRYPTO_AUTH_OP_GENERATE;
6469
6470         ut_params->sess = rte_cryptodev_sym_session_create(
6471                         ts_params->session_mpool);
6472
6473         /* Create Crypto session*/
6474         rte_cryptodev_sym_session_init(ts_params->valid_devs[0],
6475                         ut_params->sess, &ut_params->cipher_xform,
6476                         ts_params->session_mpool);
6477         TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed");
6478
6479         TEST_ASSERT_EQUAL(rte_crypto_op_bulk_alloc(ts_params->op_mpool,
6480                         RTE_CRYPTO_OP_TYPE_SYMMETRIC, burst, burst_len),
6481                         burst_len, "failed to generate burst of crypto ops");
6482
6483         /* Generate an operation for each mbuf in burst */
6484         for (i = 0; i < burst_len; i++) {
6485                 struct rte_mbuf *m = rte_pktmbuf_alloc(ts_params->mbuf_pool);
6486
6487                 TEST_ASSERT_NOT_NULL(m, "Failed to allocate mbuf");
6488
6489                 unsigned *data = (unsigned *)rte_pktmbuf_append(m,
6490                                 sizeof(unsigned));
6491                 *data = i;
6492
6493                 rte_crypto_op_attach_sym_session(burst[i], ut_params->sess);
6494
6495                 burst[i]->sym->m_src = m;
6496         }
6497
6498         /* Process crypto operation */
6499         TEST_ASSERT_EQUAL(rte_cryptodev_enqueue_burst(ts_params->valid_devs[0],
6500                         0, burst, burst_len),
6501                         burst_len,
6502                         "Error enqueuing burst");
6503
6504         TEST_ASSERT_EQUAL(rte_cryptodev_dequeue_burst(ts_params->valid_devs[0],
6505                         0, burst_dequeued, burst_len),
6506                         burst_len,
6507                         "Error dequeuing burst");
6508
6509
6510         for (i = 0; i < burst_len; i++) {
6511                 TEST_ASSERT_EQUAL(
6512                         *rte_pktmbuf_mtod(burst[i]->sym->m_src, uint32_t *),
6513                         *rte_pktmbuf_mtod(burst_dequeued[i]->sym->m_src,
6514                                         uint32_t *),
6515                         "data not as expected");
6516
6517                 rte_pktmbuf_free(burst[i]->sym->m_src);
6518                 rte_crypto_op_free(burst[i]);
6519         }
6520
6521         return TEST_SUCCESS;
6522 }
6523
6524 static void
6525 generate_gmac_large_plaintext(uint8_t *data)
6526 {
6527         uint16_t i;
6528
6529         for (i = 32; i < GMAC_LARGE_PLAINTEXT_LENGTH; i += 32)
6530                 memcpy(&data[i], &data[0], 32);
6531 }
6532
6533 static int
6534 create_gmac_operation(enum rte_crypto_auth_operation op,
6535                 const struct gmac_test_data *tdata)
6536 {
6537         struct crypto_testsuite_params *ts_params = &testsuite_params;
6538         struct crypto_unittest_params *ut_params = &unittest_params;
6539         struct rte_crypto_sym_op *sym_op;
6540
6541         uint32_t plaintext_pad_len = RTE_ALIGN_CEIL(tdata->plaintext.len, 16);
6542
6543         /* Generate Crypto op data structure */
6544         ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
6545                         RTE_CRYPTO_OP_TYPE_SYMMETRIC);
6546         TEST_ASSERT_NOT_NULL(ut_params->op,
6547                         "Failed to allocate symmetric crypto operation struct");
6548
6549         sym_op = ut_params->op->sym;
6550
6551         sym_op->auth.digest.data = (uint8_t *)rte_pktmbuf_append(
6552                         ut_params->ibuf, tdata->gmac_tag.len);
6553         TEST_ASSERT_NOT_NULL(sym_op->auth.digest.data,
6554                         "no room to append digest");
6555
6556         sym_op->auth.digest.phys_addr = rte_pktmbuf_mtophys_offset(
6557                         ut_params->ibuf, plaintext_pad_len);
6558
6559         if (op == RTE_CRYPTO_AUTH_OP_VERIFY) {
6560                 rte_memcpy(sym_op->auth.digest.data, tdata->gmac_tag.data,
6561                                 tdata->gmac_tag.len);
6562                 TEST_HEXDUMP(stdout, "digest:",
6563                                 sym_op->auth.digest.data,
6564                                 tdata->gmac_tag.len);
6565         }
6566
6567         uint8_t *iv_ptr = rte_crypto_op_ctod_offset(ut_params->op,
6568                         uint8_t *, IV_OFFSET);
6569
6570         rte_memcpy(iv_ptr, tdata->iv.data, tdata->iv.len);
6571
6572         TEST_HEXDUMP(stdout, "iv:", iv_ptr, tdata->iv.len);
6573
6574         sym_op->cipher.data.length = 0;
6575         sym_op->cipher.data.offset = 0;
6576
6577         sym_op->auth.data.offset = 0;
6578         sym_op->auth.data.length = tdata->plaintext.len;
6579
6580         return 0;
6581 }
6582
6583 static int create_gmac_session(uint8_t dev_id,
6584                 const struct gmac_test_data *tdata,
6585                 enum rte_crypto_auth_operation auth_op)
6586 {
6587         uint8_t auth_key[tdata->key.len];
6588
6589         struct crypto_testsuite_params *ts_params = &testsuite_params;
6590         struct crypto_unittest_params *ut_params = &unittest_params;
6591
6592         memcpy(auth_key, tdata->key.data, tdata->key.len);
6593
6594         ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;
6595         ut_params->auth_xform.next = NULL;
6596
6597         ut_params->auth_xform.auth.algo = RTE_CRYPTO_AUTH_AES_GMAC;
6598         ut_params->auth_xform.auth.op = auth_op;
6599         ut_params->auth_xform.auth.digest_length = tdata->gmac_tag.len;
6600         ut_params->auth_xform.auth.key.length = tdata->key.len;
6601         ut_params->auth_xform.auth.key.data = auth_key;
6602         ut_params->auth_xform.auth.iv.offset = IV_OFFSET;
6603         ut_params->auth_xform.auth.iv.length = tdata->iv.len;
6604
6605
6606         ut_params->sess = rte_cryptodev_sym_session_create(
6607                         ts_params->session_mpool);
6608
6609         rte_cryptodev_sym_session_init(dev_id, ut_params->sess,
6610                         &ut_params->auth_xform,
6611                         ts_params->session_mpool);
6612
6613         TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed");
6614
6615         return 0;
6616 }
6617
6618 static int
6619 test_AES_GMAC_authentication(const struct gmac_test_data *tdata)
6620 {
6621         struct crypto_testsuite_params *ts_params = &testsuite_params;
6622         struct crypto_unittest_params *ut_params = &unittest_params;
6623
6624         int retval;
6625
6626         uint8_t *auth_tag, *plaintext;
6627         uint16_t plaintext_pad_len;
6628
6629         TEST_ASSERT_NOT_EQUAL(tdata->gmac_tag.len, 0,
6630                               "No GMAC length in the source data");
6631
6632         retval = create_gmac_session(ts_params->valid_devs[0],
6633                         tdata, RTE_CRYPTO_AUTH_OP_GENERATE);
6634
6635         if (retval < 0)
6636                 return retval;
6637
6638         if (tdata->plaintext.len > MBUF_SIZE)
6639                 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->large_mbuf_pool);
6640         else
6641                 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
6642         TEST_ASSERT_NOT_NULL(ut_params->ibuf,
6643                         "Failed to allocate input buffer in mempool");
6644
6645         memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
6646                         rte_pktmbuf_tailroom(ut_params->ibuf));
6647
6648         plaintext_pad_len = RTE_ALIGN_CEIL(tdata->plaintext.len, 16);
6649         /*
6650          * Runtime generate the large plain text instead of use hard code
6651          * plain text vector. It is done to avoid create huge source file
6652          * with the test vector.
6653          */
6654         if (tdata->plaintext.len == GMAC_LARGE_PLAINTEXT_LENGTH)
6655                 generate_gmac_large_plaintext(tdata->plaintext.data);
6656
6657         plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
6658                                 plaintext_pad_len);
6659         TEST_ASSERT_NOT_NULL(plaintext, "no room to append plaintext");
6660
6661         memcpy(plaintext, tdata->plaintext.data, tdata->plaintext.len);
6662         TEST_HEXDUMP(stdout, "plaintext:", plaintext,
6663                         tdata->plaintext.len);
6664
6665         retval = create_gmac_operation(RTE_CRYPTO_AUTH_OP_GENERATE,
6666                         tdata);
6667
6668         if (retval < 0)
6669                 return retval;
6670
6671         rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
6672
6673         ut_params->op->sym->m_src = ut_params->ibuf;
6674
6675         TEST_ASSERT_NOT_NULL(process_crypto_request(ts_params->valid_devs[0],
6676                         ut_params->op), "failed to process sym crypto op");
6677
6678         TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
6679                         "crypto op processing failed");
6680
6681         if (ut_params->op->sym->m_dst) {
6682                 auth_tag = rte_pktmbuf_mtod_offset(ut_params->op->sym->m_dst,
6683                                 uint8_t *, plaintext_pad_len);
6684         } else {
6685                 auth_tag = plaintext + plaintext_pad_len;
6686         }
6687
6688         TEST_HEXDUMP(stdout, "auth tag:", auth_tag, tdata->gmac_tag.len);
6689
6690         TEST_ASSERT_BUFFERS_ARE_EQUAL(
6691                         auth_tag,
6692                         tdata->gmac_tag.data,
6693                         tdata->gmac_tag.len,
6694                         "GMAC Generated auth tag not as expected");
6695
6696         return 0;
6697 }
6698
6699 static int
6700 test_AES_GMAC_authentication_test_case_1(void)
6701 {
6702         return test_AES_GMAC_authentication(&gmac_test_case_1);
6703 }
6704
6705 static int
6706 test_AES_GMAC_authentication_test_case_2(void)
6707 {
6708         return test_AES_GMAC_authentication(&gmac_test_case_2);
6709 }
6710
6711 static int
6712 test_AES_GMAC_authentication_test_case_3(void)
6713 {
6714         return test_AES_GMAC_authentication(&gmac_test_case_3);
6715 }
6716
6717 static int
6718 test_AES_GMAC_authentication_test_case_4(void)
6719 {
6720         return test_AES_GMAC_authentication(&gmac_test_case_4);
6721 }
6722
6723 static int
6724 test_AES_GMAC_authentication_verify(const struct gmac_test_data *tdata)
6725 {
6726         struct crypto_testsuite_params *ts_params = &testsuite_params;
6727         struct crypto_unittest_params *ut_params = &unittest_params;
6728         int retval;
6729         uint32_t plaintext_pad_len;
6730         uint8_t *plaintext;
6731
6732         TEST_ASSERT_NOT_EQUAL(tdata->gmac_tag.len, 0,
6733                               "No GMAC length in the source data");
6734
6735         retval = create_gmac_session(ts_params->valid_devs[0],
6736                         tdata, RTE_CRYPTO_AUTH_OP_VERIFY);
6737
6738         if (retval < 0)
6739                 return retval;
6740
6741         if (tdata->plaintext.len > MBUF_SIZE)
6742                 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->large_mbuf_pool);
6743         else
6744                 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
6745         TEST_ASSERT_NOT_NULL(ut_params->ibuf,
6746                         "Failed to allocate input buffer in mempool");
6747
6748         memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
6749                         rte_pktmbuf_tailroom(ut_params->ibuf));
6750
6751         plaintext_pad_len = RTE_ALIGN_CEIL(tdata->plaintext.len, 16);
6752
6753         /*
6754          * Runtime generate the large plain text instead of use hard code
6755          * plain text vector. It is done to avoid create huge source file
6756          * with the test vector.
6757          */
6758         if (tdata->plaintext.len == GMAC_LARGE_PLAINTEXT_LENGTH)
6759                 generate_gmac_large_plaintext(tdata->plaintext.data);
6760
6761         plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
6762                                 plaintext_pad_len);
6763         TEST_ASSERT_NOT_NULL(plaintext, "no room to append plaintext");
6764
6765         memcpy(plaintext, tdata->plaintext.data, tdata->plaintext.len);
6766         TEST_HEXDUMP(stdout, "plaintext:", plaintext,
6767                         tdata->plaintext.len);
6768
6769         retval = create_gmac_operation(RTE_CRYPTO_AUTH_OP_VERIFY,
6770                         tdata);
6771
6772         if (retval < 0)
6773                 return retval;
6774
6775         rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
6776
6777         ut_params->op->sym->m_src = ut_params->ibuf;
6778
6779         TEST_ASSERT_NOT_NULL(process_crypto_request(ts_params->valid_devs[0],
6780                         ut_params->op), "failed to process sym crypto op");
6781
6782         TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
6783                         "crypto op processing failed");
6784
6785         return 0;
6786
6787 }
6788
6789 static int
6790 test_AES_GMAC_authentication_verify_test_case_1(void)
6791 {
6792         return test_AES_GMAC_authentication_verify(&gmac_test_case_1);
6793 }
6794
6795 static int
6796 test_AES_GMAC_authentication_verify_test_case_2(void)
6797 {
6798         return test_AES_GMAC_authentication_verify(&gmac_test_case_2);
6799 }
6800
6801 static int
6802 test_AES_GMAC_authentication_verify_test_case_3(void)
6803 {
6804         return test_AES_GMAC_authentication_verify(&gmac_test_case_3);
6805 }
6806
6807 static int
6808 test_AES_GMAC_authentication_verify_test_case_4(void)
6809 {
6810         return test_AES_GMAC_authentication_verify(&gmac_test_case_4);
6811 }
6812
6813 struct test_crypto_vector {
6814         enum rte_crypto_cipher_algorithm crypto_algo;
6815
6816         struct {
6817                 uint8_t data[64];
6818                 unsigned int len;
6819         } cipher_key;
6820
6821         struct {
6822                 uint8_t data[64];
6823                 unsigned int len;
6824         } iv;
6825
6826         struct {
6827                 const uint8_t *data;
6828                 unsigned int len;
6829         } plaintext;
6830
6831         struct {
6832                 const uint8_t *data;
6833                 unsigned int len;
6834         } ciphertext;
6835
6836         enum rte_crypto_auth_algorithm auth_algo;
6837
6838         struct {
6839                 uint8_t data[128];
6840                 unsigned int len;
6841         } auth_key;
6842
6843         struct {
6844                 const uint8_t *data;
6845                 unsigned int len;
6846         } aad;
6847
6848         struct {
6849                 uint8_t data[128];
6850                 unsigned int len;
6851         } digest;
6852 };
6853
6854 static const struct test_crypto_vector
6855 hmac_sha1_test_crypto_vector = {
6856         .auth_algo = RTE_CRYPTO_AUTH_SHA1_HMAC,
6857         .plaintext = {
6858                 .data = plaintext_hash,
6859                 .len = 512
6860         },
6861         .auth_key = {
6862                 .data = {
6863                         0xF8, 0x2A, 0xC7, 0x54, 0xDB, 0x96, 0x18, 0xAA,
6864                         0xC3, 0xA1, 0x53, 0xF6, 0x1F, 0x17, 0x60, 0xBD,
6865                         0xDE, 0xF4, 0xDE, 0xAD
6866                 },
6867                 .len = 20
6868         },
6869         .digest = {
6870                 .data = {
6871                         0xC4, 0xB7, 0x0E, 0x6B, 0xDE, 0xD1, 0xE7, 0x77,
6872                         0x7E, 0x2E, 0x8F, 0xFC, 0x48, 0x39, 0x46, 0x17,
6873                         0x3F, 0x91, 0x64, 0x59
6874                 },
6875                 .len = 20
6876         }
6877 };
6878
6879 static const struct test_crypto_vector
6880 aes128_gmac_test_vector = {
6881         .auth_algo = RTE_CRYPTO_AUTH_AES_GMAC,
6882         .plaintext = {
6883                 .data = plaintext_hash,
6884                 .len = 512
6885         },
6886         .iv = {
6887                 .data = {
6888                         0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
6889                         0x08, 0x09, 0x0A, 0x0B
6890                 },
6891                 .len = 12
6892         },
6893         .auth_key = {
6894                 .data = {
6895                         0x42, 0x1A, 0x7D, 0x3D, 0xF5, 0x82, 0x80, 0xF1,
6896                         0xF1, 0x35, 0x5C, 0x3B, 0xDD, 0x9A, 0x65, 0xBA
6897                 },
6898                 .len = 16
6899         },
6900         .digest = {
6901                 .data = {
6902                         0xCA, 0x00, 0x99, 0x8B, 0x30, 0x7E, 0x74, 0x56,
6903                         0x32, 0xA7, 0x87, 0xB5, 0xE9, 0xB2, 0x34, 0x5A
6904                 },
6905                 .len = 16
6906         }
6907 };
6908
6909 static const struct test_crypto_vector
6910 aes128cbc_hmac_sha1_test_vector = {
6911         .crypto_algo = RTE_CRYPTO_CIPHER_AES_CBC,
6912         .cipher_key = {
6913                 .data = {
6914                         0xE4, 0x23, 0x33, 0x8A, 0x35, 0x64, 0x61, 0xE2,
6915                         0x49, 0x03, 0xDD, 0xC6, 0xB8, 0xCA, 0x55, 0x7A
6916                 },
6917                 .len = 16
6918         },
6919         .iv = {
6920                 .data = {
6921                         0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
6922                         0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F
6923                 },
6924                 .len = 16
6925         },
6926         .plaintext = {
6927                 .data = plaintext_hash,
6928                 .len = 512
6929         },
6930         .ciphertext = {
6931                 .data = ciphertext512_aes128cbc,
6932                 .len = 512
6933         },
6934         .auth_algo = RTE_CRYPTO_AUTH_SHA1_HMAC,
6935         .auth_key = {
6936                 .data = {
6937                         0xF8, 0x2A, 0xC7, 0x54, 0xDB, 0x96, 0x18, 0xAA,
6938                         0xC3, 0xA1, 0x53, 0xF6, 0x1F, 0x17, 0x60, 0xBD,
6939                         0xDE, 0xF4, 0xDE, 0xAD
6940                 },
6941                 .len = 20
6942         },
6943         .digest = {
6944                 .data = {
6945                         0x9A, 0x4F, 0x88, 0x1B, 0xB6, 0x8F, 0xD8, 0x60,
6946                         0x42, 0x1A, 0x7D, 0x3D, 0xF5, 0x82, 0x80, 0xF1,
6947                         0x18, 0x8C, 0x1D, 0x32
6948                 },
6949                 .len = 20
6950         }
6951 };
6952
6953 static void
6954 data_corruption(uint8_t *data)
6955 {
6956         data[0] += 1;
6957 }
6958
6959 static void
6960 tag_corruption(uint8_t *data, unsigned int tag_offset)
6961 {
6962         data[tag_offset] += 1;
6963 }
6964
6965 static int
6966 create_auth_session(struct crypto_unittest_params *ut_params,
6967                 uint8_t dev_id,
6968                 const struct test_crypto_vector *reference,
6969                 enum rte_crypto_auth_operation auth_op)
6970 {
6971         struct crypto_testsuite_params *ts_params = &testsuite_params;
6972         uint8_t auth_key[reference->auth_key.len + 1];
6973
6974         memcpy(auth_key, reference->auth_key.data, reference->auth_key.len);
6975
6976         /* Setup Authentication Parameters */
6977         ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;
6978         ut_params->auth_xform.auth.op = auth_op;
6979         ut_params->auth_xform.next = NULL;
6980         ut_params->auth_xform.auth.algo = reference->auth_algo;
6981         ut_params->auth_xform.auth.key.length = reference->auth_key.len;
6982         ut_params->auth_xform.auth.key.data = auth_key;
6983         ut_params->auth_xform.auth.digest_length = reference->digest.len;
6984
6985         /* Create Crypto session*/
6986         ut_params->sess = rte_cryptodev_sym_session_create(
6987                         ts_params->session_mpool);
6988
6989         rte_cryptodev_sym_session_init(dev_id, ut_params->sess,
6990                                 &ut_params->auth_xform,
6991                                 ts_params->session_mpool);
6992
6993         TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed");
6994
6995         return 0;
6996 }
6997
6998 static int
6999 create_auth_cipher_session(struct crypto_unittest_params *ut_params,
7000                 uint8_t dev_id,
7001                 const struct test_crypto_vector *reference,
7002                 enum rte_crypto_auth_operation auth_op,
7003                 enum rte_crypto_cipher_operation cipher_op)
7004 {
7005         struct crypto_testsuite_params *ts_params = &testsuite_params;
7006         uint8_t cipher_key[reference->cipher_key.len + 1];
7007         uint8_t auth_key[reference->auth_key.len + 1];
7008
7009         memcpy(cipher_key, reference->cipher_key.data,
7010                         reference->cipher_key.len);
7011         memcpy(auth_key, reference->auth_key.data, reference->auth_key.len);
7012
7013         /* Setup Authentication Parameters */
7014         ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;
7015         ut_params->auth_xform.auth.op = auth_op;
7016         ut_params->auth_xform.auth.algo = reference->auth_algo;
7017         ut_params->auth_xform.auth.key.length = reference->auth_key.len;
7018         ut_params->auth_xform.auth.key.data = auth_key;
7019         ut_params->auth_xform.auth.digest_length = reference->digest.len;
7020
7021         if (reference->auth_algo == RTE_CRYPTO_AUTH_AES_GMAC) {
7022                 ut_params->auth_xform.auth.iv.offset = IV_OFFSET;
7023                 ut_params->auth_xform.auth.iv.length = reference->iv.len;
7024         } else {
7025                 ut_params->auth_xform.next = &ut_params->cipher_xform;
7026
7027                 /* Setup Cipher Parameters */
7028                 ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
7029                 ut_params->cipher_xform.next = NULL;
7030                 ut_params->cipher_xform.cipher.algo = reference->crypto_algo;
7031                 ut_params->cipher_xform.cipher.op = cipher_op;
7032                 ut_params->cipher_xform.cipher.key.data = cipher_key;
7033                 ut_params->cipher_xform.cipher.key.length = reference->cipher_key.len;
7034                 ut_params->cipher_xform.cipher.iv.offset = IV_OFFSET;
7035                 ut_params->cipher_xform.cipher.iv.length = reference->iv.len;
7036         }
7037
7038         /* Create Crypto session*/
7039         ut_params->sess = rte_cryptodev_sym_session_create(
7040                         ts_params->session_mpool);
7041
7042         rte_cryptodev_sym_session_init(dev_id, ut_params->sess,
7043                                 &ut_params->auth_xform,
7044                                 ts_params->session_mpool);
7045
7046         TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed");
7047
7048         return 0;
7049 }
7050
7051 static int
7052 create_auth_operation(struct crypto_testsuite_params *ts_params,
7053                 struct crypto_unittest_params *ut_params,
7054                 const struct test_crypto_vector *reference,
7055                 unsigned int auth_generate)
7056 {
7057         /* Generate Crypto op data structure */
7058         ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
7059                         RTE_CRYPTO_OP_TYPE_SYMMETRIC);
7060         TEST_ASSERT_NOT_NULL(ut_params->op,
7061                         "Failed to allocate pktmbuf offload");
7062
7063         /* Set crypto operation data parameters */
7064         rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
7065
7066         struct rte_crypto_sym_op *sym_op = ut_params->op->sym;
7067
7068         /* set crypto operation source mbuf */
7069         sym_op->m_src = ut_params->ibuf;
7070
7071         /* digest */
7072         sym_op->auth.digest.data = (uint8_t *)rte_pktmbuf_append(
7073                         ut_params->ibuf, reference->digest.len);
7074
7075         TEST_ASSERT_NOT_NULL(sym_op->auth.digest.data,
7076                         "no room to append auth tag");
7077
7078         sym_op->auth.digest.phys_addr = rte_pktmbuf_mtophys_offset(
7079                         ut_params->ibuf, reference->plaintext.len);
7080
7081         if (auth_generate)
7082                 memset(sym_op->auth.digest.data, 0, reference->digest.len);
7083         else
7084                 memcpy(sym_op->auth.digest.data,
7085                                 reference->digest.data,
7086                                 reference->digest.len);
7087
7088         TEST_HEXDUMP(stdout, "digest:",
7089                         sym_op->auth.digest.data,
7090                         reference->digest.len);
7091
7092         sym_op->auth.data.length = reference->plaintext.len;
7093         sym_op->auth.data.offset = 0;
7094
7095         return 0;
7096 }
7097
7098 static int
7099 create_auth_GMAC_operation(struct crypto_testsuite_params *ts_params,
7100                 struct crypto_unittest_params *ut_params,
7101                 const struct test_crypto_vector *reference,
7102                 unsigned int auth_generate)
7103 {
7104         /* Generate Crypto op data structure */
7105         ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
7106                         RTE_CRYPTO_OP_TYPE_SYMMETRIC);
7107         TEST_ASSERT_NOT_NULL(ut_params->op,
7108                         "Failed to allocate pktmbuf offload");
7109
7110         /* Set crypto operation data parameters */
7111         rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
7112
7113         struct rte_crypto_sym_op *sym_op = ut_params->op->sym;
7114
7115         /* set crypto operation source mbuf */
7116         sym_op->m_src = ut_params->ibuf;
7117
7118         /* digest */
7119         sym_op->auth.digest.data = (uint8_t *)rte_pktmbuf_append(
7120                         ut_params->ibuf, reference->digest.len);
7121
7122         TEST_ASSERT_NOT_NULL(sym_op->auth.digest.data,
7123                         "no room to append auth tag");
7124
7125         sym_op->auth.digest.phys_addr = rte_pktmbuf_mtophys_offset(
7126                         ut_params->ibuf, reference->ciphertext.len);
7127
7128         if (auth_generate)
7129                 memset(sym_op->auth.digest.data, 0, reference->digest.len);
7130         else
7131                 memcpy(sym_op->auth.digest.data,
7132                                 reference->digest.data,
7133                                 reference->digest.len);
7134
7135         TEST_HEXDUMP(stdout, "digest:",
7136                         sym_op->auth.digest.data,
7137                         reference->digest.len);
7138
7139         rte_memcpy(rte_crypto_op_ctod_offset(ut_params->op, uint8_t *, IV_OFFSET),
7140                         reference->iv.data, reference->iv.len);
7141
7142         sym_op->cipher.data.length = 0;
7143         sym_op->cipher.data.offset = 0;
7144
7145         sym_op->auth.data.length = reference->plaintext.len;
7146         sym_op->auth.data.offset = 0;
7147
7148         return 0;
7149 }
7150
7151 static int
7152 create_cipher_auth_operation(struct crypto_testsuite_params *ts_params,
7153                 struct crypto_unittest_params *ut_params,
7154                 const struct test_crypto_vector *reference,
7155                 unsigned int auth_generate)
7156 {
7157         /* Generate Crypto op data structure */
7158         ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
7159                         RTE_CRYPTO_OP_TYPE_SYMMETRIC);
7160         TEST_ASSERT_NOT_NULL(ut_params->op,
7161                         "Failed to allocate pktmbuf offload");
7162
7163         /* Set crypto operation data parameters */
7164         rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
7165
7166         struct rte_crypto_sym_op *sym_op = ut_params->op->sym;
7167
7168         /* set crypto operation source mbuf */
7169         sym_op->m_src = ut_params->ibuf;
7170
7171         /* digest */
7172         sym_op->auth.digest.data = (uint8_t *)rte_pktmbuf_append(
7173                         ut_params->ibuf, reference->digest.len);
7174
7175         TEST_ASSERT_NOT_NULL(sym_op->auth.digest.data,
7176                         "no room to append auth tag");
7177
7178         sym_op->auth.digest.phys_addr = rte_pktmbuf_mtophys_offset(
7179                         ut_params->ibuf, reference->ciphertext.len);
7180
7181         if (auth_generate)
7182                 memset(sym_op->auth.digest.data, 0, reference->digest.len);
7183         else
7184                 memcpy(sym_op->auth.digest.data,
7185                                 reference->digest.data,
7186                                 reference->digest.len);
7187
7188         TEST_HEXDUMP(stdout, "digest:",
7189                         sym_op->auth.digest.data,
7190                         reference->digest.len);
7191
7192         rte_memcpy(rte_crypto_op_ctod_offset(ut_params->op, uint8_t *, IV_OFFSET),
7193                         reference->iv.data, reference->iv.len);
7194
7195         sym_op->cipher.data.length = reference->ciphertext.len;
7196         sym_op->cipher.data.offset = 0;
7197
7198         sym_op->auth.data.length = reference->ciphertext.len;
7199         sym_op->auth.data.offset = 0;
7200
7201         return 0;
7202 }
7203
7204 static int
7205 create_auth_verify_operation(struct crypto_testsuite_params *ts_params,
7206                 struct crypto_unittest_params *ut_params,
7207                 const struct test_crypto_vector *reference)
7208 {
7209         return create_auth_operation(ts_params, ut_params, reference, 0);
7210 }
7211
7212 static int
7213 create_auth_verify_GMAC_operation(
7214                 struct crypto_testsuite_params *ts_params,
7215                 struct crypto_unittest_params *ut_params,
7216                 const struct test_crypto_vector *reference)
7217 {
7218         return create_auth_GMAC_operation(ts_params, ut_params, reference, 0);
7219 }
7220
7221 static int
7222 create_cipher_auth_verify_operation(struct crypto_testsuite_params *ts_params,
7223                 struct crypto_unittest_params *ut_params,
7224                 const struct test_crypto_vector *reference)
7225 {
7226         return create_cipher_auth_operation(ts_params, ut_params, reference, 0);
7227 }
7228
7229 static int
7230 test_authentication_verify_fail_when_data_corruption(
7231                 struct crypto_testsuite_params *ts_params,
7232                 struct crypto_unittest_params *ut_params,
7233                 const struct test_crypto_vector *reference,
7234                 unsigned int data_corrupted)
7235 {
7236         int retval;
7237
7238         uint8_t *plaintext;
7239
7240         /* Create session */
7241         retval = create_auth_session(ut_params,
7242                         ts_params->valid_devs[0],
7243                         reference,
7244                         RTE_CRYPTO_AUTH_OP_VERIFY);
7245         if (retval < 0)
7246                 return retval;
7247
7248         ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
7249         TEST_ASSERT_NOT_NULL(ut_params->ibuf,
7250                         "Failed to allocate input buffer in mempool");
7251
7252         /* clear mbuf payload */
7253         memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
7254                         rte_pktmbuf_tailroom(ut_params->ibuf));
7255
7256         plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
7257                         reference->plaintext.len);
7258         TEST_ASSERT_NOT_NULL(plaintext, "no room to append plaintext");
7259         memcpy(plaintext, reference->plaintext.data, reference->plaintext.len);
7260
7261         TEST_HEXDUMP(stdout, "plaintext:", plaintext, reference->plaintext.len);
7262
7263         /* Create operation */
7264         retval = create_auth_verify_operation(ts_params, ut_params, reference);
7265
7266         if (retval < 0)
7267                 return retval;
7268
7269         if (data_corrupted)
7270                 data_corruption(plaintext);
7271         else
7272                 tag_corruption(plaintext, reference->plaintext.len);
7273
7274         ut_params->op = process_crypto_request(ts_params->valid_devs[0],
7275                         ut_params->op);
7276         TEST_ASSERT_NOT_NULL(ut_params->op, "failed crypto process");
7277         TEST_ASSERT_EQUAL(ut_params->op->status,
7278                         RTE_CRYPTO_OP_STATUS_AUTH_FAILED,
7279                         "authentication not failed");
7280
7281         ut_params->obuf = ut_params->op->sym->m_src;
7282         TEST_ASSERT_NOT_NULL(ut_params->obuf, "failed to retrieve obuf");
7283
7284         return 0;
7285 }
7286
7287 static int
7288 test_authentication_verify_GMAC_fail_when_corruption(
7289                 struct crypto_testsuite_params *ts_params,
7290                 struct crypto_unittest_params *ut_params,
7291                 const struct test_crypto_vector *reference,
7292                 unsigned int data_corrupted)
7293 {
7294         int retval;
7295         uint8_t *plaintext;
7296
7297         /* Create session */
7298         retval = create_auth_cipher_session(ut_params,
7299                         ts_params->valid_devs[0],
7300                         reference,
7301                         RTE_CRYPTO_AUTH_OP_VERIFY,
7302                         RTE_CRYPTO_CIPHER_OP_DECRYPT);
7303         if (retval < 0)
7304                 return retval;
7305
7306         ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
7307         TEST_ASSERT_NOT_NULL(ut_params->ibuf,
7308                         "Failed to allocate input buffer in mempool");
7309
7310         /* clear mbuf payload */
7311         memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
7312                         rte_pktmbuf_tailroom(ut_params->ibuf));
7313
7314         plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
7315                         reference->plaintext.len);
7316         TEST_ASSERT_NOT_NULL(plaintext, "no room to append plaintext");
7317         memcpy(plaintext, reference->plaintext.data, reference->plaintext.len);
7318
7319         TEST_HEXDUMP(stdout, "plaintext:", plaintext, reference->plaintext.len);
7320
7321         /* Create operation */
7322         retval = create_auth_verify_GMAC_operation(ts_params,
7323                         ut_params,
7324                         reference);
7325
7326         if (retval < 0)
7327                 return retval;
7328
7329         if (data_corrupted)
7330                 data_corruption(plaintext);
7331         else
7332                 tag_corruption(plaintext, reference->aad.len);
7333
7334         ut_params->op = process_crypto_request(ts_params->valid_devs[0],
7335                         ut_params->op);
7336         TEST_ASSERT_NOT_NULL(ut_params->op, "failed crypto process");
7337         TEST_ASSERT_EQUAL(ut_params->op->status,
7338                         RTE_CRYPTO_OP_STATUS_AUTH_FAILED,
7339                         "authentication not failed");
7340
7341         ut_params->obuf = ut_params->op->sym->m_src;
7342         TEST_ASSERT_NOT_NULL(ut_params->obuf, "failed to retrieve obuf");
7343
7344         return 0;
7345 }
7346
7347 static int
7348 test_authenticated_decryption_fail_when_corruption(
7349                 struct crypto_testsuite_params *ts_params,
7350                 struct crypto_unittest_params *ut_params,
7351                 const struct test_crypto_vector *reference,
7352                 unsigned int data_corrupted)
7353 {
7354         int retval;
7355
7356         uint8_t *ciphertext;
7357
7358         /* Create session */
7359         retval = create_auth_cipher_session(ut_params,
7360                         ts_params->valid_devs[0],
7361                         reference,
7362                         RTE_CRYPTO_AUTH_OP_VERIFY,
7363                         RTE_CRYPTO_CIPHER_OP_DECRYPT);
7364         if (retval < 0)
7365                 return retval;
7366
7367         ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
7368         TEST_ASSERT_NOT_NULL(ut_params->ibuf,
7369                         "Failed to allocate input buffer in mempool");
7370
7371         /* clear mbuf payload */
7372         memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
7373                         rte_pktmbuf_tailroom(ut_params->ibuf));
7374
7375         ciphertext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
7376                         reference->ciphertext.len);
7377         TEST_ASSERT_NOT_NULL(ciphertext, "no room to append ciphertext");
7378         memcpy(ciphertext, reference->ciphertext.data,
7379                         reference->ciphertext.len);
7380
7381         /* Create operation */
7382         retval = create_cipher_auth_verify_operation(ts_params,
7383                         ut_params,
7384                         reference);
7385
7386         if (retval < 0)
7387                 return retval;
7388
7389         if (data_corrupted)
7390                 data_corruption(ciphertext);
7391         else
7392                 tag_corruption(ciphertext, reference->ciphertext.len);
7393
7394         ut_params->op = process_crypto_request(ts_params->valid_devs[0],
7395                         ut_params->op);
7396
7397         TEST_ASSERT_NOT_NULL(ut_params->op, "failed crypto process");
7398         TEST_ASSERT_EQUAL(ut_params->op->status,
7399                         RTE_CRYPTO_OP_STATUS_AUTH_FAILED,
7400                         "authentication not failed");
7401
7402         ut_params->obuf = ut_params->op->sym->m_src;
7403         TEST_ASSERT_NOT_NULL(ut_params->obuf, "failed to retrieve obuf");
7404
7405         return 0;
7406 }
7407
7408 static int
7409 create_gcm_operation_SGL(enum rte_crypto_aead_operation op,
7410                 const struct gcm_test_data *tdata,
7411                 void *digest_mem, uint64_t digest_phys)
7412 {
7413         struct crypto_testsuite_params *ts_params = &testsuite_params;
7414         struct crypto_unittest_params *ut_params = &unittest_params;
7415
7416         const unsigned int auth_tag_len = tdata->auth_tag.len;
7417         const unsigned int iv_len = tdata->iv.len;
7418         const unsigned int aad_len = tdata->aad.len;
7419
7420         /* Generate Crypto op data structure */
7421         ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
7422                         RTE_CRYPTO_OP_TYPE_SYMMETRIC);
7423         TEST_ASSERT_NOT_NULL(ut_params->op,
7424                 "Failed to allocate symmetric crypto operation struct");
7425
7426         struct rte_crypto_sym_op *sym_op = ut_params->op->sym;
7427
7428         sym_op->aead.digest.data = digest_mem;
7429
7430         TEST_ASSERT_NOT_NULL(sym_op->aead.digest.data,
7431                         "no room to append digest");
7432
7433         sym_op->aead.digest.phys_addr = digest_phys;
7434
7435         if (op == RTE_CRYPTO_AEAD_OP_DECRYPT) {
7436                 rte_memcpy(sym_op->aead.digest.data, tdata->auth_tag.data,
7437                                 auth_tag_len);
7438                 TEST_HEXDUMP(stdout, "digest:",
7439                                 sym_op->aead.digest.data,
7440                                 auth_tag_len);
7441         }
7442
7443         uint8_t *iv_ptr = rte_crypto_op_ctod_offset(ut_params->op,
7444                         uint8_t *, IV_OFFSET);
7445
7446         rte_memcpy(iv_ptr, tdata->iv.data, iv_len);
7447
7448         sym_op->aead.aad.data = (uint8_t *)rte_pktmbuf_prepend(
7449                         ut_params->ibuf, aad_len);
7450         TEST_ASSERT_NOT_NULL(sym_op->aead.aad.data,
7451                         "no room to prepend aad");
7452         sym_op->aead.aad.phys_addr = rte_pktmbuf_mtophys(
7453                         ut_params->ibuf);
7454
7455         memset(sym_op->aead.aad.data, 0, aad_len);
7456         rte_memcpy(sym_op->aead.aad.data, tdata->aad.data, aad_len);
7457
7458         TEST_HEXDUMP(stdout, "iv:", iv_ptr, iv_len);
7459         TEST_HEXDUMP(stdout, "aad:",
7460                         sym_op->aead.aad.data, aad_len);
7461
7462         sym_op->aead.data.length = tdata->plaintext.len;
7463         sym_op->aead.data.offset = aad_len;
7464
7465         return 0;
7466 }
7467
7468 #define SGL_MAX_NO      16
7469
7470 static int
7471 test_AES_GCM_authenticated_encryption_SGL(const struct gcm_test_data *tdata,
7472                 const int oop, uint32_t fragsz, uint32_t fragsz_oop)
7473 {
7474         struct crypto_testsuite_params *ts_params = &testsuite_params;
7475         struct crypto_unittest_params *ut_params = &unittest_params;
7476         struct rte_mbuf *buf, *buf_oop = NULL, *buf_last_oop = NULL;
7477         int retval;
7478         int to_trn = 0;
7479         int to_trn_tbl[SGL_MAX_NO];
7480         int segs = 1;
7481         unsigned int trn_data = 0;
7482         uint8_t *plaintext, *ciphertext, *auth_tag;
7483
7484         if (fragsz > tdata->plaintext.len)
7485                 fragsz = tdata->plaintext.len;
7486
7487         uint16_t plaintext_len = fragsz;
7488         uint16_t frag_size_oop = fragsz_oop ? fragsz_oop : fragsz;
7489
7490         if (fragsz_oop > tdata->plaintext.len)
7491                 frag_size_oop = tdata->plaintext.len;
7492
7493         int ecx = 0;
7494         void *digest_mem = NULL;
7495
7496         uint32_t prepend_len = tdata->aad.len;
7497
7498         if (tdata->plaintext.len % fragsz != 0) {
7499                 if (tdata->plaintext.len / fragsz + 1 > SGL_MAX_NO)
7500                         return 1;
7501         }       else {
7502                 if (tdata->plaintext.len / fragsz > SGL_MAX_NO)
7503                         return 1;
7504         }
7505
7506         /*
7507          * For out-op-place we need to alloc another mbuf
7508          */
7509         if (oop) {
7510                 ut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
7511                 rte_pktmbuf_append(ut_params->obuf,
7512                                 frag_size_oop + prepend_len);
7513                 buf_oop = ut_params->obuf;
7514         }
7515
7516         /* Create GCM session */
7517         retval = create_gcm_session(ts_params->valid_devs[0],
7518                         RTE_CRYPTO_AEAD_OP_ENCRYPT,
7519                         tdata->key.data, tdata->key.len,
7520                         tdata->aad.len, tdata->auth_tag.len,
7521                         tdata->iv.len);
7522         if (retval < 0)
7523                 return retval;
7524
7525         ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
7526
7527         /* clear mbuf payload */
7528         memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
7529                         rte_pktmbuf_tailroom(ut_params->ibuf));
7530
7531         plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
7532                         plaintext_len);
7533
7534         memcpy(plaintext, tdata->plaintext.data, plaintext_len);
7535
7536         trn_data += plaintext_len;
7537
7538         buf = ut_params->ibuf;
7539
7540         /*
7541          * Loop until no more fragments
7542          */
7543
7544         while (trn_data < tdata->plaintext.len) {
7545                 ++segs;
7546                 to_trn = (tdata->plaintext.len - trn_data < fragsz) ?
7547                                 (tdata->plaintext.len - trn_data) : fragsz;
7548
7549                 to_trn_tbl[ecx++] = to_trn;
7550
7551                 buf->next = rte_pktmbuf_alloc(ts_params->mbuf_pool);
7552                 buf = buf->next;
7553
7554                 memset(rte_pktmbuf_mtod(buf, uint8_t *), 0,
7555                                 rte_pktmbuf_tailroom(buf));
7556
7557                 /* OOP */
7558                 if (oop && !fragsz_oop) {
7559                         buf_last_oop = buf_oop->next =
7560                                         rte_pktmbuf_alloc(ts_params->mbuf_pool);
7561                         buf_oop = buf_oop->next;
7562                         memset(rte_pktmbuf_mtod(buf_oop, uint8_t *),
7563                                         0, rte_pktmbuf_tailroom(buf_oop));
7564                         rte_pktmbuf_append(buf_oop, to_trn);
7565                 }
7566
7567                 plaintext = (uint8_t *)rte_pktmbuf_append(buf,
7568                                 to_trn);
7569
7570                 memcpy(plaintext, tdata->plaintext.data + trn_data,
7571                                 to_trn);
7572                 trn_data += to_trn;
7573                 if (trn_data  == tdata->plaintext.len) {
7574                         if (oop) {
7575                                 if (!fragsz_oop)
7576                                         digest_mem = rte_pktmbuf_append(buf_oop,
7577                                                 tdata->auth_tag.len);
7578                         } else
7579                                 digest_mem = (uint8_t *)rte_pktmbuf_append(buf,
7580                                         tdata->auth_tag.len);
7581                 }
7582         }
7583
7584         uint64_t digest_phys = 0;
7585
7586         ut_params->ibuf->nb_segs = segs;
7587
7588         segs = 1;
7589         if (fragsz_oop && oop) {
7590                 to_trn = 0;
7591                 ecx = 0;
7592
7593                 if (frag_size_oop == tdata->plaintext.len) {
7594                         digest_mem = rte_pktmbuf_append(ut_params->obuf,
7595                                 tdata->auth_tag.len);
7596
7597                         digest_phys = rte_pktmbuf_mtophys_offset(
7598                                         ut_params->obuf,
7599                                         tdata->plaintext.len + prepend_len);
7600                 }
7601
7602                 trn_data = frag_size_oop;
7603                 while (trn_data < tdata->plaintext.len) {
7604                         ++segs;
7605                         to_trn =
7606                                 (tdata->plaintext.len - trn_data <
7607                                                 frag_size_oop) ?
7608                                 (tdata->plaintext.len - trn_data) :
7609                                                 frag_size_oop;
7610
7611                         to_trn_tbl[ecx++] = to_trn;
7612
7613                         buf_last_oop = buf_oop->next =
7614                                         rte_pktmbuf_alloc(ts_params->mbuf_pool);
7615                         buf_oop = buf_oop->next;
7616                         memset(rte_pktmbuf_mtod(buf_oop, uint8_t *),
7617                                         0, rte_pktmbuf_tailroom(buf_oop));
7618                         rte_pktmbuf_append(buf_oop, to_trn);
7619
7620                         trn_data += to_trn;
7621
7622                         if (trn_data  == tdata->plaintext.len) {
7623                                 digest_mem = rte_pktmbuf_append(buf_oop,
7624                                         tdata->auth_tag.len);
7625                         }
7626                 }
7627
7628                 ut_params->obuf->nb_segs = segs;
7629         }
7630
7631         /*
7632          * Place digest at the end of the last buffer
7633          */
7634         if (!digest_phys)
7635                 digest_phys = rte_pktmbuf_mtophys(buf) + to_trn;
7636         if (oop && buf_last_oop)
7637                 digest_phys = rte_pktmbuf_mtophys(buf_last_oop) + to_trn;
7638
7639         if (!digest_mem && !oop) {
7640                 digest_mem = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
7641                                 + tdata->auth_tag.len);
7642                 digest_phys = rte_pktmbuf_mtophys_offset(ut_params->ibuf,
7643                                 tdata->plaintext.len);
7644         }
7645
7646         /* Create GCM opertaion */
7647         retval = create_gcm_operation_SGL(RTE_CRYPTO_AEAD_OP_ENCRYPT,
7648                         tdata, digest_mem, digest_phys);
7649
7650         if (retval < 0)
7651                 return retval;
7652
7653         rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
7654
7655         ut_params->op->sym->m_src = ut_params->ibuf;
7656         if (oop)
7657                 ut_params->op->sym->m_dst = ut_params->obuf;
7658
7659         /* Process crypto operation */
7660         TEST_ASSERT_NOT_NULL(process_crypto_request(ts_params->valid_devs[0],
7661                         ut_params->op), "failed to process sym crypto op");
7662
7663         TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
7664                         "crypto op processing failed");
7665
7666
7667         ciphertext = rte_pktmbuf_mtod_offset(ut_params->op->sym->m_src,
7668                         uint8_t *, prepend_len);
7669         if (oop) {
7670                 ciphertext = rte_pktmbuf_mtod_offset(ut_params->op->sym->m_dst,
7671                                 uint8_t *, prepend_len);
7672         }
7673
7674         if (fragsz_oop)
7675                 fragsz = fragsz_oop;
7676
7677         TEST_ASSERT_BUFFERS_ARE_EQUAL(
7678                         ciphertext,
7679                         tdata->ciphertext.data,
7680                         fragsz,
7681                         "GCM Ciphertext data not as expected");
7682
7683         buf = ut_params->op->sym->m_src->next;
7684         if (oop)
7685                 buf = ut_params->op->sym->m_dst->next;
7686
7687         unsigned int off = fragsz;
7688
7689         ecx = 0;
7690         while (buf) {
7691                 ciphertext = rte_pktmbuf_mtod(buf,
7692                                 uint8_t *);
7693
7694                 TEST_ASSERT_BUFFERS_ARE_EQUAL(
7695                                 ciphertext,
7696                                 tdata->ciphertext.data + off,
7697                                 to_trn_tbl[ecx],
7698                                 "GCM Ciphertext data not as expected");
7699
7700                 off += to_trn_tbl[ecx++];
7701                 buf = buf->next;
7702         }
7703
7704         auth_tag = digest_mem;
7705         TEST_ASSERT_BUFFERS_ARE_EQUAL(
7706                         auth_tag,
7707                         tdata->auth_tag.data,
7708                         tdata->auth_tag.len,
7709                         "GCM Generated auth tag not as expected");
7710
7711         return 0;
7712 }
7713
7714 #define IN_PLACE        0
7715 #define OUT_OF_PLACE    1
7716
7717 static int
7718 test_AES_GCM_auth_encrypt_SGL_out_of_place_400B_400B(void)
7719 {
7720         return test_AES_GCM_authenticated_encryption_SGL(
7721                         &gcm_test_case_SGL_1, OUT_OF_PLACE, 400, 400);
7722 }
7723
7724 static int
7725 test_AES_GCM_auth_encrypt_SGL_out_of_place_1500B_2000B(void)
7726 {
7727         return test_AES_GCM_authenticated_encryption_SGL(
7728                         &gcm_test_case_SGL_1, OUT_OF_PLACE, 1500, 2000);
7729 }
7730
7731 static int
7732 test_AES_GCM_auth_encrypt_SGL_out_of_place_400B_1seg(void)
7733 {
7734         return test_AES_GCM_authenticated_encryption_SGL(
7735                         &gcm_test_case_8, OUT_OF_PLACE, 400,
7736                         gcm_test_case_8.plaintext.len);
7737 }
7738
7739 static int
7740 test_AES_GCM_auth_encrypt_SGL_in_place_1500B(void)
7741 {
7742
7743         return test_AES_GCM_authenticated_encryption_SGL(
7744                         &gcm_test_case_SGL_1, IN_PLACE, 1500, 0);
7745 }
7746
7747 static int
7748 test_authentication_verify_fail_when_data_corrupted(
7749                 struct crypto_testsuite_params *ts_params,
7750                 struct crypto_unittest_params *ut_params,
7751                 const struct test_crypto_vector *reference)
7752 {
7753         return test_authentication_verify_fail_when_data_corruption(
7754                         ts_params, ut_params, reference, 1);
7755 }
7756
7757 static int
7758 test_authentication_verify_fail_when_tag_corrupted(
7759                 struct crypto_testsuite_params *ts_params,
7760                 struct crypto_unittest_params *ut_params,
7761                 const struct test_crypto_vector *reference)
7762 {
7763         return test_authentication_verify_fail_when_data_corruption(
7764                         ts_params, ut_params, reference, 0);
7765 }
7766
7767 static int
7768 test_authentication_verify_GMAC_fail_when_data_corrupted(
7769                 struct crypto_testsuite_params *ts_params,
7770                 struct crypto_unittest_params *ut_params,
7771                 const struct test_crypto_vector *reference)
7772 {
7773         return test_authentication_verify_GMAC_fail_when_corruption(
7774                         ts_params, ut_params, reference, 1);
7775 }
7776
7777 static int
7778 test_authentication_verify_GMAC_fail_when_tag_corrupted(
7779                 struct crypto_testsuite_params *ts_params,
7780                 struct crypto_unittest_params *ut_params,
7781                 const struct test_crypto_vector *reference)
7782 {
7783         return test_authentication_verify_GMAC_fail_when_corruption(
7784                         ts_params, ut_params, reference, 0);
7785 }
7786
7787 static int
7788 test_authenticated_decryption_fail_when_data_corrupted(
7789                 struct crypto_testsuite_params *ts_params,
7790                 struct crypto_unittest_params *ut_params,
7791                 const struct test_crypto_vector *reference)
7792 {
7793         return test_authenticated_decryption_fail_when_corruption(
7794                         ts_params, ut_params, reference, 1);
7795 }
7796
7797 static int
7798 test_authenticated_decryption_fail_when_tag_corrupted(
7799                 struct crypto_testsuite_params *ts_params,
7800                 struct crypto_unittest_params *ut_params,
7801                 const struct test_crypto_vector *reference)
7802 {
7803         return test_authenticated_decryption_fail_when_corruption(
7804                         ts_params, ut_params, reference, 0);
7805 }
7806
7807 static int
7808 authentication_verify_HMAC_SHA1_fail_data_corrupt(void)
7809 {
7810         return test_authentication_verify_fail_when_data_corrupted(
7811                         &testsuite_params, &unittest_params,
7812                         &hmac_sha1_test_crypto_vector);
7813 }
7814
7815 static int
7816 authentication_verify_HMAC_SHA1_fail_tag_corrupt(void)
7817 {
7818         return test_authentication_verify_fail_when_tag_corrupted(
7819                         &testsuite_params, &unittest_params,
7820                         &hmac_sha1_test_crypto_vector);
7821 }
7822
7823 static int
7824 authentication_verify_AES128_GMAC_fail_data_corrupt(void)
7825 {
7826         return test_authentication_verify_GMAC_fail_when_data_corrupted(
7827                         &testsuite_params, &unittest_params,
7828                         &aes128_gmac_test_vector);
7829 }
7830
7831 static int
7832 authentication_verify_AES128_GMAC_fail_tag_corrupt(void)
7833 {
7834         return test_authentication_verify_GMAC_fail_when_tag_corrupted(
7835                         &testsuite_params, &unittest_params,
7836                         &aes128_gmac_test_vector);
7837 }
7838
7839 static int
7840 auth_decryption_AES128CBC_HMAC_SHA1_fail_data_corrupt(void)
7841 {
7842         return test_authenticated_decryption_fail_when_data_corrupted(
7843                         &testsuite_params,
7844                         &unittest_params,
7845                         &aes128cbc_hmac_sha1_test_vector);
7846 }
7847
7848 static int
7849 auth_decryption_AES128CBC_HMAC_SHA1_fail_tag_corrupt(void)
7850 {
7851         return test_authenticated_decryption_fail_when_tag_corrupted(
7852                         &testsuite_params,
7853                         &unittest_params,
7854                         &aes128cbc_hmac_sha1_test_vector);
7855 }
7856
7857 #ifdef RTE_LIBRTE_PMD_CRYPTO_SCHEDULER
7858
7859 /* global AESNI slave IDs for the scheduler test */
7860 uint8_t aesni_ids[2];
7861
7862 static int
7863 test_scheduler_attach_slave_op(void)
7864 {
7865         struct crypto_testsuite_params *ts_params = &testsuite_params;
7866         uint8_t sched_id = ts_params->valid_devs[0];
7867         uint32_t nb_devs, i, nb_devs_attached = 0;
7868         int ret;
7869         char vdev_name[32];
7870
7871         /* create 2 AESNI_MB if necessary */
7872         nb_devs = rte_cryptodev_device_count_by_driver(
7873                         rte_cryptodev_driver_id_get(
7874                         RTE_STR(CRYPTODEV_NAME_AESNI_MB_PMD)));
7875         if (nb_devs < 2) {
7876                 for (i = nb_devs; i < 2; i++) {
7877                         snprintf(vdev_name, sizeof(vdev_name), "%s_%u",
7878                                         RTE_STR(CRYPTODEV_NAME_AESNI_MB_PMD),
7879                                         i);
7880                         ret = rte_vdev_init(vdev_name, NULL);
7881
7882                         TEST_ASSERT(ret == 0,
7883                                 "Failed to create instance %u of"
7884                                 " pmd : %s",
7885                                 i, RTE_STR(CRYPTODEV_NAME_AESNI_MB_PMD));
7886                 }
7887         }
7888
7889         /* attach 2 AESNI_MB cdevs */
7890         for (i = 0; i < rte_cryptodev_count() && nb_devs_attached < 2;
7891                         i++) {
7892                 struct rte_cryptodev_info info;
7893
7894                 rte_cryptodev_info_get(i, &info);
7895                 if (info.driver_id != rte_cryptodev_driver_id_get(
7896                                 RTE_STR(CRYPTODEV_NAME_AESNI_MB_PMD)))
7897                         continue;
7898
7899                 /*
7900                  * Create the session mempool again, since now there are new devices
7901                  * to use the mempool.
7902                  */
7903                 if (ts_params->session_mpool) {
7904                         rte_mempool_free(ts_params->session_mpool);
7905                         ts_params->session_mpool = NULL;
7906                 }
7907                 unsigned int session_size = rte_cryptodev_get_private_session_size(i);
7908
7909                 /*
7910                  * Create mempool with maximum number of sessions * 2,
7911                  * to include the session headers
7912                  */
7913                 if (ts_params->session_mpool == NULL) {
7914                         ts_params->session_mpool = rte_mempool_create(
7915                                         "test_sess_mp",
7916                                         info.sym.max_nb_sessions * 2,
7917                                         session_size,
7918                                         0, 0, NULL, NULL, NULL,
7919                                         NULL, SOCKET_ID_ANY,
7920                                         0);
7921
7922                         TEST_ASSERT_NOT_NULL(ts_params->session_mpool,
7923                                         "session mempool allocation failed");
7924                 }
7925
7926                 ret = rte_cryptodev_scheduler_slave_attach(sched_id,
7927                                 (uint8_t)i);
7928
7929                 TEST_ASSERT(ret == 0,
7930                         "Failed to attach device %u of pmd : %s", i,
7931                         RTE_STR(CRYPTODEV_NAME_AESNI_MB_PMD));
7932
7933                 aesni_ids[nb_devs_attached] = (uint8_t)i;
7934
7935                 nb_devs_attached++;
7936         }
7937
7938         return 0;
7939 }
7940
7941 static int
7942 test_scheduler_detach_slave_op(void)
7943 {
7944         struct crypto_testsuite_params *ts_params = &testsuite_params;
7945         uint8_t sched_id = ts_params->valid_devs[0];
7946         uint32_t i;
7947         int ret;
7948
7949         for (i = 0; i < 2; i++) {
7950                 ret = rte_cryptodev_scheduler_slave_detach(sched_id,
7951                                 aesni_ids[i]);
7952                 TEST_ASSERT(ret == 0,
7953                         "Failed to detach device %u", aesni_ids[i]);
7954         }
7955
7956         return 0;
7957 }
7958
7959 static int
7960 test_scheduler_mode_op(void)
7961 {
7962         struct crypto_testsuite_params *ts_params = &testsuite_params;
7963         uint8_t sched_id = ts_params->valid_devs[0];
7964         struct rte_cryptodev_scheduler_ops op = {0};
7965         struct rte_cryptodev_scheduler dummy_scheduler = {
7966                 .description = "dummy scheduler to test mode",
7967                 .name = "dummy scheduler",
7968                 .mode = CDEV_SCHED_MODE_USERDEFINED,
7969                 .ops = &op
7970         };
7971         int ret;
7972
7973         /* set user defined mode */
7974         ret = rte_cryptodev_scheduler_load_user_scheduler(sched_id,
7975                         &dummy_scheduler);
7976         TEST_ASSERT(ret == 0,
7977                 "Failed to set cdev %u to user defined mode", sched_id);
7978
7979         /* set round robin mode */
7980         ret = rte_cryptodev_scheduler_mode_set(sched_id,
7981                         CDEV_SCHED_MODE_ROUNDROBIN);
7982         TEST_ASSERT(ret == 0,
7983                 "Failed to set cdev %u to round-robin mode", sched_id);
7984         TEST_ASSERT(rte_cryptodev_scheduler_mode_get(sched_id) ==
7985                         CDEV_SCHED_MODE_ROUNDROBIN, "Scheduling Mode "
7986                                         "not match");
7987
7988         return 0;
7989 }
7990
7991 static struct unit_test_suite cryptodev_scheduler_testsuite  = {
7992         .suite_name = "Crypto Device Scheduler Unit Test Suite",
7993         .setup = testsuite_setup,
7994         .teardown = testsuite_teardown,
7995         .unit_test_cases = {
7996                 TEST_CASE_ST(NULL, NULL, test_scheduler_attach_slave_op),
7997                 TEST_CASE_ST(NULL, NULL, test_scheduler_mode_op),
7998                 TEST_CASE_ST(ut_setup, ut_teardown,
7999                                 test_AES_chain_scheduler_all),
8000                 TEST_CASE_ST(ut_setup, ut_teardown,
8001                                 test_AES_cipheronly_scheduler_all),
8002                 TEST_CASE_ST(ut_setup, ut_teardown,
8003                                 test_authonly_scheduler_all),
8004                 TEST_CASE_ST(NULL, NULL, test_scheduler_detach_slave_op),
8005                 TEST_CASES_END() /**< NULL terminate unit test array */
8006         }
8007 };
8008
8009 #endif /* RTE_LIBRTE_PMD_CRYPTO_SCHEDULER */
8010
8011 static struct unit_test_suite cryptodev_qat_testsuite  = {
8012         .suite_name = "Crypto QAT Unit Test Suite",
8013         .setup = testsuite_setup,
8014         .teardown = testsuite_teardown,
8015         .unit_test_cases = {
8016                 TEST_CASE_ST(ut_setup, ut_teardown,
8017                                 test_device_configure_invalid_dev_id),
8018                 TEST_CASE_ST(ut_setup, ut_teardown,
8019                                 test_device_configure_invalid_queue_pair_ids),
8020                 TEST_CASE_ST(ut_setup, ut_teardown,
8021                                 test_queue_pair_descriptor_setup),
8022                 TEST_CASE_ST(ut_setup, ut_teardown,
8023                                 test_multi_session),
8024
8025                 TEST_CASE_ST(ut_setup, ut_teardown, test_AES_chain_qat_all),
8026                 TEST_CASE_ST(ut_setup, ut_teardown,
8027                                                 test_AES_cipheronly_qat_all),
8028                 TEST_CASE_ST(ut_setup, ut_teardown, test_3DES_chain_qat_all),
8029                 TEST_CASE_ST(ut_setup, ut_teardown,
8030                                                 test_3DES_cipheronly_qat_all),
8031                 TEST_CASE_ST(ut_setup, ut_teardown,
8032                                                 test_DES_cipheronly_qat_all),
8033                 TEST_CASE_ST(ut_setup, ut_teardown,
8034                                                 test_AES_docsis_qat_all),
8035                 TEST_CASE_ST(ut_setup, ut_teardown,
8036                                                 test_DES_docsis_qat_all),
8037                 TEST_CASE_ST(ut_setup, ut_teardown, test_authonly_qat_all),
8038                 TEST_CASE_ST(ut_setup, ut_teardown, test_stats),
8039
8040                 /** AES GCM Authenticated Encryption */
8041                 TEST_CASE_ST(ut_setup, ut_teardown,
8042                         test_AES_GCM_auth_encrypt_SGL_in_place_1500B),
8043                 TEST_CASE_ST(ut_setup, ut_teardown,
8044                         test_AES_GCM_auth_encrypt_SGL_out_of_place_400B_400B),
8045                 TEST_CASE_ST(ut_setup, ut_teardown,
8046                         test_AES_GCM_auth_encrypt_SGL_out_of_place_1500B_2000B),
8047                 TEST_CASE_ST(ut_setup, ut_teardown,
8048                         test_AES_GCM_authenticated_encryption_test_case_1),
8049                 TEST_CASE_ST(ut_setup, ut_teardown,
8050                         test_AES_GCM_authenticated_encryption_test_case_2),
8051                 TEST_CASE_ST(ut_setup, ut_teardown,
8052                         test_AES_GCM_authenticated_encryption_test_case_3),
8053                 TEST_CASE_ST(ut_setup, ut_teardown,
8054                         test_AES_GCM_authenticated_encryption_test_case_4),
8055                 TEST_CASE_ST(ut_setup, ut_teardown,
8056                         test_AES_GCM_authenticated_encryption_test_case_5),
8057                 TEST_CASE_ST(ut_setup, ut_teardown,
8058                         test_AES_GCM_authenticated_encryption_test_case_6),
8059                 TEST_CASE_ST(ut_setup, ut_teardown,
8060                         test_AES_GCM_authenticated_encryption_test_case_7),
8061
8062                 /** AES GCM Authenticated Decryption */
8063                 TEST_CASE_ST(ut_setup, ut_teardown,
8064                         test_AES_GCM_authenticated_decryption_test_case_1),
8065                 TEST_CASE_ST(ut_setup, ut_teardown,
8066                         test_AES_GCM_authenticated_decryption_test_case_2),
8067                 TEST_CASE_ST(ut_setup, ut_teardown,
8068                         test_AES_GCM_authenticated_decryption_test_case_3),
8069                 TEST_CASE_ST(ut_setup, ut_teardown,
8070                         test_AES_GCM_authenticated_decryption_test_case_4),
8071                 TEST_CASE_ST(ut_setup, ut_teardown,
8072                         test_AES_GCM_authenticated_decryption_test_case_5),
8073                 TEST_CASE_ST(ut_setup, ut_teardown,
8074                         test_AES_GCM_authenticated_decryption_test_case_6),
8075                 TEST_CASE_ST(ut_setup, ut_teardown,
8076                         test_AES_GCM_authenticated_decryption_test_case_7),
8077
8078                 /** AES GCM Authenticated Encryption 192 bits key */
8079                 TEST_CASE_ST(ut_setup, ut_teardown,
8080                         test_AES_GCM_auth_encryption_test_case_192_1),
8081                 TEST_CASE_ST(ut_setup, ut_teardown,
8082                         test_AES_GCM_auth_encryption_test_case_192_2),
8083                 TEST_CASE_ST(ut_setup, ut_teardown,
8084                         test_AES_GCM_auth_encryption_test_case_192_3),
8085                 TEST_CASE_ST(ut_setup, ut_teardown,
8086                         test_AES_GCM_auth_encryption_test_case_192_4),
8087                 TEST_CASE_ST(ut_setup, ut_teardown,
8088                         test_AES_GCM_auth_encryption_test_case_192_5),
8089                 TEST_CASE_ST(ut_setup, ut_teardown,
8090                         test_AES_GCM_auth_encryption_test_case_192_6),
8091                 TEST_CASE_ST(ut_setup, ut_teardown,
8092                         test_AES_GCM_auth_encryption_test_case_192_7),
8093
8094                 /** AES GCM Authenticated Decryption 192 bits key */
8095                 TEST_CASE_ST(ut_setup, ut_teardown,
8096                         test_AES_GCM_auth_decryption_test_case_192_1),
8097                 TEST_CASE_ST(ut_setup, ut_teardown,
8098                         test_AES_GCM_auth_decryption_test_case_192_2),
8099                 TEST_CASE_ST(ut_setup, ut_teardown,
8100                         test_AES_GCM_auth_decryption_test_case_192_3),
8101                 TEST_CASE_ST(ut_setup, ut_teardown,
8102                         test_AES_GCM_auth_decryption_test_case_192_4),
8103                 TEST_CASE_ST(ut_setup, ut_teardown,
8104                         test_AES_GCM_auth_decryption_test_case_192_5),
8105                 TEST_CASE_ST(ut_setup, ut_teardown,
8106                         test_AES_GCM_auth_decryption_test_case_192_6),
8107                 TEST_CASE_ST(ut_setup, ut_teardown,
8108                         test_AES_GCM_auth_decryption_test_case_192_7),
8109
8110                 /** AES GCM Authenticated Encryption 256 bits key */
8111                 TEST_CASE_ST(ut_setup, ut_teardown,
8112                         test_AES_GCM_auth_encryption_test_case_256_1),
8113                 TEST_CASE_ST(ut_setup, ut_teardown,
8114                         test_AES_GCM_auth_encryption_test_case_256_2),
8115                 TEST_CASE_ST(ut_setup, ut_teardown,
8116                         test_AES_GCM_auth_encryption_test_case_256_3),
8117                 TEST_CASE_ST(ut_setup, ut_teardown,
8118                         test_AES_GCM_auth_encryption_test_case_256_4),
8119                 TEST_CASE_ST(ut_setup, ut_teardown,
8120                         test_AES_GCM_auth_encryption_test_case_256_5),
8121                 TEST_CASE_ST(ut_setup, ut_teardown,
8122                         test_AES_GCM_auth_encryption_test_case_256_6),
8123                 TEST_CASE_ST(ut_setup, ut_teardown,
8124                         test_AES_GCM_auth_encryption_test_case_256_7),
8125
8126                 /** AES GMAC Authentication */
8127                 TEST_CASE_ST(ut_setup, ut_teardown,
8128                         test_AES_GMAC_authentication_test_case_1),
8129                 TEST_CASE_ST(ut_setup, ut_teardown,
8130                         test_AES_GMAC_authentication_verify_test_case_1),
8131                 TEST_CASE_ST(ut_setup, ut_teardown,
8132                         test_AES_GMAC_authentication_test_case_2),
8133                 TEST_CASE_ST(ut_setup, ut_teardown,
8134                         test_AES_GMAC_authentication_verify_test_case_2),
8135                 TEST_CASE_ST(ut_setup, ut_teardown,
8136                         test_AES_GMAC_authentication_test_case_3),
8137                 TEST_CASE_ST(ut_setup, ut_teardown,
8138                         test_AES_GMAC_authentication_verify_test_case_3),
8139
8140                 /** SNOW 3G encrypt only (UEA2) */
8141                 TEST_CASE_ST(ut_setup, ut_teardown,
8142                         test_snow3g_encryption_test_case_1),
8143                 TEST_CASE_ST(ut_setup, ut_teardown,
8144                         test_snow3g_encryption_test_case_2),
8145                 TEST_CASE_ST(ut_setup, ut_teardown,
8146                         test_snow3g_encryption_test_case_3),
8147                 TEST_CASE_ST(ut_setup, ut_teardown,
8148                         test_snow3g_encryption_test_case_4),
8149                 TEST_CASE_ST(ut_setup, ut_teardown,
8150                         test_snow3g_encryption_test_case_5),
8151
8152                 TEST_CASE_ST(ut_setup, ut_teardown,
8153                         test_snow3g_encryption_test_case_1_oop),
8154                 TEST_CASE_ST(ut_setup, ut_teardown,
8155                         test_snow3g_decryption_test_case_1_oop),
8156
8157                 /** SNOW 3G decrypt only (UEA2) */
8158                 TEST_CASE_ST(ut_setup, ut_teardown,
8159                         test_snow3g_decryption_test_case_1),
8160                 TEST_CASE_ST(ut_setup, ut_teardown,
8161                         test_snow3g_decryption_test_case_2),
8162                 TEST_CASE_ST(ut_setup, ut_teardown,
8163                         test_snow3g_decryption_test_case_3),
8164                 TEST_CASE_ST(ut_setup, ut_teardown,
8165                         test_snow3g_decryption_test_case_4),
8166                 TEST_CASE_ST(ut_setup, ut_teardown,
8167                         test_snow3g_decryption_test_case_5),
8168                 TEST_CASE_ST(ut_setup, ut_teardown,
8169                         test_snow3g_hash_generate_test_case_1),
8170                 TEST_CASE_ST(ut_setup, ut_teardown,
8171                         test_snow3g_hash_generate_test_case_2),
8172                 TEST_CASE_ST(ut_setup, ut_teardown,
8173                         test_snow3g_hash_generate_test_case_3),
8174                 TEST_CASE_ST(ut_setup, ut_teardown,
8175                         test_snow3g_hash_verify_test_case_1),
8176                 TEST_CASE_ST(ut_setup, ut_teardown,
8177                         test_snow3g_hash_verify_test_case_2),
8178                 TEST_CASE_ST(ut_setup, ut_teardown,
8179                         test_snow3g_hash_verify_test_case_3),
8180                 TEST_CASE_ST(ut_setup, ut_teardown,
8181                         test_snow3g_cipher_auth_test_case_1),
8182                 TEST_CASE_ST(ut_setup, ut_teardown,
8183                         test_snow3g_auth_cipher_test_case_1),
8184
8185                 /** ZUC encrypt only (EEA3) */
8186                 TEST_CASE_ST(ut_setup, ut_teardown,
8187                         test_zuc_encryption_test_case_1),
8188                 TEST_CASE_ST(ut_setup, ut_teardown,
8189                         test_zuc_encryption_test_case_2),
8190                 TEST_CASE_ST(ut_setup, ut_teardown,
8191                         test_zuc_encryption_test_case_3),
8192                 TEST_CASE_ST(ut_setup, ut_teardown,
8193                         test_zuc_encryption_test_case_4),
8194                 TEST_CASE_ST(ut_setup, ut_teardown,
8195                         test_zuc_encryption_test_case_5),
8196
8197                 /** ZUC authenticate (EIA3) */
8198                 TEST_CASE_ST(ut_setup, ut_teardown,
8199                         test_zuc_hash_generate_test_case_6),
8200                 TEST_CASE_ST(ut_setup, ut_teardown,
8201                         test_zuc_hash_generate_test_case_7),
8202                 TEST_CASE_ST(ut_setup, ut_teardown,
8203                         test_zuc_hash_generate_test_case_8),
8204
8205                 /** ZUC alg-chain (EEA3/EIA3) */
8206                 TEST_CASE_ST(ut_setup, ut_teardown,
8207                         test_zuc_cipher_auth_test_case_1),
8208                 TEST_CASE_ST(ut_setup, ut_teardown,
8209                         test_zuc_cipher_auth_test_case_2),
8210
8211                 /** HMAC_MD5 Authentication */
8212                 TEST_CASE_ST(ut_setup, ut_teardown,
8213                         test_MD5_HMAC_generate_case_1),
8214                 TEST_CASE_ST(ut_setup, ut_teardown,
8215                         test_MD5_HMAC_verify_case_1),
8216                 TEST_CASE_ST(ut_setup, ut_teardown,
8217                         test_MD5_HMAC_generate_case_2),
8218                 TEST_CASE_ST(ut_setup, ut_teardown,
8219                         test_MD5_HMAC_verify_case_2),
8220
8221                 /** NULL tests */
8222                 TEST_CASE_ST(ut_setup, ut_teardown,
8223                         test_null_auth_only_operation),
8224                 TEST_CASE_ST(ut_setup, ut_teardown,
8225                         test_null_cipher_only_operation),
8226                 TEST_CASE_ST(ut_setup, ut_teardown,
8227                         test_null_cipher_auth_operation),
8228                 TEST_CASE_ST(ut_setup, ut_teardown,
8229                         test_null_auth_cipher_operation),
8230
8231                 /** KASUMI tests */
8232                 TEST_CASE_ST(ut_setup, ut_teardown,
8233                         test_kasumi_hash_generate_test_case_1),
8234                 TEST_CASE_ST(ut_setup, ut_teardown,
8235                         test_kasumi_hash_generate_test_case_2),
8236                 TEST_CASE_ST(ut_setup, ut_teardown,
8237                         test_kasumi_hash_generate_test_case_3),
8238                 TEST_CASE_ST(ut_setup, ut_teardown,
8239                         test_kasumi_hash_generate_test_case_4),
8240                 TEST_CASE_ST(ut_setup, ut_teardown,
8241                         test_kasumi_hash_generate_test_case_5),
8242                 TEST_CASE_ST(ut_setup, ut_teardown,
8243                         test_kasumi_hash_generate_test_case_6),
8244
8245                 TEST_CASE_ST(ut_setup, ut_teardown,
8246                         test_kasumi_hash_verify_test_case_1),
8247                 TEST_CASE_ST(ut_setup, ut_teardown,
8248                         test_kasumi_hash_verify_test_case_2),
8249                 TEST_CASE_ST(ut_setup, ut_teardown,
8250                         test_kasumi_hash_verify_test_case_3),
8251                 TEST_CASE_ST(ut_setup, ut_teardown,
8252                         test_kasumi_hash_verify_test_case_4),
8253                 TEST_CASE_ST(ut_setup, ut_teardown,
8254                         test_kasumi_hash_verify_test_case_5),
8255
8256                 TEST_CASE_ST(ut_setup, ut_teardown,
8257                         test_kasumi_encryption_test_case_1),
8258                 TEST_CASE_ST(ut_setup, ut_teardown,
8259                         test_kasumi_encryption_test_case_3),
8260                 TEST_CASE_ST(ut_setup, ut_teardown,
8261                         test_kasumi_auth_cipher_test_case_1),
8262                 TEST_CASE_ST(ut_setup, ut_teardown,
8263                         test_kasumi_cipher_auth_test_case_1),
8264
8265                 /** Negative tests */
8266                 TEST_CASE_ST(ut_setup, ut_teardown,
8267                         authentication_verify_HMAC_SHA1_fail_data_corrupt),
8268                 TEST_CASE_ST(ut_setup, ut_teardown,
8269                         authentication_verify_HMAC_SHA1_fail_tag_corrupt),
8270                 TEST_CASE_ST(ut_setup, ut_teardown,
8271                         authentication_verify_AES128_GMAC_fail_data_corrupt),
8272                 TEST_CASE_ST(ut_setup, ut_teardown,
8273                         authentication_verify_AES128_GMAC_fail_tag_corrupt),
8274                 TEST_CASE_ST(ut_setup, ut_teardown,
8275                         auth_decryption_AES128CBC_HMAC_SHA1_fail_data_corrupt),
8276                 TEST_CASE_ST(ut_setup, ut_teardown,
8277                         auth_decryption_AES128CBC_HMAC_SHA1_fail_tag_corrupt),
8278
8279                 TEST_CASES_END() /**< NULL terminate unit test array */
8280         }
8281 };
8282
8283 static struct unit_test_suite cryptodev_aesni_mb_testsuite  = {
8284         .suite_name = "Crypto Device AESNI MB Unit Test Suite",
8285         .setup = testsuite_setup,
8286         .teardown = testsuite_teardown,
8287         .unit_test_cases = {
8288                 TEST_CASE_ST(ut_setup, ut_teardown, test_AES_chain_mb_all),
8289                 TEST_CASE_ST(ut_setup, ut_teardown, test_AES_cipheronly_mb_all),
8290                 TEST_CASE_ST(ut_setup, ut_teardown, test_AES_docsis_mb_all),
8291                 TEST_CASE_ST(ut_setup, ut_teardown, test_authonly_mb_all),
8292
8293                 TEST_CASES_END() /**< NULL terminate unit test array */
8294         }
8295 };
8296
8297 static struct unit_test_suite cryptodev_openssl_testsuite  = {
8298         .suite_name = "Crypto Device OPENSSL Unit Test Suite",
8299         .setup = testsuite_setup,
8300         .teardown = testsuite_teardown,
8301         .unit_test_cases = {
8302                 TEST_CASE_ST(ut_setup, ut_teardown, test_multi_session),
8303                 TEST_CASE_ST(ut_setup, ut_teardown,
8304                                 test_multi_session_random_usage),
8305                 TEST_CASE_ST(ut_setup, ut_teardown,
8306                                 test_AES_chain_openssl_all),
8307                 TEST_CASE_ST(ut_setup, ut_teardown,
8308                                 test_AES_cipheronly_openssl_all),
8309                 TEST_CASE_ST(ut_setup, ut_teardown,
8310                                 test_3DES_chain_openssl_all),
8311                 TEST_CASE_ST(ut_setup, ut_teardown,
8312                                 test_3DES_cipheronly_openssl_all),
8313                 TEST_CASE_ST(ut_setup, ut_teardown,
8314                                 test_DES_docsis_openssl_all),
8315                 TEST_CASE_ST(ut_setup, ut_teardown,
8316                                 test_authonly_openssl_all),
8317
8318                 /** AES GCM Authenticated Encryption */
8319                 TEST_CASE_ST(ut_setup, ut_teardown,
8320                         test_AES_GCM_authenticated_encryption_test_case_1),
8321                 TEST_CASE_ST(ut_setup, ut_teardown,
8322                         test_AES_GCM_authenticated_encryption_test_case_2),
8323                 TEST_CASE_ST(ut_setup, ut_teardown,
8324                         test_AES_GCM_authenticated_encryption_test_case_3),
8325                 TEST_CASE_ST(ut_setup, ut_teardown,
8326                         test_AES_GCM_authenticated_encryption_test_case_4),
8327                 TEST_CASE_ST(ut_setup, ut_teardown,
8328                         test_AES_GCM_authenticated_encryption_test_case_5),
8329                 TEST_CASE_ST(ut_setup, ut_teardown,
8330                         test_AES_GCM_authenticated_encryption_test_case_6),
8331                 TEST_CASE_ST(ut_setup, ut_teardown,
8332                         test_AES_GCM_authenticated_encryption_test_case_7),
8333
8334                 /** AES GCM Authenticated Decryption */
8335                 TEST_CASE_ST(ut_setup, ut_teardown,
8336                         test_AES_GCM_authenticated_decryption_test_case_1),
8337                 TEST_CASE_ST(ut_setup, ut_teardown,
8338                         test_AES_GCM_authenticated_decryption_test_case_2),
8339                 TEST_CASE_ST(ut_setup, ut_teardown,
8340                         test_AES_GCM_authenticated_decryption_test_case_3),
8341                 TEST_CASE_ST(ut_setup, ut_teardown,
8342                         test_AES_GCM_authenticated_decryption_test_case_4),
8343                 TEST_CASE_ST(ut_setup, ut_teardown,
8344                         test_AES_GCM_authenticated_decryption_test_case_5),
8345                 TEST_CASE_ST(ut_setup, ut_teardown,
8346                         test_AES_GCM_authenticated_decryption_test_case_6),
8347                 TEST_CASE_ST(ut_setup, ut_teardown,
8348                         test_AES_GCM_authenticated_decryption_test_case_7),
8349
8350
8351                 /** AES GCM Authenticated Encryption 192 bits key */
8352                 TEST_CASE_ST(ut_setup, ut_teardown,
8353                         test_AES_GCM_auth_encryption_test_case_192_1),
8354                 TEST_CASE_ST(ut_setup, ut_teardown,
8355                         test_AES_GCM_auth_encryption_test_case_192_2),
8356                 TEST_CASE_ST(ut_setup, ut_teardown,
8357                         test_AES_GCM_auth_encryption_test_case_192_3),
8358                 TEST_CASE_ST(ut_setup, ut_teardown,
8359                         test_AES_GCM_auth_encryption_test_case_192_4),
8360                 TEST_CASE_ST(ut_setup, ut_teardown,
8361                         test_AES_GCM_auth_encryption_test_case_192_5),
8362                 TEST_CASE_ST(ut_setup, ut_teardown,
8363                         test_AES_GCM_auth_encryption_test_case_192_6),
8364                 TEST_CASE_ST(ut_setup, ut_teardown,
8365                         test_AES_GCM_auth_encryption_test_case_192_7),
8366
8367                 /** AES GCM Authenticated Decryption 192 bits key */
8368                 TEST_CASE_ST(ut_setup, ut_teardown,
8369                         test_AES_GCM_auth_decryption_test_case_192_1),
8370                 TEST_CASE_ST(ut_setup, ut_teardown,
8371                         test_AES_GCM_auth_decryption_test_case_192_2),
8372                 TEST_CASE_ST(ut_setup, ut_teardown,
8373                         test_AES_GCM_auth_decryption_test_case_192_3),
8374                 TEST_CASE_ST(ut_setup, ut_teardown,
8375                         test_AES_GCM_auth_decryption_test_case_192_4),
8376                 TEST_CASE_ST(ut_setup, ut_teardown,
8377                         test_AES_GCM_auth_decryption_test_case_192_5),
8378                 TEST_CASE_ST(ut_setup, ut_teardown,
8379                         test_AES_GCM_auth_decryption_test_case_192_6),
8380                 TEST_CASE_ST(ut_setup, ut_teardown,
8381                         test_AES_GCM_auth_decryption_test_case_192_7),
8382
8383                 /** AES GCM Authenticated Encryption 256 bits key */
8384                 TEST_CASE_ST(ut_setup, ut_teardown,
8385                         test_AES_GCM_auth_encryption_test_case_256_1),
8386                 TEST_CASE_ST(ut_setup, ut_teardown,
8387                         test_AES_GCM_auth_encryption_test_case_256_2),
8388                 TEST_CASE_ST(ut_setup, ut_teardown,
8389                         test_AES_GCM_auth_encryption_test_case_256_3),
8390                 TEST_CASE_ST(ut_setup, ut_teardown,
8391                         test_AES_GCM_auth_encryption_test_case_256_4),
8392                 TEST_CASE_ST(ut_setup, ut_teardown,
8393                         test_AES_GCM_auth_encryption_test_case_256_5),
8394                 TEST_CASE_ST(ut_setup, ut_teardown,
8395                         test_AES_GCM_auth_encryption_test_case_256_6),
8396                 TEST_CASE_ST(ut_setup, ut_teardown,
8397                         test_AES_GCM_auth_encryption_test_case_256_7),
8398
8399                 /** AES GCM Authenticated Decryption 256 bits key */
8400                 TEST_CASE_ST(ut_setup, ut_teardown,
8401                         test_AES_GCM_auth_decryption_test_case_256_1),
8402                 TEST_CASE_ST(ut_setup, ut_teardown,
8403                         test_AES_GCM_auth_decryption_test_case_256_2),
8404                 TEST_CASE_ST(ut_setup, ut_teardown,
8405                         test_AES_GCM_auth_decryption_test_case_256_3),
8406                 TEST_CASE_ST(ut_setup, ut_teardown,
8407                         test_AES_GCM_auth_decryption_test_case_256_4),
8408                 TEST_CASE_ST(ut_setup, ut_teardown,
8409                         test_AES_GCM_auth_decryption_test_case_256_5),
8410                 TEST_CASE_ST(ut_setup, ut_teardown,
8411                         test_AES_GCM_auth_decryption_test_case_256_6),
8412                 TEST_CASE_ST(ut_setup, ut_teardown,
8413                         test_AES_GCM_auth_decryption_test_case_256_7),
8414
8415                 /** AES GMAC Authentication */
8416                 TEST_CASE_ST(ut_setup, ut_teardown,
8417                         test_AES_GMAC_authentication_test_case_1),
8418                 TEST_CASE_ST(ut_setup, ut_teardown,
8419                         test_AES_GMAC_authentication_verify_test_case_1),
8420                 TEST_CASE_ST(ut_setup, ut_teardown,
8421                         test_AES_GMAC_authentication_test_case_2),
8422                 TEST_CASE_ST(ut_setup, ut_teardown,
8423                         test_AES_GMAC_authentication_verify_test_case_2),
8424                 TEST_CASE_ST(ut_setup, ut_teardown,
8425                         test_AES_GMAC_authentication_test_case_3),
8426                 TEST_CASE_ST(ut_setup, ut_teardown,
8427                         test_AES_GMAC_authentication_verify_test_case_3),
8428                 TEST_CASE_ST(ut_setup, ut_teardown,
8429                         test_AES_GMAC_authentication_test_case_4),
8430                 TEST_CASE_ST(ut_setup, ut_teardown,
8431                         test_AES_GMAC_authentication_verify_test_case_4),
8432
8433                 /** Scatter-Gather */
8434                 TEST_CASE_ST(ut_setup, ut_teardown,
8435                         test_AES_GCM_auth_encrypt_SGL_out_of_place_400B_1seg),
8436
8437                 /** Negative tests */
8438                 TEST_CASE_ST(ut_setup, ut_teardown,
8439                         authentication_verify_HMAC_SHA1_fail_data_corrupt),
8440                 TEST_CASE_ST(ut_setup, ut_teardown,
8441                         authentication_verify_HMAC_SHA1_fail_tag_corrupt),
8442                 TEST_CASE_ST(ut_setup, ut_teardown,
8443                         authentication_verify_AES128_GMAC_fail_data_corrupt),
8444                 TEST_CASE_ST(ut_setup, ut_teardown,
8445                         authentication_verify_AES128_GMAC_fail_tag_corrupt),
8446                 TEST_CASE_ST(ut_setup, ut_teardown,
8447                         auth_decryption_AES128CBC_HMAC_SHA1_fail_data_corrupt),
8448                 TEST_CASE_ST(ut_setup, ut_teardown,
8449                         auth_decryption_AES128CBC_HMAC_SHA1_fail_tag_corrupt),
8450
8451                 TEST_CASES_END() /**< NULL terminate unit test array */
8452         }
8453 };
8454
8455 static struct unit_test_suite cryptodev_aesni_gcm_testsuite  = {
8456         .suite_name = "Crypto Device AESNI GCM Unit Test Suite",
8457         .setup = testsuite_setup,
8458         .teardown = testsuite_teardown,
8459         .unit_test_cases = {
8460                 /** AES GCM Authenticated Encryption */
8461                 TEST_CASE_ST(ut_setup, ut_teardown,
8462                         test_AES_GCM_authenticated_encryption_test_case_1),
8463                 TEST_CASE_ST(ut_setup, ut_teardown,
8464                         test_AES_GCM_authenticated_encryption_test_case_2),
8465                 TEST_CASE_ST(ut_setup, ut_teardown,
8466                         test_AES_GCM_authenticated_encryption_test_case_3),
8467                 TEST_CASE_ST(ut_setup, ut_teardown,
8468                         test_AES_GCM_authenticated_encryption_test_case_4),
8469                 TEST_CASE_ST(ut_setup, ut_teardown,
8470                         test_AES_GCM_authenticated_encryption_test_case_5),
8471                 TEST_CASE_ST(ut_setup, ut_teardown,
8472                         test_AES_GCM_authenticated_encryption_test_case_6),
8473                 TEST_CASE_ST(ut_setup, ut_teardown,
8474                         test_AES_GCM_authenticated_encryption_test_case_7),
8475
8476                 /** AES GCM Authenticated Decryption */
8477                 TEST_CASE_ST(ut_setup, ut_teardown,
8478                         test_AES_GCM_authenticated_decryption_test_case_1),
8479                 TEST_CASE_ST(ut_setup, ut_teardown,
8480                         test_AES_GCM_authenticated_decryption_test_case_2),
8481                 TEST_CASE_ST(ut_setup, ut_teardown,
8482                         test_AES_GCM_authenticated_decryption_test_case_3),
8483                 TEST_CASE_ST(ut_setup, ut_teardown,
8484                         test_AES_GCM_authenticated_decryption_test_case_4),
8485                 TEST_CASE_ST(ut_setup, ut_teardown,
8486                         test_AES_GCM_authenticated_decryption_test_case_5),
8487                 TEST_CASE_ST(ut_setup, ut_teardown,
8488                         test_AES_GCM_authenticated_decryption_test_case_6),
8489                 TEST_CASE_ST(ut_setup, ut_teardown,
8490                         test_AES_GCM_authenticated_decryption_test_case_7),
8491
8492                 /** AES GCM Authenticated Encryption 192 bits key */
8493                 TEST_CASE_ST(ut_setup, ut_teardown,
8494                         test_AES_GCM_auth_encryption_test_case_192_1),
8495                 TEST_CASE_ST(ut_setup, ut_teardown,
8496                         test_AES_GCM_auth_encryption_test_case_192_2),
8497                 TEST_CASE_ST(ut_setup, ut_teardown,
8498                         test_AES_GCM_auth_encryption_test_case_192_3),
8499                 TEST_CASE_ST(ut_setup, ut_teardown,
8500                         test_AES_GCM_auth_encryption_test_case_192_4),
8501                 TEST_CASE_ST(ut_setup, ut_teardown,
8502                         test_AES_GCM_auth_encryption_test_case_192_5),
8503                 TEST_CASE_ST(ut_setup, ut_teardown,
8504                         test_AES_GCM_auth_encryption_test_case_192_6),
8505                 TEST_CASE_ST(ut_setup, ut_teardown,
8506                         test_AES_GCM_auth_encryption_test_case_192_7),
8507
8508                 /** AES GCM Authenticated Decryption 192 bits key */
8509                 TEST_CASE_ST(ut_setup, ut_teardown,
8510                         test_AES_GCM_auth_decryption_test_case_192_1),
8511                 TEST_CASE_ST(ut_setup, ut_teardown,
8512                         test_AES_GCM_auth_decryption_test_case_192_2),
8513                 TEST_CASE_ST(ut_setup, ut_teardown,
8514                         test_AES_GCM_auth_decryption_test_case_192_3),
8515                 TEST_CASE_ST(ut_setup, ut_teardown,
8516                         test_AES_GCM_auth_decryption_test_case_192_4),
8517                 TEST_CASE_ST(ut_setup, ut_teardown,
8518                         test_AES_GCM_auth_decryption_test_case_192_5),
8519                 TEST_CASE_ST(ut_setup, ut_teardown,
8520                         test_AES_GCM_auth_decryption_test_case_192_6),
8521                 TEST_CASE_ST(ut_setup, ut_teardown,
8522                         test_AES_GCM_auth_decryption_test_case_192_7),
8523
8524                 /** AES GCM Authenticated Encryption 256 bits key */
8525                 TEST_CASE_ST(ut_setup, ut_teardown,
8526                         test_AES_GCM_auth_encryption_test_case_256_1),
8527                 TEST_CASE_ST(ut_setup, ut_teardown,
8528                         test_AES_GCM_auth_encryption_test_case_256_2),
8529                 TEST_CASE_ST(ut_setup, ut_teardown,
8530                         test_AES_GCM_auth_encryption_test_case_256_3),
8531                 TEST_CASE_ST(ut_setup, ut_teardown,
8532                         test_AES_GCM_auth_encryption_test_case_256_4),
8533                 TEST_CASE_ST(ut_setup, ut_teardown,
8534                         test_AES_GCM_auth_encryption_test_case_256_5),
8535                 TEST_CASE_ST(ut_setup, ut_teardown,
8536                         test_AES_GCM_auth_encryption_test_case_256_6),
8537                 TEST_CASE_ST(ut_setup, ut_teardown,
8538                         test_AES_GCM_auth_encryption_test_case_256_7),
8539
8540                 /** AES GCM Authenticated Decryption 256 bits key */
8541                 TEST_CASE_ST(ut_setup, ut_teardown,
8542                         test_AES_GCM_auth_decryption_test_case_256_1),
8543                 TEST_CASE_ST(ut_setup, ut_teardown,
8544                         test_AES_GCM_auth_decryption_test_case_256_2),
8545                 TEST_CASE_ST(ut_setup, ut_teardown,
8546                         test_AES_GCM_auth_decryption_test_case_256_3),
8547                 TEST_CASE_ST(ut_setup, ut_teardown,
8548                         test_AES_GCM_auth_decryption_test_case_256_4),
8549                 TEST_CASE_ST(ut_setup, ut_teardown,
8550                         test_AES_GCM_auth_decryption_test_case_256_5),
8551                 TEST_CASE_ST(ut_setup, ut_teardown,
8552                         test_AES_GCM_auth_decryption_test_case_256_6),
8553                 TEST_CASE_ST(ut_setup, ut_teardown,
8554                         test_AES_GCM_auth_decryption_test_case_256_7),
8555
8556                 /** AES GCM Authenticated Encryption big aad size */
8557                 TEST_CASE_ST(ut_setup, ut_teardown,
8558                         test_AES_GCM_auth_encryption_test_case_aad_1),
8559                 TEST_CASE_ST(ut_setup, ut_teardown,
8560                         test_AES_GCM_auth_encryption_test_case_aad_2),
8561
8562                 /** AES GCM Authenticated Decryption big aad size */
8563                 TEST_CASE_ST(ut_setup, ut_teardown,
8564                         test_AES_GCM_auth_decryption_test_case_aad_1),
8565                 TEST_CASE_ST(ut_setup, ut_teardown,
8566                         test_AES_GCM_auth_decryption_test_case_aad_2),
8567
8568                 /** AES GMAC Authentication */
8569                 TEST_CASE_ST(ut_setup, ut_teardown,
8570                         test_AES_GMAC_authentication_test_case_1),
8571                 TEST_CASE_ST(ut_setup, ut_teardown,
8572                         test_AES_GMAC_authentication_verify_test_case_1),
8573                 TEST_CASE_ST(ut_setup, ut_teardown,
8574                         test_AES_GMAC_authentication_test_case_3),
8575                 TEST_CASE_ST(ut_setup, ut_teardown,
8576                         test_AES_GMAC_authentication_verify_test_case_3),
8577                 TEST_CASE_ST(ut_setup, ut_teardown,
8578                         test_AES_GMAC_authentication_test_case_4),
8579                 TEST_CASE_ST(ut_setup, ut_teardown,
8580                         test_AES_GMAC_authentication_verify_test_case_4),
8581
8582                 /** Negative tests */
8583                 TEST_CASE_ST(ut_setup, ut_teardown,
8584                         authentication_verify_AES128_GMAC_fail_data_corrupt),
8585                 TEST_CASE_ST(ut_setup, ut_teardown,
8586                         authentication_verify_AES128_GMAC_fail_tag_corrupt),
8587
8588                 /** Out of place tests */
8589                 TEST_CASE_ST(ut_setup, ut_teardown,
8590                         test_AES_GCM_authenticated_encryption_oop_test_case_1),
8591                 TEST_CASE_ST(ut_setup, ut_teardown,
8592                         test_AES_GCM_authenticated_decryption_oop_test_case_1),
8593
8594                 /** Session-less tests */
8595                 TEST_CASE_ST(ut_setup, ut_teardown,
8596                         test_AES_GCM_authenticated_encryption_sessionless_test_case_1),
8597                 TEST_CASE_ST(ut_setup, ut_teardown,
8598                         test_AES_GCM_authenticated_decryption_sessionless_test_case_1),
8599
8600                 /** Scatter-Gather */
8601                 TEST_CASE_ST(ut_setup, ut_teardown,
8602                         test_AES_GCM_auth_encrypt_SGL_out_of_place_400B_1seg),
8603
8604                 TEST_CASES_END() /**< NULL terminate unit test array */
8605         }
8606 };
8607
8608 static struct unit_test_suite cryptodev_sw_kasumi_testsuite  = {
8609         .suite_name = "Crypto Device SW KASUMI Unit Test Suite",
8610         .setup = testsuite_setup,
8611         .teardown = testsuite_teardown,
8612         .unit_test_cases = {
8613                 /** KASUMI encrypt only (UEA1) */
8614                 TEST_CASE_ST(ut_setup, ut_teardown,
8615                         test_kasumi_encryption_test_case_1),
8616                 TEST_CASE_ST(ut_setup, ut_teardown,
8617                         test_kasumi_encryption_test_case_1_sgl),
8618                 TEST_CASE_ST(ut_setup, ut_teardown,
8619                         test_kasumi_encryption_test_case_2),
8620                 TEST_CASE_ST(ut_setup, ut_teardown,
8621                         test_kasumi_encryption_test_case_3),
8622                 TEST_CASE_ST(ut_setup, ut_teardown,
8623                         test_kasumi_encryption_test_case_4),
8624                 TEST_CASE_ST(ut_setup, ut_teardown,
8625                         test_kasumi_encryption_test_case_5),
8626                 /** KASUMI decrypt only (UEA1) */
8627                 TEST_CASE_ST(ut_setup, ut_teardown,
8628                         test_kasumi_decryption_test_case_1),
8629                 TEST_CASE_ST(ut_setup, ut_teardown,
8630                         test_kasumi_decryption_test_case_2),
8631                 TEST_CASE_ST(ut_setup, ut_teardown,
8632                         test_kasumi_decryption_test_case_3),
8633                 TEST_CASE_ST(ut_setup, ut_teardown,
8634                         test_kasumi_decryption_test_case_4),
8635                 TEST_CASE_ST(ut_setup, ut_teardown,
8636                         test_kasumi_decryption_test_case_5),
8637
8638                 TEST_CASE_ST(ut_setup, ut_teardown,
8639                         test_kasumi_encryption_test_case_1_oop),
8640                 TEST_CASE_ST(ut_setup, ut_teardown,
8641                         test_kasumi_encryption_test_case_1_oop_sgl),
8642
8643
8644                 TEST_CASE_ST(ut_setup, ut_teardown,
8645                         test_kasumi_decryption_test_case_1_oop),
8646
8647                 /** KASUMI hash only (UIA1) */
8648                 TEST_CASE_ST(ut_setup, ut_teardown,
8649                         test_kasumi_hash_generate_test_case_1),
8650                 TEST_CASE_ST(ut_setup, ut_teardown,
8651                         test_kasumi_hash_generate_test_case_2),
8652                 TEST_CASE_ST(ut_setup, ut_teardown,
8653                         test_kasumi_hash_generate_test_case_3),
8654                 TEST_CASE_ST(ut_setup, ut_teardown,
8655                         test_kasumi_hash_generate_test_case_4),
8656                 TEST_CASE_ST(ut_setup, ut_teardown,
8657                         test_kasumi_hash_generate_test_case_5),
8658                 TEST_CASE_ST(ut_setup, ut_teardown,
8659                         test_kasumi_hash_generate_test_case_6),
8660                 TEST_CASE_ST(ut_setup, ut_teardown,
8661                         test_kasumi_hash_verify_test_case_1),
8662                 TEST_CASE_ST(ut_setup, ut_teardown,
8663                         test_kasumi_hash_verify_test_case_2),
8664                 TEST_CASE_ST(ut_setup, ut_teardown,
8665                         test_kasumi_hash_verify_test_case_3),
8666                 TEST_CASE_ST(ut_setup, ut_teardown,
8667                         test_kasumi_hash_verify_test_case_4),
8668                 TEST_CASE_ST(ut_setup, ut_teardown,
8669                         test_kasumi_hash_verify_test_case_5),
8670                 TEST_CASE_ST(ut_setup, ut_teardown,
8671                         test_kasumi_auth_cipher_test_case_1),
8672                 TEST_CASE_ST(ut_setup, ut_teardown,
8673                         test_kasumi_cipher_auth_test_case_1),
8674                 TEST_CASES_END() /**< NULL terminate unit test array */
8675         }
8676 };
8677 static struct unit_test_suite cryptodev_sw_snow3g_testsuite  = {
8678         .suite_name = "Crypto Device SW SNOW 3G Unit Test Suite",
8679         .setup = testsuite_setup,
8680         .teardown = testsuite_teardown,
8681         .unit_test_cases = {
8682                 /** SNOW 3G encrypt only (UEA2) */
8683                 TEST_CASE_ST(ut_setup, ut_teardown,
8684                         test_snow3g_encryption_test_case_1),
8685                 TEST_CASE_ST(ut_setup, ut_teardown,
8686                         test_snow3g_encryption_test_case_2),
8687                 TEST_CASE_ST(ut_setup, ut_teardown,
8688                         test_snow3g_encryption_test_case_3),
8689                 TEST_CASE_ST(ut_setup, ut_teardown,
8690                         test_snow3g_encryption_test_case_4),
8691                 TEST_CASE_ST(ut_setup, ut_teardown,
8692                         test_snow3g_encryption_test_case_5),
8693
8694                 TEST_CASE_ST(ut_setup, ut_teardown,
8695                         test_snow3g_encryption_test_case_1_oop),
8696                 TEST_CASE_ST(ut_setup, ut_teardown,
8697                                 test_snow3g_encryption_test_case_1_oop_sgl),
8698                 TEST_CASE_ST(ut_setup, ut_teardown,
8699                         test_snow3g_decryption_test_case_1_oop),
8700
8701                 TEST_CASE_ST(ut_setup, ut_teardown,
8702                         test_snow3g_encryption_test_case_1_offset_oop),
8703
8704                 /** SNOW 3G decrypt only (UEA2) */
8705                 TEST_CASE_ST(ut_setup, ut_teardown,
8706                         test_snow3g_decryption_test_case_1),
8707                 TEST_CASE_ST(ut_setup, ut_teardown,
8708                         test_snow3g_decryption_test_case_2),
8709                 TEST_CASE_ST(ut_setup, ut_teardown,
8710                         test_snow3g_decryption_test_case_3),
8711                 TEST_CASE_ST(ut_setup, ut_teardown,
8712                         test_snow3g_decryption_test_case_4),
8713                 TEST_CASE_ST(ut_setup, ut_teardown,
8714                         test_snow3g_decryption_test_case_5),
8715                 TEST_CASE_ST(ut_setup, ut_teardown,
8716                         test_snow3g_hash_generate_test_case_1),
8717                 TEST_CASE_ST(ut_setup, ut_teardown,
8718                         test_snow3g_hash_generate_test_case_2),
8719                 TEST_CASE_ST(ut_setup, ut_teardown,
8720                         test_snow3g_hash_generate_test_case_3),
8721                 /* Tests with buffers which length is not byte-aligned */
8722                 TEST_CASE_ST(ut_setup, ut_teardown,
8723                         test_snow3g_hash_generate_test_case_4),
8724                 TEST_CASE_ST(ut_setup, ut_teardown,
8725                         test_snow3g_hash_generate_test_case_5),
8726                 TEST_CASE_ST(ut_setup, ut_teardown,
8727                         test_snow3g_hash_generate_test_case_6),
8728                 TEST_CASE_ST(ut_setup, ut_teardown,
8729                         test_snow3g_hash_verify_test_case_1),
8730                 TEST_CASE_ST(ut_setup, ut_teardown,
8731                         test_snow3g_hash_verify_test_case_2),
8732                 TEST_CASE_ST(ut_setup, ut_teardown,
8733                         test_snow3g_hash_verify_test_case_3),
8734                 /* Tests with buffers which length is not byte-aligned */
8735                 TEST_CASE_ST(ut_setup, ut_teardown,
8736                         test_snow3g_hash_verify_test_case_4),
8737                 TEST_CASE_ST(ut_setup, ut_teardown,
8738                         test_snow3g_hash_verify_test_case_5),
8739                 TEST_CASE_ST(ut_setup, ut_teardown,
8740                         test_snow3g_hash_verify_test_case_6),
8741                 TEST_CASE_ST(ut_setup, ut_teardown,
8742                         test_snow3g_cipher_auth_test_case_1),
8743                 TEST_CASE_ST(ut_setup, ut_teardown,
8744                         test_snow3g_auth_cipher_test_case_1),
8745
8746                 TEST_CASES_END() /**< NULL terminate unit test array */
8747         }
8748 };
8749
8750 static struct unit_test_suite cryptodev_sw_zuc_testsuite  = {
8751         .suite_name = "Crypto Device SW ZUC Unit Test Suite",
8752         .setup = testsuite_setup,
8753         .teardown = testsuite_teardown,
8754         .unit_test_cases = {
8755                 /** ZUC encrypt only (EEA3) */
8756                 TEST_CASE_ST(ut_setup, ut_teardown,
8757                         test_zuc_encryption_test_case_1),
8758                 TEST_CASE_ST(ut_setup, ut_teardown,
8759                         test_zuc_encryption_test_case_2),
8760                 TEST_CASE_ST(ut_setup, ut_teardown,
8761                         test_zuc_encryption_test_case_3),
8762                 TEST_CASE_ST(ut_setup, ut_teardown,
8763                         test_zuc_encryption_test_case_4),
8764                 TEST_CASE_ST(ut_setup, ut_teardown,
8765                         test_zuc_encryption_test_case_5),
8766                 TEST_CASE_ST(ut_setup, ut_teardown,
8767                         test_zuc_hash_generate_test_case_1),
8768                 TEST_CASE_ST(ut_setup, ut_teardown,
8769                         test_zuc_hash_generate_test_case_2),
8770                 TEST_CASE_ST(ut_setup, ut_teardown,
8771                         test_zuc_hash_generate_test_case_3),
8772                 TEST_CASE_ST(ut_setup, ut_teardown,
8773                         test_zuc_hash_generate_test_case_4),
8774                 TEST_CASE_ST(ut_setup, ut_teardown,
8775                         test_zuc_hash_generate_test_case_5),
8776                 TEST_CASE_ST(ut_setup, ut_teardown,
8777                         test_zuc_encryption_test_case_6_sgl),
8778                 TEST_CASES_END() /**< NULL terminate unit test array */
8779         }
8780 };
8781
8782 static struct unit_test_suite cryptodev_dpaa2_sec_testsuite  = {
8783         .suite_name = "Crypto DPAA2_SEC Unit Test Suite",
8784         .setup = testsuite_setup,
8785         .teardown = testsuite_teardown,
8786         .unit_test_cases = {
8787                 TEST_CASE_ST(ut_setup, ut_teardown,
8788                         test_device_configure_invalid_dev_id),
8789                 TEST_CASE_ST(ut_setup, ut_teardown,
8790                         test_multi_session),
8791
8792                 TEST_CASE_ST(ut_setup, ut_teardown,
8793                         test_AES_chain_dpaa2_sec_all),
8794                 TEST_CASE_ST(ut_setup, ut_teardown,
8795                         test_3DES_chain_dpaa2_sec_all),
8796                 TEST_CASE_ST(ut_setup, ut_teardown,
8797                         test_AES_cipheronly_dpaa2_sec_all),
8798                 TEST_CASE_ST(ut_setup, ut_teardown,
8799                         test_3DES_cipheronly_dpaa2_sec_all),
8800                 TEST_CASE_ST(ut_setup, ut_teardown,
8801                         test_authonly_dpaa2_sec_all),
8802
8803                 /** AES GCM Authenticated Encryption */
8804                 TEST_CASE_ST(ut_setup, ut_teardown,
8805                         test_AES_GCM_authenticated_encryption_test_case_1),
8806                 TEST_CASE_ST(ut_setup, ut_teardown,
8807                         test_AES_GCM_authenticated_encryption_test_case_2),
8808                 TEST_CASE_ST(ut_setup, ut_teardown,
8809                         test_AES_GCM_authenticated_encryption_test_case_3),
8810                 TEST_CASE_ST(ut_setup, ut_teardown,
8811                         test_AES_GCM_authenticated_encryption_test_case_4),
8812                 TEST_CASE_ST(ut_setup, ut_teardown,
8813                         test_AES_GCM_authenticated_encryption_test_case_5),
8814                 TEST_CASE_ST(ut_setup, ut_teardown,
8815                         test_AES_GCM_authenticated_encryption_test_case_6),
8816                 TEST_CASE_ST(ut_setup, ut_teardown,
8817                         test_AES_GCM_authenticated_encryption_test_case_7),
8818
8819                 /** AES GCM Authenticated Decryption */
8820                 TEST_CASE_ST(ut_setup, ut_teardown,
8821                         test_AES_GCM_authenticated_decryption_test_case_1),
8822                 TEST_CASE_ST(ut_setup, ut_teardown,
8823                         test_AES_GCM_authenticated_decryption_test_case_2),
8824                 TEST_CASE_ST(ut_setup, ut_teardown,
8825                         test_AES_GCM_authenticated_decryption_test_case_3),
8826                 TEST_CASE_ST(ut_setup, ut_teardown,
8827                         test_AES_GCM_authenticated_decryption_test_case_4),
8828                 TEST_CASE_ST(ut_setup, ut_teardown,
8829                         test_AES_GCM_authenticated_decryption_test_case_5),
8830                 TEST_CASE_ST(ut_setup, ut_teardown,
8831                         test_AES_GCM_authenticated_decryption_test_case_6),
8832                 TEST_CASE_ST(ut_setup, ut_teardown,
8833                         test_AES_GCM_authenticated_decryption_test_case_7),
8834
8835                 /** AES GCM Authenticated Encryption 192 bits key */
8836                 TEST_CASE_ST(ut_setup, ut_teardown,
8837                         test_AES_GCM_auth_encryption_test_case_192_1),
8838                 TEST_CASE_ST(ut_setup, ut_teardown,
8839                         test_AES_GCM_auth_encryption_test_case_192_2),
8840                 TEST_CASE_ST(ut_setup, ut_teardown,
8841                         test_AES_GCM_auth_encryption_test_case_192_3),
8842                 TEST_CASE_ST(ut_setup, ut_teardown,
8843                         test_AES_GCM_auth_encryption_test_case_192_4),
8844                 TEST_CASE_ST(ut_setup, ut_teardown,
8845                         test_AES_GCM_auth_encryption_test_case_192_5),
8846                 TEST_CASE_ST(ut_setup, ut_teardown,
8847                         test_AES_GCM_auth_encryption_test_case_192_6),
8848                 TEST_CASE_ST(ut_setup, ut_teardown,
8849                         test_AES_GCM_auth_encryption_test_case_192_7),
8850
8851                 /** AES GCM Authenticated Decryption 192 bits key */
8852                 TEST_CASE_ST(ut_setup, ut_teardown,
8853                         test_AES_GCM_auth_decryption_test_case_192_1),
8854                 TEST_CASE_ST(ut_setup, ut_teardown,
8855                         test_AES_GCM_auth_decryption_test_case_192_2),
8856                 TEST_CASE_ST(ut_setup, ut_teardown,
8857                         test_AES_GCM_auth_decryption_test_case_192_3),
8858                 TEST_CASE_ST(ut_setup, ut_teardown,
8859                         test_AES_GCM_auth_decryption_test_case_192_4),
8860                 TEST_CASE_ST(ut_setup, ut_teardown,
8861                         test_AES_GCM_auth_decryption_test_case_192_5),
8862                 TEST_CASE_ST(ut_setup, ut_teardown,
8863                         test_AES_GCM_auth_decryption_test_case_192_6),
8864                 TEST_CASE_ST(ut_setup, ut_teardown,
8865                         test_AES_GCM_auth_decryption_test_case_192_7),
8866
8867                 /** AES GCM Authenticated Encryption 256 bits key */
8868                 TEST_CASE_ST(ut_setup, ut_teardown,
8869                         test_AES_GCM_auth_encryption_test_case_256_1),
8870                 TEST_CASE_ST(ut_setup, ut_teardown,
8871                         test_AES_GCM_auth_encryption_test_case_256_2),
8872                 TEST_CASE_ST(ut_setup, ut_teardown,
8873                         test_AES_GCM_auth_encryption_test_case_256_3),
8874                 TEST_CASE_ST(ut_setup, ut_teardown,
8875                         test_AES_GCM_auth_encryption_test_case_256_4),
8876                 TEST_CASE_ST(ut_setup, ut_teardown,
8877                         test_AES_GCM_auth_encryption_test_case_256_5),
8878                 TEST_CASE_ST(ut_setup, ut_teardown,
8879                         test_AES_GCM_auth_encryption_test_case_256_6),
8880                 TEST_CASE_ST(ut_setup, ut_teardown,
8881                         test_AES_GCM_auth_encryption_test_case_256_7),
8882
8883                 /** AES GCM Authenticated Decryption 256 bits key */
8884                 TEST_CASE_ST(ut_setup, ut_teardown,
8885                         test_AES_GCM_auth_decryption_test_case_256_1),
8886                 TEST_CASE_ST(ut_setup, ut_teardown,
8887                         test_AES_GCM_auth_decryption_test_case_256_2),
8888                 TEST_CASE_ST(ut_setup, ut_teardown,
8889                         test_AES_GCM_auth_decryption_test_case_256_3),
8890                 TEST_CASE_ST(ut_setup, ut_teardown,
8891                         test_AES_GCM_auth_decryption_test_case_256_4),
8892                 TEST_CASE_ST(ut_setup, ut_teardown,
8893                         test_AES_GCM_auth_decryption_test_case_256_5),
8894                 TEST_CASE_ST(ut_setup, ut_teardown,
8895                         test_AES_GCM_auth_decryption_test_case_256_6),
8896                 TEST_CASE_ST(ut_setup, ut_teardown,
8897                         test_AES_GCM_auth_decryption_test_case_256_7),
8898
8899                 TEST_CASES_END() /**< NULL terminate unit test array */
8900         }
8901 };
8902
8903 static struct unit_test_suite cryptodev_null_testsuite  = {
8904         .suite_name = "Crypto Device NULL Unit Test Suite",
8905         .setup = testsuite_setup,
8906         .teardown = testsuite_teardown,
8907         .unit_test_cases = {
8908                 TEST_CASE_ST(ut_setup, ut_teardown,
8909                         test_null_auth_only_operation),
8910                 TEST_CASE_ST(ut_setup, ut_teardown,
8911                         test_null_cipher_only_operation),
8912                 TEST_CASE_ST(ut_setup, ut_teardown,
8913                         test_null_cipher_auth_operation),
8914                 TEST_CASE_ST(ut_setup, ut_teardown,
8915                         test_null_auth_cipher_operation),
8916                 TEST_CASE_ST(ut_setup, ut_teardown,
8917                         test_null_invalid_operation),
8918                 TEST_CASE_ST(ut_setup, ut_teardown,
8919                         test_null_burst_operation),
8920
8921                 TEST_CASES_END() /**< NULL terminate unit test array */
8922         }
8923 };
8924
8925 static struct unit_test_suite cryptodev_armv8_testsuite  = {
8926         .suite_name = "Crypto Device ARMv8 Unit Test Suite",
8927         .setup = testsuite_setup,
8928         .teardown = testsuite_teardown,
8929         .unit_test_cases = {
8930                 TEST_CASE_ST(ut_setup, ut_teardown, test_AES_chain_armv8_all),
8931
8932                 /** Negative tests */
8933                 TEST_CASE_ST(ut_setup, ut_teardown,
8934                         auth_decryption_AES128CBC_HMAC_SHA1_fail_data_corrupt),
8935                 TEST_CASE_ST(ut_setup, ut_teardown,
8936                         auth_decryption_AES128CBC_HMAC_SHA1_fail_tag_corrupt),
8937
8938                 TEST_CASES_END() /**< NULL terminate unit test array */
8939         }
8940 };
8941
8942 static int
8943 test_cryptodev_qat(void /*argv __rte_unused, int argc __rte_unused*/)
8944 {
8945         gbl_driver_id = rte_cryptodev_driver_id_get(
8946                         RTE_STR(CRYPTODEV_NAME_QAT_SYM_PMD));
8947
8948         if (gbl_driver_id == -1) {
8949                 RTE_LOG(ERR, USER1, "QAT PMD must be loaded. Check if "
8950                                 "CONFIG_RTE_LIBRTE_PMD_QAT is enabled "
8951                                 "in config file to run this testsuite.\n");
8952                 return TEST_FAILED;
8953         }
8954
8955         return unit_test_suite_runner(&cryptodev_qat_testsuite);
8956 }
8957
8958 static int
8959 test_cryptodev_aesni_mb(void /*argv __rte_unused, int argc __rte_unused*/)
8960 {
8961         gbl_driver_id = rte_cryptodev_driver_id_get(
8962                         RTE_STR(CRYPTODEV_NAME_AESNI_MB_PMD));
8963
8964         if (gbl_driver_id == -1) {
8965                 RTE_LOG(ERR, USER1, "AESNI MB PMD must be loaded. Check if "
8966                                 "CONFIG_RTE_LIBRTE_PMD_AESNI_MB is enabled "
8967                                 "in config file to run this testsuite.\n");
8968                 return TEST_FAILED;
8969         }
8970
8971         return unit_test_suite_runner(&cryptodev_aesni_mb_testsuite);
8972 }
8973
8974 static int
8975 test_cryptodev_openssl(void)
8976 {
8977         gbl_driver_id = rte_cryptodev_driver_id_get(
8978                         RTE_STR(CRYPTODEV_NAME_OPENSSL_PMD));
8979
8980         if (gbl_driver_id == -1) {
8981                 RTE_LOG(ERR, USER1, "OPENSSL PMD must be loaded. Check if "
8982                                 "CONFIG_RTE_LIBRTE_PMD_OPENSSL is enabled "
8983                                 "in config file to run this testsuite.\n");
8984                 return TEST_FAILED;
8985         }
8986
8987         return unit_test_suite_runner(&cryptodev_openssl_testsuite);
8988 }
8989
8990 static int
8991 test_cryptodev_aesni_gcm(void)
8992 {
8993         gbl_driver_id = rte_cryptodev_driver_id_get(
8994                         RTE_STR(CRYPTODEV_NAME_AESNI_GCM_PMD));
8995
8996         if (gbl_driver_id == -1) {
8997                 RTE_LOG(ERR, USER1, "AESNI GCM PMD must be loaded. Check if "
8998                                 "CONFIG_RTE_LIBRTE_PMD_AESNI_GCM is enabled "
8999                                 "in config file to run this testsuite.\n");
9000                 return TEST_FAILED;
9001         }
9002
9003         return unit_test_suite_runner(&cryptodev_aesni_gcm_testsuite);
9004 }
9005
9006 static int
9007 test_cryptodev_null(void)
9008 {
9009         gbl_driver_id = rte_cryptodev_driver_id_get(
9010                         RTE_STR(CRYPTODEV_NAME_NULL_PMD));
9011
9012         if (gbl_driver_id == -1) {
9013                 RTE_LOG(ERR, USER1, "NULL PMD must be loaded. Check if "
9014                                 "CONFIG_RTE_LIBRTE_PMD_NULL is enabled "
9015                                 "in config file to run this testsuite.\n");
9016                 return TEST_FAILED;
9017         }
9018
9019         return unit_test_suite_runner(&cryptodev_null_testsuite);
9020 }
9021
9022 static int
9023 test_cryptodev_sw_snow3g(void /*argv __rte_unused, int argc __rte_unused*/)
9024 {
9025         gbl_driver_id = rte_cryptodev_driver_id_get(
9026                         RTE_STR(CRYPTODEV_NAME_SNOW3G_PMD));
9027
9028         if (gbl_driver_id == -1) {
9029                 RTE_LOG(ERR, USER1, "SNOW3G PMD must be loaded. Check if "
9030                                 "CONFIG_RTE_LIBRTE_PMD_SNOW3G is enabled "
9031                                 "in config file to run this testsuite.\n");
9032                 return TEST_FAILED;
9033         }
9034
9035         return unit_test_suite_runner(&cryptodev_sw_snow3g_testsuite);
9036 }
9037
9038 static int
9039 test_cryptodev_sw_kasumi(void /*argv __rte_unused, int argc __rte_unused*/)
9040 {
9041         gbl_driver_id = rte_cryptodev_driver_id_get(
9042                         RTE_STR(CRYPTODEV_NAME_KASUMI_PMD));
9043
9044         if (gbl_driver_id == -1) {
9045                 RTE_LOG(ERR, USER1, "ZUC PMD must be loaded. Check if "
9046                                 "CONFIG_RTE_LIBRTE_PMD_KASUMI is enabled "
9047                                 "in config file to run this testsuite.\n");
9048                 return TEST_FAILED;
9049         }
9050
9051         return unit_test_suite_runner(&cryptodev_sw_kasumi_testsuite);
9052 }
9053
9054 static int
9055 test_cryptodev_sw_zuc(void /*argv __rte_unused, int argc __rte_unused*/)
9056 {
9057         gbl_driver_id = rte_cryptodev_driver_id_get(
9058                         RTE_STR(CRYPTODEV_NAME_ZUC_PMD));
9059
9060         if (gbl_driver_id == -1) {
9061                 RTE_LOG(ERR, USER1, "ZUC PMD must be loaded. Check if "
9062                                 "CONFIG_RTE_LIBRTE_PMD_ZUC is enabled "
9063                                 "in config file to run this testsuite.\n");
9064                 return TEST_FAILED;
9065         }
9066
9067         return unit_test_suite_runner(&cryptodev_sw_zuc_testsuite);
9068 }
9069
9070 static int
9071 test_cryptodev_armv8(void)
9072 {
9073         gbl_driver_id = rte_cryptodev_driver_id_get(
9074                         RTE_STR(CRYPTODEV_NAME_ARMV8_PMD));
9075
9076         if (gbl_driver_id == -1) {
9077                 RTE_LOG(ERR, USER1, "ARMV8 PMD must be loaded. Check if "
9078                                 "CONFIG_RTE_LIBRTE_PMD_ARMV8 is enabled "
9079                                 "in config file to run this testsuite.\n");
9080                 return TEST_FAILED;
9081         }
9082
9083         return unit_test_suite_runner(&cryptodev_armv8_testsuite);
9084 }
9085
9086 #ifdef RTE_LIBRTE_PMD_CRYPTO_SCHEDULER
9087
9088 static int
9089 test_cryptodev_scheduler(void /*argv __rte_unused, int argc __rte_unused*/)
9090 {
9091         gbl_driver_id = rte_cryptodev_driver_id_get(
9092                         RTE_STR(CRYPTODEV_NAME_SCHEDULER_PMD));
9093
9094         if (gbl_driver_id == -1) {
9095                 RTE_LOG(ERR, USER1, "SCHEDULER PMD must be loaded. Check if "
9096                                 "CONFIG_RTE_LIBRTE_PMD_SCHEDULER is enabled "
9097                                 "in config file to run this testsuite.\n");
9098                 return TEST_FAILED;
9099         }
9100
9101         if (rte_cryptodev_driver_id_get(
9102                                 RTE_STR(CRYPTODEV_NAME_AESNI_MB_PMD)) == -1) {
9103                 RTE_LOG(ERR, USER1, "CONFIG_RTE_LIBRTE_PMD_AESNI_MB must be"
9104                         " enabled in config file to run this testsuite.\n");
9105                 return TEST_FAILED;
9106 }
9107         return unit_test_suite_runner(&cryptodev_scheduler_testsuite);
9108 }
9109
9110 REGISTER_TEST_COMMAND(cryptodev_scheduler_autotest, test_cryptodev_scheduler);
9111
9112 #endif
9113
9114 static int
9115 test_cryptodev_dpaa2_sec(void /*argv __rte_unused, int argc __rte_unused*/)
9116 {
9117         gbl_driver_id = rte_cryptodev_driver_id_get(
9118                         RTE_STR(CRYPTODEV_NAME_DPAA2_SEC_PMD));
9119
9120         if (gbl_driver_id == -1) {
9121                 RTE_LOG(ERR, USER1, "DPAA2 SEC PMD must be loaded. Check if "
9122                                 "CONFIG_RTE_LIBRTE_PMD_DPAA2_SEC is enabled "
9123                                 "in config file to run this testsuite.\n");
9124                 return TEST_FAILED;
9125         }
9126
9127         return unit_test_suite_runner(&cryptodev_dpaa2_sec_testsuite);
9128 }
9129
9130 REGISTER_TEST_COMMAND(cryptodev_qat_autotest, test_cryptodev_qat);
9131 REGISTER_TEST_COMMAND(cryptodev_aesni_mb_autotest, test_cryptodev_aesni_mb);
9132 REGISTER_TEST_COMMAND(cryptodev_openssl_autotest, test_cryptodev_openssl);
9133 REGISTER_TEST_COMMAND(cryptodev_aesni_gcm_autotest, test_cryptodev_aesni_gcm);
9134 REGISTER_TEST_COMMAND(cryptodev_null_autotest, test_cryptodev_null);
9135 REGISTER_TEST_COMMAND(cryptodev_sw_snow3g_autotest, test_cryptodev_sw_snow3g);
9136 REGISTER_TEST_COMMAND(cryptodev_sw_kasumi_autotest, test_cryptodev_sw_kasumi);
9137 REGISTER_TEST_COMMAND(cryptodev_sw_zuc_autotest, test_cryptodev_sw_zuc);
9138 REGISTER_TEST_COMMAND(cryptodev_sw_armv8_autotest, test_cryptodev_armv8);
9139 REGISTER_TEST_COMMAND(cryptodev_dpaa2_sec_autotest, test_cryptodev_dpaa2_sec);