83b8ee7f3e3f9c0ede60872bbbffeaf985b38973
[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_aead_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(CRYPTODEV_NAME_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_cipheronly_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_CIPHERONLY_TYPE);
4687
4688         TEST_ASSERT_EQUAL(status, 0, "Test failed");
4689
4690         return TEST_SUCCESS;
4691 }
4692
4693 static int
4694 test_DES_docsis_openssl_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_OPENSSL_PMD)),
4705                 BLKCIPHER_DES_DOCSIS_TYPE);
4706
4707         TEST_ASSERT_EQUAL(status, 0, "Test failed");
4708
4709         return TEST_SUCCESS;
4710 }
4711
4712 static int
4713 test_DES_cipheronly_mb_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_AESNI_MB_PMD)),
4724                 BLKCIPHER_DES_CIPHERONLY_TYPE);
4725
4726         TEST_ASSERT_EQUAL(status, 0, "Test failed");
4727
4728         return TEST_SUCCESS;
4729 }
4730
4731 static int
4732 test_DES_docsis_mb_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_AESNI_MB_PMD)),
4743                 BLKCIPHER_DES_DOCSIS_TYPE);
4744
4745         TEST_ASSERT_EQUAL(status, 0, "Test failed");
4746
4747         return TEST_SUCCESS;
4748 }
4749
4750 static int
4751 test_3DES_chain_dpaa2_sec_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_DPAA2_SEC_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_dpaa2_sec_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_DPAA2_SEC_PMD)),
4781                 BLKCIPHER_3DES_CIPHERONLY_TYPE);
4782
4783         TEST_ASSERT_EQUAL(status, 0, "Test failed");
4784
4785         return TEST_SUCCESS;
4786 }
4787
4788 static int
4789 test_3DES_cipheronly_qat_all(void)
4790 {
4791         struct crypto_testsuite_params *ts_params = &testsuite_params;
4792         int status;
4793
4794         status = test_blockcipher_all_tests(ts_params->mbuf_pool,
4795                 ts_params->op_mpool,
4796                 ts_params->session_mpool,
4797                 ts_params->valid_devs[0],
4798                 rte_cryptodev_driver_id_get(
4799                 RTE_STR(CRYPTODEV_NAME_QAT_SYM_PMD)),
4800                 BLKCIPHER_3DES_CIPHERONLY_TYPE);
4801
4802         TEST_ASSERT_EQUAL(status, 0, "Test failed");
4803
4804         return TEST_SUCCESS;
4805 }
4806
4807 static int
4808 test_3DES_chain_openssl_all(void)
4809 {
4810         struct crypto_testsuite_params *ts_params = &testsuite_params;
4811         int status;
4812
4813         status = test_blockcipher_all_tests(ts_params->mbuf_pool,
4814                 ts_params->op_mpool,
4815                 ts_params->session_mpool,
4816                 ts_params->valid_devs[0],
4817                 rte_cryptodev_driver_id_get(
4818                 RTE_STR(CRYPTODEV_NAME_OPENSSL_PMD)),
4819                 BLKCIPHER_3DES_CHAIN_TYPE);
4820
4821         TEST_ASSERT_EQUAL(status, 0, "Test failed");
4822
4823         return TEST_SUCCESS;
4824 }
4825
4826 static int
4827 test_3DES_cipheronly_openssl_all(void)
4828 {
4829         struct crypto_testsuite_params *ts_params = &testsuite_params;
4830         int status;
4831
4832         status = test_blockcipher_all_tests(ts_params->mbuf_pool,
4833                 ts_params->op_mpool,
4834                 ts_params->session_mpool,
4835                 ts_params->valid_devs[0],
4836                 rte_cryptodev_driver_id_get(
4837                 RTE_STR(CRYPTODEV_NAME_OPENSSL_PMD)),
4838                 BLKCIPHER_3DES_CIPHERONLY_TYPE);
4839
4840         TEST_ASSERT_EQUAL(status, 0, "Test failed");
4841
4842         return TEST_SUCCESS;
4843 }
4844
4845 /* ***** AEAD algorithm Tests ***** */
4846
4847 static int
4848 create_aead_session(uint8_t dev_id, enum rte_crypto_aead_algorithm algo,
4849                 enum rte_crypto_aead_operation op,
4850                 const uint8_t *key, const uint8_t key_len,
4851                 const uint16_t aad_len, const uint8_t auth_len,
4852                 uint8_t iv_len)
4853 {
4854         uint8_t aead_key[key_len];
4855
4856         struct crypto_testsuite_params *ts_params = &testsuite_params;
4857         struct crypto_unittest_params *ut_params = &unittest_params;
4858
4859         memcpy(aead_key, key, key_len);
4860
4861         /* Setup AEAD Parameters */
4862         ut_params->aead_xform.type = RTE_CRYPTO_SYM_XFORM_AEAD;
4863         ut_params->aead_xform.next = NULL;
4864         ut_params->aead_xform.aead.algo = algo;
4865         ut_params->aead_xform.aead.op = op;
4866         ut_params->aead_xform.aead.key.data = aead_key;
4867         ut_params->aead_xform.aead.key.length = key_len;
4868         ut_params->aead_xform.aead.iv.offset = IV_OFFSET;
4869         ut_params->aead_xform.aead.iv.length = iv_len;
4870         ut_params->aead_xform.aead.digest_length = auth_len;
4871         ut_params->aead_xform.aead.aad_length = aad_len;
4872
4873         TEST_HEXDUMP(stdout, "key:", key, key_len);
4874
4875         /* Create Crypto session*/
4876         ut_params->sess = rte_cryptodev_sym_session_create(
4877                         ts_params->session_mpool);
4878
4879         rte_cryptodev_sym_session_init(dev_id, ut_params->sess,
4880                         &ut_params->aead_xform, ts_params->session_mpool);
4881
4882         TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed");
4883
4884         return 0;
4885 }
4886
4887 static int
4888 create_aead_xform(struct rte_crypto_op *op,
4889                 enum rte_crypto_aead_algorithm algo,
4890                 enum rte_crypto_aead_operation aead_op,
4891                 uint8_t *key, const uint8_t key_len,
4892                 const uint8_t aad_len, const uint8_t auth_len,
4893                 uint8_t iv_len)
4894 {
4895         TEST_ASSERT_NOT_NULL(rte_crypto_op_sym_xforms_alloc(op, 1),
4896                         "failed to allocate space for crypto transform");
4897
4898         struct rte_crypto_sym_op *sym_op = op->sym;
4899
4900         /* Setup AEAD Parameters */
4901         sym_op->xform->type = RTE_CRYPTO_SYM_XFORM_AEAD;
4902         sym_op->xform->next = NULL;
4903         sym_op->xform->aead.algo = algo;
4904         sym_op->xform->aead.op = aead_op;
4905         sym_op->xform->aead.key.data = key;
4906         sym_op->xform->aead.key.length = key_len;
4907         sym_op->xform->aead.iv.offset = IV_OFFSET;
4908         sym_op->xform->aead.iv.length = iv_len;
4909         sym_op->xform->aead.digest_length = auth_len;
4910         sym_op->xform->aead.aad_length = aad_len;
4911
4912         TEST_HEXDUMP(stdout, "key:", key, key_len);
4913
4914         return 0;
4915 }
4916
4917 static int
4918 create_aead_operation(enum rte_crypto_aead_operation op,
4919                 const struct aead_test_data *tdata)
4920 {
4921         struct crypto_testsuite_params *ts_params = &testsuite_params;
4922         struct crypto_unittest_params *ut_params = &unittest_params;
4923
4924         uint8_t *plaintext, *ciphertext;
4925         unsigned int aad_pad_len, plaintext_pad_len;
4926
4927         /* Generate Crypto op data structure */
4928         ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
4929                         RTE_CRYPTO_OP_TYPE_SYMMETRIC);
4930         TEST_ASSERT_NOT_NULL(ut_params->op,
4931                         "Failed to allocate symmetric crypto operation struct");
4932
4933         struct rte_crypto_sym_op *sym_op = ut_params->op->sym;
4934
4935         /* Append aad data */
4936         aad_pad_len = RTE_ALIGN_CEIL(tdata->aad.len, 16);
4937         sym_op->aead.aad.data = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
4938                         aad_pad_len);
4939         TEST_ASSERT_NOT_NULL(sym_op->aead.aad.data,
4940                         "no room to append aad");
4941
4942         sym_op->aead.aad.phys_addr =
4943                         rte_pktmbuf_mtophys(ut_params->ibuf);
4944         memcpy(sym_op->aead.aad.data, tdata->aad.data, tdata->aad.len);
4945         TEST_HEXDUMP(stdout, "aad:", sym_op->aead.aad.data,
4946                 tdata->aad.len);
4947
4948         /* Append IV at the end of the crypto operation*/
4949         uint8_t *iv_ptr = rte_crypto_op_ctod_offset(ut_params->op,
4950                         uint8_t *, IV_OFFSET);
4951
4952         rte_memcpy(iv_ptr, tdata->iv.data, tdata->iv.len);
4953         TEST_HEXDUMP(stdout, "iv:", iv_ptr,
4954                 tdata->iv.len);
4955
4956         /* Append plaintext/ciphertext */
4957         if (op == RTE_CRYPTO_AEAD_OP_ENCRYPT) {
4958                 plaintext_pad_len = RTE_ALIGN_CEIL(tdata->plaintext.len, 16);
4959                 plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
4960                                 plaintext_pad_len);
4961                 TEST_ASSERT_NOT_NULL(plaintext, "no room to append plaintext");
4962
4963                 memcpy(plaintext, tdata->plaintext.data, tdata->plaintext.len);
4964                 TEST_HEXDUMP(stdout, "plaintext:", plaintext,
4965                                 tdata->plaintext.len);
4966
4967                 if (ut_params->obuf) {
4968                         ciphertext = (uint8_t *)rte_pktmbuf_append(
4969                                         ut_params->obuf,
4970                                         plaintext_pad_len + aad_pad_len);
4971                         TEST_ASSERT_NOT_NULL(ciphertext,
4972                                         "no room to append ciphertext");
4973
4974                         memset(ciphertext + aad_pad_len, 0,
4975                                         tdata->ciphertext.len);
4976                 }
4977         } else {
4978                 plaintext_pad_len = RTE_ALIGN_CEIL(tdata->ciphertext.len, 16);
4979                 ciphertext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
4980                                 plaintext_pad_len);
4981                 TEST_ASSERT_NOT_NULL(ciphertext,
4982                                 "no room to append ciphertext");
4983
4984                 memcpy(ciphertext, tdata->ciphertext.data,
4985                                 tdata->ciphertext.len);
4986                 TEST_HEXDUMP(stdout, "ciphertext:", ciphertext,
4987                                 tdata->ciphertext.len);
4988
4989                 if (ut_params->obuf) {
4990                         plaintext = (uint8_t *)rte_pktmbuf_append(
4991                                         ut_params->obuf,
4992                                         plaintext_pad_len + aad_pad_len);
4993                         TEST_ASSERT_NOT_NULL(plaintext,
4994                                         "no room to append plaintext");
4995
4996                         memset(plaintext + aad_pad_len, 0,
4997                                         tdata->plaintext.len);
4998                 }
4999         }
5000
5001         /* Append digest data */
5002         if (op == RTE_CRYPTO_AEAD_OP_ENCRYPT) {
5003                 sym_op->aead.digest.data = (uint8_t *)rte_pktmbuf_append(
5004                                 ut_params->obuf ? ut_params->obuf :
5005                                                 ut_params->ibuf,
5006                                                 tdata->auth_tag.len);
5007                 TEST_ASSERT_NOT_NULL(sym_op->aead.digest.data,
5008                                 "no room to append digest");
5009                 memset(sym_op->aead.digest.data, 0, tdata->auth_tag.len);
5010                 sym_op->aead.digest.phys_addr = rte_pktmbuf_mtophys_offset(
5011                                 ut_params->obuf ? ut_params->obuf :
5012                                                 ut_params->ibuf,
5013                                                 plaintext_pad_len +
5014                                                 aad_pad_len);
5015         } else {
5016                 sym_op->aead.digest.data = (uint8_t *)rte_pktmbuf_append(
5017                                 ut_params->ibuf, tdata->auth_tag.len);
5018                 TEST_ASSERT_NOT_NULL(sym_op->aead.digest.data,
5019                                 "no room to append digest");
5020                 sym_op->aead.digest.phys_addr = rte_pktmbuf_mtophys_offset(
5021                                 ut_params->ibuf,
5022                                 plaintext_pad_len + aad_pad_len);
5023
5024                 rte_memcpy(sym_op->aead.digest.data, tdata->auth_tag.data,
5025                         tdata->auth_tag.len);
5026                 TEST_HEXDUMP(stdout, "digest:",
5027                         sym_op->aead.digest.data,
5028                         tdata->auth_tag.len);
5029         }
5030
5031         sym_op->aead.data.length = tdata->plaintext.len;
5032         sym_op->aead.data.offset = aad_pad_len;
5033
5034         return 0;
5035 }
5036
5037 static int
5038 test_authenticated_encryption(const struct aead_test_data *tdata)
5039 {
5040         struct crypto_testsuite_params *ts_params = &testsuite_params;
5041         struct crypto_unittest_params *ut_params = &unittest_params;
5042
5043         int retval;
5044         uint8_t *ciphertext, *auth_tag;
5045         uint16_t plaintext_pad_len;
5046         uint32_t i;
5047
5048         /* Create AEAD session */
5049         retval = create_aead_session(ts_params->valid_devs[0],
5050                         tdata->algo,
5051                         RTE_CRYPTO_AEAD_OP_ENCRYPT,
5052                         tdata->key.data, tdata->key.len,
5053                         tdata->aad.len, tdata->auth_tag.len,
5054                         tdata->iv.len);
5055         if (retval < 0)
5056                 return retval;
5057
5058         if (tdata->aad.len > MBUF_SIZE) {
5059                 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->large_mbuf_pool);
5060                 /* Populate full size of add data */
5061                 for (i = 32; i < MAX_AAD_LENGTH; i += 32)
5062                         memcpy(&tdata->aad.data[i], &tdata->aad.data[0], 32);
5063         } else
5064                 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
5065
5066         /* clear mbuf payload */
5067         memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
5068                         rte_pktmbuf_tailroom(ut_params->ibuf));
5069
5070         /* Create AEAD operation */
5071         retval = create_aead_operation(RTE_CRYPTO_AEAD_OP_ENCRYPT, tdata);
5072         if (retval < 0)
5073                 return retval;
5074
5075         rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
5076
5077         ut_params->op->sym->m_src = ut_params->ibuf;
5078
5079         /* Process crypto operation */
5080         TEST_ASSERT_NOT_NULL(process_crypto_request(ts_params->valid_devs[0],
5081                         ut_params->op), "failed to process sym crypto op");
5082
5083         TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
5084                         "crypto op processing failed");
5085
5086         plaintext_pad_len = RTE_ALIGN_CEIL(tdata->plaintext.len, 16);
5087
5088         if (ut_params->op->sym->m_dst) {
5089                 ciphertext = rte_pktmbuf_mtod(ut_params->op->sym->m_dst,
5090                                 uint8_t *);
5091                 auth_tag = rte_pktmbuf_mtod_offset(ut_params->op->sym->m_dst,
5092                                 uint8_t *, plaintext_pad_len);
5093         } else {
5094                 ciphertext = rte_pktmbuf_mtod_offset(ut_params->op->sym->m_src,
5095                                 uint8_t *,
5096                                 ut_params->op->sym->cipher.data.offset);
5097                 auth_tag = ciphertext + plaintext_pad_len;
5098         }
5099
5100         TEST_HEXDUMP(stdout, "ciphertext:", ciphertext, tdata->ciphertext.len);
5101         TEST_HEXDUMP(stdout, "auth tag:", auth_tag, tdata->auth_tag.len);
5102
5103         /* Validate obuf */
5104         TEST_ASSERT_BUFFERS_ARE_EQUAL(
5105                         ciphertext,
5106                         tdata->ciphertext.data,
5107                         tdata->ciphertext.len,
5108                         "Ciphertext data not as expected");
5109
5110         TEST_ASSERT_BUFFERS_ARE_EQUAL(
5111                         auth_tag,
5112                         tdata->auth_tag.data,
5113                         tdata->auth_tag.len,
5114                         "Generated auth tag not as expected");
5115
5116         return 0;
5117
5118 }
5119
5120 static int
5121 test_AES_GCM_authenticated_encryption_test_case_1(void)
5122 {
5123         return test_authenticated_encryption(&gcm_test_case_1);
5124 }
5125
5126 static int
5127 test_AES_GCM_authenticated_encryption_test_case_2(void)
5128 {
5129         return test_authenticated_encryption(&gcm_test_case_2);
5130 }
5131
5132 static int
5133 test_AES_GCM_authenticated_encryption_test_case_3(void)
5134 {
5135         return test_authenticated_encryption(&gcm_test_case_3);
5136 }
5137
5138 static int
5139 test_AES_GCM_authenticated_encryption_test_case_4(void)
5140 {
5141         return test_authenticated_encryption(&gcm_test_case_4);
5142 }
5143
5144 static int
5145 test_AES_GCM_authenticated_encryption_test_case_5(void)
5146 {
5147         return test_authenticated_encryption(&gcm_test_case_5);
5148 }
5149
5150 static int
5151 test_AES_GCM_authenticated_encryption_test_case_6(void)
5152 {
5153         return test_authenticated_encryption(&gcm_test_case_6);
5154 }
5155
5156 static int
5157 test_AES_GCM_authenticated_encryption_test_case_7(void)
5158 {
5159         return test_authenticated_encryption(&gcm_test_case_7);
5160 }
5161
5162 static int
5163 test_AES_GCM_auth_encryption_test_case_192_1(void)
5164 {
5165         return test_authenticated_encryption(&gcm_test_case_192_1);
5166 }
5167
5168 static int
5169 test_AES_GCM_auth_encryption_test_case_192_2(void)
5170 {
5171         return test_authenticated_encryption(&gcm_test_case_192_2);
5172 }
5173
5174 static int
5175 test_AES_GCM_auth_encryption_test_case_192_3(void)
5176 {
5177         return test_authenticated_encryption(&gcm_test_case_192_3);
5178 }
5179
5180 static int
5181 test_AES_GCM_auth_encryption_test_case_192_4(void)
5182 {
5183         return test_authenticated_encryption(&gcm_test_case_192_4);
5184 }
5185
5186 static int
5187 test_AES_GCM_auth_encryption_test_case_192_5(void)
5188 {
5189         return test_authenticated_encryption(&gcm_test_case_192_5);
5190 }
5191
5192 static int
5193 test_AES_GCM_auth_encryption_test_case_192_6(void)
5194 {
5195         return test_authenticated_encryption(&gcm_test_case_192_6);
5196 }
5197
5198 static int
5199 test_AES_GCM_auth_encryption_test_case_192_7(void)
5200 {
5201         return test_authenticated_encryption(&gcm_test_case_192_7);
5202 }
5203
5204 static int
5205 test_AES_GCM_auth_encryption_test_case_256_1(void)
5206 {
5207         return test_authenticated_encryption(&gcm_test_case_256_1);
5208 }
5209
5210 static int
5211 test_AES_GCM_auth_encryption_test_case_256_2(void)
5212 {
5213         return test_authenticated_encryption(&gcm_test_case_256_2);
5214 }
5215
5216 static int
5217 test_AES_GCM_auth_encryption_test_case_256_3(void)
5218 {
5219         return test_authenticated_encryption(&gcm_test_case_256_3);
5220 }
5221
5222 static int
5223 test_AES_GCM_auth_encryption_test_case_256_4(void)
5224 {
5225         return test_authenticated_encryption(&gcm_test_case_256_4);
5226 }
5227
5228 static int
5229 test_AES_GCM_auth_encryption_test_case_256_5(void)
5230 {
5231         return test_authenticated_encryption(&gcm_test_case_256_5);
5232 }
5233
5234 static int
5235 test_AES_GCM_auth_encryption_test_case_256_6(void)
5236 {
5237         return test_authenticated_encryption(&gcm_test_case_256_6);
5238 }
5239
5240 static int
5241 test_AES_GCM_auth_encryption_test_case_256_7(void)
5242 {
5243         return test_authenticated_encryption(&gcm_test_case_256_7);
5244 }
5245
5246 static int
5247 test_AES_GCM_auth_encryption_test_case_aad_1(void)
5248 {
5249         return test_authenticated_encryption(&gcm_test_case_aad_1);
5250 }
5251
5252 static int
5253 test_AES_GCM_auth_encryption_test_case_aad_2(void)
5254 {
5255         return test_authenticated_encryption(&gcm_test_case_aad_2);
5256 }
5257
5258 static int
5259 test_authenticated_decryption(const struct aead_test_data *tdata)
5260 {
5261         struct crypto_testsuite_params *ts_params = &testsuite_params;
5262         struct crypto_unittest_params *ut_params = &unittest_params;
5263
5264         int retval;
5265         uint8_t *plaintext;
5266         uint32_t i;
5267
5268         /* Create AEAD session */
5269         retval = create_aead_session(ts_params->valid_devs[0],
5270                         tdata->algo,
5271                         RTE_CRYPTO_AEAD_OP_DECRYPT,
5272                         tdata->key.data, tdata->key.len,
5273                         tdata->aad.len, tdata->auth_tag.len,
5274                         tdata->iv.len);
5275         if (retval < 0)
5276                 return retval;
5277
5278         /* alloc mbuf and set payload */
5279         if (tdata->aad.len > MBUF_SIZE) {
5280                 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->large_mbuf_pool);
5281                 /* Populate full size of add data */
5282                 for (i = 32; i < MAX_AAD_LENGTH; i += 32)
5283                         memcpy(&tdata->aad.data[i], &tdata->aad.data[0], 32);
5284         } else
5285                 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
5286
5287         memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
5288                         rte_pktmbuf_tailroom(ut_params->ibuf));
5289
5290         /* Create AEAD operation */
5291         retval = create_aead_operation(RTE_CRYPTO_AEAD_OP_DECRYPT, tdata);
5292         if (retval < 0)
5293                 return retval;
5294
5295         rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
5296
5297         ut_params->op->sym->m_src = ut_params->ibuf;
5298
5299         /* Process crypto operation */
5300         TEST_ASSERT_NOT_NULL(process_crypto_request(ts_params->valid_devs[0],
5301                         ut_params->op), "failed to process sym crypto op");
5302
5303         TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
5304                         "crypto op processing failed");
5305
5306         if (ut_params->op->sym->m_dst)
5307                 plaintext = rte_pktmbuf_mtod(ut_params->op->sym->m_dst,
5308                                 uint8_t *);
5309         else
5310                 plaintext = rte_pktmbuf_mtod_offset(ut_params->op->sym->m_src,
5311                                 uint8_t *,
5312                                 ut_params->op->sym->cipher.data.offset);
5313
5314         TEST_HEXDUMP(stdout, "plaintext:", plaintext, tdata->ciphertext.len);
5315
5316         /* Validate obuf */
5317         TEST_ASSERT_BUFFERS_ARE_EQUAL(
5318                         plaintext,
5319                         tdata->plaintext.data,
5320                         tdata->plaintext.len,
5321                         "Plaintext data not as expected");
5322
5323         TEST_ASSERT_EQUAL(ut_params->op->status,
5324                         RTE_CRYPTO_OP_STATUS_SUCCESS,
5325                         "Authentication failed");
5326         return 0;
5327 }
5328
5329 static int
5330 test_AES_GCM_authenticated_decryption_test_case_1(void)
5331 {
5332         return test_authenticated_decryption(&gcm_test_case_1);
5333 }
5334
5335 static int
5336 test_AES_GCM_authenticated_decryption_test_case_2(void)
5337 {
5338         return test_authenticated_decryption(&gcm_test_case_2);
5339 }
5340
5341 static int
5342 test_AES_GCM_authenticated_decryption_test_case_3(void)
5343 {
5344         return test_authenticated_decryption(&gcm_test_case_3);
5345 }
5346
5347 static int
5348 test_AES_GCM_authenticated_decryption_test_case_4(void)
5349 {
5350         return test_authenticated_decryption(&gcm_test_case_4);
5351 }
5352
5353 static int
5354 test_AES_GCM_authenticated_decryption_test_case_5(void)
5355 {
5356         return test_authenticated_decryption(&gcm_test_case_5);
5357 }
5358
5359 static int
5360 test_AES_GCM_authenticated_decryption_test_case_6(void)
5361 {
5362         return test_authenticated_decryption(&gcm_test_case_6);
5363 }
5364
5365 static int
5366 test_AES_GCM_authenticated_decryption_test_case_7(void)
5367 {
5368         return test_authenticated_decryption(&gcm_test_case_7);
5369 }
5370
5371 static int
5372 test_AES_GCM_auth_decryption_test_case_192_1(void)
5373 {
5374         return test_authenticated_decryption(&gcm_test_case_192_1);
5375 }
5376
5377 static int
5378 test_AES_GCM_auth_decryption_test_case_192_2(void)
5379 {
5380         return test_authenticated_decryption(&gcm_test_case_192_2);
5381 }
5382
5383 static int
5384 test_AES_GCM_auth_decryption_test_case_192_3(void)
5385 {
5386         return test_authenticated_decryption(&gcm_test_case_192_3);
5387 }
5388
5389 static int
5390 test_AES_GCM_auth_decryption_test_case_192_4(void)
5391 {
5392         return test_authenticated_decryption(&gcm_test_case_192_4);
5393 }
5394
5395 static int
5396 test_AES_GCM_auth_decryption_test_case_192_5(void)
5397 {
5398         return test_authenticated_decryption(&gcm_test_case_192_5);
5399 }
5400
5401 static int
5402 test_AES_GCM_auth_decryption_test_case_192_6(void)
5403 {
5404         return test_authenticated_decryption(&gcm_test_case_192_6);
5405 }
5406
5407 static int
5408 test_AES_GCM_auth_decryption_test_case_192_7(void)
5409 {
5410         return test_authenticated_decryption(&gcm_test_case_192_7);
5411 }
5412
5413 static int
5414 test_AES_GCM_auth_decryption_test_case_256_1(void)
5415 {
5416         return test_authenticated_decryption(&gcm_test_case_256_1);
5417 }
5418
5419 static int
5420 test_AES_GCM_auth_decryption_test_case_256_2(void)
5421 {
5422         return test_authenticated_decryption(&gcm_test_case_256_2);
5423 }
5424
5425 static int
5426 test_AES_GCM_auth_decryption_test_case_256_3(void)
5427 {
5428         return test_authenticated_decryption(&gcm_test_case_256_3);
5429 }
5430
5431 static int
5432 test_AES_GCM_auth_decryption_test_case_256_4(void)
5433 {
5434         return test_authenticated_decryption(&gcm_test_case_256_4);
5435 }
5436
5437 static int
5438 test_AES_GCM_auth_decryption_test_case_256_5(void)
5439 {
5440         return test_authenticated_decryption(&gcm_test_case_256_5);
5441 }
5442
5443 static int
5444 test_AES_GCM_auth_decryption_test_case_256_6(void)
5445 {
5446         return test_authenticated_decryption(&gcm_test_case_256_6);
5447 }
5448
5449 static int
5450 test_AES_GCM_auth_decryption_test_case_256_7(void)
5451 {
5452         return test_authenticated_decryption(&gcm_test_case_256_7);
5453 }
5454
5455 static int
5456 test_AES_GCM_auth_decryption_test_case_aad_1(void)
5457 {
5458         return test_authenticated_decryption(&gcm_test_case_aad_1);
5459 }
5460
5461 static int
5462 test_AES_GCM_auth_decryption_test_case_aad_2(void)
5463 {
5464         return test_authenticated_decryption(&gcm_test_case_aad_2);
5465 }
5466
5467 static int
5468 test_authenticated_encryption_oop(const struct aead_test_data *tdata)
5469 {
5470         struct crypto_testsuite_params *ts_params = &testsuite_params;
5471         struct crypto_unittest_params *ut_params = &unittest_params;
5472
5473         int retval;
5474         uint8_t *ciphertext, *auth_tag;
5475         uint16_t plaintext_pad_len;
5476
5477         /* Create AEAD session */
5478         retval = create_aead_session(ts_params->valid_devs[0],
5479                         tdata->algo,
5480                         RTE_CRYPTO_AEAD_OP_ENCRYPT,
5481                         tdata->key.data, tdata->key.len,
5482                         tdata->aad.len, tdata->auth_tag.len,
5483                         tdata->iv.len);
5484         if (retval < 0)
5485                 return retval;
5486
5487         ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
5488         ut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
5489
5490         /* clear mbuf payload */
5491         memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
5492                         rte_pktmbuf_tailroom(ut_params->ibuf));
5493         memset(rte_pktmbuf_mtod(ut_params->obuf, uint8_t *), 0,
5494                         rte_pktmbuf_tailroom(ut_params->obuf));
5495
5496         /* Create AEAD operation */
5497         retval = create_aead_operation(RTE_CRYPTO_AEAD_OP_ENCRYPT, tdata);
5498         if (retval < 0)
5499                 return retval;
5500
5501         rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
5502
5503         ut_params->op->sym->m_src = ut_params->ibuf;
5504         ut_params->op->sym->m_dst = ut_params->obuf;
5505
5506         /* Process crypto operation */
5507         TEST_ASSERT_NOT_NULL(process_crypto_request(ts_params->valid_devs[0],
5508                         ut_params->op), "failed to process sym crypto op");
5509
5510         TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
5511                         "crypto op processing failed");
5512
5513         plaintext_pad_len = RTE_ALIGN_CEIL(tdata->plaintext.len, 16);
5514
5515         ciphertext = rte_pktmbuf_mtod_offset(ut_params->obuf, uint8_t *,
5516                         ut_params->op->sym->cipher.data.offset);
5517         auth_tag = ciphertext + plaintext_pad_len;
5518
5519         TEST_HEXDUMP(stdout, "ciphertext:", ciphertext, tdata->ciphertext.len);
5520         TEST_HEXDUMP(stdout, "auth tag:", auth_tag, tdata->auth_tag.len);
5521
5522         /* Validate obuf */
5523         TEST_ASSERT_BUFFERS_ARE_EQUAL(
5524                         ciphertext,
5525                         tdata->ciphertext.data,
5526                         tdata->ciphertext.len,
5527                         "Ciphertext data not as expected");
5528
5529         TEST_ASSERT_BUFFERS_ARE_EQUAL(
5530                         auth_tag,
5531                         tdata->auth_tag.data,
5532                         tdata->auth_tag.len,
5533                         "Generated auth tag not as expected");
5534
5535         return 0;
5536
5537 }
5538
5539 static int
5540 test_AES_GCM_authenticated_encryption_oop_test_case_1(void)
5541 {
5542         return test_authenticated_encryption_oop(&gcm_test_case_5);
5543 }
5544
5545 static int
5546 test_authenticated_decryption_oop(const struct aead_test_data *tdata)
5547 {
5548         struct crypto_testsuite_params *ts_params = &testsuite_params;
5549         struct crypto_unittest_params *ut_params = &unittest_params;
5550
5551         int retval;
5552         uint8_t *plaintext;
5553
5554         /* Create AEAD session */
5555         retval = create_aead_session(ts_params->valid_devs[0],
5556                         tdata->algo,
5557                         RTE_CRYPTO_AEAD_OP_DECRYPT,
5558                         tdata->key.data, tdata->key.len,
5559                         tdata->aad.len, tdata->auth_tag.len,
5560                         tdata->iv.len);
5561         if (retval < 0)
5562                 return retval;
5563
5564         /* alloc mbuf and set payload */
5565         ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
5566         ut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
5567
5568         memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
5569                         rte_pktmbuf_tailroom(ut_params->ibuf));
5570         memset(rte_pktmbuf_mtod(ut_params->obuf, uint8_t *), 0,
5571                         rte_pktmbuf_tailroom(ut_params->obuf));
5572
5573         /* Create AEAD operation */
5574         retval = create_aead_operation(RTE_CRYPTO_AEAD_OP_DECRYPT, tdata);
5575         if (retval < 0)
5576                 return retval;
5577
5578         rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
5579
5580         ut_params->op->sym->m_src = ut_params->ibuf;
5581         ut_params->op->sym->m_dst = ut_params->obuf;
5582
5583         /* Process crypto operation */
5584         TEST_ASSERT_NOT_NULL(process_crypto_request(ts_params->valid_devs[0],
5585                         ut_params->op), "failed to process sym crypto op");
5586
5587         TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
5588                         "crypto op processing failed");
5589
5590         plaintext = rte_pktmbuf_mtod_offset(ut_params->obuf, uint8_t *,
5591                         ut_params->op->sym->cipher.data.offset);
5592
5593         TEST_HEXDUMP(stdout, "plaintext:", plaintext, tdata->ciphertext.len);
5594
5595         /* Validate obuf */
5596         TEST_ASSERT_BUFFERS_ARE_EQUAL(
5597                         plaintext,
5598                         tdata->plaintext.data,
5599                         tdata->plaintext.len,
5600                         "Plaintext data not as expected");
5601
5602         TEST_ASSERT_EQUAL(ut_params->op->status,
5603                         RTE_CRYPTO_OP_STATUS_SUCCESS,
5604                         "Authentication failed");
5605         return 0;
5606 }
5607
5608 static int
5609 test_AES_GCM_authenticated_decryption_oop_test_case_1(void)
5610 {
5611         return test_authenticated_decryption_oop(&gcm_test_case_5);
5612 }
5613
5614 static int
5615 test_authenticated_encryption_sessionless(
5616                 const struct aead_test_data *tdata)
5617 {
5618         struct crypto_testsuite_params *ts_params = &testsuite_params;
5619         struct crypto_unittest_params *ut_params = &unittest_params;
5620
5621         int retval;
5622         uint8_t *ciphertext, *auth_tag;
5623         uint16_t plaintext_pad_len;
5624         uint8_t key[tdata->key.len + 1];
5625
5626         ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
5627
5628         /* clear mbuf payload */
5629         memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
5630                         rte_pktmbuf_tailroom(ut_params->ibuf));
5631
5632         /* Create AEAD operation */
5633         retval = create_aead_operation(RTE_CRYPTO_AEAD_OP_ENCRYPT, tdata);
5634         if (retval < 0)
5635                 return retval;
5636
5637         /* Create GCM xform */
5638         memcpy(key, tdata->key.data, tdata->key.len);
5639         retval = create_aead_xform(ut_params->op,
5640                         tdata->algo,
5641                         RTE_CRYPTO_AEAD_OP_ENCRYPT,
5642                         key, tdata->key.len,
5643                         tdata->aad.len, tdata->auth_tag.len,
5644                         tdata->iv.len);
5645         if (retval < 0)
5646                 return retval;
5647
5648         ut_params->op->sym->m_src = ut_params->ibuf;
5649
5650         TEST_ASSERT_EQUAL(ut_params->op->sess_type,
5651                         RTE_CRYPTO_OP_SESSIONLESS,
5652                         "crypto op session type not sessionless");
5653
5654         /* Process crypto operation */
5655         TEST_ASSERT_NOT_NULL(process_crypto_request(ts_params->valid_devs[0],
5656                         ut_params->op), "failed to process sym crypto op");
5657
5658         TEST_ASSERT_NOT_NULL(ut_params->op, "failed crypto process");
5659
5660         TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
5661                         "crypto op status not success");
5662
5663         plaintext_pad_len = RTE_ALIGN_CEIL(tdata->plaintext.len, 16);
5664
5665         ciphertext = rte_pktmbuf_mtod_offset(ut_params->ibuf, uint8_t *,
5666                         ut_params->op->sym->cipher.data.offset);
5667         auth_tag = ciphertext + plaintext_pad_len;
5668
5669         TEST_HEXDUMP(stdout, "ciphertext:", ciphertext, tdata->ciphertext.len);
5670         TEST_HEXDUMP(stdout, "auth tag:", auth_tag, tdata->auth_tag.len);
5671
5672         /* Validate obuf */
5673         TEST_ASSERT_BUFFERS_ARE_EQUAL(
5674                         ciphertext,
5675                         tdata->ciphertext.data,
5676                         tdata->ciphertext.len,
5677                         "Ciphertext data not as expected");
5678
5679         TEST_ASSERT_BUFFERS_ARE_EQUAL(
5680                         auth_tag,
5681                         tdata->auth_tag.data,
5682                         tdata->auth_tag.len,
5683                         "Generated auth tag not as expected");
5684
5685         return 0;
5686
5687 }
5688
5689 static int
5690 test_AES_GCM_authenticated_encryption_sessionless_test_case_1(void)
5691 {
5692         return test_authenticated_encryption_sessionless(
5693                         &gcm_test_case_5);
5694 }
5695
5696 static int
5697 test_authenticated_decryption_sessionless(
5698                 const struct aead_test_data *tdata)
5699 {
5700         struct crypto_testsuite_params *ts_params = &testsuite_params;
5701         struct crypto_unittest_params *ut_params = &unittest_params;
5702
5703         int retval;
5704         uint8_t *plaintext;
5705         uint8_t key[tdata->key.len + 1];
5706
5707         /* alloc mbuf and set payload */
5708         ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
5709
5710         memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
5711                         rte_pktmbuf_tailroom(ut_params->ibuf));
5712
5713         /* Create AEAD operation */
5714         retval = create_aead_operation(RTE_CRYPTO_AEAD_OP_DECRYPT, tdata);
5715         if (retval < 0)
5716                 return retval;
5717
5718         /* Create AEAD xform */
5719         memcpy(key, tdata->key.data, tdata->key.len);
5720         retval = create_aead_xform(ut_params->op,
5721                         tdata->algo,
5722                         RTE_CRYPTO_AEAD_OP_DECRYPT,
5723                         key, tdata->key.len,
5724                         tdata->aad.len, tdata->auth_tag.len,
5725                         tdata->iv.len);
5726         if (retval < 0)
5727                 return retval;
5728
5729         ut_params->op->sym->m_src = ut_params->ibuf;
5730
5731         TEST_ASSERT_EQUAL(ut_params->op->sess_type,
5732                         RTE_CRYPTO_OP_SESSIONLESS,
5733                         "crypto op session type not sessionless");
5734
5735         /* Process crypto operation */
5736         TEST_ASSERT_NOT_NULL(process_crypto_request(ts_params->valid_devs[0],
5737                         ut_params->op), "failed to process sym crypto op");
5738
5739         TEST_ASSERT_NOT_NULL(ut_params->op, "failed crypto process");
5740
5741         TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
5742                         "crypto op status not success");
5743
5744         plaintext = rte_pktmbuf_mtod_offset(ut_params->ibuf, uint8_t *,
5745                         ut_params->op->sym->cipher.data.offset);
5746
5747         TEST_HEXDUMP(stdout, "plaintext:", plaintext, tdata->ciphertext.len);
5748
5749         /* Validate obuf */
5750         TEST_ASSERT_BUFFERS_ARE_EQUAL(
5751                         plaintext,
5752                         tdata->plaintext.data,
5753                         tdata->plaintext.len,
5754                         "Plaintext data not as expected");
5755
5756         TEST_ASSERT_EQUAL(ut_params->op->status,
5757                         RTE_CRYPTO_OP_STATUS_SUCCESS,
5758                         "Authentication failed");
5759         return 0;
5760 }
5761
5762 static int
5763 test_AES_GCM_authenticated_decryption_sessionless_test_case_1(void)
5764 {
5765         return test_authenticated_decryption_sessionless(
5766                         &gcm_test_case_5);
5767 }
5768
5769 static int
5770 test_stats(void)
5771 {
5772         struct crypto_testsuite_params *ts_params = &testsuite_params;
5773         struct rte_cryptodev_stats stats;
5774         struct rte_cryptodev *dev;
5775         cryptodev_stats_get_t temp_pfn;
5776
5777         rte_cryptodev_stats_reset(ts_params->valid_devs[0]);
5778         TEST_ASSERT((rte_cryptodev_stats_get(ts_params->valid_devs[0] + 600,
5779                         &stats) == -ENODEV),
5780                 "rte_cryptodev_stats_get invalid dev failed");
5781         TEST_ASSERT((rte_cryptodev_stats_get(ts_params->valid_devs[0], 0) != 0),
5782                 "rte_cryptodev_stats_get invalid Param failed");
5783         dev = &rte_cryptodevs[ts_params->valid_devs[0]];
5784         temp_pfn = dev->dev_ops->stats_get;
5785         dev->dev_ops->stats_get = (cryptodev_stats_get_t)0;
5786         TEST_ASSERT((rte_cryptodev_stats_get(ts_params->valid_devs[0], &stats)
5787                         == -ENOTSUP),
5788                 "rte_cryptodev_stats_get invalid Param failed");
5789         dev->dev_ops->stats_get = temp_pfn;
5790
5791         /* Test expected values */
5792         ut_setup();
5793         test_AES_CBC_HMAC_SHA1_encrypt_digest();
5794         ut_teardown();
5795         TEST_ASSERT_SUCCESS(rte_cryptodev_stats_get(ts_params->valid_devs[0],
5796                         &stats),
5797                 "rte_cryptodev_stats_get failed");
5798         TEST_ASSERT((stats.enqueued_count == 1),
5799                 "rte_cryptodev_stats_get returned unexpected enqueued stat");
5800         TEST_ASSERT((stats.dequeued_count == 1),
5801                 "rte_cryptodev_stats_get returned unexpected enqueued stat");
5802         TEST_ASSERT((stats.enqueue_err_count == 0),
5803                 "rte_cryptodev_stats_get returned unexpected enqueued stat");
5804         TEST_ASSERT((stats.dequeue_err_count == 0),
5805                 "rte_cryptodev_stats_get returned unexpected enqueued stat");
5806
5807         /* invalid device but should ignore and not reset device stats*/
5808         rte_cryptodev_stats_reset(ts_params->valid_devs[0] + 300);
5809         TEST_ASSERT_SUCCESS(rte_cryptodev_stats_get(ts_params->valid_devs[0],
5810                         &stats),
5811                 "rte_cryptodev_stats_get failed");
5812         TEST_ASSERT((stats.enqueued_count == 1),
5813                 "rte_cryptodev_stats_get returned unexpected enqueued stat");
5814
5815         /* check that a valid reset clears stats */
5816         rte_cryptodev_stats_reset(ts_params->valid_devs[0]);
5817         TEST_ASSERT_SUCCESS(rte_cryptodev_stats_get(ts_params->valid_devs[0],
5818                         &stats),
5819                                           "rte_cryptodev_stats_get failed");
5820         TEST_ASSERT((stats.enqueued_count == 0),
5821                 "rte_cryptodev_stats_get returned unexpected enqueued stat");
5822         TEST_ASSERT((stats.dequeued_count == 0),
5823                 "rte_cryptodev_stats_get returned unexpected enqueued stat");
5824
5825         return TEST_SUCCESS;
5826 }
5827
5828 static int MD5_HMAC_create_session(struct crypto_testsuite_params *ts_params,
5829                                    struct crypto_unittest_params *ut_params,
5830                                    enum rte_crypto_auth_operation op,
5831                                    const struct HMAC_MD5_vector *test_case)
5832 {
5833         uint8_t key[64];
5834
5835         memcpy(key, test_case->key.data, test_case->key.len);
5836
5837         ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;
5838         ut_params->auth_xform.next = NULL;
5839         ut_params->auth_xform.auth.op = op;
5840
5841         ut_params->auth_xform.auth.algo = RTE_CRYPTO_AUTH_MD5_HMAC;
5842
5843         ut_params->auth_xform.auth.digest_length = MD5_DIGEST_LEN;
5844         ut_params->auth_xform.auth.key.length = test_case->key.len;
5845         ut_params->auth_xform.auth.key.data = key;
5846
5847         ut_params->sess = rte_cryptodev_sym_session_create(
5848                         ts_params->session_mpool);
5849
5850         rte_cryptodev_sym_session_init(ts_params->valid_devs[0],
5851                         ut_params->sess, &ut_params->auth_xform,
5852                         ts_params->session_mpool);
5853
5854         if (ut_params->sess == NULL)
5855                 return TEST_FAILED;
5856
5857         ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
5858
5859         memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
5860                         rte_pktmbuf_tailroom(ut_params->ibuf));
5861
5862         return 0;
5863 }
5864
5865 static int MD5_HMAC_create_op(struct crypto_unittest_params *ut_params,
5866                               const struct HMAC_MD5_vector *test_case,
5867                               uint8_t **plaintext)
5868 {
5869         uint16_t plaintext_pad_len;
5870
5871         struct rte_crypto_sym_op *sym_op = ut_params->op->sym;
5872
5873         plaintext_pad_len = RTE_ALIGN_CEIL(test_case->plaintext.len,
5874                                 16);
5875
5876         *plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
5877                         plaintext_pad_len);
5878         memcpy(*plaintext, test_case->plaintext.data,
5879                         test_case->plaintext.len);
5880
5881         sym_op->auth.digest.data = (uint8_t *)rte_pktmbuf_append(
5882                         ut_params->ibuf, MD5_DIGEST_LEN);
5883         TEST_ASSERT_NOT_NULL(sym_op->auth.digest.data,
5884                         "no room to append digest");
5885         sym_op->auth.digest.phys_addr = rte_pktmbuf_mtophys_offset(
5886                         ut_params->ibuf, plaintext_pad_len);
5887
5888         if (ut_params->auth_xform.auth.op == RTE_CRYPTO_AUTH_OP_VERIFY) {
5889                 rte_memcpy(sym_op->auth.digest.data, test_case->auth_tag.data,
5890                            test_case->auth_tag.len);
5891         }
5892
5893         sym_op->auth.data.offset = 0;
5894         sym_op->auth.data.length = test_case->plaintext.len;
5895
5896         rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
5897         ut_params->op->sym->m_src = ut_params->ibuf;
5898
5899         return 0;
5900 }
5901
5902 static int
5903 test_MD5_HMAC_generate(const struct HMAC_MD5_vector *test_case)
5904 {
5905         uint16_t plaintext_pad_len;
5906         uint8_t *plaintext, *auth_tag;
5907
5908         struct crypto_testsuite_params *ts_params = &testsuite_params;
5909         struct crypto_unittest_params *ut_params = &unittest_params;
5910
5911         if (MD5_HMAC_create_session(ts_params, ut_params,
5912                         RTE_CRYPTO_AUTH_OP_GENERATE, test_case))
5913                 return TEST_FAILED;
5914
5915         /* Generate Crypto op data structure */
5916         ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
5917                         RTE_CRYPTO_OP_TYPE_SYMMETRIC);
5918         TEST_ASSERT_NOT_NULL(ut_params->op,
5919                         "Failed to allocate symmetric crypto operation struct");
5920
5921         plaintext_pad_len = RTE_ALIGN_CEIL(test_case->plaintext.len,
5922                                 16);
5923
5924         if (MD5_HMAC_create_op(ut_params, test_case, &plaintext))
5925                 return TEST_FAILED;
5926
5927         TEST_ASSERT_NOT_NULL(process_crypto_request(ts_params->valid_devs[0],
5928                         ut_params->op), "failed to process sym crypto op");
5929
5930         TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
5931                         "crypto op processing failed");
5932
5933         if (ut_params->op->sym->m_dst) {
5934                 auth_tag = rte_pktmbuf_mtod_offset(ut_params->op->sym->m_dst,
5935                                 uint8_t *, plaintext_pad_len);
5936         } else {
5937                 auth_tag = plaintext + plaintext_pad_len;
5938         }
5939
5940         TEST_ASSERT_BUFFERS_ARE_EQUAL(
5941                         auth_tag,
5942                         test_case->auth_tag.data,
5943                         test_case->auth_tag.len,
5944                         "HMAC_MD5 generated tag not as expected");
5945
5946         return TEST_SUCCESS;
5947 }
5948
5949 static int
5950 test_MD5_HMAC_verify(const struct HMAC_MD5_vector *test_case)
5951 {
5952         uint8_t *plaintext;
5953
5954         struct crypto_testsuite_params *ts_params = &testsuite_params;
5955         struct crypto_unittest_params *ut_params = &unittest_params;
5956
5957         if (MD5_HMAC_create_session(ts_params, ut_params,
5958                         RTE_CRYPTO_AUTH_OP_VERIFY, test_case)) {
5959                 return TEST_FAILED;
5960         }
5961
5962         /* Generate Crypto op data structure */
5963         ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
5964                         RTE_CRYPTO_OP_TYPE_SYMMETRIC);
5965         TEST_ASSERT_NOT_NULL(ut_params->op,
5966                         "Failed to allocate symmetric crypto operation struct");
5967
5968         if (MD5_HMAC_create_op(ut_params, test_case, &plaintext))
5969                 return TEST_FAILED;
5970
5971         TEST_ASSERT_NOT_NULL(process_crypto_request(ts_params->valid_devs[0],
5972                         ut_params->op), "failed to process sym crypto op");
5973
5974         TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
5975                         "HMAC_MD5 crypto op processing failed");
5976
5977         return TEST_SUCCESS;
5978 }
5979
5980 static int
5981 test_MD5_HMAC_generate_case_1(void)
5982 {
5983         return test_MD5_HMAC_generate(&HMAC_MD5_test_case_1);
5984 }
5985
5986 static int
5987 test_MD5_HMAC_verify_case_1(void)
5988 {
5989         return test_MD5_HMAC_verify(&HMAC_MD5_test_case_1);
5990 }
5991
5992 static int
5993 test_MD5_HMAC_generate_case_2(void)
5994 {
5995         return test_MD5_HMAC_generate(&HMAC_MD5_test_case_2);
5996 }
5997
5998 static int
5999 test_MD5_HMAC_verify_case_2(void)
6000 {
6001         return test_MD5_HMAC_verify(&HMAC_MD5_test_case_2);
6002 }
6003
6004 static int
6005 test_multi_session(void)
6006 {
6007         struct crypto_testsuite_params *ts_params = &testsuite_params;
6008         struct crypto_unittest_params *ut_params = &unittest_params;
6009
6010         struct rte_cryptodev_info dev_info;
6011         struct rte_cryptodev_sym_session **sessions;
6012
6013         uint16_t i;
6014
6015         test_AES_CBC_HMAC_SHA512_decrypt_create_session_params(ut_params,
6016                         aes_cbc_key, hmac_sha512_key);
6017
6018
6019         rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
6020
6021         sessions = rte_malloc(NULL,
6022                         (sizeof(struct rte_cryptodev_sym_session *) *
6023                         dev_info.sym.max_nb_sessions) + 1, 0);
6024
6025         /* Create multiple crypto sessions*/
6026         for (i = 0; i < dev_info.sym.max_nb_sessions; i++) {
6027
6028                 sessions[i] = rte_cryptodev_sym_session_create(
6029                                 ts_params->session_mpool);
6030
6031                 rte_cryptodev_sym_session_init(ts_params->valid_devs[0],
6032                                 sessions[i], &ut_params->auth_xform,
6033                                 ts_params->session_mpool);
6034                 TEST_ASSERT_NOT_NULL(sessions[i],
6035                                 "Session creation failed at session number %u",
6036                                 i);
6037
6038                 /* Attempt to send a request on each session */
6039                 TEST_ASSERT_SUCCESS( test_AES_CBC_HMAC_SHA512_decrypt_perform(
6040                         sessions[i],
6041                         ut_params,
6042                         ts_params,
6043                         catch_22_quote_2_512_bytes_AES_CBC_ciphertext,
6044                         catch_22_quote_2_512_bytes_AES_CBC_HMAC_SHA512_digest,
6045                         aes_cbc_iv),
6046                         "Failed to perform decrypt on request number %u.", i);
6047                 /* free crypto operation structure */
6048                 if (ut_params->op)
6049                         rte_crypto_op_free(ut_params->op);
6050
6051                 /*
6052                  * free mbuf - both obuf and ibuf are usually the same,
6053                  * so check if they point at the same address is necessary,
6054                  * to avoid freeing the mbuf twice.
6055                  */
6056                 if (ut_params->obuf) {
6057                         rte_pktmbuf_free(ut_params->obuf);
6058                         if (ut_params->ibuf == ut_params->obuf)
6059                                 ut_params->ibuf = 0;
6060                         ut_params->obuf = 0;
6061                 }
6062                 if (ut_params->ibuf) {
6063                         rte_pktmbuf_free(ut_params->ibuf);
6064                         ut_params->ibuf = 0;
6065                 }
6066         }
6067
6068         /* Next session create should fail */
6069         rte_cryptodev_sym_session_init(ts_params->valid_devs[0],
6070                         sessions[i], &ut_params->auth_xform,
6071                         ts_params->session_mpool);
6072         TEST_ASSERT_NULL(sessions[i],
6073                         "Session creation succeeded unexpectedly!");
6074
6075         for (i = 0; i < dev_info.sym.max_nb_sessions; i++) {
6076                 rte_cryptodev_sym_session_clear(ts_params->valid_devs[0],
6077                                 sessions[i]);
6078                 rte_cryptodev_sym_session_free(sessions[i]);
6079         }
6080
6081         rte_free(sessions);
6082
6083         return TEST_SUCCESS;
6084 }
6085
6086 struct multi_session_params {
6087         struct crypto_unittest_params ut_params;
6088         uint8_t *cipher_key;
6089         uint8_t *hmac_key;
6090         const uint8_t *cipher;
6091         const uint8_t *digest;
6092         uint8_t *iv;
6093 };
6094
6095 #define MB_SESSION_NUMBER 3
6096
6097 static int
6098 test_multi_session_random_usage(void)
6099 {
6100         struct crypto_testsuite_params *ts_params = &testsuite_params;
6101         struct rte_cryptodev_info dev_info;
6102         struct rte_cryptodev_sym_session **sessions;
6103         uint32_t i, j;
6104         struct multi_session_params ut_paramz[] = {
6105
6106                 {
6107                         .cipher_key = ms_aes_cbc_key0,
6108                         .hmac_key = ms_hmac_key0,
6109                         .cipher = ms_aes_cbc_cipher0,
6110                         .digest = ms_hmac_digest0,
6111                         .iv = ms_aes_cbc_iv0
6112                 },
6113                 {
6114                         .cipher_key = ms_aes_cbc_key1,
6115                         .hmac_key = ms_hmac_key1,
6116                         .cipher = ms_aes_cbc_cipher1,
6117                         .digest = ms_hmac_digest1,
6118                         .iv = ms_aes_cbc_iv1
6119                 },
6120                 {
6121                         .cipher_key = ms_aes_cbc_key2,
6122                         .hmac_key = ms_hmac_key2,
6123                         .cipher = ms_aes_cbc_cipher2,
6124                         .digest = ms_hmac_digest2,
6125                         .iv = ms_aes_cbc_iv2
6126                 },
6127
6128         };
6129
6130         rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
6131
6132         sessions = rte_malloc(NULL,
6133                         (sizeof(struct rte_cryptodev_sym_session *)
6134                                         * dev_info.sym.max_nb_sessions) + 1, 0);
6135
6136         for (i = 0; i < MB_SESSION_NUMBER; i++) {
6137                 sessions[i] = rte_cryptodev_sym_session_create(
6138                                 ts_params->session_mpool);
6139
6140                 rte_memcpy(&ut_paramz[i].ut_params, &testsuite_params,
6141                                 sizeof(struct crypto_unittest_params));
6142
6143                 test_AES_CBC_HMAC_SHA512_decrypt_create_session_params(
6144                                 &ut_paramz[i].ut_params,
6145                                 ut_paramz[i].cipher_key, ut_paramz[i].hmac_key);
6146
6147                 /* Create multiple crypto sessions*/
6148                 rte_cryptodev_sym_session_init(
6149                                 ts_params->valid_devs[0],
6150                                 sessions[i],
6151                                 &ut_paramz[i].ut_params.auth_xform,
6152                                 ts_params->session_mpool);
6153
6154                 TEST_ASSERT_NOT_NULL(sessions[i],
6155                                 "Session creation failed at session number %u",
6156                                 i);
6157
6158         }
6159
6160         srand(time(NULL));
6161         for (i = 0; i < 40000; i++) {
6162
6163                 j = rand() % MB_SESSION_NUMBER;
6164
6165                 TEST_ASSERT_SUCCESS(
6166                         test_AES_CBC_HMAC_SHA512_decrypt_perform(
6167                                         sessions[j],
6168                                         &ut_paramz[j].ut_params,
6169                                         ts_params, ut_paramz[j].cipher,
6170                                         ut_paramz[j].digest,
6171                                         ut_paramz[j].iv),
6172                         "Failed to perform decrypt on request number %u.", i);
6173
6174                 if (ut_paramz[j].ut_params.op)
6175                         rte_crypto_op_free(ut_paramz[j].ut_params.op);
6176
6177                 /*
6178                  * free mbuf - both obuf and ibuf are usually the same,
6179                  * so check if they point at the same address is necessary,
6180                  * to avoid freeing the mbuf twice.
6181                  */
6182                 if (ut_paramz[j].ut_params.obuf) {
6183                         rte_pktmbuf_free(ut_paramz[j].ut_params.obuf);
6184                         if (ut_paramz[j].ut_params.ibuf
6185                                         == ut_paramz[j].ut_params.obuf)
6186                                 ut_paramz[j].ut_params.ibuf = 0;
6187                         ut_paramz[j].ut_params.obuf = 0;
6188                 }
6189                 if (ut_paramz[j].ut_params.ibuf) {
6190                         rte_pktmbuf_free(ut_paramz[j].ut_params.ibuf);
6191                         ut_paramz[j].ut_params.ibuf = 0;
6192                 }
6193         }
6194
6195         for (i = 0; i < MB_SESSION_NUMBER; i++) {
6196                 rte_cryptodev_sym_session_clear(ts_params->valid_devs[0],
6197                                 sessions[i]);
6198                 rte_cryptodev_sym_session_free(sessions[i]);
6199         }
6200
6201         rte_free(sessions);
6202
6203         return TEST_SUCCESS;
6204 }
6205
6206 static int
6207 test_null_cipher_only_operation(void)
6208 {
6209         struct crypto_testsuite_params *ts_params = &testsuite_params;
6210         struct crypto_unittest_params *ut_params = &unittest_params;
6211
6212         /* Generate test mbuf data and space for digest */
6213         ut_params->ibuf = setup_test_string(ts_params->mbuf_pool,
6214                         catch_22_quote, QUOTE_512_BYTES, 0);
6215
6216         /* Setup Cipher Parameters */
6217         ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
6218         ut_params->cipher_xform.next = NULL;
6219
6220         ut_params->cipher_xform.cipher.algo = RTE_CRYPTO_CIPHER_NULL;
6221         ut_params->cipher_xform.cipher.op = RTE_CRYPTO_CIPHER_OP_ENCRYPT;
6222
6223         ut_params->sess = rte_cryptodev_sym_session_create(
6224                         ts_params->session_mpool);
6225
6226         /* Create Crypto session*/
6227         rte_cryptodev_sym_session_init(ts_params->valid_devs[0],
6228                                 ut_params->sess,
6229                                 &ut_params->cipher_xform,
6230                                 ts_params->session_mpool);
6231         TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed");
6232
6233         /* Generate Crypto op data structure */
6234         ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
6235                         RTE_CRYPTO_OP_TYPE_SYMMETRIC);
6236         TEST_ASSERT_NOT_NULL(ut_params->op,
6237                         "Failed to allocate symmetric crypto operation struct");
6238
6239         /* Set crypto operation data parameters */
6240         rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
6241
6242         struct rte_crypto_sym_op *sym_op = ut_params->op->sym;
6243
6244         /* set crypto operation source mbuf */
6245         sym_op->m_src = ut_params->ibuf;
6246
6247         sym_op->cipher.data.offset = 0;
6248         sym_op->cipher.data.length = QUOTE_512_BYTES;
6249
6250         /* Process crypto operation */
6251         ut_params->op = process_crypto_request(ts_params->valid_devs[0],
6252                         ut_params->op);
6253         TEST_ASSERT_NOT_NULL(ut_params->op, "no crypto operation returned");
6254
6255         TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
6256                         "crypto operation processing failed");
6257
6258         /* Validate obuf */
6259         TEST_ASSERT_BUFFERS_ARE_EQUAL(
6260                         rte_pktmbuf_mtod(ut_params->op->sym->m_src, uint8_t *),
6261                         catch_22_quote,
6262                         QUOTE_512_BYTES,
6263                         "Ciphertext data not as expected");
6264
6265         return TEST_SUCCESS;
6266 }
6267
6268 static int
6269 test_null_auth_only_operation(void)
6270 {
6271         struct crypto_testsuite_params *ts_params = &testsuite_params;
6272         struct crypto_unittest_params *ut_params = &unittest_params;
6273
6274         /* Generate test mbuf data and space for digest */
6275         ut_params->ibuf = setup_test_string(ts_params->mbuf_pool,
6276                         catch_22_quote, QUOTE_512_BYTES, 0);
6277
6278         /* Setup HMAC Parameters */
6279         ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;
6280         ut_params->auth_xform.next = NULL;
6281
6282         ut_params->auth_xform.auth.algo = RTE_CRYPTO_AUTH_NULL;
6283         ut_params->auth_xform.auth.op = RTE_CRYPTO_AUTH_OP_GENERATE;
6284
6285         ut_params->sess = rte_cryptodev_sym_session_create(
6286                         ts_params->session_mpool);
6287
6288         /* Create Crypto session*/
6289         rte_cryptodev_sym_session_init(ts_params->valid_devs[0],
6290                         ut_params->sess, &ut_params->auth_xform,
6291                         ts_params->session_mpool);
6292         TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed");
6293
6294         /* Generate Crypto op data structure */
6295         ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
6296                         RTE_CRYPTO_OP_TYPE_SYMMETRIC);
6297         TEST_ASSERT_NOT_NULL(ut_params->op,
6298                         "Failed to allocate symmetric crypto operation struct");
6299
6300         /* Set crypto operation data parameters */
6301         rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
6302
6303         struct rte_crypto_sym_op *sym_op = ut_params->op->sym;
6304
6305         sym_op->m_src = ut_params->ibuf;
6306
6307         sym_op->auth.data.offset = 0;
6308         sym_op->auth.data.length = QUOTE_512_BYTES;
6309
6310         /* Process crypto operation */
6311         ut_params->op = process_crypto_request(ts_params->valid_devs[0],
6312                         ut_params->op);
6313         TEST_ASSERT_NOT_NULL(ut_params->op, "no crypto operation returned");
6314
6315         TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
6316                         "crypto operation processing failed");
6317
6318         return TEST_SUCCESS;
6319 }
6320
6321 static int
6322 test_null_cipher_auth_operation(void)
6323 {
6324         struct crypto_testsuite_params *ts_params = &testsuite_params;
6325         struct crypto_unittest_params *ut_params = &unittest_params;
6326
6327         /* Generate test mbuf data and space for digest */
6328         ut_params->ibuf = setup_test_string(ts_params->mbuf_pool,
6329                         catch_22_quote, QUOTE_512_BYTES, 0);
6330
6331         /* Setup Cipher Parameters */
6332         ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
6333         ut_params->cipher_xform.next = &ut_params->auth_xform;
6334
6335         ut_params->cipher_xform.cipher.algo = RTE_CRYPTO_CIPHER_NULL;
6336         ut_params->cipher_xform.cipher.op = RTE_CRYPTO_CIPHER_OP_ENCRYPT;
6337
6338         /* Setup HMAC Parameters */
6339         ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;
6340         ut_params->auth_xform.next = NULL;
6341
6342         ut_params->auth_xform.auth.algo = RTE_CRYPTO_AUTH_NULL;
6343         ut_params->auth_xform.auth.op = RTE_CRYPTO_AUTH_OP_GENERATE;
6344
6345         ut_params->sess = rte_cryptodev_sym_session_create(
6346                         ts_params->session_mpool);
6347
6348         /* Create Crypto session*/
6349         rte_cryptodev_sym_session_init(ts_params->valid_devs[0],
6350                         ut_params->sess, &ut_params->cipher_xform,
6351                         ts_params->session_mpool);
6352         TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed");
6353
6354         /* Generate Crypto op data structure */
6355         ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
6356                         RTE_CRYPTO_OP_TYPE_SYMMETRIC);
6357         TEST_ASSERT_NOT_NULL(ut_params->op,
6358                         "Failed to allocate symmetric crypto operation struct");
6359
6360         /* Set crypto operation data parameters */
6361         rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
6362
6363         struct rte_crypto_sym_op *sym_op = ut_params->op->sym;
6364
6365         sym_op->m_src = ut_params->ibuf;
6366
6367         sym_op->cipher.data.offset = 0;
6368         sym_op->cipher.data.length = QUOTE_512_BYTES;
6369
6370         sym_op->auth.data.offset = 0;
6371         sym_op->auth.data.length = QUOTE_512_BYTES;
6372
6373         /* Process crypto operation */
6374         ut_params->op = process_crypto_request(ts_params->valid_devs[0],
6375                         ut_params->op);
6376         TEST_ASSERT_NOT_NULL(ut_params->op, "no crypto operation returned");
6377
6378         TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
6379                         "crypto operation processing failed");
6380
6381         /* Validate obuf */
6382         TEST_ASSERT_BUFFERS_ARE_EQUAL(
6383                         rte_pktmbuf_mtod(ut_params->op->sym->m_src, uint8_t *),
6384                         catch_22_quote,
6385                         QUOTE_512_BYTES,
6386                         "Ciphertext data not as expected");
6387
6388         return TEST_SUCCESS;
6389 }
6390
6391 static int
6392 test_null_auth_cipher_operation(void)
6393 {
6394         struct crypto_testsuite_params *ts_params = &testsuite_params;
6395         struct crypto_unittest_params *ut_params = &unittest_params;
6396
6397         /* Generate test mbuf data and space for digest */
6398         ut_params->ibuf = setup_test_string(ts_params->mbuf_pool,
6399                         catch_22_quote, QUOTE_512_BYTES, 0);
6400
6401         /* Setup Cipher Parameters */
6402         ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
6403         ut_params->cipher_xform.next = NULL;
6404
6405         ut_params->cipher_xform.cipher.algo = RTE_CRYPTO_CIPHER_NULL;
6406         ut_params->cipher_xform.cipher.op = RTE_CRYPTO_CIPHER_OP_ENCRYPT;
6407
6408         /* Setup HMAC Parameters */
6409         ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;
6410         ut_params->auth_xform.next = &ut_params->cipher_xform;
6411
6412         ut_params->auth_xform.auth.algo = RTE_CRYPTO_AUTH_NULL;
6413         ut_params->auth_xform.auth.op = RTE_CRYPTO_AUTH_OP_GENERATE;
6414
6415         ut_params->sess = rte_cryptodev_sym_session_create(
6416                         ts_params->session_mpool);
6417
6418         /* Create Crypto session*/
6419         rte_cryptodev_sym_session_init(ts_params->valid_devs[0],
6420                         ut_params->sess, &ut_params->cipher_xform,
6421                         ts_params->session_mpool);
6422         TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed");
6423
6424         /* Generate Crypto op data structure */
6425         ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
6426                         RTE_CRYPTO_OP_TYPE_SYMMETRIC);
6427         TEST_ASSERT_NOT_NULL(ut_params->op,
6428                         "Failed to allocate symmetric crypto operation struct");
6429
6430         /* Set crypto operation data parameters */
6431         rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
6432
6433         struct rte_crypto_sym_op *sym_op = ut_params->op->sym;
6434
6435         sym_op->m_src = ut_params->ibuf;
6436
6437         sym_op->cipher.data.offset = 0;
6438         sym_op->cipher.data.length = QUOTE_512_BYTES;
6439
6440         sym_op->auth.data.offset = 0;
6441         sym_op->auth.data.length = QUOTE_512_BYTES;
6442
6443         /* Process crypto operation */
6444         ut_params->op = process_crypto_request(ts_params->valid_devs[0],
6445                         ut_params->op);
6446         TEST_ASSERT_NOT_NULL(ut_params->op, "no crypto operation returned");
6447
6448         TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
6449                         "crypto operation processing failed");
6450
6451         /* Validate obuf */
6452         TEST_ASSERT_BUFFERS_ARE_EQUAL(
6453                         rte_pktmbuf_mtod(ut_params->op->sym->m_src, uint8_t *),
6454                         catch_22_quote,
6455                         QUOTE_512_BYTES,
6456                         "Ciphertext data not as expected");
6457
6458         return TEST_SUCCESS;
6459 }
6460
6461
6462 static int
6463 test_null_invalid_operation(void)
6464 {
6465         struct crypto_testsuite_params *ts_params = &testsuite_params;
6466         struct crypto_unittest_params *ut_params = &unittest_params;
6467         int ret;
6468
6469         /* Setup Cipher Parameters */
6470         ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
6471         ut_params->cipher_xform.next = NULL;
6472
6473         ut_params->cipher_xform.cipher.algo = RTE_CRYPTO_CIPHER_AES_CBC;
6474         ut_params->cipher_xform.cipher.op = RTE_CRYPTO_CIPHER_OP_ENCRYPT;
6475
6476         ut_params->sess = rte_cryptodev_sym_session_create(
6477                         ts_params->session_mpool);
6478
6479         /* Create Crypto session*/
6480         ret = rte_cryptodev_sym_session_init(ts_params->valid_devs[0],
6481                         ut_params->sess, &ut_params->cipher_xform,
6482                         ts_params->session_mpool);
6483         TEST_ASSERT(ret < 0,
6484                         "Session creation succeeded unexpectedly");
6485
6486
6487         /* Setup HMAC Parameters */
6488         ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;
6489         ut_params->auth_xform.next = NULL;
6490
6491         ut_params->auth_xform.auth.algo = RTE_CRYPTO_AUTH_SHA1_HMAC;
6492         ut_params->auth_xform.auth.op = RTE_CRYPTO_AUTH_OP_GENERATE;
6493
6494         ut_params->sess = rte_cryptodev_sym_session_create(
6495                         ts_params->session_mpool);
6496
6497         /* Create Crypto session*/
6498         ret = rte_cryptodev_sym_session_init(ts_params->valid_devs[0],
6499                         ut_params->sess, &ut_params->auth_xform,
6500                         ts_params->session_mpool);
6501         TEST_ASSERT(ret < 0,
6502                         "Session creation succeeded unexpectedly");
6503
6504         return TEST_SUCCESS;
6505 }
6506
6507
6508 #define NULL_BURST_LENGTH (32)
6509
6510 static int
6511 test_null_burst_operation(void)
6512 {
6513         struct crypto_testsuite_params *ts_params = &testsuite_params;
6514         struct crypto_unittest_params *ut_params = &unittest_params;
6515
6516         unsigned i, burst_len = NULL_BURST_LENGTH;
6517
6518         struct rte_crypto_op *burst[NULL_BURST_LENGTH] = { NULL };
6519         struct rte_crypto_op *burst_dequeued[NULL_BURST_LENGTH] = { NULL };
6520
6521         /* Setup Cipher Parameters */
6522         ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
6523         ut_params->cipher_xform.next = &ut_params->auth_xform;
6524
6525         ut_params->cipher_xform.cipher.algo = RTE_CRYPTO_CIPHER_NULL;
6526         ut_params->cipher_xform.cipher.op = RTE_CRYPTO_CIPHER_OP_ENCRYPT;
6527
6528         /* Setup HMAC Parameters */
6529         ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;
6530         ut_params->auth_xform.next = NULL;
6531
6532         ut_params->auth_xform.auth.algo = RTE_CRYPTO_AUTH_NULL;
6533         ut_params->auth_xform.auth.op = RTE_CRYPTO_AUTH_OP_GENERATE;
6534
6535         ut_params->sess = rte_cryptodev_sym_session_create(
6536                         ts_params->session_mpool);
6537
6538         /* Create Crypto session*/
6539         rte_cryptodev_sym_session_init(ts_params->valid_devs[0],
6540                         ut_params->sess, &ut_params->cipher_xform,
6541                         ts_params->session_mpool);
6542         TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed");
6543
6544         TEST_ASSERT_EQUAL(rte_crypto_op_bulk_alloc(ts_params->op_mpool,
6545                         RTE_CRYPTO_OP_TYPE_SYMMETRIC, burst, burst_len),
6546                         burst_len, "failed to generate burst of crypto ops");
6547
6548         /* Generate an operation for each mbuf in burst */
6549         for (i = 0; i < burst_len; i++) {
6550                 struct rte_mbuf *m = rte_pktmbuf_alloc(ts_params->mbuf_pool);
6551
6552                 TEST_ASSERT_NOT_NULL(m, "Failed to allocate mbuf");
6553
6554                 unsigned *data = (unsigned *)rte_pktmbuf_append(m,
6555                                 sizeof(unsigned));
6556                 *data = i;
6557
6558                 rte_crypto_op_attach_sym_session(burst[i], ut_params->sess);
6559
6560                 burst[i]->sym->m_src = m;
6561         }
6562
6563         /* Process crypto operation */
6564         TEST_ASSERT_EQUAL(rte_cryptodev_enqueue_burst(ts_params->valid_devs[0],
6565                         0, burst, burst_len),
6566                         burst_len,
6567                         "Error enqueuing burst");
6568
6569         TEST_ASSERT_EQUAL(rte_cryptodev_dequeue_burst(ts_params->valid_devs[0],
6570                         0, burst_dequeued, burst_len),
6571                         burst_len,
6572                         "Error dequeuing burst");
6573
6574
6575         for (i = 0; i < burst_len; i++) {
6576                 TEST_ASSERT_EQUAL(
6577                         *rte_pktmbuf_mtod(burst[i]->sym->m_src, uint32_t *),
6578                         *rte_pktmbuf_mtod(burst_dequeued[i]->sym->m_src,
6579                                         uint32_t *),
6580                         "data not as expected");
6581
6582                 rte_pktmbuf_free(burst[i]->sym->m_src);
6583                 rte_crypto_op_free(burst[i]);
6584         }
6585
6586         return TEST_SUCCESS;
6587 }
6588
6589 static void
6590 generate_gmac_large_plaintext(uint8_t *data)
6591 {
6592         uint16_t i;
6593
6594         for (i = 32; i < GMAC_LARGE_PLAINTEXT_LENGTH; i += 32)
6595                 memcpy(&data[i], &data[0], 32);
6596 }
6597
6598 static int
6599 create_gmac_operation(enum rte_crypto_auth_operation op,
6600                 const struct gmac_test_data *tdata)
6601 {
6602         struct crypto_testsuite_params *ts_params = &testsuite_params;
6603         struct crypto_unittest_params *ut_params = &unittest_params;
6604         struct rte_crypto_sym_op *sym_op;
6605
6606         uint32_t plaintext_pad_len = RTE_ALIGN_CEIL(tdata->plaintext.len, 16);
6607
6608         /* Generate Crypto op data structure */
6609         ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
6610                         RTE_CRYPTO_OP_TYPE_SYMMETRIC);
6611         TEST_ASSERT_NOT_NULL(ut_params->op,
6612                         "Failed to allocate symmetric crypto operation struct");
6613
6614         sym_op = ut_params->op->sym;
6615
6616         sym_op->auth.digest.data = (uint8_t *)rte_pktmbuf_append(
6617                         ut_params->ibuf, tdata->gmac_tag.len);
6618         TEST_ASSERT_NOT_NULL(sym_op->auth.digest.data,
6619                         "no room to append digest");
6620
6621         sym_op->auth.digest.phys_addr = rte_pktmbuf_mtophys_offset(
6622                         ut_params->ibuf, plaintext_pad_len);
6623
6624         if (op == RTE_CRYPTO_AUTH_OP_VERIFY) {
6625                 rte_memcpy(sym_op->auth.digest.data, tdata->gmac_tag.data,
6626                                 tdata->gmac_tag.len);
6627                 TEST_HEXDUMP(stdout, "digest:",
6628                                 sym_op->auth.digest.data,
6629                                 tdata->gmac_tag.len);
6630         }
6631
6632         uint8_t *iv_ptr = rte_crypto_op_ctod_offset(ut_params->op,
6633                         uint8_t *, IV_OFFSET);
6634
6635         rte_memcpy(iv_ptr, tdata->iv.data, tdata->iv.len);
6636
6637         TEST_HEXDUMP(stdout, "iv:", iv_ptr, tdata->iv.len);
6638
6639         sym_op->cipher.data.length = 0;
6640         sym_op->cipher.data.offset = 0;
6641
6642         sym_op->auth.data.offset = 0;
6643         sym_op->auth.data.length = tdata->plaintext.len;
6644
6645         return 0;
6646 }
6647
6648 static int create_gmac_session(uint8_t dev_id,
6649                 const struct gmac_test_data *tdata,
6650                 enum rte_crypto_auth_operation auth_op)
6651 {
6652         uint8_t auth_key[tdata->key.len];
6653
6654         struct crypto_testsuite_params *ts_params = &testsuite_params;
6655         struct crypto_unittest_params *ut_params = &unittest_params;
6656
6657         memcpy(auth_key, tdata->key.data, tdata->key.len);
6658
6659         ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;
6660         ut_params->auth_xform.next = NULL;
6661
6662         ut_params->auth_xform.auth.algo = RTE_CRYPTO_AUTH_AES_GMAC;
6663         ut_params->auth_xform.auth.op = auth_op;
6664         ut_params->auth_xform.auth.digest_length = tdata->gmac_tag.len;
6665         ut_params->auth_xform.auth.key.length = tdata->key.len;
6666         ut_params->auth_xform.auth.key.data = auth_key;
6667         ut_params->auth_xform.auth.iv.offset = IV_OFFSET;
6668         ut_params->auth_xform.auth.iv.length = tdata->iv.len;
6669
6670
6671         ut_params->sess = rte_cryptodev_sym_session_create(
6672                         ts_params->session_mpool);
6673
6674         rte_cryptodev_sym_session_init(dev_id, ut_params->sess,
6675                         &ut_params->auth_xform,
6676                         ts_params->session_mpool);
6677
6678         TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed");
6679
6680         return 0;
6681 }
6682
6683 static int
6684 test_AES_GMAC_authentication(const struct gmac_test_data *tdata)
6685 {
6686         struct crypto_testsuite_params *ts_params = &testsuite_params;
6687         struct crypto_unittest_params *ut_params = &unittest_params;
6688
6689         int retval;
6690
6691         uint8_t *auth_tag, *plaintext;
6692         uint16_t plaintext_pad_len;
6693
6694         TEST_ASSERT_NOT_EQUAL(tdata->gmac_tag.len, 0,
6695                               "No GMAC length in the source data");
6696
6697         retval = create_gmac_session(ts_params->valid_devs[0],
6698                         tdata, RTE_CRYPTO_AUTH_OP_GENERATE);
6699
6700         if (retval < 0)
6701                 return retval;
6702
6703         if (tdata->plaintext.len > MBUF_SIZE)
6704                 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->large_mbuf_pool);
6705         else
6706                 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
6707         TEST_ASSERT_NOT_NULL(ut_params->ibuf,
6708                         "Failed to allocate input buffer in mempool");
6709
6710         memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
6711                         rte_pktmbuf_tailroom(ut_params->ibuf));
6712
6713         plaintext_pad_len = RTE_ALIGN_CEIL(tdata->plaintext.len, 16);
6714         /*
6715          * Runtime generate the large plain text instead of use hard code
6716          * plain text vector. It is done to avoid create huge source file
6717          * with the test vector.
6718          */
6719         if (tdata->plaintext.len == GMAC_LARGE_PLAINTEXT_LENGTH)
6720                 generate_gmac_large_plaintext(tdata->plaintext.data);
6721
6722         plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
6723                                 plaintext_pad_len);
6724         TEST_ASSERT_NOT_NULL(plaintext, "no room to append plaintext");
6725
6726         memcpy(plaintext, tdata->plaintext.data, tdata->plaintext.len);
6727         TEST_HEXDUMP(stdout, "plaintext:", plaintext,
6728                         tdata->plaintext.len);
6729
6730         retval = create_gmac_operation(RTE_CRYPTO_AUTH_OP_GENERATE,
6731                         tdata);
6732
6733         if (retval < 0)
6734                 return retval;
6735
6736         rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
6737
6738         ut_params->op->sym->m_src = ut_params->ibuf;
6739
6740         TEST_ASSERT_NOT_NULL(process_crypto_request(ts_params->valid_devs[0],
6741                         ut_params->op), "failed to process sym crypto op");
6742
6743         TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
6744                         "crypto op processing failed");
6745
6746         if (ut_params->op->sym->m_dst) {
6747                 auth_tag = rte_pktmbuf_mtod_offset(ut_params->op->sym->m_dst,
6748                                 uint8_t *, plaintext_pad_len);
6749         } else {
6750                 auth_tag = plaintext + plaintext_pad_len;
6751         }
6752
6753         TEST_HEXDUMP(stdout, "auth tag:", auth_tag, tdata->gmac_tag.len);
6754
6755         TEST_ASSERT_BUFFERS_ARE_EQUAL(
6756                         auth_tag,
6757                         tdata->gmac_tag.data,
6758                         tdata->gmac_tag.len,
6759                         "GMAC Generated auth tag not as expected");
6760
6761         return 0;
6762 }
6763
6764 static int
6765 test_AES_GMAC_authentication_test_case_1(void)
6766 {
6767         return test_AES_GMAC_authentication(&gmac_test_case_1);
6768 }
6769
6770 static int
6771 test_AES_GMAC_authentication_test_case_2(void)
6772 {
6773         return test_AES_GMAC_authentication(&gmac_test_case_2);
6774 }
6775
6776 static int
6777 test_AES_GMAC_authentication_test_case_3(void)
6778 {
6779         return test_AES_GMAC_authentication(&gmac_test_case_3);
6780 }
6781
6782 static int
6783 test_AES_GMAC_authentication_test_case_4(void)
6784 {
6785         return test_AES_GMAC_authentication(&gmac_test_case_4);
6786 }
6787
6788 static int
6789 test_AES_GMAC_authentication_verify(const struct gmac_test_data *tdata)
6790 {
6791         struct crypto_testsuite_params *ts_params = &testsuite_params;
6792         struct crypto_unittest_params *ut_params = &unittest_params;
6793         int retval;
6794         uint32_t plaintext_pad_len;
6795         uint8_t *plaintext;
6796
6797         TEST_ASSERT_NOT_EQUAL(tdata->gmac_tag.len, 0,
6798                               "No GMAC length in the source data");
6799
6800         retval = create_gmac_session(ts_params->valid_devs[0],
6801                         tdata, RTE_CRYPTO_AUTH_OP_VERIFY);
6802
6803         if (retval < 0)
6804                 return retval;
6805
6806         if (tdata->plaintext.len > MBUF_SIZE)
6807                 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->large_mbuf_pool);
6808         else
6809                 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
6810         TEST_ASSERT_NOT_NULL(ut_params->ibuf,
6811                         "Failed to allocate input buffer in mempool");
6812
6813         memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
6814                         rte_pktmbuf_tailroom(ut_params->ibuf));
6815
6816         plaintext_pad_len = RTE_ALIGN_CEIL(tdata->plaintext.len, 16);
6817
6818         /*
6819          * Runtime generate the large plain text instead of use hard code
6820          * plain text vector. It is done to avoid create huge source file
6821          * with the test vector.
6822          */
6823         if (tdata->plaintext.len == GMAC_LARGE_PLAINTEXT_LENGTH)
6824                 generate_gmac_large_plaintext(tdata->plaintext.data);
6825
6826         plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
6827                                 plaintext_pad_len);
6828         TEST_ASSERT_NOT_NULL(plaintext, "no room to append plaintext");
6829
6830         memcpy(plaintext, tdata->plaintext.data, tdata->plaintext.len);
6831         TEST_HEXDUMP(stdout, "plaintext:", plaintext,
6832                         tdata->plaintext.len);
6833
6834         retval = create_gmac_operation(RTE_CRYPTO_AUTH_OP_VERIFY,
6835                         tdata);
6836
6837         if (retval < 0)
6838                 return retval;
6839
6840         rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
6841
6842         ut_params->op->sym->m_src = ut_params->ibuf;
6843
6844         TEST_ASSERT_NOT_NULL(process_crypto_request(ts_params->valid_devs[0],
6845                         ut_params->op), "failed to process sym crypto op");
6846
6847         TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
6848                         "crypto op processing failed");
6849
6850         return 0;
6851
6852 }
6853
6854 static int
6855 test_AES_GMAC_authentication_verify_test_case_1(void)
6856 {
6857         return test_AES_GMAC_authentication_verify(&gmac_test_case_1);
6858 }
6859
6860 static int
6861 test_AES_GMAC_authentication_verify_test_case_2(void)
6862 {
6863         return test_AES_GMAC_authentication_verify(&gmac_test_case_2);
6864 }
6865
6866 static int
6867 test_AES_GMAC_authentication_verify_test_case_3(void)
6868 {
6869         return test_AES_GMAC_authentication_verify(&gmac_test_case_3);
6870 }
6871
6872 static int
6873 test_AES_GMAC_authentication_verify_test_case_4(void)
6874 {
6875         return test_AES_GMAC_authentication_verify(&gmac_test_case_4);
6876 }
6877
6878 struct test_crypto_vector {
6879         enum rte_crypto_cipher_algorithm crypto_algo;
6880
6881         struct {
6882                 uint8_t data[64];
6883                 unsigned int len;
6884         } cipher_key;
6885
6886         struct {
6887                 uint8_t data[64];
6888                 unsigned int len;
6889         } iv;
6890
6891         struct {
6892                 const uint8_t *data;
6893                 unsigned int len;
6894         } plaintext;
6895
6896         struct {
6897                 const uint8_t *data;
6898                 unsigned int len;
6899         } ciphertext;
6900
6901         enum rte_crypto_auth_algorithm auth_algo;
6902
6903         struct {
6904                 uint8_t data[128];
6905                 unsigned int len;
6906         } auth_key;
6907
6908         struct {
6909                 const uint8_t *data;
6910                 unsigned int len;
6911         } aad;
6912
6913         struct {
6914                 uint8_t data[128];
6915                 unsigned int len;
6916         } digest;
6917 };
6918
6919 static const struct test_crypto_vector
6920 hmac_sha1_test_crypto_vector = {
6921         .auth_algo = RTE_CRYPTO_AUTH_SHA1_HMAC,
6922         .plaintext = {
6923                 .data = plaintext_hash,
6924                 .len = 512
6925         },
6926         .auth_key = {
6927                 .data = {
6928                         0xF8, 0x2A, 0xC7, 0x54, 0xDB, 0x96, 0x18, 0xAA,
6929                         0xC3, 0xA1, 0x53, 0xF6, 0x1F, 0x17, 0x60, 0xBD,
6930                         0xDE, 0xF4, 0xDE, 0xAD
6931                 },
6932                 .len = 20
6933         },
6934         .digest = {
6935                 .data = {
6936                         0xC4, 0xB7, 0x0E, 0x6B, 0xDE, 0xD1, 0xE7, 0x77,
6937                         0x7E, 0x2E, 0x8F, 0xFC, 0x48, 0x39, 0x46, 0x17,
6938                         0x3F, 0x91, 0x64, 0x59
6939                 },
6940                 .len = 20
6941         }
6942 };
6943
6944 static const struct test_crypto_vector
6945 aes128_gmac_test_vector = {
6946         .auth_algo = RTE_CRYPTO_AUTH_AES_GMAC,
6947         .plaintext = {
6948                 .data = plaintext_hash,
6949                 .len = 512
6950         },
6951         .iv = {
6952                 .data = {
6953                         0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
6954                         0x08, 0x09, 0x0A, 0x0B
6955                 },
6956                 .len = 12
6957         },
6958         .auth_key = {
6959                 .data = {
6960                         0x42, 0x1A, 0x7D, 0x3D, 0xF5, 0x82, 0x80, 0xF1,
6961                         0xF1, 0x35, 0x5C, 0x3B, 0xDD, 0x9A, 0x65, 0xBA
6962                 },
6963                 .len = 16
6964         },
6965         .digest = {
6966                 .data = {
6967                         0xCA, 0x00, 0x99, 0x8B, 0x30, 0x7E, 0x74, 0x56,
6968                         0x32, 0xA7, 0x87, 0xB5, 0xE9, 0xB2, 0x34, 0x5A
6969                 },
6970                 .len = 16
6971         }
6972 };
6973
6974 static const struct test_crypto_vector
6975 aes128cbc_hmac_sha1_test_vector = {
6976         .crypto_algo = RTE_CRYPTO_CIPHER_AES_CBC,
6977         .cipher_key = {
6978                 .data = {
6979                         0xE4, 0x23, 0x33, 0x8A, 0x35, 0x64, 0x61, 0xE2,
6980                         0x49, 0x03, 0xDD, 0xC6, 0xB8, 0xCA, 0x55, 0x7A
6981                 },
6982                 .len = 16
6983         },
6984         .iv = {
6985                 .data = {
6986                         0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
6987                         0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F
6988                 },
6989                 .len = 16
6990         },
6991         .plaintext = {
6992                 .data = plaintext_hash,
6993                 .len = 512
6994         },
6995         .ciphertext = {
6996                 .data = ciphertext512_aes128cbc,
6997                 .len = 512
6998         },
6999         .auth_algo = RTE_CRYPTO_AUTH_SHA1_HMAC,
7000         .auth_key = {
7001                 .data = {
7002                         0xF8, 0x2A, 0xC7, 0x54, 0xDB, 0x96, 0x18, 0xAA,
7003                         0xC3, 0xA1, 0x53, 0xF6, 0x1F, 0x17, 0x60, 0xBD,
7004                         0xDE, 0xF4, 0xDE, 0xAD
7005                 },
7006                 .len = 20
7007         },
7008         .digest = {
7009                 .data = {
7010                         0x9A, 0x4F, 0x88, 0x1B, 0xB6, 0x8F, 0xD8, 0x60,
7011                         0x42, 0x1A, 0x7D, 0x3D, 0xF5, 0x82, 0x80, 0xF1,
7012                         0x18, 0x8C, 0x1D, 0x32
7013                 },
7014                 .len = 20
7015         }
7016 };
7017
7018 static void
7019 data_corruption(uint8_t *data)
7020 {
7021         data[0] += 1;
7022 }
7023
7024 static void
7025 tag_corruption(uint8_t *data, unsigned int tag_offset)
7026 {
7027         data[tag_offset] += 1;
7028 }
7029
7030 static int
7031 create_auth_session(struct crypto_unittest_params *ut_params,
7032                 uint8_t dev_id,
7033                 const struct test_crypto_vector *reference,
7034                 enum rte_crypto_auth_operation auth_op)
7035 {
7036         struct crypto_testsuite_params *ts_params = &testsuite_params;
7037         uint8_t auth_key[reference->auth_key.len + 1];
7038
7039         memcpy(auth_key, reference->auth_key.data, reference->auth_key.len);
7040
7041         /* Setup Authentication Parameters */
7042         ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;
7043         ut_params->auth_xform.auth.op = auth_op;
7044         ut_params->auth_xform.next = NULL;
7045         ut_params->auth_xform.auth.algo = reference->auth_algo;
7046         ut_params->auth_xform.auth.key.length = reference->auth_key.len;
7047         ut_params->auth_xform.auth.key.data = auth_key;
7048         ut_params->auth_xform.auth.digest_length = reference->digest.len;
7049
7050         /* Create Crypto session*/
7051         ut_params->sess = rte_cryptodev_sym_session_create(
7052                         ts_params->session_mpool);
7053
7054         rte_cryptodev_sym_session_init(dev_id, ut_params->sess,
7055                                 &ut_params->auth_xform,
7056                                 ts_params->session_mpool);
7057
7058         TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed");
7059
7060         return 0;
7061 }
7062
7063 static int
7064 create_auth_cipher_session(struct crypto_unittest_params *ut_params,
7065                 uint8_t dev_id,
7066                 const struct test_crypto_vector *reference,
7067                 enum rte_crypto_auth_operation auth_op,
7068                 enum rte_crypto_cipher_operation cipher_op)
7069 {
7070         struct crypto_testsuite_params *ts_params = &testsuite_params;
7071         uint8_t cipher_key[reference->cipher_key.len + 1];
7072         uint8_t auth_key[reference->auth_key.len + 1];
7073
7074         memcpy(cipher_key, reference->cipher_key.data,
7075                         reference->cipher_key.len);
7076         memcpy(auth_key, reference->auth_key.data, reference->auth_key.len);
7077
7078         /* Setup Authentication Parameters */
7079         ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;
7080         ut_params->auth_xform.auth.op = auth_op;
7081         ut_params->auth_xform.auth.algo = reference->auth_algo;
7082         ut_params->auth_xform.auth.key.length = reference->auth_key.len;
7083         ut_params->auth_xform.auth.key.data = auth_key;
7084         ut_params->auth_xform.auth.digest_length = reference->digest.len;
7085
7086         if (reference->auth_algo == RTE_CRYPTO_AUTH_AES_GMAC) {
7087                 ut_params->auth_xform.auth.iv.offset = IV_OFFSET;
7088                 ut_params->auth_xform.auth.iv.length = reference->iv.len;
7089         } else {
7090                 ut_params->auth_xform.next = &ut_params->cipher_xform;
7091
7092                 /* Setup Cipher Parameters */
7093                 ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
7094                 ut_params->cipher_xform.next = NULL;
7095                 ut_params->cipher_xform.cipher.algo = reference->crypto_algo;
7096                 ut_params->cipher_xform.cipher.op = cipher_op;
7097                 ut_params->cipher_xform.cipher.key.data = cipher_key;
7098                 ut_params->cipher_xform.cipher.key.length = reference->cipher_key.len;
7099                 ut_params->cipher_xform.cipher.iv.offset = IV_OFFSET;
7100                 ut_params->cipher_xform.cipher.iv.length = reference->iv.len;
7101         }
7102
7103         /* Create Crypto session*/
7104         ut_params->sess = rte_cryptodev_sym_session_create(
7105                         ts_params->session_mpool);
7106
7107         rte_cryptodev_sym_session_init(dev_id, ut_params->sess,
7108                                 &ut_params->auth_xform,
7109                                 ts_params->session_mpool);
7110
7111         TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed");
7112
7113         return 0;
7114 }
7115
7116 static int
7117 create_auth_operation(struct crypto_testsuite_params *ts_params,
7118                 struct crypto_unittest_params *ut_params,
7119                 const struct test_crypto_vector *reference,
7120                 unsigned int auth_generate)
7121 {
7122         /* Generate Crypto op data structure */
7123         ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
7124                         RTE_CRYPTO_OP_TYPE_SYMMETRIC);
7125         TEST_ASSERT_NOT_NULL(ut_params->op,
7126                         "Failed to allocate pktmbuf offload");
7127
7128         /* Set crypto operation data parameters */
7129         rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
7130
7131         struct rte_crypto_sym_op *sym_op = ut_params->op->sym;
7132
7133         /* set crypto operation source mbuf */
7134         sym_op->m_src = ut_params->ibuf;
7135
7136         /* digest */
7137         sym_op->auth.digest.data = (uint8_t *)rte_pktmbuf_append(
7138                         ut_params->ibuf, reference->digest.len);
7139
7140         TEST_ASSERT_NOT_NULL(sym_op->auth.digest.data,
7141                         "no room to append auth tag");
7142
7143         sym_op->auth.digest.phys_addr = rte_pktmbuf_mtophys_offset(
7144                         ut_params->ibuf, reference->plaintext.len);
7145
7146         if (auth_generate)
7147                 memset(sym_op->auth.digest.data, 0, reference->digest.len);
7148         else
7149                 memcpy(sym_op->auth.digest.data,
7150                                 reference->digest.data,
7151                                 reference->digest.len);
7152
7153         TEST_HEXDUMP(stdout, "digest:",
7154                         sym_op->auth.digest.data,
7155                         reference->digest.len);
7156
7157         sym_op->auth.data.length = reference->plaintext.len;
7158         sym_op->auth.data.offset = 0;
7159
7160         return 0;
7161 }
7162
7163 static int
7164 create_auth_GMAC_operation(struct crypto_testsuite_params *ts_params,
7165                 struct crypto_unittest_params *ut_params,
7166                 const struct test_crypto_vector *reference,
7167                 unsigned int auth_generate)
7168 {
7169         /* Generate Crypto op data structure */
7170         ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
7171                         RTE_CRYPTO_OP_TYPE_SYMMETRIC);
7172         TEST_ASSERT_NOT_NULL(ut_params->op,
7173                         "Failed to allocate pktmbuf offload");
7174
7175         /* Set crypto operation data parameters */
7176         rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
7177
7178         struct rte_crypto_sym_op *sym_op = ut_params->op->sym;
7179
7180         /* set crypto operation source mbuf */
7181         sym_op->m_src = ut_params->ibuf;
7182
7183         /* digest */
7184         sym_op->auth.digest.data = (uint8_t *)rte_pktmbuf_append(
7185                         ut_params->ibuf, reference->digest.len);
7186
7187         TEST_ASSERT_NOT_NULL(sym_op->auth.digest.data,
7188                         "no room to append auth tag");
7189
7190         sym_op->auth.digest.phys_addr = rte_pktmbuf_mtophys_offset(
7191                         ut_params->ibuf, reference->ciphertext.len);
7192
7193         if (auth_generate)
7194                 memset(sym_op->auth.digest.data, 0, reference->digest.len);
7195         else
7196                 memcpy(sym_op->auth.digest.data,
7197                                 reference->digest.data,
7198                                 reference->digest.len);
7199
7200         TEST_HEXDUMP(stdout, "digest:",
7201                         sym_op->auth.digest.data,
7202                         reference->digest.len);
7203
7204         rte_memcpy(rte_crypto_op_ctod_offset(ut_params->op, uint8_t *, IV_OFFSET),
7205                         reference->iv.data, reference->iv.len);
7206
7207         sym_op->cipher.data.length = 0;
7208         sym_op->cipher.data.offset = 0;
7209
7210         sym_op->auth.data.length = reference->plaintext.len;
7211         sym_op->auth.data.offset = 0;
7212
7213         return 0;
7214 }
7215
7216 static int
7217 create_cipher_auth_operation(struct crypto_testsuite_params *ts_params,
7218                 struct crypto_unittest_params *ut_params,
7219                 const struct test_crypto_vector *reference,
7220                 unsigned int auth_generate)
7221 {
7222         /* Generate Crypto op data structure */
7223         ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
7224                         RTE_CRYPTO_OP_TYPE_SYMMETRIC);
7225         TEST_ASSERT_NOT_NULL(ut_params->op,
7226                         "Failed to allocate pktmbuf offload");
7227
7228         /* Set crypto operation data parameters */
7229         rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
7230
7231         struct rte_crypto_sym_op *sym_op = ut_params->op->sym;
7232
7233         /* set crypto operation source mbuf */
7234         sym_op->m_src = ut_params->ibuf;
7235
7236         /* digest */
7237         sym_op->auth.digest.data = (uint8_t *)rte_pktmbuf_append(
7238                         ut_params->ibuf, reference->digest.len);
7239
7240         TEST_ASSERT_NOT_NULL(sym_op->auth.digest.data,
7241                         "no room to append auth tag");
7242
7243         sym_op->auth.digest.phys_addr = rte_pktmbuf_mtophys_offset(
7244                         ut_params->ibuf, reference->ciphertext.len);
7245
7246         if (auth_generate)
7247                 memset(sym_op->auth.digest.data, 0, reference->digest.len);
7248         else
7249                 memcpy(sym_op->auth.digest.data,
7250                                 reference->digest.data,
7251                                 reference->digest.len);
7252
7253         TEST_HEXDUMP(stdout, "digest:",
7254                         sym_op->auth.digest.data,
7255                         reference->digest.len);
7256
7257         rte_memcpy(rte_crypto_op_ctod_offset(ut_params->op, uint8_t *, IV_OFFSET),
7258                         reference->iv.data, reference->iv.len);
7259
7260         sym_op->cipher.data.length = reference->ciphertext.len;
7261         sym_op->cipher.data.offset = 0;
7262
7263         sym_op->auth.data.length = reference->ciphertext.len;
7264         sym_op->auth.data.offset = 0;
7265
7266         return 0;
7267 }
7268
7269 static int
7270 create_auth_verify_operation(struct crypto_testsuite_params *ts_params,
7271                 struct crypto_unittest_params *ut_params,
7272                 const struct test_crypto_vector *reference)
7273 {
7274         return create_auth_operation(ts_params, ut_params, reference, 0);
7275 }
7276
7277 static int
7278 create_auth_verify_GMAC_operation(
7279                 struct crypto_testsuite_params *ts_params,
7280                 struct crypto_unittest_params *ut_params,
7281                 const struct test_crypto_vector *reference)
7282 {
7283         return create_auth_GMAC_operation(ts_params, ut_params, reference, 0);
7284 }
7285
7286 static int
7287 create_cipher_auth_verify_operation(struct crypto_testsuite_params *ts_params,
7288                 struct crypto_unittest_params *ut_params,
7289                 const struct test_crypto_vector *reference)
7290 {
7291         return create_cipher_auth_operation(ts_params, ut_params, reference, 0);
7292 }
7293
7294 static int
7295 test_authentication_verify_fail_when_data_corruption(
7296                 struct crypto_testsuite_params *ts_params,
7297                 struct crypto_unittest_params *ut_params,
7298                 const struct test_crypto_vector *reference,
7299                 unsigned int data_corrupted)
7300 {
7301         int retval;
7302
7303         uint8_t *plaintext;
7304
7305         /* Create session */
7306         retval = create_auth_session(ut_params,
7307                         ts_params->valid_devs[0],
7308                         reference,
7309                         RTE_CRYPTO_AUTH_OP_VERIFY);
7310         if (retval < 0)
7311                 return retval;
7312
7313         ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
7314         TEST_ASSERT_NOT_NULL(ut_params->ibuf,
7315                         "Failed to allocate input buffer in mempool");
7316
7317         /* clear mbuf payload */
7318         memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
7319                         rte_pktmbuf_tailroom(ut_params->ibuf));
7320
7321         plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
7322                         reference->plaintext.len);
7323         TEST_ASSERT_NOT_NULL(plaintext, "no room to append plaintext");
7324         memcpy(plaintext, reference->plaintext.data, reference->plaintext.len);
7325
7326         TEST_HEXDUMP(stdout, "plaintext:", plaintext, reference->plaintext.len);
7327
7328         /* Create operation */
7329         retval = create_auth_verify_operation(ts_params, ut_params, reference);
7330
7331         if (retval < 0)
7332                 return retval;
7333
7334         if (data_corrupted)
7335                 data_corruption(plaintext);
7336         else
7337                 tag_corruption(plaintext, reference->plaintext.len);
7338
7339         ut_params->op = process_crypto_request(ts_params->valid_devs[0],
7340                         ut_params->op);
7341         TEST_ASSERT_NOT_NULL(ut_params->op, "failed crypto process");
7342         TEST_ASSERT_EQUAL(ut_params->op->status,
7343                         RTE_CRYPTO_OP_STATUS_AUTH_FAILED,
7344                         "authentication not failed");
7345
7346         ut_params->obuf = ut_params->op->sym->m_src;
7347         TEST_ASSERT_NOT_NULL(ut_params->obuf, "failed to retrieve obuf");
7348
7349         return 0;
7350 }
7351
7352 static int
7353 test_authentication_verify_GMAC_fail_when_corruption(
7354                 struct crypto_testsuite_params *ts_params,
7355                 struct crypto_unittest_params *ut_params,
7356                 const struct test_crypto_vector *reference,
7357                 unsigned int data_corrupted)
7358 {
7359         int retval;
7360         uint8_t *plaintext;
7361
7362         /* Create session */
7363         retval = create_auth_cipher_session(ut_params,
7364                         ts_params->valid_devs[0],
7365                         reference,
7366                         RTE_CRYPTO_AUTH_OP_VERIFY,
7367                         RTE_CRYPTO_CIPHER_OP_DECRYPT);
7368         if (retval < 0)
7369                 return retval;
7370
7371         ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
7372         TEST_ASSERT_NOT_NULL(ut_params->ibuf,
7373                         "Failed to allocate input buffer in mempool");
7374
7375         /* clear mbuf payload */
7376         memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
7377                         rte_pktmbuf_tailroom(ut_params->ibuf));
7378
7379         plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
7380                         reference->plaintext.len);
7381         TEST_ASSERT_NOT_NULL(plaintext, "no room to append plaintext");
7382         memcpy(plaintext, reference->plaintext.data, reference->plaintext.len);
7383
7384         TEST_HEXDUMP(stdout, "plaintext:", plaintext, reference->plaintext.len);
7385
7386         /* Create operation */
7387         retval = create_auth_verify_GMAC_operation(ts_params,
7388                         ut_params,
7389                         reference);
7390
7391         if (retval < 0)
7392                 return retval;
7393
7394         if (data_corrupted)
7395                 data_corruption(plaintext);
7396         else
7397                 tag_corruption(plaintext, reference->aad.len);
7398
7399         ut_params->op = process_crypto_request(ts_params->valid_devs[0],
7400                         ut_params->op);
7401         TEST_ASSERT_NOT_NULL(ut_params->op, "failed crypto process");
7402         TEST_ASSERT_EQUAL(ut_params->op->status,
7403                         RTE_CRYPTO_OP_STATUS_AUTH_FAILED,
7404                         "authentication not failed");
7405
7406         ut_params->obuf = ut_params->op->sym->m_src;
7407         TEST_ASSERT_NOT_NULL(ut_params->obuf, "failed to retrieve obuf");
7408
7409         return 0;
7410 }
7411
7412 static int
7413 test_authenticated_decryption_fail_when_corruption(
7414                 struct crypto_testsuite_params *ts_params,
7415                 struct crypto_unittest_params *ut_params,
7416                 const struct test_crypto_vector *reference,
7417                 unsigned int data_corrupted)
7418 {
7419         int retval;
7420
7421         uint8_t *ciphertext;
7422
7423         /* Create session */
7424         retval = create_auth_cipher_session(ut_params,
7425                         ts_params->valid_devs[0],
7426                         reference,
7427                         RTE_CRYPTO_AUTH_OP_VERIFY,
7428                         RTE_CRYPTO_CIPHER_OP_DECRYPT);
7429         if (retval < 0)
7430                 return retval;
7431
7432         ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
7433         TEST_ASSERT_NOT_NULL(ut_params->ibuf,
7434                         "Failed to allocate input buffer in mempool");
7435
7436         /* clear mbuf payload */
7437         memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
7438                         rte_pktmbuf_tailroom(ut_params->ibuf));
7439
7440         ciphertext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
7441                         reference->ciphertext.len);
7442         TEST_ASSERT_NOT_NULL(ciphertext, "no room to append ciphertext");
7443         memcpy(ciphertext, reference->ciphertext.data,
7444                         reference->ciphertext.len);
7445
7446         /* Create operation */
7447         retval = create_cipher_auth_verify_operation(ts_params,
7448                         ut_params,
7449                         reference);
7450
7451         if (retval < 0)
7452                 return retval;
7453
7454         if (data_corrupted)
7455                 data_corruption(ciphertext);
7456         else
7457                 tag_corruption(ciphertext, reference->ciphertext.len);
7458
7459         ut_params->op = process_crypto_request(ts_params->valid_devs[0],
7460                         ut_params->op);
7461
7462         TEST_ASSERT_NOT_NULL(ut_params->op, "failed crypto process");
7463         TEST_ASSERT_EQUAL(ut_params->op->status,
7464                         RTE_CRYPTO_OP_STATUS_AUTH_FAILED,
7465                         "authentication not failed");
7466
7467         ut_params->obuf = ut_params->op->sym->m_src;
7468         TEST_ASSERT_NOT_NULL(ut_params->obuf, "failed to retrieve obuf");
7469
7470         return 0;
7471 }
7472
7473 static int
7474 create_aead_operation_SGL(enum rte_crypto_aead_operation op,
7475                 const struct aead_test_data *tdata,
7476                 void *digest_mem, uint64_t digest_phys)
7477 {
7478         struct crypto_testsuite_params *ts_params = &testsuite_params;
7479         struct crypto_unittest_params *ut_params = &unittest_params;
7480
7481         const unsigned int auth_tag_len = tdata->auth_tag.len;
7482         const unsigned int iv_len = tdata->iv.len;
7483         const unsigned int aad_len = tdata->aad.len;
7484
7485         /* Generate Crypto op data structure */
7486         ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
7487                         RTE_CRYPTO_OP_TYPE_SYMMETRIC);
7488         TEST_ASSERT_NOT_NULL(ut_params->op,
7489                 "Failed to allocate symmetric crypto operation struct");
7490
7491         struct rte_crypto_sym_op *sym_op = ut_params->op->sym;
7492
7493         sym_op->aead.digest.data = digest_mem;
7494
7495         TEST_ASSERT_NOT_NULL(sym_op->aead.digest.data,
7496                         "no room to append digest");
7497
7498         sym_op->aead.digest.phys_addr = digest_phys;
7499
7500         if (op == RTE_CRYPTO_AEAD_OP_DECRYPT) {
7501                 rte_memcpy(sym_op->aead.digest.data, tdata->auth_tag.data,
7502                                 auth_tag_len);
7503                 TEST_HEXDUMP(stdout, "digest:",
7504                                 sym_op->aead.digest.data,
7505                                 auth_tag_len);
7506         }
7507
7508         uint8_t *iv_ptr = rte_crypto_op_ctod_offset(ut_params->op,
7509                         uint8_t *, IV_OFFSET);
7510
7511         rte_memcpy(iv_ptr, tdata->iv.data, iv_len);
7512
7513         sym_op->aead.aad.data = (uint8_t *)rte_pktmbuf_prepend(
7514                         ut_params->ibuf, aad_len);
7515         TEST_ASSERT_NOT_NULL(sym_op->aead.aad.data,
7516                         "no room to prepend aad");
7517         sym_op->aead.aad.phys_addr = rte_pktmbuf_mtophys(
7518                         ut_params->ibuf);
7519
7520         memset(sym_op->aead.aad.data, 0, aad_len);
7521         rte_memcpy(sym_op->aead.aad.data, tdata->aad.data, aad_len);
7522
7523         TEST_HEXDUMP(stdout, "iv:", iv_ptr, iv_len);
7524         TEST_HEXDUMP(stdout, "aad:",
7525                         sym_op->aead.aad.data, aad_len);
7526
7527         sym_op->aead.data.length = tdata->plaintext.len;
7528         sym_op->aead.data.offset = aad_len;
7529
7530         return 0;
7531 }
7532
7533 #define SGL_MAX_NO      16
7534
7535 static int
7536 test_authenticated_encryption_SGL(const struct aead_test_data *tdata,
7537                 const int oop, uint32_t fragsz, uint32_t fragsz_oop)
7538 {
7539         struct crypto_testsuite_params *ts_params = &testsuite_params;
7540         struct crypto_unittest_params *ut_params = &unittest_params;
7541         struct rte_mbuf *buf, *buf_oop = NULL, *buf_last_oop = NULL;
7542         int retval;
7543         int to_trn = 0;
7544         int to_trn_tbl[SGL_MAX_NO];
7545         int segs = 1;
7546         unsigned int trn_data = 0;
7547         uint8_t *plaintext, *ciphertext, *auth_tag;
7548
7549         if (fragsz > tdata->plaintext.len)
7550                 fragsz = tdata->plaintext.len;
7551
7552         uint16_t plaintext_len = fragsz;
7553         uint16_t frag_size_oop = fragsz_oop ? fragsz_oop : fragsz;
7554
7555         if (fragsz_oop > tdata->plaintext.len)
7556                 frag_size_oop = tdata->plaintext.len;
7557
7558         int ecx = 0;
7559         void *digest_mem = NULL;
7560
7561         uint32_t prepend_len = tdata->aad.len;
7562
7563         if (tdata->plaintext.len % fragsz != 0) {
7564                 if (tdata->plaintext.len / fragsz + 1 > SGL_MAX_NO)
7565                         return 1;
7566         }       else {
7567                 if (tdata->plaintext.len / fragsz > SGL_MAX_NO)
7568                         return 1;
7569         }
7570
7571         /*
7572          * For out-op-place we need to alloc another mbuf
7573          */
7574         if (oop) {
7575                 ut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
7576                 rte_pktmbuf_append(ut_params->obuf,
7577                                 frag_size_oop + prepend_len);
7578                 buf_oop = ut_params->obuf;
7579         }
7580
7581         /* Create AEAD session */
7582         retval = create_aead_session(ts_params->valid_devs[0],
7583                         tdata->algo,
7584                         RTE_CRYPTO_AEAD_OP_ENCRYPT,
7585                         tdata->key.data, tdata->key.len,
7586                         tdata->aad.len, tdata->auth_tag.len,
7587                         tdata->iv.len);
7588         if (retval < 0)
7589                 return retval;
7590
7591         ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
7592
7593         /* clear mbuf payload */
7594         memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
7595                         rte_pktmbuf_tailroom(ut_params->ibuf));
7596
7597         plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
7598                         plaintext_len);
7599
7600         memcpy(plaintext, tdata->plaintext.data, plaintext_len);
7601
7602         trn_data += plaintext_len;
7603
7604         buf = ut_params->ibuf;
7605
7606         /*
7607          * Loop until no more fragments
7608          */
7609
7610         while (trn_data < tdata->plaintext.len) {
7611                 ++segs;
7612                 to_trn = (tdata->plaintext.len - trn_data < fragsz) ?
7613                                 (tdata->plaintext.len - trn_data) : fragsz;
7614
7615                 to_trn_tbl[ecx++] = to_trn;
7616
7617                 buf->next = rte_pktmbuf_alloc(ts_params->mbuf_pool);
7618                 buf = buf->next;
7619
7620                 memset(rte_pktmbuf_mtod(buf, uint8_t *), 0,
7621                                 rte_pktmbuf_tailroom(buf));
7622
7623                 /* OOP */
7624                 if (oop && !fragsz_oop) {
7625                         buf_last_oop = buf_oop->next =
7626                                         rte_pktmbuf_alloc(ts_params->mbuf_pool);
7627                         buf_oop = buf_oop->next;
7628                         memset(rte_pktmbuf_mtod(buf_oop, uint8_t *),
7629                                         0, rte_pktmbuf_tailroom(buf_oop));
7630                         rte_pktmbuf_append(buf_oop, to_trn);
7631                 }
7632
7633                 plaintext = (uint8_t *)rte_pktmbuf_append(buf,
7634                                 to_trn);
7635
7636                 memcpy(plaintext, tdata->plaintext.data + trn_data,
7637                                 to_trn);
7638                 trn_data += to_trn;
7639                 if (trn_data  == tdata->plaintext.len) {
7640                         if (oop) {
7641                                 if (!fragsz_oop)
7642                                         digest_mem = rte_pktmbuf_append(buf_oop,
7643                                                 tdata->auth_tag.len);
7644                         } else
7645                                 digest_mem = (uint8_t *)rte_pktmbuf_append(buf,
7646                                         tdata->auth_tag.len);
7647                 }
7648         }
7649
7650         uint64_t digest_phys = 0;
7651
7652         ut_params->ibuf->nb_segs = segs;
7653
7654         segs = 1;
7655         if (fragsz_oop && oop) {
7656                 to_trn = 0;
7657                 ecx = 0;
7658
7659                 if (frag_size_oop == tdata->plaintext.len) {
7660                         digest_mem = rte_pktmbuf_append(ut_params->obuf,
7661                                 tdata->auth_tag.len);
7662
7663                         digest_phys = rte_pktmbuf_mtophys_offset(
7664                                         ut_params->obuf,
7665                                         tdata->plaintext.len + prepend_len);
7666                 }
7667
7668                 trn_data = frag_size_oop;
7669                 while (trn_data < tdata->plaintext.len) {
7670                         ++segs;
7671                         to_trn =
7672                                 (tdata->plaintext.len - trn_data <
7673                                                 frag_size_oop) ?
7674                                 (tdata->plaintext.len - trn_data) :
7675                                                 frag_size_oop;
7676
7677                         to_trn_tbl[ecx++] = to_trn;
7678
7679                         buf_last_oop = buf_oop->next =
7680                                         rte_pktmbuf_alloc(ts_params->mbuf_pool);
7681                         buf_oop = buf_oop->next;
7682                         memset(rte_pktmbuf_mtod(buf_oop, uint8_t *),
7683                                         0, rte_pktmbuf_tailroom(buf_oop));
7684                         rte_pktmbuf_append(buf_oop, to_trn);
7685
7686                         trn_data += to_trn;
7687
7688                         if (trn_data  == tdata->plaintext.len) {
7689                                 digest_mem = rte_pktmbuf_append(buf_oop,
7690                                         tdata->auth_tag.len);
7691                         }
7692                 }
7693
7694                 ut_params->obuf->nb_segs = segs;
7695         }
7696
7697         /*
7698          * Place digest at the end of the last buffer
7699          */
7700         if (!digest_phys)
7701                 digest_phys = rte_pktmbuf_mtophys(buf) + to_trn;
7702         if (oop && buf_last_oop)
7703                 digest_phys = rte_pktmbuf_mtophys(buf_last_oop) + to_trn;
7704
7705         if (!digest_mem && !oop) {
7706                 digest_mem = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
7707                                 + tdata->auth_tag.len);
7708                 digest_phys = rte_pktmbuf_mtophys_offset(ut_params->ibuf,
7709                                 tdata->plaintext.len);
7710         }
7711
7712         /* Create AEAD operation */
7713         retval = create_aead_operation_SGL(RTE_CRYPTO_AEAD_OP_ENCRYPT,
7714                         tdata, digest_mem, digest_phys);
7715
7716         if (retval < 0)
7717                 return retval;
7718
7719         rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
7720
7721         ut_params->op->sym->m_src = ut_params->ibuf;
7722         if (oop)
7723                 ut_params->op->sym->m_dst = ut_params->obuf;
7724
7725         /* Process crypto operation */
7726         TEST_ASSERT_NOT_NULL(process_crypto_request(ts_params->valid_devs[0],
7727                         ut_params->op), "failed to process sym crypto op");
7728
7729         TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
7730                         "crypto op processing failed");
7731
7732
7733         ciphertext = rte_pktmbuf_mtod_offset(ut_params->op->sym->m_src,
7734                         uint8_t *, prepend_len);
7735         if (oop) {
7736                 ciphertext = rte_pktmbuf_mtod_offset(ut_params->op->sym->m_dst,
7737                                 uint8_t *, prepend_len);
7738         }
7739
7740         if (fragsz_oop)
7741                 fragsz = fragsz_oop;
7742
7743         TEST_ASSERT_BUFFERS_ARE_EQUAL(
7744                         ciphertext,
7745                         tdata->ciphertext.data,
7746                         fragsz,
7747                         "Ciphertext data not as expected");
7748
7749         buf = ut_params->op->sym->m_src->next;
7750         if (oop)
7751                 buf = ut_params->op->sym->m_dst->next;
7752
7753         unsigned int off = fragsz;
7754
7755         ecx = 0;
7756         while (buf) {
7757                 ciphertext = rte_pktmbuf_mtod(buf,
7758                                 uint8_t *);
7759
7760                 TEST_ASSERT_BUFFERS_ARE_EQUAL(
7761                                 ciphertext,
7762                                 tdata->ciphertext.data + off,
7763                                 to_trn_tbl[ecx],
7764                                 "Ciphertext data not as expected");
7765
7766                 off += to_trn_tbl[ecx++];
7767                 buf = buf->next;
7768         }
7769
7770         auth_tag = digest_mem;
7771         TEST_ASSERT_BUFFERS_ARE_EQUAL(
7772                         auth_tag,
7773                         tdata->auth_tag.data,
7774                         tdata->auth_tag.len,
7775                         "Generated auth tag not as expected");
7776
7777         return 0;
7778 }
7779
7780 #define IN_PLACE        0
7781 #define OUT_OF_PLACE    1
7782
7783 static int
7784 test_AES_GCM_auth_encrypt_SGL_out_of_place_400B_400B(void)
7785 {
7786         return test_authenticated_encryption_SGL(
7787                         &gcm_test_case_SGL_1, OUT_OF_PLACE, 400, 400);
7788 }
7789
7790 static int
7791 test_AES_GCM_auth_encrypt_SGL_out_of_place_1500B_2000B(void)
7792 {
7793         return test_authenticated_encryption_SGL(
7794                         &gcm_test_case_SGL_1, OUT_OF_PLACE, 1500, 2000);
7795 }
7796
7797 static int
7798 test_AES_GCM_auth_encrypt_SGL_out_of_place_400B_1seg(void)
7799 {
7800         return test_authenticated_encryption_SGL(
7801                         &gcm_test_case_8, OUT_OF_PLACE, 400,
7802                         gcm_test_case_8.plaintext.len);
7803 }
7804
7805 static int
7806 test_AES_GCM_auth_encrypt_SGL_in_place_1500B(void)
7807 {
7808
7809         return test_authenticated_encryption_SGL(
7810                         &gcm_test_case_SGL_1, IN_PLACE, 1500, 0);
7811 }
7812
7813 static int
7814 test_authentication_verify_fail_when_data_corrupted(
7815                 struct crypto_testsuite_params *ts_params,
7816                 struct crypto_unittest_params *ut_params,
7817                 const struct test_crypto_vector *reference)
7818 {
7819         return test_authentication_verify_fail_when_data_corruption(
7820                         ts_params, ut_params, reference, 1);
7821 }
7822
7823 static int
7824 test_authentication_verify_fail_when_tag_corrupted(
7825                 struct crypto_testsuite_params *ts_params,
7826                 struct crypto_unittest_params *ut_params,
7827                 const struct test_crypto_vector *reference)
7828 {
7829         return test_authentication_verify_fail_when_data_corruption(
7830                         ts_params, ut_params, reference, 0);
7831 }
7832
7833 static int
7834 test_authentication_verify_GMAC_fail_when_data_corrupted(
7835                 struct crypto_testsuite_params *ts_params,
7836                 struct crypto_unittest_params *ut_params,
7837                 const struct test_crypto_vector *reference)
7838 {
7839         return test_authentication_verify_GMAC_fail_when_corruption(
7840                         ts_params, ut_params, reference, 1);
7841 }
7842
7843 static int
7844 test_authentication_verify_GMAC_fail_when_tag_corrupted(
7845                 struct crypto_testsuite_params *ts_params,
7846                 struct crypto_unittest_params *ut_params,
7847                 const struct test_crypto_vector *reference)
7848 {
7849         return test_authentication_verify_GMAC_fail_when_corruption(
7850                         ts_params, ut_params, reference, 0);
7851 }
7852
7853 static int
7854 test_authenticated_decryption_fail_when_data_corrupted(
7855                 struct crypto_testsuite_params *ts_params,
7856                 struct crypto_unittest_params *ut_params,
7857                 const struct test_crypto_vector *reference)
7858 {
7859         return test_authenticated_decryption_fail_when_corruption(
7860                         ts_params, ut_params, reference, 1);
7861 }
7862
7863 static int
7864 test_authenticated_decryption_fail_when_tag_corrupted(
7865                 struct crypto_testsuite_params *ts_params,
7866                 struct crypto_unittest_params *ut_params,
7867                 const struct test_crypto_vector *reference)
7868 {
7869         return test_authenticated_decryption_fail_when_corruption(
7870                         ts_params, ut_params, reference, 0);
7871 }
7872
7873 static int
7874 authentication_verify_HMAC_SHA1_fail_data_corrupt(void)
7875 {
7876         return test_authentication_verify_fail_when_data_corrupted(
7877                         &testsuite_params, &unittest_params,
7878                         &hmac_sha1_test_crypto_vector);
7879 }
7880
7881 static int
7882 authentication_verify_HMAC_SHA1_fail_tag_corrupt(void)
7883 {
7884         return test_authentication_verify_fail_when_tag_corrupted(
7885                         &testsuite_params, &unittest_params,
7886                         &hmac_sha1_test_crypto_vector);
7887 }
7888
7889 static int
7890 authentication_verify_AES128_GMAC_fail_data_corrupt(void)
7891 {
7892         return test_authentication_verify_GMAC_fail_when_data_corrupted(
7893                         &testsuite_params, &unittest_params,
7894                         &aes128_gmac_test_vector);
7895 }
7896
7897 static int
7898 authentication_verify_AES128_GMAC_fail_tag_corrupt(void)
7899 {
7900         return test_authentication_verify_GMAC_fail_when_tag_corrupted(
7901                         &testsuite_params, &unittest_params,
7902                         &aes128_gmac_test_vector);
7903 }
7904
7905 static int
7906 auth_decryption_AES128CBC_HMAC_SHA1_fail_data_corrupt(void)
7907 {
7908         return test_authenticated_decryption_fail_when_data_corrupted(
7909                         &testsuite_params,
7910                         &unittest_params,
7911                         &aes128cbc_hmac_sha1_test_vector);
7912 }
7913
7914 static int
7915 auth_decryption_AES128CBC_HMAC_SHA1_fail_tag_corrupt(void)
7916 {
7917         return test_authenticated_decryption_fail_when_tag_corrupted(
7918                         &testsuite_params,
7919                         &unittest_params,
7920                         &aes128cbc_hmac_sha1_test_vector);
7921 }
7922
7923 #ifdef RTE_LIBRTE_PMD_CRYPTO_SCHEDULER
7924
7925 /* global AESNI slave IDs for the scheduler test */
7926 uint8_t aesni_ids[2];
7927
7928 static int
7929 test_scheduler_attach_slave_op(void)
7930 {
7931         struct crypto_testsuite_params *ts_params = &testsuite_params;
7932         uint8_t sched_id = ts_params->valid_devs[0];
7933         uint32_t nb_devs, i, nb_devs_attached = 0;
7934         int ret;
7935         char vdev_name[32];
7936
7937         /* create 2 AESNI_MB if necessary */
7938         nb_devs = rte_cryptodev_device_count_by_driver(
7939                         rte_cryptodev_driver_id_get(
7940                         RTE_STR(CRYPTODEV_NAME_AESNI_MB_PMD)));
7941         if (nb_devs < 2) {
7942                 for (i = nb_devs; i < 2; i++) {
7943                         snprintf(vdev_name, sizeof(vdev_name), "%s_%u",
7944                                         RTE_STR(CRYPTODEV_NAME_AESNI_MB_PMD),
7945                                         i);
7946                         ret = rte_vdev_init(vdev_name, NULL);
7947
7948                         TEST_ASSERT(ret == 0,
7949                                 "Failed to create instance %u of"
7950                                 " pmd : %s",
7951                                 i, RTE_STR(CRYPTODEV_NAME_AESNI_MB_PMD));
7952                 }
7953         }
7954
7955         /* attach 2 AESNI_MB cdevs */
7956         for (i = 0; i < rte_cryptodev_count() && nb_devs_attached < 2;
7957                         i++) {
7958                 struct rte_cryptodev_info info;
7959
7960                 rte_cryptodev_info_get(i, &info);
7961                 if (info.driver_id != rte_cryptodev_driver_id_get(
7962                                 RTE_STR(CRYPTODEV_NAME_AESNI_MB_PMD)))
7963                         continue;
7964
7965                 /*
7966                  * Create the session mempool again, since now there are new devices
7967                  * to use the mempool.
7968                  */
7969                 if (ts_params->session_mpool) {
7970                         rte_mempool_free(ts_params->session_mpool);
7971                         ts_params->session_mpool = NULL;
7972                 }
7973                 unsigned int session_size = rte_cryptodev_get_private_session_size(i);
7974
7975                 /*
7976                  * Create mempool with maximum number of sessions * 2,
7977                  * to include the session headers
7978                  */
7979                 if (ts_params->session_mpool == NULL) {
7980                         ts_params->session_mpool = rte_mempool_create(
7981                                         "test_sess_mp",
7982                                         info.sym.max_nb_sessions * 2,
7983                                         session_size,
7984                                         0, 0, NULL, NULL, NULL,
7985                                         NULL, SOCKET_ID_ANY,
7986                                         0);
7987
7988                         TEST_ASSERT_NOT_NULL(ts_params->session_mpool,
7989                                         "session mempool allocation failed");
7990                 }
7991
7992                 ret = rte_cryptodev_scheduler_slave_attach(sched_id,
7993                                 (uint8_t)i);
7994
7995                 TEST_ASSERT(ret == 0,
7996                         "Failed to attach device %u of pmd : %s", i,
7997                         RTE_STR(CRYPTODEV_NAME_AESNI_MB_PMD));
7998
7999                 aesni_ids[nb_devs_attached] = (uint8_t)i;
8000
8001                 nb_devs_attached++;
8002         }
8003
8004         return 0;
8005 }
8006
8007 static int
8008 test_scheduler_detach_slave_op(void)
8009 {
8010         struct crypto_testsuite_params *ts_params = &testsuite_params;
8011         uint8_t sched_id = ts_params->valid_devs[0];
8012         uint32_t i;
8013         int ret;
8014
8015         for (i = 0; i < 2; i++) {
8016                 ret = rte_cryptodev_scheduler_slave_detach(sched_id,
8017                                 aesni_ids[i]);
8018                 TEST_ASSERT(ret == 0,
8019                         "Failed to detach device %u", aesni_ids[i]);
8020         }
8021
8022         return 0;
8023 }
8024
8025 static int
8026 test_scheduler_mode_op(void)
8027 {
8028         struct crypto_testsuite_params *ts_params = &testsuite_params;
8029         uint8_t sched_id = ts_params->valid_devs[0];
8030         struct rte_cryptodev_scheduler_ops op = {0};
8031         struct rte_cryptodev_scheduler dummy_scheduler = {
8032                 .description = "dummy scheduler to test mode",
8033                 .name = "dummy scheduler",
8034                 .mode = CDEV_SCHED_MODE_USERDEFINED,
8035                 .ops = &op
8036         };
8037         int ret;
8038
8039         /* set user defined mode */
8040         ret = rte_cryptodev_scheduler_load_user_scheduler(sched_id,
8041                         &dummy_scheduler);
8042         TEST_ASSERT(ret == 0,
8043                 "Failed to set cdev %u to user defined mode", sched_id);
8044
8045         /* set round robin mode */
8046         ret = rte_cryptodev_scheduler_mode_set(sched_id,
8047                         CDEV_SCHED_MODE_ROUNDROBIN);
8048         TEST_ASSERT(ret == 0,
8049                 "Failed to set cdev %u to round-robin mode", sched_id);
8050         TEST_ASSERT(rte_cryptodev_scheduler_mode_get(sched_id) ==
8051                         CDEV_SCHED_MODE_ROUNDROBIN, "Scheduling Mode "
8052                                         "not match");
8053
8054         return 0;
8055 }
8056
8057 static struct unit_test_suite cryptodev_scheduler_testsuite  = {
8058         .suite_name = "Crypto Device Scheduler Unit Test Suite",
8059         .setup = testsuite_setup,
8060         .teardown = testsuite_teardown,
8061         .unit_test_cases = {
8062                 TEST_CASE_ST(NULL, NULL, test_scheduler_attach_slave_op),
8063                 TEST_CASE_ST(NULL, NULL, test_scheduler_mode_op),
8064                 TEST_CASE_ST(ut_setup, ut_teardown,
8065                                 test_AES_chain_scheduler_all),
8066                 TEST_CASE_ST(ut_setup, ut_teardown,
8067                                 test_AES_cipheronly_scheduler_all),
8068                 TEST_CASE_ST(ut_setup, ut_teardown,
8069                                 test_authonly_scheduler_all),
8070                 TEST_CASE_ST(NULL, NULL, test_scheduler_detach_slave_op),
8071                 TEST_CASES_END() /**< NULL terminate unit test array */
8072         }
8073 };
8074
8075 #endif /* RTE_LIBRTE_PMD_CRYPTO_SCHEDULER */
8076
8077 static struct unit_test_suite cryptodev_qat_testsuite  = {
8078         .suite_name = "Crypto QAT Unit Test Suite",
8079         .setup = testsuite_setup,
8080         .teardown = testsuite_teardown,
8081         .unit_test_cases = {
8082                 TEST_CASE_ST(ut_setup, ut_teardown,
8083                                 test_device_configure_invalid_dev_id),
8084                 TEST_CASE_ST(ut_setup, ut_teardown,
8085                                 test_device_configure_invalid_queue_pair_ids),
8086                 TEST_CASE_ST(ut_setup, ut_teardown,
8087                                 test_queue_pair_descriptor_setup),
8088                 TEST_CASE_ST(ut_setup, ut_teardown,
8089                                 test_multi_session),
8090
8091                 TEST_CASE_ST(ut_setup, ut_teardown, test_AES_chain_qat_all),
8092                 TEST_CASE_ST(ut_setup, ut_teardown,
8093                                                 test_AES_cipheronly_qat_all),
8094                 TEST_CASE_ST(ut_setup, ut_teardown, test_3DES_chain_qat_all),
8095                 TEST_CASE_ST(ut_setup, ut_teardown,
8096                                                 test_3DES_cipheronly_qat_all),
8097                 TEST_CASE_ST(ut_setup, ut_teardown,
8098                                                 test_DES_cipheronly_qat_all),
8099                 TEST_CASE_ST(ut_setup, ut_teardown,
8100                                                 test_AES_docsis_qat_all),
8101                 TEST_CASE_ST(ut_setup, ut_teardown,
8102                                                 test_DES_docsis_qat_all),
8103                 TEST_CASE_ST(ut_setup, ut_teardown, test_authonly_qat_all),
8104                 TEST_CASE_ST(ut_setup, ut_teardown, test_stats),
8105
8106                 /** AES GCM Authenticated Encryption */
8107                 TEST_CASE_ST(ut_setup, ut_teardown,
8108                         test_AES_GCM_auth_encrypt_SGL_in_place_1500B),
8109                 TEST_CASE_ST(ut_setup, ut_teardown,
8110                         test_AES_GCM_auth_encrypt_SGL_out_of_place_400B_400B),
8111                 TEST_CASE_ST(ut_setup, ut_teardown,
8112                         test_AES_GCM_auth_encrypt_SGL_out_of_place_1500B_2000B),
8113                 TEST_CASE_ST(ut_setup, ut_teardown,
8114                         test_AES_GCM_authenticated_encryption_test_case_1),
8115                 TEST_CASE_ST(ut_setup, ut_teardown,
8116                         test_AES_GCM_authenticated_encryption_test_case_2),
8117                 TEST_CASE_ST(ut_setup, ut_teardown,
8118                         test_AES_GCM_authenticated_encryption_test_case_3),
8119                 TEST_CASE_ST(ut_setup, ut_teardown,
8120                         test_AES_GCM_authenticated_encryption_test_case_4),
8121                 TEST_CASE_ST(ut_setup, ut_teardown,
8122                         test_AES_GCM_authenticated_encryption_test_case_5),
8123                 TEST_CASE_ST(ut_setup, ut_teardown,
8124                         test_AES_GCM_authenticated_encryption_test_case_6),
8125                 TEST_CASE_ST(ut_setup, ut_teardown,
8126                         test_AES_GCM_authenticated_encryption_test_case_7),
8127
8128                 /** AES GCM Authenticated Decryption */
8129                 TEST_CASE_ST(ut_setup, ut_teardown,
8130                         test_AES_GCM_authenticated_decryption_test_case_1),
8131                 TEST_CASE_ST(ut_setup, ut_teardown,
8132                         test_AES_GCM_authenticated_decryption_test_case_2),
8133                 TEST_CASE_ST(ut_setup, ut_teardown,
8134                         test_AES_GCM_authenticated_decryption_test_case_3),
8135                 TEST_CASE_ST(ut_setup, ut_teardown,
8136                         test_AES_GCM_authenticated_decryption_test_case_4),
8137                 TEST_CASE_ST(ut_setup, ut_teardown,
8138                         test_AES_GCM_authenticated_decryption_test_case_5),
8139                 TEST_CASE_ST(ut_setup, ut_teardown,
8140                         test_AES_GCM_authenticated_decryption_test_case_6),
8141                 TEST_CASE_ST(ut_setup, ut_teardown,
8142                         test_AES_GCM_authenticated_decryption_test_case_7),
8143
8144                 /** AES GCM Authenticated Encryption 192 bits key */
8145                 TEST_CASE_ST(ut_setup, ut_teardown,
8146                         test_AES_GCM_auth_encryption_test_case_192_1),
8147                 TEST_CASE_ST(ut_setup, ut_teardown,
8148                         test_AES_GCM_auth_encryption_test_case_192_2),
8149                 TEST_CASE_ST(ut_setup, ut_teardown,
8150                         test_AES_GCM_auth_encryption_test_case_192_3),
8151                 TEST_CASE_ST(ut_setup, ut_teardown,
8152                         test_AES_GCM_auth_encryption_test_case_192_4),
8153                 TEST_CASE_ST(ut_setup, ut_teardown,
8154                         test_AES_GCM_auth_encryption_test_case_192_5),
8155                 TEST_CASE_ST(ut_setup, ut_teardown,
8156                         test_AES_GCM_auth_encryption_test_case_192_6),
8157                 TEST_CASE_ST(ut_setup, ut_teardown,
8158                         test_AES_GCM_auth_encryption_test_case_192_7),
8159
8160                 /** AES GCM Authenticated Decryption 192 bits key */
8161                 TEST_CASE_ST(ut_setup, ut_teardown,
8162                         test_AES_GCM_auth_decryption_test_case_192_1),
8163                 TEST_CASE_ST(ut_setup, ut_teardown,
8164                         test_AES_GCM_auth_decryption_test_case_192_2),
8165                 TEST_CASE_ST(ut_setup, ut_teardown,
8166                         test_AES_GCM_auth_decryption_test_case_192_3),
8167                 TEST_CASE_ST(ut_setup, ut_teardown,
8168                         test_AES_GCM_auth_decryption_test_case_192_4),
8169                 TEST_CASE_ST(ut_setup, ut_teardown,
8170                         test_AES_GCM_auth_decryption_test_case_192_5),
8171                 TEST_CASE_ST(ut_setup, ut_teardown,
8172                         test_AES_GCM_auth_decryption_test_case_192_6),
8173                 TEST_CASE_ST(ut_setup, ut_teardown,
8174                         test_AES_GCM_auth_decryption_test_case_192_7),
8175
8176                 /** AES GCM Authenticated Encryption 256 bits key */
8177                 TEST_CASE_ST(ut_setup, ut_teardown,
8178                         test_AES_GCM_auth_encryption_test_case_256_1),
8179                 TEST_CASE_ST(ut_setup, ut_teardown,
8180                         test_AES_GCM_auth_encryption_test_case_256_2),
8181                 TEST_CASE_ST(ut_setup, ut_teardown,
8182                         test_AES_GCM_auth_encryption_test_case_256_3),
8183                 TEST_CASE_ST(ut_setup, ut_teardown,
8184                         test_AES_GCM_auth_encryption_test_case_256_4),
8185                 TEST_CASE_ST(ut_setup, ut_teardown,
8186                         test_AES_GCM_auth_encryption_test_case_256_5),
8187                 TEST_CASE_ST(ut_setup, ut_teardown,
8188                         test_AES_GCM_auth_encryption_test_case_256_6),
8189                 TEST_CASE_ST(ut_setup, ut_teardown,
8190                         test_AES_GCM_auth_encryption_test_case_256_7),
8191
8192                 /** AES GMAC Authentication */
8193                 TEST_CASE_ST(ut_setup, ut_teardown,
8194                         test_AES_GMAC_authentication_test_case_1),
8195                 TEST_CASE_ST(ut_setup, ut_teardown,
8196                         test_AES_GMAC_authentication_verify_test_case_1),
8197                 TEST_CASE_ST(ut_setup, ut_teardown,
8198                         test_AES_GMAC_authentication_test_case_2),
8199                 TEST_CASE_ST(ut_setup, ut_teardown,
8200                         test_AES_GMAC_authentication_verify_test_case_2),
8201                 TEST_CASE_ST(ut_setup, ut_teardown,
8202                         test_AES_GMAC_authentication_test_case_3),
8203                 TEST_CASE_ST(ut_setup, ut_teardown,
8204                         test_AES_GMAC_authentication_verify_test_case_3),
8205
8206                 /** SNOW 3G encrypt only (UEA2) */
8207                 TEST_CASE_ST(ut_setup, ut_teardown,
8208                         test_snow3g_encryption_test_case_1),
8209                 TEST_CASE_ST(ut_setup, ut_teardown,
8210                         test_snow3g_encryption_test_case_2),
8211                 TEST_CASE_ST(ut_setup, ut_teardown,
8212                         test_snow3g_encryption_test_case_3),
8213                 TEST_CASE_ST(ut_setup, ut_teardown,
8214                         test_snow3g_encryption_test_case_4),
8215                 TEST_CASE_ST(ut_setup, ut_teardown,
8216                         test_snow3g_encryption_test_case_5),
8217
8218                 TEST_CASE_ST(ut_setup, ut_teardown,
8219                         test_snow3g_encryption_test_case_1_oop),
8220                 TEST_CASE_ST(ut_setup, ut_teardown,
8221                         test_snow3g_decryption_test_case_1_oop),
8222
8223                 /** SNOW 3G decrypt only (UEA2) */
8224                 TEST_CASE_ST(ut_setup, ut_teardown,
8225                         test_snow3g_decryption_test_case_1),
8226                 TEST_CASE_ST(ut_setup, ut_teardown,
8227                         test_snow3g_decryption_test_case_2),
8228                 TEST_CASE_ST(ut_setup, ut_teardown,
8229                         test_snow3g_decryption_test_case_3),
8230                 TEST_CASE_ST(ut_setup, ut_teardown,
8231                         test_snow3g_decryption_test_case_4),
8232                 TEST_CASE_ST(ut_setup, ut_teardown,
8233                         test_snow3g_decryption_test_case_5),
8234                 TEST_CASE_ST(ut_setup, ut_teardown,
8235                         test_snow3g_hash_generate_test_case_1),
8236                 TEST_CASE_ST(ut_setup, ut_teardown,
8237                         test_snow3g_hash_generate_test_case_2),
8238                 TEST_CASE_ST(ut_setup, ut_teardown,
8239                         test_snow3g_hash_generate_test_case_3),
8240                 TEST_CASE_ST(ut_setup, ut_teardown,
8241                         test_snow3g_hash_verify_test_case_1),
8242                 TEST_CASE_ST(ut_setup, ut_teardown,
8243                         test_snow3g_hash_verify_test_case_2),
8244                 TEST_CASE_ST(ut_setup, ut_teardown,
8245                         test_snow3g_hash_verify_test_case_3),
8246                 TEST_CASE_ST(ut_setup, ut_teardown,
8247                         test_snow3g_cipher_auth_test_case_1),
8248                 TEST_CASE_ST(ut_setup, ut_teardown,
8249                         test_snow3g_auth_cipher_test_case_1),
8250
8251                 /** ZUC encrypt only (EEA3) */
8252                 TEST_CASE_ST(ut_setup, ut_teardown,
8253                         test_zuc_encryption_test_case_1),
8254                 TEST_CASE_ST(ut_setup, ut_teardown,
8255                         test_zuc_encryption_test_case_2),
8256                 TEST_CASE_ST(ut_setup, ut_teardown,
8257                         test_zuc_encryption_test_case_3),
8258                 TEST_CASE_ST(ut_setup, ut_teardown,
8259                         test_zuc_encryption_test_case_4),
8260                 TEST_CASE_ST(ut_setup, ut_teardown,
8261                         test_zuc_encryption_test_case_5),
8262
8263                 /** ZUC authenticate (EIA3) */
8264                 TEST_CASE_ST(ut_setup, ut_teardown,
8265                         test_zuc_hash_generate_test_case_6),
8266                 TEST_CASE_ST(ut_setup, ut_teardown,
8267                         test_zuc_hash_generate_test_case_7),
8268                 TEST_CASE_ST(ut_setup, ut_teardown,
8269                         test_zuc_hash_generate_test_case_8),
8270
8271                 /** ZUC alg-chain (EEA3/EIA3) */
8272                 TEST_CASE_ST(ut_setup, ut_teardown,
8273                         test_zuc_cipher_auth_test_case_1),
8274                 TEST_CASE_ST(ut_setup, ut_teardown,
8275                         test_zuc_cipher_auth_test_case_2),
8276
8277                 /** HMAC_MD5 Authentication */
8278                 TEST_CASE_ST(ut_setup, ut_teardown,
8279                         test_MD5_HMAC_generate_case_1),
8280                 TEST_CASE_ST(ut_setup, ut_teardown,
8281                         test_MD5_HMAC_verify_case_1),
8282                 TEST_CASE_ST(ut_setup, ut_teardown,
8283                         test_MD5_HMAC_generate_case_2),
8284                 TEST_CASE_ST(ut_setup, ut_teardown,
8285                         test_MD5_HMAC_verify_case_2),
8286
8287                 /** NULL tests */
8288                 TEST_CASE_ST(ut_setup, ut_teardown,
8289                         test_null_auth_only_operation),
8290                 TEST_CASE_ST(ut_setup, ut_teardown,
8291                         test_null_cipher_only_operation),
8292                 TEST_CASE_ST(ut_setup, ut_teardown,
8293                         test_null_cipher_auth_operation),
8294                 TEST_CASE_ST(ut_setup, ut_teardown,
8295                         test_null_auth_cipher_operation),
8296
8297                 /** KASUMI tests */
8298                 TEST_CASE_ST(ut_setup, ut_teardown,
8299                         test_kasumi_hash_generate_test_case_1),
8300                 TEST_CASE_ST(ut_setup, ut_teardown,
8301                         test_kasumi_hash_generate_test_case_2),
8302                 TEST_CASE_ST(ut_setup, ut_teardown,
8303                         test_kasumi_hash_generate_test_case_3),
8304                 TEST_CASE_ST(ut_setup, ut_teardown,
8305                         test_kasumi_hash_generate_test_case_4),
8306                 TEST_CASE_ST(ut_setup, ut_teardown,
8307                         test_kasumi_hash_generate_test_case_5),
8308                 TEST_CASE_ST(ut_setup, ut_teardown,
8309                         test_kasumi_hash_generate_test_case_6),
8310
8311                 TEST_CASE_ST(ut_setup, ut_teardown,
8312                         test_kasumi_hash_verify_test_case_1),
8313                 TEST_CASE_ST(ut_setup, ut_teardown,
8314                         test_kasumi_hash_verify_test_case_2),
8315                 TEST_CASE_ST(ut_setup, ut_teardown,
8316                         test_kasumi_hash_verify_test_case_3),
8317                 TEST_CASE_ST(ut_setup, ut_teardown,
8318                         test_kasumi_hash_verify_test_case_4),
8319                 TEST_CASE_ST(ut_setup, ut_teardown,
8320                         test_kasumi_hash_verify_test_case_5),
8321
8322                 TEST_CASE_ST(ut_setup, ut_teardown,
8323                         test_kasumi_encryption_test_case_1),
8324                 TEST_CASE_ST(ut_setup, ut_teardown,
8325                         test_kasumi_encryption_test_case_3),
8326                 TEST_CASE_ST(ut_setup, ut_teardown,
8327                         test_kasumi_auth_cipher_test_case_1),
8328                 TEST_CASE_ST(ut_setup, ut_teardown,
8329                         test_kasumi_cipher_auth_test_case_1),
8330
8331                 /** Negative tests */
8332                 TEST_CASE_ST(ut_setup, ut_teardown,
8333                         authentication_verify_HMAC_SHA1_fail_data_corrupt),
8334                 TEST_CASE_ST(ut_setup, ut_teardown,
8335                         authentication_verify_HMAC_SHA1_fail_tag_corrupt),
8336                 TEST_CASE_ST(ut_setup, ut_teardown,
8337                         authentication_verify_AES128_GMAC_fail_data_corrupt),
8338                 TEST_CASE_ST(ut_setup, ut_teardown,
8339                         authentication_verify_AES128_GMAC_fail_tag_corrupt),
8340                 TEST_CASE_ST(ut_setup, ut_teardown,
8341                         auth_decryption_AES128CBC_HMAC_SHA1_fail_data_corrupt),
8342                 TEST_CASE_ST(ut_setup, ut_teardown,
8343                         auth_decryption_AES128CBC_HMAC_SHA1_fail_tag_corrupt),
8344
8345                 TEST_CASES_END() /**< NULL terminate unit test array */
8346         }
8347 };
8348
8349 static struct unit_test_suite cryptodev_aesni_mb_testsuite  = {
8350         .suite_name = "Crypto Device AESNI MB Unit Test Suite",
8351         .setup = testsuite_setup,
8352         .teardown = testsuite_teardown,
8353         .unit_test_cases = {
8354                 TEST_CASE_ST(ut_setup, ut_teardown, test_AES_chain_mb_all),
8355                 TEST_CASE_ST(ut_setup, ut_teardown, test_AES_cipheronly_mb_all),
8356                 TEST_CASE_ST(ut_setup, ut_teardown, test_AES_docsis_mb_all),
8357                 TEST_CASE_ST(ut_setup, ut_teardown, test_authonly_mb_all),
8358                 TEST_CASE_ST(ut_setup, ut_teardown,
8359                                                 test_DES_cipheronly_mb_all),
8360                 TEST_CASE_ST(ut_setup, ut_teardown,
8361                                                 test_DES_docsis_mb_all),
8362
8363                 TEST_CASES_END() /**< NULL terminate unit test array */
8364         }
8365 };
8366
8367 static struct unit_test_suite cryptodev_openssl_testsuite  = {
8368         .suite_name = "Crypto Device OPENSSL Unit Test Suite",
8369         .setup = testsuite_setup,
8370         .teardown = testsuite_teardown,
8371         .unit_test_cases = {
8372                 TEST_CASE_ST(ut_setup, ut_teardown, test_multi_session),
8373                 TEST_CASE_ST(ut_setup, ut_teardown,
8374                                 test_multi_session_random_usage),
8375                 TEST_CASE_ST(ut_setup, ut_teardown,
8376                                 test_AES_chain_openssl_all),
8377                 TEST_CASE_ST(ut_setup, ut_teardown,
8378                                 test_AES_cipheronly_openssl_all),
8379                 TEST_CASE_ST(ut_setup, ut_teardown,
8380                                 test_3DES_chain_openssl_all),
8381                 TEST_CASE_ST(ut_setup, ut_teardown,
8382                                 test_3DES_cipheronly_openssl_all),
8383                 TEST_CASE_ST(ut_setup, ut_teardown,
8384                                 test_DES_cipheronly_openssl_all),
8385                 TEST_CASE_ST(ut_setup, ut_teardown,
8386                                 test_DES_docsis_openssl_all),
8387                 TEST_CASE_ST(ut_setup, ut_teardown,
8388                                 test_authonly_openssl_all),
8389
8390                 /** AES GCM Authenticated Encryption */
8391                 TEST_CASE_ST(ut_setup, ut_teardown,
8392                         test_AES_GCM_authenticated_encryption_test_case_1),
8393                 TEST_CASE_ST(ut_setup, ut_teardown,
8394                         test_AES_GCM_authenticated_encryption_test_case_2),
8395                 TEST_CASE_ST(ut_setup, ut_teardown,
8396                         test_AES_GCM_authenticated_encryption_test_case_3),
8397                 TEST_CASE_ST(ut_setup, ut_teardown,
8398                         test_AES_GCM_authenticated_encryption_test_case_4),
8399                 TEST_CASE_ST(ut_setup, ut_teardown,
8400                         test_AES_GCM_authenticated_encryption_test_case_5),
8401                 TEST_CASE_ST(ut_setup, ut_teardown,
8402                         test_AES_GCM_authenticated_encryption_test_case_6),
8403                 TEST_CASE_ST(ut_setup, ut_teardown,
8404                         test_AES_GCM_authenticated_encryption_test_case_7),
8405
8406                 /** AES GCM Authenticated Decryption */
8407                 TEST_CASE_ST(ut_setup, ut_teardown,
8408                         test_AES_GCM_authenticated_decryption_test_case_1),
8409                 TEST_CASE_ST(ut_setup, ut_teardown,
8410                         test_AES_GCM_authenticated_decryption_test_case_2),
8411                 TEST_CASE_ST(ut_setup, ut_teardown,
8412                         test_AES_GCM_authenticated_decryption_test_case_3),
8413                 TEST_CASE_ST(ut_setup, ut_teardown,
8414                         test_AES_GCM_authenticated_decryption_test_case_4),
8415                 TEST_CASE_ST(ut_setup, ut_teardown,
8416                         test_AES_GCM_authenticated_decryption_test_case_5),
8417                 TEST_CASE_ST(ut_setup, ut_teardown,
8418                         test_AES_GCM_authenticated_decryption_test_case_6),
8419                 TEST_CASE_ST(ut_setup, ut_teardown,
8420                         test_AES_GCM_authenticated_decryption_test_case_7),
8421
8422
8423                 /** AES GCM Authenticated Encryption 192 bits key */
8424                 TEST_CASE_ST(ut_setup, ut_teardown,
8425                         test_AES_GCM_auth_encryption_test_case_192_1),
8426                 TEST_CASE_ST(ut_setup, ut_teardown,
8427                         test_AES_GCM_auth_encryption_test_case_192_2),
8428                 TEST_CASE_ST(ut_setup, ut_teardown,
8429                         test_AES_GCM_auth_encryption_test_case_192_3),
8430                 TEST_CASE_ST(ut_setup, ut_teardown,
8431                         test_AES_GCM_auth_encryption_test_case_192_4),
8432                 TEST_CASE_ST(ut_setup, ut_teardown,
8433                         test_AES_GCM_auth_encryption_test_case_192_5),
8434                 TEST_CASE_ST(ut_setup, ut_teardown,
8435                         test_AES_GCM_auth_encryption_test_case_192_6),
8436                 TEST_CASE_ST(ut_setup, ut_teardown,
8437                         test_AES_GCM_auth_encryption_test_case_192_7),
8438
8439                 /** AES GCM Authenticated Decryption 192 bits key */
8440                 TEST_CASE_ST(ut_setup, ut_teardown,
8441                         test_AES_GCM_auth_decryption_test_case_192_1),
8442                 TEST_CASE_ST(ut_setup, ut_teardown,
8443                         test_AES_GCM_auth_decryption_test_case_192_2),
8444                 TEST_CASE_ST(ut_setup, ut_teardown,
8445                         test_AES_GCM_auth_decryption_test_case_192_3),
8446                 TEST_CASE_ST(ut_setup, ut_teardown,
8447                         test_AES_GCM_auth_decryption_test_case_192_4),
8448                 TEST_CASE_ST(ut_setup, ut_teardown,
8449                         test_AES_GCM_auth_decryption_test_case_192_5),
8450                 TEST_CASE_ST(ut_setup, ut_teardown,
8451                         test_AES_GCM_auth_decryption_test_case_192_6),
8452                 TEST_CASE_ST(ut_setup, ut_teardown,
8453                         test_AES_GCM_auth_decryption_test_case_192_7),
8454
8455                 /** AES GCM Authenticated Encryption 256 bits key */
8456                 TEST_CASE_ST(ut_setup, ut_teardown,
8457                         test_AES_GCM_auth_encryption_test_case_256_1),
8458                 TEST_CASE_ST(ut_setup, ut_teardown,
8459                         test_AES_GCM_auth_encryption_test_case_256_2),
8460                 TEST_CASE_ST(ut_setup, ut_teardown,
8461                         test_AES_GCM_auth_encryption_test_case_256_3),
8462                 TEST_CASE_ST(ut_setup, ut_teardown,
8463                         test_AES_GCM_auth_encryption_test_case_256_4),
8464                 TEST_CASE_ST(ut_setup, ut_teardown,
8465                         test_AES_GCM_auth_encryption_test_case_256_5),
8466                 TEST_CASE_ST(ut_setup, ut_teardown,
8467                         test_AES_GCM_auth_encryption_test_case_256_6),
8468                 TEST_CASE_ST(ut_setup, ut_teardown,
8469                         test_AES_GCM_auth_encryption_test_case_256_7),
8470
8471                 /** AES GCM Authenticated Decryption 256 bits key */
8472                 TEST_CASE_ST(ut_setup, ut_teardown,
8473                         test_AES_GCM_auth_decryption_test_case_256_1),
8474                 TEST_CASE_ST(ut_setup, ut_teardown,
8475                         test_AES_GCM_auth_decryption_test_case_256_2),
8476                 TEST_CASE_ST(ut_setup, ut_teardown,
8477                         test_AES_GCM_auth_decryption_test_case_256_3),
8478                 TEST_CASE_ST(ut_setup, ut_teardown,
8479                         test_AES_GCM_auth_decryption_test_case_256_4),
8480                 TEST_CASE_ST(ut_setup, ut_teardown,
8481                         test_AES_GCM_auth_decryption_test_case_256_5),
8482                 TEST_CASE_ST(ut_setup, ut_teardown,
8483                         test_AES_GCM_auth_decryption_test_case_256_6),
8484                 TEST_CASE_ST(ut_setup, ut_teardown,
8485                         test_AES_GCM_auth_decryption_test_case_256_7),
8486
8487                 /** AES GMAC Authentication */
8488                 TEST_CASE_ST(ut_setup, ut_teardown,
8489                         test_AES_GMAC_authentication_test_case_1),
8490                 TEST_CASE_ST(ut_setup, ut_teardown,
8491                         test_AES_GMAC_authentication_verify_test_case_1),
8492                 TEST_CASE_ST(ut_setup, ut_teardown,
8493                         test_AES_GMAC_authentication_test_case_2),
8494                 TEST_CASE_ST(ut_setup, ut_teardown,
8495                         test_AES_GMAC_authentication_verify_test_case_2),
8496                 TEST_CASE_ST(ut_setup, ut_teardown,
8497                         test_AES_GMAC_authentication_test_case_3),
8498                 TEST_CASE_ST(ut_setup, ut_teardown,
8499                         test_AES_GMAC_authentication_verify_test_case_3),
8500                 TEST_CASE_ST(ut_setup, ut_teardown,
8501                         test_AES_GMAC_authentication_test_case_4),
8502                 TEST_CASE_ST(ut_setup, ut_teardown,
8503                         test_AES_GMAC_authentication_verify_test_case_4),
8504
8505                 /** Scatter-Gather */
8506                 TEST_CASE_ST(ut_setup, ut_teardown,
8507                         test_AES_GCM_auth_encrypt_SGL_out_of_place_400B_1seg),
8508
8509                 /** Negative tests */
8510                 TEST_CASE_ST(ut_setup, ut_teardown,
8511                         authentication_verify_HMAC_SHA1_fail_data_corrupt),
8512                 TEST_CASE_ST(ut_setup, ut_teardown,
8513                         authentication_verify_HMAC_SHA1_fail_tag_corrupt),
8514                 TEST_CASE_ST(ut_setup, ut_teardown,
8515                         authentication_verify_AES128_GMAC_fail_data_corrupt),
8516                 TEST_CASE_ST(ut_setup, ut_teardown,
8517                         authentication_verify_AES128_GMAC_fail_tag_corrupt),
8518                 TEST_CASE_ST(ut_setup, ut_teardown,
8519                         auth_decryption_AES128CBC_HMAC_SHA1_fail_data_corrupt),
8520                 TEST_CASE_ST(ut_setup, ut_teardown,
8521                         auth_decryption_AES128CBC_HMAC_SHA1_fail_tag_corrupt),
8522
8523                 TEST_CASES_END() /**< NULL terminate unit test array */
8524         }
8525 };
8526
8527 static struct unit_test_suite cryptodev_aesni_gcm_testsuite  = {
8528         .suite_name = "Crypto Device AESNI GCM Unit Test Suite",
8529         .setup = testsuite_setup,
8530         .teardown = testsuite_teardown,
8531         .unit_test_cases = {
8532                 /** AES GCM Authenticated Encryption */
8533                 TEST_CASE_ST(ut_setup, ut_teardown,
8534                         test_AES_GCM_authenticated_encryption_test_case_1),
8535                 TEST_CASE_ST(ut_setup, ut_teardown,
8536                         test_AES_GCM_authenticated_encryption_test_case_2),
8537                 TEST_CASE_ST(ut_setup, ut_teardown,
8538                         test_AES_GCM_authenticated_encryption_test_case_3),
8539                 TEST_CASE_ST(ut_setup, ut_teardown,
8540                         test_AES_GCM_authenticated_encryption_test_case_4),
8541                 TEST_CASE_ST(ut_setup, ut_teardown,
8542                         test_AES_GCM_authenticated_encryption_test_case_5),
8543                 TEST_CASE_ST(ut_setup, ut_teardown,
8544                         test_AES_GCM_authenticated_encryption_test_case_6),
8545                 TEST_CASE_ST(ut_setup, ut_teardown,
8546                         test_AES_GCM_authenticated_encryption_test_case_7),
8547
8548                 /** AES GCM Authenticated Decryption */
8549                 TEST_CASE_ST(ut_setup, ut_teardown,
8550                         test_AES_GCM_authenticated_decryption_test_case_1),
8551                 TEST_CASE_ST(ut_setup, ut_teardown,
8552                         test_AES_GCM_authenticated_decryption_test_case_2),
8553                 TEST_CASE_ST(ut_setup, ut_teardown,
8554                         test_AES_GCM_authenticated_decryption_test_case_3),
8555                 TEST_CASE_ST(ut_setup, ut_teardown,
8556                         test_AES_GCM_authenticated_decryption_test_case_4),
8557                 TEST_CASE_ST(ut_setup, ut_teardown,
8558                         test_AES_GCM_authenticated_decryption_test_case_5),
8559                 TEST_CASE_ST(ut_setup, ut_teardown,
8560                         test_AES_GCM_authenticated_decryption_test_case_6),
8561                 TEST_CASE_ST(ut_setup, ut_teardown,
8562                         test_AES_GCM_authenticated_decryption_test_case_7),
8563
8564                 /** AES GCM Authenticated Encryption 192 bits key */
8565                 TEST_CASE_ST(ut_setup, ut_teardown,
8566                         test_AES_GCM_auth_encryption_test_case_192_1),
8567                 TEST_CASE_ST(ut_setup, ut_teardown,
8568                         test_AES_GCM_auth_encryption_test_case_192_2),
8569                 TEST_CASE_ST(ut_setup, ut_teardown,
8570                         test_AES_GCM_auth_encryption_test_case_192_3),
8571                 TEST_CASE_ST(ut_setup, ut_teardown,
8572                         test_AES_GCM_auth_encryption_test_case_192_4),
8573                 TEST_CASE_ST(ut_setup, ut_teardown,
8574                         test_AES_GCM_auth_encryption_test_case_192_5),
8575                 TEST_CASE_ST(ut_setup, ut_teardown,
8576                         test_AES_GCM_auth_encryption_test_case_192_6),
8577                 TEST_CASE_ST(ut_setup, ut_teardown,
8578                         test_AES_GCM_auth_encryption_test_case_192_7),
8579
8580                 /** AES GCM Authenticated Decryption 192 bits key */
8581                 TEST_CASE_ST(ut_setup, ut_teardown,
8582                         test_AES_GCM_auth_decryption_test_case_192_1),
8583                 TEST_CASE_ST(ut_setup, ut_teardown,
8584                         test_AES_GCM_auth_decryption_test_case_192_2),
8585                 TEST_CASE_ST(ut_setup, ut_teardown,
8586                         test_AES_GCM_auth_decryption_test_case_192_3),
8587                 TEST_CASE_ST(ut_setup, ut_teardown,
8588                         test_AES_GCM_auth_decryption_test_case_192_4),
8589                 TEST_CASE_ST(ut_setup, ut_teardown,
8590                         test_AES_GCM_auth_decryption_test_case_192_5),
8591                 TEST_CASE_ST(ut_setup, ut_teardown,
8592                         test_AES_GCM_auth_decryption_test_case_192_6),
8593                 TEST_CASE_ST(ut_setup, ut_teardown,
8594                         test_AES_GCM_auth_decryption_test_case_192_7),
8595
8596                 /** AES GCM Authenticated Encryption 256 bits key */
8597                 TEST_CASE_ST(ut_setup, ut_teardown,
8598                         test_AES_GCM_auth_encryption_test_case_256_1),
8599                 TEST_CASE_ST(ut_setup, ut_teardown,
8600                         test_AES_GCM_auth_encryption_test_case_256_2),
8601                 TEST_CASE_ST(ut_setup, ut_teardown,
8602                         test_AES_GCM_auth_encryption_test_case_256_3),
8603                 TEST_CASE_ST(ut_setup, ut_teardown,
8604                         test_AES_GCM_auth_encryption_test_case_256_4),
8605                 TEST_CASE_ST(ut_setup, ut_teardown,
8606                         test_AES_GCM_auth_encryption_test_case_256_5),
8607                 TEST_CASE_ST(ut_setup, ut_teardown,
8608                         test_AES_GCM_auth_encryption_test_case_256_6),
8609                 TEST_CASE_ST(ut_setup, ut_teardown,
8610                         test_AES_GCM_auth_encryption_test_case_256_7),
8611
8612                 /** AES GCM Authenticated Decryption 256 bits key */
8613                 TEST_CASE_ST(ut_setup, ut_teardown,
8614                         test_AES_GCM_auth_decryption_test_case_256_1),
8615                 TEST_CASE_ST(ut_setup, ut_teardown,
8616                         test_AES_GCM_auth_decryption_test_case_256_2),
8617                 TEST_CASE_ST(ut_setup, ut_teardown,
8618                         test_AES_GCM_auth_decryption_test_case_256_3),
8619                 TEST_CASE_ST(ut_setup, ut_teardown,
8620                         test_AES_GCM_auth_decryption_test_case_256_4),
8621                 TEST_CASE_ST(ut_setup, ut_teardown,
8622                         test_AES_GCM_auth_decryption_test_case_256_5),
8623                 TEST_CASE_ST(ut_setup, ut_teardown,
8624                         test_AES_GCM_auth_decryption_test_case_256_6),
8625                 TEST_CASE_ST(ut_setup, ut_teardown,
8626                         test_AES_GCM_auth_decryption_test_case_256_7),
8627
8628                 /** AES GCM Authenticated Encryption big aad size */
8629                 TEST_CASE_ST(ut_setup, ut_teardown,
8630                         test_AES_GCM_auth_encryption_test_case_aad_1),
8631                 TEST_CASE_ST(ut_setup, ut_teardown,
8632                         test_AES_GCM_auth_encryption_test_case_aad_2),
8633
8634                 /** AES GCM Authenticated Decryption big aad size */
8635                 TEST_CASE_ST(ut_setup, ut_teardown,
8636                         test_AES_GCM_auth_decryption_test_case_aad_1),
8637                 TEST_CASE_ST(ut_setup, ut_teardown,
8638                         test_AES_GCM_auth_decryption_test_case_aad_2),
8639
8640                 /** AES GMAC Authentication */
8641                 TEST_CASE_ST(ut_setup, ut_teardown,
8642                         test_AES_GMAC_authentication_test_case_1),
8643                 TEST_CASE_ST(ut_setup, ut_teardown,
8644                         test_AES_GMAC_authentication_verify_test_case_1),
8645                 TEST_CASE_ST(ut_setup, ut_teardown,
8646                         test_AES_GMAC_authentication_test_case_3),
8647                 TEST_CASE_ST(ut_setup, ut_teardown,
8648                         test_AES_GMAC_authentication_verify_test_case_3),
8649                 TEST_CASE_ST(ut_setup, ut_teardown,
8650                         test_AES_GMAC_authentication_test_case_4),
8651                 TEST_CASE_ST(ut_setup, ut_teardown,
8652                         test_AES_GMAC_authentication_verify_test_case_4),
8653
8654                 /** Negative tests */
8655                 TEST_CASE_ST(ut_setup, ut_teardown,
8656                         authentication_verify_AES128_GMAC_fail_data_corrupt),
8657                 TEST_CASE_ST(ut_setup, ut_teardown,
8658                         authentication_verify_AES128_GMAC_fail_tag_corrupt),
8659
8660                 /** Out of place tests */
8661                 TEST_CASE_ST(ut_setup, ut_teardown,
8662                         test_AES_GCM_authenticated_encryption_oop_test_case_1),
8663                 TEST_CASE_ST(ut_setup, ut_teardown,
8664                         test_AES_GCM_authenticated_decryption_oop_test_case_1),
8665
8666                 /** Session-less tests */
8667                 TEST_CASE_ST(ut_setup, ut_teardown,
8668                         test_AES_GCM_authenticated_encryption_sessionless_test_case_1),
8669                 TEST_CASE_ST(ut_setup, ut_teardown,
8670                         test_AES_GCM_authenticated_decryption_sessionless_test_case_1),
8671
8672                 /** Scatter-Gather */
8673                 TEST_CASE_ST(ut_setup, ut_teardown,
8674                         test_AES_GCM_auth_encrypt_SGL_out_of_place_400B_1seg),
8675
8676                 TEST_CASES_END() /**< NULL terminate unit test array */
8677         }
8678 };
8679
8680 static struct unit_test_suite cryptodev_sw_kasumi_testsuite  = {
8681         .suite_name = "Crypto Device SW KASUMI Unit Test Suite",
8682         .setup = testsuite_setup,
8683         .teardown = testsuite_teardown,
8684         .unit_test_cases = {
8685                 /** KASUMI encrypt only (UEA1) */
8686                 TEST_CASE_ST(ut_setup, ut_teardown,
8687                         test_kasumi_encryption_test_case_1),
8688                 TEST_CASE_ST(ut_setup, ut_teardown,
8689                         test_kasumi_encryption_test_case_1_sgl),
8690                 TEST_CASE_ST(ut_setup, ut_teardown,
8691                         test_kasumi_encryption_test_case_2),
8692                 TEST_CASE_ST(ut_setup, ut_teardown,
8693                         test_kasumi_encryption_test_case_3),
8694                 TEST_CASE_ST(ut_setup, ut_teardown,
8695                         test_kasumi_encryption_test_case_4),
8696                 TEST_CASE_ST(ut_setup, ut_teardown,
8697                         test_kasumi_encryption_test_case_5),
8698                 /** KASUMI decrypt only (UEA1) */
8699                 TEST_CASE_ST(ut_setup, ut_teardown,
8700                         test_kasumi_decryption_test_case_1),
8701                 TEST_CASE_ST(ut_setup, ut_teardown,
8702                         test_kasumi_decryption_test_case_2),
8703                 TEST_CASE_ST(ut_setup, ut_teardown,
8704                         test_kasumi_decryption_test_case_3),
8705                 TEST_CASE_ST(ut_setup, ut_teardown,
8706                         test_kasumi_decryption_test_case_4),
8707                 TEST_CASE_ST(ut_setup, ut_teardown,
8708                         test_kasumi_decryption_test_case_5),
8709
8710                 TEST_CASE_ST(ut_setup, ut_teardown,
8711                         test_kasumi_encryption_test_case_1_oop),
8712                 TEST_CASE_ST(ut_setup, ut_teardown,
8713                         test_kasumi_encryption_test_case_1_oop_sgl),
8714
8715
8716                 TEST_CASE_ST(ut_setup, ut_teardown,
8717                         test_kasumi_decryption_test_case_1_oop),
8718
8719                 /** KASUMI hash only (UIA1) */
8720                 TEST_CASE_ST(ut_setup, ut_teardown,
8721                         test_kasumi_hash_generate_test_case_1),
8722                 TEST_CASE_ST(ut_setup, ut_teardown,
8723                         test_kasumi_hash_generate_test_case_2),
8724                 TEST_CASE_ST(ut_setup, ut_teardown,
8725                         test_kasumi_hash_generate_test_case_3),
8726                 TEST_CASE_ST(ut_setup, ut_teardown,
8727                         test_kasumi_hash_generate_test_case_4),
8728                 TEST_CASE_ST(ut_setup, ut_teardown,
8729                         test_kasumi_hash_generate_test_case_5),
8730                 TEST_CASE_ST(ut_setup, ut_teardown,
8731                         test_kasumi_hash_generate_test_case_6),
8732                 TEST_CASE_ST(ut_setup, ut_teardown,
8733                         test_kasumi_hash_verify_test_case_1),
8734                 TEST_CASE_ST(ut_setup, ut_teardown,
8735                         test_kasumi_hash_verify_test_case_2),
8736                 TEST_CASE_ST(ut_setup, ut_teardown,
8737                         test_kasumi_hash_verify_test_case_3),
8738                 TEST_CASE_ST(ut_setup, ut_teardown,
8739                         test_kasumi_hash_verify_test_case_4),
8740                 TEST_CASE_ST(ut_setup, ut_teardown,
8741                         test_kasumi_hash_verify_test_case_5),
8742                 TEST_CASE_ST(ut_setup, ut_teardown,
8743                         test_kasumi_auth_cipher_test_case_1),
8744                 TEST_CASE_ST(ut_setup, ut_teardown,
8745                         test_kasumi_cipher_auth_test_case_1),
8746                 TEST_CASES_END() /**< NULL terminate unit test array */
8747         }
8748 };
8749 static struct unit_test_suite cryptodev_sw_snow3g_testsuite  = {
8750         .suite_name = "Crypto Device SW SNOW 3G Unit Test Suite",
8751         .setup = testsuite_setup,
8752         .teardown = testsuite_teardown,
8753         .unit_test_cases = {
8754                 /** SNOW 3G encrypt only (UEA2) */
8755                 TEST_CASE_ST(ut_setup, ut_teardown,
8756                         test_snow3g_encryption_test_case_1),
8757                 TEST_CASE_ST(ut_setup, ut_teardown,
8758                         test_snow3g_encryption_test_case_2),
8759                 TEST_CASE_ST(ut_setup, ut_teardown,
8760                         test_snow3g_encryption_test_case_3),
8761                 TEST_CASE_ST(ut_setup, ut_teardown,
8762                         test_snow3g_encryption_test_case_4),
8763                 TEST_CASE_ST(ut_setup, ut_teardown,
8764                         test_snow3g_encryption_test_case_5),
8765
8766                 TEST_CASE_ST(ut_setup, ut_teardown,
8767                         test_snow3g_encryption_test_case_1_oop),
8768                 TEST_CASE_ST(ut_setup, ut_teardown,
8769                                 test_snow3g_encryption_test_case_1_oop_sgl),
8770                 TEST_CASE_ST(ut_setup, ut_teardown,
8771                         test_snow3g_decryption_test_case_1_oop),
8772
8773                 TEST_CASE_ST(ut_setup, ut_teardown,
8774                         test_snow3g_encryption_test_case_1_offset_oop),
8775
8776                 /** SNOW 3G decrypt only (UEA2) */
8777                 TEST_CASE_ST(ut_setup, ut_teardown,
8778                         test_snow3g_decryption_test_case_1),
8779                 TEST_CASE_ST(ut_setup, ut_teardown,
8780                         test_snow3g_decryption_test_case_2),
8781                 TEST_CASE_ST(ut_setup, ut_teardown,
8782                         test_snow3g_decryption_test_case_3),
8783                 TEST_CASE_ST(ut_setup, ut_teardown,
8784                         test_snow3g_decryption_test_case_4),
8785                 TEST_CASE_ST(ut_setup, ut_teardown,
8786                         test_snow3g_decryption_test_case_5),
8787                 TEST_CASE_ST(ut_setup, ut_teardown,
8788                         test_snow3g_hash_generate_test_case_1),
8789                 TEST_CASE_ST(ut_setup, ut_teardown,
8790                         test_snow3g_hash_generate_test_case_2),
8791                 TEST_CASE_ST(ut_setup, ut_teardown,
8792                         test_snow3g_hash_generate_test_case_3),
8793                 /* Tests with buffers which length is not byte-aligned */
8794                 TEST_CASE_ST(ut_setup, ut_teardown,
8795                         test_snow3g_hash_generate_test_case_4),
8796                 TEST_CASE_ST(ut_setup, ut_teardown,
8797                         test_snow3g_hash_generate_test_case_5),
8798                 TEST_CASE_ST(ut_setup, ut_teardown,
8799                         test_snow3g_hash_generate_test_case_6),
8800                 TEST_CASE_ST(ut_setup, ut_teardown,
8801                         test_snow3g_hash_verify_test_case_1),
8802                 TEST_CASE_ST(ut_setup, ut_teardown,
8803                         test_snow3g_hash_verify_test_case_2),
8804                 TEST_CASE_ST(ut_setup, ut_teardown,
8805                         test_snow3g_hash_verify_test_case_3),
8806                 /* Tests with buffers which length is not byte-aligned */
8807                 TEST_CASE_ST(ut_setup, ut_teardown,
8808                         test_snow3g_hash_verify_test_case_4),
8809                 TEST_CASE_ST(ut_setup, ut_teardown,
8810                         test_snow3g_hash_verify_test_case_5),
8811                 TEST_CASE_ST(ut_setup, ut_teardown,
8812                         test_snow3g_hash_verify_test_case_6),
8813                 TEST_CASE_ST(ut_setup, ut_teardown,
8814                         test_snow3g_cipher_auth_test_case_1),
8815                 TEST_CASE_ST(ut_setup, ut_teardown,
8816                         test_snow3g_auth_cipher_test_case_1),
8817
8818                 TEST_CASES_END() /**< NULL terminate unit test array */
8819         }
8820 };
8821
8822 static struct unit_test_suite cryptodev_sw_zuc_testsuite  = {
8823         .suite_name = "Crypto Device SW ZUC Unit Test Suite",
8824         .setup = testsuite_setup,
8825         .teardown = testsuite_teardown,
8826         .unit_test_cases = {
8827                 /** ZUC encrypt only (EEA3) */
8828                 TEST_CASE_ST(ut_setup, ut_teardown,
8829                         test_zuc_encryption_test_case_1),
8830                 TEST_CASE_ST(ut_setup, ut_teardown,
8831                         test_zuc_encryption_test_case_2),
8832                 TEST_CASE_ST(ut_setup, ut_teardown,
8833                         test_zuc_encryption_test_case_3),
8834                 TEST_CASE_ST(ut_setup, ut_teardown,
8835                         test_zuc_encryption_test_case_4),
8836                 TEST_CASE_ST(ut_setup, ut_teardown,
8837                         test_zuc_encryption_test_case_5),
8838                 TEST_CASE_ST(ut_setup, ut_teardown,
8839                         test_zuc_hash_generate_test_case_1),
8840                 TEST_CASE_ST(ut_setup, ut_teardown,
8841                         test_zuc_hash_generate_test_case_2),
8842                 TEST_CASE_ST(ut_setup, ut_teardown,
8843                         test_zuc_hash_generate_test_case_3),
8844                 TEST_CASE_ST(ut_setup, ut_teardown,
8845                         test_zuc_hash_generate_test_case_4),
8846                 TEST_CASE_ST(ut_setup, ut_teardown,
8847                         test_zuc_hash_generate_test_case_5),
8848                 TEST_CASE_ST(ut_setup, ut_teardown,
8849                         test_zuc_encryption_test_case_6_sgl),
8850                 TEST_CASES_END() /**< NULL terminate unit test array */
8851         }
8852 };
8853
8854 static struct unit_test_suite cryptodev_dpaa2_sec_testsuite  = {
8855         .suite_name = "Crypto DPAA2_SEC Unit Test Suite",
8856         .setup = testsuite_setup,
8857         .teardown = testsuite_teardown,
8858         .unit_test_cases = {
8859                 TEST_CASE_ST(ut_setup, ut_teardown,
8860                         test_device_configure_invalid_dev_id),
8861                 TEST_CASE_ST(ut_setup, ut_teardown,
8862                         test_multi_session),
8863
8864                 TEST_CASE_ST(ut_setup, ut_teardown,
8865                         test_AES_chain_dpaa2_sec_all),
8866                 TEST_CASE_ST(ut_setup, ut_teardown,
8867                         test_3DES_chain_dpaa2_sec_all),
8868                 TEST_CASE_ST(ut_setup, ut_teardown,
8869                         test_AES_cipheronly_dpaa2_sec_all),
8870                 TEST_CASE_ST(ut_setup, ut_teardown,
8871                         test_3DES_cipheronly_dpaa2_sec_all),
8872                 TEST_CASE_ST(ut_setup, ut_teardown,
8873                         test_authonly_dpaa2_sec_all),
8874
8875                 /** AES GCM Authenticated Encryption */
8876                 TEST_CASE_ST(ut_setup, ut_teardown,
8877                         test_AES_GCM_authenticated_encryption_test_case_1),
8878                 TEST_CASE_ST(ut_setup, ut_teardown,
8879                         test_AES_GCM_authenticated_encryption_test_case_2),
8880                 TEST_CASE_ST(ut_setup, ut_teardown,
8881                         test_AES_GCM_authenticated_encryption_test_case_3),
8882                 TEST_CASE_ST(ut_setup, ut_teardown,
8883                         test_AES_GCM_authenticated_encryption_test_case_4),
8884                 TEST_CASE_ST(ut_setup, ut_teardown,
8885                         test_AES_GCM_authenticated_encryption_test_case_5),
8886                 TEST_CASE_ST(ut_setup, ut_teardown,
8887                         test_AES_GCM_authenticated_encryption_test_case_6),
8888                 TEST_CASE_ST(ut_setup, ut_teardown,
8889                         test_AES_GCM_authenticated_encryption_test_case_7),
8890
8891                 /** AES GCM Authenticated Decryption */
8892                 TEST_CASE_ST(ut_setup, ut_teardown,
8893                         test_AES_GCM_authenticated_decryption_test_case_1),
8894                 TEST_CASE_ST(ut_setup, ut_teardown,
8895                         test_AES_GCM_authenticated_decryption_test_case_2),
8896                 TEST_CASE_ST(ut_setup, ut_teardown,
8897                         test_AES_GCM_authenticated_decryption_test_case_3),
8898                 TEST_CASE_ST(ut_setup, ut_teardown,
8899                         test_AES_GCM_authenticated_decryption_test_case_4),
8900                 TEST_CASE_ST(ut_setup, ut_teardown,
8901                         test_AES_GCM_authenticated_decryption_test_case_5),
8902                 TEST_CASE_ST(ut_setup, ut_teardown,
8903                         test_AES_GCM_authenticated_decryption_test_case_6),
8904                 TEST_CASE_ST(ut_setup, ut_teardown,
8905                         test_AES_GCM_authenticated_decryption_test_case_7),
8906
8907                 /** AES GCM Authenticated Encryption 192 bits key */
8908                 TEST_CASE_ST(ut_setup, ut_teardown,
8909                         test_AES_GCM_auth_encryption_test_case_192_1),
8910                 TEST_CASE_ST(ut_setup, ut_teardown,
8911                         test_AES_GCM_auth_encryption_test_case_192_2),
8912                 TEST_CASE_ST(ut_setup, ut_teardown,
8913                         test_AES_GCM_auth_encryption_test_case_192_3),
8914                 TEST_CASE_ST(ut_setup, ut_teardown,
8915                         test_AES_GCM_auth_encryption_test_case_192_4),
8916                 TEST_CASE_ST(ut_setup, ut_teardown,
8917                         test_AES_GCM_auth_encryption_test_case_192_5),
8918                 TEST_CASE_ST(ut_setup, ut_teardown,
8919                         test_AES_GCM_auth_encryption_test_case_192_6),
8920                 TEST_CASE_ST(ut_setup, ut_teardown,
8921                         test_AES_GCM_auth_encryption_test_case_192_7),
8922
8923                 /** AES GCM Authenticated Decryption 192 bits key */
8924                 TEST_CASE_ST(ut_setup, ut_teardown,
8925                         test_AES_GCM_auth_decryption_test_case_192_1),
8926                 TEST_CASE_ST(ut_setup, ut_teardown,
8927                         test_AES_GCM_auth_decryption_test_case_192_2),
8928                 TEST_CASE_ST(ut_setup, ut_teardown,
8929                         test_AES_GCM_auth_decryption_test_case_192_3),
8930                 TEST_CASE_ST(ut_setup, ut_teardown,
8931                         test_AES_GCM_auth_decryption_test_case_192_4),
8932                 TEST_CASE_ST(ut_setup, ut_teardown,
8933                         test_AES_GCM_auth_decryption_test_case_192_5),
8934                 TEST_CASE_ST(ut_setup, ut_teardown,
8935                         test_AES_GCM_auth_decryption_test_case_192_6),
8936                 TEST_CASE_ST(ut_setup, ut_teardown,
8937                         test_AES_GCM_auth_decryption_test_case_192_7),
8938
8939                 /** AES GCM Authenticated Encryption 256 bits key */
8940                 TEST_CASE_ST(ut_setup, ut_teardown,
8941                         test_AES_GCM_auth_encryption_test_case_256_1),
8942                 TEST_CASE_ST(ut_setup, ut_teardown,
8943                         test_AES_GCM_auth_encryption_test_case_256_2),
8944                 TEST_CASE_ST(ut_setup, ut_teardown,
8945                         test_AES_GCM_auth_encryption_test_case_256_3),
8946                 TEST_CASE_ST(ut_setup, ut_teardown,
8947                         test_AES_GCM_auth_encryption_test_case_256_4),
8948                 TEST_CASE_ST(ut_setup, ut_teardown,
8949                         test_AES_GCM_auth_encryption_test_case_256_5),
8950                 TEST_CASE_ST(ut_setup, ut_teardown,
8951                         test_AES_GCM_auth_encryption_test_case_256_6),
8952                 TEST_CASE_ST(ut_setup, ut_teardown,
8953                         test_AES_GCM_auth_encryption_test_case_256_7),
8954
8955                 /** AES GCM Authenticated Decryption 256 bits key */
8956                 TEST_CASE_ST(ut_setup, ut_teardown,
8957                         test_AES_GCM_auth_decryption_test_case_256_1),
8958                 TEST_CASE_ST(ut_setup, ut_teardown,
8959                         test_AES_GCM_auth_decryption_test_case_256_2),
8960                 TEST_CASE_ST(ut_setup, ut_teardown,
8961                         test_AES_GCM_auth_decryption_test_case_256_3),
8962                 TEST_CASE_ST(ut_setup, ut_teardown,
8963                         test_AES_GCM_auth_decryption_test_case_256_4),
8964                 TEST_CASE_ST(ut_setup, ut_teardown,
8965                         test_AES_GCM_auth_decryption_test_case_256_5),
8966                 TEST_CASE_ST(ut_setup, ut_teardown,
8967                         test_AES_GCM_auth_decryption_test_case_256_6),
8968                 TEST_CASE_ST(ut_setup, ut_teardown,
8969                         test_AES_GCM_auth_decryption_test_case_256_7),
8970
8971                 TEST_CASES_END() /**< NULL terminate unit test array */
8972         }
8973 };
8974
8975 static struct unit_test_suite cryptodev_null_testsuite  = {
8976         .suite_name = "Crypto Device NULL Unit Test Suite",
8977         .setup = testsuite_setup,
8978         .teardown = testsuite_teardown,
8979         .unit_test_cases = {
8980                 TEST_CASE_ST(ut_setup, ut_teardown,
8981                         test_null_auth_only_operation),
8982                 TEST_CASE_ST(ut_setup, ut_teardown,
8983                         test_null_cipher_only_operation),
8984                 TEST_CASE_ST(ut_setup, ut_teardown,
8985                         test_null_cipher_auth_operation),
8986                 TEST_CASE_ST(ut_setup, ut_teardown,
8987                         test_null_auth_cipher_operation),
8988                 TEST_CASE_ST(ut_setup, ut_teardown,
8989                         test_null_invalid_operation),
8990                 TEST_CASE_ST(ut_setup, ut_teardown,
8991                         test_null_burst_operation),
8992
8993                 TEST_CASES_END() /**< NULL terminate unit test array */
8994         }
8995 };
8996
8997 static struct unit_test_suite cryptodev_armv8_testsuite  = {
8998         .suite_name = "Crypto Device ARMv8 Unit Test Suite",
8999         .setup = testsuite_setup,
9000         .teardown = testsuite_teardown,
9001         .unit_test_cases = {
9002                 TEST_CASE_ST(ut_setup, ut_teardown, test_AES_chain_armv8_all),
9003
9004                 /** Negative tests */
9005                 TEST_CASE_ST(ut_setup, ut_teardown,
9006                         auth_decryption_AES128CBC_HMAC_SHA1_fail_data_corrupt),
9007                 TEST_CASE_ST(ut_setup, ut_teardown,
9008                         auth_decryption_AES128CBC_HMAC_SHA1_fail_tag_corrupt),
9009
9010                 TEST_CASES_END() /**< NULL terminate unit test array */
9011         }
9012 };
9013
9014 static int
9015 test_cryptodev_qat(void /*argv __rte_unused, int argc __rte_unused*/)
9016 {
9017         gbl_driver_id = rte_cryptodev_driver_id_get(
9018                         RTE_STR(CRYPTODEV_NAME_QAT_SYM_PMD));
9019
9020         if (gbl_driver_id == -1) {
9021                 RTE_LOG(ERR, USER1, "QAT PMD must be loaded. Check if "
9022                                 "CONFIG_RTE_LIBRTE_PMD_QAT is enabled "
9023                                 "in config file to run this testsuite.\n");
9024                 return TEST_FAILED;
9025         }
9026
9027         return unit_test_suite_runner(&cryptodev_qat_testsuite);
9028 }
9029
9030 static int
9031 test_cryptodev_aesni_mb(void /*argv __rte_unused, int argc __rte_unused*/)
9032 {
9033         gbl_driver_id = rte_cryptodev_driver_id_get(
9034                         RTE_STR(CRYPTODEV_NAME_AESNI_MB_PMD));
9035
9036         if (gbl_driver_id == -1) {
9037                 RTE_LOG(ERR, USER1, "AESNI MB PMD must be loaded. Check if "
9038                                 "CONFIG_RTE_LIBRTE_PMD_AESNI_MB is enabled "
9039                                 "in config file to run this testsuite.\n");
9040                 return TEST_FAILED;
9041         }
9042
9043         return unit_test_suite_runner(&cryptodev_aesni_mb_testsuite);
9044 }
9045
9046 static int
9047 test_cryptodev_openssl(void)
9048 {
9049         gbl_driver_id = rte_cryptodev_driver_id_get(
9050                         RTE_STR(CRYPTODEV_NAME_OPENSSL_PMD));
9051
9052         if (gbl_driver_id == -1) {
9053                 RTE_LOG(ERR, USER1, "OPENSSL PMD must be loaded. Check if "
9054                                 "CONFIG_RTE_LIBRTE_PMD_OPENSSL is enabled "
9055                                 "in config file to run this testsuite.\n");
9056                 return TEST_FAILED;
9057         }
9058
9059         return unit_test_suite_runner(&cryptodev_openssl_testsuite);
9060 }
9061
9062 static int
9063 test_cryptodev_aesni_gcm(void)
9064 {
9065         gbl_driver_id = rte_cryptodev_driver_id_get(
9066                         RTE_STR(CRYPTODEV_NAME_AESNI_GCM_PMD));
9067
9068         if (gbl_driver_id == -1) {
9069                 RTE_LOG(ERR, USER1, "AESNI GCM PMD must be loaded. Check if "
9070                                 "CONFIG_RTE_LIBRTE_PMD_AESNI_GCM is enabled "
9071                                 "in config file to run this testsuite.\n");
9072                 return TEST_FAILED;
9073         }
9074
9075         return unit_test_suite_runner(&cryptodev_aesni_gcm_testsuite);
9076 }
9077
9078 static int
9079 test_cryptodev_null(void)
9080 {
9081         gbl_driver_id = rte_cryptodev_driver_id_get(
9082                         RTE_STR(CRYPTODEV_NAME_NULL_PMD));
9083
9084         if (gbl_driver_id == -1) {
9085                 RTE_LOG(ERR, USER1, "NULL PMD must be loaded. Check if "
9086                                 "CONFIG_RTE_LIBRTE_PMD_NULL is enabled "
9087                                 "in config file to run this testsuite.\n");
9088                 return TEST_FAILED;
9089         }
9090
9091         return unit_test_suite_runner(&cryptodev_null_testsuite);
9092 }
9093
9094 static int
9095 test_cryptodev_sw_snow3g(void /*argv __rte_unused, int argc __rte_unused*/)
9096 {
9097         gbl_driver_id = rte_cryptodev_driver_id_get(
9098                         RTE_STR(CRYPTODEV_NAME_SNOW3G_PMD));
9099
9100         if (gbl_driver_id == -1) {
9101                 RTE_LOG(ERR, USER1, "SNOW3G PMD must be loaded. Check if "
9102                                 "CONFIG_RTE_LIBRTE_PMD_SNOW3G is enabled "
9103                                 "in config file to run this testsuite.\n");
9104                 return TEST_FAILED;
9105         }
9106
9107         return unit_test_suite_runner(&cryptodev_sw_snow3g_testsuite);
9108 }
9109
9110 static int
9111 test_cryptodev_sw_kasumi(void /*argv __rte_unused, int argc __rte_unused*/)
9112 {
9113         gbl_driver_id = rte_cryptodev_driver_id_get(
9114                         RTE_STR(CRYPTODEV_NAME_KASUMI_PMD));
9115
9116         if (gbl_driver_id == -1) {
9117                 RTE_LOG(ERR, USER1, "ZUC PMD must be loaded. Check if "
9118                                 "CONFIG_RTE_LIBRTE_PMD_KASUMI is enabled "
9119                                 "in config file to run this testsuite.\n");
9120                 return TEST_FAILED;
9121         }
9122
9123         return unit_test_suite_runner(&cryptodev_sw_kasumi_testsuite);
9124 }
9125
9126 static int
9127 test_cryptodev_sw_zuc(void /*argv __rte_unused, int argc __rte_unused*/)
9128 {
9129         gbl_driver_id = rte_cryptodev_driver_id_get(
9130                         RTE_STR(CRYPTODEV_NAME_ZUC_PMD));
9131
9132         if (gbl_driver_id == -1) {
9133                 RTE_LOG(ERR, USER1, "ZUC PMD must be loaded. Check if "
9134                                 "CONFIG_RTE_LIBRTE_PMD_ZUC is enabled "
9135                                 "in config file to run this testsuite.\n");
9136                 return TEST_FAILED;
9137         }
9138
9139         return unit_test_suite_runner(&cryptodev_sw_zuc_testsuite);
9140 }
9141
9142 static int
9143 test_cryptodev_armv8(void)
9144 {
9145         gbl_driver_id = rte_cryptodev_driver_id_get(
9146                         RTE_STR(CRYPTODEV_NAME_ARMV8_PMD));
9147
9148         if (gbl_driver_id == -1) {
9149                 RTE_LOG(ERR, USER1, "ARMV8 PMD must be loaded. Check if "
9150                                 "CONFIG_RTE_LIBRTE_PMD_ARMV8 is enabled "
9151                                 "in config file to run this testsuite.\n");
9152                 return TEST_FAILED;
9153         }
9154
9155         return unit_test_suite_runner(&cryptodev_armv8_testsuite);
9156 }
9157
9158 #ifdef RTE_LIBRTE_PMD_CRYPTO_SCHEDULER
9159
9160 static int
9161 test_cryptodev_scheduler(void /*argv __rte_unused, int argc __rte_unused*/)
9162 {
9163         gbl_driver_id = rte_cryptodev_driver_id_get(
9164                         RTE_STR(CRYPTODEV_NAME_SCHEDULER_PMD));
9165
9166         if (gbl_driver_id == -1) {
9167                 RTE_LOG(ERR, USER1, "SCHEDULER PMD must be loaded. Check if "
9168                                 "CONFIG_RTE_LIBRTE_PMD_SCHEDULER is enabled "
9169                                 "in config file to run this testsuite.\n");
9170                 return TEST_FAILED;
9171         }
9172
9173         if (rte_cryptodev_driver_id_get(
9174                                 RTE_STR(CRYPTODEV_NAME_AESNI_MB_PMD)) == -1) {
9175                 RTE_LOG(ERR, USER1, "CONFIG_RTE_LIBRTE_PMD_AESNI_MB must be"
9176                         " enabled in config file to run this testsuite.\n");
9177                 return TEST_FAILED;
9178 }
9179         return unit_test_suite_runner(&cryptodev_scheduler_testsuite);
9180 }
9181
9182 REGISTER_TEST_COMMAND(cryptodev_scheduler_autotest, test_cryptodev_scheduler);
9183
9184 #endif
9185
9186 static int
9187 test_cryptodev_dpaa2_sec(void /*argv __rte_unused, int argc __rte_unused*/)
9188 {
9189         gbl_driver_id = rte_cryptodev_driver_id_get(
9190                         RTE_STR(CRYPTODEV_NAME_DPAA2_SEC_PMD));
9191
9192         if (gbl_driver_id == -1) {
9193                 RTE_LOG(ERR, USER1, "DPAA2 SEC PMD must be loaded. Check if "
9194                                 "CONFIG_RTE_LIBRTE_PMD_DPAA2_SEC is enabled "
9195                                 "in config file to run this testsuite.\n");
9196                 return TEST_FAILED;
9197         }
9198
9199         return unit_test_suite_runner(&cryptodev_dpaa2_sec_testsuite);
9200 }
9201
9202 REGISTER_TEST_COMMAND(cryptodev_qat_autotest, test_cryptodev_qat);
9203 REGISTER_TEST_COMMAND(cryptodev_aesni_mb_autotest, test_cryptodev_aesni_mb);
9204 REGISTER_TEST_COMMAND(cryptodev_openssl_autotest, test_cryptodev_openssl);
9205 REGISTER_TEST_COMMAND(cryptodev_aesni_gcm_autotest, test_cryptodev_aesni_gcm);
9206 REGISTER_TEST_COMMAND(cryptodev_null_autotest, test_cryptodev_null);
9207 REGISTER_TEST_COMMAND(cryptodev_sw_snow3g_autotest, test_cryptodev_sw_snow3g);
9208 REGISTER_TEST_COMMAND(cryptodev_sw_kasumi_autotest, test_cryptodev_sw_kasumi);
9209 REGISTER_TEST_COMMAND(cryptodev_sw_zuc_autotest, test_cryptodev_sw_zuc);
9210 REGISTER_TEST_COMMAND(cryptodev_sw_armv8_autotest, test_cryptodev_armv8);
9211 REGISTER_TEST_COMMAND(cryptodev_dpaa2_sec_autotest, test_cryptodev_dpaa2_sec);