1 /* SPDX-License-Identifier: BSD-3-Clause
2 * Copyright(c) 2015-2020 Intel Corporation
3 * Copyright 2020 NXP
4 */
5
6 #ifndef RTE_EXEC_ENV_WINDOWS
7
8 #include <time.h>
9
10 #include <rte_common.h>
11 #include <rte_hexdump.h>
12 #include <rte_mbuf.h>
13 #include <rte_malloc.h>
14 #include <rte_memcpy.h>
15 #include <rte_pause.h>
16 #include <rte_bus_vdev.h>
17 #include <rte_ether.h>
18
19 #include <rte_crypto.h>
20 #include <rte_cryptodev.h>
21 #include <rte_ip.h>
22 #include <rte_string_fns.h>
23 #include <rte_tcp.h>
24 #include <rte_udp.h>
25
26 #ifdef RTE_CRYPTO_SCHEDULER
27 #include <rte_cryptodev_scheduler.h>
28 #include <rte_cryptodev_scheduler_operations.h>
29 #endif
30
31 #include <rte_lcore.h>
32
33 #include "test.h"
34 #include "test_cryptodev.h"
35
36 #include "test_cryptodev_blockcipher.h"
37 #include "test_cryptodev_aes_test_vectors.h"
38 #include "test_cryptodev_des_test_vectors.h"
39 #include "test_cryptodev_hash_test_vectors.h"
40 #include "test_cryptodev_kasumi_test_vectors.h"
41 #include "test_cryptodev_kasumi_hash_test_vectors.h"
42 #include "test_cryptodev_snow3g_test_vectors.h"
43 #include "test_cryptodev_snow3g_hash_test_vectors.h"
44 #include "test_cryptodev_zuc_test_vectors.h"
45 #include "test_cryptodev_aead_test_vectors.h"
46 #include "test_cryptodev_hmac_test_vectors.h"
47 #include "test_cryptodev_mixed_test_vectors.h"
48 #ifdef RTE_LIB_SECURITY
49 #include "test_cryptodev_security_ipsec.h"
50 #include "test_cryptodev_security_ipsec_test_vectors.h"
51 #include "test_cryptodev_security_pdcp_test_vectors.h"
52 #include "test_cryptodev_security_pdcp_sdap_test_vectors.h"
53 #include "test_cryptodev_security_pdcp_test_func.h"
54 #include "test_cryptodev_security_docsis_test_vectors.h"
55
56 #define SDAP_DISABLED 0
57 #define SDAP_ENABLED 1
58 #endif
59
60 #define VDEV_ARGS_SIZE 100
61 #define MAX_NB_SESSIONS 4
62
63 #define MAX_DRV_SERVICE_CTX_SIZE 256
64
65 #define MAX_RAW_DEQUEUE_COUNT 65535
66
67 #define IN_PLACE 0
68 #define OUT_OF_PLACE 1
69
70 static int gbl_driver_id;
71
72 static enum rte_security_session_action_type gbl_action_type =
73 RTE_SECURITY_ACTION_TYPE_NONE;
74
75 enum cryptodev_api_test_type global_api_test_type = CRYPTODEV_API_TEST;
76
77 struct crypto_unittest_params {
78 struct rte_crypto_sym_xform cipher_xform;
79 struct rte_crypto_sym_xform auth_xform;
80 struct rte_crypto_sym_xform aead_xform;
81 #ifdef RTE_LIB_SECURITY
82 struct rte_security_docsis_xform docsis_xform;
83 #endif
84
85 union {
86 struct rte_cryptodev_sym_session *sess;
87 #ifdef RTE_LIB_SECURITY
88 struct rte_security_session *sec_session;
89 #endif
90 };
91 #ifdef RTE_LIB_SECURITY
92 enum rte_security_session_action_type type;
93 #endif
94 struct rte_crypto_op *op;
95
96 struct rte_mbuf *obuf, *ibuf;
97
98 uint8_t *digest;
99 };
100
101 #define ALIGN_POW2_ROUNDUP(num, align) \
102 (((num) + (align) - 1) & ~((align) - 1))
103
104 #define ADD_STATIC_TESTSUITE(index, parent_ts, child_ts, num_child_ts) \
105 for (j = 0; j < num_child_ts; index++, j++) \
106 parent_ts.unit_test_suites[index] = child_ts[j]
107
108 #define ADD_BLOCKCIPHER_TESTSUITE(index, parent_ts, blk_types, num_blk_types) \
109 for (j = 0; j < num_blk_types; index++, j++) \
110 parent_ts.unit_test_suites[index] = \
111 build_blockcipher_test_suite(blk_types[j])
112
113 #define FREE_BLOCKCIPHER_TESTSUITE(index, parent_ts, num_blk_types) \
114 for (j = index; j < index + num_blk_types; j++) \
115 free_blockcipher_test_suite(parent_ts.unit_test_suites[j])
116
117 /*
118 * Forward declarations.
119 */
120 static int
121 test_AES_CBC_HMAC_SHA512_decrypt_create_session_params(
122 struct crypto_unittest_params *ut_params, uint8_t *cipher_key,
123 uint8_t *hmac_key);
124
125 static int
126 test_AES_CBC_HMAC_SHA512_decrypt_perform(struct rte_cryptodev_sym_session *sess,
127 struct crypto_unittest_params *ut_params,
128 struct crypto_testsuite_params *ts_param,
129 const uint8_t *cipher,
130 const uint8_t *digest,
131 const uint8_t *iv);
132
133 static int
134 security_proto_supported(enum rte_security_session_action_type action,
135 enum rte_security_session_protocol proto);
136
137 static int
138 dev_configure_and_start(uint64_t ff_disable);
139
140 static struct rte_mbuf *
setup_test_string(struct rte_mempool * mpool,const char * string,size_t len,uint8_t blocksize)141 setup_test_string(struct rte_mempool *mpool,
142 const char *string, size_t len, uint8_t blocksize)
143 {
144 struct rte_mbuf *m = rte_pktmbuf_alloc(mpool);
145 size_t t_len = len - (blocksize ? (len % blocksize) : 0);
146
147 if (m) {
148 char *dst;
149
150 memset(m->buf_addr, 0, m->buf_len);
151 dst = rte_pktmbuf_append(m, t_len);
152 if (!dst) {
153 rte_pktmbuf_free(m);
154 return NULL;
155 }
156 if (string != NULL)
157 rte_memcpy(dst, string, t_len);
158 else
159 memset(dst, 0, t_len);
160 }
161
162 return m;
163 }
164
165 /* Get number of bytes in X bits (rounding up) */
166 static uint32_t
ceil_byte_length(uint32_t num_bits)167 ceil_byte_length(uint32_t num_bits)
168 {
169 if (num_bits % 8)
170 return ((num_bits >> 3) + 1);
171 else
172 return (num_bits >> 3);
173 }
174
175 static void
post_process_raw_dp_op(void * user_data,uint32_t index __rte_unused,uint8_t is_op_success)176 post_process_raw_dp_op(void *user_data, uint32_t index __rte_unused,
177 uint8_t is_op_success)
178 {
179 struct rte_crypto_op *op = user_data;
180 op->status = is_op_success ? RTE_CRYPTO_OP_STATUS_SUCCESS :
181 RTE_CRYPTO_OP_STATUS_ERROR;
182 }
183
184 static struct crypto_testsuite_params testsuite_params = { NULL };
185 struct crypto_testsuite_params *p_testsuite_params = &testsuite_params;
186 static struct crypto_unittest_params unittest_params;
187
188 void
process_sym_raw_dp_op(uint8_t dev_id,uint16_t qp_id,struct rte_crypto_op * op,uint8_t is_cipher,uint8_t is_auth,uint8_t len_in_bits,uint8_t cipher_iv_len)189 process_sym_raw_dp_op(uint8_t dev_id, uint16_t qp_id,
190 struct rte_crypto_op *op, uint8_t is_cipher, uint8_t is_auth,
191 uint8_t len_in_bits, uint8_t cipher_iv_len)
192 {
193 struct rte_crypto_sym_op *sop = op->sym;
194 struct rte_crypto_op *ret_op = NULL;
195 struct rte_crypto_vec data_vec[UINT8_MAX], dest_data_vec[UINT8_MAX];
196 struct rte_crypto_va_iova_ptr cipher_iv, digest, aad_auth_iv;
197 union rte_crypto_sym_ofs ofs;
198 struct rte_crypto_sym_vec vec;
199 struct rte_crypto_sgl sgl, dest_sgl;
200 uint32_t max_len;
201 union rte_cryptodev_session_ctx sess;
202 uint64_t auth_end_iova;
203 uint32_t count = 0;
204 struct rte_crypto_raw_dp_ctx *ctx;
205 uint32_t cipher_offset = 0, cipher_len = 0, auth_offset = 0,
206 auth_len = 0;
207 int32_t n;
208 uint32_t n_success;
209 int ctx_service_size;
210 int32_t status = 0;
211 int enqueue_status, dequeue_status;
212 struct crypto_unittest_params *ut_params = &unittest_params;
213 int is_sgl = sop->m_src->nb_segs > 1;
214 int is_oop = 0;
215
216 ctx_service_size = rte_cryptodev_get_raw_dp_ctx_size(dev_id);
217 if (ctx_service_size < 0) {
218 op->status = RTE_CRYPTO_OP_STATUS_ERROR;
219 return;
220 }
221
222 ctx = malloc(ctx_service_size);
223 if (!ctx) {
224 op->status = RTE_CRYPTO_OP_STATUS_ERROR;
225 return;
226 }
227
228 /* Both are enums, setting crypto_sess will suit any session type */
229 sess.crypto_sess = op->sym->session;
230
231 if (rte_cryptodev_configure_raw_dp_ctx(dev_id, qp_id, ctx,
232 op->sess_type, sess, 0) < 0) {
233 op->status = RTE_CRYPTO_OP_STATUS_ERROR;
234 goto exit;
235 }
236
237 cipher_iv.iova = 0;
238 cipher_iv.va = NULL;
239 aad_auth_iv.iova = 0;
240 aad_auth_iv.va = NULL;
241 digest.iova = 0;
242 digest.va = NULL;
243 sgl.vec = data_vec;
244 vec.num = 1;
245 vec.src_sgl = &sgl;
246 vec.iv = &cipher_iv;
247 vec.digest = &digest;
248 vec.aad = &aad_auth_iv;
249 vec.status = &status;
250
251 ofs.raw = 0;
252
253 if ((sop->m_dst != NULL) && (sop->m_dst != sop->m_src))
254 is_oop = 1;
255
256 if (is_cipher && is_auth) {
257 cipher_offset = sop->cipher.data.offset;
258 cipher_len = sop->cipher.data.length;
259 auth_offset = sop->auth.data.offset;
260 auth_len = sop->auth.data.length;
261 max_len = RTE_MAX(cipher_offset + cipher_len,
262 auth_offset + auth_len);
263 if (len_in_bits) {
264 max_len = max_len >> 3;
265 cipher_offset = cipher_offset >> 3;
266 auth_offset = auth_offset >> 3;
267 cipher_len = cipher_len >> 3;
268 auth_len = auth_len >> 3;
269 }
270 ofs.ofs.cipher.head = cipher_offset;
271 ofs.ofs.cipher.tail = max_len - cipher_offset - cipher_len;
272 ofs.ofs.auth.head = auth_offset;
273 ofs.ofs.auth.tail = max_len - auth_offset - auth_len;
274 cipher_iv.va = rte_crypto_op_ctod_offset(op, void *, IV_OFFSET);
275 cipher_iv.iova = rte_crypto_op_ctophys_offset(op, IV_OFFSET);
276 aad_auth_iv.va = rte_crypto_op_ctod_offset(
277 op, void *, IV_OFFSET + cipher_iv_len);
278 aad_auth_iv.iova = rte_crypto_op_ctophys_offset(op, IV_OFFSET +
279 cipher_iv_len);
280 digest.va = (void *)sop->auth.digest.data;
281 digest.iova = sop->auth.digest.phys_addr;
282
283 if (is_sgl) {
284 uint32_t remaining_off = auth_offset + auth_len;
285 struct rte_mbuf *sgl_buf = sop->m_src;
286 if (is_oop)
287 sgl_buf = sop->m_dst;
288
289 while (remaining_off >= rte_pktmbuf_data_len(sgl_buf)
290 && sgl_buf->next != NULL) {
291 remaining_off -= rte_pktmbuf_data_len(sgl_buf);
292 sgl_buf = sgl_buf->next;
293 }
294
295 auth_end_iova = (uint64_t)rte_pktmbuf_iova_offset(
296 sgl_buf, remaining_off);
297 } else {
298 auth_end_iova = rte_pktmbuf_iova(op->sym->m_src) +
299 auth_offset + auth_len;
300 }
301 /* Then check if digest-encrypted conditions are met */
302 if ((auth_offset + auth_len < cipher_offset + cipher_len) &&
303 (digest.iova == auth_end_iova) && is_sgl)
304 max_len = RTE_MAX(max_len,
305 auth_offset + auth_len +
306 ut_params->auth_xform.auth.digest_length);
307
308 } else if (is_cipher) {
309 cipher_offset = sop->cipher.data.offset;
310 cipher_len = sop->cipher.data.length;
311 max_len = cipher_len + cipher_offset;
312 if (len_in_bits) {
313 max_len = max_len >> 3;
314 cipher_offset = cipher_offset >> 3;
315 cipher_len = cipher_len >> 3;
316 }
317 ofs.ofs.cipher.head = cipher_offset;
318 ofs.ofs.cipher.tail = max_len - cipher_offset - cipher_len;
319 cipher_iv.va = rte_crypto_op_ctod_offset(op, void *, IV_OFFSET);
320 cipher_iv.iova = rte_crypto_op_ctophys_offset(op, IV_OFFSET);
321
322 } else if (is_auth) {
323 auth_offset = sop->auth.data.offset;
324 auth_len = sop->auth.data.length;
325 max_len = auth_len + auth_offset;
326 if (len_in_bits) {
327 max_len = max_len >> 3;
328 auth_offset = auth_offset >> 3;
329 auth_len = auth_len >> 3;
330 }
331 ofs.ofs.auth.head = auth_offset;
332 ofs.ofs.auth.tail = max_len - auth_offset - auth_len;
333 aad_auth_iv.va = rte_crypto_op_ctod_offset(
334 op, void *, IV_OFFSET + cipher_iv_len);
335 aad_auth_iv.iova = rte_crypto_op_ctophys_offset(op, IV_OFFSET +
336 cipher_iv_len);
337 digest.va = (void *)sop->auth.digest.data;
338 digest.iova = sop->auth.digest.phys_addr;
339
340 } else { /* aead */
341 cipher_offset = sop->aead.data.offset;
342 cipher_len = sop->aead.data.length;
343 max_len = cipher_len + cipher_offset;
344 if (len_in_bits) {
345 max_len = max_len >> 3;
346 cipher_offset = cipher_offset >> 3;
347 cipher_len = cipher_len >> 3;
348 }
349 ofs.ofs.cipher.head = cipher_offset;
350 ofs.ofs.cipher.tail = max_len - cipher_offset - cipher_len;
351 cipher_iv.va = rte_crypto_op_ctod_offset(op, void *, IV_OFFSET);
352 cipher_iv.iova = rte_crypto_op_ctophys_offset(op, IV_OFFSET);
353 aad_auth_iv.va = (void *)sop->aead.aad.data;
354 aad_auth_iv.iova = sop->aead.aad.phys_addr;
355 digest.va = (void *)sop->aead.digest.data;
356 digest.iova = sop->aead.digest.phys_addr;
357 }
358
359 n = rte_crypto_mbuf_to_vec(sop->m_src, 0, max_len,
360 data_vec, RTE_DIM(data_vec));
361 if (n < 0 || n > sop->m_src->nb_segs) {
362 op->status = RTE_CRYPTO_OP_STATUS_ERROR;
363 goto exit;
364 }
365
366 sgl.num = n;
367 /* Out of place */
368 if (is_oop) {
369 dest_sgl.vec = dest_data_vec;
370 vec.dest_sgl = &dest_sgl;
371 n = rte_crypto_mbuf_to_vec(sop->m_dst, 0, max_len,
372 dest_data_vec, RTE_DIM(dest_data_vec));
373 if (n < 0 || n > sop->m_dst->nb_segs) {
374 op->status = RTE_CRYPTO_OP_STATUS_ERROR;
375 goto exit;
376 }
377 dest_sgl.num = n;
378 } else
379 vec.dest_sgl = NULL;
380
381 if (rte_cryptodev_raw_enqueue_burst(ctx, &vec, ofs, (void **)&op,
382 &enqueue_status) < 1) {
383 op->status = RTE_CRYPTO_OP_STATUS_ERROR;
384 goto exit;
385 }
386
387 if (enqueue_status == 0) {
388 status = rte_cryptodev_raw_enqueue_done(ctx, 1);
389 if (status < 0) {
390 op->status = RTE_CRYPTO_OP_STATUS_ERROR;
391 goto exit;
392 }
393 } else if (enqueue_status < 0) {
394 op->status = RTE_CRYPTO_OP_STATUS_ERROR;
395 goto exit;
396 }
397
398 n = n_success = 0;
399 while (count++ < MAX_RAW_DEQUEUE_COUNT && n == 0) {
400 n = rte_cryptodev_raw_dequeue_burst(ctx,
401 NULL, 1, post_process_raw_dp_op,
402 (void **)&ret_op, 0, &n_success,
403 &dequeue_status);
404 if (dequeue_status < 0) {
405 op->status = RTE_CRYPTO_OP_STATUS_ERROR;
406 goto exit;
407 }
408 if (n == 0)
409 rte_pause();
410 }
411
412 if (n == 1 && dequeue_status == 0) {
413 if (rte_cryptodev_raw_dequeue_done(ctx, 1) < 0) {
414 op->status = RTE_CRYPTO_OP_STATUS_ERROR;
415 goto exit;
416 }
417 }
418
419 op->status = (count == MAX_RAW_DEQUEUE_COUNT + 1 || ret_op != op ||
420 ret_op->status == RTE_CRYPTO_OP_STATUS_ERROR ||
421 n_success < 1) ? RTE_CRYPTO_OP_STATUS_ERROR :
422 RTE_CRYPTO_OP_STATUS_SUCCESS;
423
424 exit:
425 free(ctx);
426 }
427
428 static void
process_cpu_aead_op(uint8_t dev_id,struct rte_crypto_op * op)429 process_cpu_aead_op(uint8_t dev_id, struct rte_crypto_op *op)
430 {
431 int32_t n, st;
432 struct rte_crypto_sym_op *sop;
433 union rte_crypto_sym_ofs ofs;
434 struct rte_crypto_sgl sgl;
435 struct rte_crypto_sym_vec symvec;
436 struct rte_crypto_va_iova_ptr iv_ptr, aad_ptr, digest_ptr;
437 struct rte_crypto_vec vec[UINT8_MAX];
438
439 sop = op->sym;
440
441 n = rte_crypto_mbuf_to_vec(sop->m_src, sop->aead.data.offset,
442 sop->aead.data.length, vec, RTE_DIM(vec));
443
444 if (n < 0 || n != sop->m_src->nb_segs) {
445 op->status = RTE_CRYPTO_OP_STATUS_ERROR;
446 return;
447 }
448
449 sgl.vec = vec;
450 sgl.num = n;
451 symvec.src_sgl = &sgl;
452 symvec.iv = &iv_ptr;
453 symvec.digest = &digest_ptr;
454 symvec.aad = &aad_ptr;
455 symvec.status = &st;
456 symvec.num = 1;
457
458 /* for CPU crypto the IOVA address is not required */
459 iv_ptr.va = rte_crypto_op_ctod_offset(op, void *, IV_OFFSET);
460 digest_ptr.va = (void *)sop->aead.digest.data;
461 aad_ptr.va = (void *)sop->aead.aad.data;
462
463 ofs.raw = 0;
464
465 n = rte_cryptodev_sym_cpu_crypto_process(dev_id, sop->session, ofs,
466 &symvec);
467
468 if (n != 1)
469 op->status = RTE_CRYPTO_OP_STATUS_AUTH_FAILED;
470 else
471 op->status = RTE_CRYPTO_OP_STATUS_SUCCESS;
472 }
473
474 static void
process_cpu_crypt_auth_op(uint8_t dev_id,struct rte_crypto_op * op)475 process_cpu_crypt_auth_op(uint8_t dev_id, struct rte_crypto_op *op)
476 {
477 int32_t n, st;
478 struct rte_crypto_sym_op *sop;
479 union rte_crypto_sym_ofs ofs;
480 struct rte_crypto_sgl sgl;
481 struct rte_crypto_sym_vec symvec;
482 struct rte_crypto_va_iova_ptr iv_ptr, digest_ptr;
483 struct rte_crypto_vec vec[UINT8_MAX];
484
485 sop = op->sym;
486
487 n = rte_crypto_mbuf_to_vec(sop->m_src, sop->auth.data.offset,
488 sop->auth.data.length, vec, RTE_DIM(vec));
489
490 if (n < 0 || n != sop->m_src->nb_segs) {
491 op->status = RTE_CRYPTO_OP_STATUS_ERROR;
492 return;
493 }
494
495 sgl.vec = vec;
496 sgl.num = n;
497 symvec.src_sgl = &sgl;
498 symvec.iv = &iv_ptr;
499 symvec.digest = &digest_ptr;
500 symvec.status = &st;
501 symvec.num = 1;
502
503 iv_ptr.va = rte_crypto_op_ctod_offset(op, void *, IV_OFFSET);
504 digest_ptr.va = (void *)sop->auth.digest.data;
505
506 ofs.raw = 0;
507 ofs.ofs.cipher.head = sop->cipher.data.offset - sop->auth.data.offset;
508 ofs.ofs.cipher.tail = (sop->auth.data.offset + sop->auth.data.length) -
509 (sop->cipher.data.offset + sop->cipher.data.length);
510
511 n = rte_cryptodev_sym_cpu_crypto_process(dev_id, sop->session, ofs,
512 &symvec);
513
514 if (n != 1)
515 op->status = RTE_CRYPTO_OP_STATUS_AUTH_FAILED;
516 else
517 op->status = RTE_CRYPTO_OP_STATUS_SUCCESS;
518 }
519
520 static struct rte_crypto_op *
process_crypto_request(uint8_t dev_id,struct rte_crypto_op * op)521 process_crypto_request(uint8_t dev_id, struct rte_crypto_op *op)
522 {
523
524 RTE_VERIFY(gbl_action_type != RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO);
525
526 if (rte_cryptodev_enqueue_burst(dev_id, 0, &op, 1) != 1) {
527 RTE_LOG(ERR, USER1, "Error sending packet for encryption\n");
528 return NULL;
529 }
530
531 op = NULL;
532
533 while (rte_cryptodev_dequeue_burst(dev_id, 0, &op, 1) == 0)
534 rte_pause();
535
536 if (op->status != RTE_CRYPTO_OP_STATUS_SUCCESS) {
537 RTE_LOG(DEBUG, USER1, "Operation status %d\n", op->status);
538 return NULL;
539 }
540
541 return op;
542 }
543
544 static int
testsuite_setup(void)545 testsuite_setup(void)
546 {
547 struct crypto_testsuite_params *ts_params = &testsuite_params;
548 struct rte_cryptodev_info info;
549 uint32_t i = 0, nb_devs, dev_id;
550 uint16_t qp_id;
551
552 memset(ts_params, 0, sizeof(*ts_params));
553
554 ts_params->mbuf_pool = rte_mempool_lookup("CRYPTO_MBUFPOOL");
555 if (ts_params->mbuf_pool == NULL) {
556 /* Not already created so create */
557 ts_params->mbuf_pool = rte_pktmbuf_pool_create(
558 "CRYPTO_MBUFPOOL",
559 NUM_MBUFS, MBUF_CACHE_SIZE, 0, MBUF_SIZE,
560 rte_socket_id());
561 if (ts_params->mbuf_pool == NULL) {
562 RTE_LOG(ERR, USER1, "Can't create CRYPTO_MBUFPOOL\n");
563 return TEST_FAILED;
564 }
565 }
566
567 ts_params->large_mbuf_pool = rte_mempool_lookup(
568 "CRYPTO_LARGE_MBUFPOOL");
569 if (ts_params->large_mbuf_pool == NULL) {
570 /* Not already created so create */
571 ts_params->large_mbuf_pool = rte_pktmbuf_pool_create(
572 "CRYPTO_LARGE_MBUFPOOL",
573 1, 0, 0, UINT16_MAX,
574 rte_socket_id());
575 if (ts_params->large_mbuf_pool == NULL) {
576 RTE_LOG(ERR, USER1,
577 "Can't create CRYPTO_LARGE_MBUFPOOL\n");
578 return TEST_FAILED;
579 }
580 }
581
582 ts_params->op_mpool = rte_crypto_op_pool_create(
583 "MBUF_CRYPTO_SYM_OP_POOL",
584 RTE_CRYPTO_OP_TYPE_SYMMETRIC,
585 NUM_MBUFS, MBUF_CACHE_SIZE,
586 DEFAULT_NUM_XFORMS *
587 sizeof(struct rte_crypto_sym_xform) +
588 MAXIMUM_IV_LENGTH,
589 rte_socket_id());
590 if (ts_params->op_mpool == NULL) {
591 RTE_LOG(ERR, USER1, "Can't create CRYPTO_OP_POOL\n");
592 return TEST_FAILED;
593 }
594
595 nb_devs = rte_cryptodev_count();
596 if (nb_devs < 1) {
597 RTE_LOG(WARNING, USER1, "No crypto devices found?\n");
598 return TEST_SKIPPED;
599 }
600
601 if (rte_cryptodev_device_count_by_driver(gbl_driver_id) < 1) {
602 RTE_LOG(WARNING, USER1, "No %s devices found?\n",
603 rte_cryptodev_driver_name_get(gbl_driver_id));
604 return TEST_SKIPPED;
605 }
606
607 /* Create list of valid crypto devs */
608 for (i = 0; i < nb_devs; i++) {
609 rte_cryptodev_info_get(i, &info);
610 if (info.driver_id == gbl_driver_id)
611 ts_params->valid_devs[ts_params->valid_dev_count++] = i;
612 }
613
614 if (ts_params->valid_dev_count < 1)
615 return TEST_FAILED;
616
617 /* Set up all the qps on the first of the valid devices found */
618
619 dev_id = ts_params->valid_devs[0];
620
621 rte_cryptodev_info_get(dev_id, &info);
622
623 ts_params->conf.nb_queue_pairs = info.max_nb_queue_pairs;
624 ts_params->conf.socket_id = SOCKET_ID_ANY;
625 ts_params->conf.ff_disable = RTE_CRYPTODEV_FF_SECURITY;
626
627 unsigned int session_size =
628 rte_cryptodev_sym_get_private_session_size(dev_id);
629
630 #ifdef RTE_LIB_SECURITY
631 unsigned int security_session_size = rte_security_session_get_size(
632 rte_cryptodev_get_sec_ctx(dev_id));
633
634 if (session_size < security_session_size)
635 session_size = security_session_size;
636 #endif
637 /*
638 * Create mempool with maximum number of sessions.
639 */
640 if (info.sym.max_nb_sessions != 0 &&
641 info.sym.max_nb_sessions < MAX_NB_SESSIONS) {
642 RTE_LOG(ERR, USER1, "Device does not support "
643 "at least %u sessions\n",
644 MAX_NB_SESSIONS);
645 return TEST_FAILED;
646 }
647
648 ts_params->session_mpool = rte_cryptodev_sym_session_pool_create(
649 "test_sess_mp", MAX_NB_SESSIONS, 0, 0, 0,
650 SOCKET_ID_ANY);
651 TEST_ASSERT_NOT_NULL(ts_params->session_mpool,
652 "session mempool allocation failed");
653
654 ts_params->session_priv_mpool = rte_mempool_create(
655 "test_sess_mp_priv",
656 MAX_NB_SESSIONS,
657 session_size,
658 0, 0, NULL, NULL, NULL,
659 NULL, SOCKET_ID_ANY,
660 0);
661 TEST_ASSERT_NOT_NULL(ts_params->session_priv_mpool,
662 "session mempool allocation failed");
663
664
665
666 TEST_ASSERT_SUCCESS(rte_cryptodev_configure(dev_id,
667 &ts_params->conf),
668 "Failed to configure cryptodev %u with %u qps",
669 dev_id, ts_params->conf.nb_queue_pairs);
670
671 ts_params->qp_conf.nb_descriptors = MAX_NUM_OPS_INFLIGHT;
672 ts_params->qp_conf.mp_session = ts_params->session_mpool;
673 ts_params->qp_conf.mp_session_private = ts_params->session_priv_mpool;
674
675 for (qp_id = 0; qp_id < info.max_nb_queue_pairs; qp_id++) {
676 TEST_ASSERT_SUCCESS(rte_cryptodev_queue_pair_setup(
677 dev_id, qp_id, &ts_params->qp_conf,
678 rte_cryptodev_socket_id(dev_id)),
679 "Failed to setup queue pair %u on cryptodev %u",
680 qp_id, dev_id);
681 }
682
683 return TEST_SUCCESS;
684 }
685
686 static void
testsuite_teardown(void)687 testsuite_teardown(void)
688 {
689 struct crypto_testsuite_params *ts_params = &testsuite_params;
690 int res;
691
692 if (ts_params->mbuf_pool != NULL) {
693 RTE_LOG(DEBUG, USER1, "CRYPTO_MBUFPOOL count %u\n",
694 rte_mempool_avail_count(ts_params->mbuf_pool));
695 }
696
697 if (ts_params->op_mpool != NULL) {
698 RTE_LOG(DEBUG, USER1, "CRYPTO_OP_POOL count %u\n",
699 rte_mempool_avail_count(ts_params->op_mpool));
700 }
701
702 /* Free session mempools */
703 if (ts_params->session_priv_mpool != NULL) {
704 rte_mempool_free(ts_params->session_priv_mpool);
705 ts_params->session_priv_mpool = NULL;
706 }
707
708 if (ts_params->session_mpool != NULL) {
709 rte_mempool_free(ts_params->session_mpool);
710 ts_params->session_mpool = NULL;
711 }
712
713 res = rte_cryptodev_close(ts_params->valid_devs[0]);
714 if (res)
715 RTE_LOG(ERR, USER1, "Crypto device close error %d\n", res);
716 }
717
718 static int
check_capabilities_supported(enum rte_crypto_sym_xform_type type,const int * algs,uint16_t num_algs)719 check_capabilities_supported(enum rte_crypto_sym_xform_type type,
720 const int *algs, uint16_t num_algs)
721 {
722 uint8_t dev_id = testsuite_params.valid_devs[0];
723 bool some_alg_supported = FALSE;
724 uint16_t i;
725
726 for (i = 0; i < num_algs && !some_alg_supported; i++) {
727 struct rte_cryptodev_sym_capability_idx alg = {
728 type, {algs[i]}
729 };
730 if (rte_cryptodev_sym_capability_get(dev_id,
731 &alg) != NULL)
732 some_alg_supported = TRUE;
733 }
734 if (!some_alg_supported)
735 return TEST_SKIPPED;
736
737 return 0;
738 }
739
740 int
check_cipher_capabilities_supported(const enum rte_crypto_cipher_algorithm * ciphers,uint16_t num_ciphers)741 check_cipher_capabilities_supported(const enum rte_crypto_cipher_algorithm *ciphers,
742 uint16_t num_ciphers)
743 {
744 return check_capabilities_supported(RTE_CRYPTO_SYM_XFORM_CIPHER,
745 (const int *) ciphers, num_ciphers);
746 }
747
748 int
check_auth_capabilities_supported(const enum rte_crypto_auth_algorithm * auths,uint16_t num_auths)749 check_auth_capabilities_supported(const enum rte_crypto_auth_algorithm *auths,
750 uint16_t num_auths)
751 {
752 return check_capabilities_supported(RTE_CRYPTO_SYM_XFORM_AUTH,
753 (const int *) auths, num_auths);
754 }
755
756 int
check_aead_capabilities_supported(const enum rte_crypto_aead_algorithm * aeads,uint16_t num_aeads)757 check_aead_capabilities_supported(const enum rte_crypto_aead_algorithm *aeads,
758 uint16_t num_aeads)
759 {
760 return check_capabilities_supported(RTE_CRYPTO_SYM_XFORM_AEAD,
761 (const int *) aeads, num_aeads);
762 }
763
764 static int
null_testsuite_setup(void)765 null_testsuite_setup(void)
766 {
767 struct crypto_testsuite_params *ts_params = &testsuite_params;
768 uint8_t dev_id = ts_params->valid_devs[0];
769 struct rte_cryptodev_info dev_info;
770 const enum rte_crypto_cipher_algorithm ciphers[] = {
771 RTE_CRYPTO_CIPHER_NULL
772 };
773 const enum rte_crypto_auth_algorithm auths[] = {
774 RTE_CRYPTO_AUTH_NULL
775 };
776
777 rte_cryptodev_info_get(dev_id, &dev_info);
778
779 if (!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYMMETRIC_CRYPTO)) {
780 RTE_LOG(INFO, USER1, "Feature flag requirements for NULL "
781 "testsuite not met\n");
782 return TEST_SKIPPED;
783 }
784
785 if (check_cipher_capabilities_supported(ciphers, RTE_DIM(ciphers)) != 0
786 && check_auth_capabilities_supported(auths,
787 RTE_DIM(auths)) != 0) {
788 RTE_LOG(INFO, USER1, "Capability requirements for NULL "
789 "testsuite not met\n");
790 return TEST_SKIPPED;
791 }
792
793 return 0;
794 }
795
796 static int
crypto_gen_testsuite_setup(void)797 crypto_gen_testsuite_setup(void)
798 {
799 struct crypto_testsuite_params *ts_params = &testsuite_params;
800 uint8_t dev_id = ts_params->valid_devs[0];
801 struct rte_cryptodev_info dev_info;
802
803 rte_cryptodev_info_get(dev_id, &dev_info);
804
805 if (!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYMMETRIC_CRYPTO)) {
806 RTE_LOG(INFO, USER1, "Feature flag requirements for Crypto Gen "
807 "testsuite not met\n");
808 return TEST_SKIPPED;
809 }
810
811 return 0;
812 }
813
814 #ifdef RTE_LIB_SECURITY
815 static int
ipsec_proto_testsuite_setup(void)816 ipsec_proto_testsuite_setup(void)
817 {
818 struct crypto_testsuite_params *ts_params = &testsuite_params;
819 struct crypto_unittest_params *ut_params = &unittest_params;
820 struct rte_cryptodev_info dev_info;
821 int ret = 0;
822
823 rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
824
825 if (!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SECURITY)) {
826 RTE_LOG(INFO, USER1, "Feature flag requirements for IPsec Proto "
827 "testsuite not met\n");
828 return TEST_SKIPPED;
829 }
830
831 /* Reconfigure to enable security */
832 ret = dev_configure_and_start(0);
833 if (ret != TEST_SUCCESS)
834 return ret;
835
836 /* Set action type */
837 ut_params->type = RTE_SECURITY_ACTION_TYPE_LOOKASIDE_PROTOCOL;
838
839 if (security_proto_supported(
840 RTE_SECURITY_ACTION_TYPE_LOOKASIDE_PROTOCOL,
841 RTE_SECURITY_PROTOCOL_IPSEC) < 0) {
842 RTE_LOG(INFO, USER1, "Capability requirements for IPsec Proto "
843 "test not met\n");
844 ret = TEST_SKIPPED;
845 }
846
847 test_ipsec_alg_list_populate();
848 test_ipsec_ah_alg_list_populate();
849
850 /*
851 * Stop the device. Device would be started again by individual test
852 * case setup routine.
853 */
854 rte_cryptodev_stop(ts_params->valid_devs[0]);
855
856 return ret;
857 }
858
859 static int
pdcp_proto_testsuite_setup(void)860 pdcp_proto_testsuite_setup(void)
861 {
862 struct crypto_testsuite_params *ts_params = &testsuite_params;
863 uint8_t dev_id = ts_params->valid_devs[0];
864 struct rte_cryptodev_info dev_info;
865 const enum rte_crypto_cipher_algorithm ciphers[] = {
866 RTE_CRYPTO_CIPHER_NULL,
867 RTE_CRYPTO_CIPHER_AES_CTR,
868 RTE_CRYPTO_CIPHER_ZUC_EEA3,
869 RTE_CRYPTO_CIPHER_SNOW3G_UEA2
870 };
871 const enum rte_crypto_auth_algorithm auths[] = {
872 RTE_CRYPTO_AUTH_NULL,
873 RTE_CRYPTO_AUTH_SNOW3G_UIA2,
874 RTE_CRYPTO_AUTH_AES_CMAC,
875 RTE_CRYPTO_AUTH_ZUC_EIA3
876 };
877
878 rte_cryptodev_info_get(dev_id, &dev_info);
879
880 if (!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYMMETRIC_CRYPTO) ||
881 !(dev_info.feature_flags &
882 RTE_CRYPTODEV_FF_SECURITY)) {
883 RTE_LOG(INFO, USER1, "Feature flag requirements for PDCP Proto "
884 "testsuite not met\n");
885 return TEST_SKIPPED;
886 }
887
888 if (check_cipher_capabilities_supported(ciphers, RTE_DIM(ciphers)) != 0
889 && check_auth_capabilities_supported(auths,
890 RTE_DIM(auths)) != 0) {
891 RTE_LOG(INFO, USER1, "Capability requirements for PDCP Proto "
892 "testsuite not met\n");
893 return TEST_SKIPPED;
894 }
895
896 return 0;
897 }
898
899 static int
docsis_proto_testsuite_setup(void)900 docsis_proto_testsuite_setup(void)
901 {
902 struct crypto_testsuite_params *ts_params = &testsuite_params;
903 uint8_t dev_id = ts_params->valid_devs[0];
904 struct rte_cryptodev_info dev_info;
905 const enum rte_crypto_cipher_algorithm ciphers[] = {
906 RTE_CRYPTO_CIPHER_AES_DOCSISBPI
907 };
908
909 rte_cryptodev_info_get(dev_id, &dev_info);
910
911 if (!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYMMETRIC_CRYPTO) ||
912 !(dev_info.feature_flags &
913 RTE_CRYPTODEV_FF_SECURITY)) {
914 RTE_LOG(INFO, USER1, "Feature flag requirements for DOCSIS "
915 "Proto testsuite not met\n");
916 return TEST_SKIPPED;
917 }
918
919 if (check_cipher_capabilities_supported(ciphers, RTE_DIM(ciphers)) != 0) {
920 RTE_LOG(INFO, USER1, "Capability requirements for DOCSIS Proto "
921 "testsuite not met\n");
922 return TEST_SKIPPED;
923 }
924
925 return 0;
926 }
927 #endif
928
929 static int
aes_ccm_auth_testsuite_setup(void)930 aes_ccm_auth_testsuite_setup(void)
931 {
932 struct crypto_testsuite_params *ts_params = &testsuite_params;
933 uint8_t dev_id = ts_params->valid_devs[0];
934 struct rte_cryptodev_info dev_info;
935 const enum rte_crypto_aead_algorithm aeads[] = {
936 RTE_CRYPTO_AEAD_AES_CCM
937 };
938
939 rte_cryptodev_info_get(dev_id, &dev_info);
940
941 if (!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYMMETRIC_CRYPTO) ||
942 ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
943 !(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
944 RTE_LOG(INFO, USER1, "Feature flag requirements for AES CCM "
945 "testsuite not met\n");
946 return TEST_SKIPPED;
947 }
948
949 if (check_aead_capabilities_supported(aeads, RTE_DIM(aeads)) != 0) {
950 RTE_LOG(INFO, USER1, "Capability requirements for AES CCM "
951 "testsuite not met\n");
952 return TEST_SKIPPED;
953 }
954
955 return 0;
956 }
957
958 static int
aes_gcm_auth_testsuite_setup(void)959 aes_gcm_auth_testsuite_setup(void)
960 {
961 struct crypto_testsuite_params *ts_params = &testsuite_params;
962 uint8_t dev_id = ts_params->valid_devs[0];
963 struct rte_cryptodev_info dev_info;
964 const enum rte_crypto_aead_algorithm aeads[] = {
965 RTE_CRYPTO_AEAD_AES_GCM
966 };
967
968 rte_cryptodev_info_get(dev_id, &dev_info);
969
970 if (!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYMMETRIC_CRYPTO)) {
971 RTE_LOG(INFO, USER1, "Feature flag requirements for AES GCM "
972 "testsuite not met\n");
973 return TEST_SKIPPED;
974 }
975
976 if (check_aead_capabilities_supported(aeads, RTE_DIM(aeads)) != 0) {
977 RTE_LOG(INFO, USER1, "Capability requirements for AES GCM "
978 "testsuite not met\n");
979 return TEST_SKIPPED;
980 }
981
982 return 0;
983 }
984
985 static int
aes_gmac_auth_testsuite_setup(void)986 aes_gmac_auth_testsuite_setup(void)
987 {
988 struct crypto_testsuite_params *ts_params = &testsuite_params;
989 uint8_t dev_id = ts_params->valid_devs[0];
990 struct rte_cryptodev_info dev_info;
991 const enum rte_crypto_auth_algorithm auths[] = {
992 RTE_CRYPTO_AUTH_AES_GMAC
993 };
994
995 rte_cryptodev_info_get(dev_id, &dev_info);
996
997 if (!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYMMETRIC_CRYPTO) ||
998 ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
999 !(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
1000 RTE_LOG(INFO, USER1, "Feature flag requirements for AES GMAC "
1001 "testsuite not met\n");
1002 return TEST_SKIPPED;
1003 }
1004
1005 if (check_auth_capabilities_supported(auths, RTE_DIM(auths)) != 0) {
1006 RTE_LOG(INFO, USER1, "Capability requirements for AES GMAC "
1007 "testsuite not met\n");
1008 return TEST_SKIPPED;
1009 }
1010
1011 return 0;
1012 }
1013
1014 static int
chacha20_poly1305_testsuite_setup(void)1015 chacha20_poly1305_testsuite_setup(void)
1016 {
1017 struct crypto_testsuite_params *ts_params = &testsuite_params;
1018 uint8_t dev_id = ts_params->valid_devs[0];
1019 struct rte_cryptodev_info dev_info;
1020 const enum rte_crypto_aead_algorithm aeads[] = {
1021 RTE_CRYPTO_AEAD_CHACHA20_POLY1305
1022 };
1023
1024 rte_cryptodev_info_get(dev_id, &dev_info);
1025
1026 if (!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYMMETRIC_CRYPTO) ||
1027 ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
1028 !(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
1029 RTE_LOG(INFO, USER1, "Feature flag requirements for "
1030 "Chacha20-Poly1305 testsuite not met\n");
1031 return TEST_SKIPPED;
1032 }
1033
1034 if (check_aead_capabilities_supported(aeads, RTE_DIM(aeads)) != 0) {
1035 RTE_LOG(INFO, USER1, "Capability requirements for "
1036 "Chacha20-Poly1305 testsuite not met\n");
1037 return TEST_SKIPPED;
1038 }
1039
1040 return 0;
1041 }
1042
1043 static int
snow3g_testsuite_setup(void)1044 snow3g_testsuite_setup(void)
1045 {
1046 struct crypto_testsuite_params *ts_params = &testsuite_params;
1047 uint8_t dev_id = ts_params->valid_devs[0];
1048 struct rte_cryptodev_info dev_info;
1049 const enum rte_crypto_cipher_algorithm ciphers[] = {
1050 RTE_CRYPTO_CIPHER_SNOW3G_UEA2
1051
1052 };
1053 const enum rte_crypto_auth_algorithm auths[] = {
1054 RTE_CRYPTO_AUTH_SNOW3G_UIA2
1055 };
1056
1057 rte_cryptodev_info_get(dev_id, &dev_info);
1058
1059 if (!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYMMETRIC_CRYPTO)) {
1060 RTE_LOG(INFO, USER1, "Feature flag requirements for Snow3G "
1061 "testsuite not met\n");
1062 return TEST_SKIPPED;
1063 }
1064
1065 if (check_cipher_capabilities_supported(ciphers, RTE_DIM(ciphers)) != 0
1066 && check_auth_capabilities_supported(auths,
1067 RTE_DIM(auths)) != 0) {
1068 RTE_LOG(INFO, USER1, "Capability requirements for Snow3G "
1069 "testsuite not met\n");
1070 return TEST_SKIPPED;
1071 }
1072
1073 return 0;
1074 }
1075
1076 static int
zuc_testsuite_setup(void)1077 zuc_testsuite_setup(void)
1078 {
1079 struct crypto_testsuite_params *ts_params = &testsuite_params;
1080 uint8_t dev_id = ts_params->valid_devs[0];
1081 struct rte_cryptodev_info dev_info;
1082 const enum rte_crypto_cipher_algorithm ciphers[] = {
1083 RTE_CRYPTO_CIPHER_ZUC_EEA3
1084 };
1085 const enum rte_crypto_auth_algorithm auths[] = {
1086 RTE_CRYPTO_AUTH_ZUC_EIA3
1087 };
1088
1089 rte_cryptodev_info_get(dev_id, &dev_info);
1090
1091 if (!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYMMETRIC_CRYPTO)) {
1092 RTE_LOG(INFO, USER1, "Feature flag requirements for ZUC "
1093 "testsuite not met\n");
1094 return TEST_SKIPPED;
1095 }
1096
1097 if (check_cipher_capabilities_supported(ciphers, RTE_DIM(ciphers)) != 0
1098 && check_auth_capabilities_supported(auths,
1099 RTE_DIM(auths)) != 0) {
1100 RTE_LOG(INFO, USER1, "Capability requirements for ZUC "
1101 "testsuite not met\n");
1102 return TEST_SKIPPED;
1103 }
1104
1105 return 0;
1106 }
1107
1108 static int
hmac_md5_auth_testsuite_setup(void)1109 hmac_md5_auth_testsuite_setup(void)
1110 {
1111 struct crypto_testsuite_params *ts_params = &testsuite_params;
1112 uint8_t dev_id = ts_params->valid_devs[0];
1113 struct rte_cryptodev_info dev_info;
1114 const enum rte_crypto_auth_algorithm auths[] = {
1115 RTE_CRYPTO_AUTH_MD5_HMAC
1116 };
1117
1118 rte_cryptodev_info_get(dev_id, &dev_info);
1119
1120 if (!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYMMETRIC_CRYPTO) ||
1121 ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
1122 !(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
1123 RTE_LOG(INFO, USER1, "Feature flag requirements for HMAC MD5 "
1124 "Auth testsuite not met\n");
1125 return TEST_SKIPPED;
1126 }
1127
1128 if (check_auth_capabilities_supported(auths, RTE_DIM(auths)) != 0) {
1129 RTE_LOG(INFO, USER1, "Capability requirements for HMAC MD5 "
1130 "testsuite not met\n");
1131 return TEST_SKIPPED;
1132 }
1133
1134 return 0;
1135 }
1136
1137 static int
kasumi_testsuite_setup(void)1138 kasumi_testsuite_setup(void)
1139 {
1140 struct crypto_testsuite_params *ts_params = &testsuite_params;
1141 uint8_t dev_id = ts_params->valid_devs[0];
1142 struct rte_cryptodev_info dev_info;
1143 const enum rte_crypto_cipher_algorithm ciphers[] = {
1144 RTE_CRYPTO_CIPHER_KASUMI_F8
1145 };
1146 const enum rte_crypto_auth_algorithm auths[] = {
1147 RTE_CRYPTO_AUTH_KASUMI_F9
1148 };
1149
1150 rte_cryptodev_info_get(dev_id, &dev_info);
1151
1152 if (!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYMMETRIC_CRYPTO) ||
1153 ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
1154 !(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
1155 RTE_LOG(INFO, USER1, "Feature flag requirements for Kasumi "
1156 "testsuite not met\n");
1157 return TEST_SKIPPED;
1158 }
1159
1160 if (check_cipher_capabilities_supported(ciphers, RTE_DIM(ciphers)) != 0
1161 && check_auth_capabilities_supported(auths,
1162 RTE_DIM(auths)) != 0) {
1163 RTE_LOG(INFO, USER1, "Capability requirements for Kasumi "
1164 "testsuite not met\n");
1165 return TEST_SKIPPED;
1166 }
1167
1168 return 0;
1169 }
1170
1171 static int
negative_aes_gcm_testsuite_setup(void)1172 negative_aes_gcm_testsuite_setup(void)
1173 {
1174 struct crypto_testsuite_params *ts_params = &testsuite_params;
1175 uint8_t dev_id = ts_params->valid_devs[0];
1176 struct rte_cryptodev_info dev_info;
1177 const enum rte_crypto_aead_algorithm aeads[] = {
1178 RTE_CRYPTO_AEAD_AES_GCM
1179 };
1180
1181 rte_cryptodev_info_get(dev_id, &dev_info);
1182
1183 if (!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYMMETRIC_CRYPTO) ||
1184 ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
1185 !(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
1186 RTE_LOG(INFO, USER1, "Feature flag requirements for Negative "
1187 "AES GCM testsuite not met\n");
1188 return TEST_SKIPPED;
1189 }
1190
1191 if (check_aead_capabilities_supported(aeads, RTE_DIM(aeads)) != 0) {
1192 RTE_LOG(INFO, USER1, "Capability requirements for Negative "
1193 "AES GCM testsuite not met\n");
1194 return TEST_SKIPPED;
1195 }
1196
1197 return 0;
1198 }
1199
1200 static int
negative_aes_gmac_testsuite_setup(void)1201 negative_aes_gmac_testsuite_setup(void)
1202 {
1203 struct crypto_testsuite_params *ts_params = &testsuite_params;
1204 uint8_t dev_id = ts_params->valid_devs[0];
1205 struct rte_cryptodev_info dev_info;
1206 const enum rte_crypto_auth_algorithm auths[] = {
1207 RTE_CRYPTO_AUTH_AES_GMAC
1208 };
1209
1210 rte_cryptodev_info_get(dev_id, &dev_info);
1211
1212 if (!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYMMETRIC_CRYPTO) ||
1213 ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
1214 !(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
1215 RTE_LOG(INFO, USER1, "Feature flag requirements for Negative "
1216 "AES GMAC testsuite not met\n");
1217 return TEST_SKIPPED;
1218 }
1219
1220 if (check_auth_capabilities_supported(auths, RTE_DIM(auths)) != 0) {
1221 RTE_LOG(INFO, USER1, "Capability requirements for Negative "
1222 "AES GMAC testsuite not met\n");
1223 return TEST_SKIPPED;
1224 }
1225
1226 return 0;
1227 }
1228
1229 static int
mixed_cipher_hash_testsuite_setup(void)1230 mixed_cipher_hash_testsuite_setup(void)
1231 {
1232 struct crypto_testsuite_params *ts_params = &testsuite_params;
1233 uint8_t dev_id = ts_params->valid_devs[0];
1234 struct rte_cryptodev_info dev_info;
1235 uint64_t feat_flags;
1236 const enum rte_crypto_cipher_algorithm ciphers[] = {
1237 RTE_CRYPTO_CIPHER_NULL,
1238 RTE_CRYPTO_CIPHER_AES_CTR,
1239 RTE_CRYPTO_CIPHER_ZUC_EEA3,
1240 RTE_CRYPTO_CIPHER_SNOW3G_UEA2
1241 };
1242 const enum rte_crypto_auth_algorithm auths[] = {
1243 RTE_CRYPTO_AUTH_NULL,
1244 RTE_CRYPTO_AUTH_SNOW3G_UIA2,
1245 RTE_CRYPTO_AUTH_AES_CMAC,
1246 RTE_CRYPTO_AUTH_ZUC_EIA3
1247 };
1248
1249 rte_cryptodev_info_get(dev_id, &dev_info);
1250 feat_flags = dev_info.feature_flags;
1251
1252 if (!(feat_flags & RTE_CRYPTODEV_FF_SYMMETRIC_CRYPTO) ||
1253 (global_api_test_type == CRYPTODEV_RAW_API_TEST)) {
1254 RTE_LOG(INFO, USER1, "Feature flag requirements for Mixed "
1255 "Cipher Hash testsuite not met\n");
1256 return TEST_SKIPPED;
1257 }
1258
1259 if (check_cipher_capabilities_supported(ciphers, RTE_DIM(ciphers)) != 0
1260 && check_auth_capabilities_supported(auths,
1261 RTE_DIM(auths)) != 0) {
1262 RTE_LOG(INFO, USER1, "Capability requirements for Mixed "
1263 "Cipher Hash testsuite not met\n");
1264 return TEST_SKIPPED;
1265 }
1266
1267 return 0;
1268 }
1269
1270 static int
esn_testsuite_setup(void)1271 esn_testsuite_setup(void)
1272 {
1273 struct crypto_testsuite_params *ts_params = &testsuite_params;
1274 uint8_t dev_id = ts_params->valid_devs[0];
1275 struct rte_cryptodev_info dev_info;
1276 const enum rte_crypto_cipher_algorithm ciphers[] = {
1277 RTE_CRYPTO_CIPHER_AES_CBC
1278 };
1279 const enum rte_crypto_auth_algorithm auths[] = {
1280 RTE_CRYPTO_AUTH_SHA1_HMAC
1281 };
1282
1283 rte_cryptodev_info_get(dev_id, &dev_info);
1284
1285 if (!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYMMETRIC_CRYPTO) ||
1286 ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
1287 !(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
1288 RTE_LOG(INFO, USER1, "Feature flag requirements for ESN "
1289 "testsuite not met\n");
1290 return TEST_SKIPPED;
1291 }
1292
1293 if (check_cipher_capabilities_supported(ciphers, RTE_DIM(ciphers)) != 0
1294 && check_auth_capabilities_supported(auths,
1295 RTE_DIM(auths)) != 0) {
1296 RTE_LOG(INFO, USER1, "Capability requirements for ESN "
1297 "testsuite not met\n");
1298 return TEST_SKIPPED;
1299 }
1300
1301 return 0;
1302 }
1303
1304 static int
multi_session_testsuite_setup(void)1305 multi_session_testsuite_setup(void)
1306 {
1307 struct crypto_testsuite_params *ts_params = &testsuite_params;
1308 uint8_t dev_id = ts_params->valid_devs[0];
1309 struct rte_cryptodev_info dev_info;
1310 const enum rte_crypto_cipher_algorithm ciphers[] = {
1311 RTE_CRYPTO_CIPHER_AES_CBC
1312 };
1313 const enum rte_crypto_auth_algorithm auths[] = {
1314 RTE_CRYPTO_AUTH_SHA512_HMAC
1315 };
1316
1317 rte_cryptodev_info_get(dev_id, &dev_info);
1318
1319 if (!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYMMETRIC_CRYPTO)) {
1320 RTE_LOG(INFO, USER1, "Feature flag requirements for Multi "
1321 "Session testsuite not met\n");
1322 return TEST_SKIPPED;
1323 }
1324
1325 if (check_cipher_capabilities_supported(ciphers, RTE_DIM(ciphers)) != 0
1326 && check_auth_capabilities_supported(auths,
1327 RTE_DIM(auths)) != 0) {
1328 RTE_LOG(INFO, USER1, "Capability requirements for Multi "
1329 "Session testsuite not met\n");
1330 return TEST_SKIPPED;
1331 }
1332
1333 return 0;
1334 }
1335
1336 static int
negative_hmac_sha1_testsuite_setup(void)1337 negative_hmac_sha1_testsuite_setup(void)
1338 {
1339 struct crypto_testsuite_params *ts_params = &testsuite_params;
1340 uint8_t dev_id = ts_params->valid_devs[0];
1341 struct rte_cryptodev_info dev_info;
1342 const enum rte_crypto_cipher_algorithm ciphers[] = {
1343 RTE_CRYPTO_CIPHER_AES_CBC
1344 };
1345 const enum rte_crypto_auth_algorithm auths[] = {
1346 RTE_CRYPTO_AUTH_SHA1_HMAC
1347 };
1348
1349 rte_cryptodev_info_get(dev_id, &dev_info);
1350
1351 if (!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYMMETRIC_CRYPTO) ||
1352 ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
1353 !(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
1354 RTE_LOG(INFO, USER1, "Feature flag requirements for Negative "
1355 "HMAC SHA1 testsuite not met\n");
1356 return TEST_SKIPPED;
1357 }
1358
1359 if (check_cipher_capabilities_supported(ciphers, RTE_DIM(ciphers)) != 0
1360 && check_auth_capabilities_supported(auths,
1361 RTE_DIM(auths)) != 0) {
1362 RTE_LOG(INFO, USER1, "Capability requirements for Negative "
1363 "HMAC SHA1 testsuite not met\n");
1364 return TEST_SKIPPED;
1365 }
1366
1367 return 0;
1368 }
1369
1370 static int
dev_configure_and_start(uint64_t ff_disable)1371 dev_configure_and_start(uint64_t ff_disable)
1372 {
1373 struct crypto_testsuite_params *ts_params = &testsuite_params;
1374 struct crypto_unittest_params *ut_params = &unittest_params;
1375
1376 uint16_t qp_id;
1377
1378 /* Clear unit test parameters before running test */
1379 memset(ut_params, 0, sizeof(*ut_params));
1380
1381 /* Reconfigure device to default parameters */
1382 ts_params->conf.socket_id = SOCKET_ID_ANY;
1383 ts_params->conf.ff_disable = ff_disable;
1384 ts_params->qp_conf.nb_descriptors = MAX_NUM_OPS_INFLIGHT;
1385 ts_params->qp_conf.mp_session = ts_params->session_mpool;
1386 ts_params->qp_conf.mp_session_private = ts_params->session_priv_mpool;
1387
1388 TEST_ASSERT_SUCCESS(rte_cryptodev_configure(ts_params->valid_devs[0],
1389 &ts_params->conf),
1390 "Failed to configure cryptodev %u",
1391 ts_params->valid_devs[0]);
1392
1393 for (qp_id = 0; qp_id < ts_params->conf.nb_queue_pairs ; qp_id++) {
1394 TEST_ASSERT_SUCCESS(rte_cryptodev_queue_pair_setup(
1395 ts_params->valid_devs[0], qp_id,
1396 &ts_params->qp_conf,
1397 rte_cryptodev_socket_id(ts_params->valid_devs[0])),
1398 "Failed to setup queue pair %u on cryptodev %u",
1399 qp_id, ts_params->valid_devs[0]);
1400 }
1401
1402
1403 rte_cryptodev_stats_reset(ts_params->valid_devs[0]);
1404
1405 /* Start the device */
1406 TEST_ASSERT_SUCCESS(rte_cryptodev_start(ts_params->valid_devs[0]),
1407 "Failed to start cryptodev %u",
1408 ts_params->valid_devs[0]);
1409
1410 return TEST_SUCCESS;
1411 }
1412
1413 int
ut_setup(void)1414 ut_setup(void)
1415 {
1416 /* Configure and start the device with security feature disabled */
1417 return dev_configure_and_start(RTE_CRYPTODEV_FF_SECURITY);
1418 }
1419
1420 static int
ut_setup_security(void)1421 ut_setup_security(void)
1422 {
1423 /* Configure and start the device with no features disabled */
1424 return dev_configure_and_start(0);
1425 }
1426
1427 void
ut_teardown(void)1428 ut_teardown(void)
1429 {
1430 struct crypto_testsuite_params *ts_params = &testsuite_params;
1431 struct crypto_unittest_params *ut_params = &unittest_params;
1432
1433 /* free crypto session structure */
1434 #ifdef RTE_LIB_SECURITY
1435 if (ut_params->type == RTE_SECURITY_ACTION_TYPE_LOOKASIDE_PROTOCOL) {
1436 if (ut_params->sec_session) {
1437 rte_security_session_destroy(rte_cryptodev_get_sec_ctx
1438 (ts_params->valid_devs[0]),
1439 ut_params->sec_session);
1440 ut_params->sec_session = NULL;
1441 }
1442 } else
1443 #endif
1444 {
1445 if (ut_params->sess) {
1446 rte_cryptodev_sym_session_clear(
1447 ts_params->valid_devs[0],
1448 ut_params->sess);
1449 rte_cryptodev_sym_session_free(ut_params->sess);
1450 ut_params->sess = NULL;
1451 }
1452 }
1453
1454 /* free crypto operation structure */
1455 if (ut_params->op)
1456 rte_crypto_op_free(ut_params->op);
1457
1458 /*
1459 * free mbuf - both obuf and ibuf are usually the same,
1460 * so check if they point at the same address is necessary,
1461 * to avoid freeing the mbuf twice.
1462 */
1463 if (ut_params->obuf) {
1464 rte_pktmbuf_free(ut_params->obuf);
1465 if (ut_params->ibuf == ut_params->obuf)
1466 ut_params->ibuf = 0;
1467 ut_params->obuf = 0;
1468 }
1469 if (ut_params->ibuf) {
1470 rte_pktmbuf_free(ut_params->ibuf);
1471 ut_params->ibuf = 0;
1472 }
1473
1474 if (ts_params->mbuf_pool != NULL)
1475 RTE_LOG(DEBUG, USER1, "CRYPTO_MBUFPOOL count %u\n",
1476 rte_mempool_avail_count(ts_params->mbuf_pool));
1477
1478 /* Stop the device */
1479 rte_cryptodev_stop(ts_params->valid_devs[0]);
1480 }
1481
1482 static int
test_device_configure_invalid_dev_id(void)1483 test_device_configure_invalid_dev_id(void)
1484 {
1485 struct crypto_testsuite_params *ts_params = &testsuite_params;
1486 uint16_t dev_id, num_devs = 0;
1487
1488 TEST_ASSERT((num_devs = rte_cryptodev_count()) >= 1,
1489 "Need at least %d devices for test", 1);
1490
1491 /* valid dev_id values */
1492 dev_id = ts_params->valid_devs[0];
1493
1494 /* Stop the device in case it's started so it can be configured */
1495 rte_cryptodev_stop(dev_id);
1496
1497 TEST_ASSERT_SUCCESS(rte_cryptodev_configure(dev_id, &ts_params->conf),
1498 "Failed test for rte_cryptodev_configure: "
1499 "invalid dev_num %u", dev_id);
1500
1501 /* invalid dev_id values */
1502 dev_id = num_devs;
1503
1504 TEST_ASSERT_FAIL(rte_cryptodev_configure(dev_id, &ts_params->conf),
1505 "Failed test for rte_cryptodev_configure: "
1506 "invalid dev_num %u", dev_id);
1507
1508 dev_id = 0xff;
1509
1510 TEST_ASSERT_FAIL(rte_cryptodev_configure(dev_id, &ts_params->conf),
1511 "Failed test for rte_cryptodev_configure:"
1512 "invalid dev_num %u", dev_id);
1513
1514 return TEST_SUCCESS;
1515 }
1516
1517 static int
test_device_configure_invalid_queue_pair_ids(void)1518 test_device_configure_invalid_queue_pair_ids(void)
1519 {
1520 struct crypto_testsuite_params *ts_params = &testsuite_params;
1521 uint16_t orig_nb_qps = ts_params->conf.nb_queue_pairs;
1522
1523 /* Stop the device in case it's started so it can be configured */
1524 rte_cryptodev_stop(ts_params->valid_devs[0]);
1525
1526 /* valid - max value queue pairs */
1527 ts_params->conf.nb_queue_pairs = orig_nb_qps;
1528
1529 TEST_ASSERT_SUCCESS(rte_cryptodev_configure(ts_params->valid_devs[0],
1530 &ts_params->conf),
1531 "Failed to configure cryptodev: dev_id %u, qp_id %u",
1532 ts_params->valid_devs[0], ts_params->conf.nb_queue_pairs);
1533
1534 /* valid - one queue pairs */
1535 ts_params->conf.nb_queue_pairs = 1;
1536
1537 TEST_ASSERT_SUCCESS(rte_cryptodev_configure(ts_params->valid_devs[0],
1538 &ts_params->conf),
1539 "Failed to configure cryptodev: dev_id %u, qp_id %u",
1540 ts_params->valid_devs[0],
1541 ts_params->conf.nb_queue_pairs);
1542
1543
1544 /* invalid - zero queue pairs */
1545 ts_params->conf.nb_queue_pairs = 0;
1546
1547 TEST_ASSERT_FAIL(rte_cryptodev_configure(ts_params->valid_devs[0],
1548 &ts_params->conf),
1549 "Failed test for rte_cryptodev_configure, dev_id %u,"
1550 " invalid qps: %u",
1551 ts_params->valid_devs[0],
1552 ts_params->conf.nb_queue_pairs);
1553
1554
1555 /* invalid - max value supported by field queue pairs */
1556 ts_params->conf.nb_queue_pairs = UINT16_MAX;
1557
1558 TEST_ASSERT_FAIL(rte_cryptodev_configure(ts_params->valid_devs[0],
1559 &ts_params->conf),
1560 "Failed test for rte_cryptodev_configure, dev_id %u,"
1561 " invalid qps: %u",
1562 ts_params->valid_devs[0],
1563 ts_params->conf.nb_queue_pairs);
1564
1565
1566 /* invalid - max value + 1 queue pairs */
1567 ts_params->conf.nb_queue_pairs = orig_nb_qps + 1;
1568
1569 TEST_ASSERT_FAIL(rte_cryptodev_configure(ts_params->valid_devs[0],
1570 &ts_params->conf),
1571 "Failed test for rte_cryptodev_configure, dev_id %u,"
1572 " invalid qps: %u",
1573 ts_params->valid_devs[0],
1574 ts_params->conf.nb_queue_pairs);
1575
1576 /* revert to original testsuite value */
1577 ts_params->conf.nb_queue_pairs = orig_nb_qps;
1578
1579 return TEST_SUCCESS;
1580 }
1581
1582 static int
test_queue_pair_descriptor_setup(void)1583 test_queue_pair_descriptor_setup(void)
1584 {
1585 struct crypto_testsuite_params *ts_params = &testsuite_params;
1586 struct rte_cryptodev_qp_conf qp_conf = {
1587 .nb_descriptors = MAX_NUM_OPS_INFLIGHT
1588 };
1589 uint16_t qp_id;
1590
1591 /* Stop the device in case it's started so it can be configured */
1592 rte_cryptodev_stop(ts_params->valid_devs[0]);
1593
1594 TEST_ASSERT_SUCCESS(rte_cryptodev_configure(ts_params->valid_devs[0],
1595 &ts_params->conf),
1596 "Failed to configure cryptodev %u",
1597 ts_params->valid_devs[0]);
1598
1599 /*
1600 * Test various ring sizes on this device. memzones can't be
1601 * freed so are re-used if ring is released and re-created.
1602 */
1603 qp_conf.nb_descriptors = MIN_NUM_OPS_INFLIGHT; /* min size*/
1604 qp_conf.mp_session = ts_params->session_mpool;
1605 qp_conf.mp_session_private = ts_params->session_priv_mpool;
1606
1607 for (qp_id = 0; qp_id < ts_params->conf.nb_queue_pairs; qp_id++) {
1608 TEST_ASSERT_SUCCESS(rte_cryptodev_queue_pair_setup(
1609 ts_params->valid_devs[0], qp_id, &qp_conf,
1610 rte_cryptodev_socket_id(
1611 ts_params->valid_devs[0])),
1612 "Failed test for "
1613 "rte_cryptodev_queue_pair_setup: num_inflights "
1614 "%u on qp %u on cryptodev %u",
1615 qp_conf.nb_descriptors, qp_id,
1616 ts_params->valid_devs[0]);
1617 }
1618
1619 qp_conf.nb_descriptors = (uint32_t)(MAX_NUM_OPS_INFLIGHT / 2);
1620
1621 for (qp_id = 0; qp_id < ts_params->conf.nb_queue_pairs; qp_id++) {
1622 TEST_ASSERT_SUCCESS(rte_cryptodev_queue_pair_setup(
1623 ts_params->valid_devs[0], qp_id, &qp_conf,
1624 rte_cryptodev_socket_id(
1625 ts_params->valid_devs[0])),
1626 "Failed test for"
1627 " rte_cryptodev_queue_pair_setup: num_inflights"
1628 " %u on qp %u on cryptodev %u",
1629 qp_conf.nb_descriptors, qp_id,
1630 ts_params->valid_devs[0]);
1631 }
1632
1633 qp_conf.nb_descriptors = MAX_NUM_OPS_INFLIGHT; /* valid */
1634
1635 for (qp_id = 0; qp_id < ts_params->conf.nb_queue_pairs; qp_id++) {
1636 TEST_ASSERT_SUCCESS(rte_cryptodev_queue_pair_setup(
1637 ts_params->valid_devs[0], qp_id, &qp_conf,
1638 rte_cryptodev_socket_id(
1639 ts_params->valid_devs[0])),
1640 "Failed test for "
1641 "rte_cryptodev_queue_pair_setup: num_inflights"
1642 " %u on qp %u on cryptodev %u",
1643 qp_conf.nb_descriptors, qp_id,
1644 ts_params->valid_devs[0]);
1645 }
1646
1647 qp_conf.nb_descriptors = DEFAULT_NUM_OPS_INFLIGHT;
1648
1649 for (qp_id = 0; qp_id < ts_params->conf.nb_queue_pairs; qp_id++) {
1650 TEST_ASSERT_SUCCESS(rte_cryptodev_queue_pair_setup(
1651 ts_params->valid_devs[0], qp_id, &qp_conf,
1652 rte_cryptodev_socket_id(
1653 ts_params->valid_devs[0])),
1654 "Failed test for"
1655 " rte_cryptodev_queue_pair_setup:"
1656 "num_inflights %u on qp %u on cryptodev %u",
1657 qp_conf.nb_descriptors, qp_id,
1658 ts_params->valid_devs[0]);
1659 }
1660
1661 /* test invalid queue pair id */
1662 qp_conf.nb_descriptors = DEFAULT_NUM_OPS_INFLIGHT; /*valid */
1663
1664 qp_id = ts_params->conf.nb_queue_pairs; /*invalid */
1665
1666 TEST_ASSERT_FAIL(rte_cryptodev_queue_pair_setup(
1667 ts_params->valid_devs[0],
1668 qp_id, &qp_conf,
1669 rte_cryptodev_socket_id(ts_params->valid_devs[0])),
1670 "Failed test for rte_cryptodev_queue_pair_setup:"
1671 "invalid qp %u on cryptodev %u",
1672 qp_id, ts_params->valid_devs[0]);
1673
1674 qp_id = 0xffff; /*invalid*/
1675
1676 TEST_ASSERT_FAIL(rte_cryptodev_queue_pair_setup(
1677 ts_params->valid_devs[0],
1678 qp_id, &qp_conf,
1679 rte_cryptodev_socket_id(ts_params->valid_devs[0])),
1680 "Failed test for rte_cryptodev_queue_pair_setup:"
1681 "invalid qp %u on cryptodev %u",
1682 qp_id, ts_params->valid_devs[0]);
1683
1684 return TEST_SUCCESS;
1685 }
1686
1687 /* ***** Plaintext data for tests ***** */
1688
1689 const char catch_22_quote_1[] =
1690 "There was only one catch and that was Catch-22, which "
1691 "specified that a concern for one's safety in the face of "
1692 "dangers that were real and immediate was the process of a "
1693 "rational mind. Orr was crazy and could be grounded. All he "
1694 "had to do was ask; and as soon as he did, he would no longer "
1695 "be crazy and would have to fly more missions. Orr would be "
1696 "crazy to fly more missions and sane if he didn't, but if he "
1697 "was sane he had to fly them. If he flew them he was crazy "
1698 "and didn't have to; but if he didn't want to he was sane and "
1699 "had to. Yossarian was moved very deeply by the absolute "
1700 "simplicity of this clause of Catch-22 and let out a "
1701 "respectful whistle. \"That's some catch, that Catch-22\", he "
1702 "observed. \"It's the best there is,\" Doc Daneeka agreed.";
1703
1704 const char catch_22_quote[] =
1705 "What a lousy earth! He wondered how many people were "
1706 "destitute that same night even in his own prosperous country, "
1707 "how many homes were shanties, how many husbands were drunk "
1708 "and wives socked, and how many children were bullied, abused, "
1709 "or abandoned. How many families hungered for food they could "
1710 "not afford to buy? How many hearts were broken? How many "
1711 "suicides would take place that same night, how many people "
1712 "would go insane? How many cockroaches and landlords would "
1713 "triumph? How many winners were losers, successes failures, "
1714 "and rich men poor men? How many wise guys were stupid? How "
1715 "many happy endings were unhappy endings? How many honest men "
1716 "were liars, brave men cowards, loyal men traitors, how many "
1717 "sainted men were corrupt, how many people in positions of "
1718 "trust had sold their souls to bodyguards, how many had never "
1719 "had souls? How many straight-and-narrow paths were crooked "
1720 "paths? How many best families were worst families and how "
1721 "many good people were bad people? When you added them all up "
1722 "and then subtracted, you might be left with only the children, "
1723 "and perhaps with Albert Einstein and an old violinist or "
1724 "sculptor somewhere.";
1725
1726 #define QUOTE_480_BYTES (480)
1727 #define QUOTE_512_BYTES (512)
1728 #define QUOTE_768_BYTES (768)
1729 #define QUOTE_1024_BYTES (1024)
1730
1731
1732
1733 /* ***** SHA1 Hash Tests ***** */
1734
1735 #define HMAC_KEY_LENGTH_SHA1 (DIGEST_BYTE_LENGTH_SHA1)
1736
1737 static uint8_t hmac_sha1_key[] = {
1738 0xF8, 0x2A, 0xC7, 0x54, 0xDB, 0x96, 0x18, 0xAA,
1739 0xC3, 0xA1, 0x53, 0xF6, 0x1F, 0x17, 0x60, 0xBD,
1740 0xDE, 0xF4, 0xDE, 0xAD };
1741
1742 /* ***** SHA224 Hash Tests ***** */
1743
1744 #define HMAC_KEY_LENGTH_SHA224 (DIGEST_BYTE_LENGTH_SHA224)
1745
1746
1747 /* ***** AES-CBC Cipher Tests ***** */
1748
1749 #define CIPHER_KEY_LENGTH_AES_CBC (16)
1750 #define CIPHER_IV_LENGTH_AES_CBC (CIPHER_KEY_LENGTH_AES_CBC)
1751
1752 static uint8_t aes_cbc_key[] = {
1753 0xE4, 0x23, 0x33, 0x8A, 0x35, 0x64, 0x61, 0xE2,
1754 0x49, 0x03, 0xDD, 0xC6, 0xB8, 0xCA, 0x55, 0x7A };
1755
1756 static uint8_t aes_cbc_iv[] = {
1757 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
1758 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f };
1759
1760
1761 /* ***** AES-CBC / HMAC-SHA1 Hash Tests ***** */
1762
1763 static const uint8_t catch_22_quote_2_512_bytes_AES_CBC_ciphertext[] = {
1764 0x8B, 0x4D, 0xDA, 0x1B, 0xCF, 0x04, 0xA0, 0x31,
1765 0xB4, 0xBF, 0xBD, 0x68, 0x43, 0x20, 0x7E, 0x76,
1766 0xB1, 0x96, 0x8B, 0xA2, 0x7C, 0xA2, 0x83, 0x9E,
1767 0x39, 0x5A, 0x2F, 0x7E, 0x92, 0xB4, 0x48, 0x1A,
1768 0x3F, 0x6B, 0x5D, 0xDF, 0x52, 0x85, 0x5F, 0x8E,
1769 0x42, 0x3C, 0xFB, 0xE9, 0x1A, 0x24, 0xD6, 0x08,
1770 0xDD, 0xFD, 0x16, 0xFB, 0xE9, 0x55, 0xEF, 0xF0,
1771 0xA0, 0x8D, 0x13, 0xAB, 0x81, 0xC6, 0x90, 0x01,
1772 0xB5, 0x18, 0x84, 0xB3, 0xF6, 0xE6, 0x11, 0x57,
1773 0xD6, 0x71, 0xC6, 0x3C, 0x3F, 0x2F, 0x33, 0xEE,
1774 0x24, 0x42, 0x6E, 0xAC, 0x0B, 0xCA, 0xEC, 0xF9,
1775 0x84, 0xF8, 0x22, 0xAA, 0x60, 0xF0, 0x32, 0xA9,
1776 0x75, 0x75, 0x3B, 0xCB, 0x70, 0x21, 0x0A, 0x8D,
1777 0x0F, 0xE0, 0xC4, 0x78, 0x2B, 0xF8, 0x97, 0xE3,
1778 0xE4, 0x26, 0x4B, 0x29, 0xDA, 0x88, 0xCD, 0x46,
1779 0xEC, 0xAA, 0xF9, 0x7F, 0xF1, 0x15, 0xEA, 0xC3,
1780 0x87, 0xE6, 0x31, 0xF2, 0xCF, 0xDE, 0x4D, 0x80,
1781 0x70, 0x91, 0x7E, 0x0C, 0xF7, 0x26, 0x3A, 0x92,
1782 0x4F, 0x18, 0x83, 0xC0, 0x8F, 0x59, 0x01, 0xA5,
1783 0x88, 0xD1, 0xDB, 0x26, 0x71, 0x27, 0x16, 0xF5,
1784 0xEE, 0x10, 0x82, 0xAC, 0x68, 0x26, 0x9B, 0xE2,
1785 0x6D, 0xD8, 0x9A, 0x80, 0xDF, 0x04, 0x31, 0xD5,
1786 0xF1, 0x35, 0x5C, 0x3B, 0xDD, 0x9A, 0x65, 0xBA,
1787 0x58, 0x34, 0x85, 0x61, 0x1C, 0x42, 0x10, 0x76,
1788 0x73, 0x02, 0x42, 0xC9, 0x23, 0x18, 0x8E, 0xB4,
1789 0x6F, 0xB4, 0xA3, 0x54, 0x6E, 0x88, 0x3B, 0x62,
1790 0x7C, 0x02, 0x8D, 0x4C, 0x9F, 0xC8, 0x45, 0xF4,
1791 0xC9, 0xDE, 0x4F, 0xEB, 0x22, 0x83, 0x1B, 0xE4,
1792 0x49, 0x37, 0xE4, 0xAD, 0xE7, 0xCD, 0x21, 0x54,
1793 0xBC, 0x1C, 0xC2, 0x04, 0x97, 0xB4, 0x10, 0x61,
1794 0xF0, 0xE4, 0xEF, 0x27, 0x63, 0x3A, 0xDA, 0x91,
1795 0x41, 0x25, 0x62, 0x1C, 0x5C, 0xB6, 0x38, 0x4A,
1796 0x88, 0x71, 0x59, 0x5A, 0x8D, 0xA0, 0x09, 0xAF,
1797 0x72, 0x94, 0xD7, 0x79, 0x5C, 0x60, 0x7C, 0x8F,
1798 0x4C, 0xF5, 0xD9, 0xA1, 0x39, 0x6D, 0x81, 0x28,
1799 0xEF, 0x13, 0x28, 0xDF, 0xF5, 0x3E, 0xF7, 0x8E,
1800 0x09, 0x9C, 0x78, 0x18, 0x79, 0xB8, 0x68, 0xD7,
1801 0xA8, 0x29, 0x62, 0xAD, 0xDE, 0xE1, 0x61, 0x76,
1802 0x1B, 0x05, 0x16, 0xCD, 0xBF, 0x02, 0x8E, 0xA6,
1803 0x43, 0x6E, 0x92, 0x55, 0x4F, 0x60, 0x9C, 0x03,
1804 0xB8, 0x4F, 0xA3, 0x02, 0xAC, 0xA8, 0xA7, 0x0C,
1805 0x1E, 0xB5, 0x6B, 0xF8, 0xC8, 0x4D, 0xDE, 0xD2,
1806 0xB0, 0x29, 0x6E, 0x40, 0xE6, 0xD6, 0xC9, 0xE6,
1807 0xB9, 0x0F, 0xB6, 0x63, 0xF5, 0xAA, 0x2B, 0x96,
1808 0xA7, 0x16, 0xAC, 0x4E, 0x0A, 0x33, 0x1C, 0xA6,
1809 0xE6, 0xBD, 0x8A, 0xCF, 0x40, 0xA9, 0xB2, 0xFA,
1810 0x63, 0x27, 0xFD, 0x9B, 0xD9, 0xFC, 0xD5, 0x87,
1811 0x8D, 0x4C, 0xB6, 0xA4, 0xCB, 0xE7, 0x74, 0x55,
1812 0xF4, 0xFB, 0x41, 0x25, 0xB5, 0x4B, 0x0A, 0x1B,
1813 0xB1, 0xD6, 0xB7, 0xD9, 0x47, 0x2A, 0xC3, 0x98,
1814 0x6A, 0xC4, 0x03, 0x73, 0x1F, 0x93, 0x6E, 0x53,
1815 0x19, 0x25, 0x64, 0x15, 0x83, 0xF9, 0x73, 0x2A,
1816 0x74, 0xB4, 0x93, 0x69, 0xC4, 0x72, 0xFC, 0x26,
1817 0xA2, 0x9F, 0x43, 0x45, 0xDD, 0xB9, 0xEF, 0x36,
1818 0xC8, 0x3A, 0xCD, 0x99, 0x9B, 0x54, 0x1A, 0x36,
1819 0xC1, 0x59, 0xF8, 0x98, 0xA8, 0xCC, 0x28, 0x0D,
1820 0x73, 0x4C, 0xEE, 0x98, 0xCB, 0x7C, 0x58, 0x7E,
1821 0x20, 0x75, 0x1E, 0xB7, 0xC9, 0xF8, 0xF2, 0x0E,
1822 0x63, 0x9E, 0x05, 0x78, 0x1A, 0xB6, 0xA8, 0x7A,
1823 0xF9, 0x98, 0x6A, 0xA6, 0x46, 0x84, 0x2E, 0xF6,
1824 0x4B, 0xDC, 0x9B, 0x8F, 0x9B, 0x8F, 0xEE, 0xB4,
1825 0xAA, 0x3F, 0xEE, 0xC0, 0x37, 0x27, 0x76, 0xC7,
1826 0x95, 0xBB, 0x26, 0x74, 0x69, 0x12, 0x7F, 0xF1,
1827 0xBB, 0xFF, 0xAE, 0xB5, 0x99, 0x6E, 0xCB, 0x0C
1828 };
1829
1830 static const uint8_t catch_22_quote_2_512_bytes_AES_CBC_HMAC_SHA1_digest[] = {
1831 0x9a, 0x4f, 0x88, 0x1b, 0xb6, 0x8f, 0xd8, 0x60,
1832 0x42, 0x1a, 0x7d, 0x3d, 0xf5, 0x82, 0x80, 0xf1,
1833 0x18, 0x8c, 0x1d, 0x32
1834 };
1835
1836
1837 /* Multisession Vector context Test */
1838 /*Begin Session 0 */
1839 static uint8_t ms_aes_cbc_key0[] = {
1840 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7,
1841 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff
1842 };
1843
1844 static uint8_t ms_aes_cbc_iv0[] = {
1845 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7,
1846 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff
1847 };
1848
1849 static const uint8_t ms_aes_cbc_cipher0[] = {
1850 0x3C, 0xE4, 0xEE, 0x42, 0xB6, 0x9B, 0xC3, 0x38,
1851 0x5F, 0xAD, 0x54, 0xDC, 0xA8, 0x32, 0x81, 0xDC,
1852 0x7A, 0x6F, 0x85, 0x58, 0x07, 0x35, 0xED, 0xEB,
1853 0xAD, 0x79, 0x79, 0x96, 0xD3, 0x0E, 0xA6, 0xD9,
1854 0xAA, 0x86, 0xA4, 0x8F, 0xB5, 0xD6, 0x6E, 0x6D,
1855 0x0C, 0x91, 0x2F, 0xC4, 0x67, 0x98, 0x0E, 0xC4,
1856 0x8D, 0x83, 0x68, 0x69, 0xC4, 0xD3, 0x94, 0x34,
1857 0xC4, 0x5D, 0x60, 0x55, 0x22, 0x87, 0x8F, 0x6F,
1858 0x17, 0x8E, 0x75, 0xE4, 0x02, 0xF5, 0x1B, 0x99,
1859 0xC8, 0x39, 0xA9, 0xAB, 0x23, 0x91, 0x12, 0xED,
1860 0x08, 0xE7, 0xD9, 0x25, 0x89, 0x24, 0x4F, 0x8D,
1861 0x68, 0xF3, 0x10, 0x39, 0x0A, 0xEE, 0x45, 0x24,
1862 0xDF, 0x7A, 0x9D, 0x00, 0x25, 0xE5, 0x35, 0x71,
1863 0x4E, 0x40, 0x59, 0x6F, 0x0A, 0x13, 0xB3, 0x72,
1864 0x1D, 0x98, 0x63, 0x94, 0x89, 0xA5, 0x39, 0x8E,
1865 0xD3, 0x9C, 0x8A, 0x7F, 0x71, 0x2F, 0xC7, 0xCD,
1866 0x81, 0x05, 0xDC, 0xC0, 0x8D, 0xCE, 0x6D, 0x18,
1867 0x30, 0xC4, 0x72, 0x51, 0xF0, 0x27, 0xC8, 0xF6,
1868 0x60, 0x5B, 0x7C, 0xB2, 0xE3, 0x49, 0x0C, 0x29,
1869 0xC6, 0x9F, 0x39, 0x57, 0x80, 0x55, 0x24, 0x2C,
1870 0x9B, 0x0F, 0x5A, 0xB3, 0x89, 0x55, 0x31, 0x96,
1871 0x0D, 0xCD, 0xF6, 0x51, 0x03, 0x2D, 0x89, 0x26,
1872 0x74, 0x44, 0xD6, 0xE8, 0xDC, 0xEA, 0x44, 0x55,
1873 0x64, 0x71, 0x9C, 0x9F, 0x5D, 0xBA, 0x39, 0x46,
1874 0xA8, 0x17, 0xA1, 0x9C, 0x52, 0x9D, 0xBC, 0x6B,
1875 0x4A, 0x98, 0xE6, 0xEA, 0x33, 0xEC, 0x58, 0xB4,
1876 0x43, 0xF0, 0x32, 0x45, 0xA4, 0xC1, 0x55, 0xB7,
1877 0x5D, 0xB5, 0x59, 0xB2, 0xE3, 0x96, 0xFF, 0xA5,
1878 0xAF, 0xE1, 0x86, 0x1B, 0x42, 0xE6, 0x3B, 0xA0,
1879 0x90, 0x4A, 0xE8, 0x8C, 0x21, 0x7F, 0x36, 0x1E,
1880 0x5B, 0x65, 0x25, 0xD1, 0xC1, 0x5A, 0xCA, 0x3D,
1881 0x10, 0xED, 0x2D, 0x79, 0xD0, 0x0F, 0x58, 0x44,
1882 0x69, 0x81, 0xF5, 0xD4, 0xC9, 0x0F, 0x90, 0x76,
1883 0x1F, 0x54, 0xD2, 0xD5, 0x97, 0xCE, 0x2C, 0xE3,
1884 0xEF, 0xF4, 0xB7, 0xC6, 0x3A, 0x87, 0x7F, 0x83,
1885 0x2A, 0xAF, 0xCD, 0x90, 0x12, 0xA7, 0x7D, 0x85,
1886 0x1D, 0x62, 0xD3, 0x85, 0x25, 0x05, 0xDB, 0x45,
1887 0x92, 0xA3, 0xF6, 0xA2, 0xA8, 0x41, 0xE4, 0x25,
1888 0x86, 0x87, 0x67, 0x24, 0xEC, 0x89, 0x23, 0x2A,
1889 0x9B, 0x20, 0x4D, 0x93, 0xEE, 0xE2, 0x2E, 0xC1,
1890 0x0B, 0x15, 0x33, 0xCF, 0x00, 0xD1, 0x1A, 0xDA,
1891 0x93, 0xFD, 0x28, 0x21, 0x5B, 0xCF, 0xD1, 0xF3,
1892 0x5A, 0x81, 0xBA, 0x82, 0x5E, 0x2F, 0x61, 0xB4,
1893 0x05, 0x71, 0xB5, 0xF4, 0x39, 0x3C, 0x1F, 0x60,
1894 0x00, 0x7A, 0xC4, 0xF8, 0x35, 0x20, 0x6C, 0x3A,
1895 0xCC, 0x03, 0x8F, 0x7B, 0xA2, 0xB6, 0x65, 0x8A,
1896 0xB6, 0x5F, 0xFD, 0x25, 0xD3, 0x5F, 0x92, 0xF9,
1897 0xAE, 0x17, 0x9B, 0x5E, 0x6E, 0x9A, 0xE4, 0x55,
1898 0x10, 0x25, 0x07, 0xA4, 0xAF, 0x21, 0x69, 0x13,
1899 0xD8, 0xFA, 0x31, 0xED, 0xF7, 0xA7, 0xA7, 0x3B,
1900 0xB8, 0x96, 0x8E, 0x10, 0x86, 0x74, 0xD8, 0xB1,
1901 0x34, 0x9E, 0x9B, 0x6A, 0x26, 0xA8, 0xD4, 0xD0,
1902 0xB5, 0xF6, 0xDE, 0xE7, 0xCA, 0x06, 0xDC, 0xA3,
1903 0x6F, 0xEE, 0x6B, 0x1E, 0xB5, 0x30, 0x99, 0x23,
1904 0xF9, 0x76, 0xF0, 0xA0, 0xCF, 0x3B, 0x94, 0x7B,
1905 0x19, 0x8D, 0xA5, 0x0C, 0x18, 0xA6, 0x1D, 0x07,
1906 0x89, 0xBE, 0x5B, 0x61, 0xE5, 0xF1, 0x42, 0xDB,
1907 0xD4, 0x2E, 0x02, 0x1F, 0xCE, 0xEF, 0x92, 0xB1,
1908 0x1B, 0x56, 0x50, 0xF2, 0x16, 0xE5, 0xE7, 0x4F,
1909 0xFD, 0xBB, 0x3E, 0xD2, 0xFC, 0x3C, 0xC6, 0x0F,
1910 0xF9, 0x12, 0x4E, 0xCB, 0x1E, 0x0C, 0x15, 0x84,
1911 0x2A, 0x14, 0x8A, 0x02, 0xE4, 0x7E, 0x95, 0x5B,
1912 0x86, 0xDB, 0x9B, 0x62, 0x5B, 0x19, 0xD2, 0x17,
1913 0xFA, 0x13, 0xBB, 0x6B, 0x3F, 0x45, 0x9F, 0xBF
1914 };
1915
1916
1917 static uint8_t ms_hmac_key0[] = {
1918 0xFF, 0x1A, 0x7D, 0x3D, 0xF5, 0x82, 0x80, 0xF1,
1919 0xF1, 0x35, 0x5C, 0x3B, 0xDD, 0x9A, 0x65, 0xBA,
1920 0x58, 0x34, 0x85, 0x65, 0x1C, 0x42, 0x50, 0x76,
1921 0x9A, 0xAF, 0x88, 0x1B, 0xB6, 0x8F, 0xF8, 0x60,
1922 0xA2, 0x5A, 0x7F, 0x3F, 0xF4, 0x72, 0x70, 0xF1,
1923 0xF5, 0x35, 0x4C, 0x3B, 0xDD, 0x90, 0x65, 0xB0,
1924 0x47, 0x3A, 0x75, 0x61, 0x5C, 0xA2, 0x10, 0x76,
1925 0x9A, 0xAF, 0x77, 0x5B, 0xB6, 0x7F, 0xF7, 0x60
1926 };
1927
1928 static const uint8_t ms_hmac_digest0[] = {
1929 0x43, 0x52, 0xED, 0x34, 0xAB, 0x36, 0xB2, 0x51,
1930 0xFB, 0xA3, 0xA6, 0x7C, 0x38, 0xFC, 0x42, 0x8F,
1931 0x57, 0x64, 0xAB, 0x81, 0xA7, 0x89, 0xB7, 0x6C,
1932 0xA0, 0xDC, 0xB9, 0x4D, 0xC4, 0x30, 0xF9, 0xD4,
1933 0x10, 0x82, 0x55, 0xD0, 0xAB, 0x32, 0xFB, 0x56,
1934 0x0D, 0xE4, 0x68, 0x3D, 0x76, 0xD0, 0x7B, 0xE4,
1935 0xA6, 0x2C, 0x34, 0x9E, 0x8C, 0x41, 0xF8, 0x23,
1936 0x28, 0x1B, 0x3A, 0x90, 0x26, 0x34, 0x47, 0x90
1937 };
1938
1939 /* End Session 0 */
1940 /* Begin session 1 */
1941
1942 static uint8_t ms_aes_cbc_key1[] = {
1943 0xf1, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7,
1944 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff
1945 };
1946
1947 static uint8_t ms_aes_cbc_iv1[] = {
1948 0xf1, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7,
1949 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff
1950 };
1951
1952 static const uint8_t ms_aes_cbc_cipher1[] = {
1953 0x5A, 0x7A, 0x67, 0x5D, 0xB8, 0xE1, 0xDC, 0x71,
1954 0x39, 0xA8, 0x74, 0x93, 0x9C, 0x4C, 0xFE, 0x23,
1955 0x61, 0xCD, 0xA4, 0xB3, 0xD9, 0xCE, 0x99, 0x09,
1956 0x2A, 0x23, 0xF3, 0x29, 0xBF, 0x4C, 0xB4, 0x6A,
1957 0x1B, 0x6B, 0x73, 0x4D, 0x48, 0x0C, 0xCF, 0x6C,
1958 0x5E, 0x34, 0x9E, 0x7F, 0xBC, 0x8F, 0xCC, 0x8F,
1959 0x75, 0x1D, 0x3D, 0x77, 0x10, 0x76, 0xC8, 0xB9,
1960 0x99, 0x6F, 0xD6, 0x56, 0x75, 0xA9, 0xB2, 0x66,
1961 0xC2, 0x24, 0x2B, 0x9C, 0xFE, 0x40, 0x8E, 0x43,
1962 0x20, 0x97, 0x1B, 0xFA, 0xD0, 0xCF, 0x04, 0xAB,
1963 0xBB, 0xF6, 0x5D, 0xF5, 0xA0, 0x19, 0x7C, 0x23,
1964 0x5D, 0x80, 0x8C, 0x49, 0xF6, 0x76, 0x88, 0x29,
1965 0x27, 0x4C, 0x59, 0x2B, 0x43, 0xA6, 0xB2, 0x26,
1966 0x27, 0x78, 0xBE, 0x1B, 0xE1, 0x4F, 0x5A, 0x1F,
1967 0xFC, 0x68, 0x08, 0xE7, 0xC4, 0xD1, 0x34, 0x68,
1968 0xB7, 0x13, 0x14, 0x41, 0x62, 0x6B, 0x1F, 0x77,
1969 0x0C, 0x68, 0x1D, 0x0D, 0xED, 0x89, 0xAA, 0xD8,
1970 0x97, 0x02, 0xBA, 0x5E, 0xD4, 0x84, 0x25, 0x97,
1971 0x03, 0xA5, 0xA6, 0x13, 0x66, 0x02, 0xF4, 0xC3,
1972 0xF3, 0xD3, 0xCC, 0x95, 0xC3, 0x87, 0x46, 0x90,
1973 0x1F, 0x6E, 0x14, 0xA8, 0x00, 0xF2, 0x6F, 0xD5,
1974 0xA1, 0xAD, 0xD5, 0x40, 0xA2, 0x0F, 0x32, 0x7E,
1975 0x99, 0xA3, 0xF5, 0x53, 0xC3, 0x26, 0xA1, 0x45,
1976 0x01, 0x88, 0x57, 0x84, 0x3E, 0x7B, 0x4E, 0x0B,
1977 0x3C, 0xB5, 0x3E, 0x9E, 0xE9, 0x78, 0x77, 0xC5,
1978 0xC0, 0x89, 0xA8, 0xF8, 0xF1, 0xA5, 0x2D, 0x5D,
1979 0xF9, 0xC6, 0xFB, 0xCB, 0x05, 0x23, 0xBD, 0x6E,
1980 0x5E, 0x14, 0xC6, 0x57, 0x73, 0xCF, 0x98, 0xBD,
1981 0x10, 0x8B, 0x18, 0xA6, 0x01, 0x5B, 0x13, 0xAE,
1982 0x8E, 0xDE, 0x1F, 0xB5, 0xB7, 0x40, 0x6C, 0xC1,
1983 0x1E, 0xA1, 0x19, 0x20, 0x9E, 0x95, 0xE0, 0x2F,
1984 0x1C, 0xF5, 0xD9, 0xD0, 0x2B, 0x1E, 0x82, 0x25,
1985 0x62, 0xB4, 0xEB, 0xA1, 0x1F, 0xCE, 0x44, 0xA1,
1986 0xCB, 0x92, 0x01, 0x6B, 0xE4, 0x26, 0x23, 0xE3,
1987 0xC5, 0x67, 0x35, 0x55, 0xDA, 0xE5, 0x27, 0xEE,
1988 0x8D, 0x12, 0x84, 0xB7, 0xBA, 0xA7, 0x1C, 0xD6,
1989 0x32, 0x3F, 0x67, 0xED, 0xFB, 0x5B, 0x8B, 0x52,
1990 0x46, 0x8C, 0xF9, 0x69, 0xCD, 0xAE, 0x79, 0xAA,
1991 0x37, 0x78, 0x49, 0xEB, 0xC6, 0x8E, 0x76, 0x63,
1992 0x84, 0xFF, 0x9D, 0x22, 0x99, 0x51, 0xB7, 0x5E,
1993 0x83, 0x4C, 0x8B, 0xDF, 0x5A, 0x07, 0xCC, 0xBA,
1994 0x42, 0xA5, 0x98, 0xB6, 0x47, 0x0E, 0x66, 0xEB,
1995 0x23, 0x0E, 0xBA, 0x44, 0xA8, 0xAA, 0x20, 0x71,
1996 0x79, 0x9C, 0x77, 0x5F, 0xF5, 0xFE, 0xEC, 0xEF,
1997 0xC6, 0x64, 0x3D, 0x84, 0xD0, 0x2B, 0xA7, 0x0A,
1998 0xC3, 0x72, 0x5B, 0x9C, 0xFA, 0xA8, 0x87, 0x95,
1999 0x94, 0x11, 0x38, 0xA7, 0x1E, 0x58, 0xE3, 0x73,
2000 0xC6, 0xC9, 0xD1, 0x7B, 0x92, 0xDB, 0x0F, 0x49,
2001 0x74, 0xC2, 0xA2, 0x0E, 0x35, 0x57, 0xAC, 0xDB,
2002 0x9A, 0x1C, 0xCF, 0x5A, 0x32, 0x3E, 0x26, 0x9B,
2003 0xEC, 0xB3, 0xEF, 0x9C, 0xFE, 0xBE, 0x52, 0xAC,
2004 0xB1, 0x29, 0xDD, 0xFD, 0x07, 0xE2, 0xEE, 0xED,
2005 0xE4, 0x46, 0x37, 0xFE, 0xD1, 0xDC, 0xCD, 0x02,
2006 0xF9, 0x31, 0xB0, 0xFB, 0x36, 0xB7, 0x34, 0xA4,
2007 0x76, 0xE8, 0x57, 0xBF, 0x99, 0x92, 0xC7, 0xAF,
2008 0x98, 0x10, 0xE2, 0x70, 0xCA, 0xC9, 0x2B, 0x82,
2009 0x06, 0x96, 0x88, 0x0D, 0xB3, 0xAC, 0x9E, 0x6D,
2010 0x43, 0xBC, 0x5B, 0x31, 0xCF, 0x65, 0x8D, 0xA6,
2011 0xC7, 0xFE, 0x73, 0xE1, 0x54, 0xF7, 0x10, 0xF9,
2012 0x86, 0xF7, 0xDF, 0xA1, 0xA1, 0xD8, 0xAE, 0x35,
2013 0xB3, 0x90, 0xDC, 0x6F, 0x43, 0x7A, 0x8B, 0xE0,
2014 0xFE, 0x8F, 0x33, 0x4D, 0x29, 0x6C, 0x45, 0x53,
2015 0x73, 0xDD, 0x21, 0x0B, 0x85, 0x30, 0xB5, 0xA5,
2016 0xF3, 0x5D, 0xEC, 0x79, 0x61, 0x9D, 0x9E, 0xB3
2017
2018 };
2019
2020 static uint8_t ms_hmac_key1[] = {
2021 0xFE, 0x1A, 0x7D, 0x3D, 0xF5, 0x82, 0x80, 0xF1,
2022 0xF1, 0x35, 0x5C, 0x3B, 0xDD, 0x9A, 0x65, 0xBA,
2023 0x58, 0x34, 0x85, 0x65, 0x1C, 0x42, 0x50, 0x76,
2024 0x9A, 0xAF, 0x88, 0x1B, 0xB6, 0x8F, 0xF8, 0x60,
2025 0xA2, 0x5A, 0x7F, 0x3F, 0xF4, 0x72, 0x70, 0xF1,
2026 0xF5, 0x35, 0x4C, 0x3B, 0xDD, 0x90, 0x65, 0xB0,
2027 0x47, 0x3A, 0x75, 0x61, 0x5C, 0xA2, 0x10, 0x76,
2028 0x9A, 0xAF, 0x77, 0x5B, 0xB6, 0x7F, 0xF7, 0x60
2029 };
2030
2031 static const uint8_t ms_hmac_digest1[] = {
2032 0xCE, 0x6E, 0x5F, 0x77, 0x96, 0x9A, 0xB1, 0x69,
2033 0x2D, 0x5E, 0xF3, 0x2F, 0x32, 0x10, 0xCB, 0x50,
2034 0x0E, 0x09, 0x56, 0x25, 0x07, 0x34, 0xC9, 0x20,
2035 0xEC, 0x13, 0x43, 0x23, 0x5C, 0x08, 0x8B, 0xCD,
2036 0xDC, 0x86, 0x8C, 0xEE, 0x0A, 0x95, 0x2E, 0xB9,
2037 0x8C, 0x7B, 0x02, 0x7A, 0xD4, 0xE1, 0x49, 0xB4,
2038 0x45, 0xB5, 0x52, 0x37, 0xC6, 0xFF, 0xFE, 0xAA,
2039 0x0A, 0x87, 0xB8, 0x51, 0xF9, 0x2A, 0x01, 0x8F
2040 };
2041 /* End Session 1 */
2042 /* Begin Session 2 */
2043 static uint8_t ms_aes_cbc_key2[] = {
2044 0xff, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7,
2045 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff
2046 };
2047
2048 static uint8_t ms_aes_cbc_iv2[] = {
2049 0xff, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7,
2050 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff
2051 };
2052
2053 static const uint8_t ms_aes_cbc_cipher2[] = {
2054 0xBB, 0x3C, 0x68, 0x25, 0xFD, 0xB6, 0xA2, 0x91,
2055 0x20, 0x56, 0xF6, 0x30, 0x35, 0xFC, 0x9E, 0x97,
2056 0xF2, 0x90, 0xFC, 0x7E, 0x3E, 0x0A, 0x75, 0xC8,
2057 0x4C, 0xF2, 0x2D, 0xAC, 0xD3, 0x93, 0xF0, 0xC5,
2058 0x14, 0x88, 0x8A, 0x23, 0xC2, 0x59, 0x9A, 0x98,
2059 0x4B, 0xD5, 0x2C, 0xDA, 0x43, 0xA9, 0x34, 0x69,
2060 0x7C, 0x6D, 0xDB, 0xDC, 0xCB, 0xC0, 0xA0, 0x09,
2061 0xA7, 0x86, 0x16, 0x4B, 0xBF, 0xA8, 0xB6, 0xCF,
2062 0x7F, 0x74, 0x1F, 0x22, 0xF0, 0xF6, 0xBB, 0x44,
2063 0x8B, 0x4C, 0x9E, 0x23, 0xF8, 0x9F, 0xFC, 0x5B,
2064 0x9E, 0x9C, 0x2A, 0x79, 0x30, 0x8F, 0xBF, 0xA9,
2065 0x68, 0xA1, 0x20, 0x71, 0x7C, 0x77, 0x22, 0x34,
2066 0x07, 0xCD, 0xC6, 0xF6, 0x50, 0x0A, 0x08, 0x99,
2067 0x17, 0x98, 0xE3, 0x93, 0x8A, 0xB0, 0xEE, 0xDF,
2068 0xC2, 0xBA, 0x3B, 0x44, 0x73, 0xDF, 0xDD, 0xDC,
2069 0x14, 0x4D, 0x3B, 0xBB, 0x5E, 0x58, 0xC1, 0x26,
2070 0xA7, 0xAE, 0x47, 0xF3, 0x24, 0x6D, 0x4F, 0xD3,
2071 0x6E, 0x3E, 0x33, 0xE6, 0x7F, 0xCA, 0x50, 0xAF,
2072 0x5D, 0x3D, 0xA0, 0xDD, 0xC9, 0xF3, 0x30, 0xD3,
2073 0x6E, 0x8B, 0x2E, 0x12, 0x24, 0x34, 0xF0, 0xD3,
2074 0xC7, 0x8D, 0x23, 0x29, 0xAA, 0x05, 0xE1, 0xFA,
2075 0x2E, 0xF6, 0x8D, 0x37, 0x86, 0xC0, 0x6D, 0x13,
2076 0x2D, 0x98, 0xF3, 0x52, 0x39, 0x22, 0xCE, 0x38,
2077 0xC2, 0x1A, 0x72, 0xED, 0xFB, 0xCC, 0xE4, 0x71,
2078 0x5A, 0x0C, 0x0D, 0x09, 0xF8, 0xE8, 0x1B, 0xBC,
2079 0x53, 0xC8, 0xD8, 0x8F, 0xE5, 0x98, 0x5A, 0xB1,
2080 0x06, 0xA6, 0x5B, 0xE6, 0xA2, 0x88, 0x21, 0x9E,
2081 0x36, 0xC0, 0x34, 0xF9, 0xFB, 0x3B, 0x0A, 0x22,
2082 0x00, 0x00, 0x39, 0x48, 0x8D, 0x23, 0x74, 0x62,
2083 0x72, 0x91, 0xE6, 0x36, 0xAA, 0x77, 0x9C, 0x72,
2084 0x9D, 0xA8, 0xC3, 0xA9, 0xD5, 0x44, 0x72, 0xA6,
2085 0xB9, 0x28, 0x8F, 0x64, 0x4C, 0x8A, 0x64, 0xE6,
2086 0x4E, 0xFA, 0xEF, 0x87, 0xDE, 0x7B, 0x22, 0x44,
2087 0xB0, 0xDF, 0x2E, 0x5F, 0x0B, 0xA5, 0xF2, 0x24,
2088 0x07, 0x5C, 0x2D, 0x39, 0xB7, 0x3D, 0x8A, 0xE5,
2089 0x0E, 0x9D, 0x4E, 0x50, 0xED, 0x03, 0x99, 0x8E,
2090 0xF0, 0x06, 0x55, 0x4E, 0xA2, 0x24, 0xE7, 0x17,
2091 0x46, 0xDF, 0x6C, 0xCD, 0xC6, 0x44, 0xE8, 0xF9,
2092 0xB9, 0x1B, 0x36, 0xF6, 0x7F, 0x10, 0xA4, 0x7D,
2093 0x90, 0xBD, 0xE4, 0xAA, 0xD6, 0x9E, 0x18, 0x9D,
2094 0x22, 0x35, 0xD6, 0x55, 0x54, 0xAA, 0xF7, 0x22,
2095 0xA3, 0x3E, 0xEF, 0xC8, 0xA2, 0x34, 0x8D, 0xA9,
2096 0x37, 0x63, 0xA6, 0xC3, 0x57, 0xCB, 0x0C, 0x49,
2097 0x7D, 0x02, 0xBE, 0xAA, 0x13, 0x75, 0xB7, 0x4E,
2098 0x52, 0x62, 0xA5, 0xC2, 0x33, 0xC7, 0x6C, 0x1B,
2099 0xF6, 0x34, 0xF6, 0x09, 0xA5, 0x0C, 0xC7, 0xA2,
2100 0x61, 0x48, 0x62, 0x7D, 0x17, 0x15, 0xE3, 0x95,
2101 0xC8, 0x63, 0xD2, 0xA4, 0x43, 0xA9, 0x49, 0x07,
2102 0xB2, 0x3B, 0x2B, 0x62, 0x7D, 0xCB, 0x51, 0xB3,
2103 0x25, 0x33, 0x47, 0x0E, 0x14, 0x67, 0xDC, 0x6A,
2104 0x9B, 0x51, 0xAC, 0x9D, 0x8F, 0xA2, 0x2B, 0x57,
2105 0x8C, 0x5C, 0x5F, 0x76, 0x23, 0x92, 0x0F, 0x84,
2106 0x46, 0x0E, 0x40, 0x85, 0x38, 0x60, 0xFA, 0x61,
2107 0x20, 0xC5, 0xE3, 0xF1, 0x70, 0xAC, 0x1B, 0xBF,
2108 0xC4, 0x2B, 0xC5, 0x67, 0xD1, 0x43, 0xC5, 0x17,
2109 0x74, 0x71, 0x69, 0x6F, 0x82, 0x89, 0x19, 0x8A,
2110 0x70, 0x43, 0x92, 0x01, 0xC4, 0x63, 0x7E, 0xB1,
2111 0x59, 0x4E, 0xCD, 0xEA, 0x93, 0xA4, 0x52, 0x53,
2112 0x9B, 0x61, 0x5B, 0xD2, 0x3E, 0x19, 0x39, 0xB7,
2113 0x32, 0xEA, 0x8E, 0xF8, 0x1D, 0x76, 0x5C, 0xB2,
2114 0x73, 0x2D, 0x91, 0xC0, 0x18, 0xED, 0x25, 0x2A,
2115 0x53, 0x64, 0xF0, 0x92, 0x31, 0x55, 0x21, 0xA8,
2116 0x24, 0xA9, 0xD1, 0x02, 0xF6, 0x6C, 0x2B, 0x70,
2117 0xA9, 0x59, 0xC1, 0xD6, 0xC3, 0x57, 0x5B, 0x92
2118 };
2119
2120 static uint8_t ms_hmac_key2[] = {
2121 0xFC, 0x1A, 0x7D, 0x3D, 0xF5, 0x82, 0x80, 0xF1,
2122 0xF1, 0x35, 0x5C, 0x3B, 0xDD, 0x9A, 0x65, 0xBA,
2123 0x58, 0x34, 0x85, 0x65, 0x1C, 0x42, 0x50, 0x76,
2124 0x9A, 0xAF, 0x88, 0x1B, 0xB6, 0x8F, 0xF8, 0x60,
2125 0xA2, 0x5A, 0x7F, 0x3F, 0xF4, 0x72, 0x70, 0xF1,
2126 0xF5, 0x35, 0x4C, 0x3B, 0xDD, 0x90, 0x65, 0xB0,
2127 0x47, 0x3A, 0x75, 0x61, 0x5C, 0xA2, 0x10, 0x76,
2128 0x9A, 0xAF, 0x77, 0x5B, 0xB6, 0x7F, 0xF7, 0x60
2129 };
2130
2131 static const uint8_t ms_hmac_digest2[] = {
2132 0xA5, 0x0F, 0x9C, 0xFB, 0x08, 0x62, 0x59, 0xFF,
2133 0x80, 0x2F, 0xEB, 0x4B, 0xE1, 0x46, 0x21, 0xD6,
2134 0x02, 0x98, 0xF2, 0x8E, 0xF4, 0xEC, 0xD4, 0x77,
2135 0x86, 0x4C, 0x31, 0x28, 0xC8, 0x25, 0x80, 0x27,
2136 0x3A, 0x72, 0x5D, 0x6A, 0x56, 0x8A, 0xD3, 0x82,
2137 0xB0, 0xEC, 0x31, 0x6D, 0x8B, 0x6B, 0xB4, 0x24,
2138 0xE7, 0x62, 0xC1, 0x52, 0xBC, 0x14, 0x1B, 0x8E,
2139 0xEC, 0x9A, 0xF1, 0x47, 0x80, 0xD2, 0xB0, 0x59
2140 };
2141
2142 /* End Session 2 */
2143
2144
2145 static int
test_AES_CBC_HMAC_SHA1_encrypt_digest(void)2146 test_AES_CBC_HMAC_SHA1_encrypt_digest(void)
2147 {
2148 struct crypto_testsuite_params *ts_params = &testsuite_params;
2149 struct crypto_unittest_params *ut_params = &unittest_params;
2150 int status;
2151
2152 /* Verify the capabilities */
2153 struct rte_cryptodev_sym_capability_idx cap_idx;
2154 cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
2155 cap_idx.algo.auth = RTE_CRYPTO_AUTH_SHA1_HMAC;
2156 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
2157 &cap_idx) == NULL)
2158 return TEST_SKIPPED;
2159 cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
2160 cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_AES_CBC;
2161 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
2162 &cap_idx) == NULL)
2163 return TEST_SKIPPED;
2164
2165 /* Generate test mbuf data and space for digest */
2166 ut_params->ibuf = setup_test_string(ts_params->mbuf_pool,
2167 catch_22_quote, QUOTE_512_BYTES, 0);
2168
2169 ut_params->digest = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
2170 DIGEST_BYTE_LENGTH_SHA1);
2171 TEST_ASSERT_NOT_NULL(ut_params->digest, "no room to append digest");
2172
2173 /* Setup Cipher Parameters */
2174 ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
2175 ut_params->cipher_xform.next = &ut_params->auth_xform;
2176
2177 ut_params->cipher_xform.cipher.algo = RTE_CRYPTO_CIPHER_AES_CBC;
2178 ut_params->cipher_xform.cipher.op = RTE_CRYPTO_CIPHER_OP_ENCRYPT;
2179 ut_params->cipher_xform.cipher.key.data = aes_cbc_key;
2180 ut_params->cipher_xform.cipher.key.length = CIPHER_KEY_LENGTH_AES_CBC;
2181 ut_params->cipher_xform.cipher.iv.offset = IV_OFFSET;
2182 ut_params->cipher_xform.cipher.iv.length = CIPHER_IV_LENGTH_AES_CBC;
2183
2184 /* Setup HMAC Parameters */
2185 ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;
2186
2187 ut_params->auth_xform.next = NULL;
2188
2189 ut_params->auth_xform.auth.op = RTE_CRYPTO_AUTH_OP_GENERATE;
2190 ut_params->auth_xform.auth.algo = RTE_CRYPTO_AUTH_SHA1_HMAC;
2191 ut_params->auth_xform.auth.key.length = HMAC_KEY_LENGTH_SHA1;
2192 ut_params->auth_xform.auth.key.data = hmac_sha1_key;
2193 ut_params->auth_xform.auth.digest_length = DIGEST_BYTE_LENGTH_SHA1;
2194
2195 ut_params->sess = rte_cryptodev_sym_session_create(
2196 ts_params->session_mpool);
2197 TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed");
2198
2199 /* Create crypto session*/
2200 status = rte_cryptodev_sym_session_init(ts_params->valid_devs[0],
2201 ut_params->sess, &ut_params->cipher_xform,
2202 ts_params->session_priv_mpool);
2203
2204 if (status == -ENOTSUP)
2205 return TEST_SKIPPED;
2206
2207 TEST_ASSERT_EQUAL(status, 0, "Session init failed");
2208
2209 /* Generate crypto op data structure */
2210 ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
2211 RTE_CRYPTO_OP_TYPE_SYMMETRIC);
2212 TEST_ASSERT_NOT_NULL(ut_params->op,
2213 "Failed to allocate symmetric crypto operation struct");
2214
2215 rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
2216
2217 struct rte_crypto_sym_op *sym_op = ut_params->op->sym;
2218
2219 /* set crypto operation source mbuf */
2220 sym_op->m_src = ut_params->ibuf;
2221
2222 /* Set crypto operation authentication parameters */
2223 sym_op->auth.digest.data = ut_params->digest;
2224 sym_op->auth.digest.phys_addr = rte_pktmbuf_iova_offset(
2225 ut_params->ibuf, QUOTE_512_BYTES);
2226
2227 sym_op->auth.data.offset = 0;
2228 sym_op->auth.data.length = QUOTE_512_BYTES;
2229
2230 /* Copy IV at the end of the crypto operation */
2231 rte_memcpy(rte_crypto_op_ctod_offset(ut_params->op, uint8_t *, IV_OFFSET),
2232 aes_cbc_iv, CIPHER_IV_LENGTH_AES_CBC);
2233
2234 /* Set crypto operation cipher parameters */
2235 sym_op->cipher.data.offset = 0;
2236 sym_op->cipher.data.length = QUOTE_512_BYTES;
2237
2238 /* Process crypto operation */
2239 if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
2240 process_cpu_crypt_auth_op(ts_params->valid_devs[0],
2241 ut_params->op);
2242 else
2243 TEST_ASSERT_NOT_NULL(
2244 process_crypto_request(ts_params->valid_devs[0],
2245 ut_params->op),
2246 "failed to process sym crypto op");
2247
2248 TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
2249 "crypto op processing failed");
2250
2251 /* Validate obuf */
2252 uint8_t *ciphertext = rte_pktmbuf_mtod(ut_params->op->sym->m_src,
2253 uint8_t *);
2254
2255 TEST_ASSERT_BUFFERS_ARE_EQUAL(ciphertext,
2256 catch_22_quote_2_512_bytes_AES_CBC_ciphertext,
2257 QUOTE_512_BYTES,
2258 "ciphertext data not as expected");
2259
2260 uint8_t *digest = ciphertext + QUOTE_512_BYTES;
2261
2262 TEST_ASSERT_BUFFERS_ARE_EQUAL(digest,
2263 catch_22_quote_2_512_bytes_AES_CBC_HMAC_SHA1_digest,
2264 gbl_driver_id == rte_cryptodev_driver_id_get(
2265 RTE_STR(CRYPTODEV_NAME_AESNI_MB_PMD)) ?
2266 TRUNCATED_DIGEST_BYTE_LENGTH_SHA1 :
2267 DIGEST_BYTE_LENGTH_SHA1,
2268 "Generated digest data not as expected");
2269
2270 return TEST_SUCCESS;
2271 }
2272
2273 /* ***** AES-CBC / HMAC-SHA512 Hash Tests ***** */
2274
2275 #define HMAC_KEY_LENGTH_SHA512 (DIGEST_BYTE_LENGTH_SHA512)
2276
2277 static uint8_t hmac_sha512_key[] = {
2278 0x42, 0x1a, 0x7d, 0x3d, 0xf5, 0x82, 0x80, 0xf1,
2279 0xF1, 0x35, 0x5C, 0x3B, 0xDD, 0x9A, 0x65, 0xBA,
2280 0x58, 0x34, 0x85, 0x65, 0x1C, 0x42, 0x50, 0x76,
2281 0x9a, 0xaf, 0x88, 0x1b, 0xb6, 0x8f, 0xf8, 0x60,
2282 0xa2, 0x5a, 0x7f, 0x3f, 0xf4, 0x72, 0x70, 0xf1,
2283 0xF5, 0x35, 0x4C, 0x3B, 0xDD, 0x90, 0x65, 0xB0,
2284 0x47, 0x3a, 0x75, 0x61, 0x5C, 0xa2, 0x10, 0x76,
2285 0x9a, 0xaf, 0x77, 0x5b, 0xb6, 0x7f, 0xf7, 0x60 };
2286
2287 static const uint8_t catch_22_quote_2_512_bytes_AES_CBC_HMAC_SHA512_digest[] = {
2288 0x5D, 0x54, 0x66, 0xC1, 0x6E, 0xBC, 0x04, 0xB8,
2289 0x46, 0xB8, 0x08, 0x6E, 0xE0, 0xF0, 0x43, 0x48,
2290 0x37, 0x96, 0x9C, 0xC6, 0x9C, 0xC2, 0x1E, 0xE8,
2291 0xF2, 0x0C, 0x0B, 0xEF, 0x86, 0xA2, 0xE3, 0x70,
2292 0x95, 0xC8, 0xB3, 0x06, 0x47, 0xA9, 0x90, 0xE8,
2293 0xA0, 0xC6, 0x72, 0x69, 0x05, 0xC0, 0x0D, 0x0E,
2294 0x21, 0x96, 0x65, 0x93, 0x74, 0x43, 0x2A, 0x1D,
2295 0x2E, 0xBF, 0xC2, 0xC2, 0xEE, 0xCC, 0x2F, 0x0A };
2296
2297
2298
2299 static int
2300 test_AES_CBC_HMAC_SHA512_decrypt_create_session_params(
2301 struct crypto_unittest_params *ut_params,
2302 uint8_t *cipher_key,
2303 uint8_t *hmac_key);
2304
2305 static int
2306 test_AES_CBC_HMAC_SHA512_decrypt_perform(struct rte_cryptodev_sym_session *sess,
2307 struct crypto_unittest_params *ut_params,
2308 struct crypto_testsuite_params *ts_params,
2309 const uint8_t *cipher,
2310 const uint8_t *digest,
2311 const uint8_t *iv);
2312
2313
2314 static int
test_AES_CBC_HMAC_SHA512_decrypt_create_session_params(struct crypto_unittest_params * ut_params,uint8_t * cipher_key,uint8_t * hmac_key)2315 test_AES_CBC_HMAC_SHA512_decrypt_create_session_params(
2316 struct crypto_unittest_params *ut_params,
2317 uint8_t *cipher_key,
2318 uint8_t *hmac_key)
2319 {
2320
2321 /* Setup Cipher Parameters */
2322 ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
2323 ut_params->cipher_xform.next = NULL;
2324
2325 ut_params->cipher_xform.cipher.algo = RTE_CRYPTO_CIPHER_AES_CBC;
2326 ut_params->cipher_xform.cipher.op = RTE_CRYPTO_CIPHER_OP_DECRYPT;
2327 ut_params->cipher_xform.cipher.key.data = cipher_key;
2328 ut_params->cipher_xform.cipher.key.length = CIPHER_KEY_LENGTH_AES_CBC;
2329 ut_params->cipher_xform.cipher.iv.offset = IV_OFFSET;
2330 ut_params->cipher_xform.cipher.iv.length = CIPHER_IV_LENGTH_AES_CBC;
2331
2332 /* Setup HMAC Parameters */
2333 ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;
2334 ut_params->auth_xform.next = &ut_params->cipher_xform;
2335
2336 ut_params->auth_xform.auth.op = RTE_CRYPTO_AUTH_OP_VERIFY;
2337 ut_params->auth_xform.auth.algo = RTE_CRYPTO_AUTH_SHA512_HMAC;
2338 ut_params->auth_xform.auth.key.data = hmac_key;
2339 ut_params->auth_xform.auth.key.length = HMAC_KEY_LENGTH_SHA512;
2340 ut_params->auth_xform.auth.digest_length = DIGEST_BYTE_LENGTH_SHA512;
2341
2342 return TEST_SUCCESS;
2343 }
2344
2345
2346 static int
test_AES_CBC_HMAC_SHA512_decrypt_perform(struct rte_cryptodev_sym_session * sess,struct crypto_unittest_params * ut_params,struct crypto_testsuite_params * ts_params,const uint8_t * cipher,const uint8_t * digest,const uint8_t * iv)2347 test_AES_CBC_HMAC_SHA512_decrypt_perform(struct rte_cryptodev_sym_session *sess,
2348 struct crypto_unittest_params *ut_params,
2349 struct crypto_testsuite_params *ts_params,
2350 const uint8_t *cipher,
2351 const uint8_t *digest,
2352 const uint8_t *iv)
2353 {
2354 /* Generate test mbuf data and digest */
2355 ut_params->ibuf = setup_test_string(ts_params->mbuf_pool,
2356 (const char *)
2357 cipher,
2358 QUOTE_512_BYTES, 0);
2359
2360 ut_params->digest = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
2361 DIGEST_BYTE_LENGTH_SHA512);
2362 TEST_ASSERT_NOT_NULL(ut_params->digest, "no room to append digest");
2363
2364 rte_memcpy(ut_params->digest,
2365 digest,
2366 DIGEST_BYTE_LENGTH_SHA512);
2367
2368 /* Generate Crypto op data structure */
2369 ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
2370 RTE_CRYPTO_OP_TYPE_SYMMETRIC);
2371 TEST_ASSERT_NOT_NULL(ut_params->op,
2372 "Failed to allocate symmetric crypto operation struct");
2373
2374 rte_crypto_op_attach_sym_session(ut_params->op, sess);
2375
2376 struct rte_crypto_sym_op *sym_op = ut_params->op->sym;
2377
2378 /* set crypto operation source mbuf */
2379 sym_op->m_src = ut_params->ibuf;
2380
2381 sym_op->auth.digest.data = ut_params->digest;
2382 sym_op->auth.digest.phys_addr = rte_pktmbuf_iova_offset(
2383 ut_params->ibuf, QUOTE_512_BYTES);
2384
2385 sym_op->auth.data.offset = 0;
2386 sym_op->auth.data.length = QUOTE_512_BYTES;
2387
2388 /* Copy IV at the end of the crypto operation */
2389 rte_memcpy(rte_crypto_op_ctod_offset(ut_params->op, uint8_t *, IV_OFFSET),
2390 iv, CIPHER_IV_LENGTH_AES_CBC);
2391
2392 sym_op->cipher.data.offset = 0;
2393 sym_op->cipher.data.length = QUOTE_512_BYTES;
2394
2395 /* Process crypto operation */
2396 if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
2397 process_cpu_crypt_auth_op(ts_params->valid_devs[0],
2398 ut_params->op);
2399 else if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
2400 process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
2401 ut_params->op, 1, 1, 0, 0);
2402 else
2403 TEST_ASSERT_NOT_NULL(
2404 process_crypto_request(ts_params->valid_devs[0],
2405 ut_params->op),
2406 "failed to process sym crypto op");
2407
2408 TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
2409 "crypto op processing failed");
2410
2411 ut_params->obuf = ut_params->op->sym->m_src;
2412
2413 /* Validate obuf */
2414 TEST_ASSERT_BUFFERS_ARE_EQUAL(
2415 rte_pktmbuf_mtod(ut_params->obuf, uint8_t *),
2416 catch_22_quote,
2417 QUOTE_512_BYTES,
2418 "Plaintext data not as expected");
2419
2420 /* Validate obuf */
2421 TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
2422 "Digest verification failed");
2423
2424 return TEST_SUCCESS;
2425 }
2426
2427 /* ***** SNOW 3G Tests ***** */
2428 static int
create_wireless_algo_hash_session(uint8_t dev_id,const uint8_t * key,const uint8_t key_len,const uint8_t iv_len,const uint8_t auth_len,enum rte_crypto_auth_operation op,enum rte_crypto_auth_algorithm algo)2429 create_wireless_algo_hash_session(uint8_t dev_id,
2430 const uint8_t *key, const uint8_t key_len,
2431 const uint8_t iv_len, const uint8_t auth_len,
2432 enum rte_crypto_auth_operation op,
2433 enum rte_crypto_auth_algorithm algo)
2434 {
2435 uint8_t hash_key[key_len];
2436 int status;
2437
2438 struct crypto_testsuite_params *ts_params = &testsuite_params;
2439 struct crypto_unittest_params *ut_params = &unittest_params;
2440
2441 memcpy(hash_key, key, key_len);
2442
2443 debug_hexdump(stdout, "key:", key, key_len);
2444
2445 /* Setup Authentication Parameters */
2446 ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;
2447 ut_params->auth_xform.next = NULL;
2448
2449 ut_params->auth_xform.auth.op = op;
2450 ut_params->auth_xform.auth.algo = algo;
2451 ut_params->auth_xform.auth.key.length = key_len;
2452 ut_params->auth_xform.auth.key.data = hash_key;
2453 ut_params->auth_xform.auth.digest_length = auth_len;
2454 ut_params->auth_xform.auth.iv.offset = IV_OFFSET;
2455 ut_params->auth_xform.auth.iv.length = iv_len;
2456 ut_params->sess = rte_cryptodev_sym_session_create(
2457 ts_params->session_mpool);
2458
2459 status = rte_cryptodev_sym_session_init(dev_id, ut_params->sess,
2460 &ut_params->auth_xform,
2461 ts_params->session_priv_mpool);
2462 if (status == -ENOTSUP)
2463 return TEST_SKIPPED;
2464
2465 TEST_ASSERT_EQUAL(status, 0, "session init failed");
2466 TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed");
2467 return 0;
2468 }
2469
2470 static int
create_wireless_algo_cipher_session(uint8_t dev_id,enum rte_crypto_cipher_operation op,enum rte_crypto_cipher_algorithm algo,const uint8_t * key,const uint8_t key_len,uint8_t iv_len)2471 create_wireless_algo_cipher_session(uint8_t dev_id,
2472 enum rte_crypto_cipher_operation op,
2473 enum rte_crypto_cipher_algorithm algo,
2474 const uint8_t *key, const uint8_t key_len,
2475 uint8_t iv_len)
2476 {
2477 uint8_t cipher_key[key_len];
2478 int status;
2479 struct crypto_testsuite_params *ts_params = &testsuite_params;
2480 struct crypto_unittest_params *ut_params = &unittest_params;
2481
2482 memcpy(cipher_key, key, key_len);
2483
2484 /* Setup Cipher Parameters */
2485 ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
2486 ut_params->cipher_xform.next = NULL;
2487
2488 ut_params->cipher_xform.cipher.algo = algo;
2489 ut_params->cipher_xform.cipher.op = op;
2490 ut_params->cipher_xform.cipher.key.data = cipher_key;
2491 ut_params->cipher_xform.cipher.key.length = key_len;
2492 ut_params->cipher_xform.cipher.iv.offset = IV_OFFSET;
2493 ut_params->cipher_xform.cipher.iv.length = iv_len;
2494
2495 debug_hexdump(stdout, "key:", key, key_len);
2496
2497 /* Create Crypto session */
2498 ut_params->sess = rte_cryptodev_sym_session_create(
2499 ts_params->session_mpool);
2500
2501 status = rte_cryptodev_sym_session_init(dev_id, ut_params->sess,
2502 &ut_params->cipher_xform,
2503 ts_params->session_priv_mpool);
2504 if (status == -ENOTSUP)
2505 return TEST_SKIPPED;
2506
2507 TEST_ASSERT_EQUAL(status, 0, "session init failed");
2508 TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed");
2509 return 0;
2510 }
2511
2512 static int
create_wireless_algo_cipher_operation(const uint8_t * iv,uint8_t iv_len,unsigned int cipher_len,unsigned int cipher_offset)2513 create_wireless_algo_cipher_operation(const uint8_t *iv, uint8_t iv_len,
2514 unsigned int cipher_len,
2515 unsigned int cipher_offset)
2516 {
2517 struct crypto_testsuite_params *ts_params = &testsuite_params;
2518 struct crypto_unittest_params *ut_params = &unittest_params;
2519
2520 /* Generate Crypto op data structure */
2521 ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
2522 RTE_CRYPTO_OP_TYPE_SYMMETRIC);
2523 TEST_ASSERT_NOT_NULL(ut_params->op,
2524 "Failed to allocate pktmbuf offload");
2525
2526 /* Set crypto operation data parameters */
2527 rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
2528
2529 struct rte_crypto_sym_op *sym_op = ut_params->op->sym;
2530
2531 /* set crypto operation source mbuf */
2532 sym_op->m_src = ut_params->ibuf;
2533
2534 /* iv */
2535 rte_memcpy(rte_crypto_op_ctod_offset(ut_params->op, uint8_t *, IV_OFFSET),
2536 iv, iv_len);
2537 sym_op->cipher.data.length = cipher_len;
2538 sym_op->cipher.data.offset = cipher_offset;
2539 return 0;
2540 }
2541
2542 static int
create_wireless_algo_cipher_operation_oop(const uint8_t * iv,uint8_t iv_len,unsigned int cipher_len,unsigned int cipher_offset)2543 create_wireless_algo_cipher_operation_oop(const uint8_t *iv, uint8_t iv_len,
2544 unsigned int cipher_len,
2545 unsigned int cipher_offset)
2546 {
2547 struct crypto_testsuite_params *ts_params = &testsuite_params;
2548 struct crypto_unittest_params *ut_params = &unittest_params;
2549
2550 /* Generate Crypto op data structure */
2551 ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
2552 RTE_CRYPTO_OP_TYPE_SYMMETRIC);
2553 TEST_ASSERT_NOT_NULL(ut_params->op,
2554 "Failed to allocate pktmbuf offload");
2555
2556 /* Set crypto operation data parameters */
2557 rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
2558
2559 struct rte_crypto_sym_op *sym_op = ut_params->op->sym;
2560
2561 /* set crypto operation source mbuf */
2562 sym_op->m_src = ut_params->ibuf;
2563 sym_op->m_dst = ut_params->obuf;
2564
2565 /* iv */
2566 rte_memcpy(rte_crypto_op_ctod_offset(ut_params->op, uint8_t *, IV_OFFSET),
2567 iv, iv_len);
2568 sym_op->cipher.data.length = cipher_len;
2569 sym_op->cipher.data.offset = cipher_offset;
2570 return 0;
2571 }
2572
2573 static int
create_wireless_algo_cipher_auth_session(uint8_t dev_id,enum rte_crypto_cipher_operation cipher_op,enum rte_crypto_auth_operation auth_op,enum rte_crypto_auth_algorithm auth_algo,enum rte_crypto_cipher_algorithm cipher_algo,const uint8_t * key,uint8_t key_len,uint8_t auth_iv_len,uint8_t auth_len,uint8_t cipher_iv_len)2574 create_wireless_algo_cipher_auth_session(uint8_t dev_id,
2575 enum rte_crypto_cipher_operation cipher_op,
2576 enum rte_crypto_auth_operation auth_op,
2577 enum rte_crypto_auth_algorithm auth_algo,
2578 enum rte_crypto_cipher_algorithm cipher_algo,
2579 const uint8_t *key, uint8_t key_len,
2580 uint8_t auth_iv_len, uint8_t auth_len,
2581 uint8_t cipher_iv_len)
2582
2583 {
2584 uint8_t cipher_auth_key[key_len];
2585 int status;
2586
2587 struct crypto_testsuite_params *ts_params = &testsuite_params;
2588 struct crypto_unittest_params *ut_params = &unittest_params;
2589
2590 memcpy(cipher_auth_key, key, key_len);
2591
2592 /* Setup Authentication Parameters */
2593 ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;
2594 ut_params->auth_xform.next = NULL;
2595
2596 ut_params->auth_xform.auth.op = auth_op;
2597 ut_params->auth_xform.auth.algo = auth_algo;
2598 ut_params->auth_xform.auth.key.length = key_len;
2599 /* Hash key = cipher key */
2600 ut_params->auth_xform.auth.key.data = cipher_auth_key;
2601 ut_params->auth_xform.auth.digest_length = auth_len;
2602 /* Auth IV will be after cipher IV */
2603 ut_params->auth_xform.auth.iv.offset = IV_OFFSET + cipher_iv_len;
2604 ut_params->auth_xform.auth.iv.length = auth_iv_len;
2605
2606 /* Setup Cipher Parameters */
2607 ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
2608 ut_params->cipher_xform.next = &ut_params->auth_xform;
2609
2610 ut_params->cipher_xform.cipher.algo = cipher_algo;
2611 ut_params->cipher_xform.cipher.op = cipher_op;
2612 ut_params->cipher_xform.cipher.key.data = cipher_auth_key;
2613 ut_params->cipher_xform.cipher.key.length = key_len;
2614 ut_params->cipher_xform.cipher.iv.offset = IV_OFFSET;
2615 ut_params->cipher_xform.cipher.iv.length = cipher_iv_len;
2616
2617 debug_hexdump(stdout, "key:", key, key_len);
2618
2619 /* Create Crypto session*/
2620 ut_params->sess = rte_cryptodev_sym_session_create(
2621 ts_params->session_mpool);
2622 TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed");
2623
2624 status = rte_cryptodev_sym_session_init(dev_id, ut_params->sess,
2625 &ut_params->cipher_xform,
2626 ts_params->session_priv_mpool);
2627 if (status == -ENOTSUP)
2628 return TEST_SKIPPED;
2629
2630 TEST_ASSERT_EQUAL(status, 0, "session init failed");
2631 return 0;
2632 }
2633
2634 static int
create_wireless_cipher_auth_session(uint8_t dev_id,enum rte_crypto_cipher_operation cipher_op,enum rte_crypto_auth_operation auth_op,enum rte_crypto_auth_algorithm auth_algo,enum rte_crypto_cipher_algorithm cipher_algo,const struct wireless_test_data * tdata)2635 create_wireless_cipher_auth_session(uint8_t dev_id,
2636 enum rte_crypto_cipher_operation cipher_op,
2637 enum rte_crypto_auth_operation auth_op,
2638 enum rte_crypto_auth_algorithm auth_algo,
2639 enum rte_crypto_cipher_algorithm cipher_algo,
2640 const struct wireless_test_data *tdata)
2641 {
2642 const uint8_t key_len = tdata->key.len;
2643 uint8_t cipher_auth_key[key_len];
2644 int status;
2645
2646 struct crypto_testsuite_params *ts_params = &testsuite_params;
2647 struct crypto_unittest_params *ut_params = &unittest_params;
2648 const uint8_t *key = tdata->key.data;
2649 const uint8_t auth_len = tdata->digest.len;
2650 uint8_t cipher_iv_len = tdata->cipher_iv.len;
2651 uint8_t auth_iv_len = tdata->auth_iv.len;
2652
2653 memcpy(cipher_auth_key, key, key_len);
2654
2655 /* Setup Authentication Parameters */
2656 ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;
2657 ut_params->auth_xform.next = NULL;
2658
2659 ut_params->auth_xform.auth.op = auth_op;
2660 ut_params->auth_xform.auth.algo = auth_algo;
2661 ut_params->auth_xform.auth.key.length = key_len;
2662 /* Hash key = cipher key */
2663 ut_params->auth_xform.auth.key.data = cipher_auth_key;
2664 ut_params->auth_xform.auth.digest_length = auth_len;
2665 /* Auth IV will be after cipher IV */
2666 ut_params->auth_xform.auth.iv.offset = IV_OFFSET + cipher_iv_len;
2667 ut_params->auth_xform.auth.iv.length = auth_iv_len;
2668
2669 /* Setup Cipher Parameters */
2670 ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
2671 ut_params->cipher_xform.next = &ut_params->auth_xform;
2672
2673 ut_params->cipher_xform.cipher.algo = cipher_algo;
2674 ut_params->cipher_xform.cipher.op = cipher_op;
2675 ut_params->cipher_xform.cipher.key.data = cipher_auth_key;
2676 ut_params->cipher_xform.cipher.key.length = key_len;
2677 ut_params->cipher_xform.cipher.iv.offset = IV_OFFSET;
2678 ut_params->cipher_xform.cipher.iv.length = cipher_iv_len;
2679
2680
2681 debug_hexdump(stdout, "key:", key, key_len);
2682
2683 /* Create Crypto session*/
2684 ut_params->sess = rte_cryptodev_sym_session_create(
2685 ts_params->session_mpool);
2686
2687 status = rte_cryptodev_sym_session_init(dev_id, ut_params->sess,
2688 &ut_params->cipher_xform,
2689 ts_params->session_priv_mpool);
2690 if (status == -ENOTSUP)
2691 return TEST_SKIPPED;
2692
2693 TEST_ASSERT_EQUAL(status, 0, "session init failed");
2694 TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed");
2695 return 0;
2696 }
2697
2698 static int
create_zuc_cipher_auth_encrypt_generate_session(uint8_t dev_id,const struct wireless_test_data * tdata)2699 create_zuc_cipher_auth_encrypt_generate_session(uint8_t dev_id,
2700 const struct wireless_test_data *tdata)
2701 {
2702 return create_wireless_cipher_auth_session(dev_id,
2703 RTE_CRYPTO_CIPHER_OP_ENCRYPT,
2704 RTE_CRYPTO_AUTH_OP_GENERATE, RTE_CRYPTO_AUTH_ZUC_EIA3,
2705 RTE_CRYPTO_CIPHER_ZUC_EEA3, tdata);
2706 }
2707
2708 static int
create_wireless_algo_auth_cipher_session(uint8_t dev_id,enum rte_crypto_cipher_operation cipher_op,enum rte_crypto_auth_operation auth_op,enum rte_crypto_auth_algorithm auth_algo,enum rte_crypto_cipher_algorithm cipher_algo,const uint8_t * key,const uint8_t key_len,uint8_t auth_iv_len,uint8_t auth_len,uint8_t cipher_iv_len)2709 create_wireless_algo_auth_cipher_session(uint8_t dev_id,
2710 enum rte_crypto_cipher_operation cipher_op,
2711 enum rte_crypto_auth_operation auth_op,
2712 enum rte_crypto_auth_algorithm auth_algo,
2713 enum rte_crypto_cipher_algorithm cipher_algo,
2714 const uint8_t *key, const uint8_t key_len,
2715 uint8_t auth_iv_len, uint8_t auth_len,
2716 uint8_t cipher_iv_len)
2717 {
2718 uint8_t auth_cipher_key[key_len];
2719 int status;
2720 struct crypto_testsuite_params *ts_params = &testsuite_params;
2721 struct crypto_unittest_params *ut_params = &unittest_params;
2722
2723 memcpy(auth_cipher_key, key, key_len);
2724
2725 /* Setup Authentication Parameters */
2726 ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;
2727 ut_params->auth_xform.auth.op = auth_op;
2728 ut_params->auth_xform.next = &ut_params->cipher_xform;
2729 ut_params->auth_xform.auth.algo = auth_algo;
2730 ut_params->auth_xform.auth.key.length = key_len;
2731 ut_params->auth_xform.auth.key.data = auth_cipher_key;
2732 ut_params->auth_xform.auth.digest_length = auth_len;
2733 /* Auth IV will be after cipher IV */
2734 ut_params->auth_xform.auth.iv.offset = IV_OFFSET + cipher_iv_len;
2735 ut_params->auth_xform.auth.iv.length = auth_iv_len;
2736
2737 /* Setup Cipher Parameters */
2738 ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
2739 ut_params->cipher_xform.next = NULL;
2740 ut_params->cipher_xform.cipher.algo = cipher_algo;
2741 ut_params->cipher_xform.cipher.op = cipher_op;
2742 ut_params->cipher_xform.cipher.key.data = auth_cipher_key;
2743 ut_params->cipher_xform.cipher.key.length = key_len;
2744 ut_params->cipher_xform.cipher.iv.offset = IV_OFFSET;
2745 ut_params->cipher_xform.cipher.iv.length = cipher_iv_len;
2746
2747 debug_hexdump(stdout, "key:", key, key_len);
2748
2749 /* Create Crypto session*/
2750 ut_params->sess = rte_cryptodev_sym_session_create(
2751 ts_params->session_mpool);
2752 TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed");
2753
2754 if (cipher_op == RTE_CRYPTO_CIPHER_OP_DECRYPT) {
2755 ut_params->auth_xform.next = NULL;
2756 ut_params->cipher_xform.next = &ut_params->auth_xform;
2757 status = rte_cryptodev_sym_session_init(dev_id, ut_params->sess,
2758 &ut_params->cipher_xform,
2759 ts_params->session_priv_mpool);
2760
2761 } else
2762 status = rte_cryptodev_sym_session_init(dev_id, ut_params->sess,
2763 &ut_params->auth_xform,
2764 ts_params->session_priv_mpool);
2765
2766 if (status == -ENOTSUP)
2767 return TEST_SKIPPED;
2768
2769 TEST_ASSERT_EQUAL(status, 0, "session init failed");
2770
2771 return 0;
2772 }
2773
2774 static int
create_wireless_algo_hash_operation(const uint8_t * auth_tag,unsigned int auth_tag_len,const uint8_t * iv,unsigned int iv_len,unsigned int data_pad_len,enum rte_crypto_auth_operation op,unsigned int auth_len,unsigned int auth_offset)2775 create_wireless_algo_hash_operation(const uint8_t *auth_tag,
2776 unsigned int auth_tag_len,
2777 const uint8_t *iv, unsigned int iv_len,
2778 unsigned int data_pad_len,
2779 enum rte_crypto_auth_operation op,
2780 unsigned int auth_len, unsigned int auth_offset)
2781 {
2782 struct crypto_testsuite_params *ts_params = &testsuite_params;
2783
2784 struct crypto_unittest_params *ut_params = &unittest_params;
2785
2786 /* Generate Crypto op data structure */
2787 ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
2788 RTE_CRYPTO_OP_TYPE_SYMMETRIC);
2789 TEST_ASSERT_NOT_NULL(ut_params->op,
2790 "Failed to allocate pktmbuf offload");
2791
2792 /* Set crypto operation data parameters */
2793 rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
2794
2795 struct rte_crypto_sym_op *sym_op = ut_params->op->sym;
2796
2797 /* set crypto operation source mbuf */
2798 sym_op->m_src = ut_params->ibuf;
2799
2800 /* iv */
2801 rte_memcpy(rte_crypto_op_ctod_offset(ut_params->op, uint8_t *, IV_OFFSET),
2802 iv, iv_len);
2803 /* digest */
2804 sym_op->auth.digest.data = (uint8_t *)rte_pktmbuf_append(
2805 ut_params->ibuf, auth_tag_len);
2806
2807 TEST_ASSERT_NOT_NULL(sym_op->auth.digest.data,
2808 "no room to append auth tag");
2809 ut_params->digest = sym_op->auth.digest.data;
2810 sym_op->auth.digest.phys_addr = rte_pktmbuf_iova_offset(
2811 ut_params->ibuf, data_pad_len);
2812 if (op == RTE_CRYPTO_AUTH_OP_GENERATE)
2813 memset(sym_op->auth.digest.data, 0, auth_tag_len);
2814 else
2815 rte_memcpy(sym_op->auth.digest.data, auth_tag, auth_tag_len);
2816
2817 debug_hexdump(stdout, "digest:",
2818 sym_op->auth.digest.data,
2819 auth_tag_len);
2820
2821 sym_op->auth.data.length = auth_len;
2822 sym_op->auth.data.offset = auth_offset;
2823
2824 return 0;
2825 }
2826
2827 static int
create_wireless_cipher_hash_operation(const struct wireless_test_data * tdata,enum rte_crypto_auth_operation op)2828 create_wireless_cipher_hash_operation(const struct wireless_test_data *tdata,
2829 enum rte_crypto_auth_operation op)
2830 {
2831 struct crypto_testsuite_params *ts_params = &testsuite_params;
2832 struct crypto_unittest_params *ut_params = &unittest_params;
2833
2834 const uint8_t *auth_tag = tdata->digest.data;
2835 const unsigned int auth_tag_len = tdata->digest.len;
2836 unsigned int plaintext_len = ceil_byte_length(tdata->plaintext.len);
2837 unsigned int data_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16);
2838
2839 const uint8_t *cipher_iv = tdata->cipher_iv.data;
2840 const uint8_t cipher_iv_len = tdata->cipher_iv.len;
2841 const uint8_t *auth_iv = tdata->auth_iv.data;
2842 const uint8_t auth_iv_len = tdata->auth_iv.len;
2843 const unsigned int cipher_len = tdata->validCipherLenInBits.len;
2844 const unsigned int auth_len = tdata->validAuthLenInBits.len;
2845
2846 /* Generate Crypto op data structure */
2847 ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
2848 RTE_CRYPTO_OP_TYPE_SYMMETRIC);
2849 TEST_ASSERT_NOT_NULL(ut_params->op,
2850 "Failed to allocate pktmbuf offload");
2851 /* Set crypto operation data parameters */
2852 rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
2853
2854 struct rte_crypto_sym_op *sym_op = ut_params->op->sym;
2855
2856 /* set crypto operation source mbuf */
2857 sym_op->m_src = ut_params->ibuf;
2858
2859 /* digest */
2860 sym_op->auth.digest.data = (uint8_t *)rte_pktmbuf_append(
2861 ut_params->ibuf, auth_tag_len);
2862
2863 TEST_ASSERT_NOT_NULL(sym_op->auth.digest.data,
2864 "no room to append auth tag");
2865 ut_params->digest = sym_op->auth.digest.data;
2866 sym_op->auth.digest.phys_addr = rte_pktmbuf_iova_offset(
2867 ut_params->ibuf, data_pad_len);
2868 if (op == RTE_CRYPTO_AUTH_OP_GENERATE)
2869 memset(sym_op->auth.digest.data, 0, auth_tag_len);
2870 else
2871 rte_memcpy(sym_op->auth.digest.data, auth_tag, auth_tag_len);
2872
2873 debug_hexdump(stdout, "digest:",
2874 sym_op->auth.digest.data,
2875 auth_tag_len);
2876
2877 /* Copy cipher and auth IVs at the end of the crypto operation */
2878 uint8_t *iv_ptr = rte_crypto_op_ctod_offset(ut_params->op, uint8_t *,
2879 IV_OFFSET);
2880 rte_memcpy(iv_ptr, cipher_iv, cipher_iv_len);
2881 iv_ptr += cipher_iv_len;
2882 rte_memcpy(iv_ptr, auth_iv, auth_iv_len);
2883
2884 sym_op->cipher.data.length = cipher_len;
2885 sym_op->cipher.data.offset = 0;
2886 sym_op->auth.data.length = auth_len;
2887 sym_op->auth.data.offset = 0;
2888
2889 return 0;
2890 }
2891
2892 static int
create_zuc_cipher_hash_generate_operation(const struct wireless_test_data * tdata)2893 create_zuc_cipher_hash_generate_operation(
2894 const struct wireless_test_data *tdata)
2895 {
2896 return create_wireless_cipher_hash_operation(tdata,
2897 RTE_CRYPTO_AUTH_OP_GENERATE);
2898 }
2899
2900 static int
create_wireless_algo_cipher_hash_operation(const uint8_t * auth_tag,const unsigned auth_tag_len,const uint8_t * auth_iv,uint8_t auth_iv_len,unsigned data_pad_len,enum rte_crypto_auth_operation op,const uint8_t * cipher_iv,uint8_t cipher_iv_len,const unsigned cipher_len,const unsigned cipher_offset,const unsigned auth_len,const unsigned auth_offset)2901 create_wireless_algo_cipher_hash_operation(const uint8_t *auth_tag,
2902 const unsigned auth_tag_len,
2903 const uint8_t *auth_iv, uint8_t auth_iv_len,
2904 unsigned data_pad_len,
2905 enum rte_crypto_auth_operation op,
2906 const uint8_t *cipher_iv, uint8_t cipher_iv_len,
2907 const unsigned cipher_len, const unsigned cipher_offset,
2908 const unsigned auth_len, const unsigned auth_offset)
2909 {
2910 struct crypto_testsuite_params *ts_params = &testsuite_params;
2911 struct crypto_unittest_params *ut_params = &unittest_params;
2912
2913 enum rte_crypto_cipher_algorithm cipher_algo =
2914 ut_params->cipher_xform.cipher.algo;
2915 enum rte_crypto_auth_algorithm auth_algo =
2916 ut_params->auth_xform.auth.algo;
2917
2918 /* Generate Crypto op data structure */
2919 ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
2920 RTE_CRYPTO_OP_TYPE_SYMMETRIC);
2921 TEST_ASSERT_NOT_NULL(ut_params->op,
2922 "Failed to allocate pktmbuf offload");
2923 /* Set crypto operation data parameters */
2924 rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
2925
2926 struct rte_crypto_sym_op *sym_op = ut_params->op->sym;
2927
2928 /* set crypto operation source mbuf */
2929 sym_op->m_src = ut_params->ibuf;
2930
2931 /* digest */
2932 sym_op->auth.digest.data = (uint8_t *)rte_pktmbuf_append(
2933 ut_params->ibuf, auth_tag_len);
2934
2935 TEST_ASSERT_NOT_NULL(sym_op->auth.digest.data,
2936 "no room to append auth tag");
2937 ut_params->digest = sym_op->auth.digest.data;
2938
2939 if (rte_pktmbuf_is_contiguous(ut_params->ibuf)) {
2940 sym_op->auth.digest.phys_addr = rte_pktmbuf_iova_offset(
2941 ut_params->ibuf, data_pad_len);
2942 } else {
2943 struct rte_mbuf *m = ut_params->ibuf;
2944 unsigned int offset = data_pad_len;
2945
2946 while (offset > m->data_len && m->next != NULL) {
2947 offset -= m->data_len;
2948 m = m->next;
2949 }
2950 sym_op->auth.digest.phys_addr = rte_pktmbuf_iova_offset(
2951 m, offset);
2952 }
2953
2954 if (op == RTE_CRYPTO_AUTH_OP_GENERATE)
2955 memset(sym_op->auth.digest.data, 0, auth_tag_len);
2956 else
2957 rte_memcpy(sym_op->auth.digest.data, auth_tag, auth_tag_len);
2958
2959 debug_hexdump(stdout, "digest:",
2960 sym_op->auth.digest.data,
2961 auth_tag_len);
2962
2963 /* Copy cipher and auth IVs at the end of the crypto operation */
2964 uint8_t *iv_ptr = rte_crypto_op_ctod_offset(ut_params->op, uint8_t *,
2965 IV_OFFSET);
2966 rte_memcpy(iv_ptr, cipher_iv, cipher_iv_len);
2967 iv_ptr += cipher_iv_len;
2968 rte_memcpy(iv_ptr, auth_iv, auth_iv_len);
2969
2970 if (cipher_algo == RTE_CRYPTO_CIPHER_SNOW3G_UEA2 ||
2971 cipher_algo == RTE_CRYPTO_CIPHER_KASUMI_F8 ||
2972 cipher_algo == RTE_CRYPTO_CIPHER_ZUC_EEA3) {
2973 sym_op->cipher.data.length = cipher_len;
2974 sym_op->cipher.data.offset = cipher_offset;
2975 } else {
2976 sym_op->cipher.data.length = cipher_len >> 3;
2977 sym_op->cipher.data.offset = cipher_offset >> 3;
2978 }
2979
2980 if (auth_algo == RTE_CRYPTO_AUTH_SNOW3G_UIA2 ||
2981 auth_algo == RTE_CRYPTO_AUTH_KASUMI_F9 ||
2982 auth_algo == RTE_CRYPTO_AUTH_ZUC_EIA3) {
2983 sym_op->auth.data.length = auth_len;
2984 sym_op->auth.data.offset = auth_offset;
2985 } else {
2986 sym_op->auth.data.length = auth_len >> 3;
2987 sym_op->auth.data.offset = auth_offset >> 3;
2988 }
2989
2990 return 0;
2991 }
2992
2993 static int
create_wireless_algo_auth_cipher_operation(const uint8_t * auth_tag,unsigned int auth_tag_len,const uint8_t * cipher_iv,uint8_t cipher_iv_len,const uint8_t * auth_iv,uint8_t auth_iv_len,unsigned int data_pad_len,unsigned int cipher_len,unsigned int cipher_offset,unsigned int auth_len,unsigned int auth_offset,uint8_t op_mode,uint8_t do_sgl,uint8_t verify)2994 create_wireless_algo_auth_cipher_operation(
2995 const uint8_t *auth_tag, unsigned int auth_tag_len,
2996 const uint8_t *cipher_iv, uint8_t cipher_iv_len,
2997 const uint8_t *auth_iv, uint8_t auth_iv_len,
2998 unsigned int data_pad_len,
2999 unsigned int cipher_len, unsigned int cipher_offset,
3000 unsigned int auth_len, unsigned int auth_offset,
3001 uint8_t op_mode, uint8_t do_sgl, uint8_t verify)
3002 {
3003 struct crypto_testsuite_params *ts_params = &testsuite_params;
3004 struct crypto_unittest_params *ut_params = &unittest_params;
3005
3006 enum rte_crypto_cipher_algorithm cipher_algo =
3007 ut_params->cipher_xform.cipher.algo;
3008 enum rte_crypto_auth_algorithm auth_algo =
3009 ut_params->auth_xform.auth.algo;
3010
3011 /* Generate Crypto op data structure */
3012 ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
3013 RTE_CRYPTO_OP_TYPE_SYMMETRIC);
3014 TEST_ASSERT_NOT_NULL(ut_params->op,
3015 "Failed to allocate pktmbuf offload");
3016
3017 /* Set crypto operation data parameters */
3018 rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
3019
3020 struct rte_crypto_sym_op *sym_op = ut_params->op->sym;
3021
3022 /* set crypto operation mbufs */
3023 sym_op->m_src = ut_params->ibuf;
3024 if (op_mode == OUT_OF_PLACE)
3025 sym_op->m_dst = ut_params->obuf;
3026
3027 /* digest */
3028 if (!do_sgl) {
3029 sym_op->auth.digest.data = rte_pktmbuf_mtod_offset(
3030 (op_mode == IN_PLACE ?
3031 ut_params->ibuf : ut_params->obuf),
3032 uint8_t *, data_pad_len);
3033 sym_op->auth.digest.phys_addr = rte_pktmbuf_iova_offset(
3034 (op_mode == IN_PLACE ?
3035 ut_params->ibuf : ut_params->obuf),
3036 data_pad_len);
3037 memset(sym_op->auth.digest.data, 0, auth_tag_len);
3038 } else {
3039 uint16_t remaining_off = (auth_offset >> 3) + (auth_len >> 3);
3040 struct rte_mbuf *sgl_buf = (op_mode == IN_PLACE ?
3041 sym_op->m_src : sym_op->m_dst);
3042 while (remaining_off >= rte_pktmbuf_data_len(sgl_buf)) {
3043 remaining_off -= rte_pktmbuf_data_len(sgl_buf);
3044 sgl_buf = sgl_buf->next;
3045 }
3046 sym_op->auth.digest.data = rte_pktmbuf_mtod_offset(sgl_buf,
3047 uint8_t *, remaining_off);
3048 sym_op->auth.digest.phys_addr = rte_pktmbuf_iova_offset(sgl_buf,
3049 remaining_off);
3050 memset(sym_op->auth.digest.data, 0, remaining_off);
3051 while (sgl_buf->next != NULL) {
3052 memset(rte_pktmbuf_mtod(sgl_buf, uint8_t *),
3053 0, rte_pktmbuf_data_len(sgl_buf));
3054 sgl_buf = sgl_buf->next;
3055 }
3056 }
3057
3058 /* Copy digest for the verification */
3059 if (verify)
3060 memcpy(sym_op->auth.digest.data, auth_tag, auth_tag_len);
3061
3062 /* Copy cipher and auth IVs at the end of the crypto operation */
3063 uint8_t *iv_ptr = rte_crypto_op_ctod_offset(
3064 ut_params->op, uint8_t *, IV_OFFSET);
3065
3066 rte_memcpy(iv_ptr, cipher_iv, cipher_iv_len);
3067 iv_ptr += cipher_iv_len;
3068 rte_memcpy(iv_ptr, auth_iv, auth_iv_len);
3069
3070 /* Only copy over the offset data needed from src to dst in OOP,
3071 * if the auth and cipher offsets are not aligned
3072 */
3073 if (op_mode == OUT_OF_PLACE) {
3074 if (cipher_offset > auth_offset)
3075 rte_memcpy(
3076 rte_pktmbuf_mtod_offset(
3077 sym_op->m_dst,
3078 uint8_t *, auth_offset >> 3),
3079 rte_pktmbuf_mtod_offset(
3080 sym_op->m_src,
3081 uint8_t *, auth_offset >> 3),
3082 ((cipher_offset >> 3) - (auth_offset >> 3)));
3083 }
3084
3085 if (cipher_algo == RTE_CRYPTO_CIPHER_SNOW3G_UEA2 ||
3086 cipher_algo == RTE_CRYPTO_CIPHER_KASUMI_F8 ||
3087 cipher_algo == RTE_CRYPTO_CIPHER_ZUC_EEA3) {
3088 sym_op->cipher.data.length = cipher_len;
3089 sym_op->cipher.data.offset = cipher_offset;
3090 } else {
3091 sym_op->cipher.data.length = cipher_len >> 3;
3092 sym_op->cipher.data.offset = cipher_offset >> 3;
3093 }
3094
3095 if (auth_algo == RTE_CRYPTO_AUTH_SNOW3G_UIA2 ||
3096 auth_algo == RTE_CRYPTO_AUTH_KASUMI_F9 ||
3097 auth_algo == RTE_CRYPTO_AUTH_ZUC_EIA3) {
3098 sym_op->auth.data.length = auth_len;
3099 sym_op->auth.data.offset = auth_offset;
3100 } else {
3101 sym_op->auth.data.length = auth_len >> 3;
3102 sym_op->auth.data.offset = auth_offset >> 3;
3103 }
3104
3105 return 0;
3106 }
3107
3108 static int
test_snow3g_authentication(const struct snow3g_hash_test_data * tdata)3109 test_snow3g_authentication(const struct snow3g_hash_test_data *tdata)
3110 {
3111 struct crypto_testsuite_params *ts_params = &testsuite_params;
3112 struct crypto_unittest_params *ut_params = &unittest_params;
3113
3114 int retval;
3115 unsigned plaintext_pad_len;
3116 unsigned plaintext_len;
3117 uint8_t *plaintext;
3118 struct rte_cryptodev_info dev_info;
3119
3120 rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
3121 uint64_t feat_flags = dev_info.feature_flags;
3122
3123 if (!(feat_flags & RTE_CRYPTODEV_FF_NON_BYTE_ALIGNED_DATA) &&
3124 ((tdata->validAuthLenInBits.len % 8) != 0)) {
3125 printf("Device doesn't support NON-Byte Aligned Data.\n");
3126 return TEST_SKIPPED;
3127 }
3128
3129 if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
3130 (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
3131 printf("Device doesn't support RAW data-path APIs.\n");
3132 return TEST_SKIPPED;
3133 }
3134
3135 if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
3136 return TEST_SKIPPED;
3137
3138 /* Verify the capabilities */
3139 struct rte_cryptodev_sym_capability_idx cap_idx;
3140 cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
3141 cap_idx.algo.auth = RTE_CRYPTO_AUTH_SNOW3G_UIA2;
3142 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
3143 &cap_idx) == NULL)
3144 return TEST_SKIPPED;
3145
3146 /* Create SNOW 3G session */
3147 retval = create_wireless_algo_hash_session(ts_params->valid_devs[0],
3148 tdata->key.data, tdata->key.len,
3149 tdata->auth_iv.len, tdata->digest.len,
3150 RTE_CRYPTO_AUTH_OP_GENERATE,
3151 RTE_CRYPTO_AUTH_SNOW3G_UIA2);
3152 if (retval < 0)
3153 return retval;
3154
3155 /* alloc mbuf and set payload */
3156 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
3157
3158 memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
3159 rte_pktmbuf_tailroom(ut_params->ibuf));
3160
3161 plaintext_len = ceil_byte_length(tdata->plaintext.len);
3162 /* Append data which is padded to a multiple of */
3163 /* the algorithms block size */
3164 plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16);
3165 plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
3166 plaintext_pad_len);
3167 memcpy(plaintext, tdata->plaintext.data, plaintext_len);
3168
3169 /* Create SNOW 3G operation */
3170 retval = create_wireless_algo_hash_operation(NULL, tdata->digest.len,
3171 tdata->auth_iv.data, tdata->auth_iv.len,
3172 plaintext_pad_len, RTE_CRYPTO_AUTH_OP_GENERATE,
3173 tdata->validAuthLenInBits.len,
3174 0);
3175 if (retval < 0)
3176 return retval;
3177
3178 if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
3179 process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
3180 ut_params->op, 0, 1, 1, 0);
3181 else
3182 ut_params->op = process_crypto_request(ts_params->valid_devs[0],
3183 ut_params->op);
3184 ut_params->obuf = ut_params->op->sym->m_src;
3185 TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
3186 ut_params->digest = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *)
3187 + plaintext_pad_len;
3188
3189 /* Validate obuf */
3190 TEST_ASSERT_BUFFERS_ARE_EQUAL(
3191 ut_params->digest,
3192 tdata->digest.data,
3193 DIGEST_BYTE_LENGTH_SNOW3G_UIA2,
3194 "SNOW 3G Generated auth tag not as expected");
3195
3196 return 0;
3197 }
3198
3199 static int
test_snow3g_authentication_verify(const struct snow3g_hash_test_data * tdata)3200 test_snow3g_authentication_verify(const struct snow3g_hash_test_data *tdata)
3201 {
3202 struct crypto_testsuite_params *ts_params = &testsuite_params;
3203 struct crypto_unittest_params *ut_params = &unittest_params;
3204
3205 int retval;
3206 unsigned plaintext_pad_len;
3207 unsigned plaintext_len;
3208 uint8_t *plaintext;
3209 struct rte_cryptodev_info dev_info;
3210
3211 rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
3212 uint64_t feat_flags = dev_info.feature_flags;
3213
3214 if (!(feat_flags & RTE_CRYPTODEV_FF_NON_BYTE_ALIGNED_DATA) &&
3215 ((tdata->validAuthLenInBits.len % 8) != 0)) {
3216 printf("Device doesn't support NON-Byte Aligned Data.\n");
3217 return TEST_SKIPPED;
3218 }
3219
3220 if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
3221 (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
3222 printf("Device doesn't support RAW data-path APIs.\n");
3223 return TEST_SKIPPED;
3224 }
3225
3226 if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
3227 return TEST_SKIPPED;
3228
3229 /* Verify the capabilities */
3230 struct rte_cryptodev_sym_capability_idx cap_idx;
3231 cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
3232 cap_idx.algo.auth = RTE_CRYPTO_AUTH_SNOW3G_UIA2;
3233 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
3234 &cap_idx) == NULL)
3235 return TEST_SKIPPED;
3236
3237 /* Create SNOW 3G session */
3238 retval = create_wireless_algo_hash_session(ts_params->valid_devs[0],
3239 tdata->key.data, tdata->key.len,
3240 tdata->auth_iv.len, tdata->digest.len,
3241 RTE_CRYPTO_AUTH_OP_VERIFY,
3242 RTE_CRYPTO_AUTH_SNOW3G_UIA2);
3243 if (retval < 0)
3244 return retval;
3245 /* alloc mbuf and set payload */
3246 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
3247
3248 memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
3249 rte_pktmbuf_tailroom(ut_params->ibuf));
3250
3251 plaintext_len = ceil_byte_length(tdata->plaintext.len);
3252 /* Append data which is padded to a multiple of */
3253 /* the algorithms block size */
3254 plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16);
3255 plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
3256 plaintext_pad_len);
3257 memcpy(plaintext, tdata->plaintext.data, plaintext_len);
3258
3259 /* Create SNOW 3G operation */
3260 retval = create_wireless_algo_hash_operation(tdata->digest.data,
3261 tdata->digest.len,
3262 tdata->auth_iv.data, tdata->auth_iv.len,
3263 plaintext_pad_len,
3264 RTE_CRYPTO_AUTH_OP_VERIFY,
3265 tdata->validAuthLenInBits.len,
3266 0);
3267 if (retval < 0)
3268 return retval;
3269
3270 if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
3271 process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
3272 ut_params->op, 0, 1, 1, 0);
3273 else
3274 ut_params->op = process_crypto_request(ts_params->valid_devs[0],
3275 ut_params->op);
3276 TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
3277 ut_params->obuf = ut_params->op->sym->m_src;
3278 ut_params->digest = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *)
3279 + plaintext_pad_len;
3280
3281 /* Validate obuf */
3282 if (ut_params->op->status == RTE_CRYPTO_OP_STATUS_SUCCESS)
3283 return 0;
3284 else
3285 return -1;
3286
3287 return 0;
3288 }
3289
3290 static int
test_kasumi_authentication(const struct kasumi_hash_test_data * tdata)3291 test_kasumi_authentication(const struct kasumi_hash_test_data *tdata)
3292 {
3293 struct crypto_testsuite_params *ts_params = &testsuite_params;
3294 struct crypto_unittest_params *ut_params = &unittest_params;
3295
3296 int retval;
3297 unsigned plaintext_pad_len;
3298 unsigned plaintext_len;
3299 uint8_t *plaintext;
3300 struct rte_cryptodev_info dev_info;
3301
3302 rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
3303 uint64_t feat_flags = dev_info.feature_flags;
3304
3305 if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
3306 (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
3307 printf("Device doesn't support RAW data-path APIs.\n");
3308 return TEST_SKIPPED;
3309 }
3310
3311 if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
3312 return TEST_SKIPPED;
3313
3314 /* Verify the capabilities */
3315 struct rte_cryptodev_sym_capability_idx cap_idx;
3316 cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
3317 cap_idx.algo.auth = RTE_CRYPTO_AUTH_KASUMI_F9;
3318 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
3319 &cap_idx) == NULL)
3320 return TEST_SKIPPED;
3321
3322 /* Create KASUMI session */
3323 retval = create_wireless_algo_hash_session(ts_params->valid_devs[0],
3324 tdata->key.data, tdata->key.len,
3325 0, tdata->digest.len,
3326 RTE_CRYPTO_AUTH_OP_GENERATE,
3327 RTE_CRYPTO_AUTH_KASUMI_F9);
3328 if (retval < 0)
3329 return retval;
3330
3331 /* alloc mbuf and set payload */
3332 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
3333
3334 memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
3335 rte_pktmbuf_tailroom(ut_params->ibuf));
3336
3337 plaintext_len = ceil_byte_length(tdata->plaintext.len);
3338 /* Append data which is padded to a multiple of */
3339 /* the algorithms block size */
3340 plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 8);
3341 plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
3342 plaintext_pad_len);
3343 memcpy(plaintext, tdata->plaintext.data, plaintext_len);
3344
3345 /* Create KASUMI operation */
3346 retval = create_wireless_algo_hash_operation(NULL, tdata->digest.len,
3347 NULL, 0,
3348 plaintext_pad_len, RTE_CRYPTO_AUTH_OP_GENERATE,
3349 tdata->plaintext.len,
3350 0);
3351 if (retval < 0)
3352 return retval;
3353
3354 if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
3355 process_cpu_crypt_auth_op(ts_params->valid_devs[0],
3356 ut_params->op);
3357 else if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
3358 process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
3359 ut_params->op, 0, 1, 1, 0);
3360 else
3361 ut_params->op = process_crypto_request(ts_params->valid_devs[0],
3362 ut_params->op);
3363
3364 ut_params->obuf = ut_params->op->sym->m_src;
3365 TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
3366 ut_params->digest = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *)
3367 + plaintext_pad_len;
3368
3369 /* Validate obuf */
3370 TEST_ASSERT_BUFFERS_ARE_EQUAL(
3371 ut_params->digest,
3372 tdata->digest.data,
3373 DIGEST_BYTE_LENGTH_KASUMI_F9,
3374 "KASUMI Generated auth tag not as expected");
3375
3376 return 0;
3377 }
3378
3379 static int
test_kasumi_authentication_verify(const struct kasumi_hash_test_data * tdata)3380 test_kasumi_authentication_verify(const struct kasumi_hash_test_data *tdata)
3381 {
3382 struct crypto_testsuite_params *ts_params = &testsuite_params;
3383 struct crypto_unittest_params *ut_params = &unittest_params;
3384
3385 int retval;
3386 unsigned plaintext_pad_len;
3387 unsigned plaintext_len;
3388 uint8_t *plaintext;
3389 struct rte_cryptodev_info dev_info;
3390
3391 rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
3392 uint64_t feat_flags = dev_info.feature_flags;
3393
3394 if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
3395 (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
3396 printf("Device doesn't support RAW data-path APIs.\n");
3397 return TEST_SKIPPED;
3398 }
3399
3400 if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
3401 return TEST_SKIPPED;
3402
3403 /* Verify the capabilities */
3404 struct rte_cryptodev_sym_capability_idx cap_idx;
3405 cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
3406 cap_idx.algo.auth = RTE_CRYPTO_AUTH_KASUMI_F9;
3407 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
3408 &cap_idx) == NULL)
3409 return TEST_SKIPPED;
3410
3411 /* Create KASUMI session */
3412 retval = create_wireless_algo_hash_session(ts_params->valid_devs[0],
3413 tdata->key.data, tdata->key.len,
3414 0, tdata->digest.len,
3415 RTE_CRYPTO_AUTH_OP_VERIFY,
3416 RTE_CRYPTO_AUTH_KASUMI_F9);
3417 if (retval < 0)
3418 return retval;
3419 /* alloc mbuf and set payload */
3420 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
3421
3422 memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
3423 rte_pktmbuf_tailroom(ut_params->ibuf));
3424
3425 plaintext_len = ceil_byte_length(tdata->plaintext.len);
3426 /* Append data which is padded to a multiple */
3427 /* of the algorithms block size */
3428 plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 8);
3429 plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
3430 plaintext_pad_len);
3431 memcpy(plaintext, tdata->plaintext.data, plaintext_len);
3432
3433 /* Create KASUMI operation */
3434 retval = create_wireless_algo_hash_operation(tdata->digest.data,
3435 tdata->digest.len,
3436 NULL, 0,
3437 plaintext_pad_len,
3438 RTE_CRYPTO_AUTH_OP_VERIFY,
3439 tdata->plaintext.len,
3440 0);
3441 if (retval < 0)
3442 return retval;
3443
3444 if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
3445 process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
3446 ut_params->op, 0, 1, 1, 0);
3447 else
3448 ut_params->op = process_crypto_request(ts_params->valid_devs[0],
3449 ut_params->op);
3450 TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
3451 ut_params->obuf = ut_params->op->sym->m_src;
3452 ut_params->digest = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *)
3453 + plaintext_pad_len;
3454
3455 /* Validate obuf */
3456 if (ut_params->op->status == RTE_CRYPTO_OP_STATUS_SUCCESS)
3457 return 0;
3458 else
3459 return -1;
3460
3461 return 0;
3462 }
3463
3464 static int
test_snow3g_hash_generate_test_case_1(void)3465 test_snow3g_hash_generate_test_case_1(void)
3466 {
3467 return test_snow3g_authentication(&snow3g_hash_test_case_1);
3468 }
3469
3470 static int
test_snow3g_hash_generate_test_case_2(void)3471 test_snow3g_hash_generate_test_case_2(void)
3472 {
3473 return test_snow3g_authentication(&snow3g_hash_test_case_2);
3474 }
3475
3476 static int
test_snow3g_hash_generate_test_case_3(void)3477 test_snow3g_hash_generate_test_case_3(void)
3478 {
3479 return test_snow3g_authentication(&snow3g_hash_test_case_3);
3480 }
3481
3482 static int
test_snow3g_hash_generate_test_case_4(void)3483 test_snow3g_hash_generate_test_case_4(void)
3484 {
3485 return test_snow3g_authentication(&snow3g_hash_test_case_4);
3486 }
3487
3488 static int
test_snow3g_hash_generate_test_case_5(void)3489 test_snow3g_hash_generate_test_case_5(void)
3490 {
3491 return test_snow3g_authentication(&snow3g_hash_test_case_5);
3492 }
3493
3494 static int
test_snow3g_hash_generate_test_case_6(void)3495 test_snow3g_hash_generate_test_case_6(void)
3496 {
3497 return test_snow3g_authentication(&snow3g_hash_test_case_6);
3498 }
3499
3500 static int
test_snow3g_hash_verify_test_case_1(void)3501 test_snow3g_hash_verify_test_case_1(void)
3502 {
3503 return test_snow3g_authentication_verify(&snow3g_hash_test_case_1);
3504
3505 }
3506
3507 static int
test_snow3g_hash_verify_test_case_2(void)3508 test_snow3g_hash_verify_test_case_2(void)
3509 {
3510 return test_snow3g_authentication_verify(&snow3g_hash_test_case_2);
3511 }
3512
3513 static int
test_snow3g_hash_verify_test_case_3(void)3514 test_snow3g_hash_verify_test_case_3(void)
3515 {
3516 return test_snow3g_authentication_verify(&snow3g_hash_test_case_3);
3517 }
3518
3519 static int
test_snow3g_hash_verify_test_case_4(void)3520 test_snow3g_hash_verify_test_case_4(void)
3521 {
3522 return test_snow3g_authentication_verify(&snow3g_hash_test_case_4);
3523 }
3524
3525 static int
test_snow3g_hash_verify_test_case_5(void)3526 test_snow3g_hash_verify_test_case_5(void)
3527 {
3528 return test_snow3g_authentication_verify(&snow3g_hash_test_case_5);
3529 }
3530
3531 static int
test_snow3g_hash_verify_test_case_6(void)3532 test_snow3g_hash_verify_test_case_6(void)
3533 {
3534 return test_snow3g_authentication_verify(&snow3g_hash_test_case_6);
3535 }
3536
3537 static int
test_kasumi_hash_generate_test_case_1(void)3538 test_kasumi_hash_generate_test_case_1(void)
3539 {
3540 return test_kasumi_authentication(&kasumi_hash_test_case_1);
3541 }
3542
3543 static int
test_kasumi_hash_generate_test_case_2(void)3544 test_kasumi_hash_generate_test_case_2(void)
3545 {
3546 return test_kasumi_authentication(&kasumi_hash_test_case_2);
3547 }
3548
3549 static int
test_kasumi_hash_generate_test_case_3(void)3550 test_kasumi_hash_generate_test_case_3(void)
3551 {
3552 return test_kasumi_authentication(&kasumi_hash_test_case_3);
3553 }
3554
3555 static int
test_kasumi_hash_generate_test_case_4(void)3556 test_kasumi_hash_generate_test_case_4(void)
3557 {
3558 return test_kasumi_authentication(&kasumi_hash_test_case_4);
3559 }
3560
3561 static int
test_kasumi_hash_generate_test_case_5(void)3562 test_kasumi_hash_generate_test_case_5(void)
3563 {
3564 return test_kasumi_authentication(&kasumi_hash_test_case_5);
3565 }
3566
3567 static int
test_kasumi_hash_generate_test_case_6(void)3568 test_kasumi_hash_generate_test_case_6(void)
3569 {
3570 return test_kasumi_authentication(&kasumi_hash_test_case_6);
3571 }
3572
3573 static int
test_kasumi_hash_verify_test_case_1(void)3574 test_kasumi_hash_verify_test_case_1(void)
3575 {
3576 return test_kasumi_authentication_verify(&kasumi_hash_test_case_1);
3577 }
3578
3579 static int
test_kasumi_hash_verify_test_case_2(void)3580 test_kasumi_hash_verify_test_case_2(void)
3581 {
3582 return test_kasumi_authentication_verify(&kasumi_hash_test_case_2);
3583 }
3584
3585 static int
test_kasumi_hash_verify_test_case_3(void)3586 test_kasumi_hash_verify_test_case_3(void)
3587 {
3588 return test_kasumi_authentication_verify(&kasumi_hash_test_case_3);
3589 }
3590
3591 static int
test_kasumi_hash_verify_test_case_4(void)3592 test_kasumi_hash_verify_test_case_4(void)
3593 {
3594 return test_kasumi_authentication_verify(&kasumi_hash_test_case_4);
3595 }
3596
3597 static int
test_kasumi_hash_verify_test_case_5(void)3598 test_kasumi_hash_verify_test_case_5(void)
3599 {
3600 return test_kasumi_authentication_verify(&kasumi_hash_test_case_5);
3601 }
3602
3603 static int
test_kasumi_encryption(const struct kasumi_test_data * tdata)3604 test_kasumi_encryption(const struct kasumi_test_data *tdata)
3605 {
3606 struct crypto_testsuite_params *ts_params = &testsuite_params;
3607 struct crypto_unittest_params *ut_params = &unittest_params;
3608
3609 int retval;
3610 uint8_t *plaintext, *ciphertext;
3611 unsigned plaintext_pad_len;
3612 unsigned plaintext_len;
3613 struct rte_cryptodev_info dev_info;
3614
3615 rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
3616 uint64_t feat_flags = dev_info.feature_flags;
3617
3618 if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
3619 (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
3620 printf("Device doesn't support RAW data-path APIs.\n");
3621 return TEST_SKIPPED;
3622 }
3623
3624 if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
3625 return TEST_SKIPPED;
3626
3627 /* Verify the capabilities */
3628 struct rte_cryptodev_sym_capability_idx cap_idx;
3629 cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
3630 cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_KASUMI_F8;
3631 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
3632 &cap_idx) == NULL)
3633 return TEST_SKIPPED;
3634
3635 /* Create KASUMI session */
3636 retval = create_wireless_algo_cipher_session(ts_params->valid_devs[0],
3637 RTE_CRYPTO_CIPHER_OP_ENCRYPT,
3638 RTE_CRYPTO_CIPHER_KASUMI_F8,
3639 tdata->key.data, tdata->key.len,
3640 tdata->cipher_iv.len);
3641 if (retval < 0)
3642 return retval;
3643
3644 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
3645
3646 /* Clear mbuf payload */
3647 memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
3648 rte_pktmbuf_tailroom(ut_params->ibuf));
3649
3650 plaintext_len = ceil_byte_length(tdata->plaintext.len);
3651 /* Append data which is padded to a multiple */
3652 /* of the algorithms block size */
3653 plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 8);
3654 plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
3655 plaintext_pad_len);
3656 memcpy(plaintext, tdata->plaintext.data, plaintext_len);
3657
3658 debug_hexdump(stdout, "plaintext:", plaintext, plaintext_len);
3659
3660 /* Create KASUMI operation */
3661 retval = create_wireless_algo_cipher_operation(tdata->cipher_iv.data,
3662 tdata->cipher_iv.len,
3663 RTE_ALIGN_CEIL(tdata->validCipherLenInBits.len, 8),
3664 tdata->validCipherOffsetInBits.len);
3665 if (retval < 0)
3666 return retval;
3667
3668 if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
3669 process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
3670 ut_params->op, 1, 0, 1, tdata->cipher_iv.len);
3671 else
3672 ut_params->op = process_crypto_request(ts_params->valid_devs[0],
3673 ut_params->op);
3674 TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
3675
3676 ut_params->obuf = ut_params->op->sym->m_dst;
3677 if (ut_params->obuf)
3678 ciphertext = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *);
3679 else
3680 ciphertext = plaintext + (tdata->validCipherOffsetInBits.len >> 3);
3681
3682 debug_hexdump(stdout, "ciphertext:", ciphertext, plaintext_len);
3683
3684 const uint8_t *reference_ciphertext = tdata->ciphertext.data +
3685 (tdata->validCipherOffsetInBits.len >> 3);
3686 /* Validate obuf */
3687 TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
3688 ciphertext,
3689 reference_ciphertext,
3690 tdata->validCipherLenInBits.len,
3691 "KASUMI Ciphertext data not as expected");
3692 return 0;
3693 }
3694
3695 static int
test_kasumi_encryption_sgl(const struct kasumi_test_data * tdata)3696 test_kasumi_encryption_sgl(const struct kasumi_test_data *tdata)
3697 {
3698 struct crypto_testsuite_params *ts_params = &testsuite_params;
3699 struct crypto_unittest_params *ut_params = &unittest_params;
3700
3701 int retval;
3702
3703 unsigned int plaintext_pad_len;
3704 unsigned int plaintext_len;
3705
3706 uint8_t buffer[10000];
3707 const uint8_t *ciphertext;
3708
3709 struct rte_cryptodev_info dev_info;
3710
3711 /* Verify the capabilities */
3712 struct rte_cryptodev_sym_capability_idx cap_idx;
3713 cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
3714 cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_KASUMI_F8;
3715 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
3716 &cap_idx) == NULL)
3717 return TEST_SKIPPED;
3718
3719 rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
3720
3721 uint64_t feat_flags = dev_info.feature_flags;
3722
3723 if (!(feat_flags & RTE_CRYPTODEV_FF_IN_PLACE_SGL)) {
3724 printf("Device doesn't support in-place scatter-gather. "
3725 "Test Skipped.\n");
3726 return TEST_SKIPPED;
3727 }
3728
3729 if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
3730 (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
3731 printf("Device doesn't support RAW data-path APIs.\n");
3732 return TEST_SKIPPED;
3733 }
3734
3735 if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
3736 return TEST_SKIPPED;
3737
3738 /* Create KASUMI session */
3739 retval = create_wireless_algo_cipher_session(ts_params->valid_devs[0],
3740 RTE_CRYPTO_CIPHER_OP_ENCRYPT,
3741 RTE_CRYPTO_CIPHER_KASUMI_F8,
3742 tdata->key.data, tdata->key.len,
3743 tdata->cipher_iv.len);
3744 if (retval < 0)
3745 return retval;
3746
3747 plaintext_len = ceil_byte_length(tdata->plaintext.len);
3748
3749
3750 /* Append data which is padded to a multiple */
3751 /* of the algorithms block size */
3752 plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 8);
3753
3754 ut_params->ibuf = create_segmented_mbuf(ts_params->mbuf_pool,
3755 plaintext_pad_len, 10, 0);
3756
3757 pktmbuf_write(ut_params->ibuf, 0, plaintext_len, tdata->plaintext.data);
3758
3759 /* Create KASUMI operation */
3760 retval = create_wireless_algo_cipher_operation(tdata->cipher_iv.data,
3761 tdata->cipher_iv.len,
3762 RTE_ALIGN_CEIL(tdata->validCipherLenInBits.len, 8),
3763 tdata->validCipherOffsetInBits.len);
3764 if (retval < 0)
3765 return retval;
3766
3767 if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
3768 process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
3769 ut_params->op, 1, 0, 1, tdata->cipher_iv.len);
3770 else
3771 ut_params->op = process_crypto_request(ts_params->valid_devs[0],
3772 ut_params->op);
3773 TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
3774
3775 ut_params->obuf = ut_params->op->sym->m_dst;
3776
3777 if (ut_params->obuf)
3778 ciphertext = rte_pktmbuf_read(ut_params->obuf, 0,
3779 plaintext_len, buffer);
3780 else
3781 ciphertext = rte_pktmbuf_read(ut_params->ibuf,
3782 tdata->validCipherOffsetInBits.len >> 3,
3783 plaintext_len, buffer);
3784
3785 /* Validate obuf */
3786 debug_hexdump(stdout, "ciphertext:", ciphertext, plaintext_len);
3787
3788 const uint8_t *reference_ciphertext = tdata->ciphertext.data +
3789 (tdata->validCipherOffsetInBits.len >> 3);
3790 /* Validate obuf */
3791 TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
3792 ciphertext,
3793 reference_ciphertext,
3794 tdata->validCipherLenInBits.len,
3795 "KASUMI Ciphertext data not as expected");
3796 return 0;
3797 }
3798
3799 static int
test_kasumi_encryption_oop(const struct kasumi_test_data * tdata)3800 test_kasumi_encryption_oop(const struct kasumi_test_data *tdata)
3801 {
3802 struct crypto_testsuite_params *ts_params = &testsuite_params;
3803 struct crypto_unittest_params *ut_params = &unittest_params;
3804
3805 int retval;
3806 uint8_t *plaintext, *ciphertext;
3807 unsigned plaintext_pad_len;
3808 unsigned plaintext_len;
3809
3810 /* Verify the capabilities */
3811 struct rte_cryptodev_sym_capability_idx cap_idx;
3812 cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
3813 cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_KASUMI_F8;
3814 /* Data-path service does not support OOP */
3815 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
3816 &cap_idx) == NULL)
3817 return TEST_SKIPPED;
3818
3819 if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
3820 return TEST_SKIPPED;
3821
3822 if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
3823 return TEST_SKIPPED;
3824
3825 /* Create KASUMI session */
3826 retval = create_wireless_algo_cipher_session(ts_params->valid_devs[0],
3827 RTE_CRYPTO_CIPHER_OP_ENCRYPT,
3828 RTE_CRYPTO_CIPHER_KASUMI_F8,
3829 tdata->key.data, tdata->key.len,
3830 tdata->cipher_iv.len);
3831 if (retval < 0)
3832 return retval;
3833
3834 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
3835 ut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
3836
3837 /* Clear mbuf payload */
3838 memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
3839 rte_pktmbuf_tailroom(ut_params->ibuf));
3840
3841 plaintext_len = ceil_byte_length(tdata->plaintext.len);
3842 /* Append data which is padded to a multiple */
3843 /* of the algorithms block size */
3844 plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 8);
3845 plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
3846 plaintext_pad_len);
3847 rte_pktmbuf_append(ut_params->obuf, plaintext_pad_len);
3848 memcpy(plaintext, tdata->plaintext.data, plaintext_len);
3849
3850 debug_hexdump(stdout, "plaintext:", plaintext, plaintext_len);
3851
3852 /* Create KASUMI operation */
3853 retval = create_wireless_algo_cipher_operation_oop(tdata->cipher_iv.data,
3854 tdata->cipher_iv.len,
3855 RTE_ALIGN_CEIL(tdata->validCipherLenInBits.len, 8),
3856 tdata->validCipherOffsetInBits.len);
3857 if (retval < 0)
3858 return retval;
3859
3860 ut_params->op = process_crypto_request(ts_params->valid_devs[0],
3861 ut_params->op);
3862 TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
3863
3864 ut_params->obuf = ut_params->op->sym->m_dst;
3865 if (ut_params->obuf)
3866 ciphertext = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *);
3867 else
3868 ciphertext = plaintext + (tdata->validCipherOffsetInBits.len >> 3);
3869
3870 debug_hexdump(stdout, "ciphertext:", ciphertext, plaintext_len);
3871
3872 const uint8_t *reference_ciphertext = tdata->ciphertext.data +
3873 (tdata->validCipherOffsetInBits.len >> 3);
3874 /* Validate obuf */
3875 TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
3876 ciphertext,
3877 reference_ciphertext,
3878 tdata->validCipherLenInBits.len,
3879 "KASUMI Ciphertext data not as expected");
3880 return 0;
3881 }
3882
3883 static int
test_kasumi_encryption_oop_sgl(const struct kasumi_test_data * tdata)3884 test_kasumi_encryption_oop_sgl(const struct kasumi_test_data *tdata)
3885 {
3886 struct crypto_testsuite_params *ts_params = &testsuite_params;
3887 struct crypto_unittest_params *ut_params = &unittest_params;
3888
3889 int retval;
3890 unsigned int plaintext_pad_len;
3891 unsigned int plaintext_len;
3892
3893 const uint8_t *ciphertext;
3894 uint8_t buffer[2048];
3895
3896 struct rte_cryptodev_info dev_info;
3897
3898 /* Verify the capabilities */
3899 struct rte_cryptodev_sym_capability_idx cap_idx;
3900 cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
3901 cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_KASUMI_F8;
3902 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
3903 &cap_idx) == NULL)
3904 return TEST_SKIPPED;
3905
3906 if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
3907 return TEST_SKIPPED;
3908
3909 if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
3910 return TEST_SKIPPED;
3911
3912 rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
3913
3914 uint64_t feat_flags = dev_info.feature_flags;
3915 if (!(feat_flags & RTE_CRYPTODEV_FF_OOP_SGL_IN_SGL_OUT)) {
3916 printf("Device doesn't support out-of-place scatter-gather "
3917 "in both input and output mbufs. "
3918 "Test Skipped.\n");
3919 return TEST_SKIPPED;
3920 }
3921
3922 /* Create KASUMI session */
3923 retval = create_wireless_algo_cipher_session(ts_params->valid_devs[0],
3924 RTE_CRYPTO_CIPHER_OP_ENCRYPT,
3925 RTE_CRYPTO_CIPHER_KASUMI_F8,
3926 tdata->key.data, tdata->key.len,
3927 tdata->cipher_iv.len);
3928 if (retval < 0)
3929 return retval;
3930
3931 plaintext_len = ceil_byte_length(tdata->plaintext.len);
3932 /* Append data which is padded to a multiple */
3933 /* of the algorithms block size */
3934 plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 8);
3935
3936 ut_params->ibuf = create_segmented_mbuf(ts_params->mbuf_pool,
3937 plaintext_pad_len, 10, 0);
3938 ut_params->obuf = create_segmented_mbuf(ts_params->mbuf_pool,
3939 plaintext_pad_len, 3, 0);
3940
3941 /* Append data which is padded to a multiple */
3942 /* of the algorithms block size */
3943 pktmbuf_write(ut_params->ibuf, 0, plaintext_len, tdata->plaintext.data);
3944
3945 /* Create KASUMI operation */
3946 retval = create_wireless_algo_cipher_operation_oop(tdata->cipher_iv.data,
3947 tdata->cipher_iv.len,
3948 RTE_ALIGN_CEIL(tdata->validCipherLenInBits.len, 8),
3949 tdata->validCipherOffsetInBits.len);
3950 if (retval < 0)
3951 return retval;
3952
3953 ut_params->op = process_crypto_request(ts_params->valid_devs[0],
3954 ut_params->op);
3955 TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
3956
3957 ut_params->obuf = ut_params->op->sym->m_dst;
3958 if (ut_params->obuf)
3959 ciphertext = rte_pktmbuf_read(ut_params->obuf, 0,
3960 plaintext_pad_len, buffer);
3961 else
3962 ciphertext = rte_pktmbuf_read(ut_params->ibuf,
3963 tdata->validCipherOffsetInBits.len >> 3,
3964 plaintext_pad_len, buffer);
3965
3966 const uint8_t *reference_ciphertext = tdata->ciphertext.data +
3967 (tdata->validCipherOffsetInBits.len >> 3);
3968 /* Validate obuf */
3969 TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
3970 ciphertext,
3971 reference_ciphertext,
3972 tdata->validCipherLenInBits.len,
3973 "KASUMI Ciphertext data not as expected");
3974 return 0;
3975 }
3976
3977
3978 static int
test_kasumi_decryption_oop(const struct kasumi_test_data * tdata)3979 test_kasumi_decryption_oop(const struct kasumi_test_data *tdata)
3980 {
3981 struct crypto_testsuite_params *ts_params = &testsuite_params;
3982 struct crypto_unittest_params *ut_params = &unittest_params;
3983
3984 int retval;
3985 uint8_t *ciphertext, *plaintext;
3986 unsigned ciphertext_pad_len;
3987 unsigned ciphertext_len;
3988
3989 /* Verify the capabilities */
3990 struct rte_cryptodev_sym_capability_idx cap_idx;
3991 cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
3992 cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_KASUMI_F8;
3993 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
3994 &cap_idx) == NULL)
3995 return TEST_SKIPPED;
3996
3997 if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
3998 return TEST_SKIPPED;
3999
4000 if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
4001 return TEST_SKIPPED;
4002
4003 /* Create KASUMI session */
4004 retval = create_wireless_algo_cipher_session(ts_params->valid_devs[0],
4005 RTE_CRYPTO_CIPHER_OP_DECRYPT,
4006 RTE_CRYPTO_CIPHER_KASUMI_F8,
4007 tdata->key.data, tdata->key.len,
4008 tdata->cipher_iv.len);
4009 if (retval < 0)
4010 return retval;
4011
4012 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
4013 ut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
4014
4015 /* Clear mbuf payload */
4016 memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
4017 rte_pktmbuf_tailroom(ut_params->ibuf));
4018
4019 ciphertext_len = ceil_byte_length(tdata->ciphertext.len);
4020 /* Append data which is padded to a multiple */
4021 /* of the algorithms block size */
4022 ciphertext_pad_len = RTE_ALIGN_CEIL(ciphertext_len, 8);
4023 ciphertext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
4024 ciphertext_pad_len);
4025 rte_pktmbuf_append(ut_params->obuf, ciphertext_pad_len);
4026 memcpy(ciphertext, tdata->ciphertext.data, ciphertext_len);
4027
4028 debug_hexdump(stdout, "ciphertext:", ciphertext, ciphertext_len);
4029
4030 /* Create KASUMI operation */
4031 retval = create_wireless_algo_cipher_operation_oop(tdata->cipher_iv.data,
4032 tdata->cipher_iv.len,
4033 RTE_ALIGN_CEIL(tdata->validCipherLenInBits.len, 8),
4034 tdata->validCipherOffsetInBits.len);
4035 if (retval < 0)
4036 return retval;
4037
4038 ut_params->op = process_crypto_request(ts_params->valid_devs[0],
4039 ut_params->op);
4040 TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
4041
4042 ut_params->obuf = ut_params->op->sym->m_dst;
4043 if (ut_params->obuf)
4044 plaintext = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *);
4045 else
4046 plaintext = ciphertext + (tdata->validCipherOffsetInBits.len >> 3);
4047
4048 debug_hexdump(stdout, "plaintext:", plaintext, ciphertext_len);
4049
4050 const uint8_t *reference_plaintext = tdata->plaintext.data +
4051 (tdata->validCipherOffsetInBits.len >> 3);
4052 /* Validate obuf */
4053 TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
4054 plaintext,
4055 reference_plaintext,
4056 tdata->validCipherLenInBits.len,
4057 "KASUMI Plaintext data not as expected");
4058 return 0;
4059 }
4060
4061 static int
test_kasumi_decryption(const struct kasumi_test_data * tdata)4062 test_kasumi_decryption(const struct kasumi_test_data *tdata)
4063 {
4064 struct crypto_testsuite_params *ts_params = &testsuite_params;
4065 struct crypto_unittest_params *ut_params = &unittest_params;
4066
4067 int retval;
4068 uint8_t *ciphertext, *plaintext;
4069 unsigned ciphertext_pad_len;
4070 unsigned ciphertext_len;
4071 struct rte_cryptodev_info dev_info;
4072
4073 rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
4074 uint64_t feat_flags = dev_info.feature_flags;
4075
4076 if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
4077 (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
4078 printf("Device doesn't support RAW data-path APIs.\n");
4079 return TEST_SKIPPED;
4080 }
4081
4082 if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
4083 return TEST_SKIPPED;
4084
4085 /* Verify the capabilities */
4086 struct rte_cryptodev_sym_capability_idx cap_idx;
4087 cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
4088 cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_KASUMI_F8;
4089 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
4090 &cap_idx) == NULL)
4091 return TEST_SKIPPED;
4092
4093 /* Create KASUMI session */
4094 retval = create_wireless_algo_cipher_session(ts_params->valid_devs[0],
4095 RTE_CRYPTO_CIPHER_OP_DECRYPT,
4096 RTE_CRYPTO_CIPHER_KASUMI_F8,
4097 tdata->key.data, tdata->key.len,
4098 tdata->cipher_iv.len);
4099 if (retval < 0)
4100 return retval;
4101
4102 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
4103
4104 /* Clear mbuf payload */
4105 memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
4106 rte_pktmbuf_tailroom(ut_params->ibuf));
4107
4108 ciphertext_len = ceil_byte_length(tdata->ciphertext.len);
4109 /* Append data which is padded to a multiple */
4110 /* of the algorithms block size */
4111 ciphertext_pad_len = RTE_ALIGN_CEIL(ciphertext_len, 8);
4112 ciphertext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
4113 ciphertext_pad_len);
4114 memcpy(ciphertext, tdata->ciphertext.data, ciphertext_len);
4115
4116 debug_hexdump(stdout, "ciphertext:", ciphertext, ciphertext_len);
4117
4118 /* Create KASUMI operation */
4119 retval = create_wireless_algo_cipher_operation(tdata->cipher_iv.data,
4120 tdata->cipher_iv.len,
4121 RTE_ALIGN_CEIL(tdata->validCipherLenInBits.len, 8),
4122 tdata->validCipherOffsetInBits.len);
4123 if (retval < 0)
4124 return retval;
4125
4126 if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
4127 process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
4128 ut_params->op, 1, 0, 1, 0);
4129 else
4130 ut_params->op = process_crypto_request(ts_params->valid_devs[0],
4131 ut_params->op);
4132 TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
4133
4134 ut_params->obuf = ut_params->op->sym->m_dst;
4135 if (ut_params->obuf)
4136 plaintext = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *);
4137 else
4138 plaintext = ciphertext + (tdata->validCipherOffsetInBits.len >> 3);
4139
4140 debug_hexdump(stdout, "plaintext:", plaintext, ciphertext_len);
4141
4142 const uint8_t *reference_plaintext = tdata->plaintext.data +
4143 (tdata->validCipherOffsetInBits.len >> 3);
4144 /* Validate obuf */
4145 TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
4146 plaintext,
4147 reference_plaintext,
4148 tdata->validCipherLenInBits.len,
4149 "KASUMI Plaintext data not as expected");
4150 return 0;
4151 }
4152
4153 static int
test_snow3g_encryption(const struct snow3g_test_data * tdata)4154 test_snow3g_encryption(const struct snow3g_test_data *tdata)
4155 {
4156 struct crypto_testsuite_params *ts_params = &testsuite_params;
4157 struct crypto_unittest_params *ut_params = &unittest_params;
4158
4159 int retval;
4160 uint8_t *plaintext, *ciphertext;
4161 unsigned plaintext_pad_len;
4162 unsigned plaintext_len;
4163 struct rte_cryptodev_info dev_info;
4164
4165 rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
4166 uint64_t feat_flags = dev_info.feature_flags;
4167
4168 if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
4169 (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
4170 printf("Device doesn't support RAW data-path APIs.\n");
4171 return TEST_SKIPPED;
4172 }
4173
4174 if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
4175 return TEST_SKIPPED;
4176
4177 /* Verify the capabilities */
4178 struct rte_cryptodev_sym_capability_idx cap_idx;
4179 cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
4180 cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_SNOW3G_UEA2;
4181 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
4182 &cap_idx) == NULL)
4183 return TEST_SKIPPED;
4184
4185 /* Create SNOW 3G session */
4186 retval = create_wireless_algo_cipher_session(ts_params->valid_devs[0],
4187 RTE_CRYPTO_CIPHER_OP_ENCRYPT,
4188 RTE_CRYPTO_CIPHER_SNOW3G_UEA2,
4189 tdata->key.data, tdata->key.len,
4190 tdata->cipher_iv.len);
4191 if (retval < 0)
4192 return retval;
4193
4194 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
4195
4196 /* Clear mbuf payload */
4197 memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
4198 rte_pktmbuf_tailroom(ut_params->ibuf));
4199
4200 plaintext_len = ceil_byte_length(tdata->plaintext.len);
4201 /* Append data which is padded to a multiple of */
4202 /* the algorithms block size */
4203 plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16);
4204 plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
4205 plaintext_pad_len);
4206 memcpy(plaintext, tdata->plaintext.data, plaintext_len);
4207
4208 debug_hexdump(stdout, "plaintext:", plaintext, plaintext_len);
4209
4210 /* Create SNOW 3G operation */
4211 retval = create_wireless_algo_cipher_operation(tdata->cipher_iv.data,
4212 tdata->cipher_iv.len,
4213 tdata->validCipherLenInBits.len,
4214 0);
4215 if (retval < 0)
4216 return retval;
4217
4218 if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
4219 process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
4220 ut_params->op, 1, 0, 1, tdata->cipher_iv.len);
4221 else
4222 ut_params->op = process_crypto_request(ts_params->valid_devs[0],
4223 ut_params->op);
4224 TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
4225
4226 ut_params->obuf = ut_params->op->sym->m_dst;
4227 if (ut_params->obuf)
4228 ciphertext = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *);
4229 else
4230 ciphertext = plaintext;
4231
4232 debug_hexdump(stdout, "ciphertext:", ciphertext, plaintext_len);
4233
4234 /* Validate obuf */
4235 TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
4236 ciphertext,
4237 tdata->ciphertext.data,
4238 tdata->validDataLenInBits.len,
4239 "SNOW 3G Ciphertext data not as expected");
4240 return 0;
4241 }
4242
4243
4244 static int
test_snow3g_encryption_oop(const struct snow3g_test_data * tdata)4245 test_snow3g_encryption_oop(const struct snow3g_test_data *tdata)
4246 {
4247 struct crypto_testsuite_params *ts_params = &testsuite_params;
4248 struct crypto_unittest_params *ut_params = &unittest_params;
4249 uint8_t *plaintext, *ciphertext;
4250
4251 int retval;
4252 unsigned plaintext_pad_len;
4253 unsigned plaintext_len;
4254 struct rte_cryptodev_info dev_info;
4255
4256 rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
4257 uint64_t feat_flags = dev_info.feature_flags;
4258
4259 if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
4260 (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
4261 printf("Device does not support RAW data-path APIs.\n");
4262 return -ENOTSUP;
4263 }
4264
4265 /* Verify the capabilities */
4266 struct rte_cryptodev_sym_capability_idx cap_idx;
4267 cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
4268 cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_SNOW3G_UEA2;
4269 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
4270 &cap_idx) == NULL)
4271 return TEST_SKIPPED;
4272
4273 if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
4274 return TEST_SKIPPED;
4275
4276 if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
4277 return TEST_SKIPPED;
4278
4279 /* Create SNOW 3G session */
4280 retval = create_wireless_algo_cipher_session(ts_params->valid_devs[0],
4281 RTE_CRYPTO_CIPHER_OP_ENCRYPT,
4282 RTE_CRYPTO_CIPHER_SNOW3G_UEA2,
4283 tdata->key.data, tdata->key.len,
4284 tdata->cipher_iv.len);
4285 if (retval < 0)
4286 return retval;
4287
4288 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
4289 ut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
4290
4291 TEST_ASSERT_NOT_NULL(ut_params->ibuf,
4292 "Failed to allocate input buffer in mempool");
4293 TEST_ASSERT_NOT_NULL(ut_params->obuf,
4294 "Failed to allocate output buffer in mempool");
4295
4296 /* Clear mbuf payload */
4297 memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
4298 rte_pktmbuf_tailroom(ut_params->ibuf));
4299
4300 plaintext_len = ceil_byte_length(tdata->plaintext.len);
4301 /* Append data which is padded to a multiple of */
4302 /* the algorithms block size */
4303 plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16);
4304 plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
4305 plaintext_pad_len);
4306 rte_pktmbuf_append(ut_params->obuf, plaintext_pad_len);
4307 memcpy(plaintext, tdata->plaintext.data, plaintext_len);
4308
4309 debug_hexdump(stdout, "plaintext:", plaintext, plaintext_len);
4310
4311 /* Create SNOW 3G operation */
4312 retval = create_wireless_algo_cipher_operation_oop(tdata->cipher_iv.data,
4313 tdata->cipher_iv.len,
4314 tdata->validCipherLenInBits.len,
4315 0);
4316 if (retval < 0)
4317 return retval;
4318
4319 if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
4320 process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
4321 ut_params->op, 1, 0, 1, tdata->cipher_iv.len);
4322 else
4323 ut_params->op = process_crypto_request(ts_params->valid_devs[0],
4324 ut_params->op);
4325 TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
4326
4327 ut_params->obuf = ut_params->op->sym->m_dst;
4328 if (ut_params->obuf)
4329 ciphertext = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *);
4330 else
4331 ciphertext = plaintext;
4332
4333 debug_hexdump(stdout, "ciphertext:", ciphertext, plaintext_len);
4334
4335 /* Validate obuf */
4336 TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
4337 ciphertext,
4338 tdata->ciphertext.data,
4339 tdata->validDataLenInBits.len,
4340 "SNOW 3G Ciphertext data not as expected");
4341 return 0;
4342 }
4343
4344 static int
test_snow3g_encryption_oop_sgl(const struct snow3g_test_data * tdata)4345 test_snow3g_encryption_oop_sgl(const struct snow3g_test_data *tdata)
4346 {
4347 struct crypto_testsuite_params *ts_params = &testsuite_params;
4348 struct crypto_unittest_params *ut_params = &unittest_params;
4349
4350 int retval;
4351 unsigned int plaintext_pad_len;
4352 unsigned int plaintext_len;
4353 uint8_t buffer[10000];
4354 const uint8_t *ciphertext;
4355
4356 struct rte_cryptodev_info dev_info;
4357
4358 /* Verify the capabilities */
4359 struct rte_cryptodev_sym_capability_idx cap_idx;
4360 cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
4361 cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_SNOW3G_UEA2;
4362 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
4363 &cap_idx) == NULL)
4364 return TEST_SKIPPED;
4365
4366 if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
4367 return TEST_SKIPPED;
4368
4369 if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
4370 return TEST_SKIPPED;
4371
4372 rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
4373
4374 uint64_t feat_flags = dev_info.feature_flags;
4375
4376 if (!(feat_flags & RTE_CRYPTODEV_FF_OOP_SGL_IN_SGL_OUT)) {
4377 printf("Device doesn't support out-of-place scatter-gather "
4378 "in both input and output mbufs. "
4379 "Test Skipped.\n");
4380 return TEST_SKIPPED;
4381 }
4382
4383 if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
4384 (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
4385 printf("Device does not support RAW data-path APIs.\n");
4386 return -ENOTSUP;
4387 }
4388
4389 /* Create SNOW 3G session */
4390 retval = create_wireless_algo_cipher_session(ts_params->valid_devs[0],
4391 RTE_CRYPTO_CIPHER_OP_ENCRYPT,
4392 RTE_CRYPTO_CIPHER_SNOW3G_UEA2,
4393 tdata->key.data, tdata->key.len,
4394 tdata->cipher_iv.len);
4395 if (retval < 0)
4396 return retval;
4397
4398 plaintext_len = ceil_byte_length(tdata->plaintext.len);
4399 /* Append data which is padded to a multiple of */
4400 /* the algorithms block size */
4401 plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16);
4402
4403 ut_params->ibuf = create_segmented_mbuf(ts_params->mbuf_pool,
4404 plaintext_pad_len, 10, 0);
4405 ut_params->obuf = create_segmented_mbuf(ts_params->mbuf_pool,
4406 plaintext_pad_len, 3, 0);
4407
4408 TEST_ASSERT_NOT_NULL(ut_params->ibuf,
4409 "Failed to allocate input buffer in mempool");
4410 TEST_ASSERT_NOT_NULL(ut_params->obuf,
4411 "Failed to allocate output buffer in mempool");
4412
4413 pktmbuf_write(ut_params->ibuf, 0, plaintext_len, tdata->plaintext.data);
4414
4415 /* Create SNOW 3G operation */
4416 retval = create_wireless_algo_cipher_operation_oop(tdata->cipher_iv.data,
4417 tdata->cipher_iv.len,
4418 tdata->validCipherLenInBits.len,
4419 0);
4420 if (retval < 0)
4421 return retval;
4422
4423 if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
4424 process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
4425 ut_params->op, 1, 0, 1, tdata->cipher_iv.len);
4426 else
4427 ut_params->op = process_crypto_request(ts_params->valid_devs[0],
4428 ut_params->op);
4429 TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
4430
4431 ut_params->obuf = ut_params->op->sym->m_dst;
4432 if (ut_params->obuf)
4433 ciphertext = rte_pktmbuf_read(ut_params->obuf, 0,
4434 plaintext_len, buffer);
4435 else
4436 ciphertext = rte_pktmbuf_read(ut_params->ibuf, 0,
4437 plaintext_len, buffer);
4438
4439 debug_hexdump(stdout, "ciphertext:", ciphertext, plaintext_len);
4440
4441 /* Validate obuf */
4442 TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
4443 ciphertext,
4444 tdata->ciphertext.data,
4445 tdata->validDataLenInBits.len,
4446 "SNOW 3G Ciphertext data not as expected");
4447
4448 return 0;
4449 }
4450
4451 /* Shift right a buffer by "offset" bits, "offset" < 8 */
4452 static void
buffer_shift_right(uint8_t * buffer,uint32_t length,uint8_t offset)4453 buffer_shift_right(uint8_t *buffer, uint32_t length, uint8_t offset)
4454 {
4455 uint8_t curr_byte, prev_byte;
4456 uint32_t length_in_bytes = ceil_byte_length(length + offset);
4457 uint8_t lower_byte_mask = (1 << offset) - 1;
4458 unsigned i;
4459
4460 prev_byte = buffer[0];
4461 buffer[0] >>= offset;
4462
4463 for (i = 1; i < length_in_bytes; i++) {
4464 curr_byte = buffer[i];
4465 buffer[i] = ((prev_byte & lower_byte_mask) << (8 - offset)) |
4466 (curr_byte >> offset);
4467 prev_byte = curr_byte;
4468 }
4469 }
4470
4471 static int
test_snow3g_encryption_offset_oop(const struct snow3g_test_data * tdata)4472 test_snow3g_encryption_offset_oop(const struct snow3g_test_data *tdata)
4473 {
4474 struct crypto_testsuite_params *ts_params = &testsuite_params;
4475 struct crypto_unittest_params *ut_params = &unittest_params;
4476 uint8_t *plaintext, *ciphertext;
4477 int retval;
4478 uint32_t plaintext_len;
4479 uint32_t plaintext_pad_len;
4480 uint8_t extra_offset = 4;
4481 uint8_t *expected_ciphertext_shifted;
4482 struct rte_cryptodev_info dev_info;
4483
4484 rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
4485 uint64_t feat_flags = dev_info.feature_flags;
4486
4487 if (!(feat_flags & RTE_CRYPTODEV_FF_NON_BYTE_ALIGNED_DATA) &&
4488 ((tdata->validDataLenInBits.len % 8) != 0)) {
4489 printf("Device doesn't support NON-Byte Aligned Data.\n");
4490 return TEST_SKIPPED;
4491 }
4492
4493 /* Verify the capabilities */
4494 struct rte_cryptodev_sym_capability_idx cap_idx;
4495 cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
4496 cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_SNOW3G_UEA2;
4497 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
4498 &cap_idx) == NULL)
4499 return TEST_SKIPPED;
4500
4501 if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
4502 return TEST_SKIPPED;
4503
4504 if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
4505 return TEST_SKIPPED;
4506
4507 /* Create SNOW 3G session */
4508 retval = create_wireless_algo_cipher_session(ts_params->valid_devs[0],
4509 RTE_CRYPTO_CIPHER_OP_ENCRYPT,
4510 RTE_CRYPTO_CIPHER_SNOW3G_UEA2,
4511 tdata->key.data, tdata->key.len,
4512 tdata->cipher_iv.len);
4513 if (retval < 0)
4514 return retval;
4515
4516 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
4517 ut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
4518
4519 TEST_ASSERT_NOT_NULL(ut_params->ibuf,
4520 "Failed to allocate input buffer in mempool");
4521 TEST_ASSERT_NOT_NULL(ut_params->obuf,
4522 "Failed to allocate output buffer in mempool");
4523
4524 /* Clear mbuf payload */
4525 memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
4526 rte_pktmbuf_tailroom(ut_params->ibuf));
4527
4528 plaintext_len = ceil_byte_length(tdata->plaintext.len + extra_offset);
4529 /*
4530 * Append data which is padded to a
4531 * multiple of the algorithms block size
4532 */
4533 plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16);
4534
4535 plaintext = (uint8_t *) rte_pktmbuf_append(ut_params->ibuf,
4536 plaintext_pad_len);
4537
4538 rte_pktmbuf_append(ut_params->obuf, plaintext_pad_len);
4539
4540 memcpy(plaintext, tdata->plaintext.data, (tdata->plaintext.len >> 3));
4541 buffer_shift_right(plaintext, tdata->plaintext.len, extra_offset);
4542
4543 #ifdef RTE_APP_TEST_DEBUG
4544 rte_hexdump(stdout, "plaintext:", plaintext, tdata->plaintext.len);
4545 #endif
4546 /* Create SNOW 3G operation */
4547 retval = create_wireless_algo_cipher_operation_oop(tdata->cipher_iv.data,
4548 tdata->cipher_iv.len,
4549 tdata->validCipherLenInBits.len,
4550 extra_offset);
4551 if (retval < 0)
4552 return retval;
4553
4554 if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
4555 process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
4556 ut_params->op, 1, 0, 1, tdata->cipher_iv.len);
4557 else
4558 ut_params->op = process_crypto_request(ts_params->valid_devs[0],
4559 ut_params->op);
4560 TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
4561
4562 ut_params->obuf = ut_params->op->sym->m_dst;
4563 if (ut_params->obuf)
4564 ciphertext = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *);
4565 else
4566 ciphertext = plaintext;
4567
4568 #ifdef RTE_APP_TEST_DEBUG
4569 rte_hexdump(stdout, "ciphertext:", ciphertext, plaintext_len);
4570 #endif
4571
4572 expected_ciphertext_shifted = rte_malloc(NULL, plaintext_len, 8);
4573
4574 TEST_ASSERT_NOT_NULL(expected_ciphertext_shifted,
4575 "failed to reserve memory for ciphertext shifted\n");
4576
4577 memcpy(expected_ciphertext_shifted, tdata->ciphertext.data,
4578 ceil_byte_length(tdata->ciphertext.len));
4579 buffer_shift_right(expected_ciphertext_shifted, tdata->ciphertext.len,
4580 extra_offset);
4581 /* Validate obuf */
4582 TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT_OFFSET(
4583 ciphertext,
4584 expected_ciphertext_shifted,
4585 tdata->validDataLenInBits.len,
4586 extra_offset,
4587 "SNOW 3G Ciphertext data not as expected");
4588 return 0;
4589 }
4590
test_snow3g_decryption(const struct snow3g_test_data * tdata)4591 static int test_snow3g_decryption(const struct snow3g_test_data *tdata)
4592 {
4593 struct crypto_testsuite_params *ts_params = &testsuite_params;
4594 struct crypto_unittest_params *ut_params = &unittest_params;
4595
4596 int retval;
4597
4598 uint8_t *plaintext, *ciphertext;
4599 unsigned ciphertext_pad_len;
4600 unsigned ciphertext_len;
4601 struct rte_cryptodev_info dev_info;
4602
4603 rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
4604 uint64_t feat_flags = dev_info.feature_flags;
4605
4606 if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
4607 (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
4608 printf("Device doesn't support RAW data-path APIs.\n");
4609 return TEST_SKIPPED;
4610 }
4611
4612 if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
4613 return TEST_SKIPPED;
4614
4615 /* Verify the capabilities */
4616 struct rte_cryptodev_sym_capability_idx cap_idx;
4617 cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
4618 cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_SNOW3G_UEA2;
4619 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
4620 &cap_idx) == NULL)
4621 return TEST_SKIPPED;
4622
4623 /* Create SNOW 3G session */
4624 retval = create_wireless_algo_cipher_session(ts_params->valid_devs[0],
4625 RTE_CRYPTO_CIPHER_OP_DECRYPT,
4626 RTE_CRYPTO_CIPHER_SNOW3G_UEA2,
4627 tdata->key.data, tdata->key.len,
4628 tdata->cipher_iv.len);
4629 if (retval < 0)
4630 return retval;
4631
4632 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
4633
4634 /* Clear mbuf payload */
4635 memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
4636 rte_pktmbuf_tailroom(ut_params->ibuf));
4637
4638 ciphertext_len = ceil_byte_length(tdata->ciphertext.len);
4639 /* Append data which is padded to a multiple of */
4640 /* the algorithms block size */
4641 ciphertext_pad_len = RTE_ALIGN_CEIL(ciphertext_len, 16);
4642 ciphertext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
4643 ciphertext_pad_len);
4644 memcpy(ciphertext, tdata->ciphertext.data, ciphertext_len);
4645
4646 debug_hexdump(stdout, "ciphertext:", ciphertext, ciphertext_len);
4647
4648 /* Create SNOW 3G operation */
4649 retval = create_wireless_algo_cipher_operation(tdata->cipher_iv.data,
4650 tdata->cipher_iv.len,
4651 tdata->validCipherLenInBits.len,
4652 tdata->cipher.offset_bits);
4653 if (retval < 0)
4654 return retval;
4655
4656 if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
4657 process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
4658 ut_params->op, 1, 0, 1, tdata->cipher_iv.len);
4659 else
4660 ut_params->op = process_crypto_request(ts_params->valid_devs[0],
4661 ut_params->op);
4662 TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
4663 ut_params->obuf = ut_params->op->sym->m_dst;
4664 if (ut_params->obuf)
4665 plaintext = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *);
4666 else
4667 plaintext = ciphertext;
4668
4669 debug_hexdump(stdout, "plaintext:", plaintext, ciphertext_len);
4670
4671 /* Validate obuf */
4672 TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(plaintext,
4673 tdata->plaintext.data,
4674 tdata->validDataLenInBits.len,
4675 "SNOW 3G Plaintext data not as expected");
4676 return 0;
4677 }
4678
test_snow3g_decryption_oop(const struct snow3g_test_data * tdata)4679 static int test_snow3g_decryption_oop(const struct snow3g_test_data *tdata)
4680 {
4681 struct crypto_testsuite_params *ts_params = &testsuite_params;
4682 struct crypto_unittest_params *ut_params = &unittest_params;
4683
4684 int retval;
4685
4686 uint8_t *plaintext, *ciphertext;
4687 unsigned ciphertext_pad_len;
4688 unsigned ciphertext_len;
4689 struct rte_cryptodev_info dev_info;
4690
4691 rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
4692 uint64_t feat_flags = dev_info.feature_flags;
4693
4694 if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
4695 (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
4696 printf("Device does not support RAW data-path APIs.\n");
4697 return -ENOTSUP;
4698 }
4699 /* Verify the capabilities */
4700 struct rte_cryptodev_sym_capability_idx cap_idx;
4701 cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
4702 cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_SNOW3G_UEA2;
4703 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
4704 &cap_idx) == NULL)
4705 return TEST_SKIPPED;
4706
4707 if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
4708 return TEST_SKIPPED;
4709
4710 if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
4711 return TEST_SKIPPED;
4712
4713 /* Create SNOW 3G session */
4714 retval = create_wireless_algo_cipher_session(ts_params->valid_devs[0],
4715 RTE_CRYPTO_CIPHER_OP_DECRYPT,
4716 RTE_CRYPTO_CIPHER_SNOW3G_UEA2,
4717 tdata->key.data, tdata->key.len,
4718 tdata->cipher_iv.len);
4719 if (retval < 0)
4720 return retval;
4721
4722 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
4723 ut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
4724
4725 TEST_ASSERT_NOT_NULL(ut_params->ibuf,
4726 "Failed to allocate input buffer");
4727 TEST_ASSERT_NOT_NULL(ut_params->obuf,
4728 "Failed to allocate output buffer");
4729
4730 /* Clear mbuf payload */
4731 memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
4732 rte_pktmbuf_tailroom(ut_params->ibuf));
4733
4734 memset(rte_pktmbuf_mtod(ut_params->obuf, uint8_t *), 0,
4735 rte_pktmbuf_tailroom(ut_params->obuf));
4736
4737 ciphertext_len = ceil_byte_length(tdata->ciphertext.len);
4738 /* Append data which is padded to a multiple of */
4739 /* the algorithms block size */
4740 ciphertext_pad_len = RTE_ALIGN_CEIL(ciphertext_len, 16);
4741 ciphertext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
4742 ciphertext_pad_len);
4743 rte_pktmbuf_append(ut_params->obuf, ciphertext_pad_len);
4744 memcpy(ciphertext, tdata->ciphertext.data, ciphertext_len);
4745
4746 debug_hexdump(stdout, "ciphertext:", ciphertext, ciphertext_len);
4747
4748 /* Create SNOW 3G operation */
4749 retval = create_wireless_algo_cipher_operation_oop(tdata->cipher_iv.data,
4750 tdata->cipher_iv.len,
4751 tdata->validCipherLenInBits.len,
4752 0);
4753 if (retval < 0)
4754 return retval;
4755
4756 if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
4757 process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
4758 ut_params->op, 1, 0, 1, tdata->cipher_iv.len);
4759 else
4760 ut_params->op = process_crypto_request(ts_params->valid_devs[0],
4761 ut_params->op);
4762 TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
4763 ut_params->obuf = ut_params->op->sym->m_dst;
4764 if (ut_params->obuf)
4765 plaintext = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *);
4766 else
4767 plaintext = ciphertext;
4768
4769 debug_hexdump(stdout, "plaintext:", plaintext, ciphertext_len);
4770
4771 /* Validate obuf */
4772 TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(plaintext,
4773 tdata->plaintext.data,
4774 tdata->validDataLenInBits.len,
4775 "SNOW 3G Plaintext data not as expected");
4776 return 0;
4777 }
4778
4779 static int
test_zuc_cipher_auth(const struct wireless_test_data * tdata)4780 test_zuc_cipher_auth(const struct wireless_test_data *tdata)
4781 {
4782 struct crypto_testsuite_params *ts_params = &testsuite_params;
4783 struct crypto_unittest_params *ut_params = &unittest_params;
4784
4785 int retval;
4786
4787 uint8_t *plaintext, *ciphertext;
4788 unsigned int plaintext_pad_len;
4789 unsigned int plaintext_len;
4790
4791 struct rte_cryptodev_info dev_info;
4792 struct rte_cryptodev_sym_capability_idx cap_idx;
4793
4794 rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
4795 uint64_t feat_flags = dev_info.feature_flags;
4796
4797 if (!(feat_flags & RTE_CRYPTODEV_FF_NON_BYTE_ALIGNED_DATA) &&
4798 ((tdata->validAuthLenInBits.len % 8 != 0) ||
4799 (tdata->validDataLenInBits.len % 8 != 0))) {
4800 printf("Device doesn't support NON-Byte Aligned Data.\n");
4801 return TEST_SKIPPED;
4802 }
4803
4804 if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
4805 (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
4806 printf("Device doesn't support RAW data-path APIs.\n");
4807 return TEST_SKIPPED;
4808 }
4809
4810 if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
4811 return TEST_SKIPPED;
4812
4813 /* Check if device supports ZUC EEA3 */
4814 cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
4815 cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_ZUC_EEA3;
4816
4817 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
4818 &cap_idx) == NULL)
4819 return TEST_SKIPPED;
4820
4821 /* Check if device supports ZUC EIA3 */
4822 cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
4823 cap_idx.algo.auth = RTE_CRYPTO_AUTH_ZUC_EIA3;
4824
4825 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
4826 &cap_idx) == NULL)
4827 return TEST_SKIPPED;
4828
4829 /* Create ZUC session */
4830 retval = create_zuc_cipher_auth_encrypt_generate_session(
4831 ts_params->valid_devs[0],
4832 tdata);
4833 if (retval != 0)
4834 return retval;
4835 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
4836
4837 /* clear mbuf payload */
4838 memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
4839 rte_pktmbuf_tailroom(ut_params->ibuf));
4840
4841 plaintext_len = ceil_byte_length(tdata->plaintext.len);
4842 /* Append data which is padded to a multiple of */
4843 /* the algorithms block size */
4844 plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16);
4845 plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
4846 plaintext_pad_len);
4847 memcpy(plaintext, tdata->plaintext.data, plaintext_len);
4848
4849 debug_hexdump(stdout, "plaintext:", plaintext, plaintext_len);
4850
4851 /* Create ZUC operation */
4852 retval = create_zuc_cipher_hash_generate_operation(tdata);
4853 if (retval < 0)
4854 return retval;
4855
4856 if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
4857 process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
4858 ut_params->op, 1, 1, 1, tdata->cipher_iv.len);
4859 else
4860 ut_params->op = process_crypto_request(ts_params->valid_devs[0],
4861 ut_params->op);
4862 TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
4863 ut_params->obuf = ut_params->op->sym->m_src;
4864 if (ut_params->obuf)
4865 ciphertext = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *);
4866 else
4867 ciphertext = plaintext;
4868
4869 debug_hexdump(stdout, "ciphertext:", ciphertext, plaintext_len);
4870 /* Validate obuf */
4871 TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
4872 ciphertext,
4873 tdata->ciphertext.data,
4874 tdata->validDataLenInBits.len,
4875 "ZUC Ciphertext data not as expected");
4876
4877 ut_params->digest = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *)
4878 + plaintext_pad_len;
4879
4880 /* Validate obuf */
4881 TEST_ASSERT_BUFFERS_ARE_EQUAL(
4882 ut_params->digest,
4883 tdata->digest.data,
4884 4,
4885 "ZUC Generated auth tag not as expected");
4886 return 0;
4887 }
4888
4889 static int
test_snow3g_cipher_auth(const struct snow3g_test_data * tdata)4890 test_snow3g_cipher_auth(const struct snow3g_test_data *tdata)
4891 {
4892 struct crypto_testsuite_params *ts_params = &testsuite_params;
4893 struct crypto_unittest_params *ut_params = &unittest_params;
4894
4895 int retval;
4896
4897 uint8_t *plaintext, *ciphertext;
4898 unsigned plaintext_pad_len;
4899 unsigned plaintext_len;
4900 struct rte_cryptodev_info dev_info;
4901
4902 rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
4903 uint64_t feat_flags = dev_info.feature_flags;
4904
4905 if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
4906 (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
4907 printf("Device doesn't support RAW data-path APIs.\n");
4908 return TEST_SKIPPED;
4909 }
4910
4911 if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
4912 return TEST_SKIPPED;
4913
4914 /* Verify the capabilities */
4915 struct rte_cryptodev_sym_capability_idx cap_idx;
4916 cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
4917 cap_idx.algo.auth = RTE_CRYPTO_AUTH_SNOW3G_UIA2;
4918 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
4919 &cap_idx) == NULL)
4920 return TEST_SKIPPED;
4921 cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
4922 cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_SNOW3G_UEA2;
4923 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
4924 &cap_idx) == NULL)
4925 return TEST_SKIPPED;
4926
4927 /* Create SNOW 3G session */
4928 retval = create_wireless_algo_cipher_auth_session(ts_params->valid_devs[0],
4929 RTE_CRYPTO_CIPHER_OP_ENCRYPT,
4930 RTE_CRYPTO_AUTH_OP_GENERATE,
4931 RTE_CRYPTO_AUTH_SNOW3G_UIA2,
4932 RTE_CRYPTO_CIPHER_SNOW3G_UEA2,
4933 tdata->key.data, tdata->key.len,
4934 tdata->auth_iv.len, tdata->digest.len,
4935 tdata->cipher_iv.len);
4936 if (retval != 0)
4937 return retval;
4938 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
4939
4940 /* clear mbuf payload */
4941 memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
4942 rte_pktmbuf_tailroom(ut_params->ibuf));
4943
4944 plaintext_len = ceil_byte_length(tdata->plaintext.len);
4945 /* Append data which is padded to a multiple of */
4946 /* the algorithms block size */
4947 plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16);
4948 plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
4949 plaintext_pad_len);
4950 memcpy(plaintext, tdata->plaintext.data, plaintext_len);
4951
4952 debug_hexdump(stdout, "plaintext:", plaintext, plaintext_len);
4953
4954 /* Create SNOW 3G operation */
4955 retval = create_wireless_algo_cipher_hash_operation(tdata->digest.data,
4956 tdata->digest.len, tdata->auth_iv.data,
4957 tdata->auth_iv.len,
4958 plaintext_pad_len, RTE_CRYPTO_AUTH_OP_GENERATE,
4959 tdata->cipher_iv.data, tdata->cipher_iv.len,
4960 tdata->validCipherLenInBits.len,
4961 0,
4962 tdata->validAuthLenInBits.len,
4963 0
4964 );
4965 if (retval < 0)
4966 return retval;
4967
4968 if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
4969 process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
4970 ut_params->op, 1, 1, 1, tdata->cipher_iv.len);
4971 else
4972 ut_params->op = process_crypto_request(ts_params->valid_devs[0],
4973 ut_params->op);
4974 TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
4975 ut_params->obuf = ut_params->op->sym->m_src;
4976 if (ut_params->obuf)
4977 ciphertext = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *);
4978 else
4979 ciphertext = plaintext;
4980
4981 debug_hexdump(stdout, "ciphertext:", ciphertext, plaintext_len);
4982 /* Validate obuf */
4983 TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
4984 ciphertext,
4985 tdata->ciphertext.data,
4986 tdata->validDataLenInBits.len,
4987 "SNOW 3G Ciphertext data not as expected");
4988
4989 ut_params->digest = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *)
4990 + plaintext_pad_len;
4991
4992 /* Validate obuf */
4993 TEST_ASSERT_BUFFERS_ARE_EQUAL(
4994 ut_params->digest,
4995 tdata->digest.data,
4996 DIGEST_BYTE_LENGTH_SNOW3G_UIA2,
4997 "SNOW 3G Generated auth tag not as expected");
4998 return 0;
4999 }
5000
5001 static int
test_snow3g_auth_cipher(const struct snow3g_test_data * tdata,uint8_t op_mode,uint8_t verify)5002 test_snow3g_auth_cipher(const struct snow3g_test_data *tdata,
5003 uint8_t op_mode, uint8_t verify)
5004 {
5005 struct crypto_testsuite_params *ts_params = &testsuite_params;
5006 struct crypto_unittest_params *ut_params = &unittest_params;
5007
5008 int retval;
5009
5010 uint8_t *plaintext = NULL, *ciphertext = NULL;
5011 unsigned int plaintext_pad_len;
5012 unsigned int plaintext_len;
5013 unsigned int ciphertext_pad_len;
5014 unsigned int ciphertext_len;
5015
5016 struct rte_cryptodev_info dev_info;
5017
5018 /* Verify the capabilities */
5019 struct rte_cryptodev_sym_capability_idx cap_idx;
5020 cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
5021 cap_idx.algo.auth = RTE_CRYPTO_AUTH_SNOW3G_UIA2;
5022 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
5023 &cap_idx) == NULL)
5024 return TEST_SKIPPED;
5025 cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
5026 cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_SNOW3G_UEA2;
5027 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
5028 &cap_idx) == NULL)
5029 return TEST_SKIPPED;
5030
5031 if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
5032 return TEST_SKIPPED;
5033
5034 rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
5035
5036 uint64_t feat_flags = dev_info.feature_flags;
5037
5038 if (op_mode == OUT_OF_PLACE) {
5039 if (!(feat_flags & RTE_CRYPTODEV_FF_DIGEST_ENCRYPTED)) {
5040 printf("Device doesn't support digest encrypted.\n");
5041 return TEST_SKIPPED;
5042 }
5043 if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
5044 return TEST_SKIPPED;
5045 }
5046
5047 if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
5048 (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
5049 printf("Device doesn't support RAW data-path APIs.\n");
5050 return TEST_SKIPPED;
5051 }
5052
5053 /* Create SNOW 3G session */
5054 retval = create_wireless_algo_auth_cipher_session(
5055 ts_params->valid_devs[0],
5056 (verify ? RTE_CRYPTO_CIPHER_OP_DECRYPT
5057 : RTE_CRYPTO_CIPHER_OP_ENCRYPT),
5058 (verify ? RTE_CRYPTO_AUTH_OP_VERIFY
5059 : RTE_CRYPTO_AUTH_OP_GENERATE),
5060 RTE_CRYPTO_AUTH_SNOW3G_UIA2,
5061 RTE_CRYPTO_CIPHER_SNOW3G_UEA2,
5062 tdata->key.data, tdata->key.len,
5063 tdata->auth_iv.len, tdata->digest.len,
5064 tdata->cipher_iv.len);
5065 if (retval != 0)
5066 return retval;
5067
5068 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
5069 if (op_mode == OUT_OF_PLACE)
5070 ut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
5071
5072 /* clear mbuf payload */
5073 memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
5074 rte_pktmbuf_tailroom(ut_params->ibuf));
5075 if (op_mode == OUT_OF_PLACE)
5076 memset(rte_pktmbuf_mtod(ut_params->obuf, uint8_t *), 0,
5077 rte_pktmbuf_tailroom(ut_params->obuf));
5078
5079 ciphertext_len = ceil_byte_length(tdata->ciphertext.len);
5080 plaintext_len = ceil_byte_length(tdata->plaintext.len);
5081 ciphertext_pad_len = RTE_ALIGN_CEIL(ciphertext_len, 16);
5082 plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16);
5083
5084 if (verify) {
5085 ciphertext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
5086 ciphertext_pad_len);
5087 memcpy(ciphertext, tdata->ciphertext.data, ciphertext_len);
5088 if (op_mode == OUT_OF_PLACE)
5089 rte_pktmbuf_append(ut_params->obuf, ciphertext_pad_len);
5090 debug_hexdump(stdout, "ciphertext:", ciphertext,
5091 ciphertext_len);
5092 } else {
5093 plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
5094 plaintext_pad_len);
5095 memcpy(plaintext, tdata->plaintext.data, plaintext_len);
5096 if (op_mode == OUT_OF_PLACE)
5097 rte_pktmbuf_append(ut_params->obuf, plaintext_pad_len);
5098 debug_hexdump(stdout, "plaintext:", plaintext, plaintext_len);
5099 }
5100
5101 /* Create SNOW 3G operation */
5102 retval = create_wireless_algo_auth_cipher_operation(
5103 tdata->digest.data, tdata->digest.len,
5104 tdata->cipher_iv.data, tdata->cipher_iv.len,
5105 tdata->auth_iv.data, tdata->auth_iv.len,
5106 (tdata->digest.offset_bytes == 0 ?
5107 (verify ? ciphertext_pad_len : plaintext_pad_len)
5108 : tdata->digest.offset_bytes),
5109 tdata->validCipherLenInBits.len,
5110 tdata->cipher.offset_bits,
5111 tdata->validAuthLenInBits.len,
5112 tdata->auth.offset_bits,
5113 op_mode, 0, verify);
5114
5115 if (retval < 0)
5116 return retval;
5117
5118 if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
5119 process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
5120 ut_params->op, 1, 1, 1, tdata->cipher_iv.len);
5121 else
5122 ut_params->op = process_crypto_request(ts_params->valid_devs[0],
5123 ut_params->op);
5124
5125 TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
5126
5127 ut_params->obuf = (op_mode == IN_PLACE ?
5128 ut_params->op->sym->m_src : ut_params->op->sym->m_dst);
5129
5130 if (verify) {
5131 if (ut_params->obuf)
5132 plaintext = rte_pktmbuf_mtod(ut_params->obuf,
5133 uint8_t *);
5134 else
5135 plaintext = ciphertext +
5136 (tdata->cipher.offset_bits >> 3);
5137
5138 debug_hexdump(stdout, "plaintext:", plaintext,
5139 (tdata->plaintext.len >> 3) - tdata->digest.len);
5140 debug_hexdump(stdout, "plaintext expected:",
5141 tdata->plaintext.data,
5142 (tdata->plaintext.len >> 3) - tdata->digest.len);
5143 } else {
5144 if (ut_params->obuf)
5145 ciphertext = rte_pktmbuf_mtod(ut_params->obuf,
5146 uint8_t *);
5147 else
5148 ciphertext = plaintext;
5149
5150 debug_hexdump(stdout, "ciphertext:", ciphertext,
5151 ciphertext_len);
5152 debug_hexdump(stdout, "ciphertext expected:",
5153 tdata->ciphertext.data, tdata->ciphertext.len >> 3);
5154
5155 ut_params->digest = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *)
5156 + (tdata->digest.offset_bytes == 0 ?
5157 plaintext_pad_len : tdata->digest.offset_bytes);
5158
5159 debug_hexdump(stdout, "digest:", ut_params->digest,
5160 tdata->digest.len);
5161 debug_hexdump(stdout, "digest expected:", tdata->digest.data,
5162 tdata->digest.len);
5163 }
5164
5165 /* Validate obuf */
5166 if (verify) {
5167 TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT_OFFSET(
5168 plaintext,
5169 tdata->plaintext.data,
5170 (tdata->plaintext.len - tdata->cipher.offset_bits -
5171 (tdata->digest.len << 3)),
5172 tdata->cipher.offset_bits,
5173 "SNOW 3G Plaintext data not as expected");
5174 } else {
5175 TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT_OFFSET(
5176 ciphertext,
5177 tdata->ciphertext.data,
5178 (tdata->validDataLenInBits.len -
5179 tdata->cipher.offset_bits),
5180 tdata->cipher.offset_bits,
5181 "SNOW 3G Ciphertext data not as expected");
5182
5183 TEST_ASSERT_BUFFERS_ARE_EQUAL(
5184 ut_params->digest,
5185 tdata->digest.data,
5186 DIGEST_BYTE_LENGTH_SNOW3G_UIA2,
5187 "SNOW 3G Generated auth tag not as expected");
5188 }
5189 return 0;
5190 }
5191
5192 static int
test_snow3g_auth_cipher_sgl(const struct snow3g_test_data * tdata,uint8_t op_mode,uint8_t verify)5193 test_snow3g_auth_cipher_sgl(const struct snow3g_test_data *tdata,
5194 uint8_t op_mode, uint8_t verify)
5195 {
5196 struct crypto_testsuite_params *ts_params = &testsuite_params;
5197 struct crypto_unittest_params *ut_params = &unittest_params;
5198
5199 int retval;
5200
5201 const uint8_t *plaintext = NULL;
5202 const uint8_t *ciphertext = NULL;
5203 const uint8_t *digest = NULL;
5204 unsigned int plaintext_pad_len;
5205 unsigned int plaintext_len;
5206 unsigned int ciphertext_pad_len;
5207 unsigned int ciphertext_len;
5208 uint8_t buffer[10000];
5209 uint8_t digest_buffer[10000];
5210
5211 struct rte_cryptodev_info dev_info;
5212
5213 /* Verify the capabilities */
5214 struct rte_cryptodev_sym_capability_idx cap_idx;
5215 cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
5216 cap_idx.algo.auth = RTE_CRYPTO_AUTH_SNOW3G_UIA2;
5217 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
5218 &cap_idx) == NULL)
5219 return TEST_SKIPPED;
5220 cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
5221 cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_SNOW3G_UEA2;
5222 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
5223 &cap_idx) == NULL)
5224 return TEST_SKIPPED;
5225
5226 if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
5227 return TEST_SKIPPED;
5228
5229 rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
5230
5231 uint64_t feat_flags = dev_info.feature_flags;
5232
5233 if (op_mode == IN_PLACE) {
5234 if (!(feat_flags & RTE_CRYPTODEV_FF_IN_PLACE_SGL)) {
5235 printf("Device doesn't support in-place scatter-gather "
5236 "in both input and output mbufs.\n");
5237 return TEST_SKIPPED;
5238 }
5239 if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
5240 (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
5241 printf("Device doesn't support RAW data-path APIs.\n");
5242 return TEST_SKIPPED;
5243 }
5244 } else {
5245 if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
5246 return TEST_SKIPPED;
5247 if (!(feat_flags & RTE_CRYPTODEV_FF_OOP_SGL_IN_SGL_OUT)) {
5248 printf("Device doesn't support out-of-place scatter-gather "
5249 "in both input and output mbufs.\n");
5250 return TEST_SKIPPED;
5251 }
5252 if (!(feat_flags & RTE_CRYPTODEV_FF_DIGEST_ENCRYPTED)) {
5253 printf("Device doesn't support digest encrypted.\n");
5254 return TEST_SKIPPED;
5255 }
5256 }
5257
5258 /* Create SNOW 3G session */
5259 retval = create_wireless_algo_auth_cipher_session(
5260 ts_params->valid_devs[0],
5261 (verify ? RTE_CRYPTO_CIPHER_OP_DECRYPT
5262 : RTE_CRYPTO_CIPHER_OP_ENCRYPT),
5263 (verify ? RTE_CRYPTO_AUTH_OP_VERIFY
5264 : RTE_CRYPTO_AUTH_OP_GENERATE),
5265 RTE_CRYPTO_AUTH_SNOW3G_UIA2,
5266 RTE_CRYPTO_CIPHER_SNOW3G_UEA2,
5267 tdata->key.data, tdata->key.len,
5268 tdata->auth_iv.len, tdata->digest.len,
5269 tdata->cipher_iv.len);
5270
5271 if (retval != 0)
5272 return retval;
5273
5274 ciphertext_len = ceil_byte_length(tdata->ciphertext.len);
5275 plaintext_len = ceil_byte_length(tdata->plaintext.len);
5276 ciphertext_pad_len = RTE_ALIGN_CEIL(ciphertext_len, 16);
5277 plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16);
5278
5279 ut_params->ibuf = create_segmented_mbuf(ts_params->mbuf_pool,
5280 plaintext_pad_len, 15, 0);
5281 TEST_ASSERT_NOT_NULL(ut_params->ibuf,
5282 "Failed to allocate input buffer in mempool");
5283
5284 if (op_mode == OUT_OF_PLACE) {
5285 ut_params->obuf = create_segmented_mbuf(ts_params->mbuf_pool,
5286 plaintext_pad_len, 15, 0);
5287 TEST_ASSERT_NOT_NULL(ut_params->obuf,
5288 "Failed to allocate output buffer in mempool");
5289 }
5290
5291 if (verify) {
5292 pktmbuf_write(ut_params->ibuf, 0, ciphertext_len,
5293 tdata->ciphertext.data);
5294 ciphertext = rte_pktmbuf_read(ut_params->ibuf, 0,
5295 ciphertext_len, buffer);
5296 debug_hexdump(stdout, "ciphertext:", ciphertext,
5297 ciphertext_len);
5298 } else {
5299 pktmbuf_write(ut_params->ibuf, 0, plaintext_len,
5300 tdata->plaintext.data);
5301 plaintext = rte_pktmbuf_read(ut_params->ibuf, 0,
5302 plaintext_len, buffer);
5303 debug_hexdump(stdout, "plaintext:", plaintext,
5304 plaintext_len);
5305 }
5306 memset(buffer, 0, sizeof(buffer));
5307
5308 /* Create SNOW 3G operation */
5309 retval = create_wireless_algo_auth_cipher_operation(
5310 tdata->digest.data, tdata->digest.len,
5311 tdata->cipher_iv.data, tdata->cipher_iv.len,
5312 tdata->auth_iv.data, tdata->auth_iv.len,
5313 (tdata->digest.offset_bytes == 0 ?
5314 (verify ? ciphertext_pad_len : plaintext_pad_len)
5315 : tdata->digest.offset_bytes),
5316 tdata->validCipherLenInBits.len,
5317 tdata->cipher.offset_bits,
5318 tdata->validAuthLenInBits.len,
5319 tdata->auth.offset_bits,
5320 op_mode, 1, verify);
5321
5322 if (retval < 0)
5323 return retval;
5324
5325 if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
5326 process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
5327 ut_params->op, 1, 1, 1, tdata->cipher_iv.len);
5328 else
5329 ut_params->op = process_crypto_request(ts_params->valid_devs[0],
5330 ut_params->op);
5331
5332 TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
5333
5334 ut_params->obuf = (op_mode == IN_PLACE ?
5335 ut_params->op->sym->m_src : ut_params->op->sym->m_dst);
5336
5337 if (verify) {
5338 if (ut_params->obuf)
5339 plaintext = rte_pktmbuf_read(ut_params->obuf, 0,
5340 plaintext_len, buffer);
5341 else
5342 plaintext = rte_pktmbuf_read(ut_params->ibuf, 0,
5343 plaintext_len, buffer);
5344
5345 debug_hexdump(stdout, "plaintext:", plaintext,
5346 (tdata->plaintext.len >> 3) - tdata->digest.len);
5347 debug_hexdump(stdout, "plaintext expected:",
5348 tdata->plaintext.data,
5349 (tdata->plaintext.len >> 3) - tdata->digest.len);
5350 } else {
5351 if (ut_params->obuf)
5352 ciphertext = rte_pktmbuf_read(ut_params->obuf, 0,
5353 ciphertext_len, buffer);
5354 else
5355 ciphertext = rte_pktmbuf_read(ut_params->ibuf, 0,
5356 ciphertext_len, buffer);
5357
5358 debug_hexdump(stdout, "ciphertext:", ciphertext,
5359 ciphertext_len);
5360 debug_hexdump(stdout, "ciphertext expected:",
5361 tdata->ciphertext.data, tdata->ciphertext.len >> 3);
5362
5363 if (ut_params->obuf)
5364 digest = rte_pktmbuf_read(ut_params->obuf,
5365 (tdata->digest.offset_bytes == 0 ?
5366 plaintext_pad_len : tdata->digest.offset_bytes),
5367 tdata->digest.len, digest_buffer);
5368 else
5369 digest = rte_pktmbuf_read(ut_params->ibuf,
5370 (tdata->digest.offset_bytes == 0 ?
5371 plaintext_pad_len : tdata->digest.offset_bytes),
5372 tdata->digest.len, digest_buffer);
5373
5374 debug_hexdump(stdout, "digest:", digest,
5375 tdata->digest.len);
5376 debug_hexdump(stdout, "digest expected:",
5377 tdata->digest.data, tdata->digest.len);
5378 }
5379
5380 /* Validate obuf */
5381 if (verify) {
5382 TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT_OFFSET(
5383 plaintext,
5384 tdata->plaintext.data,
5385 (tdata->plaintext.len - tdata->cipher.offset_bits -
5386 (tdata->digest.len << 3)),
5387 tdata->cipher.offset_bits,
5388 "SNOW 3G Plaintext data not as expected");
5389 } else {
5390 TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT_OFFSET(
5391 ciphertext,
5392 tdata->ciphertext.data,
5393 (tdata->validDataLenInBits.len -
5394 tdata->cipher.offset_bits),
5395 tdata->cipher.offset_bits,
5396 "SNOW 3G Ciphertext data not as expected");
5397
5398 TEST_ASSERT_BUFFERS_ARE_EQUAL(
5399 digest,
5400 tdata->digest.data,
5401 DIGEST_BYTE_LENGTH_SNOW3G_UIA2,
5402 "SNOW 3G Generated auth tag not as expected");
5403 }
5404 return 0;
5405 }
5406
5407 static int
test_kasumi_auth_cipher(const struct kasumi_test_data * tdata,uint8_t op_mode,uint8_t verify)5408 test_kasumi_auth_cipher(const struct kasumi_test_data *tdata,
5409 uint8_t op_mode, uint8_t verify)
5410 {
5411 struct crypto_testsuite_params *ts_params = &testsuite_params;
5412 struct crypto_unittest_params *ut_params = &unittest_params;
5413
5414 int retval;
5415
5416 uint8_t *plaintext = NULL, *ciphertext = NULL;
5417 unsigned int plaintext_pad_len;
5418 unsigned int plaintext_len;
5419 unsigned int ciphertext_pad_len;
5420 unsigned int ciphertext_len;
5421
5422 struct rte_cryptodev_info dev_info;
5423
5424 /* Verify the capabilities */
5425 struct rte_cryptodev_sym_capability_idx cap_idx;
5426 cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
5427 cap_idx.algo.auth = RTE_CRYPTO_AUTH_KASUMI_F9;
5428 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
5429 &cap_idx) == NULL)
5430 return TEST_SKIPPED;
5431 cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
5432 cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_KASUMI_F8;
5433 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
5434 &cap_idx) == NULL)
5435 return TEST_SKIPPED;
5436
5437 rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
5438
5439 uint64_t feat_flags = dev_info.feature_flags;
5440
5441 if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
5442 (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
5443 printf("Device doesn't support RAW data-path APIs.\n");
5444 return TEST_SKIPPED;
5445 }
5446
5447 if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
5448 return TEST_SKIPPED;
5449
5450 if (op_mode == OUT_OF_PLACE) {
5451 if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
5452 return TEST_SKIPPED;
5453 if (!(feat_flags & RTE_CRYPTODEV_FF_DIGEST_ENCRYPTED)) {
5454 printf("Device doesn't support digest encrypted.\n");
5455 return TEST_SKIPPED;
5456 }
5457 }
5458
5459 /* Create KASUMI session */
5460 retval = create_wireless_algo_auth_cipher_session(
5461 ts_params->valid_devs[0],
5462 (verify ? RTE_CRYPTO_CIPHER_OP_DECRYPT
5463 : RTE_CRYPTO_CIPHER_OP_ENCRYPT),
5464 (verify ? RTE_CRYPTO_AUTH_OP_VERIFY
5465 : RTE_CRYPTO_AUTH_OP_GENERATE),
5466 RTE_CRYPTO_AUTH_KASUMI_F9,
5467 RTE_CRYPTO_CIPHER_KASUMI_F8,
5468 tdata->key.data, tdata->key.len,
5469 0, tdata->digest.len,
5470 tdata->cipher_iv.len);
5471
5472 if (retval != 0)
5473 return retval;
5474
5475 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
5476 if (op_mode == OUT_OF_PLACE)
5477 ut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
5478
5479 /* clear mbuf payload */
5480 memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
5481 rte_pktmbuf_tailroom(ut_params->ibuf));
5482 if (op_mode == OUT_OF_PLACE)
5483 memset(rte_pktmbuf_mtod(ut_params->obuf, uint8_t *), 0,
5484 rte_pktmbuf_tailroom(ut_params->obuf));
5485
5486 ciphertext_len = ceil_byte_length(tdata->ciphertext.len);
5487 plaintext_len = ceil_byte_length(tdata->plaintext.len);
5488 ciphertext_pad_len = RTE_ALIGN_CEIL(ciphertext_len, 16);
5489 plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16);
5490
5491 if (verify) {
5492 ciphertext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
5493 ciphertext_pad_len);
5494 memcpy(ciphertext, tdata->ciphertext.data, ciphertext_len);
5495 if (op_mode == OUT_OF_PLACE)
5496 rte_pktmbuf_append(ut_params->obuf, ciphertext_pad_len);
5497 debug_hexdump(stdout, "ciphertext:", ciphertext,
5498 ciphertext_len);
5499 } else {
5500 plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
5501 plaintext_pad_len);
5502 memcpy(plaintext, tdata->plaintext.data, plaintext_len);
5503 if (op_mode == OUT_OF_PLACE)
5504 rte_pktmbuf_append(ut_params->obuf, plaintext_pad_len);
5505 debug_hexdump(stdout, "plaintext:", plaintext,
5506 plaintext_len);
5507 }
5508
5509 /* Create KASUMI operation */
5510 retval = create_wireless_algo_auth_cipher_operation(
5511 tdata->digest.data, tdata->digest.len,
5512 tdata->cipher_iv.data, tdata->cipher_iv.len,
5513 NULL, 0,
5514 (tdata->digest.offset_bytes == 0 ?
5515 (verify ? ciphertext_pad_len : plaintext_pad_len)
5516 : tdata->digest.offset_bytes),
5517 tdata->validCipherLenInBits.len,
5518 tdata->validCipherOffsetInBits.len,
5519 tdata->validAuthLenInBits.len,
5520 0,
5521 op_mode, 0, verify);
5522
5523 if (retval < 0)
5524 return retval;
5525
5526 if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
5527 process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
5528 ut_params->op, 1, 1, 1, tdata->cipher_iv.len);
5529 else
5530 ut_params->op = process_crypto_request(ts_params->valid_devs[0],
5531 ut_params->op);
5532
5533 TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
5534
5535 ut_params->obuf = (op_mode == IN_PLACE ?
5536 ut_params->op->sym->m_src : ut_params->op->sym->m_dst);
5537
5538
5539 if (verify) {
5540 if (ut_params->obuf)
5541 plaintext = rte_pktmbuf_mtod(ut_params->obuf,
5542 uint8_t *);
5543 else
5544 plaintext = ciphertext;
5545
5546 debug_hexdump(stdout, "plaintext:", plaintext,
5547 (tdata->plaintext.len >> 3) - tdata->digest.len);
5548 debug_hexdump(stdout, "plaintext expected:",
5549 tdata->plaintext.data,
5550 (tdata->plaintext.len >> 3) - tdata->digest.len);
5551 } else {
5552 if (ut_params->obuf)
5553 ciphertext = rte_pktmbuf_mtod(ut_params->obuf,
5554 uint8_t *);
5555 else
5556 ciphertext = plaintext;
5557
5558 debug_hexdump(stdout, "ciphertext:", ciphertext,
5559 ciphertext_len);
5560 debug_hexdump(stdout, "ciphertext expected:",
5561 tdata->ciphertext.data, tdata->ciphertext.len >> 3);
5562
5563 ut_params->digest = rte_pktmbuf_mtod(
5564 ut_params->obuf, uint8_t *) +
5565 (tdata->digest.offset_bytes == 0 ?
5566 plaintext_pad_len : tdata->digest.offset_bytes);
5567
5568 debug_hexdump(stdout, "digest:", ut_params->digest,
5569 tdata->digest.len);
5570 debug_hexdump(stdout, "digest expected:",
5571 tdata->digest.data, tdata->digest.len);
5572 }
5573
5574 /* Validate obuf */
5575 if (verify) {
5576 TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
5577 plaintext,
5578 tdata->plaintext.data,
5579 tdata->plaintext.len >> 3,
5580 "KASUMI Plaintext data not as expected");
5581 } else {
5582 TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
5583 ciphertext,
5584 tdata->ciphertext.data,
5585 tdata->ciphertext.len >> 3,
5586 "KASUMI Ciphertext data not as expected");
5587
5588 TEST_ASSERT_BUFFERS_ARE_EQUAL(
5589 ut_params->digest,
5590 tdata->digest.data,
5591 DIGEST_BYTE_LENGTH_KASUMI_F9,
5592 "KASUMI Generated auth tag not as expected");
5593 }
5594 return 0;
5595 }
5596
5597 static int
test_kasumi_auth_cipher_sgl(const struct kasumi_test_data * tdata,uint8_t op_mode,uint8_t verify)5598 test_kasumi_auth_cipher_sgl(const struct kasumi_test_data *tdata,
5599 uint8_t op_mode, uint8_t verify)
5600 {
5601 struct crypto_testsuite_params *ts_params = &testsuite_params;
5602 struct crypto_unittest_params *ut_params = &unittest_params;
5603
5604 int retval;
5605
5606 const uint8_t *plaintext = NULL;
5607 const uint8_t *ciphertext = NULL;
5608 const uint8_t *digest = NULL;
5609 unsigned int plaintext_pad_len;
5610 unsigned int plaintext_len;
5611 unsigned int ciphertext_pad_len;
5612 unsigned int ciphertext_len;
5613 uint8_t buffer[10000];
5614 uint8_t digest_buffer[10000];
5615
5616 struct rte_cryptodev_info dev_info;
5617
5618 /* Verify the capabilities */
5619 struct rte_cryptodev_sym_capability_idx cap_idx;
5620 cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
5621 cap_idx.algo.auth = RTE_CRYPTO_AUTH_KASUMI_F9;
5622 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
5623 &cap_idx) == NULL)
5624 return TEST_SKIPPED;
5625 cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
5626 cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_KASUMI_F8;
5627 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
5628 &cap_idx) == NULL)
5629 return TEST_SKIPPED;
5630
5631 if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
5632 return TEST_SKIPPED;
5633
5634 rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
5635
5636 uint64_t feat_flags = dev_info.feature_flags;
5637
5638 if (op_mode == IN_PLACE) {
5639 if (!(feat_flags & RTE_CRYPTODEV_FF_IN_PLACE_SGL)) {
5640 printf("Device doesn't support in-place scatter-gather "
5641 "in both input and output mbufs.\n");
5642 return TEST_SKIPPED;
5643 }
5644 if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
5645 (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
5646 printf("Device doesn't support RAW data-path APIs.\n");
5647 return TEST_SKIPPED;
5648 }
5649 } else {
5650 if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
5651 return TEST_SKIPPED;
5652 if (!(feat_flags & RTE_CRYPTODEV_FF_OOP_SGL_IN_SGL_OUT)) {
5653 printf("Device doesn't support out-of-place scatter-gather "
5654 "in both input and output mbufs.\n");
5655 return TEST_SKIPPED;
5656 }
5657 if (!(feat_flags & RTE_CRYPTODEV_FF_DIGEST_ENCRYPTED)) {
5658 printf("Device doesn't support digest encrypted.\n");
5659 return TEST_SKIPPED;
5660 }
5661 }
5662
5663 /* Create KASUMI session */
5664 retval = create_wireless_algo_auth_cipher_session(
5665 ts_params->valid_devs[0],
5666 (verify ? RTE_CRYPTO_CIPHER_OP_DECRYPT
5667 : RTE_CRYPTO_CIPHER_OP_ENCRYPT),
5668 (verify ? RTE_CRYPTO_AUTH_OP_VERIFY
5669 : RTE_CRYPTO_AUTH_OP_GENERATE),
5670 RTE_CRYPTO_AUTH_KASUMI_F9,
5671 RTE_CRYPTO_CIPHER_KASUMI_F8,
5672 tdata->key.data, tdata->key.len,
5673 0, tdata->digest.len,
5674 tdata->cipher_iv.len);
5675
5676 if (retval != 0)
5677 return retval;
5678
5679 ciphertext_len = ceil_byte_length(tdata->ciphertext.len);
5680 plaintext_len = ceil_byte_length(tdata->plaintext.len);
5681 ciphertext_pad_len = RTE_ALIGN_CEIL(ciphertext_len, 16);
5682 plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16);
5683
5684 ut_params->ibuf = create_segmented_mbuf(ts_params->mbuf_pool,
5685 plaintext_pad_len, 15, 0);
5686 TEST_ASSERT_NOT_NULL(ut_params->ibuf,
5687 "Failed to allocate input buffer in mempool");
5688
5689 if (op_mode == OUT_OF_PLACE) {
5690 ut_params->obuf = create_segmented_mbuf(ts_params->mbuf_pool,
5691 plaintext_pad_len, 15, 0);
5692 TEST_ASSERT_NOT_NULL(ut_params->obuf,
5693 "Failed to allocate output buffer in mempool");
5694 }
5695
5696 if (verify) {
5697 pktmbuf_write(ut_params->ibuf, 0, ciphertext_len,
5698 tdata->ciphertext.data);
5699 ciphertext = rte_pktmbuf_read(ut_params->ibuf, 0,
5700 ciphertext_len, buffer);
5701 debug_hexdump(stdout, "ciphertext:", ciphertext,
5702 ciphertext_len);
5703 } else {
5704 pktmbuf_write(ut_params->ibuf, 0, plaintext_len,
5705 tdata->plaintext.data);
5706 plaintext = rte_pktmbuf_read(ut_params->ibuf, 0,
5707 plaintext_len, buffer);
5708 debug_hexdump(stdout, "plaintext:", plaintext,
5709 plaintext_len);
5710 }
5711 memset(buffer, 0, sizeof(buffer));
5712
5713 /* Create KASUMI operation */
5714 retval = create_wireless_algo_auth_cipher_operation(
5715 tdata->digest.data, tdata->digest.len,
5716 tdata->cipher_iv.data, tdata->cipher_iv.len,
5717 NULL, 0,
5718 (tdata->digest.offset_bytes == 0 ?
5719 (verify ? ciphertext_pad_len : plaintext_pad_len)
5720 : tdata->digest.offset_bytes),
5721 tdata->validCipherLenInBits.len,
5722 tdata->validCipherOffsetInBits.len,
5723 tdata->validAuthLenInBits.len,
5724 0,
5725 op_mode, 1, verify);
5726
5727 if (retval < 0)
5728 return retval;
5729
5730 if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
5731 process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
5732 ut_params->op, 1, 1, 1, tdata->cipher_iv.len);
5733 else
5734 ut_params->op = process_crypto_request(ts_params->valid_devs[0],
5735 ut_params->op);
5736
5737 TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
5738
5739 ut_params->obuf = (op_mode == IN_PLACE ?
5740 ut_params->op->sym->m_src : ut_params->op->sym->m_dst);
5741
5742 if (verify) {
5743 if (ut_params->obuf)
5744 plaintext = rte_pktmbuf_read(ut_params->obuf, 0,
5745 plaintext_len, buffer);
5746 else
5747 plaintext = rte_pktmbuf_read(ut_params->ibuf, 0,
5748 plaintext_len, buffer);
5749
5750 debug_hexdump(stdout, "plaintext:", plaintext,
5751 (tdata->plaintext.len >> 3) - tdata->digest.len);
5752 debug_hexdump(stdout, "plaintext expected:",
5753 tdata->plaintext.data,
5754 (tdata->plaintext.len >> 3) - tdata->digest.len);
5755 } else {
5756 if (ut_params->obuf)
5757 ciphertext = rte_pktmbuf_read(ut_params->obuf, 0,
5758 ciphertext_len, buffer);
5759 else
5760 ciphertext = rte_pktmbuf_read(ut_params->ibuf, 0,
5761 ciphertext_len, buffer);
5762
5763 debug_hexdump(stdout, "ciphertext:", ciphertext,
5764 ciphertext_len);
5765 debug_hexdump(stdout, "ciphertext expected:",
5766 tdata->ciphertext.data, tdata->ciphertext.len >> 3);
5767
5768 if (ut_params->obuf)
5769 digest = rte_pktmbuf_read(ut_params->obuf,
5770 (tdata->digest.offset_bytes == 0 ?
5771 plaintext_pad_len : tdata->digest.offset_bytes),
5772 tdata->digest.len, digest_buffer);
5773 else
5774 digest = rte_pktmbuf_read(ut_params->ibuf,
5775 (tdata->digest.offset_bytes == 0 ?
5776 plaintext_pad_len : tdata->digest.offset_bytes),
5777 tdata->digest.len, digest_buffer);
5778
5779 debug_hexdump(stdout, "digest:", digest,
5780 tdata->digest.len);
5781 debug_hexdump(stdout, "digest expected:",
5782 tdata->digest.data, tdata->digest.len);
5783 }
5784
5785 /* Validate obuf */
5786 if (verify) {
5787 TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
5788 plaintext,
5789 tdata->plaintext.data,
5790 tdata->plaintext.len >> 3,
5791 "KASUMI Plaintext data not as expected");
5792 } else {
5793 TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
5794 ciphertext,
5795 tdata->ciphertext.data,
5796 tdata->validDataLenInBits.len,
5797 "KASUMI Ciphertext data not as expected");
5798
5799 TEST_ASSERT_BUFFERS_ARE_EQUAL(
5800 digest,
5801 tdata->digest.data,
5802 DIGEST_BYTE_LENGTH_KASUMI_F9,
5803 "KASUMI Generated auth tag not as expected");
5804 }
5805 return 0;
5806 }
5807
5808 static int
test_kasumi_cipher_auth(const struct kasumi_test_data * tdata)5809 test_kasumi_cipher_auth(const struct kasumi_test_data *tdata)
5810 {
5811 struct crypto_testsuite_params *ts_params = &testsuite_params;
5812 struct crypto_unittest_params *ut_params = &unittest_params;
5813
5814 int retval;
5815
5816 uint8_t *plaintext, *ciphertext;
5817 unsigned plaintext_pad_len;
5818 unsigned plaintext_len;
5819 struct rte_cryptodev_info dev_info;
5820
5821 rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
5822 uint64_t feat_flags = dev_info.feature_flags;
5823
5824 if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
5825 (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
5826 printf("Device doesn't support RAW data-path APIs.\n");
5827 return TEST_SKIPPED;
5828 }
5829
5830 if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
5831 return TEST_SKIPPED;
5832
5833 /* Verify the capabilities */
5834 struct rte_cryptodev_sym_capability_idx cap_idx;
5835 cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
5836 cap_idx.algo.auth = RTE_CRYPTO_AUTH_KASUMI_F9;
5837 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
5838 &cap_idx) == NULL)
5839 return TEST_SKIPPED;
5840 cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
5841 cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_KASUMI_F8;
5842 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
5843 &cap_idx) == NULL)
5844 return TEST_SKIPPED;
5845
5846 /* Create KASUMI session */
5847 retval = create_wireless_algo_cipher_auth_session(
5848 ts_params->valid_devs[0],
5849 RTE_CRYPTO_CIPHER_OP_ENCRYPT,
5850 RTE_CRYPTO_AUTH_OP_GENERATE,
5851 RTE_CRYPTO_AUTH_KASUMI_F9,
5852 RTE_CRYPTO_CIPHER_KASUMI_F8,
5853 tdata->key.data, tdata->key.len,
5854 0, tdata->digest.len,
5855 tdata->cipher_iv.len);
5856 if (retval != 0)
5857 return retval;
5858
5859 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
5860
5861 /* clear mbuf payload */
5862 memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
5863 rte_pktmbuf_tailroom(ut_params->ibuf));
5864
5865 plaintext_len = ceil_byte_length(tdata->plaintext.len);
5866 /* Append data which is padded to a multiple of */
5867 /* the algorithms block size */
5868 plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16);
5869 plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
5870 plaintext_pad_len);
5871 memcpy(plaintext, tdata->plaintext.data, plaintext_len);
5872
5873 debug_hexdump(stdout, "plaintext:", plaintext, plaintext_len);
5874
5875 /* Create KASUMI operation */
5876 retval = create_wireless_algo_cipher_hash_operation(tdata->digest.data,
5877 tdata->digest.len, NULL, 0,
5878 plaintext_pad_len, RTE_CRYPTO_AUTH_OP_GENERATE,
5879 tdata->cipher_iv.data, tdata->cipher_iv.len,
5880 RTE_ALIGN_CEIL(tdata->validCipherLenInBits.len, 8),
5881 tdata->validCipherOffsetInBits.len,
5882 tdata->validAuthLenInBits.len,
5883 0
5884 );
5885 if (retval < 0)
5886 return retval;
5887
5888 if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
5889 process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
5890 ut_params->op, 1, 1, 1, tdata->cipher_iv.len);
5891 else
5892 ut_params->op = process_crypto_request(ts_params->valid_devs[0],
5893 ut_params->op);
5894 TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
5895
5896 if (ut_params->op->sym->m_dst)
5897 ut_params->obuf = ut_params->op->sym->m_dst;
5898 else
5899 ut_params->obuf = ut_params->op->sym->m_src;
5900
5901 ciphertext = rte_pktmbuf_mtod_offset(ut_params->obuf, uint8_t *,
5902 tdata->validCipherOffsetInBits.len >> 3);
5903
5904 ut_params->digest = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *)
5905 + plaintext_pad_len;
5906
5907 const uint8_t *reference_ciphertext = tdata->ciphertext.data +
5908 (tdata->validCipherOffsetInBits.len >> 3);
5909 /* Validate obuf */
5910 TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
5911 ciphertext,
5912 reference_ciphertext,
5913 tdata->validCipherLenInBits.len,
5914 "KASUMI Ciphertext data not as expected");
5915
5916 /* Validate obuf */
5917 TEST_ASSERT_BUFFERS_ARE_EQUAL(
5918 ut_params->digest,
5919 tdata->digest.data,
5920 DIGEST_BYTE_LENGTH_SNOW3G_UIA2,
5921 "KASUMI Generated auth tag not as expected");
5922 return 0;
5923 }
5924
5925 static int
check_cipher_capability(const struct crypto_testsuite_params * ts_params,const enum rte_crypto_cipher_algorithm cipher_algo,const uint16_t key_size,const uint16_t iv_size)5926 check_cipher_capability(const struct crypto_testsuite_params *ts_params,
5927 const enum rte_crypto_cipher_algorithm cipher_algo,
5928 const uint16_t key_size, const uint16_t iv_size)
5929 {
5930 struct rte_cryptodev_sym_capability_idx cap_idx;
5931 const struct rte_cryptodev_symmetric_capability *cap;
5932
5933 /* Check if device supports the algorithm */
5934 cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
5935 cap_idx.algo.cipher = cipher_algo;
5936
5937 cap = rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
5938 &cap_idx);
5939
5940 if (cap == NULL)
5941 return -1;
5942
5943 /* Check if device supports key size and IV size */
5944 if (rte_cryptodev_sym_capability_check_cipher(cap, key_size,
5945 iv_size) < 0) {
5946 return -1;
5947 }
5948
5949 return 0;
5950 }
5951
5952 static int
check_auth_capability(const struct crypto_testsuite_params * ts_params,const enum rte_crypto_auth_algorithm auth_algo,const uint16_t key_size,const uint16_t iv_size,const uint16_t tag_size)5953 check_auth_capability(const struct crypto_testsuite_params *ts_params,
5954 const enum rte_crypto_auth_algorithm auth_algo,
5955 const uint16_t key_size, const uint16_t iv_size,
5956 const uint16_t tag_size)
5957 {
5958 struct rte_cryptodev_sym_capability_idx cap_idx;
5959 const struct rte_cryptodev_symmetric_capability *cap;
5960
5961 /* Check if device supports the algorithm */
5962 cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
5963 cap_idx.algo.auth = auth_algo;
5964
5965 cap = rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
5966 &cap_idx);
5967
5968 if (cap == NULL)
5969 return -1;
5970
5971 /* Check if device supports key size and IV size */
5972 if (rte_cryptodev_sym_capability_check_auth(cap, key_size,
5973 tag_size, iv_size) < 0) {
5974 return -1;
5975 }
5976
5977 return 0;
5978 }
5979
5980 static int
test_zuc_encryption(const struct wireless_test_data * tdata)5981 test_zuc_encryption(const struct wireless_test_data *tdata)
5982 {
5983 struct crypto_testsuite_params *ts_params = &testsuite_params;
5984 struct crypto_unittest_params *ut_params = &unittest_params;
5985
5986 int retval;
5987 uint8_t *plaintext, *ciphertext;
5988 unsigned plaintext_pad_len;
5989 unsigned plaintext_len;
5990 struct rte_cryptodev_info dev_info;
5991
5992 rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
5993 uint64_t feat_flags = dev_info.feature_flags;
5994
5995 if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
5996 (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
5997 printf("Device doesn't support RAW data-path APIs.\n");
5998 return TEST_SKIPPED;
5999 }
6000
6001 if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
6002 return TEST_SKIPPED;
6003
6004 /* Check if device supports ZUC EEA3 */
6005 if (check_cipher_capability(ts_params, RTE_CRYPTO_CIPHER_ZUC_EEA3,
6006 tdata->key.len, tdata->cipher_iv.len) < 0)
6007 return TEST_SKIPPED;
6008
6009 /* Create ZUC session */
6010 retval = create_wireless_algo_cipher_session(ts_params->valid_devs[0],
6011 RTE_CRYPTO_CIPHER_OP_ENCRYPT,
6012 RTE_CRYPTO_CIPHER_ZUC_EEA3,
6013 tdata->key.data, tdata->key.len,
6014 tdata->cipher_iv.len);
6015 if (retval != 0)
6016 return retval;
6017
6018 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
6019
6020 /* Clear mbuf payload */
6021 memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
6022 rte_pktmbuf_tailroom(ut_params->ibuf));
6023
6024 plaintext_len = ceil_byte_length(tdata->plaintext.len);
6025 /* Append data which is padded to a multiple */
6026 /* of the algorithms block size */
6027 plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 8);
6028 plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
6029 plaintext_pad_len);
6030 memcpy(plaintext, tdata->plaintext.data, plaintext_len);
6031
6032 debug_hexdump(stdout, "plaintext:", plaintext, plaintext_len);
6033
6034 /* Create ZUC operation */
6035 retval = create_wireless_algo_cipher_operation(tdata->cipher_iv.data,
6036 tdata->cipher_iv.len,
6037 tdata->plaintext.len,
6038 0);
6039 if (retval < 0)
6040 return retval;
6041
6042 if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
6043 process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
6044 ut_params->op, 1, 0, 1, tdata->cipher_iv.len);
6045 else
6046 ut_params->op = process_crypto_request(ts_params->valid_devs[0],
6047 ut_params->op);
6048 TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
6049
6050 ut_params->obuf = ut_params->op->sym->m_dst;
6051 if (ut_params->obuf)
6052 ciphertext = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *);
6053 else
6054 ciphertext = plaintext;
6055
6056 debug_hexdump(stdout, "ciphertext:", ciphertext, plaintext_len);
6057
6058 /* Validate obuf */
6059 TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
6060 ciphertext,
6061 tdata->ciphertext.data,
6062 tdata->validCipherLenInBits.len,
6063 "ZUC Ciphertext data not as expected");
6064 return 0;
6065 }
6066
6067 static int
test_zuc_encryption_sgl(const struct wireless_test_data * tdata)6068 test_zuc_encryption_sgl(const struct wireless_test_data *tdata)
6069 {
6070 struct crypto_testsuite_params *ts_params = &testsuite_params;
6071 struct crypto_unittest_params *ut_params = &unittest_params;
6072
6073 int retval;
6074
6075 unsigned int plaintext_pad_len;
6076 unsigned int plaintext_len;
6077 const uint8_t *ciphertext;
6078 uint8_t ciphertext_buffer[2048];
6079 struct rte_cryptodev_info dev_info;
6080
6081 /* Check if device supports ZUC EEA3 */
6082 if (check_cipher_capability(ts_params, RTE_CRYPTO_CIPHER_ZUC_EEA3,
6083 tdata->key.len, tdata->cipher_iv.len) < 0)
6084 return TEST_SKIPPED;
6085
6086 if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
6087 return TEST_SKIPPED;
6088
6089 rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
6090
6091 uint64_t feat_flags = dev_info.feature_flags;
6092
6093 if (!(feat_flags & RTE_CRYPTODEV_FF_IN_PLACE_SGL)) {
6094 printf("Device doesn't support in-place scatter-gather. "
6095 "Test Skipped.\n");
6096 return TEST_SKIPPED;
6097 }
6098
6099 if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
6100 (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
6101 printf("Device doesn't support RAW data-path APIs.\n");
6102 return TEST_SKIPPED;
6103 }
6104
6105 plaintext_len = ceil_byte_length(tdata->plaintext.len);
6106
6107 /* Append data which is padded to a multiple */
6108 /* of the algorithms block size */
6109 plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 8);
6110
6111 ut_params->ibuf = create_segmented_mbuf(ts_params->mbuf_pool,
6112 plaintext_pad_len, 10, 0);
6113
6114 pktmbuf_write(ut_params->ibuf, 0, plaintext_len,
6115 tdata->plaintext.data);
6116
6117 /* Create ZUC session */
6118 retval = create_wireless_algo_cipher_session(ts_params->valid_devs[0],
6119 RTE_CRYPTO_CIPHER_OP_ENCRYPT,
6120 RTE_CRYPTO_CIPHER_ZUC_EEA3,
6121 tdata->key.data, tdata->key.len,
6122 tdata->cipher_iv.len);
6123 if (retval < 0)
6124 return retval;
6125
6126 /* Clear mbuf payload */
6127
6128 pktmbuf_write(ut_params->ibuf, 0, plaintext_len, tdata->plaintext.data);
6129
6130 /* Create ZUC operation */
6131 retval = create_wireless_algo_cipher_operation(tdata->cipher_iv.data,
6132 tdata->cipher_iv.len, tdata->plaintext.len,
6133 0);
6134 if (retval < 0)
6135 return retval;
6136
6137 if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
6138 process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
6139 ut_params->op, 1, 0, 1, tdata->cipher_iv.len);
6140 else
6141 ut_params->op = process_crypto_request(ts_params->valid_devs[0],
6142 ut_params->op);
6143 TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
6144
6145 ut_params->obuf = ut_params->op->sym->m_dst;
6146 if (ut_params->obuf)
6147 ciphertext = rte_pktmbuf_read(ut_params->obuf,
6148 0, plaintext_len, ciphertext_buffer);
6149 else
6150 ciphertext = rte_pktmbuf_read(ut_params->ibuf,
6151 0, plaintext_len, ciphertext_buffer);
6152
6153 /* Validate obuf */
6154 debug_hexdump(stdout, "ciphertext:", ciphertext, plaintext_len);
6155
6156 /* Validate obuf */
6157 TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
6158 ciphertext,
6159 tdata->ciphertext.data,
6160 tdata->validCipherLenInBits.len,
6161 "ZUC Ciphertext data not as expected");
6162
6163 return 0;
6164 }
6165
6166 static int
test_zuc_authentication(const struct wireless_test_data * tdata)6167 test_zuc_authentication(const struct wireless_test_data *tdata)
6168 {
6169 struct crypto_testsuite_params *ts_params = &testsuite_params;
6170 struct crypto_unittest_params *ut_params = &unittest_params;
6171
6172 int retval;
6173 unsigned plaintext_pad_len;
6174 unsigned plaintext_len;
6175 uint8_t *plaintext;
6176
6177 struct rte_cryptodev_info dev_info;
6178
6179 rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
6180 uint64_t feat_flags = dev_info.feature_flags;
6181
6182 if (!(feat_flags & RTE_CRYPTODEV_FF_NON_BYTE_ALIGNED_DATA) &&
6183 (tdata->validAuthLenInBits.len % 8 != 0)) {
6184 printf("Device doesn't support NON-Byte Aligned Data.\n");
6185 return TEST_SKIPPED;
6186 }
6187
6188 if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
6189 (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
6190 printf("Device doesn't support RAW data-path APIs.\n");
6191 return TEST_SKIPPED;
6192 }
6193
6194 if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
6195 return TEST_SKIPPED;
6196
6197 /* Check if device supports ZUC EIA3 */
6198 if (check_auth_capability(ts_params, RTE_CRYPTO_AUTH_ZUC_EIA3,
6199 tdata->key.len, tdata->auth_iv.len,
6200 tdata->digest.len) < 0)
6201 return TEST_SKIPPED;
6202
6203 /* Create ZUC session */
6204 retval = create_wireless_algo_hash_session(ts_params->valid_devs[0],
6205 tdata->key.data, tdata->key.len,
6206 tdata->auth_iv.len, tdata->digest.len,
6207 RTE_CRYPTO_AUTH_OP_GENERATE,
6208 RTE_CRYPTO_AUTH_ZUC_EIA3);
6209 if (retval != 0)
6210 return retval;
6211
6212 /* alloc mbuf and set payload */
6213 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
6214
6215 memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
6216 rte_pktmbuf_tailroom(ut_params->ibuf));
6217
6218 plaintext_len = ceil_byte_length(tdata->plaintext.len);
6219 /* Append data which is padded to a multiple of */
6220 /* the algorithms block size */
6221 plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 8);
6222 plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
6223 plaintext_pad_len);
6224 memcpy(plaintext, tdata->plaintext.data, plaintext_len);
6225
6226 /* Create ZUC operation */
6227 retval = create_wireless_algo_hash_operation(NULL, tdata->digest.len,
6228 tdata->auth_iv.data, tdata->auth_iv.len,
6229 plaintext_pad_len, RTE_CRYPTO_AUTH_OP_GENERATE,
6230 tdata->validAuthLenInBits.len,
6231 0);
6232 if (retval < 0)
6233 return retval;
6234
6235 if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
6236 process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
6237 ut_params->op, 0, 1, 1, 0);
6238 else
6239 ut_params->op = process_crypto_request(ts_params->valid_devs[0],
6240 ut_params->op);
6241 ut_params->obuf = ut_params->op->sym->m_src;
6242 TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
6243 ut_params->digest = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *)
6244 + plaintext_pad_len;
6245
6246 /* Validate obuf */
6247 TEST_ASSERT_BUFFERS_ARE_EQUAL(
6248 ut_params->digest,
6249 tdata->digest.data,
6250 tdata->digest.len,
6251 "ZUC Generated auth tag not as expected");
6252
6253 return 0;
6254 }
6255
6256 static int
test_zuc_auth_cipher(const struct wireless_test_data * tdata,uint8_t op_mode,uint8_t verify)6257 test_zuc_auth_cipher(const struct wireless_test_data *tdata,
6258 uint8_t op_mode, uint8_t verify)
6259 {
6260 struct crypto_testsuite_params *ts_params = &testsuite_params;
6261 struct crypto_unittest_params *ut_params = &unittest_params;
6262
6263 int retval;
6264
6265 uint8_t *plaintext = NULL, *ciphertext = NULL;
6266 unsigned int plaintext_pad_len;
6267 unsigned int plaintext_len;
6268 unsigned int ciphertext_pad_len;
6269 unsigned int ciphertext_len;
6270
6271 struct rte_cryptodev_info dev_info;
6272
6273 /* Check if device supports ZUC EEA3 */
6274 if (check_cipher_capability(ts_params, RTE_CRYPTO_CIPHER_ZUC_EEA3,
6275 tdata->key.len, tdata->cipher_iv.len) < 0)
6276 return TEST_SKIPPED;
6277
6278 /* Check if device supports ZUC EIA3 */
6279 if (check_auth_capability(ts_params, RTE_CRYPTO_AUTH_ZUC_EIA3,
6280 tdata->key.len, tdata->auth_iv.len,
6281 tdata->digest.len) < 0)
6282 return TEST_SKIPPED;
6283
6284 rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
6285
6286 uint64_t feat_flags = dev_info.feature_flags;
6287
6288 if (!(feat_flags & RTE_CRYPTODEV_FF_DIGEST_ENCRYPTED)) {
6289 printf("Device doesn't support digest encrypted.\n");
6290 return TEST_SKIPPED;
6291 }
6292 if (op_mode == IN_PLACE) {
6293 if (!(feat_flags & RTE_CRYPTODEV_FF_IN_PLACE_SGL)) {
6294 printf("Device doesn't support in-place scatter-gather "
6295 "in both input and output mbufs.\n");
6296 return TEST_SKIPPED;
6297 }
6298
6299 if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
6300 (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
6301 printf("Device doesn't support RAW data-path APIs.\n");
6302 return TEST_SKIPPED;
6303 }
6304 } else {
6305 if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
6306 return TEST_SKIPPED;
6307 if (!(feat_flags & RTE_CRYPTODEV_FF_OOP_SGL_IN_SGL_OUT)) {
6308 printf("Device doesn't support out-of-place scatter-gather "
6309 "in both input and output mbufs.\n");
6310 return TEST_SKIPPED;
6311 }
6312 }
6313
6314 /* Create ZUC session */
6315 retval = create_wireless_algo_auth_cipher_session(
6316 ts_params->valid_devs[0],
6317 (verify ? RTE_CRYPTO_CIPHER_OP_DECRYPT
6318 : RTE_CRYPTO_CIPHER_OP_ENCRYPT),
6319 (verify ? RTE_CRYPTO_AUTH_OP_VERIFY
6320 : RTE_CRYPTO_AUTH_OP_GENERATE),
6321 RTE_CRYPTO_AUTH_ZUC_EIA3,
6322 RTE_CRYPTO_CIPHER_ZUC_EEA3,
6323 tdata->key.data, tdata->key.len,
6324 tdata->auth_iv.len, tdata->digest.len,
6325 tdata->cipher_iv.len);
6326
6327 if (retval != 0)
6328 return retval;
6329
6330 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
6331 if (op_mode == OUT_OF_PLACE)
6332 ut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
6333
6334 /* clear mbuf payload */
6335 memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
6336 rte_pktmbuf_tailroom(ut_params->ibuf));
6337 if (op_mode == OUT_OF_PLACE)
6338 memset(rte_pktmbuf_mtod(ut_params->obuf, uint8_t *), 0,
6339 rte_pktmbuf_tailroom(ut_params->obuf));
6340
6341 ciphertext_len = ceil_byte_length(tdata->ciphertext.len);
6342 plaintext_len = ceil_byte_length(tdata->plaintext.len);
6343 ciphertext_pad_len = RTE_ALIGN_CEIL(ciphertext_len, 16);
6344 plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16);
6345
6346 if (verify) {
6347 ciphertext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
6348 ciphertext_pad_len);
6349 memcpy(ciphertext, tdata->ciphertext.data, ciphertext_len);
6350 debug_hexdump(stdout, "ciphertext:", ciphertext,
6351 ciphertext_len);
6352 } else {
6353 /* make sure enough space to cover partial digest verify case */
6354 plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
6355 ciphertext_pad_len);
6356 memcpy(plaintext, tdata->plaintext.data, plaintext_len);
6357 debug_hexdump(stdout, "plaintext:", plaintext,
6358 plaintext_len);
6359 }
6360
6361 if (op_mode == OUT_OF_PLACE)
6362 rte_pktmbuf_append(ut_params->obuf, ciphertext_pad_len);
6363
6364 /* Create ZUC operation */
6365 retval = create_wireless_algo_auth_cipher_operation(
6366 tdata->digest.data, tdata->digest.len,
6367 tdata->cipher_iv.data, tdata->cipher_iv.len,
6368 tdata->auth_iv.data, tdata->auth_iv.len,
6369 (tdata->digest.offset_bytes == 0 ?
6370 (verify ? ciphertext_pad_len : plaintext_pad_len)
6371 : tdata->digest.offset_bytes),
6372 tdata->validCipherLenInBits.len,
6373 tdata->validCipherOffsetInBits.len,
6374 tdata->validAuthLenInBits.len,
6375 0,
6376 op_mode, 0, verify);
6377
6378 if (retval < 0)
6379 return retval;
6380
6381 if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
6382 process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
6383 ut_params->op, 1, 1, 1, tdata->cipher_iv.len);
6384 else
6385 ut_params->op = process_crypto_request(ts_params->valid_devs[0],
6386 ut_params->op);
6387
6388 TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
6389
6390 ut_params->obuf = (op_mode == IN_PLACE ?
6391 ut_params->op->sym->m_src : ut_params->op->sym->m_dst);
6392
6393
6394 if (verify) {
6395 if (ut_params->obuf)
6396 plaintext = rte_pktmbuf_mtod(ut_params->obuf,
6397 uint8_t *);
6398 else
6399 plaintext = ciphertext;
6400
6401 debug_hexdump(stdout, "plaintext:", plaintext,
6402 (tdata->plaintext.len >> 3) - tdata->digest.len);
6403 debug_hexdump(stdout, "plaintext expected:",
6404 tdata->plaintext.data,
6405 (tdata->plaintext.len >> 3) - tdata->digest.len);
6406 } else {
6407 if (ut_params->obuf)
6408 ciphertext = rte_pktmbuf_mtod(ut_params->obuf,
6409 uint8_t *);
6410 else
6411 ciphertext = plaintext;
6412
6413 debug_hexdump(stdout, "ciphertext:", ciphertext,
6414 ciphertext_len);
6415 debug_hexdump(stdout, "ciphertext expected:",
6416 tdata->ciphertext.data, tdata->ciphertext.len >> 3);
6417
6418 ut_params->digest = rte_pktmbuf_mtod(
6419 ut_params->obuf, uint8_t *) +
6420 (tdata->digest.offset_bytes == 0 ?
6421 plaintext_pad_len : tdata->digest.offset_bytes);
6422
6423 debug_hexdump(stdout, "digest:", ut_params->digest,
6424 tdata->digest.len);
6425 debug_hexdump(stdout, "digest expected:",
6426 tdata->digest.data, tdata->digest.len);
6427 }
6428
6429 /* Validate obuf */
6430 if (verify) {
6431 TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
6432 plaintext,
6433 tdata->plaintext.data,
6434 tdata->plaintext.len >> 3,
6435 "ZUC Plaintext data not as expected");
6436 } else {
6437 TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
6438 ciphertext,
6439 tdata->ciphertext.data,
6440 tdata->ciphertext.len >> 3,
6441 "ZUC Ciphertext data not as expected");
6442
6443 TEST_ASSERT_BUFFERS_ARE_EQUAL(
6444 ut_params->digest,
6445 tdata->digest.data,
6446 DIGEST_BYTE_LENGTH_KASUMI_F9,
6447 "ZUC Generated auth tag not as expected");
6448 }
6449 return 0;
6450 }
6451
6452 static int
test_zuc_auth_cipher_sgl(const struct wireless_test_data * tdata,uint8_t op_mode,uint8_t verify)6453 test_zuc_auth_cipher_sgl(const struct wireless_test_data *tdata,
6454 uint8_t op_mode, uint8_t verify)
6455 {
6456 struct crypto_testsuite_params *ts_params = &testsuite_params;
6457 struct crypto_unittest_params *ut_params = &unittest_params;
6458
6459 int retval;
6460
6461 const uint8_t *plaintext = NULL;
6462 const uint8_t *ciphertext = NULL;
6463 const uint8_t *digest = NULL;
6464 unsigned int plaintext_pad_len;
6465 unsigned int plaintext_len;
6466 unsigned int ciphertext_pad_len;
6467 unsigned int ciphertext_len;
6468 uint8_t buffer[10000];
6469 uint8_t digest_buffer[10000];
6470
6471 struct rte_cryptodev_info dev_info;
6472
6473 /* Check if device supports ZUC EEA3 */
6474 if (check_cipher_capability(ts_params, RTE_CRYPTO_CIPHER_ZUC_EEA3,
6475 tdata->key.len, tdata->cipher_iv.len) < 0)
6476 return TEST_SKIPPED;
6477
6478 /* Check if device supports ZUC EIA3 */
6479 if (check_auth_capability(ts_params, RTE_CRYPTO_AUTH_ZUC_EIA3,
6480 tdata->key.len, tdata->auth_iv.len,
6481 tdata->digest.len) < 0)
6482 return TEST_SKIPPED;
6483
6484 rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
6485
6486 uint64_t feat_flags = dev_info.feature_flags;
6487
6488 if (op_mode == IN_PLACE) {
6489 if (!(feat_flags & RTE_CRYPTODEV_FF_IN_PLACE_SGL)) {
6490 printf("Device doesn't support in-place scatter-gather "
6491 "in both input and output mbufs.\n");
6492 return TEST_SKIPPED;
6493 }
6494
6495 if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
6496 (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
6497 printf("Device doesn't support RAW data-path APIs.\n");
6498 return TEST_SKIPPED;
6499 }
6500 } else {
6501 if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
6502 return TEST_SKIPPED;
6503 if (!(feat_flags & RTE_CRYPTODEV_FF_OOP_SGL_IN_SGL_OUT)) {
6504 printf("Device doesn't support out-of-place scatter-gather "
6505 "in both input and output mbufs.\n");
6506 return TEST_SKIPPED;
6507 }
6508 if (!(feat_flags & RTE_CRYPTODEV_FF_DIGEST_ENCRYPTED)) {
6509 printf("Device doesn't support digest encrypted.\n");
6510 return TEST_SKIPPED;
6511 }
6512 }
6513
6514 /* Create ZUC session */
6515 retval = create_wireless_algo_auth_cipher_session(
6516 ts_params->valid_devs[0],
6517 (verify ? RTE_CRYPTO_CIPHER_OP_DECRYPT
6518 : RTE_CRYPTO_CIPHER_OP_ENCRYPT),
6519 (verify ? RTE_CRYPTO_AUTH_OP_VERIFY
6520 : RTE_CRYPTO_AUTH_OP_GENERATE),
6521 RTE_CRYPTO_AUTH_ZUC_EIA3,
6522 RTE_CRYPTO_CIPHER_ZUC_EEA3,
6523 tdata->key.data, tdata->key.len,
6524 tdata->auth_iv.len, tdata->digest.len,
6525 tdata->cipher_iv.len);
6526
6527 if (retval != 0)
6528 return retval;
6529
6530 ciphertext_len = ceil_byte_length(tdata->ciphertext.len);
6531 plaintext_len = ceil_byte_length(tdata->plaintext.len);
6532 ciphertext_pad_len = RTE_ALIGN_CEIL(ciphertext_len, 16);
6533 plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16);
6534
6535 ut_params->ibuf = create_segmented_mbuf(ts_params->mbuf_pool,
6536 plaintext_pad_len, 15, 0);
6537 TEST_ASSERT_NOT_NULL(ut_params->ibuf,
6538 "Failed to allocate input buffer in mempool");
6539
6540 if (op_mode == OUT_OF_PLACE) {
6541 ut_params->obuf = create_segmented_mbuf(ts_params->mbuf_pool,
6542 plaintext_pad_len, 15, 0);
6543 TEST_ASSERT_NOT_NULL(ut_params->obuf,
6544 "Failed to allocate output buffer in mempool");
6545 }
6546
6547 if (verify) {
6548 pktmbuf_write(ut_params->ibuf, 0, ciphertext_len,
6549 tdata->ciphertext.data);
6550 ciphertext = rte_pktmbuf_read(ut_params->ibuf, 0,
6551 ciphertext_len, buffer);
6552 debug_hexdump(stdout, "ciphertext:", ciphertext,
6553 ciphertext_len);
6554 } else {
6555 pktmbuf_write(ut_params->ibuf, 0, plaintext_len,
6556 tdata->plaintext.data);
6557 plaintext = rte_pktmbuf_read(ut_params->ibuf, 0,
6558 plaintext_len, buffer);
6559 debug_hexdump(stdout, "plaintext:", plaintext,
6560 plaintext_len);
6561 }
6562 memset(buffer, 0, sizeof(buffer));
6563
6564 /* Create ZUC operation */
6565 retval = create_wireless_algo_auth_cipher_operation(
6566 tdata->digest.data, tdata->digest.len,
6567 tdata->cipher_iv.data, tdata->cipher_iv.len,
6568 NULL, 0,
6569 (tdata->digest.offset_bytes == 0 ?
6570 (verify ? ciphertext_pad_len : plaintext_pad_len)
6571 : tdata->digest.offset_bytes),
6572 tdata->validCipherLenInBits.len,
6573 tdata->validCipherOffsetInBits.len,
6574 tdata->validAuthLenInBits.len,
6575 0,
6576 op_mode, 1, verify);
6577
6578 if (retval < 0)
6579 return retval;
6580
6581 if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
6582 process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
6583 ut_params->op, 1, 1, 1, tdata->cipher_iv.len);
6584 else
6585 ut_params->op = process_crypto_request(ts_params->valid_devs[0],
6586 ut_params->op);
6587
6588 TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
6589
6590 ut_params->obuf = (op_mode == IN_PLACE ?
6591 ut_params->op->sym->m_src : ut_params->op->sym->m_dst);
6592
6593 if (verify) {
6594 if (ut_params->obuf)
6595 plaintext = rte_pktmbuf_read(ut_params->obuf, 0,
6596 plaintext_len, buffer);
6597 else
6598 plaintext = rte_pktmbuf_read(ut_params->ibuf, 0,
6599 plaintext_len, buffer);
6600
6601 debug_hexdump(stdout, "plaintext:", plaintext,
6602 (tdata->plaintext.len >> 3) - tdata->digest.len);
6603 debug_hexdump(stdout, "plaintext expected:",
6604 tdata->plaintext.data,
6605 (tdata->plaintext.len >> 3) - tdata->digest.len);
6606 } else {
6607 if (ut_params->obuf)
6608 ciphertext = rte_pktmbuf_read(ut_params->obuf, 0,
6609 ciphertext_len, buffer);
6610 else
6611 ciphertext = rte_pktmbuf_read(ut_params->ibuf, 0,
6612 ciphertext_len, buffer);
6613
6614 debug_hexdump(stdout, "ciphertext:", ciphertext,
6615 ciphertext_len);
6616 debug_hexdump(stdout, "ciphertext expected:",
6617 tdata->ciphertext.data, tdata->ciphertext.len >> 3);
6618
6619 if (ut_params->obuf)
6620 digest = rte_pktmbuf_read(ut_params->obuf,
6621 (tdata->digest.offset_bytes == 0 ?
6622 plaintext_pad_len : tdata->digest.offset_bytes),
6623 tdata->digest.len, digest_buffer);
6624 else
6625 digest = rte_pktmbuf_read(ut_params->ibuf,
6626 (tdata->digest.offset_bytes == 0 ?
6627 plaintext_pad_len : tdata->digest.offset_bytes),
6628 tdata->digest.len, digest_buffer);
6629
6630 debug_hexdump(stdout, "digest:", digest,
6631 tdata->digest.len);
6632 debug_hexdump(stdout, "digest expected:",
6633 tdata->digest.data, tdata->digest.len);
6634 }
6635
6636 /* Validate obuf */
6637 if (verify) {
6638 TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
6639 plaintext,
6640 tdata->plaintext.data,
6641 tdata->plaintext.len >> 3,
6642 "ZUC Plaintext data not as expected");
6643 } else {
6644 TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
6645 ciphertext,
6646 tdata->ciphertext.data,
6647 tdata->validDataLenInBits.len,
6648 "ZUC Ciphertext data not as expected");
6649
6650 TEST_ASSERT_BUFFERS_ARE_EQUAL(
6651 digest,
6652 tdata->digest.data,
6653 DIGEST_BYTE_LENGTH_KASUMI_F9,
6654 "ZUC Generated auth tag not as expected");
6655 }
6656 return 0;
6657 }
6658
6659 static int
test_kasumi_encryption_test_case_1(void)6660 test_kasumi_encryption_test_case_1(void)
6661 {
6662 return test_kasumi_encryption(&kasumi_test_case_1);
6663 }
6664
6665 static int
test_kasumi_encryption_test_case_1_sgl(void)6666 test_kasumi_encryption_test_case_1_sgl(void)
6667 {
6668 return test_kasumi_encryption_sgl(&kasumi_test_case_1);
6669 }
6670
6671 static int
test_kasumi_encryption_test_case_1_oop(void)6672 test_kasumi_encryption_test_case_1_oop(void)
6673 {
6674 return test_kasumi_encryption_oop(&kasumi_test_case_1);
6675 }
6676
6677 static int
test_kasumi_encryption_test_case_1_oop_sgl(void)6678 test_kasumi_encryption_test_case_1_oop_sgl(void)
6679 {
6680 return test_kasumi_encryption_oop_sgl(&kasumi_test_case_1);
6681 }
6682
6683 static int
test_kasumi_encryption_test_case_2(void)6684 test_kasumi_encryption_test_case_2(void)
6685 {
6686 return test_kasumi_encryption(&kasumi_test_case_2);
6687 }
6688
6689 static int
test_kasumi_encryption_test_case_3(void)6690 test_kasumi_encryption_test_case_3(void)
6691 {
6692 return test_kasumi_encryption(&kasumi_test_case_3);
6693 }
6694
6695 static int
test_kasumi_encryption_test_case_4(void)6696 test_kasumi_encryption_test_case_4(void)
6697 {
6698 return test_kasumi_encryption(&kasumi_test_case_4);
6699 }
6700
6701 static int
test_kasumi_encryption_test_case_5(void)6702 test_kasumi_encryption_test_case_5(void)
6703 {
6704 return test_kasumi_encryption(&kasumi_test_case_5);
6705 }
6706
6707 static int
test_kasumi_decryption_test_case_1(void)6708 test_kasumi_decryption_test_case_1(void)
6709 {
6710 return test_kasumi_decryption(&kasumi_test_case_1);
6711 }
6712
6713 static int
test_kasumi_decryption_test_case_1_oop(void)6714 test_kasumi_decryption_test_case_1_oop(void)
6715 {
6716 return test_kasumi_decryption_oop(&kasumi_test_case_1);
6717 }
6718
6719 static int
test_kasumi_decryption_test_case_2(void)6720 test_kasumi_decryption_test_case_2(void)
6721 {
6722 return test_kasumi_decryption(&kasumi_test_case_2);
6723 }
6724
6725 static int
test_kasumi_decryption_test_case_3(void)6726 test_kasumi_decryption_test_case_3(void)
6727 {
6728 /* rte_crypto_mbuf_to_vec does not support incomplete mbuf build */
6729 if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
6730 return TEST_SKIPPED;
6731 return test_kasumi_decryption(&kasumi_test_case_3);
6732 }
6733
6734 static int
test_kasumi_decryption_test_case_4(void)6735 test_kasumi_decryption_test_case_4(void)
6736 {
6737 return test_kasumi_decryption(&kasumi_test_case_4);
6738 }
6739
6740 static int
test_kasumi_decryption_test_case_5(void)6741 test_kasumi_decryption_test_case_5(void)
6742 {
6743 return test_kasumi_decryption(&kasumi_test_case_5);
6744 }
6745 static int
test_snow3g_encryption_test_case_1(void)6746 test_snow3g_encryption_test_case_1(void)
6747 {
6748 return test_snow3g_encryption(&snow3g_test_case_1);
6749 }
6750
6751 static int
test_snow3g_encryption_test_case_1_oop(void)6752 test_snow3g_encryption_test_case_1_oop(void)
6753 {
6754 return test_snow3g_encryption_oop(&snow3g_test_case_1);
6755 }
6756
6757 static int
test_snow3g_encryption_test_case_1_oop_sgl(void)6758 test_snow3g_encryption_test_case_1_oop_sgl(void)
6759 {
6760 return test_snow3g_encryption_oop_sgl(&snow3g_test_case_1);
6761 }
6762
6763
6764 static int
test_snow3g_encryption_test_case_1_offset_oop(void)6765 test_snow3g_encryption_test_case_1_offset_oop(void)
6766 {
6767 return test_snow3g_encryption_offset_oop(&snow3g_test_case_1);
6768 }
6769
6770 static int
test_snow3g_encryption_test_case_2(void)6771 test_snow3g_encryption_test_case_2(void)
6772 {
6773 return test_snow3g_encryption(&snow3g_test_case_2);
6774 }
6775
6776 static int
test_snow3g_encryption_test_case_3(void)6777 test_snow3g_encryption_test_case_3(void)
6778 {
6779 return test_snow3g_encryption(&snow3g_test_case_3);
6780 }
6781
6782 static int
test_snow3g_encryption_test_case_4(void)6783 test_snow3g_encryption_test_case_4(void)
6784 {
6785 return test_snow3g_encryption(&snow3g_test_case_4);
6786 }
6787
6788 static int
test_snow3g_encryption_test_case_5(void)6789 test_snow3g_encryption_test_case_5(void)
6790 {
6791 return test_snow3g_encryption(&snow3g_test_case_5);
6792 }
6793
6794 static int
test_snow3g_decryption_test_case_1(void)6795 test_snow3g_decryption_test_case_1(void)
6796 {
6797 return test_snow3g_decryption(&snow3g_test_case_1);
6798 }
6799
6800 static int
test_snow3g_decryption_test_case_1_oop(void)6801 test_snow3g_decryption_test_case_1_oop(void)
6802 {
6803 return test_snow3g_decryption_oop(&snow3g_test_case_1);
6804 }
6805
6806 static int
test_snow3g_decryption_test_case_2(void)6807 test_snow3g_decryption_test_case_2(void)
6808 {
6809 return test_snow3g_decryption(&snow3g_test_case_2);
6810 }
6811
6812 static int
test_snow3g_decryption_test_case_3(void)6813 test_snow3g_decryption_test_case_3(void)
6814 {
6815 return test_snow3g_decryption(&snow3g_test_case_3);
6816 }
6817
6818 static int
test_snow3g_decryption_test_case_4(void)6819 test_snow3g_decryption_test_case_4(void)
6820 {
6821 return test_snow3g_decryption(&snow3g_test_case_4);
6822 }
6823
6824 static int
test_snow3g_decryption_test_case_5(void)6825 test_snow3g_decryption_test_case_5(void)
6826 {
6827 return test_snow3g_decryption(&snow3g_test_case_5);
6828 }
6829
6830 /*
6831 * Function prepares snow3g_hash_test_data from snow3g_test_data.
6832 * Pattern digest from snow3g_test_data must be allocated as
6833 * 4 last bytes in plaintext.
6834 */
6835 static void
snow3g_hash_test_vector_setup(const struct snow3g_test_data * pattern,struct snow3g_hash_test_data * output)6836 snow3g_hash_test_vector_setup(const struct snow3g_test_data *pattern,
6837 struct snow3g_hash_test_data *output)
6838 {
6839 if ((pattern != NULL) && (output != NULL)) {
6840 output->key.len = pattern->key.len;
6841
6842 memcpy(output->key.data,
6843 pattern->key.data, pattern->key.len);
6844
6845 output->auth_iv.len = pattern->auth_iv.len;
6846
6847 memcpy(output->auth_iv.data,
6848 pattern->auth_iv.data, pattern->auth_iv.len);
6849
6850 output->plaintext.len = pattern->plaintext.len;
6851
6852 memcpy(output->plaintext.data,
6853 pattern->plaintext.data, pattern->plaintext.len >> 3);
6854
6855 output->digest.len = pattern->digest.len;
6856
6857 memcpy(output->digest.data,
6858 &pattern->plaintext.data[pattern->digest.offset_bytes],
6859 pattern->digest.len);
6860
6861 output->validAuthLenInBits.len =
6862 pattern->validAuthLenInBits.len;
6863 }
6864 }
6865
6866 /*
6867 * Test case verify computed cipher and digest from snow3g_test_case_7 data.
6868 */
6869 static int
test_snow3g_decryption_with_digest_test_case_1(void)6870 test_snow3g_decryption_with_digest_test_case_1(void)
6871 {
6872 struct snow3g_hash_test_data snow3g_hash_data;
6873 struct rte_cryptodev_info dev_info;
6874 struct crypto_testsuite_params *ts_params = &testsuite_params;
6875
6876 rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
6877 uint64_t feat_flags = dev_info.feature_flags;
6878
6879 if (!(feat_flags & RTE_CRYPTODEV_FF_DIGEST_ENCRYPTED)) {
6880 printf("Device doesn't support encrypted digest operations.\n");
6881 return TEST_SKIPPED;
6882 }
6883
6884 /*
6885 * Function prepare data for hash verification test case.
6886 * Digest is allocated in 4 last bytes in plaintext, pattern.
6887 */
6888 snow3g_hash_test_vector_setup(&snow3g_test_case_7, &snow3g_hash_data);
6889
6890 return test_snow3g_decryption(&snow3g_test_case_7) &
6891 test_snow3g_authentication_verify(&snow3g_hash_data);
6892 }
6893
6894 static int
test_snow3g_cipher_auth_test_case_1(void)6895 test_snow3g_cipher_auth_test_case_1(void)
6896 {
6897 return test_snow3g_cipher_auth(&snow3g_test_case_3);
6898 }
6899
6900 static int
test_snow3g_auth_cipher_test_case_1(void)6901 test_snow3g_auth_cipher_test_case_1(void)
6902 {
6903 return test_snow3g_auth_cipher(
6904 &snow3g_auth_cipher_test_case_1, IN_PLACE, 0);
6905 }
6906
6907 static int
test_snow3g_auth_cipher_test_case_2(void)6908 test_snow3g_auth_cipher_test_case_2(void)
6909 {
6910 return test_snow3g_auth_cipher(
6911 &snow3g_auth_cipher_test_case_2, IN_PLACE, 0);
6912 }
6913
6914 static int
test_snow3g_auth_cipher_test_case_2_oop(void)6915 test_snow3g_auth_cipher_test_case_2_oop(void)
6916 {
6917 return test_snow3g_auth_cipher(
6918 &snow3g_auth_cipher_test_case_2, OUT_OF_PLACE, 0);
6919 }
6920
6921 static int
test_snow3g_auth_cipher_part_digest_enc(void)6922 test_snow3g_auth_cipher_part_digest_enc(void)
6923 {
6924 return test_snow3g_auth_cipher(
6925 &snow3g_auth_cipher_partial_digest_encryption,
6926 IN_PLACE, 0);
6927 }
6928
6929 static int
test_snow3g_auth_cipher_part_digest_enc_oop(void)6930 test_snow3g_auth_cipher_part_digest_enc_oop(void)
6931 {
6932 return test_snow3g_auth_cipher(
6933 &snow3g_auth_cipher_partial_digest_encryption,
6934 OUT_OF_PLACE, 0);
6935 }
6936
6937 static int
test_snow3g_auth_cipher_test_case_3_sgl(void)6938 test_snow3g_auth_cipher_test_case_3_sgl(void)
6939 {
6940 /* rte_crypto_mbuf_to_vec does not support incomplete mbuf build */
6941 if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
6942 return TEST_SKIPPED;
6943 return test_snow3g_auth_cipher_sgl(
6944 &snow3g_auth_cipher_test_case_3, IN_PLACE, 0);
6945 }
6946
6947 static int
test_snow3g_auth_cipher_test_case_3_oop_sgl(void)6948 test_snow3g_auth_cipher_test_case_3_oop_sgl(void)
6949 {
6950 return test_snow3g_auth_cipher_sgl(
6951 &snow3g_auth_cipher_test_case_3, OUT_OF_PLACE, 0);
6952 }
6953
6954 static int
test_snow3g_auth_cipher_part_digest_enc_sgl(void)6955 test_snow3g_auth_cipher_part_digest_enc_sgl(void)
6956 {
6957 /* rte_crypto_mbuf_to_vec does not support incomplete mbuf build */
6958 if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
6959 return TEST_SKIPPED;
6960 return test_snow3g_auth_cipher_sgl(
6961 &snow3g_auth_cipher_partial_digest_encryption,
6962 IN_PLACE, 0);
6963 }
6964
6965 static int
test_snow3g_auth_cipher_part_digest_enc_oop_sgl(void)6966 test_snow3g_auth_cipher_part_digest_enc_oop_sgl(void)
6967 {
6968 return test_snow3g_auth_cipher_sgl(
6969 &snow3g_auth_cipher_partial_digest_encryption,
6970 OUT_OF_PLACE, 0);
6971 }
6972
6973 static int
test_snow3g_auth_cipher_verify_test_case_1(void)6974 test_snow3g_auth_cipher_verify_test_case_1(void)
6975 {
6976 return test_snow3g_auth_cipher(
6977 &snow3g_auth_cipher_test_case_1, IN_PLACE, 1);
6978 }
6979
6980 static int
test_snow3g_auth_cipher_verify_test_case_2(void)6981 test_snow3g_auth_cipher_verify_test_case_2(void)
6982 {
6983 return test_snow3g_auth_cipher(
6984 &snow3g_auth_cipher_test_case_2, IN_PLACE, 1);
6985 }
6986
6987 static int
test_snow3g_auth_cipher_verify_test_case_2_oop(void)6988 test_snow3g_auth_cipher_verify_test_case_2_oop(void)
6989 {
6990 return test_snow3g_auth_cipher(
6991 &snow3g_auth_cipher_test_case_2, OUT_OF_PLACE, 1);
6992 }
6993
6994 static int
test_snow3g_auth_cipher_verify_part_digest_enc(void)6995 test_snow3g_auth_cipher_verify_part_digest_enc(void)
6996 {
6997 return test_snow3g_auth_cipher(
6998 &snow3g_auth_cipher_partial_digest_encryption,
6999 IN_PLACE, 1);
7000 }
7001
7002 static int
test_snow3g_auth_cipher_verify_part_digest_enc_oop(void)7003 test_snow3g_auth_cipher_verify_part_digest_enc_oop(void)
7004 {
7005 return test_snow3g_auth_cipher(
7006 &snow3g_auth_cipher_partial_digest_encryption,
7007 OUT_OF_PLACE, 1);
7008 }
7009
7010 static int
test_snow3g_auth_cipher_verify_test_case_3_sgl(void)7011 test_snow3g_auth_cipher_verify_test_case_3_sgl(void)
7012 {
7013 return test_snow3g_auth_cipher_sgl(
7014 &snow3g_auth_cipher_test_case_3, IN_PLACE, 1);
7015 }
7016
7017 static int
test_snow3g_auth_cipher_verify_test_case_3_oop_sgl(void)7018 test_snow3g_auth_cipher_verify_test_case_3_oop_sgl(void)
7019 {
7020 return test_snow3g_auth_cipher_sgl(
7021 &snow3g_auth_cipher_test_case_3, OUT_OF_PLACE, 1);
7022 }
7023
7024 static int
test_snow3g_auth_cipher_verify_part_digest_enc_sgl(void)7025 test_snow3g_auth_cipher_verify_part_digest_enc_sgl(void)
7026 {
7027 return test_snow3g_auth_cipher_sgl(
7028 &snow3g_auth_cipher_partial_digest_encryption,
7029 IN_PLACE, 1);
7030 }
7031
7032 static int
test_snow3g_auth_cipher_verify_part_digest_enc_oop_sgl(void)7033 test_snow3g_auth_cipher_verify_part_digest_enc_oop_sgl(void)
7034 {
7035 return test_snow3g_auth_cipher_sgl(
7036 &snow3g_auth_cipher_partial_digest_encryption,
7037 OUT_OF_PLACE, 1);
7038 }
7039
7040 static int
test_snow3g_auth_cipher_with_digest_test_case_1(void)7041 test_snow3g_auth_cipher_with_digest_test_case_1(void)
7042 {
7043 return test_snow3g_auth_cipher(
7044 &snow3g_test_case_7, IN_PLACE, 0);
7045 }
7046
7047 static int
test_kasumi_auth_cipher_test_case_1(void)7048 test_kasumi_auth_cipher_test_case_1(void)
7049 {
7050 return test_kasumi_auth_cipher(
7051 &kasumi_test_case_3, IN_PLACE, 0);
7052 }
7053
7054 static int
test_kasumi_auth_cipher_test_case_2(void)7055 test_kasumi_auth_cipher_test_case_2(void)
7056 {
7057 return test_kasumi_auth_cipher(
7058 &kasumi_auth_cipher_test_case_2, IN_PLACE, 0);
7059 }
7060
7061 static int
test_kasumi_auth_cipher_test_case_2_oop(void)7062 test_kasumi_auth_cipher_test_case_2_oop(void)
7063 {
7064 return test_kasumi_auth_cipher(
7065 &kasumi_auth_cipher_test_case_2, OUT_OF_PLACE, 0);
7066 }
7067
7068 static int
test_kasumi_auth_cipher_test_case_2_sgl(void)7069 test_kasumi_auth_cipher_test_case_2_sgl(void)
7070 {
7071 return test_kasumi_auth_cipher_sgl(
7072 &kasumi_auth_cipher_test_case_2, IN_PLACE, 0);
7073 }
7074
7075 static int
test_kasumi_auth_cipher_test_case_2_oop_sgl(void)7076 test_kasumi_auth_cipher_test_case_2_oop_sgl(void)
7077 {
7078 return test_kasumi_auth_cipher_sgl(
7079 &kasumi_auth_cipher_test_case_2, OUT_OF_PLACE, 0);
7080 }
7081
7082 static int
test_kasumi_auth_cipher_verify_test_case_1(void)7083 test_kasumi_auth_cipher_verify_test_case_1(void)
7084 {
7085 return test_kasumi_auth_cipher(
7086 &kasumi_test_case_3, IN_PLACE, 1);
7087 }
7088
7089 static int
test_kasumi_auth_cipher_verify_test_case_2(void)7090 test_kasumi_auth_cipher_verify_test_case_2(void)
7091 {
7092 return test_kasumi_auth_cipher(
7093 &kasumi_auth_cipher_test_case_2, IN_PLACE, 1);
7094 }
7095
7096 static int
test_kasumi_auth_cipher_verify_test_case_2_oop(void)7097 test_kasumi_auth_cipher_verify_test_case_2_oop(void)
7098 {
7099 return test_kasumi_auth_cipher(
7100 &kasumi_auth_cipher_test_case_2, OUT_OF_PLACE, 1);
7101 }
7102
7103 static int
test_kasumi_auth_cipher_verify_test_case_2_sgl(void)7104 test_kasumi_auth_cipher_verify_test_case_2_sgl(void)
7105 {
7106 return test_kasumi_auth_cipher_sgl(
7107 &kasumi_auth_cipher_test_case_2, IN_PLACE, 1);
7108 }
7109
7110 static int
test_kasumi_auth_cipher_verify_test_case_2_oop_sgl(void)7111 test_kasumi_auth_cipher_verify_test_case_2_oop_sgl(void)
7112 {
7113 return test_kasumi_auth_cipher_sgl(
7114 &kasumi_auth_cipher_test_case_2, OUT_OF_PLACE, 1);
7115 }
7116
7117 static int
test_kasumi_cipher_auth_test_case_1(void)7118 test_kasumi_cipher_auth_test_case_1(void)
7119 {
7120 return test_kasumi_cipher_auth(&kasumi_test_case_6);
7121 }
7122
7123 static int
test_zuc_encryption_test_case_1(void)7124 test_zuc_encryption_test_case_1(void)
7125 {
7126 return test_zuc_encryption(&zuc_test_case_cipher_193b);
7127 }
7128
7129 static int
test_zuc_encryption_test_case_2(void)7130 test_zuc_encryption_test_case_2(void)
7131 {
7132 return test_zuc_encryption(&zuc_test_case_cipher_800b);
7133 }
7134
7135 static int
test_zuc_encryption_test_case_3(void)7136 test_zuc_encryption_test_case_3(void)
7137 {
7138 return test_zuc_encryption(&zuc_test_case_cipher_1570b);
7139 }
7140
7141 static int
test_zuc_encryption_test_case_4(void)7142 test_zuc_encryption_test_case_4(void)
7143 {
7144 return test_zuc_encryption(&zuc_test_case_cipher_2798b);
7145 }
7146
7147 static int
test_zuc_encryption_test_case_5(void)7148 test_zuc_encryption_test_case_5(void)
7149 {
7150 return test_zuc_encryption(&zuc_test_case_cipher_4019b);
7151 }
7152
7153 static int
test_zuc_encryption_test_case_6_sgl(void)7154 test_zuc_encryption_test_case_6_sgl(void)
7155 {
7156 return test_zuc_encryption_sgl(&zuc_test_case_cipher_193b);
7157 }
7158
7159 static int
test_zuc_hash_generate_test_case_1(void)7160 test_zuc_hash_generate_test_case_1(void)
7161 {
7162 return test_zuc_authentication(&zuc_test_case_auth_1b);
7163 }
7164
7165 static int
test_zuc_hash_generate_test_case_2(void)7166 test_zuc_hash_generate_test_case_2(void)
7167 {
7168 return test_zuc_authentication(&zuc_test_case_auth_90b);
7169 }
7170
7171 static int
test_zuc_hash_generate_test_case_3(void)7172 test_zuc_hash_generate_test_case_3(void)
7173 {
7174 return test_zuc_authentication(&zuc_test_case_auth_577b);
7175 }
7176
7177 static int
test_zuc_hash_generate_test_case_4(void)7178 test_zuc_hash_generate_test_case_4(void)
7179 {
7180 return test_zuc_authentication(&zuc_test_case_auth_2079b);
7181 }
7182
7183 static int
test_zuc_hash_generate_test_case_5(void)7184 test_zuc_hash_generate_test_case_5(void)
7185 {
7186 return test_zuc_authentication(&zuc_test_auth_5670b);
7187 }
7188
7189 static int
test_zuc_hash_generate_test_case_6(void)7190 test_zuc_hash_generate_test_case_6(void)
7191 {
7192 return test_zuc_authentication(&zuc_test_case_auth_128b);
7193 }
7194
7195 static int
test_zuc_hash_generate_test_case_7(void)7196 test_zuc_hash_generate_test_case_7(void)
7197 {
7198 return test_zuc_authentication(&zuc_test_case_auth_2080b);
7199 }
7200
7201 static int
test_zuc_hash_generate_test_case_8(void)7202 test_zuc_hash_generate_test_case_8(void)
7203 {
7204 return test_zuc_authentication(&zuc_test_case_auth_584b);
7205 }
7206
7207 static int
test_zuc_hash_generate_test_case_9(void)7208 test_zuc_hash_generate_test_case_9(void)
7209 {
7210 return test_zuc_authentication(&zuc_test_case_auth_4000b_mac_32b);
7211 }
7212
7213 static int
test_zuc_hash_generate_test_case_10(void)7214 test_zuc_hash_generate_test_case_10(void)
7215 {
7216 return test_zuc_authentication(&zuc_test_case_auth_4000b_mac_64b);
7217 }
7218
7219 static int
test_zuc_hash_generate_test_case_11(void)7220 test_zuc_hash_generate_test_case_11(void)
7221 {
7222 return test_zuc_authentication(&zuc_test_case_auth_4000b_mac_128b);
7223 }
7224
7225 static int
test_zuc_cipher_auth_test_case_1(void)7226 test_zuc_cipher_auth_test_case_1(void)
7227 {
7228 return test_zuc_cipher_auth(&zuc_test_case_cipher_200b_auth_200b);
7229 }
7230
7231 static int
test_zuc_cipher_auth_test_case_2(void)7232 test_zuc_cipher_auth_test_case_2(void)
7233 {
7234 return test_zuc_cipher_auth(&zuc_test_case_cipher_800b_auth_120b);
7235 }
7236
7237 static int
test_zuc_auth_cipher_test_case_1(void)7238 test_zuc_auth_cipher_test_case_1(void)
7239 {
7240 return test_zuc_auth_cipher(
7241 &zuc_auth_cipher_test_case_1, IN_PLACE, 0);
7242 }
7243
7244 static int
test_zuc_auth_cipher_test_case_1_oop(void)7245 test_zuc_auth_cipher_test_case_1_oop(void)
7246 {
7247 return test_zuc_auth_cipher(
7248 &zuc_auth_cipher_test_case_1, OUT_OF_PLACE, 0);
7249 }
7250
7251 static int
test_zuc_auth_cipher_test_case_1_sgl(void)7252 test_zuc_auth_cipher_test_case_1_sgl(void)
7253 {
7254 return test_zuc_auth_cipher_sgl(
7255 &zuc_auth_cipher_test_case_1, IN_PLACE, 0);
7256 }
7257
7258 static int
test_zuc_auth_cipher_test_case_1_oop_sgl(void)7259 test_zuc_auth_cipher_test_case_1_oop_sgl(void)
7260 {
7261 return test_zuc_auth_cipher_sgl(
7262 &zuc_auth_cipher_test_case_1, OUT_OF_PLACE, 0);
7263 }
7264
7265 static int
test_zuc_auth_cipher_verify_test_case_1(void)7266 test_zuc_auth_cipher_verify_test_case_1(void)
7267 {
7268 return test_zuc_auth_cipher(
7269 &zuc_auth_cipher_test_case_1, IN_PLACE, 1);
7270 }
7271
7272 static int
test_zuc_auth_cipher_verify_test_case_1_oop(void)7273 test_zuc_auth_cipher_verify_test_case_1_oop(void)
7274 {
7275 return test_zuc_auth_cipher(
7276 &zuc_auth_cipher_test_case_1, OUT_OF_PLACE, 1);
7277 }
7278
7279 static int
test_zuc_auth_cipher_verify_test_case_1_sgl(void)7280 test_zuc_auth_cipher_verify_test_case_1_sgl(void)
7281 {
7282 return test_zuc_auth_cipher_sgl(
7283 &zuc_auth_cipher_test_case_1, IN_PLACE, 1);
7284 }
7285
7286 static int
test_zuc_auth_cipher_verify_test_case_1_oop_sgl(void)7287 test_zuc_auth_cipher_verify_test_case_1_oop_sgl(void)
7288 {
7289 return test_zuc_auth_cipher_sgl(
7290 &zuc_auth_cipher_test_case_1, OUT_OF_PLACE, 1);
7291 }
7292
7293 static int
test_zuc256_encryption_test_case_1(void)7294 test_zuc256_encryption_test_case_1(void)
7295 {
7296 return test_zuc_encryption(&zuc256_test_case_cipher_1);
7297 }
7298
7299 static int
test_zuc256_encryption_test_case_2(void)7300 test_zuc256_encryption_test_case_2(void)
7301 {
7302 return test_zuc_encryption(&zuc256_test_case_cipher_2);
7303 }
7304
7305 static int
test_zuc256_authentication_test_case_1(void)7306 test_zuc256_authentication_test_case_1(void)
7307 {
7308 return test_zuc_authentication(&zuc256_test_case_auth_1);
7309 }
7310
7311 static int
test_zuc256_authentication_test_case_2(void)7312 test_zuc256_authentication_test_case_2(void)
7313 {
7314 return test_zuc_authentication(&zuc256_test_case_auth_2);
7315 }
7316
7317 static int
test_mixed_check_if_unsupported(const struct mixed_cipher_auth_test_data * tdata)7318 test_mixed_check_if_unsupported(const struct mixed_cipher_auth_test_data *tdata)
7319 {
7320 uint8_t dev_id = testsuite_params.valid_devs[0];
7321
7322 struct rte_cryptodev_sym_capability_idx cap_idx;
7323
7324 /* Check if device supports particular cipher algorithm */
7325 cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
7326 cap_idx.algo.cipher = tdata->cipher_algo;
7327 if (rte_cryptodev_sym_capability_get(dev_id, &cap_idx) == NULL)
7328 return TEST_SKIPPED;
7329
7330 /* Check if device supports particular hash algorithm */
7331 cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
7332 cap_idx.algo.auth = tdata->auth_algo;
7333 if (rte_cryptodev_sym_capability_get(dev_id, &cap_idx) == NULL)
7334 return TEST_SKIPPED;
7335
7336 return 0;
7337 }
7338
7339 static int
test_mixed_auth_cipher(const struct mixed_cipher_auth_test_data * tdata,uint8_t op_mode,uint8_t verify)7340 test_mixed_auth_cipher(const struct mixed_cipher_auth_test_data *tdata,
7341 uint8_t op_mode, uint8_t verify)
7342 {
7343 struct crypto_testsuite_params *ts_params = &testsuite_params;
7344 struct crypto_unittest_params *ut_params = &unittest_params;
7345
7346 int retval;
7347
7348 uint8_t *plaintext = NULL, *ciphertext = NULL;
7349 unsigned int plaintext_pad_len;
7350 unsigned int plaintext_len;
7351 unsigned int ciphertext_pad_len;
7352 unsigned int ciphertext_len;
7353
7354 struct rte_cryptodev_info dev_info;
7355 struct rte_crypto_op *op;
7356
7357 /* Check if device supports particular algorithms separately */
7358 if (test_mixed_check_if_unsupported(tdata))
7359 return TEST_SKIPPED;
7360 if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
7361 return TEST_SKIPPED;
7362
7363 rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
7364
7365 uint64_t feat_flags = dev_info.feature_flags;
7366
7367 if (!(feat_flags & RTE_CRYPTODEV_FF_DIGEST_ENCRYPTED)) {
7368 printf("Device doesn't support digest encrypted.\n");
7369 return TEST_SKIPPED;
7370 }
7371
7372 /* Create the session */
7373 if (verify)
7374 retval = create_wireless_algo_cipher_auth_session(
7375 ts_params->valid_devs[0],
7376 RTE_CRYPTO_CIPHER_OP_DECRYPT,
7377 RTE_CRYPTO_AUTH_OP_VERIFY,
7378 tdata->auth_algo,
7379 tdata->cipher_algo,
7380 tdata->auth_key.data, tdata->auth_key.len,
7381 tdata->auth_iv.len, tdata->digest_enc.len,
7382 tdata->cipher_iv.len);
7383 else
7384 retval = create_wireless_algo_auth_cipher_session(
7385 ts_params->valid_devs[0],
7386 RTE_CRYPTO_CIPHER_OP_ENCRYPT,
7387 RTE_CRYPTO_AUTH_OP_GENERATE,
7388 tdata->auth_algo,
7389 tdata->cipher_algo,
7390 tdata->auth_key.data, tdata->auth_key.len,
7391 tdata->auth_iv.len, tdata->digest_enc.len,
7392 tdata->cipher_iv.len);
7393 if (retval != 0)
7394 return retval;
7395
7396 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
7397 if (op_mode == OUT_OF_PLACE)
7398 ut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
7399
7400 /* clear mbuf payload */
7401 memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
7402 rte_pktmbuf_tailroom(ut_params->ibuf));
7403 if (op_mode == OUT_OF_PLACE) {
7404
7405 memset(rte_pktmbuf_mtod(ut_params->obuf, uint8_t *), 0,
7406 rte_pktmbuf_tailroom(ut_params->obuf));
7407 }
7408
7409 ciphertext_len = ceil_byte_length(tdata->ciphertext.len_bits);
7410 plaintext_len = ceil_byte_length(tdata->plaintext.len_bits);
7411 ciphertext_pad_len = RTE_ALIGN_CEIL(ciphertext_len, 16);
7412 plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16);
7413
7414 if (verify) {
7415 ciphertext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
7416 ciphertext_pad_len);
7417 memcpy(ciphertext, tdata->ciphertext.data, ciphertext_len);
7418 debug_hexdump(stdout, "ciphertext:", ciphertext,
7419 ciphertext_len);
7420 } else {
7421 /* make sure enough space to cover partial digest verify case */
7422 plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
7423 ciphertext_pad_len);
7424 memcpy(plaintext, tdata->plaintext.data, plaintext_len);
7425 debug_hexdump(stdout, "plaintext:", plaintext, plaintext_len);
7426 }
7427
7428 if (op_mode == OUT_OF_PLACE)
7429 rte_pktmbuf_append(ut_params->obuf, ciphertext_pad_len);
7430
7431 /* Create the operation */
7432 retval = create_wireless_algo_auth_cipher_operation(
7433 tdata->digest_enc.data, tdata->digest_enc.len,
7434 tdata->cipher_iv.data, tdata->cipher_iv.len,
7435 tdata->auth_iv.data, tdata->auth_iv.len,
7436 (tdata->digest_enc.offset == 0 ?
7437 plaintext_pad_len
7438 : tdata->digest_enc.offset),
7439 tdata->validCipherLen.len_bits,
7440 tdata->cipher.offset_bits,
7441 tdata->validAuthLen.len_bits,
7442 tdata->auth.offset_bits,
7443 op_mode, 0, verify);
7444
7445 if (retval < 0)
7446 return retval;
7447
7448 op = process_crypto_request(ts_params->valid_devs[0], ut_params->op);
7449
7450 /* Check if the op failed because the device doesn't */
7451 /* support this particular combination of algorithms */
7452 if (op == NULL && ut_params->op->status ==
7453 RTE_CRYPTO_OP_STATUS_INVALID_SESSION) {
7454 printf("Device doesn't support this mixed combination. "
7455 "Test Skipped.\n");
7456 return TEST_SKIPPED;
7457 }
7458 ut_params->op = op;
7459
7460 TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
7461
7462 ut_params->obuf = (op_mode == IN_PLACE ?
7463 ut_params->op->sym->m_src : ut_params->op->sym->m_dst);
7464
7465 if (verify) {
7466 if (ut_params->obuf)
7467 plaintext = rte_pktmbuf_mtod(ut_params->obuf,
7468 uint8_t *);
7469 else
7470 plaintext = ciphertext +
7471 (tdata->cipher.offset_bits >> 3);
7472
7473 debug_hexdump(stdout, "plaintext:", plaintext,
7474 tdata->plaintext.len_bits >> 3);
7475 debug_hexdump(stdout, "plaintext expected:",
7476 tdata->plaintext.data,
7477 tdata->plaintext.len_bits >> 3);
7478 } else {
7479 if (ut_params->obuf)
7480 ciphertext = rte_pktmbuf_mtod(ut_params->obuf,
7481 uint8_t *);
7482 else
7483 ciphertext = plaintext;
7484
7485 debug_hexdump(stdout, "ciphertext:", ciphertext,
7486 ciphertext_len);
7487 debug_hexdump(stdout, "ciphertext expected:",
7488 tdata->ciphertext.data,
7489 tdata->ciphertext.len_bits >> 3);
7490
7491 ut_params->digest = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *)
7492 + (tdata->digest_enc.offset == 0 ?
7493 plaintext_pad_len : tdata->digest_enc.offset);
7494
7495 debug_hexdump(stdout, "digest:", ut_params->digest,
7496 tdata->digest_enc.len);
7497 debug_hexdump(stdout, "digest expected:",
7498 tdata->digest_enc.data,
7499 tdata->digest_enc.len);
7500 }
7501
7502 if (!verify) {
7503 TEST_ASSERT_BUFFERS_ARE_EQUAL(
7504 ut_params->digest,
7505 tdata->digest_enc.data,
7506 tdata->digest_enc.len,
7507 "Generated auth tag not as expected");
7508 }
7509
7510 if (tdata->cipher_algo != RTE_CRYPTO_CIPHER_NULL) {
7511 if (verify) {
7512 TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
7513 plaintext,
7514 tdata->plaintext.data,
7515 tdata->plaintext.len_bits >> 3,
7516 "Plaintext data not as expected");
7517 } else {
7518 TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
7519 ciphertext,
7520 tdata->ciphertext.data,
7521 tdata->validDataLen.len_bits,
7522 "Ciphertext data not as expected");
7523 }
7524 }
7525
7526 TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
7527 "crypto op processing failed");
7528
7529 return 0;
7530 }
7531
7532 static int
test_mixed_auth_cipher_sgl(const struct mixed_cipher_auth_test_data * tdata,uint8_t op_mode,uint8_t verify)7533 test_mixed_auth_cipher_sgl(const struct mixed_cipher_auth_test_data *tdata,
7534 uint8_t op_mode, uint8_t verify)
7535 {
7536 struct crypto_testsuite_params *ts_params = &testsuite_params;
7537 struct crypto_unittest_params *ut_params = &unittest_params;
7538
7539 int retval;
7540
7541 const uint8_t *plaintext = NULL;
7542 const uint8_t *ciphertext = NULL;
7543 const uint8_t *digest = NULL;
7544 unsigned int plaintext_pad_len;
7545 unsigned int plaintext_len;
7546 unsigned int ciphertext_pad_len;
7547 unsigned int ciphertext_len;
7548 uint8_t buffer[10000];
7549 uint8_t digest_buffer[10000];
7550
7551 struct rte_cryptodev_info dev_info;
7552 struct rte_crypto_op *op;
7553
7554 /* Check if device supports particular algorithms */
7555 if (test_mixed_check_if_unsupported(tdata))
7556 return TEST_SKIPPED;
7557 if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
7558 return TEST_SKIPPED;
7559
7560 rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
7561
7562 uint64_t feat_flags = dev_info.feature_flags;
7563
7564 if (op_mode == IN_PLACE) {
7565 if (!(feat_flags & RTE_CRYPTODEV_FF_IN_PLACE_SGL)) {
7566 printf("Device doesn't support in-place scatter-gather "
7567 "in both input and output mbufs.\n");
7568 return TEST_SKIPPED;
7569 }
7570 } else {
7571 if (!(feat_flags & RTE_CRYPTODEV_FF_OOP_SGL_IN_SGL_OUT)) {
7572 printf("Device doesn't support out-of-place scatter-gather "
7573 "in both input and output mbufs.\n");
7574 return TEST_SKIPPED;
7575 }
7576 if (!(feat_flags & RTE_CRYPTODEV_FF_DIGEST_ENCRYPTED)) {
7577 printf("Device doesn't support digest encrypted.\n");
7578 return TEST_SKIPPED;
7579 }
7580 }
7581
7582 /* Create the session */
7583 if (verify)
7584 retval = create_wireless_algo_cipher_auth_session(
7585 ts_params->valid_devs[0],
7586 RTE_CRYPTO_CIPHER_OP_DECRYPT,
7587 RTE_CRYPTO_AUTH_OP_VERIFY,
7588 tdata->auth_algo,
7589 tdata->cipher_algo,
7590 tdata->auth_key.data, tdata->auth_key.len,
7591 tdata->auth_iv.len, tdata->digest_enc.len,
7592 tdata->cipher_iv.len);
7593 else
7594 retval = create_wireless_algo_auth_cipher_session(
7595 ts_params->valid_devs[0],
7596 RTE_CRYPTO_CIPHER_OP_ENCRYPT,
7597 RTE_CRYPTO_AUTH_OP_GENERATE,
7598 tdata->auth_algo,
7599 tdata->cipher_algo,
7600 tdata->auth_key.data, tdata->auth_key.len,
7601 tdata->auth_iv.len, tdata->digest_enc.len,
7602 tdata->cipher_iv.len);
7603 if (retval != 0)
7604 return retval;
7605
7606 ciphertext_len = ceil_byte_length(tdata->ciphertext.len_bits);
7607 plaintext_len = ceil_byte_length(tdata->plaintext.len_bits);
7608 ciphertext_pad_len = RTE_ALIGN_CEIL(ciphertext_len, 16);
7609 plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16);
7610
7611 ut_params->ibuf = create_segmented_mbuf(ts_params->mbuf_pool,
7612 ciphertext_pad_len, 15, 0);
7613 TEST_ASSERT_NOT_NULL(ut_params->ibuf,
7614 "Failed to allocate input buffer in mempool");
7615
7616 if (op_mode == OUT_OF_PLACE) {
7617 ut_params->obuf = create_segmented_mbuf(ts_params->mbuf_pool,
7618 plaintext_pad_len, 15, 0);
7619 TEST_ASSERT_NOT_NULL(ut_params->obuf,
7620 "Failed to allocate output buffer in mempool");
7621 }
7622
7623 if (verify) {
7624 pktmbuf_write(ut_params->ibuf, 0, ciphertext_len,
7625 tdata->ciphertext.data);
7626 ciphertext = rte_pktmbuf_read(ut_params->ibuf, 0,
7627 ciphertext_len, buffer);
7628 debug_hexdump(stdout, "ciphertext:", ciphertext,
7629 ciphertext_len);
7630 } else {
7631 pktmbuf_write(ut_params->ibuf, 0, plaintext_len,
7632 tdata->plaintext.data);
7633 plaintext = rte_pktmbuf_read(ut_params->ibuf, 0,
7634 plaintext_len, buffer);
7635 debug_hexdump(stdout, "plaintext:", plaintext,
7636 plaintext_len);
7637 }
7638 memset(buffer, 0, sizeof(buffer));
7639
7640 /* Create the operation */
7641 retval = create_wireless_algo_auth_cipher_operation(
7642 tdata->digest_enc.data, tdata->digest_enc.len,
7643 tdata->cipher_iv.data, tdata->cipher_iv.len,
7644 tdata->auth_iv.data, tdata->auth_iv.len,
7645 (tdata->digest_enc.offset == 0 ?
7646 plaintext_pad_len
7647 : tdata->digest_enc.offset),
7648 tdata->validCipherLen.len_bits,
7649 tdata->cipher.offset_bits,
7650 tdata->validAuthLen.len_bits,
7651 tdata->auth.offset_bits,
7652 op_mode, 1, verify);
7653
7654 if (retval < 0)
7655 return retval;
7656
7657 op = process_crypto_request(ts_params->valid_devs[0], ut_params->op);
7658
7659 /* Check if the op failed because the device doesn't */
7660 /* support this particular combination of algorithms */
7661 if (op == NULL && ut_params->op->status ==
7662 RTE_CRYPTO_OP_STATUS_INVALID_SESSION) {
7663 printf("Device doesn't support this mixed combination. "
7664 "Test Skipped.\n");
7665 return TEST_SKIPPED;
7666 }
7667 ut_params->op = op;
7668
7669 TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
7670
7671 ut_params->obuf = (op_mode == IN_PLACE ?
7672 ut_params->op->sym->m_src : ut_params->op->sym->m_dst);
7673
7674 if (verify) {
7675 if (ut_params->obuf)
7676 plaintext = rte_pktmbuf_read(ut_params->obuf, 0,
7677 plaintext_len, buffer);
7678 else
7679 plaintext = rte_pktmbuf_read(ut_params->ibuf, 0,
7680 plaintext_len, buffer);
7681
7682 debug_hexdump(stdout, "plaintext:", plaintext,
7683 (tdata->plaintext.len_bits >> 3) -
7684 tdata->digest_enc.len);
7685 debug_hexdump(stdout, "plaintext expected:",
7686 tdata->plaintext.data,
7687 (tdata->plaintext.len_bits >> 3) -
7688 tdata->digest_enc.len);
7689 } else {
7690 if (ut_params->obuf)
7691 ciphertext = rte_pktmbuf_read(ut_params->obuf, 0,
7692 ciphertext_len, buffer);
7693 else
7694 ciphertext = rte_pktmbuf_read(ut_params->ibuf, 0,
7695 ciphertext_len, buffer);
7696
7697 debug_hexdump(stdout, "ciphertext:", ciphertext,
7698 ciphertext_len);
7699 debug_hexdump(stdout, "ciphertext expected:",
7700 tdata->ciphertext.data,
7701 tdata->ciphertext.len_bits >> 3);
7702
7703 if (ut_params->obuf)
7704 digest = rte_pktmbuf_read(ut_params->obuf,
7705 (tdata->digest_enc.offset == 0 ?
7706 plaintext_pad_len :
7707 tdata->digest_enc.offset),
7708 tdata->digest_enc.len, digest_buffer);
7709 else
7710 digest = rte_pktmbuf_read(ut_params->ibuf,
7711 (tdata->digest_enc.offset == 0 ?
7712 plaintext_pad_len :
7713 tdata->digest_enc.offset),
7714 tdata->digest_enc.len, digest_buffer);
7715
7716 debug_hexdump(stdout, "digest:", digest,
7717 tdata->digest_enc.len);
7718 debug_hexdump(stdout, "digest expected:",
7719 tdata->digest_enc.data, tdata->digest_enc.len);
7720 }
7721
7722 if (!verify) {
7723 TEST_ASSERT_BUFFERS_ARE_EQUAL(
7724 digest,
7725 tdata->digest_enc.data,
7726 tdata->digest_enc.len,
7727 "Generated auth tag not as expected");
7728 }
7729
7730 if (tdata->cipher_algo != RTE_CRYPTO_CIPHER_NULL) {
7731 if (verify) {
7732 TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
7733 plaintext,
7734 tdata->plaintext.data,
7735 tdata->plaintext.len_bits >> 3,
7736 "Plaintext data not as expected");
7737 } else {
7738 TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
7739 ciphertext,
7740 tdata->ciphertext.data,
7741 tdata->validDataLen.len_bits,
7742 "Ciphertext data not as expected");
7743 }
7744 }
7745
7746 TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
7747 "crypto op processing failed");
7748
7749 return 0;
7750 }
7751
7752 /** AUTH AES CMAC + CIPHER AES CTR */
7753
7754 static int
test_aes_cmac_aes_ctr_digest_enc_test_case_1(void)7755 test_aes_cmac_aes_ctr_digest_enc_test_case_1(void)
7756 {
7757 return test_mixed_auth_cipher(
7758 &auth_aes_cmac_cipher_aes_ctr_test_case_1, IN_PLACE, 0);
7759 }
7760
7761 static int
test_aes_cmac_aes_ctr_digest_enc_test_case_1_oop(void)7762 test_aes_cmac_aes_ctr_digest_enc_test_case_1_oop(void)
7763 {
7764 return test_mixed_auth_cipher(
7765 &auth_aes_cmac_cipher_aes_ctr_test_case_1, OUT_OF_PLACE, 0);
7766 }
7767
7768 static int
test_aes_cmac_aes_ctr_digest_enc_test_case_1_sgl(void)7769 test_aes_cmac_aes_ctr_digest_enc_test_case_1_sgl(void)
7770 {
7771 return test_mixed_auth_cipher_sgl(
7772 &auth_aes_cmac_cipher_aes_ctr_test_case_1, IN_PLACE, 0);
7773 }
7774
7775 static int
test_aes_cmac_aes_ctr_digest_enc_test_case_1_oop_sgl(void)7776 test_aes_cmac_aes_ctr_digest_enc_test_case_1_oop_sgl(void)
7777 {
7778 return test_mixed_auth_cipher_sgl(
7779 &auth_aes_cmac_cipher_aes_ctr_test_case_1, OUT_OF_PLACE, 0);
7780 }
7781
7782 static int
test_verify_aes_cmac_aes_ctr_digest_enc_test_case_1(void)7783 test_verify_aes_cmac_aes_ctr_digest_enc_test_case_1(void)
7784 {
7785 return test_mixed_auth_cipher(
7786 &auth_aes_cmac_cipher_aes_ctr_test_case_1, IN_PLACE, 1);
7787 }
7788
7789 static int
test_verify_aes_cmac_aes_ctr_digest_enc_test_case_1_oop(void)7790 test_verify_aes_cmac_aes_ctr_digest_enc_test_case_1_oop(void)
7791 {
7792 return test_mixed_auth_cipher(
7793 &auth_aes_cmac_cipher_aes_ctr_test_case_1, OUT_OF_PLACE, 1);
7794 }
7795
7796 static int
test_verify_aes_cmac_aes_ctr_digest_enc_test_case_1_sgl(void)7797 test_verify_aes_cmac_aes_ctr_digest_enc_test_case_1_sgl(void)
7798 {
7799 return test_mixed_auth_cipher_sgl(
7800 &auth_aes_cmac_cipher_aes_ctr_test_case_1, IN_PLACE, 1);
7801 }
7802
7803 static int
test_verify_aes_cmac_aes_ctr_digest_enc_test_case_1_oop_sgl(void)7804 test_verify_aes_cmac_aes_ctr_digest_enc_test_case_1_oop_sgl(void)
7805 {
7806 return test_mixed_auth_cipher_sgl(
7807 &auth_aes_cmac_cipher_aes_ctr_test_case_1, OUT_OF_PLACE, 1);
7808 }
7809
7810 /** MIXED AUTH + CIPHER */
7811
7812 static int
test_auth_zuc_cipher_snow_test_case_1(void)7813 test_auth_zuc_cipher_snow_test_case_1(void)
7814 {
7815 return test_mixed_auth_cipher(
7816 &auth_zuc_cipher_snow_test_case_1, OUT_OF_PLACE, 0);
7817 }
7818
7819 static int
test_verify_auth_zuc_cipher_snow_test_case_1(void)7820 test_verify_auth_zuc_cipher_snow_test_case_1(void)
7821 {
7822 return test_mixed_auth_cipher(
7823 &auth_zuc_cipher_snow_test_case_1, OUT_OF_PLACE, 1);
7824 }
7825
7826 static int
test_auth_aes_cmac_cipher_snow_test_case_1(void)7827 test_auth_aes_cmac_cipher_snow_test_case_1(void)
7828 {
7829 return test_mixed_auth_cipher(
7830 &auth_aes_cmac_cipher_snow_test_case_1, OUT_OF_PLACE, 0);
7831 }
7832
7833 static int
test_verify_auth_aes_cmac_cipher_snow_test_case_1(void)7834 test_verify_auth_aes_cmac_cipher_snow_test_case_1(void)
7835 {
7836 return test_mixed_auth_cipher(
7837 &auth_aes_cmac_cipher_snow_test_case_1, OUT_OF_PLACE, 1);
7838 }
7839
7840 static int
test_auth_zuc_cipher_aes_ctr_test_case_1(void)7841 test_auth_zuc_cipher_aes_ctr_test_case_1(void)
7842 {
7843 return test_mixed_auth_cipher(
7844 &auth_zuc_cipher_aes_ctr_test_case_1, OUT_OF_PLACE, 0);
7845 }
7846
7847 static int
test_verify_auth_zuc_cipher_aes_ctr_test_case_1(void)7848 test_verify_auth_zuc_cipher_aes_ctr_test_case_1(void)
7849 {
7850 return test_mixed_auth_cipher(
7851 &auth_zuc_cipher_aes_ctr_test_case_1, OUT_OF_PLACE, 1);
7852 }
7853
7854 static int
test_auth_snow_cipher_aes_ctr_test_case_1(void)7855 test_auth_snow_cipher_aes_ctr_test_case_1(void)
7856 {
7857 return test_mixed_auth_cipher(
7858 &auth_snow_cipher_aes_ctr_test_case_1, OUT_OF_PLACE, 0);
7859 }
7860
7861 static int
test_verify_auth_snow_cipher_aes_ctr_test_case_1(void)7862 test_verify_auth_snow_cipher_aes_ctr_test_case_1(void)
7863 {
7864 return test_mixed_auth_cipher(
7865 &auth_snow_cipher_aes_ctr_test_case_1, OUT_OF_PLACE, 1);
7866 }
7867
7868 static int
test_auth_snow_cipher_zuc_test_case_1(void)7869 test_auth_snow_cipher_zuc_test_case_1(void)
7870 {
7871 return test_mixed_auth_cipher(
7872 &auth_snow_cipher_zuc_test_case_1, OUT_OF_PLACE, 0);
7873 }
7874
7875 static int
test_verify_auth_snow_cipher_zuc_test_case_1(void)7876 test_verify_auth_snow_cipher_zuc_test_case_1(void)
7877 {
7878 return test_mixed_auth_cipher(
7879 &auth_snow_cipher_zuc_test_case_1, OUT_OF_PLACE, 1);
7880 }
7881
7882 static int
test_auth_aes_cmac_cipher_zuc_test_case_1(void)7883 test_auth_aes_cmac_cipher_zuc_test_case_1(void)
7884 {
7885 return test_mixed_auth_cipher(
7886 &auth_aes_cmac_cipher_zuc_test_case_1, OUT_OF_PLACE, 0);
7887 }
7888
7889 static int
test_verify_auth_aes_cmac_cipher_zuc_test_case_1(void)7890 test_verify_auth_aes_cmac_cipher_zuc_test_case_1(void)
7891 {
7892 return test_mixed_auth_cipher(
7893 &auth_aes_cmac_cipher_zuc_test_case_1, OUT_OF_PLACE, 1);
7894 }
7895
7896 static int
test_auth_null_cipher_snow_test_case_1(void)7897 test_auth_null_cipher_snow_test_case_1(void)
7898 {
7899 return test_mixed_auth_cipher(
7900 &auth_null_cipher_snow_test_case_1, OUT_OF_PLACE, 0);
7901 }
7902
7903 static int
test_verify_auth_null_cipher_snow_test_case_1(void)7904 test_verify_auth_null_cipher_snow_test_case_1(void)
7905 {
7906 return test_mixed_auth_cipher(
7907 &auth_null_cipher_snow_test_case_1, OUT_OF_PLACE, 1);
7908 }
7909
7910 static int
test_auth_null_cipher_zuc_test_case_1(void)7911 test_auth_null_cipher_zuc_test_case_1(void)
7912 {
7913 return test_mixed_auth_cipher(
7914 &auth_null_cipher_zuc_test_case_1, OUT_OF_PLACE, 0);
7915 }
7916
7917 static int
test_verify_auth_null_cipher_zuc_test_case_1(void)7918 test_verify_auth_null_cipher_zuc_test_case_1(void)
7919 {
7920 return test_mixed_auth_cipher(
7921 &auth_null_cipher_zuc_test_case_1, OUT_OF_PLACE, 1);
7922 }
7923
7924 static int
test_auth_snow_cipher_null_test_case_1(void)7925 test_auth_snow_cipher_null_test_case_1(void)
7926 {
7927 return test_mixed_auth_cipher(
7928 &auth_snow_cipher_null_test_case_1, OUT_OF_PLACE, 0);
7929 }
7930
7931 static int
test_verify_auth_snow_cipher_null_test_case_1(void)7932 test_verify_auth_snow_cipher_null_test_case_1(void)
7933 {
7934 return test_mixed_auth_cipher(
7935 &auth_snow_cipher_null_test_case_1, OUT_OF_PLACE, 1);
7936 }
7937
7938 static int
test_auth_zuc_cipher_null_test_case_1(void)7939 test_auth_zuc_cipher_null_test_case_1(void)
7940 {
7941 return test_mixed_auth_cipher(
7942 &auth_zuc_cipher_null_test_case_1, OUT_OF_PLACE, 0);
7943 }
7944
7945 static int
test_verify_auth_zuc_cipher_null_test_case_1(void)7946 test_verify_auth_zuc_cipher_null_test_case_1(void)
7947 {
7948 return test_mixed_auth_cipher(
7949 &auth_zuc_cipher_null_test_case_1, OUT_OF_PLACE, 1);
7950 }
7951
7952 static int
test_auth_null_cipher_aes_ctr_test_case_1(void)7953 test_auth_null_cipher_aes_ctr_test_case_1(void)
7954 {
7955 return test_mixed_auth_cipher(
7956 &auth_null_cipher_aes_ctr_test_case_1, OUT_OF_PLACE, 0);
7957 }
7958
7959 static int
test_verify_auth_null_cipher_aes_ctr_test_case_1(void)7960 test_verify_auth_null_cipher_aes_ctr_test_case_1(void)
7961 {
7962 return test_mixed_auth_cipher(
7963 &auth_null_cipher_aes_ctr_test_case_1, OUT_OF_PLACE, 1);
7964 }
7965
7966 static int
test_auth_aes_cmac_cipher_null_test_case_1(void)7967 test_auth_aes_cmac_cipher_null_test_case_1(void)
7968 {
7969 return test_mixed_auth_cipher(
7970 &auth_aes_cmac_cipher_null_test_case_1, OUT_OF_PLACE, 0);
7971 }
7972
7973 static int
test_verify_auth_aes_cmac_cipher_null_test_case_1(void)7974 test_verify_auth_aes_cmac_cipher_null_test_case_1(void)
7975 {
7976 return test_mixed_auth_cipher(
7977 &auth_aes_cmac_cipher_null_test_case_1, OUT_OF_PLACE, 1);
7978 }
7979
7980 /* ***** AEAD algorithm Tests ***** */
7981
7982 static int
create_aead_session(uint8_t dev_id,enum rte_crypto_aead_algorithm algo,enum rte_crypto_aead_operation op,const uint8_t * key,const uint8_t key_len,const uint16_t aad_len,const uint8_t auth_len,uint8_t iv_len)7983 create_aead_session(uint8_t dev_id, enum rte_crypto_aead_algorithm algo,
7984 enum rte_crypto_aead_operation op,
7985 const uint8_t *key, const uint8_t key_len,
7986 const uint16_t aad_len, const uint8_t auth_len,
7987 uint8_t iv_len)
7988 {
7989 uint8_t aead_key[key_len];
7990 int status;
7991
7992 struct crypto_testsuite_params *ts_params = &testsuite_params;
7993 struct crypto_unittest_params *ut_params = &unittest_params;
7994
7995 memcpy(aead_key, key, key_len);
7996
7997 /* Setup AEAD Parameters */
7998 ut_params->aead_xform.type = RTE_CRYPTO_SYM_XFORM_AEAD;
7999 ut_params->aead_xform.next = NULL;
8000 ut_params->aead_xform.aead.algo = algo;
8001 ut_params->aead_xform.aead.op = op;
8002 ut_params->aead_xform.aead.key.data = aead_key;
8003 ut_params->aead_xform.aead.key.length = key_len;
8004 ut_params->aead_xform.aead.iv.offset = IV_OFFSET;
8005 ut_params->aead_xform.aead.iv.length = iv_len;
8006 ut_params->aead_xform.aead.digest_length = auth_len;
8007 ut_params->aead_xform.aead.aad_length = aad_len;
8008
8009 debug_hexdump(stdout, "key:", key, key_len);
8010
8011 /* Create Crypto session*/
8012 ut_params->sess = rte_cryptodev_sym_session_create(
8013 ts_params->session_mpool);
8014 TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed");
8015
8016 status = rte_cryptodev_sym_session_init(dev_id, ut_params->sess,
8017 &ut_params->aead_xform,
8018 ts_params->session_priv_mpool);
8019
8020 return status;
8021 }
8022
8023 static int
create_aead_xform(struct rte_crypto_op * op,enum rte_crypto_aead_algorithm algo,enum rte_crypto_aead_operation aead_op,uint8_t * key,const uint8_t key_len,const uint8_t aad_len,const uint8_t auth_len,uint8_t iv_len)8024 create_aead_xform(struct rte_crypto_op *op,
8025 enum rte_crypto_aead_algorithm algo,
8026 enum rte_crypto_aead_operation aead_op,
8027 uint8_t *key, const uint8_t key_len,
8028 const uint8_t aad_len, const uint8_t auth_len,
8029 uint8_t iv_len)
8030 {
8031 TEST_ASSERT_NOT_NULL(rte_crypto_op_sym_xforms_alloc(op, 1),
8032 "failed to allocate space for crypto transform");
8033
8034 struct rte_crypto_sym_op *sym_op = op->sym;
8035
8036 /* Setup AEAD Parameters */
8037 sym_op->xform->type = RTE_CRYPTO_SYM_XFORM_AEAD;
8038 sym_op->xform->next = NULL;
8039 sym_op->xform->aead.algo = algo;
8040 sym_op->xform->aead.op = aead_op;
8041 sym_op->xform->aead.key.data = key;
8042 sym_op->xform->aead.key.length = key_len;
8043 sym_op->xform->aead.iv.offset = IV_OFFSET;
8044 sym_op->xform->aead.iv.length = iv_len;
8045 sym_op->xform->aead.digest_length = auth_len;
8046 sym_op->xform->aead.aad_length = aad_len;
8047
8048 debug_hexdump(stdout, "key:", key, key_len);
8049
8050 return 0;
8051 }
8052
8053 static int
create_aead_operation(enum rte_crypto_aead_operation op,const struct aead_test_data * tdata)8054 create_aead_operation(enum rte_crypto_aead_operation op,
8055 const struct aead_test_data *tdata)
8056 {
8057 struct crypto_testsuite_params *ts_params = &testsuite_params;
8058 struct crypto_unittest_params *ut_params = &unittest_params;
8059
8060 uint8_t *plaintext, *ciphertext;
8061 unsigned int aad_pad_len, plaintext_pad_len;
8062
8063 /* Generate Crypto op data structure */
8064 ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
8065 RTE_CRYPTO_OP_TYPE_SYMMETRIC);
8066 TEST_ASSERT_NOT_NULL(ut_params->op,
8067 "Failed to allocate symmetric crypto operation struct");
8068
8069 struct rte_crypto_sym_op *sym_op = ut_params->op->sym;
8070
8071 /* Append aad data */
8072 if (tdata->algo == RTE_CRYPTO_AEAD_AES_CCM) {
8073 aad_pad_len = RTE_ALIGN_CEIL(tdata->aad.len + 18, 16);
8074 sym_op->aead.aad.data = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
8075 aad_pad_len);
8076 TEST_ASSERT_NOT_NULL(sym_op->aead.aad.data,
8077 "no room to append aad");
8078
8079 sym_op->aead.aad.phys_addr =
8080 rte_pktmbuf_iova(ut_params->ibuf);
8081 /* Copy AAD 18 bytes after the AAD pointer, according to the API */
8082 memcpy(sym_op->aead.aad.data + 18, tdata->aad.data, tdata->aad.len);
8083 debug_hexdump(stdout, "aad:", sym_op->aead.aad.data,
8084 tdata->aad.len);
8085
8086 /* Append IV at the end of the crypto operation*/
8087 uint8_t *iv_ptr = rte_crypto_op_ctod_offset(ut_params->op,
8088 uint8_t *, IV_OFFSET);
8089
8090 /* Copy IV 1 byte after the IV pointer, according to the API */
8091 rte_memcpy(iv_ptr + 1, tdata->iv.data, tdata->iv.len);
8092 debug_hexdump(stdout, "iv:", iv_ptr,
8093 tdata->iv.len);
8094 } else {
8095 aad_pad_len = RTE_ALIGN_CEIL(tdata->aad.len, 16);
8096 sym_op->aead.aad.data = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
8097 aad_pad_len);
8098 TEST_ASSERT_NOT_NULL(sym_op->aead.aad.data,
8099 "no room to append aad");
8100
8101 sym_op->aead.aad.phys_addr =
8102 rte_pktmbuf_iova(ut_params->ibuf);
8103 memcpy(sym_op->aead.aad.data, tdata->aad.data, tdata->aad.len);
8104 debug_hexdump(stdout, "aad:", sym_op->aead.aad.data,
8105 tdata->aad.len);
8106
8107 /* Append IV at the end of the crypto operation*/
8108 uint8_t *iv_ptr = rte_crypto_op_ctod_offset(ut_params->op,
8109 uint8_t *, IV_OFFSET);
8110
8111 if (tdata->iv.len == 0) {
8112 rte_memcpy(iv_ptr, tdata->iv.data, AES_GCM_J0_LENGTH);
8113 debug_hexdump(stdout, "iv:", iv_ptr,
8114 AES_GCM_J0_LENGTH);
8115 } else {
8116 rte_memcpy(iv_ptr, tdata->iv.data, tdata->iv.len);
8117 debug_hexdump(stdout, "iv:", iv_ptr,
8118 tdata->iv.len);
8119 }
8120 }
8121
8122 /* Append plaintext/ciphertext */
8123 if (op == RTE_CRYPTO_AEAD_OP_ENCRYPT) {
8124 plaintext_pad_len = RTE_ALIGN_CEIL(tdata->plaintext.len, 16);
8125 plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
8126 plaintext_pad_len);
8127 TEST_ASSERT_NOT_NULL(plaintext, "no room to append plaintext");
8128
8129 memcpy(plaintext, tdata->plaintext.data, tdata->plaintext.len);
8130 debug_hexdump(stdout, "plaintext:", plaintext,
8131 tdata->plaintext.len);
8132
8133 if (ut_params->obuf) {
8134 ciphertext = (uint8_t *)rte_pktmbuf_append(
8135 ut_params->obuf,
8136 plaintext_pad_len + aad_pad_len);
8137 TEST_ASSERT_NOT_NULL(ciphertext,
8138 "no room to append ciphertext");
8139
8140 memset(ciphertext + aad_pad_len, 0,
8141 tdata->ciphertext.len);
8142 }
8143 } else {
8144 plaintext_pad_len = RTE_ALIGN_CEIL(tdata->ciphertext.len, 16);
8145 ciphertext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
8146 plaintext_pad_len);
8147 TEST_ASSERT_NOT_NULL(ciphertext,
8148 "no room to append ciphertext");
8149
8150 memcpy(ciphertext, tdata->ciphertext.data,
8151 tdata->ciphertext.len);
8152 debug_hexdump(stdout, "ciphertext:", ciphertext,
8153 tdata->ciphertext.len);
8154
8155 if (ut_params->obuf) {
8156 plaintext = (uint8_t *)rte_pktmbuf_append(
8157 ut_params->obuf,
8158 plaintext_pad_len + aad_pad_len);
8159 TEST_ASSERT_NOT_NULL(plaintext,
8160 "no room to append plaintext");
8161
8162 memset(plaintext + aad_pad_len, 0,
8163 tdata->plaintext.len);
8164 }
8165 }
8166
8167 /* Append digest data */
8168 if (op == RTE_CRYPTO_AEAD_OP_ENCRYPT) {
8169 sym_op->aead.digest.data = (uint8_t *)rte_pktmbuf_append(
8170 ut_params->obuf ? ut_params->obuf :
8171 ut_params->ibuf,
8172 tdata->auth_tag.len);
8173 TEST_ASSERT_NOT_NULL(sym_op->aead.digest.data,
8174 "no room to append digest");
8175 memset(sym_op->aead.digest.data, 0, tdata->auth_tag.len);
8176 sym_op->aead.digest.phys_addr = rte_pktmbuf_iova_offset(
8177 ut_params->obuf ? ut_params->obuf :
8178 ut_params->ibuf,
8179 plaintext_pad_len +
8180 aad_pad_len);
8181 } else {
8182 sym_op->aead.digest.data = (uint8_t *)rte_pktmbuf_append(
8183 ut_params->ibuf, tdata->auth_tag.len);
8184 TEST_ASSERT_NOT_NULL(sym_op->aead.digest.data,
8185 "no room to append digest");
8186 sym_op->aead.digest.phys_addr = rte_pktmbuf_iova_offset(
8187 ut_params->ibuf,
8188 plaintext_pad_len + aad_pad_len);
8189
8190 rte_memcpy(sym_op->aead.digest.data, tdata->auth_tag.data,
8191 tdata->auth_tag.len);
8192 debug_hexdump(stdout, "digest:",
8193 sym_op->aead.digest.data,
8194 tdata->auth_tag.len);
8195 }
8196
8197 sym_op->aead.data.length = tdata->plaintext.len;
8198 sym_op->aead.data.offset = aad_pad_len;
8199
8200 return 0;
8201 }
8202
8203 static int
test_authenticated_encryption(const struct aead_test_data * tdata)8204 test_authenticated_encryption(const struct aead_test_data *tdata)
8205 {
8206 struct crypto_testsuite_params *ts_params = &testsuite_params;
8207 struct crypto_unittest_params *ut_params = &unittest_params;
8208
8209 int retval;
8210 uint8_t *ciphertext, *auth_tag;
8211 uint16_t plaintext_pad_len;
8212 uint32_t i;
8213 struct rte_cryptodev_info dev_info;
8214
8215 rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
8216 uint64_t feat_flags = dev_info.feature_flags;
8217
8218 if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
8219 (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
8220 printf("Device doesn't support RAW data-path APIs.\n");
8221 return TEST_SKIPPED;
8222 }
8223
8224 /* Verify the capabilities */
8225 struct rte_cryptodev_sym_capability_idx cap_idx;
8226 const struct rte_cryptodev_symmetric_capability *capability;
8227 cap_idx.type = RTE_CRYPTO_SYM_XFORM_AEAD;
8228 cap_idx.algo.aead = tdata->algo;
8229 capability = rte_cryptodev_sym_capability_get(
8230 ts_params->valid_devs[0], &cap_idx);
8231 if (capability == NULL)
8232 return TEST_SKIPPED;
8233 if (rte_cryptodev_sym_capability_check_aead(
8234 capability, tdata->key.len, tdata->auth_tag.len,
8235 tdata->aad.len, tdata->iv.len))
8236 return TEST_SKIPPED;
8237
8238 /* Create AEAD session */
8239 retval = create_aead_session(ts_params->valid_devs[0],
8240 tdata->algo,
8241 RTE_CRYPTO_AEAD_OP_ENCRYPT,
8242 tdata->key.data, tdata->key.len,
8243 tdata->aad.len, tdata->auth_tag.len,
8244 tdata->iv.len);
8245 if (retval < 0)
8246 return retval;
8247
8248 if (tdata->aad.len > MBUF_SIZE) {
8249 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->large_mbuf_pool);
8250 /* Populate full size of add data */
8251 for (i = 32; i < MAX_AAD_LENGTH; i += 32)
8252 memcpy(&tdata->aad.data[i], &tdata->aad.data[0], 32);
8253 } else
8254 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
8255
8256 /* clear mbuf payload */
8257 memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
8258 rte_pktmbuf_tailroom(ut_params->ibuf));
8259
8260 /* Create AEAD operation */
8261 retval = create_aead_operation(RTE_CRYPTO_AEAD_OP_ENCRYPT, tdata);
8262 if (retval < 0)
8263 return retval;
8264
8265 rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
8266
8267 ut_params->op->sym->m_src = ut_params->ibuf;
8268
8269 /* Process crypto operation */
8270 if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
8271 process_cpu_aead_op(ts_params->valid_devs[0], ut_params->op);
8272 else if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
8273 process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
8274 ut_params->op, 0, 0, 0, 0);
8275 else
8276 TEST_ASSERT_NOT_NULL(
8277 process_crypto_request(ts_params->valid_devs[0],
8278 ut_params->op), "failed to process sym crypto op");
8279
8280 TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
8281 "crypto op processing failed");
8282
8283 plaintext_pad_len = RTE_ALIGN_CEIL(tdata->plaintext.len, 16);
8284
8285 if (ut_params->op->sym->m_dst) {
8286 ciphertext = rte_pktmbuf_mtod(ut_params->op->sym->m_dst,
8287 uint8_t *);
8288 auth_tag = rte_pktmbuf_mtod_offset(ut_params->op->sym->m_dst,
8289 uint8_t *, plaintext_pad_len);
8290 } else {
8291 ciphertext = rte_pktmbuf_mtod_offset(ut_params->op->sym->m_src,
8292 uint8_t *,
8293 ut_params->op->sym->cipher.data.offset);
8294 auth_tag = ciphertext + plaintext_pad_len;
8295 }
8296
8297 debug_hexdump(stdout, "ciphertext:", ciphertext, tdata->ciphertext.len);
8298 debug_hexdump(stdout, "auth tag:", auth_tag, tdata->auth_tag.len);
8299
8300 /* Validate obuf */
8301 TEST_ASSERT_BUFFERS_ARE_EQUAL(
8302 ciphertext,
8303 tdata->ciphertext.data,
8304 tdata->ciphertext.len,
8305 "Ciphertext data not as expected");
8306
8307 TEST_ASSERT_BUFFERS_ARE_EQUAL(
8308 auth_tag,
8309 tdata->auth_tag.data,
8310 tdata->auth_tag.len,
8311 "Generated auth tag not as expected");
8312
8313 return 0;
8314
8315 }
8316
8317 #ifdef RTE_LIB_SECURITY
8318 static int
security_proto_supported(enum rte_security_session_action_type action,enum rte_security_session_protocol proto)8319 security_proto_supported(enum rte_security_session_action_type action,
8320 enum rte_security_session_protocol proto)
8321 {
8322 struct crypto_testsuite_params *ts_params = &testsuite_params;
8323
8324 const struct rte_security_capability *capabilities;
8325 const struct rte_security_capability *capability;
8326 uint16_t i = 0;
8327
8328 struct rte_security_ctx *ctx = (struct rte_security_ctx *)
8329 rte_cryptodev_get_sec_ctx(
8330 ts_params->valid_devs[0]);
8331
8332
8333 capabilities = rte_security_capabilities_get(ctx);
8334
8335 if (capabilities == NULL)
8336 return -ENOTSUP;
8337
8338 while ((capability = &capabilities[i++])->action !=
8339 RTE_SECURITY_ACTION_TYPE_NONE) {
8340 if (capability->action == action &&
8341 capability->protocol == proto)
8342 return 0;
8343 }
8344
8345 return -ENOTSUP;
8346 }
8347
8348 /* Basic algorithm run function for async inplace mode.
8349 * Creates a session from input parameters and runs one operation
8350 * on input_vec. Checks the output of the crypto operation against
8351 * output_vec.
8352 */
test_pdcp_proto(int i,int oop,enum rte_crypto_cipher_operation opc,enum rte_crypto_auth_operation opa,const uint8_t * input_vec,unsigned int input_vec_len,const uint8_t * output_vec,unsigned int output_vec_len,enum rte_crypto_cipher_algorithm cipher_alg,const uint8_t * cipher_key,uint32_t cipher_key_len,enum rte_crypto_auth_algorithm auth_alg,const uint8_t * auth_key,uint32_t auth_key_len,uint8_t bearer,enum rte_security_pdcp_domain domain,uint8_t packet_direction,uint8_t sn_size,uint32_t hfn,uint32_t hfn_threshold,uint8_t sdap)8353 static int test_pdcp_proto(int i, int oop, enum rte_crypto_cipher_operation opc,
8354 enum rte_crypto_auth_operation opa,
8355 const uint8_t *input_vec, unsigned int input_vec_len,
8356 const uint8_t *output_vec,
8357 unsigned int output_vec_len,
8358 enum rte_crypto_cipher_algorithm cipher_alg,
8359 const uint8_t *cipher_key, uint32_t cipher_key_len,
8360 enum rte_crypto_auth_algorithm auth_alg,
8361 const uint8_t *auth_key, uint32_t auth_key_len,
8362 uint8_t bearer, enum rte_security_pdcp_domain domain,
8363 uint8_t packet_direction, uint8_t sn_size,
8364 uint32_t hfn, uint32_t hfn_threshold, uint8_t sdap)
8365 {
8366 struct crypto_testsuite_params *ts_params = &testsuite_params;
8367 struct crypto_unittest_params *ut_params = &unittest_params;
8368 uint8_t *plaintext;
8369 int ret = TEST_SUCCESS;
8370 struct rte_security_ctx *ctx = (struct rte_security_ctx *)
8371 rte_cryptodev_get_sec_ctx(
8372 ts_params->valid_devs[0]);
8373
8374 /* Verify the capabilities */
8375 struct rte_security_capability_idx sec_cap_idx;
8376
8377 sec_cap_idx.action = ut_params->type;
8378 sec_cap_idx.protocol = RTE_SECURITY_PROTOCOL_PDCP;
8379 sec_cap_idx.pdcp.domain = domain;
8380 if (rte_security_capability_get(ctx, &sec_cap_idx) == NULL)
8381 return TEST_SKIPPED;
8382
8383 /* Generate test mbuf data */
8384 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
8385
8386 /* clear mbuf payload */
8387 memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
8388 rte_pktmbuf_tailroom(ut_params->ibuf));
8389
8390 plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
8391 input_vec_len);
8392 memcpy(plaintext, input_vec, input_vec_len);
8393
8394 /* Out of place support */
8395 if (oop) {
8396 /*
8397 * For out-op-place we need to alloc another mbuf
8398 */
8399 ut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
8400 rte_pktmbuf_append(ut_params->obuf, output_vec_len);
8401 }
8402
8403 /* Setup Cipher Parameters */
8404 ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
8405 ut_params->cipher_xform.cipher.algo = cipher_alg;
8406 ut_params->cipher_xform.cipher.op = opc;
8407 ut_params->cipher_xform.cipher.key.data = cipher_key;
8408 ut_params->cipher_xform.cipher.key.length = cipher_key_len;
8409 ut_params->cipher_xform.cipher.iv.length =
8410 packet_direction ? 4 : 0;
8411 ut_params->cipher_xform.cipher.iv.offset = IV_OFFSET;
8412
8413 /* Setup HMAC Parameters if ICV header is required */
8414 if (auth_alg != 0) {
8415 ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;
8416 ut_params->auth_xform.next = NULL;
8417 ut_params->auth_xform.auth.algo = auth_alg;
8418 ut_params->auth_xform.auth.op = opa;
8419 ut_params->auth_xform.auth.key.data = auth_key;
8420 ut_params->auth_xform.auth.key.length = auth_key_len;
8421
8422 ut_params->cipher_xform.next = &ut_params->auth_xform;
8423 } else {
8424 ut_params->cipher_xform.next = NULL;
8425 }
8426
8427 struct rte_security_session_conf sess_conf = {
8428 .action_type = ut_params->type,
8429 .protocol = RTE_SECURITY_PROTOCOL_PDCP,
8430 {.pdcp = {
8431 .bearer = bearer,
8432 .domain = domain,
8433 .pkt_dir = packet_direction,
8434 .sn_size = sn_size,
8435 .hfn = packet_direction ? 0 : hfn,
8436 /**
8437 * hfn can be set as pdcp_test_hfn[i]
8438 * if hfn_ovrd is not set. Here, PDCP
8439 * packet direction is just used to
8440 * run half of the cases with session
8441 * HFN and other half with per packet
8442 * HFN.
8443 */
8444 .hfn_threshold = hfn_threshold,
8445 .hfn_ovrd = packet_direction ? 1 : 0,
8446 .sdap_enabled = sdap,
8447 } },
8448 .crypto_xform = &ut_params->cipher_xform
8449 };
8450
8451 /* Create security session */
8452 ut_params->sec_session = rte_security_session_create(ctx,
8453 &sess_conf, ts_params->session_mpool,
8454 ts_params->session_priv_mpool);
8455
8456 if (!ut_params->sec_session) {
8457 printf("TestCase %s()-%d line %d failed %s: ",
8458 __func__, i, __LINE__, "Failed to allocate session");
8459 ret = TEST_FAILED;
8460 goto on_err;
8461 }
8462
8463 /* Generate crypto op data structure */
8464 ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
8465 RTE_CRYPTO_OP_TYPE_SYMMETRIC);
8466 if (!ut_params->op) {
8467 printf("TestCase %s()-%d line %d failed %s: ",
8468 __func__, i, __LINE__,
8469 "Failed to allocate symmetric crypto operation struct");
8470 ret = TEST_FAILED;
8471 goto on_err;
8472 }
8473
8474 uint32_t *per_pkt_hfn = rte_crypto_op_ctod_offset(ut_params->op,
8475 uint32_t *, IV_OFFSET);
8476 *per_pkt_hfn = packet_direction ? hfn : 0;
8477
8478 rte_security_attach_session(ut_params->op, ut_params->sec_session);
8479
8480 /* set crypto operation source mbuf */
8481 ut_params->op->sym->m_src = ut_params->ibuf;
8482 if (oop)
8483 ut_params->op->sym->m_dst = ut_params->obuf;
8484
8485 /* Process crypto operation */
8486 if (process_crypto_request(ts_params->valid_devs[0], ut_params->op)
8487 == NULL) {
8488 printf("TestCase %s()-%d line %d failed %s: ",
8489 __func__, i, __LINE__,
8490 "failed to process sym crypto op");
8491 ret = TEST_FAILED;
8492 goto on_err;
8493 }
8494
8495 if (ut_params->op->status != RTE_CRYPTO_OP_STATUS_SUCCESS) {
8496 printf("TestCase %s()-%d line %d failed %s: ",
8497 __func__, i, __LINE__, "crypto op processing failed");
8498 ret = TEST_FAILED;
8499 goto on_err;
8500 }
8501
8502 /* Validate obuf */
8503 uint8_t *ciphertext = rte_pktmbuf_mtod(ut_params->op->sym->m_src,
8504 uint8_t *);
8505 if (oop) {
8506 ciphertext = rte_pktmbuf_mtod(ut_params->op->sym->m_dst,
8507 uint8_t *);
8508 }
8509
8510 if (memcmp(ciphertext, output_vec, output_vec_len)) {
8511 printf("\n=======PDCP TestCase #%d failed: Data Mismatch ", i);
8512 rte_hexdump(stdout, "encrypted", ciphertext, output_vec_len);
8513 rte_hexdump(stdout, "reference", output_vec, output_vec_len);
8514 ret = TEST_FAILED;
8515 goto on_err;
8516 }
8517
8518 on_err:
8519 rte_crypto_op_free(ut_params->op);
8520 ut_params->op = NULL;
8521
8522 if (ut_params->sec_session)
8523 rte_security_session_destroy(ctx, ut_params->sec_session);
8524 ut_params->sec_session = NULL;
8525
8526 rte_pktmbuf_free(ut_params->ibuf);
8527 ut_params->ibuf = NULL;
8528 if (oop) {
8529 rte_pktmbuf_free(ut_params->obuf);
8530 ut_params->obuf = NULL;
8531 }
8532
8533 return ret;
8534 }
8535
8536 static int
test_pdcp_proto_SGL(int i,int oop,enum rte_crypto_cipher_operation opc,enum rte_crypto_auth_operation opa,uint8_t * input_vec,unsigned int input_vec_len,uint8_t * output_vec,unsigned int output_vec_len,uint32_t fragsz,uint32_t fragsz_oop)8537 test_pdcp_proto_SGL(int i, int oop,
8538 enum rte_crypto_cipher_operation opc,
8539 enum rte_crypto_auth_operation opa,
8540 uint8_t *input_vec,
8541 unsigned int input_vec_len,
8542 uint8_t *output_vec,
8543 unsigned int output_vec_len,
8544 uint32_t fragsz,
8545 uint32_t fragsz_oop)
8546 {
8547 struct crypto_testsuite_params *ts_params = &testsuite_params;
8548 struct crypto_unittest_params *ut_params = &unittest_params;
8549 uint8_t *plaintext;
8550 struct rte_mbuf *buf, *buf_oop = NULL;
8551 int ret = TEST_SUCCESS;
8552 int to_trn = 0;
8553 int to_trn_tbl[16];
8554 int segs = 1;
8555 unsigned int trn_data = 0;
8556 struct rte_cryptodev_info dev_info;
8557 uint64_t feat_flags;
8558 struct rte_security_ctx *ctx = (struct rte_security_ctx *)
8559 rte_cryptodev_get_sec_ctx(
8560 ts_params->valid_devs[0]);
8561 struct rte_mbuf *temp_mbuf;
8562
8563 rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
8564 feat_flags = dev_info.feature_flags;
8565
8566 if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
8567 (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
8568 printf("Device does not support RAW data-path APIs.\n");
8569 return -ENOTSUP;
8570 }
8571 /* Verify the capabilities */
8572 struct rte_security_capability_idx sec_cap_idx;
8573
8574 sec_cap_idx.action = ut_params->type;
8575 sec_cap_idx.protocol = RTE_SECURITY_PROTOCOL_PDCP;
8576 sec_cap_idx.pdcp.domain = pdcp_test_params[i].domain;
8577 if (rte_security_capability_get(ctx, &sec_cap_idx) == NULL)
8578 return TEST_SKIPPED;
8579
8580 if (fragsz > input_vec_len)
8581 fragsz = input_vec_len;
8582
8583 uint16_t plaintext_len = fragsz;
8584 uint16_t frag_size_oop = fragsz_oop ? fragsz_oop : fragsz;
8585
8586 if (fragsz_oop > output_vec_len)
8587 frag_size_oop = output_vec_len;
8588
8589 int ecx = 0;
8590 if (input_vec_len % fragsz != 0) {
8591 if (input_vec_len / fragsz + 1 > 16)
8592 return 1;
8593 } else if (input_vec_len / fragsz > 16)
8594 return 1;
8595
8596 /* Out of place support */
8597 if (oop) {
8598 /*
8599 * For out-op-place we need to alloc another mbuf
8600 */
8601 ut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
8602 rte_pktmbuf_append(ut_params->obuf, frag_size_oop);
8603 buf_oop = ut_params->obuf;
8604 }
8605
8606 /* Generate test mbuf data */
8607 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
8608
8609 /* clear mbuf payload */
8610 memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
8611 rte_pktmbuf_tailroom(ut_params->ibuf));
8612
8613 plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
8614 plaintext_len);
8615 memcpy(plaintext, input_vec, plaintext_len);
8616 trn_data += plaintext_len;
8617
8618 buf = ut_params->ibuf;
8619
8620 /*
8621 * Loop until no more fragments
8622 */
8623
8624 while (trn_data < input_vec_len) {
8625 ++segs;
8626 to_trn = (input_vec_len - trn_data < fragsz) ?
8627 (input_vec_len - trn_data) : fragsz;
8628
8629 to_trn_tbl[ecx++] = to_trn;
8630
8631 buf->next = rte_pktmbuf_alloc(ts_params->mbuf_pool);
8632 buf = buf->next;
8633
8634 memset(rte_pktmbuf_mtod(buf, uint8_t *), 0,
8635 rte_pktmbuf_tailroom(buf));
8636
8637 /* OOP */
8638 if (oop && !fragsz_oop) {
8639 buf_oop->next =
8640 rte_pktmbuf_alloc(ts_params->mbuf_pool);
8641 buf_oop = buf_oop->next;
8642 memset(rte_pktmbuf_mtod(buf_oop, uint8_t *),
8643 0, rte_pktmbuf_tailroom(buf_oop));
8644 rte_pktmbuf_append(buf_oop, to_trn);
8645 }
8646
8647 plaintext = (uint8_t *)rte_pktmbuf_append(buf,
8648 to_trn);
8649
8650 memcpy(plaintext, input_vec + trn_data, to_trn);
8651 trn_data += to_trn;
8652 }
8653
8654 ut_params->ibuf->nb_segs = segs;
8655
8656 segs = 1;
8657 if (fragsz_oop && oop) {
8658 to_trn = 0;
8659 ecx = 0;
8660
8661 trn_data = frag_size_oop;
8662 while (trn_data < output_vec_len) {
8663 ++segs;
8664 to_trn =
8665 (output_vec_len - trn_data <
8666 frag_size_oop) ?
8667 (output_vec_len - trn_data) :
8668 frag_size_oop;
8669
8670 to_trn_tbl[ecx++] = to_trn;
8671
8672 buf_oop->next =
8673 rte_pktmbuf_alloc(ts_params->mbuf_pool);
8674 buf_oop = buf_oop->next;
8675 memset(rte_pktmbuf_mtod(buf_oop, uint8_t *),
8676 0, rte_pktmbuf_tailroom(buf_oop));
8677 rte_pktmbuf_append(buf_oop, to_trn);
8678
8679 trn_data += to_trn;
8680 }
8681 ut_params->obuf->nb_segs = segs;
8682 }
8683
8684 /* Setup Cipher Parameters */
8685 ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
8686 ut_params->cipher_xform.cipher.algo = pdcp_test_params[i].cipher_alg;
8687 ut_params->cipher_xform.cipher.op = opc;
8688 ut_params->cipher_xform.cipher.key.data = pdcp_test_crypto_key[i];
8689 ut_params->cipher_xform.cipher.key.length =
8690 pdcp_test_params[i].cipher_key_len;
8691 ut_params->cipher_xform.cipher.iv.length = 0;
8692
8693 /* Setup HMAC Parameters if ICV header is required */
8694 if (pdcp_test_params[i].auth_alg != 0) {
8695 ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;
8696 ut_params->auth_xform.next = NULL;
8697 ut_params->auth_xform.auth.algo = pdcp_test_params[i].auth_alg;
8698 ut_params->auth_xform.auth.op = opa;
8699 ut_params->auth_xform.auth.key.data = pdcp_test_auth_key[i];
8700 ut_params->auth_xform.auth.key.length =
8701 pdcp_test_params[i].auth_key_len;
8702
8703 ut_params->cipher_xform.next = &ut_params->auth_xform;
8704 } else {
8705 ut_params->cipher_xform.next = NULL;
8706 }
8707
8708 struct rte_security_session_conf sess_conf = {
8709 .action_type = ut_params->type,
8710 .protocol = RTE_SECURITY_PROTOCOL_PDCP,
8711 {.pdcp = {
8712 .bearer = pdcp_test_bearer[i],
8713 .domain = pdcp_test_params[i].domain,
8714 .pkt_dir = pdcp_test_packet_direction[i],
8715 .sn_size = pdcp_test_data_sn_size[i],
8716 .hfn = pdcp_test_hfn[i],
8717 .hfn_threshold = pdcp_test_hfn_threshold[i],
8718 .hfn_ovrd = 0,
8719 } },
8720 .crypto_xform = &ut_params->cipher_xform
8721 };
8722
8723 /* Create security session */
8724 ut_params->sec_session = rte_security_session_create(ctx,
8725 &sess_conf, ts_params->session_mpool,
8726 ts_params->session_priv_mpool);
8727
8728 if (!ut_params->sec_session) {
8729 printf("TestCase %s()-%d line %d failed %s: ",
8730 __func__, i, __LINE__, "Failed to allocate session");
8731 ret = TEST_FAILED;
8732 goto on_err;
8733 }
8734
8735 /* Generate crypto op data structure */
8736 ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
8737 RTE_CRYPTO_OP_TYPE_SYMMETRIC);
8738 if (!ut_params->op) {
8739 printf("TestCase %s()-%d line %d failed %s: ",
8740 __func__, i, __LINE__,
8741 "Failed to allocate symmetric crypto operation struct");
8742 ret = TEST_FAILED;
8743 goto on_err;
8744 }
8745
8746 rte_security_attach_session(ut_params->op, ut_params->sec_session);
8747
8748 /* set crypto operation source mbuf */
8749 ut_params->op->sym->m_src = ut_params->ibuf;
8750 if (oop)
8751 ut_params->op->sym->m_dst = ut_params->obuf;
8752
8753 /* Process crypto operation */
8754 temp_mbuf = ut_params->op->sym->m_src;
8755 if (global_api_test_type == CRYPTODEV_RAW_API_TEST) {
8756 /* filling lengths */
8757 while (temp_mbuf) {
8758 ut_params->op->sym->cipher.data.length
8759 += temp_mbuf->pkt_len;
8760 ut_params->op->sym->auth.data.length
8761 += temp_mbuf->pkt_len;
8762 temp_mbuf = temp_mbuf->next;
8763 }
8764 process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
8765 ut_params->op, 1, 1, 0, 0);
8766 } else {
8767 ut_params->op = process_crypto_request(ts_params->valid_devs[0],
8768 ut_params->op);
8769 }
8770 if (ut_params->op == NULL) {
8771 printf("TestCase %s()-%d line %d failed %s: ",
8772 __func__, i, __LINE__,
8773 "failed to process sym crypto op");
8774 ret = TEST_FAILED;
8775 goto on_err;
8776 }
8777
8778 if (ut_params->op->status != RTE_CRYPTO_OP_STATUS_SUCCESS) {
8779 printf("TestCase %s()-%d line %d failed %s: ",
8780 __func__, i, __LINE__, "crypto op processing failed");
8781 ret = TEST_FAILED;
8782 goto on_err;
8783 }
8784
8785 /* Validate obuf */
8786 uint8_t *ciphertext = rte_pktmbuf_mtod(ut_params->op->sym->m_src,
8787 uint8_t *);
8788 if (oop) {
8789 ciphertext = rte_pktmbuf_mtod(ut_params->op->sym->m_dst,
8790 uint8_t *);
8791 }
8792 if (fragsz_oop)
8793 fragsz = frag_size_oop;
8794 if (memcmp(ciphertext, output_vec, fragsz)) {
8795 printf("\n=======PDCP TestCase #%d failed: Data Mismatch ", i);
8796 rte_hexdump(stdout, "encrypted", ciphertext, fragsz);
8797 rte_hexdump(stdout, "reference", output_vec, fragsz);
8798 ret = TEST_FAILED;
8799 goto on_err;
8800 }
8801
8802 buf = ut_params->op->sym->m_src->next;
8803 if (oop)
8804 buf = ut_params->op->sym->m_dst->next;
8805
8806 unsigned int off = fragsz;
8807
8808 ecx = 0;
8809 while (buf) {
8810 ciphertext = rte_pktmbuf_mtod(buf,
8811 uint8_t *);
8812 if (memcmp(ciphertext, output_vec + off, to_trn_tbl[ecx])) {
8813 printf("\n=======PDCP TestCase #%d failed: Data Mismatch ", i);
8814 rte_hexdump(stdout, "encrypted", ciphertext, to_trn_tbl[ecx]);
8815 rte_hexdump(stdout, "reference", output_vec + off,
8816 to_trn_tbl[ecx]);
8817 ret = TEST_FAILED;
8818 goto on_err;
8819 }
8820 off += to_trn_tbl[ecx++];
8821 buf = buf->next;
8822 }
8823 on_err:
8824 rte_crypto_op_free(ut_params->op);
8825 ut_params->op = NULL;
8826
8827 if (ut_params->sec_session)
8828 rte_security_session_destroy(ctx, ut_params->sec_session);
8829 ut_params->sec_session = NULL;
8830
8831 rte_pktmbuf_free(ut_params->ibuf);
8832 ut_params->ibuf = NULL;
8833 if (oop) {
8834 rte_pktmbuf_free(ut_params->obuf);
8835 ut_params->obuf = NULL;
8836 }
8837
8838 return ret;
8839 }
8840
8841 int
test_pdcp_proto_cplane_encap(int i)8842 test_pdcp_proto_cplane_encap(int i)
8843 {
8844 return test_pdcp_proto(
8845 i, 0, RTE_CRYPTO_CIPHER_OP_ENCRYPT, RTE_CRYPTO_AUTH_OP_GENERATE,
8846 pdcp_test_data_in[i], pdcp_test_data_in_len[i],
8847 pdcp_test_data_out[i], pdcp_test_data_in_len[i] + 4,
8848 pdcp_test_params[i].cipher_alg, pdcp_test_crypto_key[i],
8849 pdcp_test_params[i].cipher_key_len,
8850 pdcp_test_params[i].auth_alg, pdcp_test_auth_key[i],
8851 pdcp_test_params[i].auth_key_len, pdcp_test_bearer[i],
8852 pdcp_test_params[i].domain, pdcp_test_packet_direction[i],
8853 pdcp_test_data_sn_size[i], pdcp_test_hfn[i],
8854 pdcp_test_hfn_threshold[i], SDAP_DISABLED);
8855 }
8856
8857 int
test_pdcp_proto_uplane_encap(int i)8858 test_pdcp_proto_uplane_encap(int i)
8859 {
8860 return test_pdcp_proto(
8861 i, 0, RTE_CRYPTO_CIPHER_OP_ENCRYPT, RTE_CRYPTO_AUTH_OP_GENERATE,
8862 pdcp_test_data_in[i], pdcp_test_data_in_len[i],
8863 pdcp_test_data_out[i], pdcp_test_data_in_len[i],
8864 pdcp_test_params[i].cipher_alg, pdcp_test_crypto_key[i],
8865 pdcp_test_params[i].cipher_key_len,
8866 pdcp_test_params[i].auth_alg, pdcp_test_auth_key[i],
8867 pdcp_test_params[i].auth_key_len, pdcp_test_bearer[i],
8868 pdcp_test_params[i].domain, pdcp_test_packet_direction[i],
8869 pdcp_test_data_sn_size[i], pdcp_test_hfn[i],
8870 pdcp_test_hfn_threshold[i], SDAP_DISABLED);
8871 }
8872
8873 int
test_pdcp_proto_uplane_encap_with_int(int i)8874 test_pdcp_proto_uplane_encap_with_int(int i)
8875 {
8876 return test_pdcp_proto(
8877 i, 0, RTE_CRYPTO_CIPHER_OP_ENCRYPT, RTE_CRYPTO_AUTH_OP_GENERATE,
8878 pdcp_test_data_in[i], pdcp_test_data_in_len[i],
8879 pdcp_test_data_out[i], pdcp_test_data_in_len[i] + 4,
8880 pdcp_test_params[i].cipher_alg, pdcp_test_crypto_key[i],
8881 pdcp_test_params[i].cipher_key_len,
8882 pdcp_test_params[i].auth_alg, pdcp_test_auth_key[i],
8883 pdcp_test_params[i].auth_key_len, pdcp_test_bearer[i],
8884 pdcp_test_params[i].domain, pdcp_test_packet_direction[i],
8885 pdcp_test_data_sn_size[i], pdcp_test_hfn[i],
8886 pdcp_test_hfn_threshold[i], SDAP_DISABLED);
8887 }
8888
8889 int
test_pdcp_proto_cplane_decap(int i)8890 test_pdcp_proto_cplane_decap(int i)
8891 {
8892 return test_pdcp_proto(
8893 i, 0, RTE_CRYPTO_CIPHER_OP_DECRYPT, RTE_CRYPTO_AUTH_OP_VERIFY,
8894 pdcp_test_data_out[i], pdcp_test_data_in_len[i] + 4,
8895 pdcp_test_data_in[i], pdcp_test_data_in_len[i],
8896 pdcp_test_params[i].cipher_alg, pdcp_test_crypto_key[i],
8897 pdcp_test_params[i].cipher_key_len,
8898 pdcp_test_params[i].auth_alg, pdcp_test_auth_key[i],
8899 pdcp_test_params[i].auth_key_len, pdcp_test_bearer[i],
8900 pdcp_test_params[i].domain, pdcp_test_packet_direction[i],
8901 pdcp_test_data_sn_size[i], pdcp_test_hfn[i],
8902 pdcp_test_hfn_threshold[i], SDAP_DISABLED);
8903 }
8904
8905 int
test_pdcp_proto_uplane_decap(int i)8906 test_pdcp_proto_uplane_decap(int i)
8907 {
8908 return test_pdcp_proto(
8909 i, 0, RTE_CRYPTO_CIPHER_OP_DECRYPT, RTE_CRYPTO_AUTH_OP_VERIFY,
8910 pdcp_test_data_out[i], pdcp_test_data_in_len[i],
8911 pdcp_test_data_in[i], pdcp_test_data_in_len[i],
8912 pdcp_test_params[i].cipher_alg, pdcp_test_crypto_key[i],
8913 pdcp_test_params[i].cipher_key_len,
8914 pdcp_test_params[i].auth_alg, pdcp_test_auth_key[i],
8915 pdcp_test_params[i].auth_key_len, pdcp_test_bearer[i],
8916 pdcp_test_params[i].domain, pdcp_test_packet_direction[i],
8917 pdcp_test_data_sn_size[i], pdcp_test_hfn[i],
8918 pdcp_test_hfn_threshold[i], SDAP_DISABLED);
8919 }
8920
8921 int
test_pdcp_proto_uplane_decap_with_int(int i)8922 test_pdcp_proto_uplane_decap_with_int(int i)
8923 {
8924 return test_pdcp_proto(
8925 i, 0, RTE_CRYPTO_CIPHER_OP_DECRYPT, RTE_CRYPTO_AUTH_OP_VERIFY,
8926 pdcp_test_data_out[i], pdcp_test_data_in_len[i] + 4,
8927 pdcp_test_data_in[i], pdcp_test_data_in_len[i],
8928 pdcp_test_params[i].cipher_alg, pdcp_test_crypto_key[i],
8929 pdcp_test_params[i].cipher_key_len,
8930 pdcp_test_params[i].auth_alg, pdcp_test_auth_key[i],
8931 pdcp_test_params[i].auth_key_len, pdcp_test_bearer[i],
8932 pdcp_test_params[i].domain, pdcp_test_packet_direction[i],
8933 pdcp_test_data_sn_size[i], pdcp_test_hfn[i],
8934 pdcp_test_hfn_threshold[i], SDAP_DISABLED);
8935 }
8936
8937 static int
test_PDCP_PROTO_SGL_in_place_32B(void)8938 test_PDCP_PROTO_SGL_in_place_32B(void)
8939 {
8940 /* i can be used for running any PDCP case
8941 * In this case it is uplane 12-bit AES-SNOW DL encap
8942 */
8943 int i = PDCP_UPLANE_12BIT_OFFSET + AES_ENC + SNOW_AUTH + DOWNLINK;
8944 return test_pdcp_proto_SGL(i, IN_PLACE,
8945 RTE_CRYPTO_CIPHER_OP_ENCRYPT,
8946 RTE_CRYPTO_AUTH_OP_GENERATE,
8947 pdcp_test_data_in[i],
8948 pdcp_test_data_in_len[i],
8949 pdcp_test_data_out[i],
8950 pdcp_test_data_in_len[i]+4,
8951 32, 0);
8952 }
8953 static int
test_PDCP_PROTO_SGL_oop_32B_128B(void)8954 test_PDCP_PROTO_SGL_oop_32B_128B(void)
8955 {
8956 /* i can be used for running any PDCP case
8957 * In this case it is uplane 18-bit NULL-NULL DL encap
8958 */
8959 int i = PDCP_UPLANE_18BIT_OFFSET + NULL_ENC + NULL_AUTH + DOWNLINK;
8960 return test_pdcp_proto_SGL(i, OUT_OF_PLACE,
8961 RTE_CRYPTO_CIPHER_OP_ENCRYPT,
8962 RTE_CRYPTO_AUTH_OP_GENERATE,
8963 pdcp_test_data_in[i],
8964 pdcp_test_data_in_len[i],
8965 pdcp_test_data_out[i],
8966 pdcp_test_data_in_len[i]+4,
8967 32, 128);
8968 }
8969 static int
test_PDCP_PROTO_SGL_oop_32B_40B(void)8970 test_PDCP_PROTO_SGL_oop_32B_40B(void)
8971 {
8972 /* i can be used for running any PDCP case
8973 * In this case it is uplane 18-bit AES DL encap
8974 */
8975 int i = PDCP_UPLANE_OFFSET + AES_ENC + EIGHTEEN_BIT_SEQ_NUM_OFFSET
8976 + DOWNLINK;
8977 return test_pdcp_proto_SGL(i, OUT_OF_PLACE,
8978 RTE_CRYPTO_CIPHER_OP_ENCRYPT,
8979 RTE_CRYPTO_AUTH_OP_GENERATE,
8980 pdcp_test_data_in[i],
8981 pdcp_test_data_in_len[i],
8982 pdcp_test_data_out[i],
8983 pdcp_test_data_in_len[i],
8984 32, 40);
8985 }
8986 static int
test_PDCP_PROTO_SGL_oop_128B_32B(void)8987 test_PDCP_PROTO_SGL_oop_128B_32B(void)
8988 {
8989 /* i can be used for running any PDCP case
8990 * In this case it is cplane 12-bit AES-ZUC DL encap
8991 */
8992 int i = PDCP_CPLANE_LONG_SN_OFFSET + AES_ENC + ZUC_AUTH + DOWNLINK;
8993 return test_pdcp_proto_SGL(i, OUT_OF_PLACE,
8994 RTE_CRYPTO_CIPHER_OP_ENCRYPT,
8995 RTE_CRYPTO_AUTH_OP_GENERATE,
8996 pdcp_test_data_in[i],
8997 pdcp_test_data_in_len[i],
8998 pdcp_test_data_out[i],
8999 pdcp_test_data_in_len[i]+4,
9000 128, 32);
9001 }
9002
9003 static int
test_PDCP_SDAP_PROTO_encap_all(void)9004 test_PDCP_SDAP_PROTO_encap_all(void)
9005 {
9006 int i = 0, size = 0;
9007 int err, all_err = TEST_SUCCESS;
9008 const struct pdcp_sdap_test *cur_test;
9009
9010 size = RTE_DIM(list_pdcp_sdap_tests);
9011
9012 for (i = 0; i < size; i++) {
9013 cur_test = &list_pdcp_sdap_tests[i];
9014 err = test_pdcp_proto(
9015 i, 0, RTE_CRYPTO_CIPHER_OP_ENCRYPT,
9016 RTE_CRYPTO_AUTH_OP_GENERATE, cur_test->data_in,
9017 cur_test->in_len, cur_test->data_out,
9018 cur_test->in_len + ((cur_test->auth_key) ? 4 : 0),
9019 cur_test->param.cipher_alg, cur_test->cipher_key,
9020 cur_test->param.cipher_key_len,
9021 cur_test->param.auth_alg,
9022 cur_test->auth_key, cur_test->param.auth_key_len,
9023 cur_test->bearer, cur_test->param.domain,
9024 cur_test->packet_direction, cur_test->sn_size,
9025 cur_test->hfn,
9026 cur_test->hfn_threshold, SDAP_ENABLED);
9027 if (err) {
9028 printf("\t%d) %s: Encapsulation failed\n",
9029 cur_test->test_idx,
9030 cur_test->param.name);
9031 err = TEST_FAILED;
9032 } else {
9033 printf("\t%d) %s: Encap PASS\n", cur_test->test_idx,
9034 cur_test->param.name);
9035 err = TEST_SUCCESS;
9036 }
9037 all_err += err;
9038 }
9039
9040 printf("Success: %d, Failure: %d\n", size + all_err, -all_err);
9041
9042 return (all_err == TEST_SUCCESS) ? TEST_SUCCESS : TEST_FAILED;
9043 }
9044
9045 static int
test_PDCP_PROTO_short_mac(void)9046 test_PDCP_PROTO_short_mac(void)
9047 {
9048 int i = 0, size = 0;
9049 int err, all_err = TEST_SUCCESS;
9050 const struct pdcp_short_mac_test *cur_test;
9051
9052 size = RTE_DIM(list_pdcp_smac_tests);
9053
9054 for (i = 0; i < size; i++) {
9055 cur_test = &list_pdcp_smac_tests[i];
9056 err = test_pdcp_proto(
9057 i, 0, RTE_CRYPTO_CIPHER_OP_ENCRYPT,
9058 RTE_CRYPTO_AUTH_OP_GENERATE, cur_test->data_in,
9059 cur_test->in_len, cur_test->data_out,
9060 cur_test->in_len + ((cur_test->auth_key) ? 4 : 0),
9061 RTE_CRYPTO_CIPHER_NULL, NULL,
9062 0, cur_test->param.auth_alg,
9063 cur_test->auth_key, cur_test->param.auth_key_len,
9064 0, cur_test->param.domain, 0, 0,
9065 0, 0, 0);
9066 if (err) {
9067 printf("\t%d) %s: Short MAC test failed\n",
9068 cur_test->test_idx,
9069 cur_test->param.name);
9070 err = TEST_FAILED;
9071 } else {
9072 printf("\t%d) %s: Short MAC test PASS\n",
9073 cur_test->test_idx,
9074 cur_test->param.name);
9075 rte_hexdump(stdout, "MAC I",
9076 cur_test->data_out + cur_test->in_len + 2,
9077 2);
9078 err = TEST_SUCCESS;
9079 }
9080 all_err += err;
9081 }
9082
9083 printf("Success: %d, Failure: %d\n", size + all_err, -all_err);
9084
9085 return (all_err == TEST_SUCCESS) ? TEST_SUCCESS : TEST_FAILED;
9086
9087 }
9088
9089 static int
test_PDCP_SDAP_PROTO_decap_all(void)9090 test_PDCP_SDAP_PROTO_decap_all(void)
9091 {
9092 int i = 0, size = 0;
9093 int err, all_err = TEST_SUCCESS;
9094 const struct pdcp_sdap_test *cur_test;
9095
9096 size = RTE_DIM(list_pdcp_sdap_tests);
9097
9098 for (i = 0; i < size; i++) {
9099 cur_test = &list_pdcp_sdap_tests[i];
9100 err = test_pdcp_proto(
9101 i, 0, RTE_CRYPTO_CIPHER_OP_DECRYPT,
9102 RTE_CRYPTO_AUTH_OP_VERIFY,
9103 cur_test->data_out,
9104 cur_test->in_len + ((cur_test->auth_key) ? 4 : 0),
9105 cur_test->data_in, cur_test->in_len,
9106 cur_test->param.cipher_alg,
9107 cur_test->cipher_key, cur_test->param.cipher_key_len,
9108 cur_test->param.auth_alg, cur_test->auth_key,
9109 cur_test->param.auth_key_len, cur_test->bearer,
9110 cur_test->param.domain, cur_test->packet_direction,
9111 cur_test->sn_size, cur_test->hfn,
9112 cur_test->hfn_threshold, SDAP_ENABLED);
9113 if (err) {
9114 printf("\t%d) %s: Decapsulation failed\n",
9115 cur_test->test_idx,
9116 cur_test->param.name);
9117 err = TEST_FAILED;
9118 } else {
9119 printf("\t%d) %s: Decap PASS\n", cur_test->test_idx,
9120 cur_test->param.name);
9121 err = TEST_SUCCESS;
9122 }
9123 all_err += err;
9124 }
9125
9126 printf("Success: %d, Failure: %d\n", size + all_err, -all_err);
9127
9128 return (all_err == TEST_SUCCESS) ? TEST_SUCCESS : TEST_FAILED;
9129 }
9130
9131 static int
test_ipsec_proto_process(const struct ipsec_test_data td[],struct ipsec_test_data res_d[],int nb_td,bool silent,const struct ipsec_test_flags * flags)9132 test_ipsec_proto_process(const struct ipsec_test_data td[],
9133 struct ipsec_test_data res_d[],
9134 int nb_td,
9135 bool silent,
9136 const struct ipsec_test_flags *flags)
9137 {
9138 uint16_t v6_src[8] = {0x2607, 0xf8b0, 0x400c, 0x0c03, 0x0000, 0x0000,
9139 0x0000, 0x001a};
9140 uint16_t v6_dst[8] = {0x2001, 0x0470, 0xe5bf, 0xdead, 0x4957, 0x2174,
9141 0xe82c, 0x4887};
9142 const struct rte_ipv4_hdr *ipv4 =
9143 (const struct rte_ipv4_hdr *)td[0].output_text.data;
9144 struct crypto_testsuite_params *ts_params = &testsuite_params;
9145 struct crypto_unittest_params *ut_params = &unittest_params;
9146 struct rte_security_capability_idx sec_cap_idx;
9147 const struct rte_security_capability *sec_cap;
9148 struct rte_security_ipsec_xform ipsec_xform;
9149 uint8_t dev_id = ts_params->valid_devs[0];
9150 enum rte_security_ipsec_sa_direction dir;
9151 struct ipsec_test_data *res_d_tmp = NULL;
9152 int salt_len, i, ret = TEST_SUCCESS;
9153 struct rte_security_ctx *ctx;
9154 uint8_t *input_text;
9155 uint32_t src, dst;
9156 uint32_t verify;
9157
9158 ut_params->type = RTE_SECURITY_ACTION_TYPE_LOOKASIDE_PROTOCOL;
9159 gbl_action_type = RTE_SECURITY_ACTION_TYPE_LOOKASIDE_PROTOCOL;
9160
9161 /* Use first test data to create session */
9162
9163 /* Copy IPsec xform */
9164 memcpy(&ipsec_xform, &td[0].ipsec_xform, sizeof(ipsec_xform));
9165
9166 dir = ipsec_xform.direction;
9167 verify = flags->tunnel_hdr_verify;
9168
9169 memcpy(&src, &ipv4->src_addr, sizeof(ipv4->src_addr));
9170 memcpy(&dst, &ipv4->dst_addr, sizeof(ipv4->dst_addr));
9171
9172 if ((dir == RTE_SECURITY_IPSEC_SA_DIR_INGRESS) && verify) {
9173 if (verify == RTE_SECURITY_IPSEC_TUNNEL_VERIFY_SRC_DST_ADDR)
9174 src += 1;
9175 else if (verify == RTE_SECURITY_IPSEC_TUNNEL_VERIFY_DST_ADDR)
9176 dst += 1;
9177 }
9178
9179 if (td->ipsec_xform.mode == RTE_SECURITY_IPSEC_SA_MODE_TUNNEL) {
9180 if (td->ipsec_xform.tunnel.type ==
9181 RTE_SECURITY_IPSEC_TUNNEL_IPV4) {
9182 memcpy(&ipsec_xform.tunnel.ipv4.src_ip, &src,
9183 sizeof(src));
9184 memcpy(&ipsec_xform.tunnel.ipv4.dst_ip, &dst,
9185 sizeof(dst));
9186
9187 if (flags->df == TEST_IPSEC_SET_DF_0_INNER_1)
9188 ipsec_xform.tunnel.ipv4.df = 0;
9189
9190 if (flags->df == TEST_IPSEC_SET_DF_1_INNER_0)
9191 ipsec_xform.tunnel.ipv4.df = 1;
9192
9193 if (flags->dscp == TEST_IPSEC_SET_DSCP_0_INNER_1)
9194 ipsec_xform.tunnel.ipv4.dscp = 0;
9195
9196 if (flags->dscp == TEST_IPSEC_SET_DSCP_1_INNER_0)
9197 ipsec_xform.tunnel.ipv4.dscp =
9198 TEST_IPSEC_DSCP_VAL;
9199
9200 } else {
9201 if (flags->dscp == TEST_IPSEC_SET_DSCP_0_INNER_1)
9202 ipsec_xform.tunnel.ipv6.dscp = 0;
9203
9204 if (flags->dscp == TEST_IPSEC_SET_DSCP_1_INNER_0)
9205 ipsec_xform.tunnel.ipv6.dscp =
9206 TEST_IPSEC_DSCP_VAL;
9207
9208 memcpy(&ipsec_xform.tunnel.ipv6.src_addr, &v6_src,
9209 sizeof(v6_src));
9210 memcpy(&ipsec_xform.tunnel.ipv6.dst_addr, &v6_dst,
9211 sizeof(v6_dst));
9212 }
9213 }
9214
9215 ctx = rte_cryptodev_get_sec_ctx(dev_id);
9216
9217 sec_cap_idx.action = ut_params->type;
9218 sec_cap_idx.protocol = RTE_SECURITY_PROTOCOL_IPSEC;
9219 sec_cap_idx.ipsec.proto = ipsec_xform.proto;
9220 sec_cap_idx.ipsec.mode = ipsec_xform.mode;
9221 sec_cap_idx.ipsec.direction = ipsec_xform.direction;
9222
9223 if (flags->udp_encap)
9224 ipsec_xform.options.udp_encap = 1;
9225
9226 sec_cap = rte_security_capability_get(ctx, &sec_cap_idx);
9227 if (sec_cap == NULL)
9228 return TEST_SKIPPED;
9229
9230 /* Copy cipher session parameters */
9231 if (td[0].aead) {
9232 memcpy(&ut_params->aead_xform, &td[0].xform.aead,
9233 sizeof(ut_params->aead_xform));
9234 ut_params->aead_xform.aead.key.data = td[0].key.data;
9235 ut_params->aead_xform.aead.iv.offset = IV_OFFSET;
9236
9237 /* Verify crypto capabilities */
9238 if (test_ipsec_crypto_caps_aead_verify(
9239 sec_cap,
9240 &ut_params->aead_xform) != 0) {
9241 if (!silent)
9242 RTE_LOG(INFO, USER1,
9243 "Crypto capabilities not supported\n");
9244 return TEST_SKIPPED;
9245 }
9246 } else if (td[0].auth_only) {
9247 memcpy(&ut_params->auth_xform, &td[0].xform.chain.auth,
9248 sizeof(ut_params->auth_xform));
9249 ut_params->auth_xform.auth.key.data = td[0].auth_key.data;
9250
9251 if (test_ipsec_crypto_caps_auth_verify(
9252 sec_cap,
9253 &ut_params->auth_xform) != 0) {
9254 if (!silent)
9255 RTE_LOG(INFO, USER1,
9256 "Auth crypto capabilities not supported\n");
9257 return TEST_SKIPPED;
9258 }
9259 } else {
9260 memcpy(&ut_params->cipher_xform, &td[0].xform.chain.cipher,
9261 sizeof(ut_params->cipher_xform));
9262 memcpy(&ut_params->auth_xform, &td[0].xform.chain.auth,
9263 sizeof(ut_params->auth_xform));
9264 ut_params->cipher_xform.cipher.key.data = td[0].key.data;
9265 ut_params->cipher_xform.cipher.iv.offset = IV_OFFSET;
9266 ut_params->auth_xform.auth.key.data = td[0].auth_key.data;
9267
9268 /* Verify crypto capabilities */
9269
9270 if (test_ipsec_crypto_caps_cipher_verify(
9271 sec_cap,
9272 &ut_params->cipher_xform) != 0) {
9273 if (!silent)
9274 RTE_LOG(INFO, USER1,
9275 "Cipher crypto capabilities not supported\n");
9276 return TEST_SKIPPED;
9277 }
9278
9279 if (test_ipsec_crypto_caps_auth_verify(
9280 sec_cap,
9281 &ut_params->auth_xform) != 0) {
9282 if (!silent)
9283 RTE_LOG(INFO, USER1,
9284 "Auth crypto capabilities not supported\n");
9285 return TEST_SKIPPED;
9286 }
9287 }
9288
9289 if (test_ipsec_sec_caps_verify(&ipsec_xform, sec_cap, silent) != 0)
9290 return TEST_SKIPPED;
9291
9292 struct rte_security_session_conf sess_conf = {
9293 .action_type = ut_params->type,
9294 .protocol = RTE_SECURITY_PROTOCOL_IPSEC,
9295 };
9296
9297 if (td[0].aead || td[0].aes_gmac) {
9298 salt_len = RTE_MIN(sizeof(ipsec_xform.salt), td[0].salt.len);
9299 memcpy(&ipsec_xform.salt, td[0].salt.data, salt_len);
9300 }
9301
9302 if (td[0].aead) {
9303 sess_conf.ipsec = ipsec_xform;
9304 sess_conf.crypto_xform = &ut_params->aead_xform;
9305 } else if (td[0].auth_only) {
9306 sess_conf.ipsec = ipsec_xform;
9307 sess_conf.crypto_xform = &ut_params->auth_xform;
9308 } else {
9309 sess_conf.ipsec = ipsec_xform;
9310 if (dir == RTE_SECURITY_IPSEC_SA_DIR_EGRESS) {
9311 sess_conf.crypto_xform = &ut_params->cipher_xform;
9312 ut_params->cipher_xform.next = &ut_params->auth_xform;
9313 } else {
9314 sess_conf.crypto_xform = &ut_params->auth_xform;
9315 ut_params->auth_xform.next = &ut_params->cipher_xform;
9316 }
9317 }
9318
9319 /* Create security session */
9320 ut_params->sec_session = rte_security_session_create(ctx, &sess_conf,
9321 ts_params->session_mpool,
9322 ts_params->session_priv_mpool);
9323
9324 if (ut_params->sec_session == NULL)
9325 return TEST_SKIPPED;
9326
9327 for (i = 0; i < nb_td; i++) {
9328 if (flags->antireplay &&
9329 (dir == RTE_SECURITY_IPSEC_SA_DIR_EGRESS)) {
9330 sess_conf.ipsec.esn.value = td[i].ipsec_xform.esn.value;
9331 ret = rte_security_session_update(ctx,
9332 ut_params->sec_session, &sess_conf);
9333 if (ret) {
9334 printf("Could not update sequence number in "
9335 "session\n");
9336 return TEST_SKIPPED;
9337 }
9338 }
9339
9340 /* Setup source mbuf payload */
9341 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
9342 memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
9343 rte_pktmbuf_tailroom(ut_params->ibuf));
9344
9345 input_text = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
9346 td[i].input_text.len);
9347
9348 memcpy(input_text, td[i].input_text.data,
9349 td[i].input_text.len);
9350
9351 if (test_ipsec_pkt_update(input_text, flags))
9352 return TEST_FAILED;
9353
9354 /* Generate crypto op data structure */
9355 ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
9356 RTE_CRYPTO_OP_TYPE_SYMMETRIC);
9357 if (!ut_params->op) {
9358 printf("TestCase %s line %d: %s\n",
9359 __func__, __LINE__,
9360 "failed to allocate crypto op");
9361 ret = TEST_FAILED;
9362 goto crypto_op_free;
9363 }
9364
9365 /* Attach session to operation */
9366 rte_security_attach_session(ut_params->op,
9367 ut_params->sec_session);
9368
9369 /* Set crypto operation mbufs */
9370 ut_params->op->sym->m_src = ut_params->ibuf;
9371 ut_params->op->sym->m_dst = NULL;
9372
9373 /* Copy IV in crypto operation when IV generation is disabled */
9374 if (dir == RTE_SECURITY_IPSEC_SA_DIR_EGRESS &&
9375 ipsec_xform.options.iv_gen_disable == 1) {
9376 uint8_t *iv = rte_crypto_op_ctod_offset(ut_params->op,
9377 uint8_t *,
9378 IV_OFFSET);
9379 int len;
9380
9381 if (td[i].aead)
9382 len = td[i].xform.aead.aead.iv.length;
9383 else if (td[i].aes_gmac)
9384 len = td[i].xform.chain.auth.auth.iv.length;
9385 else
9386 len = td[i].xform.chain.cipher.cipher.iv.length;
9387
9388 memcpy(iv, td[i].iv.data, len);
9389 }
9390
9391 /* Process crypto operation */
9392 process_crypto_request(dev_id, ut_params->op);
9393
9394 ret = test_ipsec_status_check(&td[i], ut_params->op, flags, dir,
9395 i + 1);
9396 if (ret != TEST_SUCCESS)
9397 goto crypto_op_free;
9398
9399 if (res_d != NULL)
9400 res_d_tmp = &res_d[i];
9401
9402 ret = test_ipsec_post_process(ut_params->ibuf, &td[i],
9403 res_d_tmp, silent, flags);
9404 if (ret != TEST_SUCCESS)
9405 goto crypto_op_free;
9406
9407 ret = test_ipsec_stats_verify(ctx, ut_params->sec_session,
9408 flags, dir);
9409 if (ret != TEST_SUCCESS)
9410 goto crypto_op_free;
9411
9412 rte_crypto_op_free(ut_params->op);
9413 ut_params->op = NULL;
9414
9415 rte_pktmbuf_free(ut_params->ibuf);
9416 ut_params->ibuf = NULL;
9417 }
9418
9419 crypto_op_free:
9420 rte_crypto_op_free(ut_params->op);
9421 ut_params->op = NULL;
9422
9423 rte_pktmbuf_free(ut_params->ibuf);
9424 ut_params->ibuf = NULL;
9425
9426 if (ut_params->sec_session)
9427 rte_security_session_destroy(ctx, ut_params->sec_session);
9428 ut_params->sec_session = NULL;
9429
9430 return ret;
9431 }
9432
9433 static int
test_ipsec_proto_known_vec(const void * test_data)9434 test_ipsec_proto_known_vec(const void *test_data)
9435 {
9436 struct ipsec_test_data td_outb;
9437 struct ipsec_test_flags flags;
9438
9439 memset(&flags, 0, sizeof(flags));
9440
9441 memcpy(&td_outb, test_data, sizeof(td_outb));
9442
9443 if (td_outb.aes_gmac || td_outb.aead ||
9444 ((td_outb.ipsec_xform.proto != RTE_SECURITY_IPSEC_SA_PROTO_AH) &&
9445 (td_outb.xform.chain.cipher.cipher.algo != RTE_CRYPTO_CIPHER_NULL))) {
9446 /* Disable IV gen to be able to test with known vectors */
9447 td_outb.ipsec_xform.options.iv_gen_disable = 1;
9448 }
9449
9450 return test_ipsec_proto_process(&td_outb, NULL, 1, false, &flags);
9451 }
9452
9453 static int
test_ipsec_proto_known_vec_inb(const void * test_data)9454 test_ipsec_proto_known_vec_inb(const void *test_data)
9455 {
9456 const struct ipsec_test_data *td = test_data;
9457 struct ipsec_test_flags flags;
9458 struct ipsec_test_data td_inb;
9459
9460 memset(&flags, 0, sizeof(flags));
9461
9462 if (td->ipsec_xform.direction == RTE_SECURITY_IPSEC_SA_DIR_EGRESS)
9463 test_ipsec_td_in_from_out(td, &td_inb);
9464 else
9465 memcpy(&td_inb, td, sizeof(td_inb));
9466
9467 return test_ipsec_proto_process(&td_inb, NULL, 1, false, &flags);
9468 }
9469
9470 static int
test_ipsec_proto_known_vec_fragmented(const void * test_data)9471 test_ipsec_proto_known_vec_fragmented(const void *test_data)
9472 {
9473 struct ipsec_test_data td_outb;
9474 struct ipsec_test_flags flags;
9475
9476 memset(&flags, 0, sizeof(flags));
9477 flags.fragment = true;
9478
9479 memcpy(&td_outb, test_data, sizeof(td_outb));
9480
9481 /* Disable IV gen to be able to test with known vectors */
9482 td_outb.ipsec_xform.options.iv_gen_disable = 1;
9483
9484 return test_ipsec_proto_process(&td_outb, NULL, 1, false, &flags);
9485 }
9486
9487 static int
test_ipsec_proto_all(const struct ipsec_test_flags * flags)9488 test_ipsec_proto_all(const struct ipsec_test_flags *flags)
9489 {
9490 struct ipsec_test_data td_outb[IPSEC_TEST_PACKETS_MAX];
9491 struct ipsec_test_data td_inb[IPSEC_TEST_PACKETS_MAX];
9492 unsigned int i, nb_pkts = 1, pass_cnt = 0;
9493 int ret;
9494
9495 if (flags->iv_gen ||
9496 flags->sa_expiry_pkts_soft ||
9497 flags->sa_expiry_pkts_hard)
9498 nb_pkts = IPSEC_TEST_PACKETS_MAX;
9499
9500 for (i = 0; i < RTE_DIM(alg_list); i++) {
9501 test_ipsec_td_prepare(alg_list[i].param1,
9502 alg_list[i].param2,
9503 flags,
9504 td_outb,
9505 nb_pkts);
9506
9507 if (!td_outb->aead) {
9508 enum rte_crypto_cipher_algorithm cipher_alg;
9509 enum rte_crypto_auth_algorithm auth_alg;
9510
9511 cipher_alg = td_outb->xform.chain.cipher.cipher.algo;
9512 auth_alg = td_outb->xform.chain.auth.auth.algo;
9513
9514 if (td_outb->aes_gmac && cipher_alg != RTE_CRYPTO_CIPHER_NULL)
9515 continue;
9516
9517 /* ICV is not applicable for NULL auth */
9518 if (flags->icv_corrupt &&
9519 auth_alg == RTE_CRYPTO_AUTH_NULL)
9520 continue;
9521
9522 /* IV is not applicable for NULL cipher */
9523 if (flags->iv_gen &&
9524 cipher_alg == RTE_CRYPTO_CIPHER_NULL)
9525 continue;
9526 }
9527
9528 ret = test_ipsec_proto_process(td_outb, td_inb, nb_pkts, true,
9529 flags);
9530 if (ret == TEST_SKIPPED)
9531 continue;
9532
9533 if (ret == TEST_FAILED)
9534 return TEST_FAILED;
9535
9536 test_ipsec_td_update(td_inb, td_outb, nb_pkts, flags);
9537
9538 ret = test_ipsec_proto_process(td_inb, NULL, nb_pkts, true,
9539 flags);
9540 if (ret == TEST_SKIPPED)
9541 continue;
9542
9543 if (ret == TEST_FAILED)
9544 return TEST_FAILED;
9545
9546 if (flags->display_alg)
9547 test_ipsec_display_alg(alg_list[i].param1,
9548 alg_list[i].param2);
9549
9550 pass_cnt++;
9551 }
9552
9553 if (pass_cnt > 0)
9554 return TEST_SUCCESS;
9555 else
9556 return TEST_SKIPPED;
9557 }
9558
9559 static int
test_ipsec_ah_proto_all(const struct ipsec_test_flags * flags)9560 test_ipsec_ah_proto_all(const struct ipsec_test_flags *flags)
9561 {
9562 struct ipsec_test_data td_outb[IPSEC_TEST_PACKETS_MAX];
9563 struct ipsec_test_data td_inb[IPSEC_TEST_PACKETS_MAX];
9564 unsigned int i, nb_pkts = 1, pass_cnt = 0;
9565 int ret;
9566
9567 for (i = 0; i < RTE_DIM(ah_alg_list); i++) {
9568 test_ipsec_td_prepare(ah_alg_list[i].param1,
9569 ah_alg_list[i].param2,
9570 flags,
9571 td_outb,
9572 nb_pkts);
9573
9574 ret = test_ipsec_proto_process(td_outb, td_inb, nb_pkts, true,
9575 flags);
9576 if (ret == TEST_SKIPPED)
9577 continue;
9578
9579 if (ret == TEST_FAILED)
9580 return TEST_FAILED;
9581
9582 test_ipsec_td_update(td_inb, td_outb, nb_pkts, flags);
9583
9584 ret = test_ipsec_proto_process(td_inb, NULL, nb_pkts, true,
9585 flags);
9586 if (ret == TEST_SKIPPED)
9587 continue;
9588
9589 if (ret == TEST_FAILED)
9590 return TEST_FAILED;
9591
9592 if (flags->display_alg)
9593 test_ipsec_display_alg(ah_alg_list[i].param1,
9594 ah_alg_list[i].param2);
9595
9596 pass_cnt++;
9597 }
9598
9599 if (pass_cnt > 0)
9600 return TEST_SUCCESS;
9601 else
9602 return TEST_SKIPPED;
9603 }
9604
9605 static int
test_ipsec_proto_display_list(const void * data __rte_unused)9606 test_ipsec_proto_display_list(const void *data __rte_unused)
9607 {
9608 struct ipsec_test_flags flags;
9609
9610 memset(&flags, 0, sizeof(flags));
9611
9612 flags.display_alg = true;
9613
9614 return test_ipsec_proto_all(&flags);
9615 }
9616
9617 static int
test_ipsec_proto_ah_tunnel_ipv4(const void * data __rte_unused)9618 test_ipsec_proto_ah_tunnel_ipv4(const void *data __rte_unused)
9619 {
9620 struct ipsec_test_flags flags;
9621
9622 memset(&flags, 0, sizeof(flags));
9623
9624 flags.ah = true;
9625 flags.display_alg = true;
9626
9627 return test_ipsec_ah_proto_all(&flags);
9628 }
9629
9630 static int
test_ipsec_proto_ah_transport_ipv4(const void * data __rte_unused)9631 test_ipsec_proto_ah_transport_ipv4(const void *data __rte_unused)
9632 {
9633 struct ipsec_test_flags flags;
9634
9635 memset(&flags, 0, sizeof(flags));
9636
9637 flags.ah = true;
9638 flags.transport = true;
9639
9640 return test_ipsec_ah_proto_all(&flags);
9641 }
9642
9643 static int
test_ipsec_proto_iv_gen(const void * data __rte_unused)9644 test_ipsec_proto_iv_gen(const void *data __rte_unused)
9645 {
9646 struct ipsec_test_flags flags;
9647
9648 memset(&flags, 0, sizeof(flags));
9649
9650 flags.iv_gen = true;
9651
9652 return test_ipsec_proto_all(&flags);
9653 }
9654
9655 static int
test_ipsec_proto_sa_exp_pkts_soft(const void * data __rte_unused)9656 test_ipsec_proto_sa_exp_pkts_soft(const void *data __rte_unused)
9657 {
9658 struct ipsec_test_flags flags;
9659
9660 memset(&flags, 0, sizeof(flags));
9661
9662 flags.sa_expiry_pkts_soft = true;
9663
9664 return test_ipsec_proto_all(&flags);
9665 }
9666
9667 static int
test_ipsec_proto_sa_exp_pkts_hard(const void * data __rte_unused)9668 test_ipsec_proto_sa_exp_pkts_hard(const void *data __rte_unused)
9669 {
9670 struct ipsec_test_flags flags;
9671
9672 memset(&flags, 0, sizeof(flags));
9673
9674 flags.sa_expiry_pkts_hard = true;
9675
9676 return test_ipsec_proto_all(&flags);
9677 }
9678
9679 static int
test_ipsec_proto_err_icv_corrupt(const void * data __rte_unused)9680 test_ipsec_proto_err_icv_corrupt(const void *data __rte_unused)
9681 {
9682 struct ipsec_test_flags flags;
9683
9684 memset(&flags, 0, sizeof(flags));
9685
9686 flags.icv_corrupt = true;
9687
9688 return test_ipsec_proto_all(&flags);
9689 }
9690
9691 static int
test_ipsec_proto_udp_encap(const void * data __rte_unused)9692 test_ipsec_proto_udp_encap(const void *data __rte_unused)
9693 {
9694 struct ipsec_test_flags flags;
9695
9696 memset(&flags, 0, sizeof(flags));
9697
9698 flags.udp_encap = true;
9699
9700 return test_ipsec_proto_all(&flags);
9701 }
9702
9703 static int
test_ipsec_proto_tunnel_src_dst_addr_verify(const void * data __rte_unused)9704 test_ipsec_proto_tunnel_src_dst_addr_verify(const void *data __rte_unused)
9705 {
9706 struct ipsec_test_flags flags;
9707
9708 memset(&flags, 0, sizeof(flags));
9709
9710 flags.tunnel_hdr_verify = RTE_SECURITY_IPSEC_TUNNEL_VERIFY_SRC_DST_ADDR;
9711
9712 return test_ipsec_proto_all(&flags);
9713 }
9714
9715 static int
test_ipsec_proto_tunnel_dst_addr_verify(const void * data __rte_unused)9716 test_ipsec_proto_tunnel_dst_addr_verify(const void *data __rte_unused)
9717 {
9718 struct ipsec_test_flags flags;
9719
9720 memset(&flags, 0, sizeof(flags));
9721
9722 flags.tunnel_hdr_verify = RTE_SECURITY_IPSEC_TUNNEL_VERIFY_DST_ADDR;
9723
9724 return test_ipsec_proto_all(&flags);
9725 }
9726
9727 static int
test_ipsec_proto_udp_ports_verify(const void * data __rte_unused)9728 test_ipsec_proto_udp_ports_verify(const void *data __rte_unused)
9729 {
9730 struct ipsec_test_flags flags;
9731
9732 memset(&flags, 0, sizeof(flags));
9733
9734 flags.udp_encap = true;
9735 flags.udp_ports_verify = true;
9736
9737 return test_ipsec_proto_all(&flags);
9738 }
9739
9740 static int
test_ipsec_proto_inner_ip_csum(const void * data __rte_unused)9741 test_ipsec_proto_inner_ip_csum(const void *data __rte_unused)
9742 {
9743 struct ipsec_test_flags flags;
9744
9745 memset(&flags, 0, sizeof(flags));
9746
9747 flags.ip_csum = true;
9748
9749 return test_ipsec_proto_all(&flags);
9750 }
9751
9752 static int
test_ipsec_proto_inner_l4_csum(const void * data __rte_unused)9753 test_ipsec_proto_inner_l4_csum(const void *data __rte_unused)
9754 {
9755 struct ipsec_test_flags flags;
9756
9757 memset(&flags, 0, sizeof(flags));
9758
9759 flags.l4_csum = true;
9760
9761 return test_ipsec_proto_all(&flags);
9762 }
9763
9764 static int
test_ipsec_proto_tunnel_v4_in_v4(const void * data __rte_unused)9765 test_ipsec_proto_tunnel_v4_in_v4(const void *data __rte_unused)
9766 {
9767 struct ipsec_test_flags flags;
9768
9769 memset(&flags, 0, sizeof(flags));
9770
9771 flags.ipv6 = false;
9772 flags.tunnel_ipv6 = false;
9773
9774 return test_ipsec_proto_all(&flags);
9775 }
9776
9777 static int
test_ipsec_proto_tunnel_v6_in_v6(const void * data __rte_unused)9778 test_ipsec_proto_tunnel_v6_in_v6(const void *data __rte_unused)
9779 {
9780 struct ipsec_test_flags flags;
9781
9782 memset(&flags, 0, sizeof(flags));
9783
9784 flags.ipv6 = true;
9785 flags.tunnel_ipv6 = true;
9786
9787 return test_ipsec_proto_all(&flags);
9788 }
9789
9790 static int
test_ipsec_proto_tunnel_v4_in_v6(const void * data __rte_unused)9791 test_ipsec_proto_tunnel_v4_in_v6(const void *data __rte_unused)
9792 {
9793 struct ipsec_test_flags flags;
9794
9795 memset(&flags, 0, sizeof(flags));
9796
9797 flags.ipv6 = false;
9798 flags.tunnel_ipv6 = true;
9799
9800 return test_ipsec_proto_all(&flags);
9801 }
9802
9803 static int
test_ipsec_proto_tunnel_v6_in_v4(const void * data __rte_unused)9804 test_ipsec_proto_tunnel_v6_in_v4(const void *data __rte_unused)
9805 {
9806 struct ipsec_test_flags flags;
9807
9808 memset(&flags, 0, sizeof(flags));
9809
9810 flags.ipv6 = true;
9811 flags.tunnel_ipv6 = false;
9812
9813 return test_ipsec_proto_all(&flags);
9814 }
9815
9816 static int
test_ipsec_proto_transport_v4(const void * data __rte_unused)9817 test_ipsec_proto_transport_v4(const void *data __rte_unused)
9818 {
9819 struct ipsec_test_flags flags;
9820
9821 memset(&flags, 0, sizeof(flags));
9822
9823 flags.ipv6 = false;
9824 flags.transport = true;
9825
9826 return test_ipsec_proto_all(&flags);
9827 }
9828
9829 static int
test_ipsec_proto_transport_l4_csum(const void * data __rte_unused)9830 test_ipsec_proto_transport_l4_csum(const void *data __rte_unused)
9831 {
9832 struct ipsec_test_flags flags = {
9833 .l4_csum = true,
9834 .transport = true,
9835 };
9836
9837 return test_ipsec_proto_all(&flags);
9838 }
9839
9840 static int
test_ipsec_proto_stats(const void * data __rte_unused)9841 test_ipsec_proto_stats(const void *data __rte_unused)
9842 {
9843 struct ipsec_test_flags flags;
9844
9845 memset(&flags, 0, sizeof(flags));
9846
9847 flags.stats_success = true;
9848
9849 return test_ipsec_proto_all(&flags);
9850 }
9851
9852 static int
test_ipsec_proto_pkt_fragment(const void * data __rte_unused)9853 test_ipsec_proto_pkt_fragment(const void *data __rte_unused)
9854 {
9855 struct ipsec_test_flags flags;
9856
9857 memset(&flags, 0, sizeof(flags));
9858
9859 flags.fragment = true;
9860
9861 return test_ipsec_proto_all(&flags);
9862
9863 }
9864
9865 static int
test_ipsec_proto_copy_df_inner_0(const void * data __rte_unused)9866 test_ipsec_proto_copy_df_inner_0(const void *data __rte_unused)
9867 {
9868 struct ipsec_test_flags flags;
9869
9870 memset(&flags, 0, sizeof(flags));
9871
9872 flags.df = TEST_IPSEC_COPY_DF_INNER_0;
9873
9874 return test_ipsec_proto_all(&flags);
9875 }
9876
9877 static int
test_ipsec_proto_copy_df_inner_1(const void * data __rte_unused)9878 test_ipsec_proto_copy_df_inner_1(const void *data __rte_unused)
9879 {
9880 struct ipsec_test_flags flags;
9881
9882 memset(&flags, 0, sizeof(flags));
9883
9884 flags.df = TEST_IPSEC_COPY_DF_INNER_1;
9885
9886 return test_ipsec_proto_all(&flags);
9887 }
9888
9889 static int
test_ipsec_proto_set_df_0_inner_1(const void * data __rte_unused)9890 test_ipsec_proto_set_df_0_inner_1(const void *data __rte_unused)
9891 {
9892 struct ipsec_test_flags flags;
9893
9894 memset(&flags, 0, sizeof(flags));
9895
9896 flags.df = TEST_IPSEC_SET_DF_0_INNER_1;
9897
9898 return test_ipsec_proto_all(&flags);
9899 }
9900
9901 static int
test_ipsec_proto_set_df_1_inner_0(const void * data __rte_unused)9902 test_ipsec_proto_set_df_1_inner_0(const void *data __rte_unused)
9903 {
9904 struct ipsec_test_flags flags;
9905
9906 memset(&flags, 0, sizeof(flags));
9907
9908 flags.df = TEST_IPSEC_SET_DF_1_INNER_0;
9909
9910 return test_ipsec_proto_all(&flags);
9911 }
9912
9913 static int
test_ipsec_proto_ipv4_copy_dscp_inner_0(const void * data __rte_unused)9914 test_ipsec_proto_ipv4_copy_dscp_inner_0(const void *data __rte_unused)
9915 {
9916 struct ipsec_test_flags flags;
9917
9918 memset(&flags, 0, sizeof(flags));
9919
9920 flags.dscp = TEST_IPSEC_COPY_DSCP_INNER_0;
9921
9922 return test_ipsec_proto_all(&flags);
9923 }
9924
9925 static int
test_ipsec_proto_ipv4_copy_dscp_inner_1(const void * data __rte_unused)9926 test_ipsec_proto_ipv4_copy_dscp_inner_1(const void *data __rte_unused)
9927 {
9928 struct ipsec_test_flags flags;
9929
9930 memset(&flags, 0, sizeof(flags));
9931
9932 flags.dscp = TEST_IPSEC_COPY_DSCP_INNER_1;
9933
9934 return test_ipsec_proto_all(&flags);
9935 }
9936
9937 static int
test_ipsec_proto_ipv4_set_dscp_0_inner_1(const void * data __rte_unused)9938 test_ipsec_proto_ipv4_set_dscp_0_inner_1(const void *data __rte_unused)
9939 {
9940 struct ipsec_test_flags flags;
9941
9942 if (gbl_driver_id == rte_cryptodev_driver_id_get(
9943 RTE_STR(CRYPTODEV_NAME_CN9K_PMD)))
9944 return TEST_SKIPPED;
9945
9946 memset(&flags, 0, sizeof(flags));
9947
9948 flags.dscp = TEST_IPSEC_SET_DSCP_0_INNER_1;
9949
9950 return test_ipsec_proto_all(&flags);
9951 }
9952
9953 static int
test_ipsec_proto_ipv4_set_dscp_1_inner_0(const void * data __rte_unused)9954 test_ipsec_proto_ipv4_set_dscp_1_inner_0(const void *data __rte_unused)
9955 {
9956 struct ipsec_test_flags flags;
9957
9958 if (gbl_driver_id == rte_cryptodev_driver_id_get(
9959 RTE_STR(CRYPTODEV_NAME_CN9K_PMD)))
9960 return TEST_SKIPPED;
9961
9962 memset(&flags, 0, sizeof(flags));
9963
9964 flags.dscp = TEST_IPSEC_SET_DSCP_1_INNER_0;
9965
9966 return test_ipsec_proto_all(&flags);
9967 }
9968
9969 static int
test_ipsec_proto_ipv6_copy_dscp_inner_0(const void * data __rte_unused)9970 test_ipsec_proto_ipv6_copy_dscp_inner_0(const void *data __rte_unused)
9971 {
9972 struct ipsec_test_flags flags;
9973
9974 memset(&flags, 0, sizeof(flags));
9975
9976 flags.ipv6 = true;
9977 flags.tunnel_ipv6 = true;
9978 flags.dscp = TEST_IPSEC_COPY_DSCP_INNER_0;
9979
9980 return test_ipsec_proto_all(&flags);
9981 }
9982
9983 static int
test_ipsec_proto_ipv6_copy_dscp_inner_1(const void * data __rte_unused)9984 test_ipsec_proto_ipv6_copy_dscp_inner_1(const void *data __rte_unused)
9985 {
9986 struct ipsec_test_flags flags;
9987
9988 memset(&flags, 0, sizeof(flags));
9989
9990 flags.ipv6 = true;
9991 flags.tunnel_ipv6 = true;
9992 flags.dscp = TEST_IPSEC_COPY_DSCP_INNER_1;
9993
9994 return test_ipsec_proto_all(&flags);
9995 }
9996
9997 static int
test_ipsec_proto_ipv6_set_dscp_0_inner_1(const void * data __rte_unused)9998 test_ipsec_proto_ipv6_set_dscp_0_inner_1(const void *data __rte_unused)
9999 {
10000 struct ipsec_test_flags flags;
10001
10002 if (gbl_driver_id == rte_cryptodev_driver_id_get(
10003 RTE_STR(CRYPTODEV_NAME_CN9K_PMD)))
10004 return TEST_SKIPPED;
10005
10006 memset(&flags, 0, sizeof(flags));
10007
10008 flags.ipv6 = true;
10009 flags.tunnel_ipv6 = true;
10010 flags.dscp = TEST_IPSEC_SET_DSCP_0_INNER_1;
10011
10012 return test_ipsec_proto_all(&flags);
10013 }
10014
10015 static int
test_ipsec_proto_ipv6_set_dscp_1_inner_0(const void * data __rte_unused)10016 test_ipsec_proto_ipv6_set_dscp_1_inner_0(const void *data __rte_unused)
10017 {
10018 struct ipsec_test_flags flags;
10019
10020 if (gbl_driver_id == rte_cryptodev_driver_id_get(
10021 RTE_STR(CRYPTODEV_NAME_CN9K_PMD)))
10022 return TEST_SKIPPED;
10023
10024 memset(&flags, 0, sizeof(flags));
10025
10026 flags.ipv6 = true;
10027 flags.tunnel_ipv6 = true;
10028 flags.dscp = TEST_IPSEC_SET_DSCP_1_INNER_0;
10029
10030 return test_ipsec_proto_all(&flags);
10031 }
10032
10033 static int
test_ipsec_pkt_replay(const void * test_data,const uint64_t esn[],bool replayed_pkt[],uint32_t nb_pkts,bool esn_en,uint64_t winsz)10034 test_ipsec_pkt_replay(const void *test_data, const uint64_t esn[],
10035 bool replayed_pkt[], uint32_t nb_pkts, bool esn_en,
10036 uint64_t winsz)
10037 {
10038 struct ipsec_test_data td_outb[IPSEC_TEST_PACKETS_MAX];
10039 struct ipsec_test_data td_inb[IPSEC_TEST_PACKETS_MAX];
10040 struct ipsec_test_flags flags;
10041 uint32_t i = 0, ret = 0;
10042
10043 memset(&flags, 0, sizeof(flags));
10044 flags.antireplay = true;
10045
10046 for (i = 0; i < nb_pkts; i++) {
10047 memcpy(&td_outb[i], test_data, sizeof(td_outb[i]));
10048 td_outb[i].ipsec_xform.options.iv_gen_disable = 1;
10049 td_outb[i].ipsec_xform.replay_win_sz = winsz;
10050 td_outb[i].ipsec_xform.options.esn = esn_en;
10051 }
10052
10053 for (i = 0; i < nb_pkts; i++)
10054 td_outb[i].ipsec_xform.esn.value = esn[i];
10055
10056 ret = test_ipsec_proto_process(td_outb, td_inb, nb_pkts, true,
10057 &flags);
10058 if (ret != TEST_SUCCESS)
10059 return ret;
10060
10061 test_ipsec_td_update(td_inb, td_outb, nb_pkts, &flags);
10062
10063 for (i = 0; i < nb_pkts; i++) {
10064 td_inb[i].ipsec_xform.options.esn = esn_en;
10065 /* Set antireplay flag for packets to be dropped */
10066 td_inb[i].ar_packet = replayed_pkt[i];
10067 }
10068
10069 ret = test_ipsec_proto_process(td_inb, NULL, nb_pkts, true,
10070 &flags);
10071
10072 return ret;
10073 }
10074
10075 static int
test_ipsec_proto_pkt_antireplay(const void * test_data,uint64_t winsz)10076 test_ipsec_proto_pkt_antireplay(const void *test_data, uint64_t winsz)
10077 {
10078
10079 uint32_t nb_pkts = 5;
10080 bool replayed_pkt[5];
10081 uint64_t esn[5];
10082
10083 /* 1. Advance the TOP of the window to WS * 2 */
10084 esn[0] = winsz * 2;
10085 /* 2. Test sequence number within the new window(WS + 1) */
10086 esn[1] = winsz + 1;
10087 /* 3. Test sequence number less than the window BOTTOM */
10088 esn[2] = winsz;
10089 /* 4. Test sequence number in the middle of the window */
10090 esn[3] = winsz + (winsz / 2);
10091 /* 5. Test replay of the packet in the middle of the window */
10092 esn[4] = winsz + (winsz / 2);
10093
10094 replayed_pkt[0] = false;
10095 replayed_pkt[1] = false;
10096 replayed_pkt[2] = true;
10097 replayed_pkt[3] = false;
10098 replayed_pkt[4] = true;
10099
10100 return test_ipsec_pkt_replay(test_data, esn, replayed_pkt, nb_pkts,
10101 false, winsz);
10102 }
10103
10104 static int
test_ipsec_proto_pkt_antireplay1024(const void * test_data)10105 test_ipsec_proto_pkt_antireplay1024(const void *test_data)
10106 {
10107 return test_ipsec_proto_pkt_antireplay(test_data, 1024);
10108 }
10109
10110 static int
test_ipsec_proto_pkt_antireplay2048(const void * test_data)10111 test_ipsec_proto_pkt_antireplay2048(const void *test_data)
10112 {
10113 return test_ipsec_proto_pkt_antireplay(test_data, 2048);
10114 }
10115
10116 static int
test_ipsec_proto_pkt_antireplay4096(const void * test_data)10117 test_ipsec_proto_pkt_antireplay4096(const void *test_data)
10118 {
10119 return test_ipsec_proto_pkt_antireplay(test_data, 4096);
10120 }
10121
10122 static int
test_ipsec_proto_pkt_esn_antireplay(const void * test_data,uint64_t winsz)10123 test_ipsec_proto_pkt_esn_antireplay(const void *test_data, uint64_t winsz)
10124 {
10125
10126 uint32_t nb_pkts = 7;
10127 bool replayed_pkt[7];
10128 uint64_t esn[7];
10129
10130 /* Set the initial sequence number */
10131 esn[0] = (uint64_t)(0xFFFFFFFF - winsz);
10132 /* 1. Advance the TOP of the window to (1<<32 + WS/2) */
10133 esn[1] = (uint64_t)((1ULL << 32) + (winsz / 2));
10134 /* 2. Test sequence number within new window (1<<32 + WS/2 + 1) */
10135 esn[2] = (uint64_t)((1ULL << 32) - (winsz / 2) + 1);
10136 /* 3. Test with sequence number within window (1<<32 - 1) */
10137 esn[3] = (uint64_t)((1ULL << 32) - 1);
10138 /* 4. Test with sequence number within window (1<<32 - 1) */
10139 esn[4] = (uint64_t)(1ULL << 32);
10140 /* 5. Test with duplicate sequence number within
10141 * new window (1<<32 - 1)
10142 */
10143 esn[5] = (uint64_t)((1ULL << 32) - 1);
10144 /* 6. Test with duplicate sequence number within new window (1<<32) */
10145 esn[6] = (uint64_t)(1ULL << 32);
10146
10147 replayed_pkt[0] = false;
10148 replayed_pkt[1] = false;
10149 replayed_pkt[2] = false;
10150 replayed_pkt[3] = false;
10151 replayed_pkt[4] = false;
10152 replayed_pkt[5] = true;
10153 replayed_pkt[6] = true;
10154
10155 return test_ipsec_pkt_replay(test_data, esn, replayed_pkt, nb_pkts,
10156 true, winsz);
10157 }
10158
10159 static int
test_ipsec_proto_pkt_esn_antireplay1024(const void * test_data)10160 test_ipsec_proto_pkt_esn_antireplay1024(const void *test_data)
10161 {
10162 return test_ipsec_proto_pkt_esn_antireplay(test_data, 1024);
10163 }
10164
10165 static int
test_ipsec_proto_pkt_esn_antireplay2048(const void * test_data)10166 test_ipsec_proto_pkt_esn_antireplay2048(const void *test_data)
10167 {
10168 return test_ipsec_proto_pkt_esn_antireplay(test_data, 2048);
10169 }
10170
10171 static int
test_ipsec_proto_pkt_esn_antireplay4096(const void * test_data)10172 test_ipsec_proto_pkt_esn_antireplay4096(const void *test_data)
10173 {
10174 return test_ipsec_proto_pkt_esn_antireplay(test_data, 4096);
10175 }
10176
10177 static int
test_PDCP_PROTO_all(void)10178 test_PDCP_PROTO_all(void)
10179 {
10180 struct crypto_testsuite_params *ts_params = &testsuite_params;
10181 struct crypto_unittest_params *ut_params = &unittest_params;
10182 struct rte_cryptodev_info dev_info;
10183 int status;
10184
10185 rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
10186 uint64_t feat_flags = dev_info.feature_flags;
10187
10188 if (!(feat_flags & RTE_CRYPTODEV_FF_SECURITY))
10189 return TEST_SKIPPED;
10190
10191 /* Set action type */
10192 ut_params->type = gbl_action_type == RTE_SECURITY_ACTION_TYPE_NONE ?
10193 RTE_SECURITY_ACTION_TYPE_LOOKASIDE_PROTOCOL :
10194 gbl_action_type;
10195
10196 if (security_proto_supported(ut_params->type,
10197 RTE_SECURITY_PROTOCOL_PDCP) < 0)
10198 return TEST_SKIPPED;
10199
10200 status = test_PDCP_PROTO_cplane_encap_all();
10201 status += test_PDCP_PROTO_cplane_decap_all();
10202 status += test_PDCP_PROTO_uplane_encap_all();
10203 status += test_PDCP_PROTO_uplane_decap_all();
10204 status += test_PDCP_PROTO_SGL_in_place_32B();
10205 status += test_PDCP_PROTO_SGL_oop_32B_128B();
10206 status += test_PDCP_PROTO_SGL_oop_32B_40B();
10207 status += test_PDCP_PROTO_SGL_oop_128B_32B();
10208 status += test_PDCP_SDAP_PROTO_encap_all();
10209 status += test_PDCP_SDAP_PROTO_decap_all();
10210 status += test_PDCP_PROTO_short_mac();
10211
10212 if (status)
10213 return TEST_FAILED;
10214 else
10215 return TEST_SUCCESS;
10216 }
10217
10218 static int
test_ipsec_proto_ipv4_ttl_decrement(const void * data __rte_unused)10219 test_ipsec_proto_ipv4_ttl_decrement(const void *data __rte_unused)
10220 {
10221 struct ipsec_test_flags flags = {
10222 .dec_ttl_or_hop_limit = true
10223 };
10224
10225 return test_ipsec_proto_all(&flags);
10226 }
10227
10228 static int
test_ipsec_proto_ipv6_hop_limit_decrement(const void * data __rte_unused)10229 test_ipsec_proto_ipv6_hop_limit_decrement(const void *data __rte_unused)
10230 {
10231 struct ipsec_test_flags flags = {
10232 .ipv6 = true,
10233 .dec_ttl_or_hop_limit = true
10234 };
10235
10236 return test_ipsec_proto_all(&flags);
10237 }
10238
10239 static int
test_docsis_proto_uplink(const void * data)10240 test_docsis_proto_uplink(const void *data)
10241 {
10242 const struct docsis_test_data *d_td = data;
10243 struct crypto_testsuite_params *ts_params = &testsuite_params;
10244 struct crypto_unittest_params *ut_params = &unittest_params;
10245 uint8_t *plaintext = NULL;
10246 uint8_t *ciphertext = NULL;
10247 uint8_t *iv_ptr;
10248 int32_t cipher_len, crc_len;
10249 uint32_t crc_data_len;
10250 int ret = TEST_SUCCESS;
10251
10252 struct rte_security_ctx *ctx = (struct rte_security_ctx *)
10253 rte_cryptodev_get_sec_ctx(
10254 ts_params->valid_devs[0]);
10255
10256 /* Verify the capabilities */
10257 struct rte_security_capability_idx sec_cap_idx;
10258 const struct rte_security_capability *sec_cap;
10259 const struct rte_cryptodev_capabilities *crypto_cap;
10260 const struct rte_cryptodev_symmetric_capability *sym_cap;
10261 int j = 0;
10262
10263 /* Set action type */
10264 ut_params->type = gbl_action_type == RTE_SECURITY_ACTION_TYPE_NONE ?
10265 RTE_SECURITY_ACTION_TYPE_LOOKASIDE_PROTOCOL :
10266 gbl_action_type;
10267
10268 if (security_proto_supported(ut_params->type,
10269 RTE_SECURITY_PROTOCOL_DOCSIS) < 0)
10270 return TEST_SKIPPED;
10271
10272 sec_cap_idx.action = ut_params->type;
10273 sec_cap_idx.protocol = RTE_SECURITY_PROTOCOL_DOCSIS;
10274 sec_cap_idx.docsis.direction = RTE_SECURITY_DOCSIS_UPLINK;
10275
10276 sec_cap = rte_security_capability_get(ctx, &sec_cap_idx);
10277 if (sec_cap == NULL)
10278 return TEST_SKIPPED;
10279
10280 while ((crypto_cap = &sec_cap->crypto_capabilities[j++])->op !=
10281 RTE_CRYPTO_OP_TYPE_UNDEFINED) {
10282 if (crypto_cap->op == RTE_CRYPTO_OP_TYPE_SYMMETRIC &&
10283 crypto_cap->sym.xform_type ==
10284 RTE_CRYPTO_SYM_XFORM_CIPHER &&
10285 crypto_cap->sym.cipher.algo ==
10286 RTE_CRYPTO_CIPHER_AES_DOCSISBPI) {
10287 sym_cap = &crypto_cap->sym;
10288 if (rte_cryptodev_sym_capability_check_cipher(sym_cap,
10289 d_td->key.len,
10290 d_td->iv.len) == 0)
10291 break;
10292 }
10293 }
10294
10295 if (crypto_cap->op == RTE_CRYPTO_OP_TYPE_UNDEFINED)
10296 return TEST_SKIPPED;
10297
10298 /* Setup source mbuf payload */
10299 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
10300 memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
10301 rte_pktmbuf_tailroom(ut_params->ibuf));
10302
10303 ciphertext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
10304 d_td->ciphertext.len);
10305
10306 memcpy(ciphertext, d_td->ciphertext.data, d_td->ciphertext.len);
10307
10308 /* Setup cipher session parameters */
10309 ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
10310 ut_params->cipher_xform.cipher.algo = RTE_CRYPTO_CIPHER_AES_DOCSISBPI;
10311 ut_params->cipher_xform.cipher.op = RTE_CRYPTO_CIPHER_OP_DECRYPT;
10312 ut_params->cipher_xform.cipher.key.data = d_td->key.data;
10313 ut_params->cipher_xform.cipher.key.length = d_td->key.len;
10314 ut_params->cipher_xform.cipher.iv.length = d_td->iv.len;
10315 ut_params->cipher_xform.cipher.iv.offset = IV_OFFSET;
10316 ut_params->cipher_xform.next = NULL;
10317
10318 /* Setup DOCSIS session parameters */
10319 ut_params->docsis_xform.direction = RTE_SECURITY_DOCSIS_UPLINK;
10320
10321 struct rte_security_session_conf sess_conf = {
10322 .action_type = ut_params->type,
10323 .protocol = RTE_SECURITY_PROTOCOL_DOCSIS,
10324 .docsis = ut_params->docsis_xform,
10325 .crypto_xform = &ut_params->cipher_xform,
10326 };
10327
10328 /* Create security session */
10329 ut_params->sec_session = rte_security_session_create(ctx, &sess_conf,
10330 ts_params->session_mpool,
10331 ts_params->session_priv_mpool);
10332
10333 if (!ut_params->sec_session) {
10334 printf("Test function %s line %u: failed to allocate session\n",
10335 __func__, __LINE__);
10336 ret = TEST_FAILED;
10337 goto on_err;
10338 }
10339
10340 /* Generate crypto op data structure */
10341 ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
10342 RTE_CRYPTO_OP_TYPE_SYMMETRIC);
10343 if (!ut_params->op) {
10344 printf("Test function %s line %u: failed to allocate symmetric "
10345 "crypto operation\n", __func__, __LINE__);
10346 ret = TEST_FAILED;
10347 goto on_err;
10348 }
10349
10350 /* Setup CRC operation parameters */
10351 crc_len = d_td->ciphertext.no_crc == false ?
10352 (d_td->ciphertext.len -
10353 d_td->ciphertext.crc_offset -
10354 RTE_ETHER_CRC_LEN) :
10355 0;
10356 crc_len = crc_len > 0 ? crc_len : 0;
10357 crc_data_len = crc_len == 0 ? 0 : RTE_ETHER_CRC_LEN;
10358 ut_params->op->sym->auth.data.length = crc_len;
10359 ut_params->op->sym->auth.data.offset = d_td->ciphertext.crc_offset;
10360
10361 /* Setup cipher operation parameters */
10362 cipher_len = d_td->ciphertext.no_cipher == false ?
10363 (d_td->ciphertext.len -
10364 d_td->ciphertext.cipher_offset) :
10365 0;
10366 cipher_len = cipher_len > 0 ? cipher_len : 0;
10367 ut_params->op->sym->cipher.data.length = cipher_len;
10368 ut_params->op->sym->cipher.data.offset = d_td->ciphertext.cipher_offset;
10369
10370 /* Setup cipher IV */
10371 iv_ptr = (uint8_t *)ut_params->op + IV_OFFSET;
10372 rte_memcpy(iv_ptr, d_td->iv.data, d_td->iv.len);
10373
10374 /* Attach session to operation */
10375 rte_security_attach_session(ut_params->op, ut_params->sec_session);
10376
10377 /* Set crypto operation mbufs */
10378 ut_params->op->sym->m_src = ut_params->ibuf;
10379 ut_params->op->sym->m_dst = NULL;
10380
10381 /* Process crypto operation */
10382 if (process_crypto_request(ts_params->valid_devs[0], ut_params->op) ==
10383 NULL) {
10384 printf("Test function %s line %u: failed to process security "
10385 "crypto op\n", __func__, __LINE__);
10386 ret = TEST_FAILED;
10387 goto on_err;
10388 }
10389
10390 if (ut_params->op->status != RTE_CRYPTO_OP_STATUS_SUCCESS) {
10391 printf("Test function %s line %u: failed to process crypto op\n",
10392 __func__, __LINE__);
10393 ret = TEST_FAILED;
10394 goto on_err;
10395 }
10396
10397 /* Validate plaintext */
10398 plaintext = ciphertext;
10399
10400 if (memcmp(plaintext, d_td->plaintext.data,
10401 d_td->plaintext.len - crc_data_len)) {
10402 printf("Test function %s line %u: plaintext not as expected\n",
10403 __func__, __LINE__);
10404 rte_hexdump(stdout, "expected", d_td->plaintext.data,
10405 d_td->plaintext.len);
10406 rte_hexdump(stdout, "actual", plaintext, d_td->plaintext.len);
10407 ret = TEST_FAILED;
10408 goto on_err;
10409 }
10410
10411 on_err:
10412 rte_crypto_op_free(ut_params->op);
10413 ut_params->op = NULL;
10414
10415 if (ut_params->sec_session)
10416 rte_security_session_destroy(ctx, ut_params->sec_session);
10417 ut_params->sec_session = NULL;
10418
10419 rte_pktmbuf_free(ut_params->ibuf);
10420 ut_params->ibuf = NULL;
10421
10422 return ret;
10423 }
10424
10425 static int
test_docsis_proto_downlink(const void * data)10426 test_docsis_proto_downlink(const void *data)
10427 {
10428 const struct docsis_test_data *d_td = data;
10429 struct crypto_testsuite_params *ts_params = &testsuite_params;
10430 struct crypto_unittest_params *ut_params = &unittest_params;
10431 uint8_t *plaintext = NULL;
10432 uint8_t *ciphertext = NULL;
10433 uint8_t *iv_ptr;
10434 int32_t cipher_len, crc_len;
10435 int ret = TEST_SUCCESS;
10436
10437 struct rte_security_ctx *ctx = (struct rte_security_ctx *)
10438 rte_cryptodev_get_sec_ctx(
10439 ts_params->valid_devs[0]);
10440
10441 /* Verify the capabilities */
10442 struct rte_security_capability_idx sec_cap_idx;
10443 const struct rte_security_capability *sec_cap;
10444 const struct rte_cryptodev_capabilities *crypto_cap;
10445 const struct rte_cryptodev_symmetric_capability *sym_cap;
10446 int j = 0;
10447
10448 /* Set action type */
10449 ut_params->type = gbl_action_type == RTE_SECURITY_ACTION_TYPE_NONE ?
10450 RTE_SECURITY_ACTION_TYPE_LOOKASIDE_PROTOCOL :
10451 gbl_action_type;
10452
10453 if (security_proto_supported(ut_params->type,
10454 RTE_SECURITY_PROTOCOL_DOCSIS) < 0)
10455 return TEST_SKIPPED;
10456
10457 sec_cap_idx.action = ut_params->type;
10458 sec_cap_idx.protocol = RTE_SECURITY_PROTOCOL_DOCSIS;
10459 sec_cap_idx.docsis.direction = RTE_SECURITY_DOCSIS_DOWNLINK;
10460
10461 sec_cap = rte_security_capability_get(ctx, &sec_cap_idx);
10462 if (sec_cap == NULL)
10463 return TEST_SKIPPED;
10464
10465 while ((crypto_cap = &sec_cap->crypto_capabilities[j++])->op !=
10466 RTE_CRYPTO_OP_TYPE_UNDEFINED) {
10467 if (crypto_cap->op == RTE_CRYPTO_OP_TYPE_SYMMETRIC &&
10468 crypto_cap->sym.xform_type ==
10469 RTE_CRYPTO_SYM_XFORM_CIPHER &&
10470 crypto_cap->sym.cipher.algo ==
10471 RTE_CRYPTO_CIPHER_AES_DOCSISBPI) {
10472 sym_cap = &crypto_cap->sym;
10473 if (rte_cryptodev_sym_capability_check_cipher(sym_cap,
10474 d_td->key.len,
10475 d_td->iv.len) == 0)
10476 break;
10477 }
10478 }
10479
10480 if (crypto_cap->op == RTE_CRYPTO_OP_TYPE_UNDEFINED)
10481 return TEST_SKIPPED;
10482
10483 /* Setup source mbuf payload */
10484 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
10485 memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
10486 rte_pktmbuf_tailroom(ut_params->ibuf));
10487
10488 plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
10489 d_td->plaintext.len);
10490
10491 memcpy(plaintext, d_td->plaintext.data, d_td->plaintext.len);
10492
10493 /* Setup cipher session parameters */
10494 ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
10495 ut_params->cipher_xform.cipher.algo = RTE_CRYPTO_CIPHER_AES_DOCSISBPI;
10496 ut_params->cipher_xform.cipher.op = RTE_CRYPTO_CIPHER_OP_ENCRYPT;
10497 ut_params->cipher_xform.cipher.key.data = d_td->key.data;
10498 ut_params->cipher_xform.cipher.key.length = d_td->key.len;
10499 ut_params->cipher_xform.cipher.iv.length = d_td->iv.len;
10500 ut_params->cipher_xform.cipher.iv.offset = IV_OFFSET;
10501 ut_params->cipher_xform.next = NULL;
10502
10503 /* Setup DOCSIS session parameters */
10504 ut_params->docsis_xform.direction = RTE_SECURITY_DOCSIS_DOWNLINK;
10505
10506 struct rte_security_session_conf sess_conf = {
10507 .action_type = ut_params->type,
10508 .protocol = RTE_SECURITY_PROTOCOL_DOCSIS,
10509 .docsis = ut_params->docsis_xform,
10510 .crypto_xform = &ut_params->cipher_xform,
10511 };
10512
10513 /* Create security session */
10514 ut_params->sec_session = rte_security_session_create(ctx, &sess_conf,
10515 ts_params->session_mpool,
10516 ts_params->session_priv_mpool);
10517
10518 if (!ut_params->sec_session) {
10519 printf("Test function %s line %u: failed to allocate session\n",
10520 __func__, __LINE__);
10521 ret = TEST_FAILED;
10522 goto on_err;
10523 }
10524
10525 /* Generate crypto op data structure */
10526 ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
10527 RTE_CRYPTO_OP_TYPE_SYMMETRIC);
10528 if (!ut_params->op) {
10529 printf("Test function %s line %u: failed to allocate symmetric "
10530 "crypto operation\n", __func__, __LINE__);
10531 ret = TEST_FAILED;
10532 goto on_err;
10533 }
10534
10535 /* Setup CRC operation parameters */
10536 crc_len = d_td->plaintext.no_crc == false ?
10537 (d_td->plaintext.len -
10538 d_td->plaintext.crc_offset -
10539 RTE_ETHER_CRC_LEN) :
10540 0;
10541 crc_len = crc_len > 0 ? crc_len : 0;
10542 ut_params->op->sym->auth.data.length = crc_len;
10543 ut_params->op->sym->auth.data.offset = d_td->plaintext.crc_offset;
10544
10545 /* Setup cipher operation parameters */
10546 cipher_len = d_td->plaintext.no_cipher == false ?
10547 (d_td->plaintext.len -
10548 d_td->plaintext.cipher_offset) :
10549 0;
10550 cipher_len = cipher_len > 0 ? cipher_len : 0;
10551 ut_params->op->sym->cipher.data.length = cipher_len;
10552 ut_params->op->sym->cipher.data.offset = d_td->plaintext.cipher_offset;
10553
10554 /* Setup cipher IV */
10555 iv_ptr = (uint8_t *)ut_params->op + IV_OFFSET;
10556 rte_memcpy(iv_ptr, d_td->iv.data, d_td->iv.len);
10557
10558 /* Attach session to operation */
10559 rte_security_attach_session(ut_params->op, ut_params->sec_session);
10560
10561 /* Set crypto operation mbufs */
10562 ut_params->op->sym->m_src = ut_params->ibuf;
10563 ut_params->op->sym->m_dst = NULL;
10564
10565 /* Process crypto operation */
10566 if (process_crypto_request(ts_params->valid_devs[0], ut_params->op) ==
10567 NULL) {
10568 printf("Test function %s line %u: failed to process crypto op\n",
10569 __func__, __LINE__);
10570 ret = TEST_FAILED;
10571 goto on_err;
10572 }
10573
10574 if (ut_params->op->status != RTE_CRYPTO_OP_STATUS_SUCCESS) {
10575 printf("Test function %s line %u: crypto op processing failed\n",
10576 __func__, __LINE__);
10577 ret = TEST_FAILED;
10578 goto on_err;
10579 }
10580
10581 /* Validate ciphertext */
10582 ciphertext = plaintext;
10583
10584 if (memcmp(ciphertext, d_td->ciphertext.data, d_td->ciphertext.len)) {
10585 printf("Test function %s line %u: plaintext not as expected\n",
10586 __func__, __LINE__);
10587 rte_hexdump(stdout, "expected", d_td->ciphertext.data,
10588 d_td->ciphertext.len);
10589 rte_hexdump(stdout, "actual", ciphertext, d_td->ciphertext.len);
10590 ret = TEST_FAILED;
10591 goto on_err;
10592 }
10593
10594 on_err:
10595 rte_crypto_op_free(ut_params->op);
10596 ut_params->op = NULL;
10597
10598 if (ut_params->sec_session)
10599 rte_security_session_destroy(ctx, ut_params->sec_session);
10600 ut_params->sec_session = NULL;
10601
10602 rte_pktmbuf_free(ut_params->ibuf);
10603 ut_params->ibuf = NULL;
10604
10605 return ret;
10606 }
10607 #endif
10608
10609 static int
test_AES_GCM_authenticated_encryption_test_case_1(void)10610 test_AES_GCM_authenticated_encryption_test_case_1(void)
10611 {
10612 return test_authenticated_encryption(&gcm_test_case_1);
10613 }
10614
10615 static int
test_AES_GCM_authenticated_encryption_test_case_2(void)10616 test_AES_GCM_authenticated_encryption_test_case_2(void)
10617 {
10618 return test_authenticated_encryption(&gcm_test_case_2);
10619 }
10620
10621 static int
test_AES_GCM_authenticated_encryption_test_case_3(void)10622 test_AES_GCM_authenticated_encryption_test_case_3(void)
10623 {
10624 return test_authenticated_encryption(&gcm_test_case_3);
10625 }
10626
10627 static int
test_AES_GCM_authenticated_encryption_test_case_4(void)10628 test_AES_GCM_authenticated_encryption_test_case_4(void)
10629 {
10630 return test_authenticated_encryption(&gcm_test_case_4);
10631 }
10632
10633 static int
test_AES_GCM_authenticated_encryption_test_case_5(void)10634 test_AES_GCM_authenticated_encryption_test_case_5(void)
10635 {
10636 return test_authenticated_encryption(&gcm_test_case_5);
10637 }
10638
10639 static int
test_AES_GCM_authenticated_encryption_test_case_6(void)10640 test_AES_GCM_authenticated_encryption_test_case_6(void)
10641 {
10642 return test_authenticated_encryption(&gcm_test_case_6);
10643 }
10644
10645 static int
test_AES_GCM_authenticated_encryption_test_case_7(void)10646 test_AES_GCM_authenticated_encryption_test_case_7(void)
10647 {
10648 return test_authenticated_encryption(&gcm_test_case_7);
10649 }
10650
10651 static int
test_AES_GCM_authenticated_encryption_test_case_8(void)10652 test_AES_GCM_authenticated_encryption_test_case_8(void)
10653 {
10654 return test_authenticated_encryption(&gcm_test_case_8);
10655 }
10656
10657 static int
test_AES_GCM_J0_authenticated_encryption_test_case_1(void)10658 test_AES_GCM_J0_authenticated_encryption_test_case_1(void)
10659 {
10660 return test_authenticated_encryption(&gcm_J0_test_case_1);
10661 }
10662
10663 static int
test_AES_GCM_auth_encryption_test_case_192_1(void)10664 test_AES_GCM_auth_encryption_test_case_192_1(void)
10665 {
10666 return test_authenticated_encryption(&gcm_test_case_192_1);
10667 }
10668
10669 static int
test_AES_GCM_auth_encryption_test_case_192_2(void)10670 test_AES_GCM_auth_encryption_test_case_192_2(void)
10671 {
10672 return test_authenticated_encryption(&gcm_test_case_192_2);
10673 }
10674
10675 static int
test_AES_GCM_auth_encryption_test_case_192_3(void)10676 test_AES_GCM_auth_encryption_test_case_192_3(void)
10677 {
10678 return test_authenticated_encryption(&gcm_test_case_192_3);
10679 }
10680
10681 static int
test_AES_GCM_auth_encryption_test_case_192_4(void)10682 test_AES_GCM_auth_encryption_test_case_192_4(void)
10683 {
10684 return test_authenticated_encryption(&gcm_test_case_192_4);
10685 }
10686
10687 static int
test_AES_GCM_auth_encryption_test_case_192_5(void)10688 test_AES_GCM_auth_encryption_test_case_192_5(void)
10689 {
10690 return test_authenticated_encryption(&gcm_test_case_192_5);
10691 }
10692
10693 static int
test_AES_GCM_auth_encryption_test_case_192_6(void)10694 test_AES_GCM_auth_encryption_test_case_192_6(void)
10695 {
10696 return test_authenticated_encryption(&gcm_test_case_192_6);
10697 }
10698
10699 static int
test_AES_GCM_auth_encryption_test_case_192_7(void)10700 test_AES_GCM_auth_encryption_test_case_192_7(void)
10701 {
10702 return test_authenticated_encryption(&gcm_test_case_192_7);
10703 }
10704
10705 static int
test_AES_GCM_auth_encryption_test_case_256_1(void)10706 test_AES_GCM_auth_encryption_test_case_256_1(void)
10707 {
10708 return test_authenticated_encryption(&gcm_test_case_256_1);
10709 }
10710
10711 static int
test_AES_GCM_auth_encryption_test_case_256_2(void)10712 test_AES_GCM_auth_encryption_test_case_256_2(void)
10713 {
10714 return test_authenticated_encryption(&gcm_test_case_256_2);
10715 }
10716
10717 static int
test_AES_GCM_auth_encryption_test_case_256_3(void)10718 test_AES_GCM_auth_encryption_test_case_256_3(void)
10719 {
10720 return test_authenticated_encryption(&gcm_test_case_256_3);
10721 }
10722
10723 static int
test_AES_GCM_auth_encryption_test_case_256_4(void)10724 test_AES_GCM_auth_encryption_test_case_256_4(void)
10725 {
10726 return test_authenticated_encryption(&gcm_test_case_256_4);
10727 }
10728
10729 static int
test_AES_GCM_auth_encryption_test_case_256_5(void)10730 test_AES_GCM_auth_encryption_test_case_256_5(void)
10731 {
10732 return test_authenticated_encryption(&gcm_test_case_256_5);
10733 }
10734
10735 static int
test_AES_GCM_auth_encryption_test_case_256_6(void)10736 test_AES_GCM_auth_encryption_test_case_256_6(void)
10737 {
10738 return test_authenticated_encryption(&gcm_test_case_256_6);
10739 }
10740
10741 static int
test_AES_GCM_auth_encryption_test_case_256_7(void)10742 test_AES_GCM_auth_encryption_test_case_256_7(void)
10743 {
10744 return test_authenticated_encryption(&gcm_test_case_256_7);
10745 }
10746
10747 static int
test_AES_GCM_auth_encryption_test_case_aad_1(void)10748 test_AES_GCM_auth_encryption_test_case_aad_1(void)
10749 {
10750 return test_authenticated_encryption(&gcm_test_case_aad_1);
10751 }
10752
10753 static int
test_AES_GCM_auth_encryption_test_case_aad_2(void)10754 test_AES_GCM_auth_encryption_test_case_aad_2(void)
10755 {
10756 return test_authenticated_encryption(&gcm_test_case_aad_2);
10757 }
10758
10759 static int
test_AES_GCM_auth_encryption_fail_iv_corrupt(void)10760 test_AES_GCM_auth_encryption_fail_iv_corrupt(void)
10761 {
10762 struct aead_test_data tdata;
10763 int res;
10764
10765 RTE_LOG(INFO, USER1, "This is a negative test, errors are expected\n");
10766 memcpy(&tdata, &gcm_test_case_7, sizeof(struct aead_test_data));
10767 tdata.iv.data[0] += 1;
10768 res = test_authenticated_encryption(&tdata);
10769 if (res == TEST_SKIPPED)
10770 return res;
10771 TEST_ASSERT_EQUAL(res, TEST_FAILED, "encryption not failed");
10772 return TEST_SUCCESS;
10773 }
10774
10775 static int
test_AES_GCM_auth_encryption_fail_in_data_corrupt(void)10776 test_AES_GCM_auth_encryption_fail_in_data_corrupt(void)
10777 {
10778 struct aead_test_data tdata;
10779 int res;
10780
10781 RTE_LOG(INFO, USER1, "This is a negative test, errors are expected\n");
10782 memcpy(&tdata, &gcm_test_case_7, sizeof(struct aead_test_data));
10783 tdata.plaintext.data[0] += 1;
10784 res = test_authenticated_encryption(&tdata);
10785 if (res == TEST_SKIPPED)
10786 return res;
10787 TEST_ASSERT_EQUAL(res, TEST_FAILED, "encryption not failed");
10788 return TEST_SUCCESS;
10789 }
10790
10791 static int
test_AES_GCM_auth_encryption_fail_out_data_corrupt(void)10792 test_AES_GCM_auth_encryption_fail_out_data_corrupt(void)
10793 {
10794 struct aead_test_data tdata;
10795 int res;
10796
10797 RTE_LOG(INFO, USER1, "This is a negative test, errors are expected\n");
10798 memcpy(&tdata, &gcm_test_case_7, sizeof(struct aead_test_data));
10799 tdata.ciphertext.data[0] += 1;
10800 res = test_authenticated_encryption(&tdata);
10801 if (res == TEST_SKIPPED)
10802 return res;
10803 TEST_ASSERT_EQUAL(res, TEST_FAILED, "encryption not failed");
10804 return TEST_SUCCESS;
10805 }
10806
10807 static int
test_AES_GCM_auth_encryption_fail_aad_len_corrupt(void)10808 test_AES_GCM_auth_encryption_fail_aad_len_corrupt(void)
10809 {
10810 struct aead_test_data tdata;
10811 int res;
10812
10813 RTE_LOG(INFO, USER1, "This is a negative test, errors are expected\n");
10814 memcpy(&tdata, &gcm_test_case_7, sizeof(struct aead_test_data));
10815 tdata.aad.len += 1;
10816 res = test_authenticated_encryption(&tdata);
10817 if (res == TEST_SKIPPED)
10818 return res;
10819 TEST_ASSERT_EQUAL(res, TEST_FAILED, "encryption not failed");
10820 return TEST_SUCCESS;
10821 }
10822
10823 static int
test_AES_GCM_auth_encryption_fail_aad_corrupt(void)10824 test_AES_GCM_auth_encryption_fail_aad_corrupt(void)
10825 {
10826 struct aead_test_data tdata;
10827 uint8_t aad[gcm_test_case_7.aad.len];
10828 int res;
10829
10830 RTE_LOG(INFO, USER1, "This is a negative test, errors are expected\n");
10831 memcpy(&tdata, &gcm_test_case_7, sizeof(struct aead_test_data));
10832 memcpy(aad, gcm_test_case_7.aad.data, gcm_test_case_7.aad.len);
10833 aad[0] += 1;
10834 tdata.aad.data = aad;
10835 res = test_authenticated_encryption(&tdata);
10836 if (res == TEST_SKIPPED)
10837 return res;
10838 TEST_ASSERT_EQUAL(res, TEST_FAILED, "encryption not failed");
10839 return TEST_SUCCESS;
10840 }
10841
10842 static int
test_AES_GCM_auth_encryption_fail_tag_corrupt(void)10843 test_AES_GCM_auth_encryption_fail_tag_corrupt(void)
10844 {
10845 struct aead_test_data tdata;
10846 int res;
10847
10848 RTE_LOG(INFO, USER1, "This is a negative test, errors are expected\n");
10849 memcpy(&tdata, &gcm_test_case_7, sizeof(struct aead_test_data));
10850 tdata.auth_tag.data[0] += 1;
10851 res = test_authenticated_encryption(&tdata);
10852 if (res == TEST_SKIPPED)
10853 return res;
10854 TEST_ASSERT_EQUAL(res, TEST_FAILED, "encryption not failed");
10855 return TEST_SUCCESS;
10856 }
10857
10858 static int
test_authenticated_decryption(const struct aead_test_data * tdata)10859 test_authenticated_decryption(const struct aead_test_data *tdata)
10860 {
10861 struct crypto_testsuite_params *ts_params = &testsuite_params;
10862 struct crypto_unittest_params *ut_params = &unittest_params;
10863
10864 int retval;
10865 uint8_t *plaintext;
10866 uint32_t i;
10867 struct rte_cryptodev_info dev_info;
10868
10869 rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
10870 uint64_t feat_flags = dev_info.feature_flags;
10871
10872 if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
10873 (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
10874 printf("Device doesn't support RAW data-path APIs.\n");
10875 return TEST_SKIPPED;
10876 }
10877
10878 /* Verify the capabilities */
10879 struct rte_cryptodev_sym_capability_idx cap_idx;
10880 const struct rte_cryptodev_symmetric_capability *capability;
10881 cap_idx.type = RTE_CRYPTO_SYM_XFORM_AEAD;
10882 cap_idx.algo.aead = tdata->algo;
10883 capability = rte_cryptodev_sym_capability_get(
10884 ts_params->valid_devs[0], &cap_idx);
10885 if (capability == NULL)
10886 return TEST_SKIPPED;
10887 if (rte_cryptodev_sym_capability_check_aead(
10888 capability, tdata->key.len, tdata->auth_tag.len,
10889 tdata->aad.len, tdata->iv.len))
10890 return TEST_SKIPPED;
10891
10892 /* Create AEAD session */
10893 retval = create_aead_session(ts_params->valid_devs[0],
10894 tdata->algo,
10895 RTE_CRYPTO_AEAD_OP_DECRYPT,
10896 tdata->key.data, tdata->key.len,
10897 tdata->aad.len, tdata->auth_tag.len,
10898 tdata->iv.len);
10899 if (retval < 0)
10900 return retval;
10901
10902 /* alloc mbuf and set payload */
10903 if (tdata->aad.len > MBUF_SIZE) {
10904 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->large_mbuf_pool);
10905 /* Populate full size of add data */
10906 for (i = 32; i < MAX_AAD_LENGTH; i += 32)
10907 memcpy(&tdata->aad.data[i], &tdata->aad.data[0], 32);
10908 } else
10909 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
10910
10911 memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
10912 rte_pktmbuf_tailroom(ut_params->ibuf));
10913
10914 /* Create AEAD operation */
10915 retval = create_aead_operation(RTE_CRYPTO_AEAD_OP_DECRYPT, tdata);
10916 if (retval < 0)
10917 return retval;
10918
10919 rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
10920
10921 ut_params->op->sym->m_src = ut_params->ibuf;
10922
10923 /* Process crypto operation */
10924 if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
10925 process_cpu_aead_op(ts_params->valid_devs[0], ut_params->op);
10926 else if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
10927 process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
10928 ut_params->op, 0, 0, 0, 0);
10929 else
10930 TEST_ASSERT_NOT_NULL(
10931 process_crypto_request(ts_params->valid_devs[0],
10932 ut_params->op), "failed to process sym crypto op");
10933
10934 TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
10935 "crypto op processing failed");
10936
10937 if (ut_params->op->sym->m_dst)
10938 plaintext = rte_pktmbuf_mtod(ut_params->op->sym->m_dst,
10939 uint8_t *);
10940 else
10941 plaintext = rte_pktmbuf_mtod_offset(ut_params->op->sym->m_src,
10942 uint8_t *,
10943 ut_params->op->sym->cipher.data.offset);
10944
10945 debug_hexdump(stdout, "plaintext:", plaintext, tdata->ciphertext.len);
10946
10947 /* Validate obuf */
10948 TEST_ASSERT_BUFFERS_ARE_EQUAL(
10949 plaintext,
10950 tdata->plaintext.data,
10951 tdata->plaintext.len,
10952 "Plaintext data not as expected");
10953
10954 TEST_ASSERT_EQUAL(ut_params->op->status,
10955 RTE_CRYPTO_OP_STATUS_SUCCESS,
10956 "Authentication failed");
10957
10958 return 0;
10959 }
10960
10961 static int
test_AES_GCM_authenticated_decryption_test_case_1(void)10962 test_AES_GCM_authenticated_decryption_test_case_1(void)
10963 {
10964 return test_authenticated_decryption(&gcm_test_case_1);
10965 }
10966
10967 static int
test_AES_GCM_authenticated_decryption_test_case_2(void)10968 test_AES_GCM_authenticated_decryption_test_case_2(void)
10969 {
10970 return test_authenticated_decryption(&gcm_test_case_2);
10971 }
10972
10973 static int
test_AES_GCM_authenticated_decryption_test_case_3(void)10974 test_AES_GCM_authenticated_decryption_test_case_3(void)
10975 {
10976 return test_authenticated_decryption(&gcm_test_case_3);
10977 }
10978
10979 static int
test_AES_GCM_authenticated_decryption_test_case_4(void)10980 test_AES_GCM_authenticated_decryption_test_case_4(void)
10981 {
10982 return test_authenticated_decryption(&gcm_test_case_4);
10983 }
10984
10985 static int
test_AES_GCM_authenticated_decryption_test_case_5(void)10986 test_AES_GCM_authenticated_decryption_test_case_5(void)
10987 {
10988 return test_authenticated_decryption(&gcm_test_case_5);
10989 }
10990
10991 static int
test_AES_GCM_authenticated_decryption_test_case_6(void)10992 test_AES_GCM_authenticated_decryption_test_case_6(void)
10993 {
10994 return test_authenticated_decryption(&gcm_test_case_6);
10995 }
10996
10997 static int
test_AES_GCM_authenticated_decryption_test_case_7(void)10998 test_AES_GCM_authenticated_decryption_test_case_7(void)
10999 {
11000 return test_authenticated_decryption(&gcm_test_case_7);
11001 }
11002
11003 static int
test_AES_GCM_authenticated_decryption_test_case_8(void)11004 test_AES_GCM_authenticated_decryption_test_case_8(void)
11005 {
11006 return test_authenticated_decryption(&gcm_test_case_8);
11007 }
11008
11009 static int
test_AES_GCM_J0_authenticated_decryption_test_case_1(void)11010 test_AES_GCM_J0_authenticated_decryption_test_case_1(void)
11011 {
11012 return test_authenticated_decryption(&gcm_J0_test_case_1);
11013 }
11014
11015 static int
test_AES_GCM_auth_decryption_test_case_192_1(void)11016 test_AES_GCM_auth_decryption_test_case_192_1(void)
11017 {
11018 return test_authenticated_decryption(&gcm_test_case_192_1);
11019 }
11020
11021 static int
test_AES_GCM_auth_decryption_test_case_192_2(void)11022 test_AES_GCM_auth_decryption_test_case_192_2(void)
11023 {
11024 return test_authenticated_decryption(&gcm_test_case_192_2);
11025 }
11026
11027 static int
test_AES_GCM_auth_decryption_test_case_192_3(void)11028 test_AES_GCM_auth_decryption_test_case_192_3(void)
11029 {
11030 return test_authenticated_decryption(&gcm_test_case_192_3);
11031 }
11032
11033 static int
test_AES_GCM_auth_decryption_test_case_192_4(void)11034 test_AES_GCM_auth_decryption_test_case_192_4(void)
11035 {
11036 return test_authenticated_decryption(&gcm_test_case_192_4);
11037 }
11038
11039 static int
test_AES_GCM_auth_decryption_test_case_192_5(void)11040 test_AES_GCM_auth_decryption_test_case_192_5(void)
11041 {
11042 return test_authenticated_decryption(&gcm_test_case_192_5);
11043 }
11044
11045 static int
test_AES_GCM_auth_decryption_test_case_192_6(void)11046 test_AES_GCM_auth_decryption_test_case_192_6(void)
11047 {
11048 return test_authenticated_decryption(&gcm_test_case_192_6);
11049 }
11050
11051 static int
test_AES_GCM_auth_decryption_test_case_192_7(void)11052 test_AES_GCM_auth_decryption_test_case_192_7(void)
11053 {
11054 return test_authenticated_decryption(&gcm_test_case_192_7);
11055 }
11056
11057 static int
test_AES_GCM_auth_decryption_test_case_256_1(void)11058 test_AES_GCM_auth_decryption_test_case_256_1(void)
11059 {
11060 return test_authenticated_decryption(&gcm_test_case_256_1);
11061 }
11062
11063 static int
test_AES_GCM_auth_decryption_test_case_256_2(void)11064 test_AES_GCM_auth_decryption_test_case_256_2(void)
11065 {
11066 return test_authenticated_decryption(&gcm_test_case_256_2);
11067 }
11068
11069 static int
test_AES_GCM_auth_decryption_test_case_256_3(void)11070 test_AES_GCM_auth_decryption_test_case_256_3(void)
11071 {
11072 return test_authenticated_decryption(&gcm_test_case_256_3);
11073 }
11074
11075 static int
test_AES_GCM_auth_decryption_test_case_256_4(void)11076 test_AES_GCM_auth_decryption_test_case_256_4(void)
11077 {
11078 return test_authenticated_decryption(&gcm_test_case_256_4);
11079 }
11080
11081 static int
test_AES_GCM_auth_decryption_test_case_256_5(void)11082 test_AES_GCM_auth_decryption_test_case_256_5(void)
11083 {
11084 return test_authenticated_decryption(&gcm_test_case_256_5);
11085 }
11086
11087 static int
test_AES_GCM_auth_decryption_test_case_256_6(void)11088 test_AES_GCM_auth_decryption_test_case_256_6(void)
11089 {
11090 return test_authenticated_decryption(&gcm_test_case_256_6);
11091 }
11092
11093 static int
test_AES_GCM_auth_decryption_test_case_256_7(void)11094 test_AES_GCM_auth_decryption_test_case_256_7(void)
11095 {
11096 return test_authenticated_decryption(&gcm_test_case_256_7);
11097 }
11098
11099 static int
test_AES_GCM_auth_decryption_test_case_aad_1(void)11100 test_AES_GCM_auth_decryption_test_case_aad_1(void)
11101 {
11102 return test_authenticated_decryption(&gcm_test_case_aad_1);
11103 }
11104
11105 static int
test_AES_GCM_auth_decryption_test_case_aad_2(void)11106 test_AES_GCM_auth_decryption_test_case_aad_2(void)
11107 {
11108 return test_authenticated_decryption(&gcm_test_case_aad_2);
11109 }
11110
11111 static int
test_AES_GCM_auth_decryption_fail_iv_corrupt(void)11112 test_AES_GCM_auth_decryption_fail_iv_corrupt(void)
11113 {
11114 struct aead_test_data tdata;
11115 int res;
11116
11117 memcpy(&tdata, &gcm_test_case_7, sizeof(struct aead_test_data));
11118 tdata.iv.data[0] += 1;
11119 res = test_authenticated_decryption(&tdata);
11120 if (res == TEST_SKIPPED)
11121 return res;
11122 TEST_ASSERT_EQUAL(res, TEST_FAILED, "decryption not failed");
11123 return TEST_SUCCESS;
11124 }
11125
11126 static int
test_AES_GCM_auth_decryption_fail_in_data_corrupt(void)11127 test_AES_GCM_auth_decryption_fail_in_data_corrupt(void)
11128 {
11129 struct aead_test_data tdata;
11130 int res;
11131
11132 RTE_LOG(INFO, USER1, "This is a negative test, errors are expected\n");
11133 memcpy(&tdata, &gcm_test_case_7, sizeof(struct aead_test_data));
11134 tdata.plaintext.data[0] += 1;
11135 res = test_authenticated_decryption(&tdata);
11136 if (res == TEST_SKIPPED)
11137 return res;
11138 TEST_ASSERT_EQUAL(res, TEST_FAILED, "decryption not failed");
11139 return TEST_SUCCESS;
11140 }
11141
11142 static int
test_AES_GCM_auth_decryption_fail_out_data_corrupt(void)11143 test_AES_GCM_auth_decryption_fail_out_data_corrupt(void)
11144 {
11145 struct aead_test_data tdata;
11146 int res;
11147
11148 memcpy(&tdata, &gcm_test_case_7, sizeof(struct aead_test_data));
11149 tdata.ciphertext.data[0] += 1;
11150 res = test_authenticated_decryption(&tdata);
11151 if (res == TEST_SKIPPED)
11152 return res;
11153 TEST_ASSERT_EQUAL(res, TEST_FAILED, "decryption not failed");
11154 return TEST_SUCCESS;
11155 }
11156
11157 static int
test_AES_GCM_auth_decryption_fail_aad_len_corrupt(void)11158 test_AES_GCM_auth_decryption_fail_aad_len_corrupt(void)
11159 {
11160 struct aead_test_data tdata;
11161 int res;
11162
11163 memcpy(&tdata, &gcm_test_case_7, sizeof(struct aead_test_data));
11164 tdata.aad.len += 1;
11165 res = test_authenticated_decryption(&tdata);
11166 if (res == TEST_SKIPPED)
11167 return res;
11168 TEST_ASSERT_EQUAL(res, TEST_FAILED, "decryption not failed");
11169 return TEST_SUCCESS;
11170 }
11171
11172 static int
test_AES_GCM_auth_decryption_fail_aad_corrupt(void)11173 test_AES_GCM_auth_decryption_fail_aad_corrupt(void)
11174 {
11175 struct aead_test_data tdata;
11176 uint8_t aad[gcm_test_case_7.aad.len];
11177 int res;
11178
11179 memcpy(&tdata, &gcm_test_case_7, sizeof(struct aead_test_data));
11180 memcpy(aad, gcm_test_case_7.aad.data, gcm_test_case_7.aad.len);
11181 aad[0] += 1;
11182 tdata.aad.data = aad;
11183 res = test_authenticated_decryption(&tdata);
11184 if (res == TEST_SKIPPED)
11185 return res;
11186 TEST_ASSERT_EQUAL(res, TEST_FAILED, "decryption not failed");
11187 return TEST_SUCCESS;
11188 }
11189
11190 static int
test_AES_GCM_auth_decryption_fail_tag_corrupt(void)11191 test_AES_GCM_auth_decryption_fail_tag_corrupt(void)
11192 {
11193 struct aead_test_data tdata;
11194 int res;
11195
11196 memcpy(&tdata, &gcm_test_case_7, sizeof(struct aead_test_data));
11197 tdata.auth_tag.data[0] += 1;
11198 res = test_authenticated_decryption(&tdata);
11199 if (res == TEST_SKIPPED)
11200 return res;
11201 TEST_ASSERT_EQUAL(res, TEST_FAILED, "authentication not failed");
11202 return TEST_SUCCESS;
11203 }
11204
11205 static int
test_authenticated_encryption_oop(const struct aead_test_data * tdata)11206 test_authenticated_encryption_oop(const struct aead_test_data *tdata)
11207 {
11208 struct crypto_testsuite_params *ts_params = &testsuite_params;
11209 struct crypto_unittest_params *ut_params = &unittest_params;
11210
11211 int retval;
11212 uint8_t *ciphertext, *auth_tag;
11213 uint16_t plaintext_pad_len;
11214 struct rte_cryptodev_info dev_info;
11215
11216 /* Verify the capabilities */
11217 struct rte_cryptodev_sym_capability_idx cap_idx;
11218 cap_idx.type = RTE_CRYPTO_SYM_XFORM_AEAD;
11219 cap_idx.algo.aead = tdata->algo;
11220 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
11221 &cap_idx) == NULL)
11222 return TEST_SKIPPED;
11223
11224 rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
11225 uint64_t feat_flags = dev_info.feature_flags;
11226
11227 if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
11228 (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP)))
11229 return TEST_SKIPPED;
11230
11231 /* not supported with CPU crypto */
11232 if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
11233 return TEST_SKIPPED;
11234
11235 /* Create AEAD session */
11236 retval = create_aead_session(ts_params->valid_devs[0],
11237 tdata->algo,
11238 RTE_CRYPTO_AEAD_OP_ENCRYPT,
11239 tdata->key.data, tdata->key.len,
11240 tdata->aad.len, tdata->auth_tag.len,
11241 tdata->iv.len);
11242 if (retval < 0)
11243 return retval;
11244
11245 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
11246 ut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
11247
11248 /* clear mbuf payload */
11249 memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
11250 rte_pktmbuf_tailroom(ut_params->ibuf));
11251 memset(rte_pktmbuf_mtod(ut_params->obuf, uint8_t *), 0,
11252 rte_pktmbuf_tailroom(ut_params->obuf));
11253
11254 /* Create AEAD operation */
11255 retval = create_aead_operation(RTE_CRYPTO_AEAD_OP_ENCRYPT, tdata);
11256 if (retval < 0)
11257 return retval;
11258
11259 rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
11260
11261 ut_params->op->sym->m_src = ut_params->ibuf;
11262 ut_params->op->sym->m_dst = ut_params->obuf;
11263
11264 /* Process crypto operation */
11265 if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
11266 process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
11267 ut_params->op, 0, 0, 0, 0);
11268 else
11269 TEST_ASSERT_NOT_NULL(process_crypto_request(ts_params->valid_devs[0],
11270 ut_params->op), "failed to process sym crypto op");
11271
11272 TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
11273 "crypto op processing failed");
11274
11275 plaintext_pad_len = RTE_ALIGN_CEIL(tdata->plaintext.len, 16);
11276
11277 ciphertext = rte_pktmbuf_mtod_offset(ut_params->obuf, uint8_t *,
11278 ut_params->op->sym->cipher.data.offset);
11279 auth_tag = ciphertext + plaintext_pad_len;
11280
11281 debug_hexdump(stdout, "ciphertext:", ciphertext, tdata->ciphertext.len);
11282 debug_hexdump(stdout, "auth tag:", auth_tag, tdata->auth_tag.len);
11283
11284 /* Validate obuf */
11285 TEST_ASSERT_BUFFERS_ARE_EQUAL(
11286 ciphertext,
11287 tdata->ciphertext.data,
11288 tdata->ciphertext.len,
11289 "Ciphertext data not as expected");
11290
11291 TEST_ASSERT_BUFFERS_ARE_EQUAL(
11292 auth_tag,
11293 tdata->auth_tag.data,
11294 tdata->auth_tag.len,
11295 "Generated auth tag not as expected");
11296
11297 return 0;
11298
11299 }
11300
11301 static int
test_AES_GCM_authenticated_encryption_oop_test_case_1(void)11302 test_AES_GCM_authenticated_encryption_oop_test_case_1(void)
11303 {
11304 return test_authenticated_encryption_oop(&gcm_test_case_5);
11305 }
11306
11307 static int
test_authenticated_decryption_oop(const struct aead_test_data * tdata)11308 test_authenticated_decryption_oop(const struct aead_test_data *tdata)
11309 {
11310 struct crypto_testsuite_params *ts_params = &testsuite_params;
11311 struct crypto_unittest_params *ut_params = &unittest_params;
11312
11313 int retval;
11314 uint8_t *plaintext;
11315 struct rte_cryptodev_info dev_info;
11316
11317 rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
11318 uint64_t feat_flags = dev_info.feature_flags;
11319
11320 /* Verify the capabilities */
11321 struct rte_cryptodev_sym_capability_idx cap_idx;
11322 cap_idx.type = RTE_CRYPTO_SYM_XFORM_AEAD;
11323 cap_idx.algo.aead = tdata->algo;
11324 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
11325 &cap_idx) == NULL)
11326 return TEST_SKIPPED;
11327
11328 /* not supported with CPU crypto and raw data-path APIs*/
11329 if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO ||
11330 global_api_test_type == CRYPTODEV_RAW_API_TEST)
11331 return TEST_SKIPPED;
11332
11333 if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
11334 (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
11335 printf("Device does not support RAW data-path APIs.\n");
11336 return TEST_SKIPPED;
11337 }
11338
11339 /* Create AEAD session */
11340 retval = create_aead_session(ts_params->valid_devs[0],
11341 tdata->algo,
11342 RTE_CRYPTO_AEAD_OP_DECRYPT,
11343 tdata->key.data, tdata->key.len,
11344 tdata->aad.len, tdata->auth_tag.len,
11345 tdata->iv.len);
11346 if (retval < 0)
11347 return retval;
11348
11349 /* alloc mbuf and set payload */
11350 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
11351 ut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
11352
11353 memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
11354 rte_pktmbuf_tailroom(ut_params->ibuf));
11355 memset(rte_pktmbuf_mtod(ut_params->obuf, uint8_t *), 0,
11356 rte_pktmbuf_tailroom(ut_params->obuf));
11357
11358 /* Create AEAD operation */
11359 retval = create_aead_operation(RTE_CRYPTO_AEAD_OP_DECRYPT, tdata);
11360 if (retval < 0)
11361 return retval;
11362
11363 rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
11364
11365 ut_params->op->sym->m_src = ut_params->ibuf;
11366 ut_params->op->sym->m_dst = ut_params->obuf;
11367
11368 /* Process crypto operation */
11369 if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
11370 process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
11371 ut_params->op, 0, 0, 0, 0);
11372 else
11373 TEST_ASSERT_NOT_NULL(process_crypto_request(ts_params->valid_devs[0],
11374 ut_params->op), "failed to process sym crypto op");
11375
11376 TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
11377 "crypto op processing failed");
11378
11379 plaintext = rte_pktmbuf_mtod_offset(ut_params->obuf, uint8_t *,
11380 ut_params->op->sym->cipher.data.offset);
11381
11382 debug_hexdump(stdout, "plaintext:", plaintext, tdata->ciphertext.len);
11383
11384 /* Validate obuf */
11385 TEST_ASSERT_BUFFERS_ARE_EQUAL(
11386 plaintext,
11387 tdata->plaintext.data,
11388 tdata->plaintext.len,
11389 "Plaintext data not as expected");
11390
11391 TEST_ASSERT_EQUAL(ut_params->op->status,
11392 RTE_CRYPTO_OP_STATUS_SUCCESS,
11393 "Authentication failed");
11394 return 0;
11395 }
11396
11397 static int
test_AES_GCM_authenticated_decryption_oop_test_case_1(void)11398 test_AES_GCM_authenticated_decryption_oop_test_case_1(void)
11399 {
11400 return test_authenticated_decryption_oop(&gcm_test_case_5);
11401 }
11402
11403 static int
test_authenticated_encryption_sessionless(const struct aead_test_data * tdata)11404 test_authenticated_encryption_sessionless(
11405 const struct aead_test_data *tdata)
11406 {
11407 struct crypto_testsuite_params *ts_params = &testsuite_params;
11408 struct crypto_unittest_params *ut_params = &unittest_params;
11409
11410 int retval;
11411 uint8_t *ciphertext, *auth_tag;
11412 uint16_t plaintext_pad_len;
11413 uint8_t key[tdata->key.len + 1];
11414 struct rte_cryptodev_info dev_info;
11415
11416 rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
11417 uint64_t feat_flags = dev_info.feature_flags;
11418
11419 if (!(feat_flags & RTE_CRYPTODEV_FF_SYM_SESSIONLESS)) {
11420 printf("Device doesn't support Sessionless ops.\n");
11421 return TEST_SKIPPED;
11422 }
11423
11424 /* not supported with CPU crypto */
11425 if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
11426 return TEST_SKIPPED;
11427
11428 /* Verify the capabilities */
11429 struct rte_cryptodev_sym_capability_idx cap_idx;
11430 cap_idx.type = RTE_CRYPTO_SYM_XFORM_AEAD;
11431 cap_idx.algo.aead = tdata->algo;
11432 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
11433 &cap_idx) == NULL)
11434 return TEST_SKIPPED;
11435
11436 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
11437
11438 /* clear mbuf payload */
11439 memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
11440 rte_pktmbuf_tailroom(ut_params->ibuf));
11441
11442 /* Create AEAD operation */
11443 retval = create_aead_operation(RTE_CRYPTO_AEAD_OP_ENCRYPT, tdata);
11444 if (retval < 0)
11445 return retval;
11446
11447 /* Create GCM xform */
11448 memcpy(key, tdata->key.data, tdata->key.len);
11449 retval = create_aead_xform(ut_params->op,
11450 tdata->algo,
11451 RTE_CRYPTO_AEAD_OP_ENCRYPT,
11452 key, tdata->key.len,
11453 tdata->aad.len, tdata->auth_tag.len,
11454 tdata->iv.len);
11455 if (retval < 0)
11456 return retval;
11457
11458 ut_params->op->sym->m_src = ut_params->ibuf;
11459
11460 TEST_ASSERT_EQUAL(ut_params->op->sess_type,
11461 RTE_CRYPTO_OP_SESSIONLESS,
11462 "crypto op session type not sessionless");
11463
11464 /* Process crypto operation */
11465 TEST_ASSERT_NOT_NULL(process_crypto_request(ts_params->valid_devs[0],
11466 ut_params->op), "failed to process sym crypto op");
11467
11468 TEST_ASSERT_NOT_NULL(ut_params->op, "failed crypto process");
11469
11470 TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
11471 "crypto op status not success");
11472
11473 plaintext_pad_len = RTE_ALIGN_CEIL(tdata->plaintext.len, 16);
11474
11475 ciphertext = rte_pktmbuf_mtod_offset(ut_params->ibuf, uint8_t *,
11476 ut_params->op->sym->cipher.data.offset);
11477 auth_tag = ciphertext + plaintext_pad_len;
11478
11479 debug_hexdump(stdout, "ciphertext:", ciphertext, tdata->ciphertext.len);
11480 debug_hexdump(stdout, "auth tag:", auth_tag, tdata->auth_tag.len);
11481
11482 /* Validate obuf */
11483 TEST_ASSERT_BUFFERS_ARE_EQUAL(
11484 ciphertext,
11485 tdata->ciphertext.data,
11486 tdata->ciphertext.len,
11487 "Ciphertext data not as expected");
11488
11489 TEST_ASSERT_BUFFERS_ARE_EQUAL(
11490 auth_tag,
11491 tdata->auth_tag.data,
11492 tdata->auth_tag.len,
11493 "Generated auth tag not as expected");
11494
11495 return 0;
11496
11497 }
11498
11499 static int
test_AES_GCM_authenticated_encryption_sessionless_test_case_1(void)11500 test_AES_GCM_authenticated_encryption_sessionless_test_case_1(void)
11501 {
11502 return test_authenticated_encryption_sessionless(
11503 &gcm_test_case_5);
11504 }
11505
11506 static int
test_authenticated_decryption_sessionless(const struct aead_test_data * tdata)11507 test_authenticated_decryption_sessionless(
11508 const struct aead_test_data *tdata)
11509 {
11510 struct crypto_testsuite_params *ts_params = &testsuite_params;
11511 struct crypto_unittest_params *ut_params = &unittest_params;
11512
11513 int retval;
11514 uint8_t *plaintext;
11515 uint8_t key[tdata->key.len + 1];
11516 struct rte_cryptodev_info dev_info;
11517
11518 rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
11519 uint64_t feat_flags = dev_info.feature_flags;
11520
11521 if (!(feat_flags & RTE_CRYPTODEV_FF_SYM_SESSIONLESS)) {
11522 printf("Device doesn't support Sessionless ops.\n");
11523 return TEST_SKIPPED;
11524 }
11525
11526 if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
11527 (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
11528 printf("Device doesn't support RAW data-path APIs.\n");
11529 return TEST_SKIPPED;
11530 }
11531
11532 /* not supported with CPU crypto */
11533 if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
11534 return TEST_SKIPPED;
11535
11536 /* Verify the capabilities */
11537 struct rte_cryptodev_sym_capability_idx cap_idx;
11538 cap_idx.type = RTE_CRYPTO_SYM_XFORM_AEAD;
11539 cap_idx.algo.aead = tdata->algo;
11540 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
11541 &cap_idx) == NULL)
11542 return TEST_SKIPPED;
11543
11544 /* alloc mbuf and set payload */
11545 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
11546
11547 memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
11548 rte_pktmbuf_tailroom(ut_params->ibuf));
11549
11550 /* Create AEAD operation */
11551 retval = create_aead_operation(RTE_CRYPTO_AEAD_OP_DECRYPT, tdata);
11552 if (retval < 0)
11553 return retval;
11554
11555 /* Create AEAD xform */
11556 memcpy(key, tdata->key.data, tdata->key.len);
11557 retval = create_aead_xform(ut_params->op,
11558 tdata->algo,
11559 RTE_CRYPTO_AEAD_OP_DECRYPT,
11560 key, tdata->key.len,
11561 tdata->aad.len, tdata->auth_tag.len,
11562 tdata->iv.len);
11563 if (retval < 0)
11564 return retval;
11565
11566 ut_params->op->sym->m_src = ut_params->ibuf;
11567
11568 TEST_ASSERT_EQUAL(ut_params->op->sess_type,
11569 RTE_CRYPTO_OP_SESSIONLESS,
11570 "crypto op session type not sessionless");
11571
11572 /* Process crypto operation */
11573 if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
11574 process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
11575 ut_params->op, 0, 0, 0, 0);
11576 else
11577 TEST_ASSERT_NOT_NULL(process_crypto_request(
11578 ts_params->valid_devs[0], ut_params->op),
11579 "failed to process sym crypto op");
11580
11581 TEST_ASSERT_NOT_NULL(ut_params->op, "failed crypto process");
11582
11583 TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
11584 "crypto op status not success");
11585
11586 plaintext = rte_pktmbuf_mtod_offset(ut_params->ibuf, uint8_t *,
11587 ut_params->op->sym->cipher.data.offset);
11588
11589 debug_hexdump(stdout, "plaintext:", plaintext, tdata->ciphertext.len);
11590
11591 /* Validate obuf */
11592 TEST_ASSERT_BUFFERS_ARE_EQUAL(
11593 plaintext,
11594 tdata->plaintext.data,
11595 tdata->plaintext.len,
11596 "Plaintext data not as expected");
11597
11598 TEST_ASSERT_EQUAL(ut_params->op->status,
11599 RTE_CRYPTO_OP_STATUS_SUCCESS,
11600 "Authentication failed");
11601 return 0;
11602 }
11603
11604 static int
test_AES_GCM_authenticated_decryption_sessionless_test_case_1(void)11605 test_AES_GCM_authenticated_decryption_sessionless_test_case_1(void)
11606 {
11607 return test_authenticated_decryption_sessionless(
11608 &gcm_test_case_5);
11609 }
11610
11611 static int
test_AES_CCM_authenticated_encryption_test_case_128_1(void)11612 test_AES_CCM_authenticated_encryption_test_case_128_1(void)
11613 {
11614 return test_authenticated_encryption(&ccm_test_case_128_1);
11615 }
11616
11617 static int
test_AES_CCM_authenticated_encryption_test_case_128_2(void)11618 test_AES_CCM_authenticated_encryption_test_case_128_2(void)
11619 {
11620 return test_authenticated_encryption(&ccm_test_case_128_2);
11621 }
11622
11623 static int
test_AES_CCM_authenticated_encryption_test_case_128_3(void)11624 test_AES_CCM_authenticated_encryption_test_case_128_3(void)
11625 {
11626 return test_authenticated_encryption(&ccm_test_case_128_3);
11627 }
11628
11629 static int
test_AES_CCM_authenticated_decryption_test_case_128_1(void)11630 test_AES_CCM_authenticated_decryption_test_case_128_1(void)
11631 {
11632 return test_authenticated_decryption(&ccm_test_case_128_1);
11633 }
11634
11635 static int
test_AES_CCM_authenticated_decryption_test_case_128_2(void)11636 test_AES_CCM_authenticated_decryption_test_case_128_2(void)
11637 {
11638 return test_authenticated_decryption(&ccm_test_case_128_2);
11639 }
11640
11641 static int
test_AES_CCM_authenticated_decryption_test_case_128_3(void)11642 test_AES_CCM_authenticated_decryption_test_case_128_3(void)
11643 {
11644 return test_authenticated_decryption(&ccm_test_case_128_3);
11645 }
11646
11647 static int
test_AES_CCM_authenticated_encryption_test_case_192_1(void)11648 test_AES_CCM_authenticated_encryption_test_case_192_1(void)
11649 {
11650 return test_authenticated_encryption(&ccm_test_case_192_1);
11651 }
11652
11653 static int
test_AES_CCM_authenticated_encryption_test_case_192_2(void)11654 test_AES_CCM_authenticated_encryption_test_case_192_2(void)
11655 {
11656 return test_authenticated_encryption(&ccm_test_case_192_2);
11657 }
11658
11659 static int
test_AES_CCM_authenticated_encryption_test_case_192_3(void)11660 test_AES_CCM_authenticated_encryption_test_case_192_3(void)
11661 {
11662 return test_authenticated_encryption(&ccm_test_case_192_3);
11663 }
11664
11665 static int
test_AES_CCM_authenticated_decryption_test_case_192_1(void)11666 test_AES_CCM_authenticated_decryption_test_case_192_1(void)
11667 {
11668 return test_authenticated_decryption(&ccm_test_case_192_1);
11669 }
11670
11671 static int
test_AES_CCM_authenticated_decryption_test_case_192_2(void)11672 test_AES_CCM_authenticated_decryption_test_case_192_2(void)
11673 {
11674 return test_authenticated_decryption(&ccm_test_case_192_2);
11675 }
11676
11677 static int
test_AES_CCM_authenticated_decryption_test_case_192_3(void)11678 test_AES_CCM_authenticated_decryption_test_case_192_3(void)
11679 {
11680 return test_authenticated_decryption(&ccm_test_case_192_3);
11681 }
11682
11683 static int
test_AES_CCM_authenticated_encryption_test_case_256_1(void)11684 test_AES_CCM_authenticated_encryption_test_case_256_1(void)
11685 {
11686 return test_authenticated_encryption(&ccm_test_case_256_1);
11687 }
11688
11689 static int
test_AES_CCM_authenticated_encryption_test_case_256_2(void)11690 test_AES_CCM_authenticated_encryption_test_case_256_2(void)
11691 {
11692 return test_authenticated_encryption(&ccm_test_case_256_2);
11693 }
11694
11695 static int
test_AES_CCM_authenticated_encryption_test_case_256_3(void)11696 test_AES_CCM_authenticated_encryption_test_case_256_3(void)
11697 {
11698 return test_authenticated_encryption(&ccm_test_case_256_3);
11699 }
11700
11701 static int
test_AES_CCM_authenticated_decryption_test_case_256_1(void)11702 test_AES_CCM_authenticated_decryption_test_case_256_1(void)
11703 {
11704 return test_authenticated_decryption(&ccm_test_case_256_1);
11705 }
11706
11707 static int
test_AES_CCM_authenticated_decryption_test_case_256_2(void)11708 test_AES_CCM_authenticated_decryption_test_case_256_2(void)
11709 {
11710 return test_authenticated_decryption(&ccm_test_case_256_2);
11711 }
11712
11713 static int
test_AES_CCM_authenticated_decryption_test_case_256_3(void)11714 test_AES_CCM_authenticated_decryption_test_case_256_3(void)
11715 {
11716 return test_authenticated_decryption(&ccm_test_case_256_3);
11717 }
11718
11719 static int
test_stats(void)11720 test_stats(void)
11721 {
11722 struct crypto_testsuite_params *ts_params = &testsuite_params;
11723 struct rte_cryptodev_stats stats;
11724
11725 if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
11726 return TEST_SKIPPED;
11727
11728 /* Verify the capabilities */
11729 struct rte_cryptodev_sym_capability_idx cap_idx;
11730 cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
11731 cap_idx.algo.auth = RTE_CRYPTO_AUTH_SHA1_HMAC;
11732 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
11733 &cap_idx) == NULL)
11734 return TEST_SKIPPED;
11735 cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
11736 cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_AES_CBC;
11737 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
11738 &cap_idx) == NULL)
11739 return TEST_SKIPPED;
11740
11741 if (rte_cryptodev_stats_get(ts_params->valid_devs[0], &stats)
11742 == -ENOTSUP)
11743 return TEST_SKIPPED;
11744
11745 rte_cryptodev_stats_reset(ts_params->valid_devs[0]);
11746 TEST_ASSERT((rte_cryptodev_stats_get(ts_params->valid_devs[0] + 600,
11747 &stats) == -ENODEV),
11748 "rte_cryptodev_stats_get invalid dev failed");
11749 TEST_ASSERT((rte_cryptodev_stats_get(ts_params->valid_devs[0], 0) != 0),
11750 "rte_cryptodev_stats_get invalid Param failed");
11751
11752 /* Test expected values */
11753 test_AES_CBC_HMAC_SHA1_encrypt_digest();
11754 TEST_ASSERT_SUCCESS(rte_cryptodev_stats_get(ts_params->valid_devs[0],
11755 &stats),
11756 "rte_cryptodev_stats_get failed");
11757 TEST_ASSERT((stats.enqueued_count == 1),
11758 "rte_cryptodev_stats_get returned unexpected enqueued stat");
11759 TEST_ASSERT((stats.dequeued_count == 1),
11760 "rte_cryptodev_stats_get returned unexpected enqueued stat");
11761 TEST_ASSERT((stats.enqueue_err_count == 0),
11762 "rte_cryptodev_stats_get returned unexpected enqueued stat");
11763 TEST_ASSERT((stats.dequeue_err_count == 0),
11764 "rte_cryptodev_stats_get returned unexpected enqueued stat");
11765
11766 /* invalid device but should ignore and not reset device stats*/
11767 rte_cryptodev_stats_reset(ts_params->valid_devs[0] + 300);
11768 TEST_ASSERT_SUCCESS(rte_cryptodev_stats_get(ts_params->valid_devs[0],
11769 &stats),
11770 "rte_cryptodev_stats_get failed");
11771 TEST_ASSERT((stats.enqueued_count == 1),
11772 "rte_cryptodev_stats_get returned unexpected enqueued stat");
11773
11774 /* check that a valid reset clears stats */
11775 rte_cryptodev_stats_reset(ts_params->valid_devs[0]);
11776 TEST_ASSERT_SUCCESS(rte_cryptodev_stats_get(ts_params->valid_devs[0],
11777 &stats),
11778 "rte_cryptodev_stats_get failed");
11779 TEST_ASSERT((stats.enqueued_count == 0),
11780 "rte_cryptodev_stats_get returned unexpected enqueued stat");
11781 TEST_ASSERT((stats.dequeued_count == 0),
11782 "rte_cryptodev_stats_get returned unexpected enqueued stat");
11783
11784 return TEST_SUCCESS;
11785 }
11786
MD5_HMAC_create_session(struct crypto_testsuite_params * ts_params,struct crypto_unittest_params * ut_params,enum rte_crypto_auth_operation op,const struct HMAC_MD5_vector * test_case)11787 static int MD5_HMAC_create_session(struct crypto_testsuite_params *ts_params,
11788 struct crypto_unittest_params *ut_params,
11789 enum rte_crypto_auth_operation op,
11790 const struct HMAC_MD5_vector *test_case)
11791 {
11792 uint8_t key[64];
11793 int status;
11794
11795 memcpy(key, test_case->key.data, test_case->key.len);
11796
11797 ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;
11798 ut_params->auth_xform.next = NULL;
11799 ut_params->auth_xform.auth.op = op;
11800
11801 ut_params->auth_xform.auth.algo = RTE_CRYPTO_AUTH_MD5_HMAC;
11802
11803 ut_params->auth_xform.auth.digest_length = MD5_DIGEST_LEN;
11804 ut_params->auth_xform.auth.key.length = test_case->key.len;
11805 ut_params->auth_xform.auth.key.data = key;
11806
11807 ut_params->sess = rte_cryptodev_sym_session_create(
11808 ts_params->session_mpool);
11809 TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed");
11810 if (ut_params->sess == NULL)
11811 return TEST_FAILED;
11812
11813 status = rte_cryptodev_sym_session_init(ts_params->valid_devs[0],
11814 ut_params->sess, &ut_params->auth_xform,
11815 ts_params->session_priv_mpool);
11816 if (status == -ENOTSUP)
11817 return TEST_SKIPPED;
11818
11819 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
11820
11821 memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
11822 rte_pktmbuf_tailroom(ut_params->ibuf));
11823
11824 return 0;
11825 }
11826
MD5_HMAC_create_op(struct crypto_unittest_params * ut_params,const struct HMAC_MD5_vector * test_case,uint8_t ** plaintext)11827 static int MD5_HMAC_create_op(struct crypto_unittest_params *ut_params,
11828 const struct HMAC_MD5_vector *test_case,
11829 uint8_t **plaintext)
11830 {
11831 uint16_t plaintext_pad_len;
11832
11833 struct rte_crypto_sym_op *sym_op = ut_params->op->sym;
11834
11835 plaintext_pad_len = RTE_ALIGN_CEIL(test_case->plaintext.len,
11836 16);
11837
11838 *plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
11839 plaintext_pad_len);
11840 memcpy(*plaintext, test_case->plaintext.data,
11841 test_case->plaintext.len);
11842
11843 sym_op->auth.digest.data = (uint8_t *)rte_pktmbuf_append(
11844 ut_params->ibuf, MD5_DIGEST_LEN);
11845 TEST_ASSERT_NOT_NULL(sym_op->auth.digest.data,
11846 "no room to append digest");
11847 sym_op->auth.digest.phys_addr = rte_pktmbuf_iova_offset(
11848 ut_params->ibuf, plaintext_pad_len);
11849
11850 if (ut_params->auth_xform.auth.op == RTE_CRYPTO_AUTH_OP_VERIFY) {
11851 rte_memcpy(sym_op->auth.digest.data, test_case->auth_tag.data,
11852 test_case->auth_tag.len);
11853 }
11854
11855 sym_op->auth.data.offset = 0;
11856 sym_op->auth.data.length = test_case->plaintext.len;
11857
11858 rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
11859 ut_params->op->sym->m_src = ut_params->ibuf;
11860
11861 return 0;
11862 }
11863
11864 static int
test_MD5_HMAC_generate(const struct HMAC_MD5_vector * test_case)11865 test_MD5_HMAC_generate(const struct HMAC_MD5_vector *test_case)
11866 {
11867 uint16_t plaintext_pad_len;
11868 uint8_t *plaintext, *auth_tag;
11869
11870 struct crypto_testsuite_params *ts_params = &testsuite_params;
11871 struct crypto_unittest_params *ut_params = &unittest_params;
11872 struct rte_cryptodev_info dev_info;
11873
11874 rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
11875 uint64_t feat_flags = dev_info.feature_flags;
11876
11877 if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
11878 (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
11879 printf("Device doesn't support RAW data-path APIs.\n");
11880 return TEST_SKIPPED;
11881 }
11882
11883 /* Verify the capabilities */
11884 struct rte_cryptodev_sym_capability_idx cap_idx;
11885 cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
11886 cap_idx.algo.auth = RTE_CRYPTO_AUTH_MD5_HMAC;
11887 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
11888 &cap_idx) == NULL)
11889 return TEST_SKIPPED;
11890
11891 if (MD5_HMAC_create_session(ts_params, ut_params,
11892 RTE_CRYPTO_AUTH_OP_GENERATE, test_case))
11893 return TEST_FAILED;
11894
11895 /* Generate Crypto op data structure */
11896 ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
11897 RTE_CRYPTO_OP_TYPE_SYMMETRIC);
11898 TEST_ASSERT_NOT_NULL(ut_params->op,
11899 "Failed to allocate symmetric crypto operation struct");
11900
11901 plaintext_pad_len = RTE_ALIGN_CEIL(test_case->plaintext.len,
11902 16);
11903
11904 if (MD5_HMAC_create_op(ut_params, test_case, &plaintext))
11905 return TEST_FAILED;
11906
11907 if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
11908 process_cpu_crypt_auth_op(ts_params->valid_devs[0],
11909 ut_params->op);
11910 else if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
11911 process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
11912 ut_params->op, 0, 1, 0, 0);
11913 else
11914 TEST_ASSERT_NOT_NULL(
11915 process_crypto_request(ts_params->valid_devs[0],
11916 ut_params->op),
11917 "failed to process sym crypto op");
11918
11919 TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
11920 "crypto op processing failed");
11921
11922 if (ut_params->op->sym->m_dst) {
11923 auth_tag = rte_pktmbuf_mtod_offset(ut_params->op->sym->m_dst,
11924 uint8_t *, plaintext_pad_len);
11925 } else {
11926 auth_tag = plaintext + plaintext_pad_len;
11927 }
11928
11929 TEST_ASSERT_BUFFERS_ARE_EQUAL(
11930 auth_tag,
11931 test_case->auth_tag.data,
11932 test_case->auth_tag.len,
11933 "HMAC_MD5 generated tag not as expected");
11934
11935 return TEST_SUCCESS;
11936 }
11937
11938 static int
test_MD5_HMAC_verify(const struct HMAC_MD5_vector * test_case)11939 test_MD5_HMAC_verify(const struct HMAC_MD5_vector *test_case)
11940 {
11941 uint8_t *plaintext;
11942
11943 struct crypto_testsuite_params *ts_params = &testsuite_params;
11944 struct crypto_unittest_params *ut_params = &unittest_params;
11945 struct rte_cryptodev_info dev_info;
11946
11947 rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
11948 uint64_t feat_flags = dev_info.feature_flags;
11949
11950 if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
11951 (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
11952 printf("Device doesn't support RAW data-path APIs.\n");
11953 return TEST_SKIPPED;
11954 }
11955
11956 /* Verify the capabilities */
11957 struct rte_cryptodev_sym_capability_idx cap_idx;
11958 cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
11959 cap_idx.algo.auth = RTE_CRYPTO_AUTH_MD5_HMAC;
11960 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
11961 &cap_idx) == NULL)
11962 return TEST_SKIPPED;
11963
11964 if (MD5_HMAC_create_session(ts_params, ut_params,
11965 RTE_CRYPTO_AUTH_OP_VERIFY, test_case)) {
11966 return TEST_FAILED;
11967 }
11968
11969 /* Generate Crypto op data structure */
11970 ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
11971 RTE_CRYPTO_OP_TYPE_SYMMETRIC);
11972 TEST_ASSERT_NOT_NULL(ut_params->op,
11973 "Failed to allocate symmetric crypto operation struct");
11974
11975 if (MD5_HMAC_create_op(ut_params, test_case, &plaintext))
11976 return TEST_FAILED;
11977
11978 if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
11979 process_cpu_crypt_auth_op(ts_params->valid_devs[0],
11980 ut_params->op);
11981 else if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
11982 process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
11983 ut_params->op, 0, 1, 0, 0);
11984 else
11985 TEST_ASSERT_NOT_NULL(
11986 process_crypto_request(ts_params->valid_devs[0],
11987 ut_params->op),
11988 "failed to process sym crypto op");
11989
11990 TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
11991 "HMAC_MD5 crypto op processing failed");
11992
11993 return TEST_SUCCESS;
11994 }
11995
11996 static int
test_MD5_HMAC_generate_case_1(void)11997 test_MD5_HMAC_generate_case_1(void)
11998 {
11999 return test_MD5_HMAC_generate(&HMAC_MD5_test_case_1);
12000 }
12001
12002 static int
test_MD5_HMAC_verify_case_1(void)12003 test_MD5_HMAC_verify_case_1(void)
12004 {
12005 return test_MD5_HMAC_verify(&HMAC_MD5_test_case_1);
12006 }
12007
12008 static int
test_MD5_HMAC_generate_case_2(void)12009 test_MD5_HMAC_generate_case_2(void)
12010 {
12011 return test_MD5_HMAC_generate(&HMAC_MD5_test_case_2);
12012 }
12013
12014 static int
test_MD5_HMAC_verify_case_2(void)12015 test_MD5_HMAC_verify_case_2(void)
12016 {
12017 return test_MD5_HMAC_verify(&HMAC_MD5_test_case_2);
12018 }
12019
12020 static int
test_multi_session(void)12021 test_multi_session(void)
12022 {
12023 struct crypto_testsuite_params *ts_params = &testsuite_params;
12024 struct crypto_unittest_params *ut_params = &unittest_params;
12025
12026 struct rte_cryptodev_info dev_info;
12027 struct rte_cryptodev_sym_session **sessions;
12028
12029 uint16_t i;
12030 int status;
12031
12032 /* Verify the capabilities */
12033 struct rte_cryptodev_sym_capability_idx cap_idx;
12034 cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
12035 cap_idx.algo.auth = RTE_CRYPTO_AUTH_SHA512_HMAC;
12036 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
12037 &cap_idx) == NULL)
12038 return TEST_SKIPPED;
12039 cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
12040 cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_AES_CBC;
12041 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
12042 &cap_idx) == NULL)
12043 return TEST_SKIPPED;
12044
12045 test_AES_CBC_HMAC_SHA512_decrypt_create_session_params(ut_params,
12046 aes_cbc_key, hmac_sha512_key);
12047
12048
12049 rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
12050
12051 sessions = rte_malloc(NULL,
12052 sizeof(struct rte_cryptodev_sym_session *) *
12053 (MAX_NB_SESSIONS + 1), 0);
12054
12055 /* Create multiple crypto sessions*/
12056 for (i = 0; i < MAX_NB_SESSIONS; i++) {
12057
12058 sessions[i] = rte_cryptodev_sym_session_create(
12059 ts_params->session_mpool);
12060 TEST_ASSERT_NOT_NULL(sessions[i],
12061 "Session creation failed at session number %u",
12062 i);
12063
12064 status = rte_cryptodev_sym_session_init(
12065 ts_params->valid_devs[0],
12066 sessions[i], &ut_params->auth_xform,
12067 ts_params->session_priv_mpool);
12068 if (status == -ENOTSUP)
12069 return TEST_SKIPPED;
12070
12071 /* Attempt to send a request on each session */
12072 TEST_ASSERT_SUCCESS( test_AES_CBC_HMAC_SHA512_decrypt_perform(
12073 sessions[i],
12074 ut_params,
12075 ts_params,
12076 catch_22_quote_2_512_bytes_AES_CBC_ciphertext,
12077 catch_22_quote_2_512_bytes_AES_CBC_HMAC_SHA512_digest,
12078 aes_cbc_iv),
12079 "Failed to perform decrypt on request number %u.", i);
12080 /* free crypto operation structure */
12081 if (ut_params->op)
12082 rte_crypto_op_free(ut_params->op);
12083
12084 /*
12085 * free mbuf - both obuf and ibuf are usually the same,
12086 * so check if they point at the same address is necessary,
12087 * to avoid freeing the mbuf twice.
12088 */
12089 if (ut_params->obuf) {
12090 rte_pktmbuf_free(ut_params->obuf);
12091 if (ut_params->ibuf == ut_params->obuf)
12092 ut_params->ibuf = 0;
12093 ut_params->obuf = 0;
12094 }
12095 if (ut_params->ibuf) {
12096 rte_pktmbuf_free(ut_params->ibuf);
12097 ut_params->ibuf = 0;
12098 }
12099 }
12100
12101 sessions[i] = NULL;
12102 /* Next session create should fail */
12103 rte_cryptodev_sym_session_init(ts_params->valid_devs[0],
12104 sessions[i], &ut_params->auth_xform,
12105 ts_params->session_priv_mpool);
12106 TEST_ASSERT_NULL(sessions[i],
12107 "Session creation succeeded unexpectedly!");
12108
12109 for (i = 0; i < MAX_NB_SESSIONS; i++) {
12110 rte_cryptodev_sym_session_clear(ts_params->valid_devs[0],
12111 sessions[i]);
12112 rte_cryptodev_sym_session_free(sessions[i]);
12113 }
12114
12115 rte_free(sessions);
12116
12117 return TEST_SUCCESS;
12118 }
12119
12120 struct multi_session_params {
12121 struct crypto_unittest_params ut_params;
12122 uint8_t *cipher_key;
12123 uint8_t *hmac_key;
12124 const uint8_t *cipher;
12125 const uint8_t *digest;
12126 uint8_t *iv;
12127 };
12128
12129 #define MB_SESSION_NUMBER 3
12130
12131 static int
test_multi_session_random_usage(void)12132 test_multi_session_random_usage(void)
12133 {
12134 struct crypto_testsuite_params *ts_params = &testsuite_params;
12135 struct rte_cryptodev_info dev_info;
12136 struct rte_cryptodev_sym_session **sessions;
12137 uint32_t i, j;
12138 struct multi_session_params ut_paramz[] = {
12139
12140 {
12141 .cipher_key = ms_aes_cbc_key0,
12142 .hmac_key = ms_hmac_key0,
12143 .cipher = ms_aes_cbc_cipher0,
12144 .digest = ms_hmac_digest0,
12145 .iv = ms_aes_cbc_iv0
12146 },
12147 {
12148 .cipher_key = ms_aes_cbc_key1,
12149 .hmac_key = ms_hmac_key1,
12150 .cipher = ms_aes_cbc_cipher1,
12151 .digest = ms_hmac_digest1,
12152 .iv = ms_aes_cbc_iv1
12153 },
12154 {
12155 .cipher_key = ms_aes_cbc_key2,
12156 .hmac_key = ms_hmac_key2,
12157 .cipher = ms_aes_cbc_cipher2,
12158 .digest = ms_hmac_digest2,
12159 .iv = ms_aes_cbc_iv2
12160 },
12161
12162 };
12163 int status;
12164
12165 /* Verify the capabilities */
12166 struct rte_cryptodev_sym_capability_idx cap_idx;
12167 cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
12168 cap_idx.algo.auth = RTE_CRYPTO_AUTH_SHA512_HMAC;
12169 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
12170 &cap_idx) == NULL)
12171 return TEST_SKIPPED;
12172 cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
12173 cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_AES_CBC;
12174 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
12175 &cap_idx) == NULL)
12176 return TEST_SKIPPED;
12177
12178 rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
12179
12180 sessions = rte_malloc(NULL,
12181 (sizeof(struct rte_cryptodev_sym_session *)
12182 * MAX_NB_SESSIONS) + 1, 0);
12183
12184 for (i = 0; i < MB_SESSION_NUMBER; i++) {
12185 sessions[i] = rte_cryptodev_sym_session_create(
12186 ts_params->session_mpool);
12187 TEST_ASSERT_NOT_NULL(sessions[i],
12188 "Session creation failed at session number %u",
12189 i);
12190
12191 rte_memcpy(&ut_paramz[i].ut_params, &unittest_params,
12192 sizeof(struct crypto_unittest_params));
12193
12194 test_AES_CBC_HMAC_SHA512_decrypt_create_session_params(
12195 &ut_paramz[i].ut_params,
12196 ut_paramz[i].cipher_key, ut_paramz[i].hmac_key);
12197
12198 /* Create multiple crypto sessions*/
12199 status = rte_cryptodev_sym_session_init(
12200 ts_params->valid_devs[0],
12201 sessions[i],
12202 &ut_paramz[i].ut_params.auth_xform,
12203 ts_params->session_priv_mpool);
12204
12205 if (status == -ENOTSUP)
12206 return TEST_SKIPPED;
12207
12208 TEST_ASSERT_EQUAL(status, 0, "Session init failed");
12209 }
12210
12211 srand(time(NULL));
12212 for (i = 0; i < 40000; i++) {
12213
12214 j = rand() % MB_SESSION_NUMBER;
12215
12216 TEST_ASSERT_SUCCESS(
12217 test_AES_CBC_HMAC_SHA512_decrypt_perform(
12218 sessions[j],
12219 &ut_paramz[j].ut_params,
12220 ts_params, ut_paramz[j].cipher,
12221 ut_paramz[j].digest,
12222 ut_paramz[j].iv),
12223 "Failed to perform decrypt on request number %u.", i);
12224
12225 if (ut_paramz[j].ut_params.op)
12226 rte_crypto_op_free(ut_paramz[j].ut_params.op);
12227
12228 /*
12229 * free mbuf - both obuf and ibuf are usually the same,
12230 * so check if they point at the same address is necessary,
12231 * to avoid freeing the mbuf twice.
12232 */
12233 if (ut_paramz[j].ut_params.obuf) {
12234 rte_pktmbuf_free(ut_paramz[j].ut_params.obuf);
12235 if (ut_paramz[j].ut_params.ibuf
12236 == ut_paramz[j].ut_params.obuf)
12237 ut_paramz[j].ut_params.ibuf = 0;
12238 ut_paramz[j].ut_params.obuf = 0;
12239 }
12240 if (ut_paramz[j].ut_params.ibuf) {
12241 rte_pktmbuf_free(ut_paramz[j].ut_params.ibuf);
12242 ut_paramz[j].ut_params.ibuf = 0;
12243 }
12244 }
12245
12246 for (i = 0; i < MB_SESSION_NUMBER; i++) {
12247 rte_cryptodev_sym_session_clear(ts_params->valid_devs[0],
12248 sessions[i]);
12249 rte_cryptodev_sym_session_free(sessions[i]);
12250 }
12251
12252 rte_free(sessions);
12253
12254 return TEST_SUCCESS;
12255 }
12256
12257 uint8_t orig_data[] = {0xab, 0xab, 0xab, 0xab,
12258 0xab, 0xab, 0xab, 0xab,
12259 0xab, 0xab, 0xab, 0xab,
12260 0xab, 0xab, 0xab, 0xab};
12261
12262 static int
test_null_invalid_operation(void)12263 test_null_invalid_operation(void)
12264 {
12265 struct crypto_testsuite_params *ts_params = &testsuite_params;
12266 struct crypto_unittest_params *ut_params = &unittest_params;
12267 int ret;
12268
12269 /* This test is for NULL PMD only */
12270 if (gbl_driver_id != rte_cryptodev_driver_id_get(
12271 RTE_STR(CRYPTODEV_NAME_NULL_PMD)))
12272 return TEST_SKIPPED;
12273
12274 /* Setup Cipher Parameters */
12275 ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
12276 ut_params->cipher_xform.next = NULL;
12277
12278 ut_params->cipher_xform.cipher.algo = RTE_CRYPTO_CIPHER_AES_CBC;
12279 ut_params->cipher_xform.cipher.op = RTE_CRYPTO_CIPHER_OP_ENCRYPT;
12280
12281 ut_params->sess = rte_cryptodev_sym_session_create(
12282 ts_params->session_mpool);
12283
12284 /* Create Crypto session*/
12285 ret = rte_cryptodev_sym_session_init(ts_params->valid_devs[0],
12286 ut_params->sess, &ut_params->cipher_xform,
12287 ts_params->session_priv_mpool);
12288 TEST_ASSERT(ret < 0,
12289 "Session creation succeeded unexpectedly");
12290
12291
12292 /* Setup HMAC Parameters */
12293 ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;
12294 ut_params->auth_xform.next = NULL;
12295
12296 ut_params->auth_xform.auth.algo = RTE_CRYPTO_AUTH_SHA1_HMAC;
12297 ut_params->auth_xform.auth.op = RTE_CRYPTO_AUTH_OP_GENERATE;
12298
12299 ut_params->sess = rte_cryptodev_sym_session_create(
12300 ts_params->session_mpool);
12301
12302 /* Create Crypto session*/
12303 ret = rte_cryptodev_sym_session_init(ts_params->valid_devs[0],
12304 ut_params->sess, &ut_params->auth_xform,
12305 ts_params->session_priv_mpool);
12306 TEST_ASSERT(ret < 0,
12307 "Session creation succeeded unexpectedly");
12308
12309 return TEST_SUCCESS;
12310 }
12311
12312
12313 #define NULL_BURST_LENGTH (32)
12314
12315 static int
test_null_burst_operation(void)12316 test_null_burst_operation(void)
12317 {
12318 struct crypto_testsuite_params *ts_params = &testsuite_params;
12319 struct crypto_unittest_params *ut_params = &unittest_params;
12320 int status;
12321
12322 unsigned i, burst_len = NULL_BURST_LENGTH;
12323
12324 struct rte_crypto_op *burst[NULL_BURST_LENGTH] = { NULL };
12325 struct rte_crypto_op *burst_dequeued[NULL_BURST_LENGTH] = { NULL };
12326
12327 /* This test is for NULL PMD only */
12328 if (gbl_driver_id != rte_cryptodev_driver_id_get(
12329 RTE_STR(CRYPTODEV_NAME_NULL_PMD)))
12330 return TEST_SKIPPED;
12331
12332 /* Setup Cipher Parameters */
12333 ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
12334 ut_params->cipher_xform.next = &ut_params->auth_xform;
12335
12336 ut_params->cipher_xform.cipher.algo = RTE_CRYPTO_CIPHER_NULL;
12337 ut_params->cipher_xform.cipher.op = RTE_CRYPTO_CIPHER_OP_ENCRYPT;
12338
12339 /* Setup HMAC Parameters */
12340 ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;
12341 ut_params->auth_xform.next = NULL;
12342
12343 ut_params->auth_xform.auth.algo = RTE_CRYPTO_AUTH_NULL;
12344 ut_params->auth_xform.auth.op = RTE_CRYPTO_AUTH_OP_GENERATE;
12345
12346 ut_params->sess = rte_cryptodev_sym_session_create(
12347 ts_params->session_mpool);
12348 TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed");
12349
12350 /* Create Crypto session*/
12351 status = rte_cryptodev_sym_session_init(ts_params->valid_devs[0],
12352 ut_params->sess, &ut_params->cipher_xform,
12353 ts_params->session_priv_mpool);
12354
12355 if (status == -ENOTSUP)
12356 return TEST_SKIPPED;
12357
12358 TEST_ASSERT_EQUAL(status, 0, "Session init failed");
12359
12360 TEST_ASSERT_EQUAL(rte_crypto_op_bulk_alloc(ts_params->op_mpool,
12361 RTE_CRYPTO_OP_TYPE_SYMMETRIC, burst, burst_len),
12362 burst_len, "failed to generate burst of crypto ops");
12363
12364 /* Generate an operation for each mbuf in burst */
12365 for (i = 0; i < burst_len; i++) {
12366 struct rte_mbuf *m = rte_pktmbuf_alloc(ts_params->mbuf_pool);
12367
12368 TEST_ASSERT_NOT_NULL(m, "Failed to allocate mbuf");
12369
12370 unsigned *data = (unsigned *)rte_pktmbuf_append(m,
12371 sizeof(unsigned));
12372 *data = i;
12373
12374 rte_crypto_op_attach_sym_session(burst[i], ut_params->sess);
12375
12376 burst[i]->sym->m_src = m;
12377 }
12378
12379 /* Process crypto operation */
12380 TEST_ASSERT_EQUAL(rte_cryptodev_enqueue_burst(ts_params->valid_devs[0],
12381 0, burst, burst_len),
12382 burst_len,
12383 "Error enqueuing burst");
12384
12385 TEST_ASSERT_EQUAL(rte_cryptodev_dequeue_burst(ts_params->valid_devs[0],
12386 0, burst_dequeued, burst_len),
12387 burst_len,
12388 "Error dequeuing burst");
12389
12390
12391 for (i = 0; i < burst_len; i++) {
12392 TEST_ASSERT_EQUAL(
12393 *rte_pktmbuf_mtod(burst[i]->sym->m_src, uint32_t *),
12394 *rte_pktmbuf_mtod(burst_dequeued[i]->sym->m_src,
12395 uint32_t *),
12396 "data not as expected");
12397
12398 rte_pktmbuf_free(burst[i]->sym->m_src);
12399 rte_crypto_op_free(burst[i]);
12400 }
12401
12402 return TEST_SUCCESS;
12403 }
12404
12405 static uint16_t
test_enq_callback(uint16_t dev_id,uint16_t qp_id,struct rte_crypto_op ** ops,uint16_t nb_ops,void * user_param)12406 test_enq_callback(uint16_t dev_id, uint16_t qp_id, struct rte_crypto_op **ops,
12407 uint16_t nb_ops, void *user_param)
12408 {
12409 RTE_SET_USED(dev_id);
12410 RTE_SET_USED(qp_id);
12411 RTE_SET_USED(ops);
12412 RTE_SET_USED(user_param);
12413
12414 printf("crypto enqueue callback called\n");
12415 return nb_ops;
12416 }
12417
12418 static uint16_t
test_deq_callback(uint16_t dev_id,uint16_t qp_id,struct rte_crypto_op ** ops,uint16_t nb_ops,void * user_param)12419 test_deq_callback(uint16_t dev_id, uint16_t qp_id, struct rte_crypto_op **ops,
12420 uint16_t nb_ops, void *user_param)
12421 {
12422 RTE_SET_USED(dev_id);
12423 RTE_SET_USED(qp_id);
12424 RTE_SET_USED(ops);
12425 RTE_SET_USED(user_param);
12426
12427 printf("crypto dequeue callback called\n");
12428 return nb_ops;
12429 }
12430
12431 /*
12432 * Thread using enqueue/dequeue callback with RCU.
12433 */
12434 static int
test_enqdeq_callback_thread(void * arg)12435 test_enqdeq_callback_thread(void *arg)
12436 {
12437 RTE_SET_USED(arg);
12438 /* DP thread calls rte_cryptodev_enqueue_burst()/
12439 * rte_cryptodev_dequeue_burst() and invokes callback.
12440 */
12441 test_null_burst_operation();
12442 return 0;
12443 }
12444
12445 static int
test_enq_callback_setup(void)12446 test_enq_callback_setup(void)
12447 {
12448 struct crypto_testsuite_params *ts_params = &testsuite_params;
12449 struct rte_cryptodev_info dev_info;
12450 struct rte_cryptodev_qp_conf qp_conf = {
12451 .nb_descriptors = MAX_NUM_OPS_INFLIGHT
12452 };
12453
12454 struct rte_cryptodev_cb *cb;
12455 uint16_t qp_id = 0;
12456
12457 /* Stop the device in case it's started so it can be configured */
12458 rte_cryptodev_stop(ts_params->valid_devs[0]);
12459
12460 rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
12461
12462 TEST_ASSERT_SUCCESS(rte_cryptodev_configure(ts_params->valid_devs[0],
12463 &ts_params->conf),
12464 "Failed to configure cryptodev %u",
12465 ts_params->valid_devs[0]);
12466
12467 qp_conf.nb_descriptors = MAX_NUM_OPS_INFLIGHT;
12468 qp_conf.mp_session = ts_params->session_mpool;
12469 qp_conf.mp_session_private = ts_params->session_priv_mpool;
12470
12471 TEST_ASSERT_SUCCESS(rte_cryptodev_queue_pair_setup(
12472 ts_params->valid_devs[0], qp_id, &qp_conf,
12473 rte_cryptodev_socket_id(ts_params->valid_devs[0])),
12474 "Failed test for "
12475 "rte_cryptodev_queue_pair_setup: num_inflights "
12476 "%u on qp %u on cryptodev %u",
12477 qp_conf.nb_descriptors, qp_id,
12478 ts_params->valid_devs[0]);
12479
12480 /* Test with invalid crypto device */
12481 cb = rte_cryptodev_add_enq_callback(RTE_CRYPTO_MAX_DEVS,
12482 qp_id, test_enq_callback, NULL);
12483 TEST_ASSERT_NULL(cb, "Add callback on qp %u on "
12484 "cryptodev %u did not fail",
12485 qp_id, RTE_CRYPTO_MAX_DEVS);
12486
12487 /* Test with invalid queue pair */
12488 cb = rte_cryptodev_add_enq_callback(ts_params->valid_devs[0],
12489 dev_info.max_nb_queue_pairs + 1,
12490 test_enq_callback, NULL);
12491 TEST_ASSERT_NULL(cb, "Add callback on qp %u on "
12492 "cryptodev %u did not fail",
12493 dev_info.max_nb_queue_pairs + 1,
12494 ts_params->valid_devs[0]);
12495
12496 /* Test with NULL callback */
12497 cb = rte_cryptodev_add_enq_callback(ts_params->valid_devs[0],
12498 qp_id, NULL, NULL);
12499 TEST_ASSERT_NULL(cb, "Add callback on qp %u on "
12500 "cryptodev %u did not fail",
12501 qp_id, ts_params->valid_devs[0]);
12502
12503 /* Test with valid configuration */
12504 cb = rte_cryptodev_add_enq_callback(ts_params->valid_devs[0],
12505 qp_id, test_enq_callback, NULL);
12506 TEST_ASSERT_NOT_NULL(cb, "Failed test to add callback on "
12507 "qp %u on cryptodev %u",
12508 qp_id, ts_params->valid_devs[0]);
12509
12510 rte_cryptodev_start(ts_params->valid_devs[0]);
12511
12512 /* Launch a thread */
12513 rte_eal_remote_launch(test_enqdeq_callback_thread, NULL,
12514 rte_get_next_lcore(-1, 1, 0));
12515
12516 /* Wait until reader exited. */
12517 rte_eal_mp_wait_lcore();
12518
12519 /* Test with invalid crypto device */
12520 TEST_ASSERT_FAIL(rte_cryptodev_remove_enq_callback(
12521 RTE_CRYPTO_MAX_DEVS, qp_id, cb),
12522 "Expected call to fail as crypto device is invalid");
12523
12524 /* Test with invalid queue pair */
12525 TEST_ASSERT_FAIL(rte_cryptodev_remove_enq_callback(
12526 ts_params->valid_devs[0],
12527 dev_info.max_nb_queue_pairs + 1, cb),
12528 "Expected call to fail as queue pair is invalid");
12529
12530 /* Test with NULL callback */
12531 TEST_ASSERT_FAIL(rte_cryptodev_remove_enq_callback(
12532 ts_params->valid_devs[0], qp_id, NULL),
12533 "Expected call to fail as callback is NULL");
12534
12535 /* Test with valid configuration */
12536 TEST_ASSERT_SUCCESS(rte_cryptodev_remove_enq_callback(
12537 ts_params->valid_devs[0], qp_id, cb),
12538 "Failed test to remove callback on "
12539 "qp %u on cryptodev %u",
12540 qp_id, ts_params->valid_devs[0]);
12541
12542 return TEST_SUCCESS;
12543 }
12544
12545 static int
test_deq_callback_setup(void)12546 test_deq_callback_setup(void)
12547 {
12548 struct crypto_testsuite_params *ts_params = &testsuite_params;
12549 struct rte_cryptodev_info dev_info;
12550 struct rte_cryptodev_qp_conf qp_conf = {
12551 .nb_descriptors = MAX_NUM_OPS_INFLIGHT
12552 };
12553
12554 struct rte_cryptodev_cb *cb;
12555 uint16_t qp_id = 0;
12556
12557 /* Stop the device in case it's started so it can be configured */
12558 rte_cryptodev_stop(ts_params->valid_devs[0]);
12559
12560 rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
12561
12562 TEST_ASSERT_SUCCESS(rte_cryptodev_configure(ts_params->valid_devs[0],
12563 &ts_params->conf),
12564 "Failed to configure cryptodev %u",
12565 ts_params->valid_devs[0]);
12566
12567 qp_conf.nb_descriptors = MAX_NUM_OPS_INFLIGHT;
12568 qp_conf.mp_session = ts_params->session_mpool;
12569 qp_conf.mp_session_private = ts_params->session_priv_mpool;
12570
12571 TEST_ASSERT_SUCCESS(rte_cryptodev_queue_pair_setup(
12572 ts_params->valid_devs[0], qp_id, &qp_conf,
12573 rte_cryptodev_socket_id(ts_params->valid_devs[0])),
12574 "Failed test for "
12575 "rte_cryptodev_queue_pair_setup: num_inflights "
12576 "%u on qp %u on cryptodev %u",
12577 qp_conf.nb_descriptors, qp_id,
12578 ts_params->valid_devs[0]);
12579
12580 /* Test with invalid crypto device */
12581 cb = rte_cryptodev_add_deq_callback(RTE_CRYPTO_MAX_DEVS,
12582 qp_id, test_deq_callback, NULL);
12583 TEST_ASSERT_NULL(cb, "Add callback on qp %u on "
12584 "cryptodev %u did not fail",
12585 qp_id, RTE_CRYPTO_MAX_DEVS);
12586
12587 /* Test with invalid queue pair */
12588 cb = rte_cryptodev_add_deq_callback(ts_params->valid_devs[0],
12589 dev_info.max_nb_queue_pairs + 1,
12590 test_deq_callback, NULL);
12591 TEST_ASSERT_NULL(cb, "Add callback on qp %u on "
12592 "cryptodev %u did not fail",
12593 dev_info.max_nb_queue_pairs + 1,
12594 ts_params->valid_devs[0]);
12595
12596 /* Test with NULL callback */
12597 cb = rte_cryptodev_add_deq_callback(ts_params->valid_devs[0],
12598 qp_id, NULL, NULL);
12599 TEST_ASSERT_NULL(cb, "Add callback on qp %u on "
12600 "cryptodev %u did not fail",
12601 qp_id, ts_params->valid_devs[0]);
12602
12603 /* Test with valid configuration */
12604 cb = rte_cryptodev_add_deq_callback(ts_params->valid_devs[0],
12605 qp_id, test_deq_callback, NULL);
12606 TEST_ASSERT_NOT_NULL(cb, "Failed test to add callback on "
12607 "qp %u on cryptodev %u",
12608 qp_id, ts_params->valid_devs[0]);
12609
12610 rte_cryptodev_start(ts_params->valid_devs[0]);
12611
12612 /* Launch a thread */
12613 rte_eal_remote_launch(test_enqdeq_callback_thread, NULL,
12614 rte_get_next_lcore(-1, 1, 0));
12615
12616 /* Wait until reader exited. */
12617 rte_eal_mp_wait_lcore();
12618
12619 /* Test with invalid crypto device */
12620 TEST_ASSERT_FAIL(rte_cryptodev_remove_deq_callback(
12621 RTE_CRYPTO_MAX_DEVS, qp_id, cb),
12622 "Expected call to fail as crypto device is invalid");
12623
12624 /* Test with invalid queue pair */
12625 TEST_ASSERT_FAIL(rte_cryptodev_remove_deq_callback(
12626 ts_params->valid_devs[0],
12627 dev_info.max_nb_queue_pairs + 1, cb),
12628 "Expected call to fail as queue pair is invalid");
12629
12630 /* Test with NULL callback */
12631 TEST_ASSERT_FAIL(rte_cryptodev_remove_deq_callback(
12632 ts_params->valid_devs[0], qp_id, NULL),
12633 "Expected call to fail as callback is NULL");
12634
12635 /* Test with valid configuration */
12636 TEST_ASSERT_SUCCESS(rte_cryptodev_remove_deq_callback(
12637 ts_params->valid_devs[0], qp_id, cb),
12638 "Failed test to remove callback on "
12639 "qp %u on cryptodev %u",
12640 qp_id, ts_params->valid_devs[0]);
12641
12642 return TEST_SUCCESS;
12643 }
12644
12645 static void
generate_gmac_large_plaintext(uint8_t * data)12646 generate_gmac_large_plaintext(uint8_t *data)
12647 {
12648 uint16_t i;
12649
12650 for (i = 32; i < GMAC_LARGE_PLAINTEXT_LENGTH; i += 32)
12651 memcpy(&data[i], &data[0], 32);
12652 }
12653
12654 static int
create_gmac_operation(enum rte_crypto_auth_operation op,const struct gmac_test_data * tdata)12655 create_gmac_operation(enum rte_crypto_auth_operation op,
12656 const struct gmac_test_data *tdata)
12657 {
12658 struct crypto_testsuite_params *ts_params = &testsuite_params;
12659 struct crypto_unittest_params *ut_params = &unittest_params;
12660 struct rte_crypto_sym_op *sym_op;
12661
12662 uint32_t plaintext_pad_len = RTE_ALIGN_CEIL(tdata->plaintext.len, 16);
12663
12664 /* Generate Crypto op data structure */
12665 ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
12666 RTE_CRYPTO_OP_TYPE_SYMMETRIC);
12667 TEST_ASSERT_NOT_NULL(ut_params->op,
12668 "Failed to allocate symmetric crypto operation struct");
12669
12670 sym_op = ut_params->op->sym;
12671
12672 sym_op->auth.digest.data = (uint8_t *)rte_pktmbuf_append(
12673 ut_params->ibuf, tdata->gmac_tag.len);
12674 TEST_ASSERT_NOT_NULL(sym_op->auth.digest.data,
12675 "no room to append digest");
12676
12677 sym_op->auth.digest.phys_addr = rte_pktmbuf_iova_offset(
12678 ut_params->ibuf, plaintext_pad_len);
12679
12680 if (op == RTE_CRYPTO_AUTH_OP_VERIFY) {
12681 rte_memcpy(sym_op->auth.digest.data, tdata->gmac_tag.data,
12682 tdata->gmac_tag.len);
12683 debug_hexdump(stdout, "digest:",
12684 sym_op->auth.digest.data,
12685 tdata->gmac_tag.len);
12686 }
12687
12688 uint8_t *iv_ptr = rte_crypto_op_ctod_offset(ut_params->op,
12689 uint8_t *, IV_OFFSET);
12690
12691 rte_memcpy(iv_ptr, tdata->iv.data, tdata->iv.len);
12692
12693 debug_hexdump(stdout, "iv:", iv_ptr, tdata->iv.len);
12694
12695 sym_op->cipher.data.length = 0;
12696 sym_op->cipher.data.offset = 0;
12697
12698 sym_op->auth.data.offset = 0;
12699 sym_op->auth.data.length = tdata->plaintext.len;
12700
12701 return 0;
12702 }
12703
12704 static int
create_gmac_operation_sgl(enum rte_crypto_auth_operation op,const struct gmac_test_data * tdata,void * digest_mem,uint64_t digest_phys)12705 create_gmac_operation_sgl(enum rte_crypto_auth_operation op,
12706 const struct gmac_test_data *tdata,
12707 void *digest_mem, uint64_t digest_phys)
12708 {
12709 struct crypto_testsuite_params *ts_params = &testsuite_params;
12710 struct crypto_unittest_params *ut_params = &unittest_params;
12711 struct rte_crypto_sym_op *sym_op;
12712
12713 /* Generate Crypto op data structure */
12714 ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
12715 RTE_CRYPTO_OP_TYPE_SYMMETRIC);
12716 TEST_ASSERT_NOT_NULL(ut_params->op,
12717 "Failed to allocate symmetric crypto operation struct");
12718
12719 sym_op = ut_params->op->sym;
12720
12721 sym_op->auth.digest.data = digest_mem;
12722 TEST_ASSERT_NOT_NULL(sym_op->auth.digest.data,
12723 "no room to append digest");
12724
12725 sym_op->auth.digest.phys_addr = digest_phys;
12726
12727 if (op == RTE_CRYPTO_AUTH_OP_VERIFY) {
12728 rte_memcpy(sym_op->auth.digest.data, tdata->gmac_tag.data,
12729 tdata->gmac_tag.len);
12730 debug_hexdump(stdout, "digest:",
12731 sym_op->auth.digest.data,
12732 tdata->gmac_tag.len);
12733 }
12734
12735 uint8_t *iv_ptr = rte_crypto_op_ctod_offset(ut_params->op,
12736 uint8_t *, IV_OFFSET);
12737
12738 rte_memcpy(iv_ptr, tdata->iv.data, tdata->iv.len);
12739
12740 debug_hexdump(stdout, "iv:", iv_ptr, tdata->iv.len);
12741
12742 sym_op->cipher.data.length = 0;
12743 sym_op->cipher.data.offset = 0;
12744
12745 sym_op->auth.data.offset = 0;
12746 sym_op->auth.data.length = tdata->plaintext.len;
12747
12748 return 0;
12749 }
12750
create_gmac_session(uint8_t dev_id,const struct gmac_test_data * tdata,enum rte_crypto_auth_operation auth_op)12751 static int create_gmac_session(uint8_t dev_id,
12752 const struct gmac_test_data *tdata,
12753 enum rte_crypto_auth_operation auth_op)
12754 {
12755 uint8_t auth_key[tdata->key.len];
12756 int status;
12757
12758 struct crypto_testsuite_params *ts_params = &testsuite_params;
12759 struct crypto_unittest_params *ut_params = &unittest_params;
12760
12761 memcpy(auth_key, tdata->key.data, tdata->key.len);
12762
12763 ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;
12764 ut_params->auth_xform.next = NULL;
12765
12766 ut_params->auth_xform.auth.algo = RTE_CRYPTO_AUTH_AES_GMAC;
12767 ut_params->auth_xform.auth.op = auth_op;
12768 ut_params->auth_xform.auth.digest_length = tdata->gmac_tag.len;
12769 ut_params->auth_xform.auth.key.length = tdata->key.len;
12770 ut_params->auth_xform.auth.key.data = auth_key;
12771 ut_params->auth_xform.auth.iv.offset = IV_OFFSET;
12772 ut_params->auth_xform.auth.iv.length = tdata->iv.len;
12773
12774
12775 ut_params->sess = rte_cryptodev_sym_session_create(
12776 ts_params->session_mpool);
12777 TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed");
12778
12779 status = rte_cryptodev_sym_session_init(dev_id, ut_params->sess,
12780 &ut_params->auth_xform,
12781 ts_params->session_priv_mpool);
12782
12783 return status;
12784 }
12785
12786 static int
test_AES_GMAC_authentication(const struct gmac_test_data * tdata)12787 test_AES_GMAC_authentication(const struct gmac_test_data *tdata)
12788 {
12789 struct crypto_testsuite_params *ts_params = &testsuite_params;
12790 struct crypto_unittest_params *ut_params = &unittest_params;
12791 struct rte_cryptodev_info dev_info;
12792
12793 rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
12794 uint64_t feat_flags = dev_info.feature_flags;
12795
12796 if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
12797 (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
12798 printf("Device doesn't support RAW data-path APIs.\n");
12799 return TEST_SKIPPED;
12800 }
12801
12802 int retval;
12803
12804 uint8_t *auth_tag, *plaintext;
12805 uint16_t plaintext_pad_len;
12806
12807 TEST_ASSERT_NOT_EQUAL(tdata->gmac_tag.len, 0,
12808 "No GMAC length in the source data");
12809
12810 /* Verify the capabilities */
12811 struct rte_cryptodev_sym_capability_idx cap_idx;
12812 cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
12813 cap_idx.algo.auth = RTE_CRYPTO_AUTH_AES_GMAC;
12814 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
12815 &cap_idx) == NULL)
12816 return TEST_SKIPPED;
12817
12818 retval = create_gmac_session(ts_params->valid_devs[0],
12819 tdata, RTE_CRYPTO_AUTH_OP_GENERATE);
12820
12821 if (retval == -ENOTSUP)
12822 return TEST_SKIPPED;
12823 if (retval < 0)
12824 return retval;
12825
12826 if (tdata->plaintext.len > MBUF_SIZE)
12827 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->large_mbuf_pool);
12828 else
12829 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
12830 TEST_ASSERT_NOT_NULL(ut_params->ibuf,
12831 "Failed to allocate input buffer in mempool");
12832
12833 memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
12834 rte_pktmbuf_tailroom(ut_params->ibuf));
12835
12836 plaintext_pad_len = RTE_ALIGN_CEIL(tdata->plaintext.len, 16);
12837 /*
12838 * Runtime generate the large plain text instead of use hard code
12839 * plain text vector. It is done to avoid create huge source file
12840 * with the test vector.
12841 */
12842 if (tdata->plaintext.len == GMAC_LARGE_PLAINTEXT_LENGTH)
12843 generate_gmac_large_plaintext(tdata->plaintext.data);
12844
12845 plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
12846 plaintext_pad_len);
12847 TEST_ASSERT_NOT_NULL(plaintext, "no room to append plaintext");
12848
12849 memcpy(plaintext, tdata->plaintext.data, tdata->plaintext.len);
12850 debug_hexdump(stdout, "plaintext:", plaintext,
12851 tdata->plaintext.len);
12852
12853 retval = create_gmac_operation(RTE_CRYPTO_AUTH_OP_GENERATE,
12854 tdata);
12855
12856 if (retval < 0)
12857 return retval;
12858
12859 rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
12860
12861 ut_params->op->sym->m_src = ut_params->ibuf;
12862
12863 if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
12864 process_cpu_crypt_auth_op(ts_params->valid_devs[0],
12865 ut_params->op);
12866 else if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
12867 process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
12868 ut_params->op, 0, 1, 0, 0);
12869 else
12870 TEST_ASSERT_NOT_NULL(
12871 process_crypto_request(ts_params->valid_devs[0],
12872 ut_params->op), "failed to process sym crypto op");
12873
12874 TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
12875 "crypto op processing failed");
12876
12877 if (ut_params->op->sym->m_dst) {
12878 auth_tag = rte_pktmbuf_mtod_offset(ut_params->op->sym->m_dst,
12879 uint8_t *, plaintext_pad_len);
12880 } else {
12881 auth_tag = plaintext + plaintext_pad_len;
12882 }
12883
12884 debug_hexdump(stdout, "auth tag:", auth_tag, tdata->gmac_tag.len);
12885
12886 TEST_ASSERT_BUFFERS_ARE_EQUAL(
12887 auth_tag,
12888 tdata->gmac_tag.data,
12889 tdata->gmac_tag.len,
12890 "GMAC Generated auth tag not as expected");
12891
12892 return 0;
12893 }
12894
12895 static int
test_AES_GMAC_authentication_test_case_1(void)12896 test_AES_GMAC_authentication_test_case_1(void)
12897 {
12898 return test_AES_GMAC_authentication(&gmac_test_case_1);
12899 }
12900
12901 static int
test_AES_GMAC_authentication_test_case_2(void)12902 test_AES_GMAC_authentication_test_case_2(void)
12903 {
12904 return test_AES_GMAC_authentication(&gmac_test_case_2);
12905 }
12906
12907 static int
test_AES_GMAC_authentication_test_case_3(void)12908 test_AES_GMAC_authentication_test_case_3(void)
12909 {
12910 return test_AES_GMAC_authentication(&gmac_test_case_3);
12911 }
12912
12913 static int
test_AES_GMAC_authentication_test_case_4(void)12914 test_AES_GMAC_authentication_test_case_4(void)
12915 {
12916 return test_AES_GMAC_authentication(&gmac_test_case_4);
12917 }
12918
12919 static int
test_AES_GMAC_authentication_verify(const struct gmac_test_data * tdata)12920 test_AES_GMAC_authentication_verify(const struct gmac_test_data *tdata)
12921 {
12922 struct crypto_testsuite_params *ts_params = &testsuite_params;
12923 struct crypto_unittest_params *ut_params = &unittest_params;
12924 int retval;
12925 uint32_t plaintext_pad_len;
12926 uint8_t *plaintext;
12927 struct rte_cryptodev_info dev_info;
12928
12929 rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
12930 uint64_t feat_flags = dev_info.feature_flags;
12931
12932 if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
12933 (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
12934 printf("Device doesn't support RAW data-path APIs.\n");
12935 return TEST_SKIPPED;
12936 }
12937
12938 TEST_ASSERT_NOT_EQUAL(tdata->gmac_tag.len, 0,
12939 "No GMAC length in the source data");
12940
12941 /* Verify the capabilities */
12942 struct rte_cryptodev_sym_capability_idx cap_idx;
12943 cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
12944 cap_idx.algo.auth = RTE_CRYPTO_AUTH_AES_GMAC;
12945 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
12946 &cap_idx) == NULL)
12947 return TEST_SKIPPED;
12948
12949 retval = create_gmac_session(ts_params->valid_devs[0],
12950 tdata, RTE_CRYPTO_AUTH_OP_VERIFY);
12951
12952 if (retval == -ENOTSUP)
12953 return TEST_SKIPPED;
12954 if (retval < 0)
12955 return retval;
12956
12957 if (tdata->plaintext.len > MBUF_SIZE)
12958 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->large_mbuf_pool);
12959 else
12960 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
12961 TEST_ASSERT_NOT_NULL(ut_params->ibuf,
12962 "Failed to allocate input buffer in mempool");
12963
12964 memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
12965 rte_pktmbuf_tailroom(ut_params->ibuf));
12966
12967 plaintext_pad_len = RTE_ALIGN_CEIL(tdata->plaintext.len, 16);
12968
12969 /*
12970 * Runtime generate the large plain text instead of use hard code
12971 * plain text vector. It is done to avoid create huge source file
12972 * with the test vector.
12973 */
12974 if (tdata->plaintext.len == GMAC_LARGE_PLAINTEXT_LENGTH)
12975 generate_gmac_large_plaintext(tdata->plaintext.data);
12976
12977 plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
12978 plaintext_pad_len);
12979 TEST_ASSERT_NOT_NULL(plaintext, "no room to append plaintext");
12980
12981 memcpy(plaintext, tdata->plaintext.data, tdata->plaintext.len);
12982 debug_hexdump(stdout, "plaintext:", plaintext,
12983 tdata->plaintext.len);
12984
12985 retval = create_gmac_operation(RTE_CRYPTO_AUTH_OP_VERIFY,
12986 tdata);
12987
12988 if (retval < 0)
12989 return retval;
12990
12991 rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
12992
12993 ut_params->op->sym->m_src = ut_params->ibuf;
12994
12995 if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
12996 process_cpu_crypt_auth_op(ts_params->valid_devs[0],
12997 ut_params->op);
12998 else if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
12999 process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
13000 ut_params->op, 0, 1, 0, 0);
13001 else
13002 TEST_ASSERT_NOT_NULL(
13003 process_crypto_request(ts_params->valid_devs[0],
13004 ut_params->op), "failed to process sym crypto op");
13005
13006 TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
13007 "crypto op processing failed");
13008
13009 return 0;
13010
13011 }
13012
13013 static int
test_AES_GMAC_authentication_verify_test_case_1(void)13014 test_AES_GMAC_authentication_verify_test_case_1(void)
13015 {
13016 return test_AES_GMAC_authentication_verify(&gmac_test_case_1);
13017 }
13018
13019 static int
test_AES_GMAC_authentication_verify_test_case_2(void)13020 test_AES_GMAC_authentication_verify_test_case_2(void)
13021 {
13022 return test_AES_GMAC_authentication_verify(&gmac_test_case_2);
13023 }
13024
13025 static int
test_AES_GMAC_authentication_verify_test_case_3(void)13026 test_AES_GMAC_authentication_verify_test_case_3(void)
13027 {
13028 return test_AES_GMAC_authentication_verify(&gmac_test_case_3);
13029 }
13030
13031 static int
test_AES_GMAC_authentication_verify_test_case_4(void)13032 test_AES_GMAC_authentication_verify_test_case_4(void)
13033 {
13034 return test_AES_GMAC_authentication_verify(&gmac_test_case_4);
13035 }
13036
13037 static int
test_AES_GMAC_authentication_SGL(const struct gmac_test_data * tdata,uint32_t fragsz)13038 test_AES_GMAC_authentication_SGL(const struct gmac_test_data *tdata,
13039 uint32_t fragsz)
13040 {
13041 struct crypto_testsuite_params *ts_params = &testsuite_params;
13042 struct crypto_unittest_params *ut_params = &unittest_params;
13043 struct rte_cryptodev_info dev_info;
13044 uint64_t feature_flags;
13045 unsigned int trn_data = 0;
13046 void *digest_mem = NULL;
13047 uint32_t segs = 1;
13048 unsigned int to_trn = 0;
13049 struct rte_mbuf *buf = NULL;
13050 uint8_t *auth_tag, *plaintext;
13051 int retval;
13052
13053 TEST_ASSERT_NOT_EQUAL(tdata->gmac_tag.len, 0,
13054 "No GMAC length in the source data");
13055
13056 /* Verify the capabilities */
13057 struct rte_cryptodev_sym_capability_idx cap_idx;
13058 cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
13059 cap_idx.algo.auth = RTE_CRYPTO_AUTH_AES_GMAC;
13060 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
13061 &cap_idx) == NULL)
13062 return TEST_SKIPPED;
13063
13064 /* Check for any input SGL support */
13065 rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
13066 feature_flags = dev_info.feature_flags;
13067
13068 if ((!(feature_flags & RTE_CRYPTODEV_FF_IN_PLACE_SGL)) ||
13069 (!(feature_flags & RTE_CRYPTODEV_FF_OOP_SGL_IN_LB_OUT)) ||
13070 (!(feature_flags & RTE_CRYPTODEV_FF_OOP_SGL_IN_SGL_OUT)))
13071 return TEST_SKIPPED;
13072
13073 if (fragsz > tdata->plaintext.len)
13074 fragsz = tdata->plaintext.len;
13075
13076 uint16_t plaintext_len = fragsz;
13077
13078 retval = create_gmac_session(ts_params->valid_devs[0],
13079 tdata, RTE_CRYPTO_AUTH_OP_GENERATE);
13080
13081 if (retval == -ENOTSUP)
13082 return TEST_SKIPPED;
13083 if (retval < 0)
13084 return retval;
13085
13086 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
13087 TEST_ASSERT_NOT_NULL(ut_params->ibuf,
13088 "Failed to allocate input buffer in mempool");
13089
13090 memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
13091 rte_pktmbuf_tailroom(ut_params->ibuf));
13092
13093 plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
13094 plaintext_len);
13095 TEST_ASSERT_NOT_NULL(plaintext, "no room to append plaintext");
13096
13097 memcpy(plaintext, tdata->plaintext.data, plaintext_len);
13098
13099 trn_data += plaintext_len;
13100
13101 buf = ut_params->ibuf;
13102
13103 /*
13104 * Loop until no more fragments
13105 */
13106
13107 while (trn_data < tdata->plaintext.len) {
13108 ++segs;
13109 to_trn = (tdata->plaintext.len - trn_data < fragsz) ?
13110 (tdata->plaintext.len - trn_data) : fragsz;
13111
13112 buf->next = rte_pktmbuf_alloc(ts_params->mbuf_pool);
13113 buf = buf->next;
13114
13115 memset(rte_pktmbuf_mtod(buf, uint8_t *), 0,
13116 rte_pktmbuf_tailroom(buf));
13117
13118 plaintext = (uint8_t *)rte_pktmbuf_append(buf,
13119 to_trn);
13120
13121 memcpy(plaintext, tdata->plaintext.data + trn_data,
13122 to_trn);
13123 trn_data += to_trn;
13124 if (trn_data == tdata->plaintext.len)
13125 digest_mem = (uint8_t *)rte_pktmbuf_append(buf,
13126 tdata->gmac_tag.len);
13127 }
13128 ut_params->ibuf->nb_segs = segs;
13129
13130 /*
13131 * Place digest at the end of the last buffer
13132 */
13133 uint64_t digest_phys = rte_pktmbuf_iova(buf) + to_trn;
13134
13135 if (!digest_mem) {
13136 digest_mem = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
13137 + tdata->gmac_tag.len);
13138 digest_phys = rte_pktmbuf_iova_offset(ut_params->ibuf,
13139 tdata->plaintext.len);
13140 }
13141
13142 retval = create_gmac_operation_sgl(RTE_CRYPTO_AUTH_OP_GENERATE,
13143 tdata, digest_mem, digest_phys);
13144
13145 if (retval < 0)
13146 return retval;
13147
13148 rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
13149
13150 ut_params->op->sym->m_src = ut_params->ibuf;
13151
13152 if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
13153 return TEST_SKIPPED;
13154
13155 TEST_ASSERT_NOT_NULL(
13156 process_crypto_request(ts_params->valid_devs[0],
13157 ut_params->op), "failed to process sym crypto op");
13158
13159 TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
13160 "crypto op processing failed");
13161
13162 auth_tag = digest_mem;
13163 debug_hexdump(stdout, "auth tag:", auth_tag, tdata->gmac_tag.len);
13164 TEST_ASSERT_BUFFERS_ARE_EQUAL(
13165 auth_tag,
13166 tdata->gmac_tag.data,
13167 tdata->gmac_tag.len,
13168 "GMAC Generated auth tag not as expected");
13169
13170 return 0;
13171 }
13172
13173 /* Segment size not multiple of block size (16B) */
13174 static int
test_AES_GMAC_authentication_SGL_40B(void)13175 test_AES_GMAC_authentication_SGL_40B(void)
13176 {
13177 return test_AES_GMAC_authentication_SGL(&gmac_test_case_1, 40);
13178 }
13179
13180 static int
test_AES_GMAC_authentication_SGL_80B(void)13181 test_AES_GMAC_authentication_SGL_80B(void)
13182 {
13183 return test_AES_GMAC_authentication_SGL(&gmac_test_case_1, 80);
13184 }
13185
13186 static int
test_AES_GMAC_authentication_SGL_2048B(void)13187 test_AES_GMAC_authentication_SGL_2048B(void)
13188 {
13189 return test_AES_GMAC_authentication_SGL(&gmac_test_case_5, 2048);
13190 }
13191
13192 /* Segment size not multiple of block size (16B) */
13193 static int
test_AES_GMAC_authentication_SGL_2047B(void)13194 test_AES_GMAC_authentication_SGL_2047B(void)
13195 {
13196 return test_AES_GMAC_authentication_SGL(&gmac_test_case_5, 2047);
13197 }
13198
13199 struct test_crypto_vector {
13200 enum rte_crypto_cipher_algorithm crypto_algo;
13201 unsigned int cipher_offset;
13202 unsigned int cipher_len;
13203
13204 struct {
13205 uint8_t data[64];
13206 unsigned int len;
13207 } cipher_key;
13208
13209 struct {
13210 uint8_t data[64];
13211 unsigned int len;
13212 } iv;
13213
13214 struct {
13215 const uint8_t *data;
13216 unsigned int len;
13217 } plaintext;
13218
13219 struct {
13220 const uint8_t *data;
13221 unsigned int len;
13222 } ciphertext;
13223
13224 enum rte_crypto_auth_algorithm auth_algo;
13225 unsigned int auth_offset;
13226
13227 struct {
13228 uint8_t data[128];
13229 unsigned int len;
13230 } auth_key;
13231
13232 struct {
13233 const uint8_t *data;
13234 unsigned int len;
13235 } aad;
13236
13237 struct {
13238 uint8_t data[128];
13239 unsigned int len;
13240 } digest;
13241 };
13242
13243 static const struct test_crypto_vector
13244 hmac_sha1_test_crypto_vector = {
13245 .auth_algo = RTE_CRYPTO_AUTH_SHA1_HMAC,
13246 .plaintext = {
13247 .data = plaintext_hash,
13248 .len = 512
13249 },
13250 .auth_key = {
13251 .data = {
13252 0xF8, 0x2A, 0xC7, 0x54, 0xDB, 0x96, 0x18, 0xAA,
13253 0xC3, 0xA1, 0x53, 0xF6, 0x1F, 0x17, 0x60, 0xBD,
13254 0xDE, 0xF4, 0xDE, 0xAD
13255 },
13256 .len = 20
13257 },
13258 .digest = {
13259 .data = {
13260 0xC4, 0xB7, 0x0E, 0x6B, 0xDE, 0xD1, 0xE7, 0x77,
13261 0x7E, 0x2E, 0x8F, 0xFC, 0x48, 0x39, 0x46, 0x17,
13262 0x3F, 0x91, 0x64, 0x59
13263 },
13264 .len = 20
13265 }
13266 };
13267
13268 static const struct test_crypto_vector
13269 aes128_gmac_test_vector = {
13270 .auth_algo = RTE_CRYPTO_AUTH_AES_GMAC,
13271 .plaintext = {
13272 .data = plaintext_hash,
13273 .len = 512
13274 },
13275 .iv = {
13276 .data = {
13277 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
13278 0x08, 0x09, 0x0A, 0x0B
13279 },
13280 .len = 12
13281 },
13282 .auth_key = {
13283 .data = {
13284 0x42, 0x1A, 0x7D, 0x3D, 0xF5, 0x82, 0x80, 0xF1,
13285 0xF1, 0x35, 0x5C, 0x3B, 0xDD, 0x9A, 0x65, 0xBA
13286 },
13287 .len = 16
13288 },
13289 .digest = {
13290 .data = {
13291 0xCA, 0x00, 0x99, 0x8B, 0x30, 0x7E, 0x74, 0x56,
13292 0x32, 0xA7, 0x87, 0xB5, 0xE9, 0xB2, 0x34, 0x5A
13293 },
13294 .len = 16
13295 }
13296 };
13297
13298 static const struct test_crypto_vector
13299 aes128cbc_hmac_sha1_test_vector = {
13300 .crypto_algo = RTE_CRYPTO_CIPHER_AES_CBC,
13301 .cipher_offset = 0,
13302 .cipher_len = 512,
13303 .cipher_key = {
13304 .data = {
13305 0xE4, 0x23, 0x33, 0x8A, 0x35, 0x64, 0x61, 0xE2,
13306 0x49, 0x03, 0xDD, 0xC6, 0xB8, 0xCA, 0x55, 0x7A
13307 },
13308 .len = 16
13309 },
13310 .iv = {
13311 .data = {
13312 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
13313 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F
13314 },
13315 .len = 16
13316 },
13317 .plaintext = {
13318 .data = plaintext_hash,
13319 .len = 512
13320 },
13321 .ciphertext = {
13322 .data = ciphertext512_aes128cbc,
13323 .len = 512
13324 },
13325 .auth_algo = RTE_CRYPTO_AUTH_SHA1_HMAC,
13326 .auth_offset = 0,
13327 .auth_key = {
13328 .data = {
13329 0xF8, 0x2A, 0xC7, 0x54, 0xDB, 0x96, 0x18, 0xAA,
13330 0xC3, 0xA1, 0x53, 0xF6, 0x1F, 0x17, 0x60, 0xBD,
13331 0xDE, 0xF4, 0xDE, 0xAD
13332 },
13333 .len = 20
13334 },
13335 .digest = {
13336 .data = {
13337 0x9A, 0x4F, 0x88, 0x1B, 0xB6, 0x8F, 0xD8, 0x60,
13338 0x42, 0x1A, 0x7D, 0x3D, 0xF5, 0x82, 0x80, 0xF1,
13339 0x18, 0x8C, 0x1D, 0x32
13340 },
13341 .len = 20
13342 }
13343 };
13344
13345 static const struct test_crypto_vector
13346 aes128cbc_hmac_sha1_aad_test_vector = {
13347 .crypto_algo = RTE_CRYPTO_CIPHER_AES_CBC,
13348 .cipher_offset = 8,
13349 .cipher_len = 496,
13350 .cipher_key = {
13351 .data = {
13352 0xE4, 0x23, 0x33, 0x8A, 0x35, 0x64, 0x61, 0xE2,
13353 0x49, 0x03, 0xDD, 0xC6, 0xB8, 0xCA, 0x55, 0x7A
13354 },
13355 .len = 16
13356 },
13357 .iv = {
13358 .data = {
13359 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
13360 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F
13361 },
13362 .len = 16
13363 },
13364 .plaintext = {
13365 .data = plaintext_hash,
13366 .len = 512
13367 },
13368 .ciphertext = {
13369 .data = ciphertext512_aes128cbc_aad,
13370 .len = 512
13371 },
13372 .auth_algo = RTE_CRYPTO_AUTH_SHA1_HMAC,
13373 .auth_offset = 0,
13374 .auth_key = {
13375 .data = {
13376 0xF8, 0x2A, 0xC7, 0x54, 0xDB, 0x96, 0x18, 0xAA,
13377 0xC3, 0xA1, 0x53, 0xF6, 0x1F, 0x17, 0x60, 0xBD,
13378 0xDE, 0xF4, 0xDE, 0xAD
13379 },
13380 .len = 20
13381 },
13382 .digest = {
13383 .data = {
13384 0x6D, 0xF3, 0x50, 0x79, 0x7A, 0x2A, 0xAC, 0x7F,
13385 0xA6, 0xF0, 0xC6, 0x38, 0x1F, 0xA4, 0xDD, 0x9B,
13386 0x62, 0x0F, 0xFB, 0x10
13387 },
13388 .len = 20
13389 }
13390 };
13391
13392 static void
data_corruption(uint8_t * data)13393 data_corruption(uint8_t *data)
13394 {
13395 data[0] += 1;
13396 }
13397
13398 static void
tag_corruption(uint8_t * data,unsigned int tag_offset)13399 tag_corruption(uint8_t *data, unsigned int tag_offset)
13400 {
13401 data[tag_offset] += 1;
13402 }
13403
13404 static int
create_auth_session(struct crypto_unittest_params * ut_params,uint8_t dev_id,const struct test_crypto_vector * reference,enum rte_crypto_auth_operation auth_op)13405 create_auth_session(struct crypto_unittest_params *ut_params,
13406 uint8_t dev_id,
13407 const struct test_crypto_vector *reference,
13408 enum rte_crypto_auth_operation auth_op)
13409 {
13410 struct crypto_testsuite_params *ts_params = &testsuite_params;
13411 uint8_t auth_key[reference->auth_key.len + 1];
13412 int status;
13413
13414 memcpy(auth_key, reference->auth_key.data, reference->auth_key.len);
13415
13416 /* Setup Authentication Parameters */
13417 ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;
13418 ut_params->auth_xform.auth.op = auth_op;
13419 ut_params->auth_xform.next = NULL;
13420 ut_params->auth_xform.auth.algo = reference->auth_algo;
13421 ut_params->auth_xform.auth.key.length = reference->auth_key.len;
13422 ut_params->auth_xform.auth.key.data = auth_key;
13423 ut_params->auth_xform.auth.digest_length = reference->digest.len;
13424
13425 /* Create Crypto session*/
13426 ut_params->sess = rte_cryptodev_sym_session_create(
13427 ts_params->session_mpool);
13428 TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed");
13429
13430 status = rte_cryptodev_sym_session_init(dev_id, ut_params->sess,
13431 &ut_params->auth_xform,
13432 ts_params->session_priv_mpool);
13433
13434 return status;
13435 }
13436
13437 static int
create_auth_cipher_session(struct crypto_unittest_params * ut_params,uint8_t dev_id,const struct test_crypto_vector * reference,enum rte_crypto_auth_operation auth_op,enum rte_crypto_cipher_operation cipher_op)13438 create_auth_cipher_session(struct crypto_unittest_params *ut_params,
13439 uint8_t dev_id,
13440 const struct test_crypto_vector *reference,
13441 enum rte_crypto_auth_operation auth_op,
13442 enum rte_crypto_cipher_operation cipher_op)
13443 {
13444 struct crypto_testsuite_params *ts_params = &testsuite_params;
13445 uint8_t cipher_key[reference->cipher_key.len + 1];
13446 uint8_t auth_key[reference->auth_key.len + 1];
13447 int status;
13448
13449 memcpy(cipher_key, reference->cipher_key.data,
13450 reference->cipher_key.len);
13451 memcpy(auth_key, reference->auth_key.data, reference->auth_key.len);
13452
13453 /* Setup Authentication Parameters */
13454 ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;
13455 ut_params->auth_xform.auth.op = auth_op;
13456 ut_params->auth_xform.auth.algo = reference->auth_algo;
13457 ut_params->auth_xform.auth.key.length = reference->auth_key.len;
13458 ut_params->auth_xform.auth.key.data = auth_key;
13459 ut_params->auth_xform.auth.digest_length = reference->digest.len;
13460
13461 if (reference->auth_algo == RTE_CRYPTO_AUTH_AES_GMAC) {
13462 ut_params->auth_xform.auth.iv.offset = IV_OFFSET;
13463 ut_params->auth_xform.auth.iv.length = reference->iv.len;
13464 } else {
13465 ut_params->auth_xform.next = &ut_params->cipher_xform;
13466
13467 /* Setup Cipher Parameters */
13468 ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
13469 ut_params->cipher_xform.next = NULL;
13470 ut_params->cipher_xform.cipher.algo = reference->crypto_algo;
13471 ut_params->cipher_xform.cipher.op = cipher_op;
13472 ut_params->cipher_xform.cipher.key.data = cipher_key;
13473 ut_params->cipher_xform.cipher.key.length = reference->cipher_key.len;
13474 ut_params->cipher_xform.cipher.iv.offset = IV_OFFSET;
13475 ut_params->cipher_xform.cipher.iv.length = reference->iv.len;
13476 }
13477
13478 /* Create Crypto session*/
13479 ut_params->sess = rte_cryptodev_sym_session_create(
13480 ts_params->session_mpool);
13481 TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed");
13482
13483 status = rte_cryptodev_sym_session_init(dev_id, ut_params->sess,
13484 &ut_params->auth_xform,
13485 ts_params->session_priv_mpool);
13486
13487 return status;
13488 }
13489
13490 static int
create_auth_operation(struct crypto_testsuite_params * ts_params,struct crypto_unittest_params * ut_params,const struct test_crypto_vector * reference,unsigned int auth_generate)13491 create_auth_operation(struct crypto_testsuite_params *ts_params,
13492 struct crypto_unittest_params *ut_params,
13493 const struct test_crypto_vector *reference,
13494 unsigned int auth_generate)
13495 {
13496 /* Generate Crypto op data structure */
13497 ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
13498 RTE_CRYPTO_OP_TYPE_SYMMETRIC);
13499 TEST_ASSERT_NOT_NULL(ut_params->op,
13500 "Failed to allocate pktmbuf offload");
13501
13502 /* Set crypto operation data parameters */
13503 rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
13504
13505 struct rte_crypto_sym_op *sym_op = ut_params->op->sym;
13506
13507 /* set crypto operation source mbuf */
13508 sym_op->m_src = ut_params->ibuf;
13509
13510 /* digest */
13511 sym_op->auth.digest.data = (uint8_t *)rte_pktmbuf_append(
13512 ut_params->ibuf, reference->digest.len);
13513
13514 TEST_ASSERT_NOT_NULL(sym_op->auth.digest.data,
13515 "no room to append auth tag");
13516
13517 sym_op->auth.digest.phys_addr = rte_pktmbuf_iova_offset(
13518 ut_params->ibuf, reference->plaintext.len);
13519
13520 if (auth_generate)
13521 memset(sym_op->auth.digest.data, 0, reference->digest.len);
13522 else
13523 memcpy(sym_op->auth.digest.data,
13524 reference->digest.data,
13525 reference->digest.len);
13526
13527 debug_hexdump(stdout, "digest:",
13528 sym_op->auth.digest.data,
13529 reference->digest.len);
13530
13531 sym_op->auth.data.length = reference->plaintext.len;
13532 sym_op->auth.data.offset = 0;
13533
13534 return 0;
13535 }
13536
13537 static int
create_auth_GMAC_operation(struct crypto_testsuite_params * ts_params,struct crypto_unittest_params * ut_params,const struct test_crypto_vector * reference,unsigned int auth_generate)13538 create_auth_GMAC_operation(struct crypto_testsuite_params *ts_params,
13539 struct crypto_unittest_params *ut_params,
13540 const struct test_crypto_vector *reference,
13541 unsigned int auth_generate)
13542 {
13543 /* Generate Crypto op data structure */
13544 ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
13545 RTE_CRYPTO_OP_TYPE_SYMMETRIC);
13546 TEST_ASSERT_NOT_NULL(ut_params->op,
13547 "Failed to allocate pktmbuf offload");
13548
13549 /* Set crypto operation data parameters */
13550 rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
13551
13552 struct rte_crypto_sym_op *sym_op = ut_params->op->sym;
13553
13554 /* set crypto operation source mbuf */
13555 sym_op->m_src = ut_params->ibuf;
13556
13557 /* digest */
13558 sym_op->auth.digest.data = (uint8_t *)rte_pktmbuf_append(
13559 ut_params->ibuf, reference->digest.len);
13560
13561 TEST_ASSERT_NOT_NULL(sym_op->auth.digest.data,
13562 "no room to append auth tag");
13563
13564 sym_op->auth.digest.phys_addr = rte_pktmbuf_iova_offset(
13565 ut_params->ibuf, reference->ciphertext.len);
13566
13567 if (auth_generate)
13568 memset(sym_op->auth.digest.data, 0, reference->digest.len);
13569 else
13570 memcpy(sym_op->auth.digest.data,
13571 reference->digest.data,
13572 reference->digest.len);
13573
13574 debug_hexdump(stdout, "digest:",
13575 sym_op->auth.digest.data,
13576 reference->digest.len);
13577
13578 rte_memcpy(rte_crypto_op_ctod_offset(ut_params->op, uint8_t *, IV_OFFSET),
13579 reference->iv.data, reference->iv.len);
13580
13581 sym_op->cipher.data.length = 0;
13582 sym_op->cipher.data.offset = 0;
13583
13584 sym_op->auth.data.length = reference->plaintext.len;
13585 sym_op->auth.data.offset = 0;
13586
13587 return 0;
13588 }
13589
13590 static int
create_cipher_auth_operation(struct crypto_testsuite_params * ts_params,struct crypto_unittest_params * ut_params,const struct test_crypto_vector * reference,unsigned int auth_generate)13591 create_cipher_auth_operation(struct crypto_testsuite_params *ts_params,
13592 struct crypto_unittest_params *ut_params,
13593 const struct test_crypto_vector *reference,
13594 unsigned int auth_generate)
13595 {
13596 /* Generate Crypto op data structure */
13597 ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
13598 RTE_CRYPTO_OP_TYPE_SYMMETRIC);
13599 TEST_ASSERT_NOT_NULL(ut_params->op,
13600 "Failed to allocate pktmbuf offload");
13601
13602 /* Set crypto operation data parameters */
13603 rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
13604
13605 struct rte_crypto_sym_op *sym_op = ut_params->op->sym;
13606
13607 /* set crypto operation source mbuf */
13608 sym_op->m_src = ut_params->ibuf;
13609
13610 /* digest */
13611 sym_op->auth.digest.data = (uint8_t *)rte_pktmbuf_append(
13612 ut_params->ibuf, reference->digest.len);
13613
13614 TEST_ASSERT_NOT_NULL(sym_op->auth.digest.data,
13615 "no room to append auth tag");
13616
13617 sym_op->auth.digest.phys_addr = rte_pktmbuf_iova_offset(
13618 ut_params->ibuf, reference->ciphertext.len);
13619
13620 if (auth_generate)
13621 memset(sym_op->auth.digest.data, 0, reference->digest.len);
13622 else
13623 memcpy(sym_op->auth.digest.data,
13624 reference->digest.data,
13625 reference->digest.len);
13626
13627 debug_hexdump(stdout, "digest:",
13628 sym_op->auth.digest.data,
13629 reference->digest.len);
13630
13631 rte_memcpy(rte_crypto_op_ctod_offset(ut_params->op, uint8_t *, IV_OFFSET),
13632 reference->iv.data, reference->iv.len);
13633
13634 sym_op->cipher.data.length = reference->cipher_len;
13635 sym_op->cipher.data.offset = reference->cipher_offset;
13636
13637 sym_op->auth.data.length = reference->plaintext.len;
13638 sym_op->auth.data.offset = reference->auth_offset;
13639
13640 return 0;
13641 }
13642
13643 static int
create_auth_verify_operation(struct crypto_testsuite_params * ts_params,struct crypto_unittest_params * ut_params,const struct test_crypto_vector * reference)13644 create_auth_verify_operation(struct crypto_testsuite_params *ts_params,
13645 struct crypto_unittest_params *ut_params,
13646 const struct test_crypto_vector *reference)
13647 {
13648 return create_auth_operation(ts_params, ut_params, reference, 0);
13649 }
13650
13651 static int
create_auth_verify_GMAC_operation(struct crypto_testsuite_params * ts_params,struct crypto_unittest_params * ut_params,const struct test_crypto_vector * reference)13652 create_auth_verify_GMAC_operation(
13653 struct crypto_testsuite_params *ts_params,
13654 struct crypto_unittest_params *ut_params,
13655 const struct test_crypto_vector *reference)
13656 {
13657 return create_auth_GMAC_operation(ts_params, ut_params, reference, 0);
13658 }
13659
13660 static int
create_cipher_auth_verify_operation(struct crypto_testsuite_params * ts_params,struct crypto_unittest_params * ut_params,const struct test_crypto_vector * reference)13661 create_cipher_auth_verify_operation(struct crypto_testsuite_params *ts_params,
13662 struct crypto_unittest_params *ut_params,
13663 const struct test_crypto_vector *reference)
13664 {
13665 return create_cipher_auth_operation(ts_params, ut_params, reference, 0);
13666 }
13667
13668 static int
test_authentication_verify_fail_when_data_corruption(struct crypto_testsuite_params * ts_params,struct crypto_unittest_params * ut_params,const struct test_crypto_vector * reference,unsigned int data_corrupted)13669 test_authentication_verify_fail_when_data_corruption(
13670 struct crypto_testsuite_params *ts_params,
13671 struct crypto_unittest_params *ut_params,
13672 const struct test_crypto_vector *reference,
13673 unsigned int data_corrupted)
13674 {
13675 int retval;
13676
13677 uint8_t *plaintext;
13678 struct rte_cryptodev_info dev_info;
13679
13680 rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
13681 uint64_t feat_flags = dev_info.feature_flags;
13682
13683 if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
13684 (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
13685 printf("Device doesn't support RAW data-path APIs.\n");
13686 return TEST_SKIPPED;
13687 }
13688
13689 /* Verify the capabilities */
13690 struct rte_cryptodev_sym_capability_idx cap_idx;
13691 cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
13692 cap_idx.algo.auth = reference->auth_algo;
13693 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
13694 &cap_idx) == NULL)
13695 return TEST_SKIPPED;
13696
13697
13698 /* Create session */
13699 retval = create_auth_session(ut_params,
13700 ts_params->valid_devs[0],
13701 reference,
13702 RTE_CRYPTO_AUTH_OP_VERIFY);
13703
13704 if (retval == -ENOTSUP)
13705 return TEST_SKIPPED;
13706 if (retval < 0)
13707 return retval;
13708
13709 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
13710 TEST_ASSERT_NOT_NULL(ut_params->ibuf,
13711 "Failed to allocate input buffer in mempool");
13712
13713 /* clear mbuf payload */
13714 memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
13715 rte_pktmbuf_tailroom(ut_params->ibuf));
13716
13717 plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
13718 reference->plaintext.len);
13719 TEST_ASSERT_NOT_NULL(plaintext, "no room to append plaintext");
13720 memcpy(plaintext, reference->plaintext.data, reference->plaintext.len);
13721
13722 debug_hexdump(stdout, "plaintext:", plaintext,
13723 reference->plaintext.len);
13724
13725 /* Create operation */
13726 retval = create_auth_verify_operation(ts_params, ut_params, reference);
13727
13728 if (retval < 0)
13729 return retval;
13730
13731 if (data_corrupted)
13732 data_corruption(plaintext);
13733 else
13734 tag_corruption(plaintext, reference->plaintext.len);
13735
13736 if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO) {
13737 process_cpu_crypt_auth_op(ts_params->valid_devs[0],
13738 ut_params->op);
13739 TEST_ASSERT_NOT_EQUAL(ut_params->op->status,
13740 RTE_CRYPTO_OP_STATUS_SUCCESS,
13741 "authentication not failed");
13742 } else if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
13743 process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
13744 ut_params->op, 0, 1, 0, 0);
13745 else {
13746 ut_params->op = process_crypto_request(ts_params->valid_devs[0],
13747 ut_params->op);
13748 }
13749 if (ut_params->op == NULL)
13750 return 0;
13751 else if (ut_params->op->status != RTE_CRYPTO_OP_STATUS_SUCCESS)
13752 return 0;
13753
13754 return -1;
13755 }
13756
13757 static int
test_authentication_verify_GMAC_fail_when_corruption(struct crypto_testsuite_params * ts_params,struct crypto_unittest_params * ut_params,const struct test_crypto_vector * reference,unsigned int data_corrupted)13758 test_authentication_verify_GMAC_fail_when_corruption(
13759 struct crypto_testsuite_params *ts_params,
13760 struct crypto_unittest_params *ut_params,
13761 const struct test_crypto_vector *reference,
13762 unsigned int data_corrupted)
13763 {
13764 int retval;
13765 uint8_t *plaintext;
13766 struct rte_cryptodev_info dev_info;
13767
13768 rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
13769 uint64_t feat_flags = dev_info.feature_flags;
13770
13771 if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
13772 (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
13773 printf("Device doesn't support RAW data-path APIs.\n");
13774 return TEST_SKIPPED;
13775 }
13776
13777 /* Verify the capabilities */
13778 struct rte_cryptodev_sym_capability_idx cap_idx;
13779 cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
13780 cap_idx.algo.auth = reference->auth_algo;
13781 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
13782 &cap_idx) == NULL)
13783 return TEST_SKIPPED;
13784
13785 /* Create session */
13786 retval = create_auth_cipher_session(ut_params,
13787 ts_params->valid_devs[0],
13788 reference,
13789 RTE_CRYPTO_AUTH_OP_VERIFY,
13790 RTE_CRYPTO_CIPHER_OP_DECRYPT);
13791 if (retval < 0)
13792 return retval;
13793
13794 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
13795 TEST_ASSERT_NOT_NULL(ut_params->ibuf,
13796 "Failed to allocate input buffer in mempool");
13797
13798 /* clear mbuf payload */
13799 memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
13800 rte_pktmbuf_tailroom(ut_params->ibuf));
13801
13802 plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
13803 reference->plaintext.len);
13804 TEST_ASSERT_NOT_NULL(plaintext, "no room to append plaintext");
13805 memcpy(plaintext, reference->plaintext.data, reference->plaintext.len);
13806
13807 debug_hexdump(stdout, "plaintext:", plaintext,
13808 reference->plaintext.len);
13809
13810 /* Create operation */
13811 retval = create_auth_verify_GMAC_operation(ts_params,
13812 ut_params,
13813 reference);
13814
13815 if (retval < 0)
13816 return retval;
13817
13818 if (data_corrupted)
13819 data_corruption(plaintext);
13820 else
13821 tag_corruption(plaintext, reference->aad.len);
13822
13823 if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO) {
13824 process_cpu_crypt_auth_op(ts_params->valid_devs[0],
13825 ut_params->op);
13826 TEST_ASSERT_NOT_EQUAL(ut_params->op->status,
13827 RTE_CRYPTO_OP_STATUS_SUCCESS,
13828 "authentication not failed");
13829 } else if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
13830 process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
13831 ut_params->op, 0, 1, 0, 0);
13832 else {
13833 ut_params->op = process_crypto_request(ts_params->valid_devs[0],
13834 ut_params->op);
13835 TEST_ASSERT_NULL(ut_params->op, "authentication not failed");
13836 }
13837
13838 return 0;
13839 }
13840
13841 static int
test_authenticated_decryption_fail_when_corruption(struct crypto_testsuite_params * ts_params,struct crypto_unittest_params * ut_params,const struct test_crypto_vector * reference,unsigned int data_corrupted)13842 test_authenticated_decryption_fail_when_corruption(
13843 struct crypto_testsuite_params *ts_params,
13844 struct crypto_unittest_params *ut_params,
13845 const struct test_crypto_vector *reference,
13846 unsigned int data_corrupted)
13847 {
13848 int retval;
13849
13850 uint8_t *ciphertext;
13851 struct rte_cryptodev_info dev_info;
13852
13853 rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
13854 uint64_t feat_flags = dev_info.feature_flags;
13855
13856 if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
13857 (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
13858 printf("Device doesn't support RAW data-path APIs.\n");
13859 return TEST_SKIPPED;
13860 }
13861
13862 /* Verify the capabilities */
13863 struct rte_cryptodev_sym_capability_idx cap_idx;
13864 cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
13865 cap_idx.algo.auth = reference->auth_algo;
13866 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
13867 &cap_idx) == NULL)
13868 return TEST_SKIPPED;
13869 cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
13870 cap_idx.algo.cipher = reference->crypto_algo;
13871 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
13872 &cap_idx) == NULL)
13873 return TEST_SKIPPED;
13874
13875 /* Create session */
13876 retval = create_auth_cipher_session(ut_params,
13877 ts_params->valid_devs[0],
13878 reference,
13879 RTE_CRYPTO_AUTH_OP_VERIFY,
13880 RTE_CRYPTO_CIPHER_OP_DECRYPT);
13881
13882 if (retval == -ENOTSUP)
13883 return TEST_SKIPPED;
13884 if (retval < 0)
13885 return retval;
13886
13887 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
13888 TEST_ASSERT_NOT_NULL(ut_params->ibuf,
13889 "Failed to allocate input buffer in mempool");
13890
13891 /* clear mbuf payload */
13892 memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
13893 rte_pktmbuf_tailroom(ut_params->ibuf));
13894
13895 ciphertext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
13896 reference->ciphertext.len);
13897 TEST_ASSERT_NOT_NULL(ciphertext, "no room to append ciphertext");
13898 memcpy(ciphertext, reference->ciphertext.data,
13899 reference->ciphertext.len);
13900
13901 /* Create operation */
13902 retval = create_cipher_auth_verify_operation(ts_params,
13903 ut_params,
13904 reference);
13905
13906 if (retval < 0)
13907 return retval;
13908
13909 if (data_corrupted)
13910 data_corruption(ciphertext);
13911 else
13912 tag_corruption(ciphertext, reference->ciphertext.len);
13913
13914 if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO) {
13915 process_cpu_crypt_auth_op(ts_params->valid_devs[0],
13916 ut_params->op);
13917 TEST_ASSERT_NOT_EQUAL(ut_params->op->status,
13918 RTE_CRYPTO_OP_STATUS_SUCCESS,
13919 "authentication not failed");
13920 } else if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
13921 process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
13922 ut_params->op, 1, 1, 0, 0);
13923 else {
13924 ut_params->op = process_crypto_request(ts_params->valid_devs[0],
13925 ut_params->op);
13926 TEST_ASSERT_NULL(ut_params->op, "authentication not failed");
13927 }
13928
13929 return 0;
13930 }
13931
13932 static int
test_authenticated_encrypt_with_esn(struct crypto_testsuite_params * ts_params,struct crypto_unittest_params * ut_params,const struct test_crypto_vector * reference)13933 test_authenticated_encrypt_with_esn(
13934 struct crypto_testsuite_params *ts_params,
13935 struct crypto_unittest_params *ut_params,
13936 const struct test_crypto_vector *reference)
13937 {
13938 int retval;
13939
13940 uint8_t *authciphertext, *plaintext, *auth_tag;
13941 uint16_t plaintext_pad_len;
13942 uint8_t cipher_key[reference->cipher_key.len + 1];
13943 uint8_t auth_key[reference->auth_key.len + 1];
13944 struct rte_cryptodev_info dev_info;
13945 int status;
13946
13947 rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
13948 uint64_t feat_flags = dev_info.feature_flags;
13949
13950 if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
13951 (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
13952 printf("Device doesn't support RAW data-path APIs.\n");
13953 return TEST_SKIPPED;
13954 }
13955
13956 /* Verify the capabilities */
13957 struct rte_cryptodev_sym_capability_idx cap_idx;
13958 cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
13959 cap_idx.algo.auth = reference->auth_algo;
13960 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
13961 &cap_idx) == NULL)
13962 return TEST_SKIPPED;
13963 cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
13964 cap_idx.algo.cipher = reference->crypto_algo;
13965 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
13966 &cap_idx) == NULL)
13967 return TEST_SKIPPED;
13968
13969 /* Create session */
13970 memcpy(cipher_key, reference->cipher_key.data,
13971 reference->cipher_key.len);
13972 memcpy(auth_key, reference->auth_key.data, reference->auth_key.len);
13973
13974 /* Setup Cipher Parameters */
13975 ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
13976 ut_params->cipher_xform.cipher.algo = reference->crypto_algo;
13977 ut_params->cipher_xform.cipher.op = RTE_CRYPTO_CIPHER_OP_ENCRYPT;
13978 ut_params->cipher_xform.cipher.key.data = cipher_key;
13979 ut_params->cipher_xform.cipher.key.length = reference->cipher_key.len;
13980 ut_params->cipher_xform.cipher.iv.offset = IV_OFFSET;
13981 ut_params->cipher_xform.cipher.iv.length = reference->iv.len;
13982
13983 ut_params->cipher_xform.next = &ut_params->auth_xform;
13984
13985 /* Setup Authentication Parameters */
13986 ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;
13987 ut_params->auth_xform.auth.op = RTE_CRYPTO_AUTH_OP_GENERATE;
13988 ut_params->auth_xform.auth.algo = reference->auth_algo;
13989 ut_params->auth_xform.auth.key.length = reference->auth_key.len;
13990 ut_params->auth_xform.auth.key.data = auth_key;
13991 ut_params->auth_xform.auth.digest_length = reference->digest.len;
13992 ut_params->auth_xform.next = NULL;
13993
13994 /* Create Crypto session*/
13995 ut_params->sess = rte_cryptodev_sym_session_create(
13996 ts_params->session_mpool);
13997 TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed");
13998
13999 status = rte_cryptodev_sym_session_init(ts_params->valid_devs[0],
14000 ut_params->sess,
14001 &ut_params->cipher_xform,
14002 ts_params->session_priv_mpool);
14003
14004 if (status == -ENOTSUP)
14005 return TEST_SKIPPED;
14006
14007 TEST_ASSERT_EQUAL(status, 0, "Session init failed");
14008
14009 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
14010 TEST_ASSERT_NOT_NULL(ut_params->ibuf,
14011 "Failed to allocate input buffer in mempool");
14012
14013 /* clear mbuf payload */
14014 memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
14015 rte_pktmbuf_tailroom(ut_params->ibuf));
14016
14017 plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
14018 reference->plaintext.len);
14019 TEST_ASSERT_NOT_NULL(plaintext, "no room to append plaintext");
14020 memcpy(plaintext, reference->plaintext.data, reference->plaintext.len);
14021
14022 /* Create operation */
14023 retval = create_cipher_auth_operation(ts_params,
14024 ut_params,
14025 reference, 0);
14026
14027 if (retval < 0)
14028 return retval;
14029
14030 if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
14031 process_cpu_crypt_auth_op(ts_params->valid_devs[0],
14032 ut_params->op);
14033 else if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
14034 process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
14035 ut_params->op, 1, 1, 0, 0);
14036 else
14037 ut_params->op = process_crypto_request(
14038 ts_params->valid_devs[0], ut_params->op);
14039
14040 TEST_ASSERT_NOT_NULL(ut_params->op, "no crypto operation returned");
14041
14042 TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
14043 "crypto op processing failed");
14044
14045 plaintext_pad_len = RTE_ALIGN_CEIL(reference->plaintext.len, 16);
14046
14047 authciphertext = rte_pktmbuf_mtod_offset(ut_params->ibuf, uint8_t *,
14048 ut_params->op->sym->auth.data.offset);
14049 auth_tag = authciphertext + plaintext_pad_len;
14050 debug_hexdump(stdout, "ciphertext:", authciphertext,
14051 reference->ciphertext.len);
14052 debug_hexdump(stdout, "auth tag:", auth_tag, reference->digest.len);
14053
14054 /* Validate obuf */
14055 TEST_ASSERT_BUFFERS_ARE_EQUAL(
14056 authciphertext,
14057 reference->ciphertext.data,
14058 reference->ciphertext.len,
14059 "Ciphertext data not as expected");
14060
14061 TEST_ASSERT_BUFFERS_ARE_EQUAL(
14062 auth_tag,
14063 reference->digest.data,
14064 reference->digest.len,
14065 "Generated digest not as expected");
14066
14067 return TEST_SUCCESS;
14068
14069 }
14070
14071 static int
test_authenticated_decrypt_with_esn(struct crypto_testsuite_params * ts_params,struct crypto_unittest_params * ut_params,const struct test_crypto_vector * reference)14072 test_authenticated_decrypt_with_esn(
14073 struct crypto_testsuite_params *ts_params,
14074 struct crypto_unittest_params *ut_params,
14075 const struct test_crypto_vector *reference)
14076 {
14077 int retval;
14078
14079 uint8_t *ciphertext;
14080 uint8_t cipher_key[reference->cipher_key.len + 1];
14081 uint8_t auth_key[reference->auth_key.len + 1];
14082 struct rte_cryptodev_info dev_info;
14083
14084 rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
14085 uint64_t feat_flags = dev_info.feature_flags;
14086
14087 if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
14088 (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
14089 printf("Device doesn't support RAW data-path APIs.\n");
14090 return TEST_SKIPPED;
14091 }
14092
14093 /* Verify the capabilities */
14094 struct rte_cryptodev_sym_capability_idx cap_idx;
14095 cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
14096 cap_idx.algo.auth = reference->auth_algo;
14097 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
14098 &cap_idx) == NULL)
14099 return TEST_SKIPPED;
14100 cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
14101 cap_idx.algo.cipher = reference->crypto_algo;
14102 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
14103 &cap_idx) == NULL)
14104 return TEST_SKIPPED;
14105
14106 /* Create session */
14107 memcpy(cipher_key, reference->cipher_key.data,
14108 reference->cipher_key.len);
14109 memcpy(auth_key, reference->auth_key.data, reference->auth_key.len);
14110
14111 /* Setup Authentication Parameters */
14112 ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;
14113 ut_params->auth_xform.auth.op = RTE_CRYPTO_AUTH_OP_VERIFY;
14114 ut_params->auth_xform.auth.algo = reference->auth_algo;
14115 ut_params->auth_xform.auth.key.length = reference->auth_key.len;
14116 ut_params->auth_xform.auth.key.data = auth_key;
14117 ut_params->auth_xform.auth.digest_length = reference->digest.len;
14118 ut_params->auth_xform.next = &ut_params->cipher_xform;
14119
14120 /* Setup Cipher Parameters */
14121 ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
14122 ut_params->cipher_xform.next = NULL;
14123 ut_params->cipher_xform.cipher.algo = reference->crypto_algo;
14124 ut_params->cipher_xform.cipher.op = RTE_CRYPTO_CIPHER_OP_DECRYPT;
14125 ut_params->cipher_xform.cipher.key.data = cipher_key;
14126 ut_params->cipher_xform.cipher.key.length = reference->cipher_key.len;
14127 ut_params->cipher_xform.cipher.iv.offset = IV_OFFSET;
14128 ut_params->cipher_xform.cipher.iv.length = reference->iv.len;
14129
14130 /* Create Crypto session*/
14131 ut_params->sess = rte_cryptodev_sym_session_create(
14132 ts_params->session_mpool);
14133 TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed");
14134
14135 retval = rte_cryptodev_sym_session_init(ts_params->valid_devs[0],
14136 ut_params->sess,
14137 &ut_params->auth_xform,
14138 ts_params->session_priv_mpool);
14139
14140 if (retval == -ENOTSUP)
14141 return TEST_SKIPPED;
14142
14143 TEST_ASSERT_EQUAL(retval, 0, "Session init failed");
14144
14145 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
14146 TEST_ASSERT_NOT_NULL(ut_params->ibuf,
14147 "Failed to allocate input buffer in mempool");
14148
14149 /* clear mbuf payload */
14150 memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
14151 rte_pktmbuf_tailroom(ut_params->ibuf));
14152
14153 ciphertext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
14154 reference->ciphertext.len);
14155 TEST_ASSERT_NOT_NULL(ciphertext, "no room to append ciphertext");
14156 memcpy(ciphertext, reference->ciphertext.data,
14157 reference->ciphertext.len);
14158
14159 /* Create operation */
14160 retval = create_cipher_auth_verify_operation(ts_params,
14161 ut_params,
14162 reference);
14163
14164 if (retval < 0)
14165 return retval;
14166
14167 if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
14168 process_cpu_crypt_auth_op(ts_params->valid_devs[0],
14169 ut_params->op);
14170 else if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
14171 process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
14172 ut_params->op, 1, 1, 0, 0);
14173 else
14174 ut_params->op = process_crypto_request(ts_params->valid_devs[0],
14175 ut_params->op);
14176
14177 TEST_ASSERT_NOT_NULL(ut_params->op, "failed crypto process");
14178 TEST_ASSERT_EQUAL(ut_params->op->status,
14179 RTE_CRYPTO_OP_STATUS_SUCCESS,
14180 "crypto op processing passed");
14181
14182 ut_params->obuf = ut_params->op->sym->m_src;
14183 TEST_ASSERT_NOT_NULL(ut_params->obuf, "failed to retrieve obuf");
14184
14185 return 0;
14186 }
14187
14188 static int
create_aead_operation_SGL(enum rte_crypto_aead_operation op,const struct aead_test_data * tdata,void * digest_mem,uint64_t digest_phys)14189 create_aead_operation_SGL(enum rte_crypto_aead_operation op,
14190 const struct aead_test_data *tdata,
14191 void *digest_mem, uint64_t digest_phys)
14192 {
14193 struct crypto_testsuite_params *ts_params = &testsuite_params;
14194 struct crypto_unittest_params *ut_params = &unittest_params;
14195
14196 const unsigned int auth_tag_len = tdata->auth_tag.len;
14197 const unsigned int iv_len = tdata->iv.len;
14198 unsigned int aad_len = tdata->aad.len;
14199 unsigned int aad_len_pad = 0;
14200
14201 /* Generate Crypto op data structure */
14202 ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
14203 RTE_CRYPTO_OP_TYPE_SYMMETRIC);
14204 TEST_ASSERT_NOT_NULL(ut_params->op,
14205 "Failed to allocate symmetric crypto operation struct");
14206
14207 struct rte_crypto_sym_op *sym_op = ut_params->op->sym;
14208
14209 sym_op->aead.digest.data = digest_mem;
14210
14211 TEST_ASSERT_NOT_NULL(sym_op->aead.digest.data,
14212 "no room to append digest");
14213
14214 sym_op->aead.digest.phys_addr = digest_phys;
14215
14216 if (op == RTE_CRYPTO_AEAD_OP_DECRYPT) {
14217 rte_memcpy(sym_op->aead.digest.data, tdata->auth_tag.data,
14218 auth_tag_len);
14219 debug_hexdump(stdout, "digest:",
14220 sym_op->aead.digest.data,
14221 auth_tag_len);
14222 }
14223
14224 /* Append aad data */
14225 if (tdata->algo == RTE_CRYPTO_AEAD_AES_CCM) {
14226 uint8_t *iv_ptr = rte_crypto_op_ctod_offset(ut_params->op,
14227 uint8_t *, IV_OFFSET);
14228
14229 /* Copy IV 1 byte after the IV pointer, according to the API */
14230 rte_memcpy(iv_ptr + 1, tdata->iv.data, iv_len);
14231
14232 aad_len = RTE_ALIGN_CEIL(aad_len + 18, 16);
14233
14234 sym_op->aead.aad.data = (uint8_t *)rte_pktmbuf_prepend(
14235 ut_params->ibuf, aad_len);
14236 TEST_ASSERT_NOT_NULL(sym_op->aead.aad.data,
14237 "no room to prepend aad");
14238 sym_op->aead.aad.phys_addr = rte_pktmbuf_iova(
14239 ut_params->ibuf);
14240
14241 memset(sym_op->aead.aad.data, 0, aad_len);
14242 /* Copy AAD 18 bytes after the AAD pointer, according to the API */
14243 rte_memcpy(sym_op->aead.aad.data, tdata->aad.data, aad_len);
14244
14245 debug_hexdump(stdout, "iv:", iv_ptr, iv_len);
14246 debug_hexdump(stdout, "aad:",
14247 sym_op->aead.aad.data, aad_len);
14248 } else {
14249 uint8_t *iv_ptr = rte_crypto_op_ctod_offset(ut_params->op,
14250 uint8_t *, IV_OFFSET);
14251
14252 rte_memcpy(iv_ptr, tdata->iv.data, iv_len);
14253
14254 aad_len_pad = RTE_ALIGN_CEIL(aad_len, 16);
14255
14256 sym_op->aead.aad.data = (uint8_t *)rte_pktmbuf_prepend(
14257 ut_params->ibuf, aad_len_pad);
14258 TEST_ASSERT_NOT_NULL(sym_op->aead.aad.data,
14259 "no room to prepend aad");
14260 sym_op->aead.aad.phys_addr = rte_pktmbuf_iova(
14261 ut_params->ibuf);
14262
14263 memset(sym_op->aead.aad.data, 0, aad_len);
14264 rte_memcpy(sym_op->aead.aad.data, tdata->aad.data, aad_len);
14265
14266 debug_hexdump(stdout, "iv:", iv_ptr, iv_len);
14267 debug_hexdump(stdout, "aad:",
14268 sym_op->aead.aad.data, aad_len);
14269 }
14270
14271 sym_op->aead.data.length = tdata->plaintext.len;
14272 sym_op->aead.data.offset = aad_len_pad;
14273
14274 return 0;
14275 }
14276
14277 #define SGL_MAX_NO 16
14278
14279 static int
test_authenticated_encryption_SGL(const struct aead_test_data * tdata,const int oop,uint32_t fragsz,uint32_t fragsz_oop)14280 test_authenticated_encryption_SGL(const struct aead_test_data *tdata,
14281 const int oop, uint32_t fragsz, uint32_t fragsz_oop)
14282 {
14283 struct crypto_testsuite_params *ts_params = &testsuite_params;
14284 struct crypto_unittest_params *ut_params = &unittest_params;
14285 struct rte_mbuf *buf, *buf_oop = NULL, *buf_last_oop = NULL;
14286 int retval;
14287 int to_trn = 0;
14288 int to_trn_tbl[SGL_MAX_NO];
14289 int segs = 1;
14290 unsigned int trn_data = 0;
14291 uint8_t *plaintext, *ciphertext, *auth_tag;
14292 struct rte_cryptodev_info dev_info;
14293
14294 /* Verify the capabilities */
14295 struct rte_cryptodev_sym_capability_idx cap_idx;
14296 cap_idx.type = RTE_CRYPTO_SYM_XFORM_AEAD;
14297 cap_idx.algo.aead = tdata->algo;
14298 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
14299 &cap_idx) == NULL)
14300 return TEST_SKIPPED;
14301
14302 /* OOP not supported with CPU crypto */
14303 if (oop && gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
14304 return TEST_SKIPPED;
14305
14306 /* Detailed check for the particular SGL support flag */
14307 rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
14308 if (!oop) {
14309 unsigned int sgl_in = fragsz < tdata->plaintext.len;
14310 if (sgl_in && (!(dev_info.feature_flags &
14311 RTE_CRYPTODEV_FF_IN_PLACE_SGL)))
14312 return TEST_SKIPPED;
14313
14314 uint64_t feat_flags = dev_info.feature_flags;
14315
14316 if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
14317 (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
14318 printf("Device doesn't support RAW data-path APIs.\n");
14319 return TEST_SKIPPED;
14320 }
14321 } else {
14322 unsigned int sgl_in = fragsz < tdata->plaintext.len;
14323 unsigned int sgl_out = (fragsz_oop ? fragsz_oop : fragsz) <
14324 tdata->plaintext.len;
14325 /* Raw data path API does not support OOP */
14326 if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
14327 return TEST_SKIPPED;
14328 if (sgl_in && !sgl_out) {
14329 if (!(dev_info.feature_flags &
14330 RTE_CRYPTODEV_FF_OOP_SGL_IN_LB_OUT))
14331 return TEST_SKIPPED;
14332 } else if (!sgl_in && sgl_out) {
14333 if (!(dev_info.feature_flags &
14334 RTE_CRYPTODEV_FF_OOP_LB_IN_SGL_OUT))
14335 return TEST_SKIPPED;
14336 } else if (sgl_in && sgl_out) {
14337 if (!(dev_info.feature_flags &
14338 RTE_CRYPTODEV_FF_OOP_SGL_IN_SGL_OUT))
14339 return TEST_SKIPPED;
14340 }
14341 }
14342
14343 if (fragsz > tdata->plaintext.len)
14344 fragsz = tdata->plaintext.len;
14345
14346 uint16_t plaintext_len = fragsz;
14347 uint16_t frag_size_oop = fragsz_oop ? fragsz_oop : fragsz;
14348
14349 if (fragsz_oop > tdata->plaintext.len)
14350 frag_size_oop = tdata->plaintext.len;
14351
14352 int ecx = 0;
14353 void *digest_mem = NULL;
14354
14355 uint32_t prepend_len = RTE_ALIGN_CEIL(tdata->aad.len, 16);
14356
14357 if (tdata->plaintext.len % fragsz != 0) {
14358 if (tdata->plaintext.len / fragsz + 1 > SGL_MAX_NO)
14359 return 1;
14360 } else {
14361 if (tdata->plaintext.len / fragsz > SGL_MAX_NO)
14362 return 1;
14363 }
14364
14365 /*
14366 * For out-op-place we need to alloc another mbuf
14367 */
14368 if (oop) {
14369 ut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
14370 rte_pktmbuf_append(ut_params->obuf,
14371 frag_size_oop + prepend_len);
14372 buf_oop = ut_params->obuf;
14373 }
14374
14375 /* Create AEAD session */
14376 retval = create_aead_session(ts_params->valid_devs[0],
14377 tdata->algo,
14378 RTE_CRYPTO_AEAD_OP_ENCRYPT,
14379 tdata->key.data, tdata->key.len,
14380 tdata->aad.len, tdata->auth_tag.len,
14381 tdata->iv.len);
14382 if (retval < 0)
14383 return retval;
14384
14385 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
14386
14387 /* clear mbuf payload */
14388 memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
14389 rte_pktmbuf_tailroom(ut_params->ibuf));
14390
14391 plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
14392 plaintext_len);
14393
14394 memcpy(plaintext, tdata->plaintext.data, plaintext_len);
14395
14396 trn_data += plaintext_len;
14397
14398 buf = ut_params->ibuf;
14399
14400 /*
14401 * Loop until no more fragments
14402 */
14403
14404 while (trn_data < tdata->plaintext.len) {
14405 ++segs;
14406 to_trn = (tdata->plaintext.len - trn_data < fragsz) ?
14407 (tdata->plaintext.len - trn_data) : fragsz;
14408
14409 to_trn_tbl[ecx++] = to_trn;
14410
14411 buf->next = rte_pktmbuf_alloc(ts_params->mbuf_pool);
14412 buf = buf->next;
14413
14414 memset(rte_pktmbuf_mtod(buf, uint8_t *), 0,
14415 rte_pktmbuf_tailroom(buf));
14416
14417 /* OOP */
14418 if (oop && !fragsz_oop) {
14419 buf_last_oop = buf_oop->next =
14420 rte_pktmbuf_alloc(ts_params->mbuf_pool);
14421 buf_oop = buf_oop->next;
14422 memset(rte_pktmbuf_mtod(buf_oop, uint8_t *),
14423 0, rte_pktmbuf_tailroom(buf_oop));
14424 rte_pktmbuf_append(buf_oop, to_trn);
14425 }
14426
14427 plaintext = (uint8_t *)rte_pktmbuf_append(buf,
14428 to_trn);
14429
14430 memcpy(plaintext, tdata->plaintext.data + trn_data,
14431 to_trn);
14432 trn_data += to_trn;
14433 if (trn_data == tdata->plaintext.len) {
14434 if (oop) {
14435 if (!fragsz_oop)
14436 digest_mem = rte_pktmbuf_append(buf_oop,
14437 tdata->auth_tag.len);
14438 } else
14439 digest_mem = (uint8_t *)rte_pktmbuf_append(buf,
14440 tdata->auth_tag.len);
14441 }
14442 }
14443
14444 uint64_t digest_phys = 0;
14445
14446 ut_params->ibuf->nb_segs = segs;
14447
14448 segs = 1;
14449 if (fragsz_oop && oop) {
14450 to_trn = 0;
14451 ecx = 0;
14452
14453 if (frag_size_oop == tdata->plaintext.len) {
14454 digest_mem = rte_pktmbuf_append(ut_params->obuf,
14455 tdata->auth_tag.len);
14456
14457 digest_phys = rte_pktmbuf_iova_offset(
14458 ut_params->obuf,
14459 tdata->plaintext.len + prepend_len);
14460 }
14461
14462 trn_data = frag_size_oop;
14463 while (trn_data < tdata->plaintext.len) {
14464 ++segs;
14465 to_trn =
14466 (tdata->plaintext.len - trn_data <
14467 frag_size_oop) ?
14468 (tdata->plaintext.len - trn_data) :
14469 frag_size_oop;
14470
14471 to_trn_tbl[ecx++] = to_trn;
14472
14473 buf_last_oop = buf_oop->next =
14474 rte_pktmbuf_alloc(ts_params->mbuf_pool);
14475 buf_oop = buf_oop->next;
14476 memset(rte_pktmbuf_mtod(buf_oop, uint8_t *),
14477 0, rte_pktmbuf_tailroom(buf_oop));
14478 rte_pktmbuf_append(buf_oop, to_trn);
14479
14480 trn_data += to_trn;
14481
14482 if (trn_data == tdata->plaintext.len) {
14483 digest_mem = rte_pktmbuf_append(buf_oop,
14484 tdata->auth_tag.len);
14485 }
14486 }
14487
14488 ut_params->obuf->nb_segs = segs;
14489 }
14490
14491 /*
14492 * Place digest at the end of the last buffer
14493 */
14494 if (!digest_phys)
14495 digest_phys = rte_pktmbuf_iova(buf) + to_trn;
14496 if (oop && buf_last_oop)
14497 digest_phys = rte_pktmbuf_iova(buf_last_oop) + to_trn;
14498
14499 if (!digest_mem && !oop) {
14500 digest_mem = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
14501 + tdata->auth_tag.len);
14502 digest_phys = rte_pktmbuf_iova_offset(ut_params->ibuf,
14503 tdata->plaintext.len);
14504 }
14505
14506 /* Create AEAD operation */
14507 retval = create_aead_operation_SGL(RTE_CRYPTO_AEAD_OP_ENCRYPT,
14508 tdata, digest_mem, digest_phys);
14509
14510 if (retval < 0)
14511 return retval;
14512
14513 rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
14514
14515 ut_params->op->sym->m_src = ut_params->ibuf;
14516 if (oop)
14517 ut_params->op->sym->m_dst = ut_params->obuf;
14518
14519 /* Process crypto operation */
14520 if (oop == IN_PLACE &&
14521 gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
14522 process_cpu_aead_op(ts_params->valid_devs[0], ut_params->op);
14523 else if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
14524 process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
14525 ut_params->op, 0, 0, 0, 0);
14526 else
14527 TEST_ASSERT_NOT_NULL(
14528 process_crypto_request(ts_params->valid_devs[0],
14529 ut_params->op), "failed to process sym crypto op");
14530
14531 TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
14532 "crypto op processing failed");
14533
14534
14535 ciphertext = rte_pktmbuf_mtod_offset(ut_params->op->sym->m_src,
14536 uint8_t *, prepend_len);
14537 if (oop) {
14538 ciphertext = rte_pktmbuf_mtod_offset(ut_params->op->sym->m_dst,
14539 uint8_t *, prepend_len);
14540 }
14541
14542 if (fragsz_oop)
14543 fragsz = fragsz_oop;
14544
14545 TEST_ASSERT_BUFFERS_ARE_EQUAL(
14546 ciphertext,
14547 tdata->ciphertext.data,
14548 fragsz,
14549 "Ciphertext data not as expected");
14550
14551 buf = ut_params->op->sym->m_src->next;
14552 if (oop)
14553 buf = ut_params->op->sym->m_dst->next;
14554
14555 unsigned int off = fragsz;
14556
14557 ecx = 0;
14558 while (buf) {
14559 ciphertext = rte_pktmbuf_mtod(buf,
14560 uint8_t *);
14561
14562 TEST_ASSERT_BUFFERS_ARE_EQUAL(
14563 ciphertext,
14564 tdata->ciphertext.data + off,
14565 to_trn_tbl[ecx],
14566 "Ciphertext data not as expected");
14567
14568 off += to_trn_tbl[ecx++];
14569 buf = buf->next;
14570 }
14571
14572 auth_tag = digest_mem;
14573 TEST_ASSERT_BUFFERS_ARE_EQUAL(
14574 auth_tag,
14575 tdata->auth_tag.data,
14576 tdata->auth_tag.len,
14577 "Generated auth tag not as expected");
14578
14579 return 0;
14580 }
14581
14582 static int
test_AES_GCM_auth_encrypt_SGL_out_of_place_400B_400B(void)14583 test_AES_GCM_auth_encrypt_SGL_out_of_place_400B_400B(void)
14584 {
14585 return test_authenticated_encryption_SGL(
14586 &gcm_test_case_SGL_1, OUT_OF_PLACE, 400, 400);
14587 }
14588
14589 static int
test_AES_GCM_auth_encrypt_SGL_out_of_place_1500B_2000B(void)14590 test_AES_GCM_auth_encrypt_SGL_out_of_place_1500B_2000B(void)
14591 {
14592 return test_authenticated_encryption_SGL(
14593 &gcm_test_case_SGL_1, OUT_OF_PLACE, 1500, 2000);
14594 }
14595
14596 static int
test_AES_GCM_auth_encrypt_SGL_out_of_place_400B_1seg(void)14597 test_AES_GCM_auth_encrypt_SGL_out_of_place_400B_1seg(void)
14598 {
14599 return test_authenticated_encryption_SGL(
14600 &gcm_test_case_8, OUT_OF_PLACE, 400,
14601 gcm_test_case_8.plaintext.len);
14602 }
14603
14604 static int
test_AES_GCM_auth_encrypt_SGL_in_place_1500B(void)14605 test_AES_GCM_auth_encrypt_SGL_in_place_1500B(void)
14606 {
14607 /* This test is not for OPENSSL PMD */
14608 if (gbl_driver_id == rte_cryptodev_driver_id_get(
14609 RTE_STR(CRYPTODEV_NAME_OPENSSL_PMD)))
14610 return TEST_SKIPPED;
14611
14612 return test_authenticated_encryption_SGL(
14613 &gcm_test_case_SGL_1, IN_PLACE, 1500, 0);
14614 }
14615
14616 static int
test_authentication_verify_fail_when_data_corrupted(struct crypto_testsuite_params * ts_params,struct crypto_unittest_params * ut_params,const struct test_crypto_vector * reference)14617 test_authentication_verify_fail_when_data_corrupted(
14618 struct crypto_testsuite_params *ts_params,
14619 struct crypto_unittest_params *ut_params,
14620 const struct test_crypto_vector *reference)
14621 {
14622 return test_authentication_verify_fail_when_data_corruption(
14623 ts_params, ut_params, reference, 1);
14624 }
14625
14626 static int
test_authentication_verify_fail_when_tag_corrupted(struct crypto_testsuite_params * ts_params,struct crypto_unittest_params * ut_params,const struct test_crypto_vector * reference)14627 test_authentication_verify_fail_when_tag_corrupted(
14628 struct crypto_testsuite_params *ts_params,
14629 struct crypto_unittest_params *ut_params,
14630 const struct test_crypto_vector *reference)
14631 {
14632 return test_authentication_verify_fail_when_data_corruption(
14633 ts_params, ut_params, reference, 0);
14634 }
14635
14636 static int
test_authentication_verify_GMAC_fail_when_data_corrupted(struct crypto_testsuite_params * ts_params,struct crypto_unittest_params * ut_params,const struct test_crypto_vector * reference)14637 test_authentication_verify_GMAC_fail_when_data_corrupted(
14638 struct crypto_testsuite_params *ts_params,
14639 struct crypto_unittest_params *ut_params,
14640 const struct test_crypto_vector *reference)
14641 {
14642 return test_authentication_verify_GMAC_fail_when_corruption(
14643 ts_params, ut_params, reference, 1);
14644 }
14645
14646 static int
test_authentication_verify_GMAC_fail_when_tag_corrupted(struct crypto_testsuite_params * ts_params,struct crypto_unittest_params * ut_params,const struct test_crypto_vector * reference)14647 test_authentication_verify_GMAC_fail_when_tag_corrupted(
14648 struct crypto_testsuite_params *ts_params,
14649 struct crypto_unittest_params *ut_params,
14650 const struct test_crypto_vector *reference)
14651 {
14652 return test_authentication_verify_GMAC_fail_when_corruption(
14653 ts_params, ut_params, reference, 0);
14654 }
14655
14656 static int
test_authenticated_decryption_fail_when_data_corrupted(struct crypto_testsuite_params * ts_params,struct crypto_unittest_params * ut_params,const struct test_crypto_vector * reference)14657 test_authenticated_decryption_fail_when_data_corrupted(
14658 struct crypto_testsuite_params *ts_params,
14659 struct crypto_unittest_params *ut_params,
14660 const struct test_crypto_vector *reference)
14661 {
14662 return test_authenticated_decryption_fail_when_corruption(
14663 ts_params, ut_params, reference, 1);
14664 }
14665
14666 static int
test_authenticated_decryption_fail_when_tag_corrupted(struct crypto_testsuite_params * ts_params,struct crypto_unittest_params * ut_params,const struct test_crypto_vector * reference)14667 test_authenticated_decryption_fail_when_tag_corrupted(
14668 struct crypto_testsuite_params *ts_params,
14669 struct crypto_unittest_params *ut_params,
14670 const struct test_crypto_vector *reference)
14671 {
14672 return test_authenticated_decryption_fail_when_corruption(
14673 ts_params, ut_params, reference, 0);
14674 }
14675
14676 static int
authentication_verify_HMAC_SHA1_fail_data_corrupt(void)14677 authentication_verify_HMAC_SHA1_fail_data_corrupt(void)
14678 {
14679 return test_authentication_verify_fail_when_data_corrupted(
14680 &testsuite_params, &unittest_params,
14681 &hmac_sha1_test_crypto_vector);
14682 }
14683
14684 static int
authentication_verify_HMAC_SHA1_fail_tag_corrupt(void)14685 authentication_verify_HMAC_SHA1_fail_tag_corrupt(void)
14686 {
14687 return test_authentication_verify_fail_when_tag_corrupted(
14688 &testsuite_params, &unittest_params,
14689 &hmac_sha1_test_crypto_vector);
14690 }
14691
14692 static int
authentication_verify_AES128_GMAC_fail_data_corrupt(void)14693 authentication_verify_AES128_GMAC_fail_data_corrupt(void)
14694 {
14695 return test_authentication_verify_GMAC_fail_when_data_corrupted(
14696 &testsuite_params, &unittest_params,
14697 &aes128_gmac_test_vector);
14698 }
14699
14700 static int
authentication_verify_AES128_GMAC_fail_tag_corrupt(void)14701 authentication_verify_AES128_GMAC_fail_tag_corrupt(void)
14702 {
14703 return test_authentication_verify_GMAC_fail_when_tag_corrupted(
14704 &testsuite_params, &unittest_params,
14705 &aes128_gmac_test_vector);
14706 }
14707
14708 static int
auth_decryption_AES128CBC_HMAC_SHA1_fail_data_corrupt(void)14709 auth_decryption_AES128CBC_HMAC_SHA1_fail_data_corrupt(void)
14710 {
14711 return test_authenticated_decryption_fail_when_data_corrupted(
14712 &testsuite_params,
14713 &unittest_params,
14714 &aes128cbc_hmac_sha1_test_vector);
14715 }
14716
14717 static int
auth_decryption_AES128CBC_HMAC_SHA1_fail_tag_corrupt(void)14718 auth_decryption_AES128CBC_HMAC_SHA1_fail_tag_corrupt(void)
14719 {
14720 return test_authenticated_decryption_fail_when_tag_corrupted(
14721 &testsuite_params,
14722 &unittest_params,
14723 &aes128cbc_hmac_sha1_test_vector);
14724 }
14725
14726 static int
auth_encrypt_AES128CBC_HMAC_SHA1_esn_check(void)14727 auth_encrypt_AES128CBC_HMAC_SHA1_esn_check(void)
14728 {
14729 return test_authenticated_encrypt_with_esn(
14730 &testsuite_params,
14731 &unittest_params,
14732 &aes128cbc_hmac_sha1_aad_test_vector);
14733 }
14734
14735 static int
auth_decrypt_AES128CBC_HMAC_SHA1_esn_check(void)14736 auth_decrypt_AES128CBC_HMAC_SHA1_esn_check(void)
14737 {
14738 return test_authenticated_decrypt_with_esn(
14739 &testsuite_params,
14740 &unittest_params,
14741 &aes128cbc_hmac_sha1_aad_test_vector);
14742 }
14743
14744 static int
test_chacha20_poly1305_encrypt_test_case_rfc8439(void)14745 test_chacha20_poly1305_encrypt_test_case_rfc8439(void)
14746 {
14747 return test_authenticated_encryption(&chacha20_poly1305_case_rfc8439);
14748 }
14749
14750 static int
test_chacha20_poly1305_decrypt_test_case_rfc8439(void)14751 test_chacha20_poly1305_decrypt_test_case_rfc8439(void)
14752 {
14753 return test_authenticated_decryption(&chacha20_poly1305_case_rfc8439);
14754 }
14755
14756 static int
test_chacha20_poly1305_encrypt_SGL_out_of_place(void)14757 test_chacha20_poly1305_encrypt_SGL_out_of_place(void)
14758 {
14759 return test_authenticated_encryption_SGL(
14760 &chacha20_poly1305_case_2, OUT_OF_PLACE, 32,
14761 chacha20_poly1305_case_2.plaintext.len);
14762 }
14763
14764 #ifdef RTE_CRYPTO_SCHEDULER
14765
14766 /* global AESNI worker IDs for the scheduler test */
14767 uint8_t aesni_ids[2];
14768
14769 static int
scheduler_testsuite_setup(void)14770 scheduler_testsuite_setup(void)
14771 {
14772 uint32_t i = 0;
14773 int32_t nb_devs, ret;
14774 char vdev_args[VDEV_ARGS_SIZE] = {""};
14775 char temp_str[VDEV_ARGS_SIZE] = {"mode=multi-core,"
14776 "ordering=enable,name=cryptodev_test_scheduler,corelist="};
14777 uint16_t worker_core_count = 0;
14778 uint16_t socket_id = 0;
14779
14780 if (gbl_driver_id == rte_cryptodev_driver_id_get(
14781 RTE_STR(CRYPTODEV_NAME_SCHEDULER_PMD))) {
14782
14783 /* Identify the Worker Cores
14784 * Use 2 worker cores for the device args
14785 */
14786 RTE_LCORE_FOREACH_WORKER(i) {
14787 if (worker_core_count > 1)
14788 break;
14789 snprintf(vdev_args, sizeof(vdev_args),
14790 "%s%d", temp_str, i);
14791 strcpy(temp_str, vdev_args);
14792 strlcat(temp_str, ";", sizeof(temp_str));
14793 worker_core_count++;
14794 socket_id = rte_lcore_to_socket_id(i);
14795 }
14796 if (worker_core_count != 2) {
14797 RTE_LOG(ERR, USER1,
14798 "Cryptodev scheduler test require at least "
14799 "two worker cores to run. "
14800 "Please use the correct coremask.\n");
14801 return TEST_FAILED;
14802 }
14803 strcpy(temp_str, vdev_args);
14804 snprintf(vdev_args, sizeof(vdev_args), "%s,socket_id=%d",
14805 temp_str, socket_id);
14806 RTE_LOG(DEBUG, USER1, "vdev_args: %s\n", vdev_args);
14807 nb_devs = rte_cryptodev_device_count_by_driver(
14808 rte_cryptodev_driver_id_get(
14809 RTE_STR(CRYPTODEV_NAME_SCHEDULER_PMD)));
14810 if (nb_devs < 1) {
14811 ret = rte_vdev_init(
14812 RTE_STR(CRYPTODEV_NAME_SCHEDULER_PMD),
14813 vdev_args);
14814 TEST_ASSERT(ret == 0,
14815 "Failed to create instance %u of pmd : %s",
14816 i, RTE_STR(CRYPTODEV_NAME_SCHEDULER_PMD));
14817 }
14818 }
14819 return testsuite_setup();
14820 }
14821
14822 static int
test_scheduler_attach_worker_op(void)14823 test_scheduler_attach_worker_op(void)
14824 {
14825 struct crypto_testsuite_params *ts_params = &testsuite_params;
14826 uint8_t sched_id = ts_params->valid_devs[0];
14827 uint32_t i, nb_devs_attached = 0;
14828 int ret;
14829 char vdev_name[32];
14830 unsigned int count = rte_cryptodev_count();
14831
14832 /* create 2 AESNI_MB vdevs on top of existing devices */
14833 for (i = count; i < count + 2; i++) {
14834 snprintf(vdev_name, sizeof(vdev_name), "%s_%u",
14835 RTE_STR(CRYPTODEV_NAME_AESNI_MB_PMD),
14836 i);
14837 ret = rte_vdev_init(vdev_name, NULL);
14838
14839 TEST_ASSERT(ret == 0,
14840 "Failed to create instance %u of"
14841 " pmd : %s",
14842 i, RTE_STR(CRYPTODEV_NAME_AESNI_MB_PMD));
14843
14844 if (ret < 0) {
14845 RTE_LOG(ERR, USER1,
14846 "Failed to create 2 AESNI MB PMDs.\n");
14847 return TEST_SKIPPED;
14848 }
14849 }
14850
14851 /* attach 2 AESNI_MB cdevs */
14852 for (i = count; i < count + 2; i++) {
14853 struct rte_cryptodev_info info;
14854 unsigned int session_size;
14855
14856 rte_cryptodev_info_get(i, &info);
14857 if (info.driver_id != rte_cryptodev_driver_id_get(
14858 RTE_STR(CRYPTODEV_NAME_AESNI_MB_PMD)))
14859 continue;
14860
14861 session_size = rte_cryptodev_sym_get_private_session_size(i);
14862 /*
14863 * Create the session mempool again, since now there are new devices
14864 * to use the mempool.
14865 */
14866 if (ts_params->session_mpool) {
14867 rte_mempool_free(ts_params->session_mpool);
14868 ts_params->session_mpool = NULL;
14869 }
14870 if (ts_params->session_priv_mpool) {
14871 rte_mempool_free(ts_params->session_priv_mpool);
14872 ts_params->session_priv_mpool = NULL;
14873 }
14874
14875 if (info.sym.max_nb_sessions != 0 &&
14876 info.sym.max_nb_sessions < MAX_NB_SESSIONS) {
14877 RTE_LOG(ERR, USER1,
14878 "Device does not support "
14879 "at least %u sessions\n",
14880 MAX_NB_SESSIONS);
14881 return TEST_FAILED;
14882 }
14883 /*
14884 * Create mempool with maximum number of sessions,
14885 * to include the session headers
14886 */
14887 if (ts_params->session_mpool == NULL) {
14888 ts_params->session_mpool =
14889 rte_cryptodev_sym_session_pool_create(
14890 "test_sess_mp",
14891 MAX_NB_SESSIONS, 0, 0, 0,
14892 SOCKET_ID_ANY);
14893 TEST_ASSERT_NOT_NULL(ts_params->session_mpool,
14894 "session mempool allocation failed");
14895 }
14896
14897 /*
14898 * Create mempool with maximum number of sessions,
14899 * to include device specific session private data
14900 */
14901 if (ts_params->session_priv_mpool == NULL) {
14902 ts_params->session_priv_mpool = rte_mempool_create(
14903 "test_sess_mp_priv",
14904 MAX_NB_SESSIONS,
14905 session_size,
14906 0, 0, NULL, NULL, NULL,
14907 NULL, SOCKET_ID_ANY,
14908 0);
14909
14910 TEST_ASSERT_NOT_NULL(ts_params->session_priv_mpool,
14911 "session mempool allocation failed");
14912 }
14913
14914 ts_params->qp_conf.mp_session = ts_params->session_mpool;
14915 ts_params->qp_conf.mp_session_private =
14916 ts_params->session_priv_mpool;
14917
14918 ret = rte_cryptodev_scheduler_worker_attach(sched_id,
14919 (uint8_t)i);
14920
14921 TEST_ASSERT(ret == 0,
14922 "Failed to attach device %u of pmd : %s", i,
14923 RTE_STR(CRYPTODEV_NAME_AESNI_MB_PMD));
14924
14925 aesni_ids[nb_devs_attached] = (uint8_t)i;
14926
14927 nb_devs_attached++;
14928 }
14929
14930 return 0;
14931 }
14932
14933 static int
test_scheduler_detach_worker_op(void)14934 test_scheduler_detach_worker_op(void)
14935 {
14936 struct crypto_testsuite_params *ts_params = &testsuite_params;
14937 uint8_t sched_id = ts_params->valid_devs[0];
14938 uint32_t i;
14939 int ret;
14940
14941 for (i = 0; i < 2; i++) {
14942 ret = rte_cryptodev_scheduler_worker_detach(sched_id,
14943 aesni_ids[i]);
14944 TEST_ASSERT(ret == 0,
14945 "Failed to detach device %u", aesni_ids[i]);
14946 }
14947
14948 return 0;
14949 }
14950
14951 static int
test_scheduler_mode_op(enum rte_cryptodev_scheduler_mode scheduler_mode)14952 test_scheduler_mode_op(enum rte_cryptodev_scheduler_mode scheduler_mode)
14953 {
14954 struct crypto_testsuite_params *ts_params = &testsuite_params;
14955 uint8_t sched_id = ts_params->valid_devs[0];
14956 /* set mode */
14957 return rte_cryptodev_scheduler_mode_set(sched_id,
14958 scheduler_mode);
14959 }
14960
14961 static int
test_scheduler_mode_roundrobin_op(void)14962 test_scheduler_mode_roundrobin_op(void)
14963 {
14964 TEST_ASSERT(test_scheduler_mode_op(CDEV_SCHED_MODE_ROUNDROBIN) ==
14965 0, "Failed to set roundrobin mode");
14966 return 0;
14967
14968 }
14969
14970 static int
test_scheduler_mode_multicore_op(void)14971 test_scheduler_mode_multicore_op(void)
14972 {
14973 TEST_ASSERT(test_scheduler_mode_op(CDEV_SCHED_MODE_MULTICORE) ==
14974 0, "Failed to set multicore mode");
14975
14976 return 0;
14977 }
14978
14979 static int
test_scheduler_mode_failover_op(void)14980 test_scheduler_mode_failover_op(void)
14981 {
14982 TEST_ASSERT(test_scheduler_mode_op(CDEV_SCHED_MODE_FAILOVER) ==
14983 0, "Failed to set failover mode");
14984
14985 return 0;
14986 }
14987
14988 static int
test_scheduler_mode_pkt_size_distr_op(void)14989 test_scheduler_mode_pkt_size_distr_op(void)
14990 {
14991 TEST_ASSERT(test_scheduler_mode_op(CDEV_SCHED_MODE_PKT_SIZE_DISTR) ==
14992 0, "Failed to set pktsize mode");
14993
14994 return 0;
14995 }
14996
14997 static int
scheduler_multicore_testsuite_setup(void)14998 scheduler_multicore_testsuite_setup(void)
14999 {
15000 if (test_scheduler_attach_worker_op() < 0)
15001 return TEST_SKIPPED;
15002 if (test_scheduler_mode_op(CDEV_SCHED_MODE_MULTICORE) < 0)
15003 return TEST_SKIPPED;
15004 return 0;
15005 }
15006
15007 static int
scheduler_roundrobin_testsuite_setup(void)15008 scheduler_roundrobin_testsuite_setup(void)
15009 {
15010 if (test_scheduler_attach_worker_op() < 0)
15011 return TEST_SKIPPED;
15012 if (test_scheduler_mode_op(CDEV_SCHED_MODE_ROUNDROBIN) < 0)
15013 return TEST_SKIPPED;
15014 return 0;
15015 }
15016
15017 static int
scheduler_failover_testsuite_setup(void)15018 scheduler_failover_testsuite_setup(void)
15019 {
15020 if (test_scheduler_attach_worker_op() < 0)
15021 return TEST_SKIPPED;
15022 if (test_scheduler_mode_op(CDEV_SCHED_MODE_FAILOVER) < 0)
15023 return TEST_SKIPPED;
15024 return 0;
15025 }
15026
15027 static int
scheduler_pkt_size_distr_testsuite_setup(void)15028 scheduler_pkt_size_distr_testsuite_setup(void)
15029 {
15030 if (test_scheduler_attach_worker_op() < 0)
15031 return TEST_SKIPPED;
15032 if (test_scheduler_mode_op(CDEV_SCHED_MODE_PKT_SIZE_DISTR) < 0)
15033 return TEST_SKIPPED;
15034 return 0;
15035 }
15036
15037 static void
scheduler_mode_testsuite_teardown(void)15038 scheduler_mode_testsuite_teardown(void)
15039 {
15040 test_scheduler_detach_worker_op();
15041 }
15042
15043 #endif /* RTE_CRYPTO_SCHEDULER */
15044
15045 static struct unit_test_suite end_testsuite = {
15046 .suite_name = NULL,
15047 .setup = NULL,
15048 .teardown = NULL,
15049 .unit_test_suites = NULL
15050 };
15051
15052 #ifdef RTE_LIB_SECURITY
15053 static struct unit_test_suite ipsec_proto_testsuite = {
15054 .suite_name = "IPsec Proto Unit Test Suite",
15055 .setup = ipsec_proto_testsuite_setup,
15056 .unit_test_cases = {
15057 TEST_CASE_NAMED_WITH_DATA(
15058 "Outbound known vector (ESP tunnel mode IPv4 AES-GCM 128)",
15059 ut_setup_security, ut_teardown,
15060 test_ipsec_proto_known_vec, &pkt_aes_128_gcm),
15061 TEST_CASE_NAMED_WITH_DATA(
15062 "Outbound known vector (ESP tunnel mode IPv4 AES-GCM 192)",
15063 ut_setup_security, ut_teardown,
15064 test_ipsec_proto_known_vec, &pkt_aes_192_gcm),
15065 TEST_CASE_NAMED_WITH_DATA(
15066 "Outbound known vector (ESP tunnel mode IPv4 AES-GCM 256)",
15067 ut_setup_security, ut_teardown,
15068 test_ipsec_proto_known_vec, &pkt_aes_256_gcm),
15069 TEST_CASE_NAMED_WITH_DATA(
15070 "Outbound known vector (ESP tunnel mode IPv4 AES-CBC 128 HMAC-SHA256 [16B ICV])",
15071 ut_setup_security, ut_teardown,
15072 test_ipsec_proto_known_vec,
15073 &pkt_aes_128_cbc_hmac_sha256),
15074 TEST_CASE_NAMED_WITH_DATA(
15075 "Outbound known vector (ESP tunnel mode IPv4 AES-CBC 128 HMAC-SHA384 [24B ICV])",
15076 ut_setup_security, ut_teardown,
15077 test_ipsec_proto_known_vec,
15078 &pkt_aes_128_cbc_hmac_sha384),
15079 TEST_CASE_NAMED_WITH_DATA(
15080 "Outbound known vector (ESP tunnel mode IPv4 AES-CBC 128 HMAC-SHA512 [32B ICV])",
15081 ut_setup_security, ut_teardown,
15082 test_ipsec_proto_known_vec,
15083 &pkt_aes_128_cbc_hmac_sha512),
15084 TEST_CASE_NAMED_WITH_DATA(
15085 "Outbound known vector (ESP tunnel mode IPv6 AES-GCM 128)",
15086 ut_setup_security, ut_teardown,
15087 test_ipsec_proto_known_vec, &pkt_aes_256_gcm_v6),
15088 TEST_CASE_NAMED_WITH_DATA(
15089 "Outbound known vector (ESP tunnel mode IPv6 AES-CBC 128 HMAC-SHA256 [16B ICV])",
15090 ut_setup_security, ut_teardown,
15091 test_ipsec_proto_known_vec,
15092 &pkt_aes_128_cbc_hmac_sha256_v6),
15093 TEST_CASE_NAMED_WITH_DATA(
15094 "Outbound known vector (ESP tunnel mode IPv4 NULL AES-XCBC-MAC [12B ICV])",
15095 ut_setup_security, ut_teardown,
15096 test_ipsec_proto_known_vec,
15097 &pkt_null_aes_xcbc),
15098 TEST_CASE_NAMED_WITH_DATA(
15099 "Outbound known vector (AH tunnel mode IPv4 HMAC-SHA256)",
15100 ut_setup_security, ut_teardown,
15101 test_ipsec_proto_known_vec,
15102 &pkt_ah_tunnel_sha256),
15103 TEST_CASE_NAMED_WITH_DATA(
15104 "Outbound known vector (AH transport mode IPv4 HMAC-SHA256)",
15105 ut_setup_security, ut_teardown,
15106 test_ipsec_proto_known_vec,
15107 &pkt_ah_transport_sha256),
15108 TEST_CASE_NAMED_WITH_DATA(
15109 "Outbound known vector (AH transport mode IPv4 AES-GMAC 128)",
15110 ut_setup_security, ut_teardown,
15111 test_ipsec_proto_known_vec,
15112 &pkt_ah_ipv4_aes_gmac_128),
15113 TEST_CASE_NAMED_WITH_DATA(
15114 "Outbound fragmented packet",
15115 ut_setup_security, ut_teardown,
15116 test_ipsec_proto_known_vec_fragmented,
15117 &pkt_aes_128_gcm_frag),
15118 TEST_CASE_NAMED_WITH_DATA(
15119 "Inbound known vector (ESP tunnel mode IPv4 AES-GCM 128)",
15120 ut_setup_security, ut_teardown,
15121 test_ipsec_proto_known_vec_inb, &pkt_aes_128_gcm),
15122 TEST_CASE_NAMED_WITH_DATA(
15123 "Inbound known vector (ESP tunnel mode IPv4 AES-GCM 192)",
15124 ut_setup_security, ut_teardown,
15125 test_ipsec_proto_known_vec_inb, &pkt_aes_192_gcm),
15126 TEST_CASE_NAMED_WITH_DATA(
15127 "Inbound known vector (ESP tunnel mode IPv4 AES-GCM 256)",
15128 ut_setup_security, ut_teardown,
15129 test_ipsec_proto_known_vec_inb, &pkt_aes_256_gcm),
15130 TEST_CASE_NAMED_WITH_DATA(
15131 "Inbound known vector (ESP tunnel mode IPv4 AES-CBC 128)",
15132 ut_setup_security, ut_teardown,
15133 test_ipsec_proto_known_vec_inb, &pkt_aes_128_cbc_null),
15134 TEST_CASE_NAMED_WITH_DATA(
15135 "Inbound known vector (ESP tunnel mode IPv4 AES-CBC 128 HMAC-SHA256 [16B ICV])",
15136 ut_setup_security, ut_teardown,
15137 test_ipsec_proto_known_vec_inb,
15138 &pkt_aes_128_cbc_hmac_sha256),
15139 TEST_CASE_NAMED_WITH_DATA(
15140 "Inbound known vector (ESP tunnel mode IPv4 AES-CBC 128 HMAC-SHA384 [24B ICV])",
15141 ut_setup_security, ut_teardown,
15142 test_ipsec_proto_known_vec_inb,
15143 &pkt_aes_128_cbc_hmac_sha384),
15144 TEST_CASE_NAMED_WITH_DATA(
15145 "Inbound known vector (ESP tunnel mode IPv4 AES-CBC 128 HMAC-SHA512 [32B ICV])",
15146 ut_setup_security, ut_teardown,
15147 test_ipsec_proto_known_vec_inb,
15148 &pkt_aes_128_cbc_hmac_sha512),
15149 TEST_CASE_NAMED_WITH_DATA(
15150 "Inbound known vector (ESP tunnel mode IPv6 AES-GCM 128)",
15151 ut_setup_security, ut_teardown,
15152 test_ipsec_proto_known_vec_inb, &pkt_aes_256_gcm_v6),
15153 TEST_CASE_NAMED_WITH_DATA(
15154 "Inbound known vector (ESP tunnel mode IPv6 AES-CBC 128 HMAC-SHA256 [16B ICV])",
15155 ut_setup_security, ut_teardown,
15156 test_ipsec_proto_known_vec_inb,
15157 &pkt_aes_128_cbc_hmac_sha256_v6),
15158 TEST_CASE_NAMED_WITH_DATA(
15159 "Inbound known vector (ESP tunnel mode IPv4 NULL AES-XCBC-MAC [12B ICV])",
15160 ut_setup_security, ut_teardown,
15161 test_ipsec_proto_known_vec_inb,
15162 &pkt_null_aes_xcbc),
15163 TEST_CASE_NAMED_WITH_DATA(
15164 "Inbound known vector (AH tunnel mode IPv4 HMAC-SHA256)",
15165 ut_setup_security, ut_teardown,
15166 test_ipsec_proto_known_vec_inb,
15167 &pkt_ah_tunnel_sha256),
15168 TEST_CASE_NAMED_WITH_DATA(
15169 "Inbound known vector (AH transport mode IPv4 HMAC-SHA256)",
15170 ut_setup_security, ut_teardown,
15171 test_ipsec_proto_known_vec_inb,
15172 &pkt_ah_transport_sha256),
15173 TEST_CASE_NAMED_WITH_DATA(
15174 "Inbound known vector (AH transport mode IPv4 AES-GMAC 128)",
15175 ut_setup_security, ut_teardown,
15176 test_ipsec_proto_known_vec_inb,
15177 &pkt_ah_ipv4_aes_gmac_128),
15178 TEST_CASE_NAMED_ST(
15179 "Combined test alg list",
15180 ut_setup_security, ut_teardown,
15181 test_ipsec_proto_display_list),
15182 TEST_CASE_NAMED_ST(
15183 "Combined test alg list (AH)",
15184 ut_setup_security, ut_teardown,
15185 test_ipsec_proto_ah_tunnel_ipv4),
15186 TEST_CASE_NAMED_ST(
15187 "IV generation",
15188 ut_setup_security, ut_teardown,
15189 test_ipsec_proto_iv_gen),
15190 TEST_CASE_NAMED_ST(
15191 "UDP encapsulation",
15192 ut_setup_security, ut_teardown,
15193 test_ipsec_proto_udp_encap),
15194 TEST_CASE_NAMED_ST(
15195 "UDP encapsulation ports verification test",
15196 ut_setup_security, ut_teardown,
15197 test_ipsec_proto_udp_ports_verify),
15198 TEST_CASE_NAMED_ST(
15199 "SA expiry packets soft",
15200 ut_setup_security, ut_teardown,
15201 test_ipsec_proto_sa_exp_pkts_soft),
15202 TEST_CASE_NAMED_ST(
15203 "SA expiry packets hard",
15204 ut_setup_security, ut_teardown,
15205 test_ipsec_proto_sa_exp_pkts_hard),
15206 TEST_CASE_NAMED_ST(
15207 "Negative test: ICV corruption",
15208 ut_setup_security, ut_teardown,
15209 test_ipsec_proto_err_icv_corrupt),
15210 TEST_CASE_NAMED_ST(
15211 "Tunnel dst addr verification",
15212 ut_setup_security, ut_teardown,
15213 test_ipsec_proto_tunnel_dst_addr_verify),
15214 TEST_CASE_NAMED_ST(
15215 "Tunnel src and dst addr verification",
15216 ut_setup_security, ut_teardown,
15217 test_ipsec_proto_tunnel_src_dst_addr_verify),
15218 TEST_CASE_NAMED_ST(
15219 "Inner IP checksum",
15220 ut_setup_security, ut_teardown,
15221 test_ipsec_proto_inner_ip_csum),
15222 TEST_CASE_NAMED_ST(
15223 "Inner L4 checksum",
15224 ut_setup_security, ut_teardown,
15225 test_ipsec_proto_inner_l4_csum),
15226 TEST_CASE_NAMED_ST(
15227 "Tunnel IPv4 in IPv4",
15228 ut_setup_security, ut_teardown,
15229 test_ipsec_proto_tunnel_v4_in_v4),
15230 TEST_CASE_NAMED_ST(
15231 "Tunnel IPv6 in IPv6",
15232 ut_setup_security, ut_teardown,
15233 test_ipsec_proto_tunnel_v6_in_v6),
15234 TEST_CASE_NAMED_ST(
15235 "Tunnel IPv4 in IPv6",
15236 ut_setup_security, ut_teardown,
15237 test_ipsec_proto_tunnel_v4_in_v6),
15238 TEST_CASE_NAMED_ST(
15239 "Tunnel IPv6 in IPv4",
15240 ut_setup_security, ut_teardown,
15241 test_ipsec_proto_tunnel_v6_in_v4),
15242 TEST_CASE_NAMED_ST(
15243 "Transport IPv4",
15244 ut_setup_security, ut_teardown,
15245 test_ipsec_proto_transport_v4),
15246 TEST_CASE_NAMED_ST(
15247 "AH transport IPv4",
15248 ut_setup_security, ut_teardown,
15249 test_ipsec_proto_ah_transport_ipv4),
15250 TEST_CASE_NAMED_ST(
15251 "Transport l4 checksum",
15252 ut_setup_security, ut_teardown,
15253 test_ipsec_proto_transport_l4_csum),
15254 TEST_CASE_NAMED_ST(
15255 "Statistics: success",
15256 ut_setup_security, ut_teardown,
15257 test_ipsec_proto_stats),
15258 TEST_CASE_NAMED_ST(
15259 "Fragmented packet",
15260 ut_setup_security, ut_teardown,
15261 test_ipsec_proto_pkt_fragment),
15262 TEST_CASE_NAMED_ST(
15263 "Tunnel header copy DF (inner 0)",
15264 ut_setup_security, ut_teardown,
15265 test_ipsec_proto_copy_df_inner_0),
15266 TEST_CASE_NAMED_ST(
15267 "Tunnel header copy DF (inner 1)",
15268 ut_setup_security, ut_teardown,
15269 test_ipsec_proto_copy_df_inner_1),
15270 TEST_CASE_NAMED_ST(
15271 "Tunnel header set DF 0 (inner 1)",
15272 ut_setup_security, ut_teardown,
15273 test_ipsec_proto_set_df_0_inner_1),
15274 TEST_CASE_NAMED_ST(
15275 "Tunnel header set DF 1 (inner 0)",
15276 ut_setup_security, ut_teardown,
15277 test_ipsec_proto_set_df_1_inner_0),
15278 TEST_CASE_NAMED_ST(
15279 "Tunnel header IPv4 copy DSCP (inner 0)",
15280 ut_setup_security, ut_teardown,
15281 test_ipsec_proto_ipv4_copy_dscp_inner_0),
15282 TEST_CASE_NAMED_ST(
15283 "Tunnel header IPv4 copy DSCP (inner 1)",
15284 ut_setup_security, ut_teardown,
15285 test_ipsec_proto_ipv4_copy_dscp_inner_1),
15286 TEST_CASE_NAMED_ST(
15287 "Tunnel header IPv4 set DSCP 0 (inner 1)",
15288 ut_setup_security, ut_teardown,
15289 test_ipsec_proto_ipv4_set_dscp_0_inner_1),
15290 TEST_CASE_NAMED_ST(
15291 "Tunnel header IPv4 set DSCP 1 (inner 0)",
15292 ut_setup_security, ut_teardown,
15293 test_ipsec_proto_ipv4_set_dscp_1_inner_0),
15294 TEST_CASE_NAMED_ST(
15295 "Tunnel header IPv6 copy DSCP (inner 0)",
15296 ut_setup_security, ut_teardown,
15297 test_ipsec_proto_ipv6_copy_dscp_inner_0),
15298 TEST_CASE_NAMED_ST(
15299 "Tunnel header IPv6 copy DSCP (inner 1)",
15300 ut_setup_security, ut_teardown,
15301 test_ipsec_proto_ipv6_copy_dscp_inner_1),
15302 TEST_CASE_NAMED_ST(
15303 "Tunnel header IPv6 set DSCP 0 (inner 1)",
15304 ut_setup_security, ut_teardown,
15305 test_ipsec_proto_ipv6_set_dscp_0_inner_1),
15306 TEST_CASE_NAMED_ST(
15307 "Tunnel header IPv6 set DSCP 1 (inner 0)",
15308 ut_setup_security, ut_teardown,
15309 test_ipsec_proto_ipv6_set_dscp_1_inner_0),
15310 TEST_CASE_NAMED_WITH_DATA(
15311 "Antireplay with window size 1024",
15312 ut_setup_security, ut_teardown,
15313 test_ipsec_proto_pkt_antireplay1024, &pkt_aes_128_gcm),
15314 TEST_CASE_NAMED_WITH_DATA(
15315 "Antireplay with window size 2048",
15316 ut_setup_security, ut_teardown,
15317 test_ipsec_proto_pkt_antireplay2048, &pkt_aes_128_gcm),
15318 TEST_CASE_NAMED_WITH_DATA(
15319 "Antireplay with window size 4096",
15320 ut_setup_security, ut_teardown,
15321 test_ipsec_proto_pkt_antireplay4096, &pkt_aes_128_gcm),
15322 TEST_CASE_NAMED_WITH_DATA(
15323 "ESN and Antireplay with window size 1024",
15324 ut_setup_security, ut_teardown,
15325 test_ipsec_proto_pkt_esn_antireplay1024,
15326 &pkt_aes_128_gcm),
15327 TEST_CASE_NAMED_WITH_DATA(
15328 "ESN and Antireplay with window size 2048",
15329 ut_setup_security, ut_teardown,
15330 test_ipsec_proto_pkt_esn_antireplay2048,
15331 &pkt_aes_128_gcm),
15332 TEST_CASE_NAMED_WITH_DATA(
15333 "ESN and Antireplay with window size 4096",
15334 ut_setup_security, ut_teardown,
15335 test_ipsec_proto_pkt_esn_antireplay4096,
15336 &pkt_aes_128_gcm),
15337 TEST_CASE_NAMED_ST(
15338 "Tunnel header IPv4 decrement inner TTL",
15339 ut_setup_security, ut_teardown,
15340 test_ipsec_proto_ipv4_ttl_decrement),
15341 TEST_CASE_NAMED_ST(
15342 "Tunnel header IPv6 decrement inner hop limit",
15343 ut_setup_security, ut_teardown,
15344 test_ipsec_proto_ipv6_hop_limit_decrement),
15345 TEST_CASES_END() /**< NULL terminate unit test array */
15346 }
15347 };
15348
15349 static struct unit_test_suite pdcp_proto_testsuite = {
15350 .suite_name = "PDCP Proto Unit Test Suite",
15351 .setup = pdcp_proto_testsuite_setup,
15352 .unit_test_cases = {
15353 TEST_CASE_ST(ut_setup_security, ut_teardown,
15354 test_PDCP_PROTO_all),
15355 TEST_CASES_END() /**< NULL terminate unit test array */
15356 }
15357 };
15358
15359 #define ADD_UPLINK_TESTCASE(data) \
15360 TEST_CASE_NAMED_WITH_DATA(data.test_descr_uplink, ut_setup_security, \
15361 ut_teardown, test_docsis_proto_uplink, (const void *) &data), \
15362
15363 #define ADD_DOWNLINK_TESTCASE(data) \
15364 TEST_CASE_NAMED_WITH_DATA(data.test_descr_downlink, ut_setup_security, \
15365 ut_teardown, test_docsis_proto_downlink, (const void *) &data), \
15366
15367 static struct unit_test_suite docsis_proto_testsuite = {
15368 .suite_name = "DOCSIS Proto Unit Test Suite",
15369 .setup = docsis_proto_testsuite_setup,
15370 .unit_test_cases = {
15371 /* Uplink */
15372 ADD_UPLINK_TESTCASE(docsis_test_case_1)
15373 ADD_UPLINK_TESTCASE(docsis_test_case_2)
15374 ADD_UPLINK_TESTCASE(docsis_test_case_3)
15375 ADD_UPLINK_TESTCASE(docsis_test_case_4)
15376 ADD_UPLINK_TESTCASE(docsis_test_case_5)
15377 ADD_UPLINK_TESTCASE(docsis_test_case_6)
15378 ADD_UPLINK_TESTCASE(docsis_test_case_7)
15379 ADD_UPLINK_TESTCASE(docsis_test_case_8)
15380 ADD_UPLINK_TESTCASE(docsis_test_case_9)
15381 ADD_UPLINK_TESTCASE(docsis_test_case_10)
15382 ADD_UPLINK_TESTCASE(docsis_test_case_11)
15383 ADD_UPLINK_TESTCASE(docsis_test_case_12)
15384 ADD_UPLINK_TESTCASE(docsis_test_case_13)
15385 ADD_UPLINK_TESTCASE(docsis_test_case_14)
15386 ADD_UPLINK_TESTCASE(docsis_test_case_15)
15387 ADD_UPLINK_TESTCASE(docsis_test_case_16)
15388 ADD_UPLINK_TESTCASE(docsis_test_case_17)
15389 ADD_UPLINK_TESTCASE(docsis_test_case_18)
15390 ADD_UPLINK_TESTCASE(docsis_test_case_19)
15391 ADD_UPLINK_TESTCASE(docsis_test_case_20)
15392 ADD_UPLINK_TESTCASE(docsis_test_case_21)
15393 ADD_UPLINK_TESTCASE(docsis_test_case_22)
15394 ADD_UPLINK_TESTCASE(docsis_test_case_23)
15395 ADD_UPLINK_TESTCASE(docsis_test_case_24)
15396 ADD_UPLINK_TESTCASE(docsis_test_case_25)
15397 ADD_UPLINK_TESTCASE(docsis_test_case_26)
15398 /* Downlink */
15399 ADD_DOWNLINK_TESTCASE(docsis_test_case_1)
15400 ADD_DOWNLINK_TESTCASE(docsis_test_case_2)
15401 ADD_DOWNLINK_TESTCASE(docsis_test_case_3)
15402 ADD_DOWNLINK_TESTCASE(docsis_test_case_4)
15403 ADD_DOWNLINK_TESTCASE(docsis_test_case_5)
15404 ADD_DOWNLINK_TESTCASE(docsis_test_case_6)
15405 ADD_DOWNLINK_TESTCASE(docsis_test_case_7)
15406 ADD_DOWNLINK_TESTCASE(docsis_test_case_8)
15407 ADD_DOWNLINK_TESTCASE(docsis_test_case_9)
15408 ADD_DOWNLINK_TESTCASE(docsis_test_case_10)
15409 ADD_DOWNLINK_TESTCASE(docsis_test_case_11)
15410 ADD_DOWNLINK_TESTCASE(docsis_test_case_12)
15411 ADD_DOWNLINK_TESTCASE(docsis_test_case_13)
15412 ADD_DOWNLINK_TESTCASE(docsis_test_case_14)
15413 ADD_DOWNLINK_TESTCASE(docsis_test_case_15)
15414 ADD_DOWNLINK_TESTCASE(docsis_test_case_16)
15415 ADD_DOWNLINK_TESTCASE(docsis_test_case_17)
15416 ADD_DOWNLINK_TESTCASE(docsis_test_case_18)
15417 ADD_DOWNLINK_TESTCASE(docsis_test_case_19)
15418 ADD_DOWNLINK_TESTCASE(docsis_test_case_20)
15419 ADD_DOWNLINK_TESTCASE(docsis_test_case_21)
15420 ADD_DOWNLINK_TESTCASE(docsis_test_case_22)
15421 ADD_DOWNLINK_TESTCASE(docsis_test_case_23)
15422 ADD_DOWNLINK_TESTCASE(docsis_test_case_24)
15423 ADD_DOWNLINK_TESTCASE(docsis_test_case_25)
15424 ADD_DOWNLINK_TESTCASE(docsis_test_case_26)
15425 TEST_CASES_END() /**< NULL terminate unit test array */
15426 }
15427 };
15428 #endif
15429
15430 static struct unit_test_suite cryptodev_gen_testsuite = {
15431 .suite_name = "Crypto General Unit Test Suite",
15432 .setup = crypto_gen_testsuite_setup,
15433 .unit_test_cases = {
15434 TEST_CASE_ST(ut_setup, ut_teardown,
15435 test_device_configure_invalid_dev_id),
15436 TEST_CASE_ST(ut_setup, ut_teardown,
15437 test_queue_pair_descriptor_setup),
15438 TEST_CASE_ST(ut_setup, ut_teardown,
15439 test_device_configure_invalid_queue_pair_ids),
15440 TEST_CASE_ST(ut_setup, ut_teardown, test_stats),
15441 TEST_CASE_ST(ut_setup, ut_teardown, test_enq_callback_setup),
15442 TEST_CASE_ST(ut_setup, ut_teardown, test_deq_callback_setup),
15443 TEST_CASES_END() /**< NULL terminate unit test array */
15444 }
15445 };
15446
15447 static struct unit_test_suite cryptodev_negative_hmac_sha1_testsuite = {
15448 .suite_name = "Negative HMAC SHA1 Unit Test Suite",
15449 .setup = negative_hmac_sha1_testsuite_setup,
15450 .unit_test_cases = {
15451 /** Negative tests */
15452 TEST_CASE_ST(ut_setup, ut_teardown,
15453 authentication_verify_HMAC_SHA1_fail_data_corrupt),
15454 TEST_CASE_ST(ut_setup, ut_teardown,
15455 authentication_verify_HMAC_SHA1_fail_tag_corrupt),
15456 TEST_CASE_ST(ut_setup, ut_teardown,
15457 auth_decryption_AES128CBC_HMAC_SHA1_fail_data_corrupt),
15458 TEST_CASE_ST(ut_setup, ut_teardown,
15459 auth_decryption_AES128CBC_HMAC_SHA1_fail_tag_corrupt),
15460
15461 TEST_CASES_END() /**< NULL terminate unit test array */
15462 }
15463 };
15464
15465 static struct unit_test_suite cryptodev_multi_session_testsuite = {
15466 .suite_name = "Multi Session Unit Test Suite",
15467 .setup = multi_session_testsuite_setup,
15468 .unit_test_cases = {
15469 TEST_CASE_ST(ut_setup, ut_teardown, test_multi_session),
15470 TEST_CASE_ST(ut_setup, ut_teardown,
15471 test_multi_session_random_usage),
15472
15473 TEST_CASES_END() /**< NULL terminate unit test array */
15474 }
15475 };
15476
15477 static struct unit_test_suite cryptodev_null_testsuite = {
15478 .suite_name = "NULL Test Suite",
15479 .setup = null_testsuite_setup,
15480 .unit_test_cases = {
15481 TEST_CASE_ST(ut_setup, ut_teardown,
15482 test_null_invalid_operation),
15483 TEST_CASE_ST(ut_setup, ut_teardown, test_null_burst_operation),
15484 TEST_CASES_END()
15485 }
15486 };
15487
15488 static struct unit_test_suite cryptodev_aes_ccm_auth_testsuite = {
15489 .suite_name = "AES CCM Authenticated Test Suite",
15490 .setup = aes_ccm_auth_testsuite_setup,
15491 .unit_test_cases = {
15492 /** AES CCM Authenticated Encryption 128 bits key*/
15493 TEST_CASE_ST(ut_setup, ut_teardown,
15494 test_AES_CCM_authenticated_encryption_test_case_128_1),
15495 TEST_CASE_ST(ut_setup, ut_teardown,
15496 test_AES_CCM_authenticated_encryption_test_case_128_2),
15497 TEST_CASE_ST(ut_setup, ut_teardown,
15498 test_AES_CCM_authenticated_encryption_test_case_128_3),
15499
15500 /** AES CCM Authenticated Decryption 128 bits key*/
15501 TEST_CASE_ST(ut_setup, ut_teardown,
15502 test_AES_CCM_authenticated_decryption_test_case_128_1),
15503 TEST_CASE_ST(ut_setup, ut_teardown,
15504 test_AES_CCM_authenticated_decryption_test_case_128_2),
15505 TEST_CASE_ST(ut_setup, ut_teardown,
15506 test_AES_CCM_authenticated_decryption_test_case_128_3),
15507
15508 /** AES CCM Authenticated Encryption 192 bits key */
15509 TEST_CASE_ST(ut_setup, ut_teardown,
15510 test_AES_CCM_authenticated_encryption_test_case_192_1),
15511 TEST_CASE_ST(ut_setup, ut_teardown,
15512 test_AES_CCM_authenticated_encryption_test_case_192_2),
15513 TEST_CASE_ST(ut_setup, ut_teardown,
15514 test_AES_CCM_authenticated_encryption_test_case_192_3),
15515
15516 /** AES CCM Authenticated Decryption 192 bits key*/
15517 TEST_CASE_ST(ut_setup, ut_teardown,
15518 test_AES_CCM_authenticated_decryption_test_case_192_1),
15519 TEST_CASE_ST(ut_setup, ut_teardown,
15520 test_AES_CCM_authenticated_decryption_test_case_192_2),
15521 TEST_CASE_ST(ut_setup, ut_teardown,
15522 test_AES_CCM_authenticated_decryption_test_case_192_3),
15523
15524 /** AES CCM Authenticated Encryption 256 bits key */
15525 TEST_CASE_ST(ut_setup, ut_teardown,
15526 test_AES_CCM_authenticated_encryption_test_case_256_1),
15527 TEST_CASE_ST(ut_setup, ut_teardown,
15528 test_AES_CCM_authenticated_encryption_test_case_256_2),
15529 TEST_CASE_ST(ut_setup, ut_teardown,
15530 test_AES_CCM_authenticated_encryption_test_case_256_3),
15531
15532 /** AES CCM Authenticated Decryption 256 bits key*/
15533 TEST_CASE_ST(ut_setup, ut_teardown,
15534 test_AES_CCM_authenticated_decryption_test_case_256_1),
15535 TEST_CASE_ST(ut_setup, ut_teardown,
15536 test_AES_CCM_authenticated_decryption_test_case_256_2),
15537 TEST_CASE_ST(ut_setup, ut_teardown,
15538 test_AES_CCM_authenticated_decryption_test_case_256_3),
15539 TEST_CASES_END()
15540 }
15541 };
15542
15543 static struct unit_test_suite cryptodev_aes_gcm_auth_testsuite = {
15544 .suite_name = "AES GCM Authenticated Test Suite",
15545 .setup = aes_gcm_auth_testsuite_setup,
15546 .unit_test_cases = {
15547 /** AES GCM Authenticated Encryption */
15548 TEST_CASE_ST(ut_setup, ut_teardown,
15549 test_AES_GCM_auth_encrypt_SGL_in_place_1500B),
15550 TEST_CASE_ST(ut_setup, ut_teardown,
15551 test_AES_GCM_auth_encrypt_SGL_out_of_place_400B_400B),
15552 TEST_CASE_ST(ut_setup, ut_teardown,
15553 test_AES_GCM_auth_encrypt_SGL_out_of_place_1500B_2000B),
15554 TEST_CASE_ST(ut_setup, ut_teardown,
15555 test_AES_GCM_auth_encrypt_SGL_out_of_place_400B_1seg),
15556 TEST_CASE_ST(ut_setup, ut_teardown,
15557 test_AES_GCM_authenticated_encryption_test_case_1),
15558 TEST_CASE_ST(ut_setup, ut_teardown,
15559 test_AES_GCM_authenticated_encryption_test_case_2),
15560 TEST_CASE_ST(ut_setup, ut_teardown,
15561 test_AES_GCM_authenticated_encryption_test_case_3),
15562 TEST_CASE_ST(ut_setup, ut_teardown,
15563 test_AES_GCM_authenticated_encryption_test_case_4),
15564 TEST_CASE_ST(ut_setup, ut_teardown,
15565 test_AES_GCM_authenticated_encryption_test_case_5),
15566 TEST_CASE_ST(ut_setup, ut_teardown,
15567 test_AES_GCM_authenticated_encryption_test_case_6),
15568 TEST_CASE_ST(ut_setup, ut_teardown,
15569 test_AES_GCM_authenticated_encryption_test_case_7),
15570 TEST_CASE_ST(ut_setup, ut_teardown,
15571 test_AES_GCM_authenticated_encryption_test_case_8),
15572 TEST_CASE_ST(ut_setup, ut_teardown,
15573 test_AES_GCM_J0_authenticated_encryption_test_case_1),
15574
15575 /** AES GCM Authenticated Decryption */
15576 TEST_CASE_ST(ut_setup, ut_teardown,
15577 test_AES_GCM_authenticated_decryption_test_case_1),
15578 TEST_CASE_ST(ut_setup, ut_teardown,
15579 test_AES_GCM_authenticated_decryption_test_case_2),
15580 TEST_CASE_ST(ut_setup, ut_teardown,
15581 test_AES_GCM_authenticated_decryption_test_case_3),
15582 TEST_CASE_ST(ut_setup, ut_teardown,
15583 test_AES_GCM_authenticated_decryption_test_case_4),
15584 TEST_CASE_ST(ut_setup, ut_teardown,
15585 test_AES_GCM_authenticated_decryption_test_case_5),
15586 TEST_CASE_ST(ut_setup, ut_teardown,
15587 test_AES_GCM_authenticated_decryption_test_case_6),
15588 TEST_CASE_ST(ut_setup, ut_teardown,
15589 test_AES_GCM_authenticated_decryption_test_case_7),
15590 TEST_CASE_ST(ut_setup, ut_teardown,
15591 test_AES_GCM_authenticated_decryption_test_case_8),
15592 TEST_CASE_ST(ut_setup, ut_teardown,
15593 test_AES_GCM_J0_authenticated_decryption_test_case_1),
15594
15595 /** AES GCM Authenticated Encryption 192 bits key */
15596 TEST_CASE_ST(ut_setup, ut_teardown,
15597 test_AES_GCM_auth_encryption_test_case_192_1),
15598 TEST_CASE_ST(ut_setup, ut_teardown,
15599 test_AES_GCM_auth_encryption_test_case_192_2),
15600 TEST_CASE_ST(ut_setup, ut_teardown,
15601 test_AES_GCM_auth_encryption_test_case_192_3),
15602 TEST_CASE_ST(ut_setup, ut_teardown,
15603 test_AES_GCM_auth_encryption_test_case_192_4),
15604 TEST_CASE_ST(ut_setup, ut_teardown,
15605 test_AES_GCM_auth_encryption_test_case_192_5),
15606 TEST_CASE_ST(ut_setup, ut_teardown,
15607 test_AES_GCM_auth_encryption_test_case_192_6),
15608 TEST_CASE_ST(ut_setup, ut_teardown,
15609 test_AES_GCM_auth_encryption_test_case_192_7),
15610
15611 /** AES GCM Authenticated Decryption 192 bits key */
15612 TEST_CASE_ST(ut_setup, ut_teardown,
15613 test_AES_GCM_auth_decryption_test_case_192_1),
15614 TEST_CASE_ST(ut_setup, ut_teardown,
15615 test_AES_GCM_auth_decryption_test_case_192_2),
15616 TEST_CASE_ST(ut_setup, ut_teardown,
15617 test_AES_GCM_auth_decryption_test_case_192_3),
15618 TEST_CASE_ST(ut_setup, ut_teardown,
15619 test_AES_GCM_auth_decryption_test_case_192_4),
15620 TEST_CASE_ST(ut_setup, ut_teardown,
15621 test_AES_GCM_auth_decryption_test_case_192_5),
15622 TEST_CASE_ST(ut_setup, ut_teardown,
15623 test_AES_GCM_auth_decryption_test_case_192_6),
15624 TEST_CASE_ST(ut_setup, ut_teardown,
15625 test_AES_GCM_auth_decryption_test_case_192_7),
15626
15627 /** AES GCM Authenticated Encryption 256 bits key */
15628 TEST_CASE_ST(ut_setup, ut_teardown,
15629 test_AES_GCM_auth_encryption_test_case_256_1),
15630 TEST_CASE_ST(ut_setup, ut_teardown,
15631 test_AES_GCM_auth_encryption_test_case_256_2),
15632 TEST_CASE_ST(ut_setup, ut_teardown,
15633 test_AES_GCM_auth_encryption_test_case_256_3),
15634 TEST_CASE_ST(ut_setup, ut_teardown,
15635 test_AES_GCM_auth_encryption_test_case_256_4),
15636 TEST_CASE_ST(ut_setup, ut_teardown,
15637 test_AES_GCM_auth_encryption_test_case_256_5),
15638 TEST_CASE_ST(ut_setup, ut_teardown,
15639 test_AES_GCM_auth_encryption_test_case_256_6),
15640 TEST_CASE_ST(ut_setup, ut_teardown,
15641 test_AES_GCM_auth_encryption_test_case_256_7),
15642
15643 /** AES GCM Authenticated Decryption 256 bits key */
15644 TEST_CASE_ST(ut_setup, ut_teardown,
15645 test_AES_GCM_auth_decryption_test_case_256_1),
15646 TEST_CASE_ST(ut_setup, ut_teardown,
15647 test_AES_GCM_auth_decryption_test_case_256_2),
15648 TEST_CASE_ST(ut_setup, ut_teardown,
15649 test_AES_GCM_auth_decryption_test_case_256_3),
15650 TEST_CASE_ST(ut_setup, ut_teardown,
15651 test_AES_GCM_auth_decryption_test_case_256_4),
15652 TEST_CASE_ST(ut_setup, ut_teardown,
15653 test_AES_GCM_auth_decryption_test_case_256_5),
15654 TEST_CASE_ST(ut_setup, ut_teardown,
15655 test_AES_GCM_auth_decryption_test_case_256_6),
15656 TEST_CASE_ST(ut_setup, ut_teardown,
15657 test_AES_GCM_auth_decryption_test_case_256_7),
15658
15659 /** AES GCM Authenticated Encryption big aad size */
15660 TEST_CASE_ST(ut_setup, ut_teardown,
15661 test_AES_GCM_auth_encryption_test_case_aad_1),
15662 TEST_CASE_ST(ut_setup, ut_teardown,
15663 test_AES_GCM_auth_encryption_test_case_aad_2),
15664
15665 /** AES GCM Authenticated Decryption big aad size */
15666 TEST_CASE_ST(ut_setup, ut_teardown,
15667 test_AES_GCM_auth_decryption_test_case_aad_1),
15668 TEST_CASE_ST(ut_setup, ut_teardown,
15669 test_AES_GCM_auth_decryption_test_case_aad_2),
15670
15671 /** Out of place tests */
15672 TEST_CASE_ST(ut_setup, ut_teardown,
15673 test_AES_GCM_authenticated_encryption_oop_test_case_1),
15674 TEST_CASE_ST(ut_setup, ut_teardown,
15675 test_AES_GCM_authenticated_decryption_oop_test_case_1),
15676
15677 /** Session-less tests */
15678 TEST_CASE_ST(ut_setup, ut_teardown,
15679 test_AES_GCM_authenticated_encryption_sessionless_test_case_1),
15680 TEST_CASE_ST(ut_setup, ut_teardown,
15681 test_AES_GCM_authenticated_decryption_sessionless_test_case_1),
15682
15683 TEST_CASES_END()
15684 }
15685 };
15686
15687 static struct unit_test_suite cryptodev_aes_gmac_auth_testsuite = {
15688 .suite_name = "AES GMAC Authentication Test Suite",
15689 .setup = aes_gmac_auth_testsuite_setup,
15690 .unit_test_cases = {
15691 TEST_CASE_ST(ut_setup, ut_teardown,
15692 test_AES_GMAC_authentication_test_case_1),
15693 TEST_CASE_ST(ut_setup, ut_teardown,
15694 test_AES_GMAC_authentication_verify_test_case_1),
15695 TEST_CASE_ST(ut_setup, ut_teardown,
15696 test_AES_GMAC_authentication_test_case_2),
15697 TEST_CASE_ST(ut_setup, ut_teardown,
15698 test_AES_GMAC_authentication_verify_test_case_2),
15699 TEST_CASE_ST(ut_setup, ut_teardown,
15700 test_AES_GMAC_authentication_test_case_3),
15701 TEST_CASE_ST(ut_setup, ut_teardown,
15702 test_AES_GMAC_authentication_verify_test_case_3),
15703 TEST_CASE_ST(ut_setup, ut_teardown,
15704 test_AES_GMAC_authentication_test_case_4),
15705 TEST_CASE_ST(ut_setup, ut_teardown,
15706 test_AES_GMAC_authentication_verify_test_case_4),
15707 TEST_CASE_ST(ut_setup, ut_teardown,
15708 test_AES_GMAC_authentication_SGL_40B),
15709 TEST_CASE_ST(ut_setup, ut_teardown,
15710 test_AES_GMAC_authentication_SGL_80B),
15711 TEST_CASE_ST(ut_setup, ut_teardown,
15712 test_AES_GMAC_authentication_SGL_2048B),
15713 TEST_CASE_ST(ut_setup, ut_teardown,
15714 test_AES_GMAC_authentication_SGL_2047B),
15715
15716 TEST_CASES_END()
15717 }
15718 };
15719
15720 static struct unit_test_suite cryptodev_chacha20_poly1305_testsuite = {
15721 .suite_name = "Chacha20-Poly1305 Test Suite",
15722 .setup = chacha20_poly1305_testsuite_setup,
15723 .unit_test_cases = {
15724 TEST_CASE_ST(ut_setup, ut_teardown,
15725 test_chacha20_poly1305_encrypt_test_case_rfc8439),
15726 TEST_CASE_ST(ut_setup, ut_teardown,
15727 test_chacha20_poly1305_decrypt_test_case_rfc8439),
15728 TEST_CASE_ST(ut_setup, ut_teardown,
15729 test_chacha20_poly1305_encrypt_SGL_out_of_place),
15730 TEST_CASES_END()
15731 }
15732 };
15733
15734 static struct unit_test_suite cryptodev_snow3g_testsuite = {
15735 .suite_name = "SNOW 3G Test Suite",
15736 .setup = snow3g_testsuite_setup,
15737 .unit_test_cases = {
15738 /** SNOW 3G encrypt only (UEA2) */
15739 TEST_CASE_ST(ut_setup, ut_teardown,
15740 test_snow3g_encryption_test_case_1),
15741 TEST_CASE_ST(ut_setup, ut_teardown,
15742 test_snow3g_encryption_test_case_2),
15743 TEST_CASE_ST(ut_setup, ut_teardown,
15744 test_snow3g_encryption_test_case_3),
15745 TEST_CASE_ST(ut_setup, ut_teardown,
15746 test_snow3g_encryption_test_case_4),
15747 TEST_CASE_ST(ut_setup, ut_teardown,
15748 test_snow3g_encryption_test_case_5),
15749
15750 TEST_CASE_ST(ut_setup, ut_teardown,
15751 test_snow3g_encryption_test_case_1_oop),
15752 TEST_CASE_ST(ut_setup, ut_teardown,
15753 test_snow3g_encryption_test_case_1_oop_sgl),
15754 TEST_CASE_ST(ut_setup, ut_teardown,
15755 test_snow3g_encryption_test_case_1_offset_oop),
15756 TEST_CASE_ST(ut_setup, ut_teardown,
15757 test_snow3g_decryption_test_case_1_oop),
15758
15759 /** SNOW 3G generate auth, then encrypt (UEA2) */
15760 TEST_CASE_ST(ut_setup, ut_teardown,
15761 test_snow3g_auth_cipher_test_case_1),
15762 TEST_CASE_ST(ut_setup, ut_teardown,
15763 test_snow3g_auth_cipher_test_case_2),
15764 TEST_CASE_ST(ut_setup, ut_teardown,
15765 test_snow3g_auth_cipher_test_case_2_oop),
15766 TEST_CASE_ST(ut_setup, ut_teardown,
15767 test_snow3g_auth_cipher_part_digest_enc),
15768 TEST_CASE_ST(ut_setup, ut_teardown,
15769 test_snow3g_auth_cipher_part_digest_enc_oop),
15770 TEST_CASE_ST(ut_setup, ut_teardown,
15771 test_snow3g_auth_cipher_test_case_3_sgl),
15772 TEST_CASE_ST(ut_setup, ut_teardown,
15773 test_snow3g_auth_cipher_test_case_3_oop_sgl),
15774 TEST_CASE_ST(ut_setup, ut_teardown,
15775 test_snow3g_auth_cipher_part_digest_enc_sgl),
15776 TEST_CASE_ST(ut_setup, ut_teardown,
15777 test_snow3g_auth_cipher_part_digest_enc_oop_sgl),
15778
15779 /** SNOW 3G decrypt (UEA2), then verify auth */
15780 TEST_CASE_ST(ut_setup, ut_teardown,
15781 test_snow3g_auth_cipher_verify_test_case_1),
15782 TEST_CASE_ST(ut_setup, ut_teardown,
15783 test_snow3g_auth_cipher_verify_test_case_2),
15784 TEST_CASE_ST(ut_setup, ut_teardown,
15785 test_snow3g_auth_cipher_verify_test_case_2_oop),
15786 TEST_CASE_ST(ut_setup, ut_teardown,
15787 test_snow3g_auth_cipher_verify_part_digest_enc),
15788 TEST_CASE_ST(ut_setup, ut_teardown,
15789 test_snow3g_auth_cipher_verify_part_digest_enc_oop),
15790 TEST_CASE_ST(ut_setup, ut_teardown,
15791 test_snow3g_auth_cipher_verify_test_case_3_sgl),
15792 TEST_CASE_ST(ut_setup, ut_teardown,
15793 test_snow3g_auth_cipher_verify_test_case_3_oop_sgl),
15794 TEST_CASE_ST(ut_setup, ut_teardown,
15795 test_snow3g_auth_cipher_verify_part_digest_enc_sgl),
15796 TEST_CASE_ST(ut_setup, ut_teardown,
15797 test_snow3g_auth_cipher_verify_part_digest_enc_oop_sgl),
15798
15799 /** SNOW 3G decrypt only (UEA2) */
15800 TEST_CASE_ST(ut_setup, ut_teardown,
15801 test_snow3g_decryption_test_case_1),
15802 TEST_CASE_ST(ut_setup, ut_teardown,
15803 test_snow3g_decryption_test_case_2),
15804 TEST_CASE_ST(ut_setup, ut_teardown,
15805 test_snow3g_decryption_test_case_3),
15806 TEST_CASE_ST(ut_setup, ut_teardown,
15807 test_snow3g_decryption_test_case_4),
15808 TEST_CASE_ST(ut_setup, ut_teardown,
15809 test_snow3g_decryption_test_case_5),
15810 TEST_CASE_ST(ut_setup, ut_teardown,
15811 test_snow3g_decryption_with_digest_test_case_1),
15812 TEST_CASE_ST(ut_setup, ut_teardown,
15813 test_snow3g_hash_generate_test_case_1),
15814 TEST_CASE_ST(ut_setup, ut_teardown,
15815 test_snow3g_hash_generate_test_case_2),
15816 TEST_CASE_ST(ut_setup, ut_teardown,
15817 test_snow3g_hash_generate_test_case_3),
15818
15819 /* Tests with buffers which length is not byte-aligned */
15820 TEST_CASE_ST(ut_setup, ut_teardown,
15821 test_snow3g_hash_generate_test_case_4),
15822 TEST_CASE_ST(ut_setup, ut_teardown,
15823 test_snow3g_hash_generate_test_case_5),
15824 TEST_CASE_ST(ut_setup, ut_teardown,
15825 test_snow3g_hash_generate_test_case_6),
15826 TEST_CASE_ST(ut_setup, ut_teardown,
15827 test_snow3g_hash_verify_test_case_1),
15828 TEST_CASE_ST(ut_setup, ut_teardown,
15829 test_snow3g_hash_verify_test_case_2),
15830 TEST_CASE_ST(ut_setup, ut_teardown,
15831 test_snow3g_hash_verify_test_case_3),
15832
15833 /* Tests with buffers which length is not byte-aligned */
15834 TEST_CASE_ST(ut_setup, ut_teardown,
15835 test_snow3g_hash_verify_test_case_4),
15836 TEST_CASE_ST(ut_setup, ut_teardown,
15837 test_snow3g_hash_verify_test_case_5),
15838 TEST_CASE_ST(ut_setup, ut_teardown,
15839 test_snow3g_hash_verify_test_case_6),
15840 TEST_CASE_ST(ut_setup, ut_teardown,
15841 test_snow3g_cipher_auth_test_case_1),
15842 TEST_CASE_ST(ut_setup, ut_teardown,
15843 test_snow3g_auth_cipher_with_digest_test_case_1),
15844 TEST_CASES_END()
15845 }
15846 };
15847
15848 static struct unit_test_suite cryptodev_zuc_testsuite = {
15849 .suite_name = "ZUC Test Suite",
15850 .setup = zuc_testsuite_setup,
15851 .unit_test_cases = {
15852 /** ZUC encrypt only (EEA3) */
15853 TEST_CASE_ST(ut_setup, ut_teardown,
15854 test_zuc_encryption_test_case_1),
15855 TEST_CASE_ST(ut_setup, ut_teardown,
15856 test_zuc_encryption_test_case_2),
15857 TEST_CASE_ST(ut_setup, ut_teardown,
15858 test_zuc_encryption_test_case_3),
15859 TEST_CASE_ST(ut_setup, ut_teardown,
15860 test_zuc_encryption_test_case_4),
15861 TEST_CASE_ST(ut_setup, ut_teardown,
15862 test_zuc_encryption_test_case_5),
15863 TEST_CASE_ST(ut_setup, ut_teardown,
15864 test_zuc_encryption_test_case_6_sgl),
15865
15866 /** ZUC authenticate (EIA3) */
15867 TEST_CASE_ST(ut_setup, ut_teardown,
15868 test_zuc_hash_generate_test_case_1),
15869 TEST_CASE_ST(ut_setup, ut_teardown,
15870 test_zuc_hash_generate_test_case_2),
15871 TEST_CASE_ST(ut_setup, ut_teardown,
15872 test_zuc_hash_generate_test_case_3),
15873 TEST_CASE_ST(ut_setup, ut_teardown,
15874 test_zuc_hash_generate_test_case_4),
15875 TEST_CASE_ST(ut_setup, ut_teardown,
15876 test_zuc_hash_generate_test_case_5),
15877 TEST_CASE_ST(ut_setup, ut_teardown,
15878 test_zuc_hash_generate_test_case_6),
15879 TEST_CASE_ST(ut_setup, ut_teardown,
15880 test_zuc_hash_generate_test_case_7),
15881 TEST_CASE_ST(ut_setup, ut_teardown,
15882 test_zuc_hash_generate_test_case_8),
15883 TEST_CASE_ST(ut_setup, ut_teardown,
15884 test_zuc_hash_generate_test_case_9),
15885 TEST_CASE_ST(ut_setup, ut_teardown,
15886 test_zuc_hash_generate_test_case_10),
15887 TEST_CASE_ST(ut_setup, ut_teardown,
15888 test_zuc_hash_generate_test_case_11),
15889
15890
15891 /** ZUC alg-chain (EEA3/EIA3) */
15892 TEST_CASE_ST(ut_setup, ut_teardown,
15893 test_zuc_cipher_auth_test_case_1),
15894 TEST_CASE_ST(ut_setup, ut_teardown,
15895 test_zuc_cipher_auth_test_case_2),
15896
15897 /** ZUC generate auth, then encrypt (EEA3) */
15898 TEST_CASE_ST(ut_setup, ut_teardown,
15899 test_zuc_auth_cipher_test_case_1),
15900 TEST_CASE_ST(ut_setup, ut_teardown,
15901 test_zuc_auth_cipher_test_case_1_oop),
15902 TEST_CASE_ST(ut_setup, ut_teardown,
15903 test_zuc_auth_cipher_test_case_1_sgl),
15904 TEST_CASE_ST(ut_setup, ut_teardown,
15905 test_zuc_auth_cipher_test_case_1_oop_sgl),
15906
15907 /** ZUC decrypt (EEA3), then verify auth */
15908 TEST_CASE_ST(ut_setup, ut_teardown,
15909 test_zuc_auth_cipher_verify_test_case_1),
15910 TEST_CASE_ST(ut_setup, ut_teardown,
15911 test_zuc_auth_cipher_verify_test_case_1_oop),
15912 TEST_CASE_ST(ut_setup, ut_teardown,
15913 test_zuc_auth_cipher_verify_test_case_1_sgl),
15914 TEST_CASE_ST(ut_setup, ut_teardown,
15915 test_zuc_auth_cipher_verify_test_case_1_oop_sgl),
15916
15917 /** ZUC-256 encrypt only **/
15918 TEST_CASE_ST(ut_setup, ut_teardown,
15919 test_zuc256_encryption_test_case_1),
15920 TEST_CASE_ST(ut_setup, ut_teardown,
15921 test_zuc256_encryption_test_case_2),
15922
15923 /** ZUC-256 authentication only **/
15924 TEST_CASE_ST(ut_setup, ut_teardown,
15925 test_zuc256_authentication_test_case_1),
15926 TEST_CASE_ST(ut_setup, ut_teardown,
15927 test_zuc256_authentication_test_case_2),
15928
15929 TEST_CASES_END()
15930 }
15931 };
15932
15933 static struct unit_test_suite cryptodev_hmac_md5_auth_testsuite = {
15934 .suite_name = "HMAC_MD5 Authentication Test Suite",
15935 .setup = hmac_md5_auth_testsuite_setup,
15936 .unit_test_cases = {
15937 TEST_CASE_ST(ut_setup, ut_teardown,
15938 test_MD5_HMAC_generate_case_1),
15939 TEST_CASE_ST(ut_setup, ut_teardown,
15940 test_MD5_HMAC_verify_case_1),
15941 TEST_CASE_ST(ut_setup, ut_teardown,
15942 test_MD5_HMAC_generate_case_2),
15943 TEST_CASE_ST(ut_setup, ut_teardown,
15944 test_MD5_HMAC_verify_case_2),
15945 TEST_CASES_END()
15946 }
15947 };
15948
15949 static struct unit_test_suite cryptodev_kasumi_testsuite = {
15950 .suite_name = "Kasumi Test Suite",
15951 .setup = kasumi_testsuite_setup,
15952 .unit_test_cases = {
15953 /** KASUMI hash only (UIA1) */
15954 TEST_CASE_ST(ut_setup, ut_teardown,
15955 test_kasumi_hash_generate_test_case_1),
15956 TEST_CASE_ST(ut_setup, ut_teardown,
15957 test_kasumi_hash_generate_test_case_2),
15958 TEST_CASE_ST(ut_setup, ut_teardown,
15959 test_kasumi_hash_generate_test_case_3),
15960 TEST_CASE_ST(ut_setup, ut_teardown,
15961 test_kasumi_hash_generate_test_case_4),
15962 TEST_CASE_ST(ut_setup, ut_teardown,
15963 test_kasumi_hash_generate_test_case_5),
15964 TEST_CASE_ST(ut_setup, ut_teardown,
15965 test_kasumi_hash_generate_test_case_6),
15966
15967 TEST_CASE_ST(ut_setup, ut_teardown,
15968 test_kasumi_hash_verify_test_case_1),
15969 TEST_CASE_ST(ut_setup, ut_teardown,
15970 test_kasumi_hash_verify_test_case_2),
15971 TEST_CASE_ST(ut_setup, ut_teardown,
15972 test_kasumi_hash_verify_test_case_3),
15973 TEST_CASE_ST(ut_setup, ut_teardown,
15974 test_kasumi_hash_verify_test_case_4),
15975 TEST_CASE_ST(ut_setup, ut_teardown,
15976 test_kasumi_hash_verify_test_case_5),
15977
15978 /** KASUMI encrypt only (UEA1) */
15979 TEST_CASE_ST(ut_setup, ut_teardown,
15980 test_kasumi_encryption_test_case_1),
15981 TEST_CASE_ST(ut_setup, ut_teardown,
15982 test_kasumi_encryption_test_case_1_sgl),
15983 TEST_CASE_ST(ut_setup, ut_teardown,
15984 test_kasumi_encryption_test_case_1_oop),
15985 TEST_CASE_ST(ut_setup, ut_teardown,
15986 test_kasumi_encryption_test_case_1_oop_sgl),
15987 TEST_CASE_ST(ut_setup, ut_teardown,
15988 test_kasumi_encryption_test_case_2),
15989 TEST_CASE_ST(ut_setup, ut_teardown,
15990 test_kasumi_encryption_test_case_3),
15991 TEST_CASE_ST(ut_setup, ut_teardown,
15992 test_kasumi_encryption_test_case_4),
15993 TEST_CASE_ST(ut_setup, ut_teardown,
15994 test_kasumi_encryption_test_case_5),
15995
15996 /** KASUMI decrypt only (UEA1) */
15997 TEST_CASE_ST(ut_setup, ut_teardown,
15998 test_kasumi_decryption_test_case_1),
15999 TEST_CASE_ST(ut_setup, ut_teardown,
16000 test_kasumi_decryption_test_case_2),
16001 TEST_CASE_ST(ut_setup, ut_teardown,
16002 test_kasumi_decryption_test_case_3),
16003 TEST_CASE_ST(ut_setup, ut_teardown,
16004 test_kasumi_decryption_test_case_4),
16005 TEST_CASE_ST(ut_setup, ut_teardown,
16006 test_kasumi_decryption_test_case_5),
16007 TEST_CASE_ST(ut_setup, ut_teardown,
16008 test_kasumi_decryption_test_case_1_oop),
16009 TEST_CASE_ST(ut_setup, ut_teardown,
16010 test_kasumi_cipher_auth_test_case_1),
16011
16012 /** KASUMI generate auth, then encrypt (F8) */
16013 TEST_CASE_ST(ut_setup, ut_teardown,
16014 test_kasumi_auth_cipher_test_case_1),
16015 TEST_CASE_ST(ut_setup, ut_teardown,
16016 test_kasumi_auth_cipher_test_case_2),
16017 TEST_CASE_ST(ut_setup, ut_teardown,
16018 test_kasumi_auth_cipher_test_case_2_oop),
16019 TEST_CASE_ST(ut_setup, ut_teardown,
16020 test_kasumi_auth_cipher_test_case_2_sgl),
16021 TEST_CASE_ST(ut_setup, ut_teardown,
16022 test_kasumi_auth_cipher_test_case_2_oop_sgl),
16023
16024 /** KASUMI decrypt (F8), then verify auth */
16025 TEST_CASE_ST(ut_setup, ut_teardown,
16026 test_kasumi_auth_cipher_verify_test_case_1),
16027 TEST_CASE_ST(ut_setup, ut_teardown,
16028 test_kasumi_auth_cipher_verify_test_case_2),
16029 TEST_CASE_ST(ut_setup, ut_teardown,
16030 test_kasumi_auth_cipher_verify_test_case_2_oop),
16031 TEST_CASE_ST(ut_setup, ut_teardown,
16032 test_kasumi_auth_cipher_verify_test_case_2_sgl),
16033 TEST_CASE_ST(ut_setup, ut_teardown,
16034 test_kasumi_auth_cipher_verify_test_case_2_oop_sgl),
16035
16036 TEST_CASES_END()
16037 }
16038 };
16039
16040 static struct unit_test_suite cryptodev_esn_testsuite = {
16041 .suite_name = "ESN Test Suite",
16042 .setup = esn_testsuite_setup,
16043 .unit_test_cases = {
16044 TEST_CASE_ST(ut_setup, ut_teardown,
16045 auth_encrypt_AES128CBC_HMAC_SHA1_esn_check),
16046 TEST_CASE_ST(ut_setup, ut_teardown,
16047 auth_decrypt_AES128CBC_HMAC_SHA1_esn_check),
16048 TEST_CASES_END()
16049 }
16050 };
16051
16052 static struct unit_test_suite cryptodev_negative_aes_gcm_testsuite = {
16053 .suite_name = "Negative AES GCM Test Suite",
16054 .setup = negative_aes_gcm_testsuite_setup,
16055 .unit_test_cases = {
16056 TEST_CASE_ST(ut_setup, ut_teardown,
16057 test_AES_GCM_auth_encryption_fail_iv_corrupt),
16058 TEST_CASE_ST(ut_setup, ut_teardown,
16059 test_AES_GCM_auth_encryption_fail_in_data_corrupt),
16060 TEST_CASE_ST(ut_setup, ut_teardown,
16061 test_AES_GCM_auth_encryption_fail_out_data_corrupt),
16062 TEST_CASE_ST(ut_setup, ut_teardown,
16063 test_AES_GCM_auth_encryption_fail_aad_len_corrupt),
16064 TEST_CASE_ST(ut_setup, ut_teardown,
16065 test_AES_GCM_auth_encryption_fail_aad_corrupt),
16066 TEST_CASE_ST(ut_setup, ut_teardown,
16067 test_AES_GCM_auth_encryption_fail_tag_corrupt),
16068 TEST_CASE_ST(ut_setup, ut_teardown,
16069 test_AES_GCM_auth_decryption_fail_iv_corrupt),
16070 TEST_CASE_ST(ut_setup, ut_teardown,
16071 test_AES_GCM_auth_decryption_fail_in_data_corrupt),
16072 TEST_CASE_ST(ut_setup, ut_teardown,
16073 test_AES_GCM_auth_decryption_fail_out_data_corrupt),
16074 TEST_CASE_ST(ut_setup, ut_teardown,
16075 test_AES_GCM_auth_decryption_fail_aad_len_corrupt),
16076 TEST_CASE_ST(ut_setup, ut_teardown,
16077 test_AES_GCM_auth_decryption_fail_aad_corrupt),
16078 TEST_CASE_ST(ut_setup, ut_teardown,
16079 test_AES_GCM_auth_decryption_fail_tag_corrupt),
16080
16081 TEST_CASES_END()
16082 }
16083 };
16084
16085 static struct unit_test_suite cryptodev_negative_aes_gmac_testsuite = {
16086 .suite_name = "Negative AES GMAC Test Suite",
16087 .setup = negative_aes_gmac_testsuite_setup,
16088 .unit_test_cases = {
16089 TEST_CASE_ST(ut_setup, ut_teardown,
16090 authentication_verify_AES128_GMAC_fail_data_corrupt),
16091 TEST_CASE_ST(ut_setup, ut_teardown,
16092 authentication_verify_AES128_GMAC_fail_tag_corrupt),
16093
16094 TEST_CASES_END()
16095 }
16096 };
16097
16098 static struct unit_test_suite cryptodev_mixed_cipher_hash_testsuite = {
16099 .suite_name = "Mixed CIPHER + HASH algorithms Test Suite",
16100 .setup = mixed_cipher_hash_testsuite_setup,
16101 .unit_test_cases = {
16102 /** AUTH AES CMAC + CIPHER AES CTR */
16103 TEST_CASE_ST(ut_setup, ut_teardown,
16104 test_aes_cmac_aes_ctr_digest_enc_test_case_1),
16105 TEST_CASE_ST(ut_setup, ut_teardown,
16106 test_aes_cmac_aes_ctr_digest_enc_test_case_1_oop),
16107 TEST_CASE_ST(ut_setup, ut_teardown,
16108 test_aes_cmac_aes_ctr_digest_enc_test_case_1_sgl),
16109 TEST_CASE_ST(ut_setup, ut_teardown,
16110 test_aes_cmac_aes_ctr_digest_enc_test_case_1_oop_sgl),
16111 TEST_CASE_ST(ut_setup, ut_teardown,
16112 test_verify_aes_cmac_aes_ctr_digest_enc_test_case_1),
16113 TEST_CASE_ST(ut_setup, ut_teardown,
16114 test_verify_aes_cmac_aes_ctr_digest_enc_test_case_1_oop),
16115 TEST_CASE_ST(ut_setup, ut_teardown,
16116 test_verify_aes_cmac_aes_ctr_digest_enc_test_case_1_sgl),
16117 TEST_CASE_ST(ut_setup, ut_teardown,
16118 test_verify_aes_cmac_aes_ctr_digest_enc_test_case_1_oop_sgl),
16119
16120 /** AUTH ZUC + CIPHER SNOW3G */
16121 TEST_CASE_ST(ut_setup, ut_teardown,
16122 test_auth_zuc_cipher_snow_test_case_1),
16123 TEST_CASE_ST(ut_setup, ut_teardown,
16124 test_verify_auth_zuc_cipher_snow_test_case_1),
16125 /** AUTH AES CMAC + CIPHER SNOW3G */
16126 TEST_CASE_ST(ut_setup, ut_teardown,
16127 test_auth_aes_cmac_cipher_snow_test_case_1),
16128 TEST_CASE_ST(ut_setup, ut_teardown,
16129 test_verify_auth_aes_cmac_cipher_snow_test_case_1),
16130 /** AUTH ZUC + CIPHER AES CTR */
16131 TEST_CASE_ST(ut_setup, ut_teardown,
16132 test_auth_zuc_cipher_aes_ctr_test_case_1),
16133 TEST_CASE_ST(ut_setup, ut_teardown,
16134 test_verify_auth_zuc_cipher_aes_ctr_test_case_1),
16135 /** AUTH SNOW3G + CIPHER AES CTR */
16136 TEST_CASE_ST(ut_setup, ut_teardown,
16137 test_auth_snow_cipher_aes_ctr_test_case_1),
16138 TEST_CASE_ST(ut_setup, ut_teardown,
16139 test_verify_auth_snow_cipher_aes_ctr_test_case_1),
16140 /** AUTH SNOW3G + CIPHER ZUC */
16141 TEST_CASE_ST(ut_setup, ut_teardown,
16142 test_auth_snow_cipher_zuc_test_case_1),
16143 TEST_CASE_ST(ut_setup, ut_teardown,
16144 test_verify_auth_snow_cipher_zuc_test_case_1),
16145 /** AUTH AES CMAC + CIPHER ZUC */
16146 TEST_CASE_ST(ut_setup, ut_teardown,
16147 test_auth_aes_cmac_cipher_zuc_test_case_1),
16148 TEST_CASE_ST(ut_setup, ut_teardown,
16149 test_verify_auth_aes_cmac_cipher_zuc_test_case_1),
16150
16151 /** AUTH NULL + CIPHER SNOW3G */
16152 TEST_CASE_ST(ut_setup, ut_teardown,
16153 test_auth_null_cipher_snow_test_case_1),
16154 TEST_CASE_ST(ut_setup, ut_teardown,
16155 test_verify_auth_null_cipher_snow_test_case_1),
16156 /** AUTH NULL + CIPHER ZUC */
16157 TEST_CASE_ST(ut_setup, ut_teardown,
16158 test_auth_null_cipher_zuc_test_case_1),
16159 TEST_CASE_ST(ut_setup, ut_teardown,
16160 test_verify_auth_null_cipher_zuc_test_case_1),
16161 /** AUTH SNOW3G + CIPHER NULL */
16162 TEST_CASE_ST(ut_setup, ut_teardown,
16163 test_auth_snow_cipher_null_test_case_1),
16164 TEST_CASE_ST(ut_setup, ut_teardown,
16165 test_verify_auth_snow_cipher_null_test_case_1),
16166 /** AUTH ZUC + CIPHER NULL */
16167 TEST_CASE_ST(ut_setup, ut_teardown,
16168 test_auth_zuc_cipher_null_test_case_1),
16169 TEST_CASE_ST(ut_setup, ut_teardown,
16170 test_verify_auth_zuc_cipher_null_test_case_1),
16171 /** AUTH NULL + CIPHER AES CTR */
16172 TEST_CASE_ST(ut_setup, ut_teardown,
16173 test_auth_null_cipher_aes_ctr_test_case_1),
16174 TEST_CASE_ST(ut_setup, ut_teardown,
16175 test_verify_auth_null_cipher_aes_ctr_test_case_1),
16176 /** AUTH AES CMAC + CIPHER NULL */
16177 TEST_CASE_ST(ut_setup, ut_teardown,
16178 test_auth_aes_cmac_cipher_null_test_case_1),
16179 TEST_CASE_ST(ut_setup, ut_teardown,
16180 test_verify_auth_aes_cmac_cipher_null_test_case_1),
16181 TEST_CASES_END()
16182 }
16183 };
16184
16185 static int
run_cryptodev_testsuite(const char * pmd_name)16186 run_cryptodev_testsuite(const char *pmd_name)
16187 {
16188 uint8_t ret, j, i = 0, blk_start_idx = 0;
16189 const enum blockcipher_test_type blk_suites[] = {
16190 BLKCIPHER_AES_CHAIN_TYPE,
16191 BLKCIPHER_AES_CIPHERONLY_TYPE,
16192 BLKCIPHER_AES_DOCSIS_TYPE,
16193 BLKCIPHER_3DES_CHAIN_TYPE,
16194 BLKCIPHER_3DES_CIPHERONLY_TYPE,
16195 BLKCIPHER_DES_CIPHERONLY_TYPE,
16196 BLKCIPHER_DES_DOCSIS_TYPE,
16197 BLKCIPHER_AUTHONLY_TYPE};
16198 struct unit_test_suite *static_suites[] = {
16199 &cryptodev_multi_session_testsuite,
16200 &cryptodev_null_testsuite,
16201 &cryptodev_aes_ccm_auth_testsuite,
16202 &cryptodev_aes_gcm_auth_testsuite,
16203 &cryptodev_aes_gmac_auth_testsuite,
16204 &cryptodev_snow3g_testsuite,
16205 &cryptodev_chacha20_poly1305_testsuite,
16206 &cryptodev_zuc_testsuite,
16207 &cryptodev_hmac_md5_auth_testsuite,
16208 &cryptodev_kasumi_testsuite,
16209 &cryptodev_esn_testsuite,
16210 &cryptodev_negative_aes_gcm_testsuite,
16211 &cryptodev_negative_aes_gmac_testsuite,
16212 &cryptodev_mixed_cipher_hash_testsuite,
16213 &cryptodev_negative_hmac_sha1_testsuite,
16214 &cryptodev_gen_testsuite,
16215 #ifdef RTE_LIB_SECURITY
16216 &ipsec_proto_testsuite,
16217 &pdcp_proto_testsuite,
16218 &docsis_proto_testsuite,
16219 #endif
16220 &end_testsuite
16221 };
16222 static struct unit_test_suite ts = {
16223 .suite_name = "Cryptodev Unit Test Suite",
16224 .setup = testsuite_setup,
16225 .teardown = testsuite_teardown,
16226 .unit_test_cases = {TEST_CASES_END()}
16227 };
16228
16229 gbl_driver_id = rte_cryptodev_driver_id_get(pmd_name);
16230
16231 if (gbl_driver_id == -1) {
16232 RTE_LOG(ERR, USER1, "%s PMD must be loaded.\n", pmd_name);
16233 return TEST_SKIPPED;
16234 }
16235
16236 ts.unit_test_suites = malloc(sizeof(struct unit_test_suite *) *
16237 (RTE_DIM(blk_suites) + RTE_DIM(static_suites)));
16238
16239 ADD_BLOCKCIPHER_TESTSUITE(i, ts, blk_suites, RTE_DIM(blk_suites));
16240 ADD_STATIC_TESTSUITE(i, ts, static_suites, RTE_DIM(static_suites));
16241 ret = unit_test_suite_runner(&ts);
16242
16243 FREE_BLOCKCIPHER_TESTSUITE(blk_start_idx, ts, RTE_DIM(blk_suites));
16244 free(ts.unit_test_suites);
16245 return ret;
16246 }
16247
16248 static int
require_feature_flag(const char * pmd_name,uint64_t flag,const char * flag_name)16249 require_feature_flag(const char *pmd_name, uint64_t flag, const char *flag_name)
16250 {
16251 struct rte_cryptodev_info dev_info;
16252 uint8_t i, nb_devs;
16253 int driver_id;
16254
16255 driver_id = rte_cryptodev_driver_id_get(pmd_name);
16256 if (driver_id == -1) {
16257 RTE_LOG(WARNING, USER1, "%s PMD must be loaded.\n", pmd_name);
16258 return TEST_SKIPPED;
16259 }
16260
16261 nb_devs = rte_cryptodev_count();
16262 if (nb_devs < 1) {
16263 RTE_LOG(WARNING, USER1, "No crypto devices found?\n");
16264 return TEST_SKIPPED;
16265 }
16266
16267 for (i = 0; i < nb_devs; i++) {
16268 rte_cryptodev_info_get(i, &dev_info);
16269 if (dev_info.driver_id == driver_id) {
16270 if (!(dev_info.feature_flags & flag)) {
16271 RTE_LOG(INFO, USER1, "%s not supported\n",
16272 flag_name);
16273 return TEST_SKIPPED;
16274 }
16275 return 0; /* found */
16276 }
16277 }
16278
16279 RTE_LOG(INFO, USER1, "%s not supported\n", flag_name);
16280 return TEST_SKIPPED;
16281 }
16282
16283 static int
test_cryptodev_qat(void)16284 test_cryptodev_qat(void)
16285 {
16286 return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_QAT_SYM_PMD));
16287 }
16288
16289 static int
test_cryptodev_virtio(void)16290 test_cryptodev_virtio(void)
16291 {
16292 return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_VIRTIO_PMD));
16293 }
16294
16295 static int
test_cryptodev_aesni_mb(void)16296 test_cryptodev_aesni_mb(void)
16297 {
16298 return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_AESNI_MB_PMD));
16299 }
16300
16301 static int
test_cryptodev_cpu_aesni_mb(void)16302 test_cryptodev_cpu_aesni_mb(void)
16303 {
16304 int32_t rc;
16305 enum rte_security_session_action_type at = gbl_action_type;
16306 gbl_action_type = RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO;
16307 rc = run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_AESNI_MB_PMD));
16308 gbl_action_type = at;
16309 return rc;
16310 }
16311
16312 static int
test_cryptodev_chacha_poly_mb(void)16313 test_cryptodev_chacha_poly_mb(void)
16314 {
16315 int32_t rc;
16316 enum rte_security_session_action_type at = gbl_action_type;
16317 rc = run_cryptodev_testsuite(
16318 RTE_STR(CRYPTODEV_NAME_CHACHA20_POLY1305_PMD));
16319 gbl_action_type = at;
16320 return rc;
16321 }
16322
16323 static int
test_cryptodev_openssl(void)16324 test_cryptodev_openssl(void)
16325 {
16326 return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_OPENSSL_PMD));
16327 }
16328
16329 static int
test_cryptodev_aesni_gcm(void)16330 test_cryptodev_aesni_gcm(void)
16331 {
16332 return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_AESNI_GCM_PMD));
16333 }
16334
16335 static int
test_cryptodev_cpu_aesni_gcm(void)16336 test_cryptodev_cpu_aesni_gcm(void)
16337 {
16338 int32_t rc;
16339 enum rte_security_session_action_type at = gbl_action_type;
16340 gbl_action_type = RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO;
16341 rc = run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_AESNI_GCM_PMD));
16342 gbl_action_type = at;
16343 return rc;
16344 }
16345
16346 static int
test_cryptodev_mlx5(void)16347 test_cryptodev_mlx5(void)
16348 {
16349 return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_MLX5_PMD));
16350 }
16351
16352 static int
test_cryptodev_null(void)16353 test_cryptodev_null(void)
16354 {
16355 return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_NULL_PMD));
16356 }
16357
16358 static int
test_cryptodev_sw_snow3g(void)16359 test_cryptodev_sw_snow3g(void)
16360 {
16361 return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_SNOW3G_PMD));
16362 }
16363
16364 static int
test_cryptodev_sw_kasumi(void)16365 test_cryptodev_sw_kasumi(void)
16366 {
16367 return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_KASUMI_PMD));
16368 }
16369
16370 static int
test_cryptodev_sw_zuc(void)16371 test_cryptodev_sw_zuc(void)
16372 {
16373 return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_ZUC_PMD));
16374 }
16375
16376 static int
test_cryptodev_armv8(void)16377 test_cryptodev_armv8(void)
16378 {
16379 return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_ARMV8_PMD));
16380 }
16381
16382 static int
test_cryptodev_mrvl(void)16383 test_cryptodev_mrvl(void)
16384 {
16385 return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_MVSAM_PMD));
16386 }
16387
16388 #ifdef RTE_CRYPTO_SCHEDULER
16389
16390 static int
test_cryptodev_scheduler(void)16391 test_cryptodev_scheduler(void)
16392 {
16393 uint8_t ret, sched_i, j, i = 0, blk_start_idx = 0;
16394 const enum blockcipher_test_type blk_suites[] = {
16395 BLKCIPHER_AES_CHAIN_TYPE,
16396 BLKCIPHER_AES_CIPHERONLY_TYPE,
16397 BLKCIPHER_AUTHONLY_TYPE
16398 };
16399 static struct unit_test_suite scheduler_multicore = {
16400 .suite_name = "Scheduler Multicore Unit Test Suite",
16401 .setup = scheduler_multicore_testsuite_setup,
16402 .teardown = scheduler_mode_testsuite_teardown,
16403 .unit_test_cases = {TEST_CASES_END()}
16404 };
16405 static struct unit_test_suite scheduler_round_robin = {
16406 .suite_name = "Scheduler Round Robin Unit Test Suite",
16407 .setup = scheduler_roundrobin_testsuite_setup,
16408 .teardown = scheduler_mode_testsuite_teardown,
16409 .unit_test_cases = {TEST_CASES_END()}
16410 };
16411 static struct unit_test_suite scheduler_failover = {
16412 .suite_name = "Scheduler Failover Unit Test Suite",
16413 .setup = scheduler_failover_testsuite_setup,
16414 .teardown = scheduler_mode_testsuite_teardown,
16415 .unit_test_cases = {TEST_CASES_END()}
16416 };
16417 static struct unit_test_suite scheduler_pkt_size_distr = {
16418 .suite_name = "Scheduler Pkt Size Distr Unit Test Suite",
16419 .setup = scheduler_pkt_size_distr_testsuite_setup,
16420 .teardown = scheduler_mode_testsuite_teardown,
16421 .unit_test_cases = {TEST_CASES_END()}
16422 };
16423 struct unit_test_suite *sched_mode_suites[] = {
16424 &scheduler_multicore,
16425 &scheduler_round_robin,
16426 &scheduler_failover,
16427 &scheduler_pkt_size_distr
16428 };
16429 static struct unit_test_suite scheduler_config = {
16430 .suite_name = "Crypto Device Scheduler Config Unit Test Suite",
16431 .unit_test_cases = {
16432 TEST_CASE(test_scheduler_attach_worker_op),
16433 TEST_CASE(test_scheduler_mode_multicore_op),
16434 TEST_CASE(test_scheduler_mode_roundrobin_op),
16435 TEST_CASE(test_scheduler_mode_failover_op),
16436 TEST_CASE(test_scheduler_mode_pkt_size_distr_op),
16437 TEST_CASE(test_scheduler_detach_worker_op),
16438
16439 TEST_CASES_END() /**< NULL terminate array */
16440 }
16441 };
16442 struct unit_test_suite *static_suites[] = {
16443 &scheduler_config,
16444 &end_testsuite
16445 };
16446 static struct unit_test_suite ts = {
16447 .suite_name = "Scheduler Unit Test Suite",
16448 .setup = scheduler_testsuite_setup,
16449 .teardown = testsuite_teardown,
16450 .unit_test_cases = {TEST_CASES_END()}
16451 };
16452
16453 gbl_driver_id = rte_cryptodev_driver_id_get(
16454 RTE_STR(CRYPTODEV_NAME_SCHEDULER_PMD));
16455
16456 if (gbl_driver_id == -1) {
16457 RTE_LOG(ERR, USER1, "SCHEDULER PMD must be loaded.\n");
16458 return TEST_SKIPPED;
16459 }
16460
16461 if (rte_cryptodev_driver_id_get(
16462 RTE_STR(CRYPTODEV_NAME_AESNI_MB_PMD)) == -1) {
16463 RTE_LOG(ERR, USER1, "AESNI MB PMD must be loaded.\n");
16464 return TEST_SKIPPED;
16465 }
16466
16467 for (sched_i = 0; sched_i < RTE_DIM(sched_mode_suites); sched_i++) {
16468 uint8_t blk_i = 0;
16469 sched_mode_suites[sched_i]->unit_test_suites = malloc(sizeof
16470 (struct unit_test_suite *) *
16471 (RTE_DIM(blk_suites) + 1));
16472 ADD_BLOCKCIPHER_TESTSUITE(blk_i, (*sched_mode_suites[sched_i]),
16473 blk_suites, RTE_DIM(blk_suites));
16474 sched_mode_suites[sched_i]->unit_test_suites[blk_i] = &end_testsuite;
16475 }
16476
16477 ts.unit_test_suites = malloc(sizeof(struct unit_test_suite *) *
16478 (RTE_DIM(static_suites) + RTE_DIM(sched_mode_suites)));
16479 ADD_STATIC_TESTSUITE(i, ts, sched_mode_suites,
16480 RTE_DIM(sched_mode_suites));
16481 ADD_STATIC_TESTSUITE(i, ts, static_suites, RTE_DIM(static_suites));
16482 ret = unit_test_suite_runner(&ts);
16483
16484 for (sched_i = 0; sched_i < RTE_DIM(sched_mode_suites); sched_i++) {
16485 FREE_BLOCKCIPHER_TESTSUITE(blk_start_idx,
16486 (*sched_mode_suites[sched_i]),
16487 RTE_DIM(blk_suites));
16488 free(sched_mode_suites[sched_i]->unit_test_suites);
16489 }
16490 free(ts.unit_test_suites);
16491 return ret;
16492 }
16493
16494 REGISTER_TEST_COMMAND(cryptodev_scheduler_autotest, test_cryptodev_scheduler);
16495
16496 #endif
16497
16498 static int
test_cryptodev_dpaa2_sec(void)16499 test_cryptodev_dpaa2_sec(void)
16500 {
16501 return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_DPAA2_SEC_PMD));
16502 }
16503
16504 static int
test_cryptodev_dpaa_sec(void)16505 test_cryptodev_dpaa_sec(void)
16506 {
16507 return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_DPAA_SEC_PMD));
16508 }
16509
16510 static int
test_cryptodev_ccp(void)16511 test_cryptodev_ccp(void)
16512 {
16513 return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_CCP_PMD));
16514 }
16515
16516 static int
test_cryptodev_octeontx(void)16517 test_cryptodev_octeontx(void)
16518 {
16519 return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_OCTEONTX_SYM_PMD));
16520 }
16521
16522 static int
test_cryptodev_caam_jr(void)16523 test_cryptodev_caam_jr(void)
16524 {
16525 return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_CAAM_JR_PMD));
16526 }
16527
16528 static int
test_cryptodev_nitrox(void)16529 test_cryptodev_nitrox(void)
16530 {
16531 return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_NITROX_PMD));
16532 }
16533
16534 static int
test_cryptodev_bcmfs(void)16535 test_cryptodev_bcmfs(void)
16536 {
16537 return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_BCMFS_PMD));
16538 }
16539
16540 static int
test_cryptodev_qat_raw_api(void)16541 test_cryptodev_qat_raw_api(void)
16542 {
16543 static const char *pmd_name = RTE_STR(CRYPTODEV_NAME_QAT_SYM_PMD);
16544 int ret;
16545
16546 ret = require_feature_flag(pmd_name, RTE_CRYPTODEV_FF_SYM_RAW_DP,
16547 "RAW API");
16548 if (ret)
16549 return ret;
16550
16551 global_api_test_type = CRYPTODEV_RAW_API_TEST;
16552 ret = run_cryptodev_testsuite(pmd_name);
16553 global_api_test_type = CRYPTODEV_API_TEST;
16554
16555 return ret;
16556 }
16557
16558 static int
test_cryptodev_cn9k(void)16559 test_cryptodev_cn9k(void)
16560 {
16561 return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_CN9K_PMD));
16562 }
16563
16564 static int
test_cryptodev_cn10k(void)16565 test_cryptodev_cn10k(void)
16566 {
16567 return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_CN10K_PMD));
16568 }
16569
16570 static int
test_cryptodev_dpaa2_sec_raw_api(void)16571 test_cryptodev_dpaa2_sec_raw_api(void)
16572 {
16573 static const char *pmd_name = RTE_STR(CRYPTODEV_NAME_DPAA2_SEC_PMD);
16574 int ret;
16575
16576 ret = require_feature_flag(pmd_name, RTE_CRYPTODEV_FF_SYM_RAW_DP,
16577 "RAW API");
16578 if (ret)
16579 return ret;
16580
16581 global_api_test_type = CRYPTODEV_RAW_API_TEST;
16582 ret = run_cryptodev_testsuite(pmd_name);
16583 global_api_test_type = CRYPTODEV_API_TEST;
16584
16585 return ret;
16586 }
16587
16588 static int
test_cryptodev_dpaa_sec_raw_api(void)16589 test_cryptodev_dpaa_sec_raw_api(void)
16590 {
16591 static const char *pmd_name = RTE_STR(CRYPTODEV_NAME_DPAA2_SEC_PMD);
16592 int ret;
16593
16594 ret = require_feature_flag(pmd_name, RTE_CRYPTODEV_FF_SYM_RAW_DP,
16595 "RAW API");
16596 if (ret)
16597 return ret;
16598
16599 global_api_test_type = CRYPTODEV_RAW_API_TEST;
16600 ret = run_cryptodev_testsuite(pmd_name);
16601 global_api_test_type = CRYPTODEV_API_TEST;
16602
16603 return ret;
16604 }
16605
16606 REGISTER_TEST_COMMAND(cryptodev_dpaa2_sec_raw_api_autotest,
16607 test_cryptodev_dpaa2_sec_raw_api);
16608 REGISTER_TEST_COMMAND(cryptodev_dpaa_sec_raw_api_autotest,
16609 test_cryptodev_dpaa_sec_raw_api);
16610 REGISTER_TEST_COMMAND(cryptodev_qat_raw_api_autotest,
16611 test_cryptodev_qat_raw_api);
16612 REGISTER_TEST_COMMAND(cryptodev_qat_autotest, test_cryptodev_qat);
16613 REGISTER_TEST_COMMAND(cryptodev_aesni_mb_autotest, test_cryptodev_aesni_mb);
16614 REGISTER_TEST_COMMAND(cryptodev_cpu_aesni_mb_autotest,
16615 test_cryptodev_cpu_aesni_mb);
16616 REGISTER_TEST_COMMAND(cryptodev_chacha_poly_mb_autotest,
16617 test_cryptodev_chacha_poly_mb);
16618 REGISTER_TEST_COMMAND(cryptodev_openssl_autotest, test_cryptodev_openssl);
16619 REGISTER_TEST_COMMAND(cryptodev_aesni_gcm_autotest, test_cryptodev_aesni_gcm);
16620 REGISTER_TEST_COMMAND(cryptodev_cpu_aesni_gcm_autotest,
16621 test_cryptodev_cpu_aesni_gcm);
16622 REGISTER_TEST_COMMAND(cryptodev_mlx5_autotest, test_cryptodev_mlx5);
16623 REGISTER_TEST_COMMAND(cryptodev_null_autotest, test_cryptodev_null);
16624 REGISTER_TEST_COMMAND(cryptodev_sw_snow3g_autotest, test_cryptodev_sw_snow3g);
16625 REGISTER_TEST_COMMAND(cryptodev_sw_kasumi_autotest, test_cryptodev_sw_kasumi);
16626 REGISTER_TEST_COMMAND(cryptodev_sw_zuc_autotest, test_cryptodev_sw_zuc);
16627 REGISTER_TEST_COMMAND(cryptodev_sw_armv8_autotest, test_cryptodev_armv8);
16628 REGISTER_TEST_COMMAND(cryptodev_sw_mvsam_autotest, test_cryptodev_mrvl);
16629 REGISTER_TEST_COMMAND(cryptodev_dpaa2_sec_autotest, test_cryptodev_dpaa2_sec);
16630 REGISTER_TEST_COMMAND(cryptodev_dpaa_sec_autotest, test_cryptodev_dpaa_sec);
16631 REGISTER_TEST_COMMAND(cryptodev_ccp_autotest, test_cryptodev_ccp);
16632 REGISTER_TEST_COMMAND(cryptodev_virtio_autotest, test_cryptodev_virtio);
16633 REGISTER_TEST_COMMAND(cryptodev_octeontx_autotest, test_cryptodev_octeontx);
16634 REGISTER_TEST_COMMAND(cryptodev_caam_jr_autotest, test_cryptodev_caam_jr);
16635 REGISTER_TEST_COMMAND(cryptodev_nitrox_autotest, test_cryptodev_nitrox);
16636 REGISTER_TEST_COMMAND(cryptodev_bcmfs_autotest, test_cryptodev_bcmfs);
16637 REGISTER_TEST_COMMAND(cryptodev_cn9k_autotest, test_cryptodev_cn9k);
16638 REGISTER_TEST_COMMAND(cryptodev_cn10k_autotest, test_cryptodev_cn10k);
16639
16640 #endif /* !RTE_EXEC_ENV_WINDOWS */
16641