xref: /dpdk/app/test/test_cryptodev_asym.c (revision 7564d550)
1 /* SPDX-License-Identifier: BSD-3-Clause
2  * Copyright(c) 2018 Cavium Networks
3  * Copyright (c) 2019 Intel Corporation
4  */
5 
6 #include <rte_bus_vdev.h>
7 #include <rte_common.h>
8 #include <rte_hexdump.h>
9 #include <rte_mbuf.h>
10 #include <rte_malloc.h>
11 #include <rte_memcpy.h>
12 #include <rte_pause.h>
13 
14 #include <rte_cryptodev.h>
15 #include <rte_cryptodev_pmd.h>
16 #include <rte_crypto.h>
17 
18 #include "test_cryptodev.h"
19 #include "test_cryptodev_dh_test_vectors.h"
20 #include "test_cryptodev_dsa_test_vectors.h"
21 #include "test_cryptodev_ecdsa_test_vectors.h"
22 #include "test_cryptodev_ecpm_test_vectors.h"
23 #include "test_cryptodev_mod_test_vectors.h"
24 #include "test_cryptodev_rsa_test_vectors.h"
25 #include "test_cryptodev_asym_util.h"
26 #include "test.h"
27 
28 #define TEST_NUM_BUFS 10
29 #define TEST_NUM_SESSIONS 4
30 
31 #ifndef TEST_DATA_SIZE
32 	#define TEST_DATA_SIZE 4096
33 #endif
34 #define ASYM_TEST_MSG_LEN 256
35 #define TEST_VECTOR_SIZE 256
36 
37 static int gbl_driver_id;
38 struct crypto_testsuite_params {
39 	struct rte_mempool *op_mpool;
40 	struct rte_mempool *session_mpool;
41 	struct rte_cryptodev_config conf;
42 	struct rte_cryptodev_qp_conf qp_conf;
43 	uint8_t valid_devs[RTE_CRYPTO_MAX_DEVS];
44 	uint8_t valid_dev_count;
45 };
46 
47 struct crypto_unittest_params {
48 	struct rte_cryptodev_asym_session *sess;
49 	struct rte_crypto_op *op;
50 };
51 
52 union test_case_structure {
53 	struct modex_test_data modex;
54 	struct modinv_test_data modinv;
55 	struct rsa_test_data_2 rsa_data;
56 };
57 
58 struct test_cases_array {
59 	uint32_t size;
60 	const void *address[TEST_VECTOR_SIZE];
61 };
62 static struct test_cases_array test_vector = {0, { NULL } };
63 
64 static uint32_t test_index;
65 
66 static struct crypto_testsuite_params testsuite_params = { NULL };
67 
68 static int
69 queue_ops_rsa_sign_verify(struct rte_cryptodev_asym_session *sess)
70 {
71 	struct crypto_testsuite_params *ts_params = &testsuite_params;
72 	struct rte_mempool *op_mpool = ts_params->op_mpool;
73 	uint8_t dev_id = ts_params->valid_devs[0];
74 	struct rte_crypto_op *op, *result_op;
75 	struct rte_crypto_asym_op *asym_op;
76 	uint8_t output_buf[TEST_DATA_SIZE];
77 	int status = TEST_SUCCESS;
78 
79 	/* Set up crypto op data structure */
80 	op = rte_crypto_op_alloc(op_mpool, RTE_CRYPTO_OP_TYPE_ASYMMETRIC);
81 	if (!op) {
82 		RTE_LOG(ERR, USER1, "Failed to allocate asymmetric crypto "
83 			"operation struct\n");
84 		return TEST_FAILED;
85 	}
86 
87 	asym_op = op->asym;
88 
89 	/* Compute sign on the test vector */
90 	asym_op->rsa.op_type = RTE_CRYPTO_ASYM_OP_SIGN;
91 
92 	asym_op->rsa.message.data = rsaplaintext.data;
93 	asym_op->rsa.message.length = rsaplaintext.len;
94 	asym_op->rsa.sign.length = 0;
95 	asym_op->rsa.sign.data = output_buf;
96 	asym_op->rsa.pad = RTE_CRYPTO_RSA_PADDING_PKCS1_5;
97 
98 	debug_hexdump(stdout, "message", asym_op->rsa.message.data,
99 		      asym_op->rsa.message.length);
100 
101 	/* Attach asymmetric crypto session to crypto operations */
102 	rte_crypto_op_attach_asym_session(op, sess);
103 
104 	RTE_LOG(DEBUG, USER1, "Process ASYM operation\n");
105 
106 	/* Process crypto operation */
107 	if (rte_cryptodev_enqueue_burst(dev_id, 0, &op, 1) != 1) {
108 		RTE_LOG(ERR, USER1, "Error sending packet for sign\n");
109 		status = TEST_FAILED;
110 		goto error_exit;
111 	}
112 
113 	while (rte_cryptodev_dequeue_burst(dev_id, 0, &result_op, 1) == 0)
114 		rte_pause();
115 
116 	if (result_op == NULL) {
117 		RTE_LOG(ERR, USER1, "Failed to process sign op\n");
118 		status = TEST_FAILED;
119 		goto error_exit;
120 	}
121 
122 	debug_hexdump(stdout, "signed message", asym_op->rsa.sign.data,
123 		      asym_op->rsa.sign.length);
124 	asym_op = result_op->asym;
125 
126 	/* Verify sign */
127 	asym_op->rsa.op_type = RTE_CRYPTO_ASYM_OP_VERIFY;
128 	asym_op->rsa.pad = RTE_CRYPTO_RSA_PADDING_PKCS1_5;
129 
130 	/* Process crypto operation */
131 	if (rte_cryptodev_enqueue_burst(dev_id, 0, &op, 1) != 1) {
132 		RTE_LOG(ERR, USER1, "Error sending packet for verify\n");
133 		status = TEST_FAILED;
134 		goto error_exit;
135 	}
136 
137 	while (rte_cryptodev_dequeue_burst(dev_id, 0, &result_op, 1) == 0)
138 		rte_pause();
139 
140 	if (result_op == NULL) {
141 		RTE_LOG(ERR, USER1, "Failed to process verify op\n");
142 		status = TEST_FAILED;
143 		goto error_exit;
144 	}
145 
146 	status = TEST_SUCCESS;
147 	if (result_op->status != RTE_CRYPTO_OP_STATUS_SUCCESS) {
148 		RTE_LOG(ERR, USER1, "Failed to process sign-verify op\n");
149 		status = TEST_FAILED;
150 	}
151 
152 error_exit:
153 
154 	rte_crypto_op_free(op);
155 
156 	return status;
157 }
158 
159 static int
160 queue_ops_rsa_enc_dec(struct rte_cryptodev_asym_session *sess)
161 {
162 	struct crypto_testsuite_params *ts_params = &testsuite_params;
163 	struct rte_mempool *op_mpool = ts_params->op_mpool;
164 	uint8_t dev_id = ts_params->valid_devs[0];
165 	struct rte_crypto_op *op, *result_op;
166 	struct rte_crypto_asym_op *asym_op;
167 	uint8_t cipher_buf[TEST_DATA_SIZE] = {0};
168 	int ret, status = TEST_SUCCESS;
169 
170 	/* Set up crypto op data structure */
171 	op = rte_crypto_op_alloc(op_mpool, RTE_CRYPTO_OP_TYPE_ASYMMETRIC);
172 	if (!op) {
173 		RTE_LOG(ERR, USER1, "Failed to allocate asymmetric crypto "
174 			"operation struct\n");
175 		return TEST_FAILED;
176 	}
177 
178 	asym_op = op->asym;
179 
180 	/* Compute encryption on the test vector */
181 	asym_op->rsa.op_type = RTE_CRYPTO_ASYM_OP_ENCRYPT;
182 
183 	asym_op->rsa.message.data = rsaplaintext.data;
184 	asym_op->rsa.cipher.data = cipher_buf;
185 	asym_op->rsa.cipher.length = 0;
186 	asym_op->rsa.message.length = rsaplaintext.len;
187 	asym_op->rsa.pad = RTE_CRYPTO_RSA_PADDING_PKCS1_5;
188 
189 	debug_hexdump(stdout, "message", asym_op->rsa.message.data,
190 		      asym_op->rsa.message.length);
191 
192 	/* Attach asymmetric crypto session to crypto operations */
193 	rte_crypto_op_attach_asym_session(op, sess);
194 
195 	RTE_LOG(DEBUG, USER1, "Process ASYM operation\n");
196 
197 	/* Process crypto operation */
198 	if (rte_cryptodev_enqueue_burst(dev_id, 0, &op, 1) != 1) {
199 		RTE_LOG(ERR, USER1, "Error sending packet for encryption\n");
200 		status = TEST_FAILED;
201 		goto error_exit;
202 	}
203 
204 	while (rte_cryptodev_dequeue_burst(dev_id, 0, &result_op, 1) == 0)
205 		rte_pause();
206 
207 	if (result_op == NULL) {
208 		RTE_LOG(ERR, USER1, "Failed to process encryption op\n");
209 		status = TEST_FAILED;
210 		goto error_exit;
211 	}
212 	debug_hexdump(stdout, "encrypted message", asym_op->rsa.message.data,
213 		      asym_op->rsa.message.length);
214 
215 	/* Use the resulted output as decryption Input vector*/
216 	asym_op = result_op->asym;
217 	asym_op->rsa.message.length = 0;
218 	asym_op->rsa.op_type = RTE_CRYPTO_ASYM_OP_DECRYPT;
219 	asym_op->rsa.pad = RTE_CRYPTO_RSA_PADDING_PKCS1_5;
220 
221 	/* Process crypto operation */
222 	if (rte_cryptodev_enqueue_burst(dev_id, 0, &op, 1) != 1) {
223 		RTE_LOG(ERR, USER1, "Error sending packet for decryption\n");
224 		status = TEST_FAILED;
225 		goto error_exit;
226 	}
227 
228 	while (rte_cryptodev_dequeue_burst(dev_id, 0, &result_op, 1) == 0)
229 		rte_pause();
230 
231 	if (result_op == NULL) {
232 		RTE_LOG(ERR, USER1, "Failed to process decryption op\n");
233 		status = TEST_FAILED;
234 		goto error_exit;
235 	}
236 	status = TEST_SUCCESS;
237 	ret = rsa_verify(&rsaplaintext, result_op);
238 	if (ret)
239 		status = TEST_FAILED;
240 
241 error_exit:
242 
243 	rte_crypto_op_free(op);
244 
245 	return status;
246 }
247 static int
248 test_cryptodev_asym_ver(struct rte_crypto_op *op,
249 				struct rte_crypto_asym_xform *xform_tc,
250 				union test_case_structure *data_tc,
251 				struct rte_crypto_op *result_op)
252 {
253 	int status = TEST_FAILED;
254 	int ret = 0;
255 	uint8_t *data_expected = NULL, *data_received = NULL;
256 	size_t data_size = 0;
257 
258 	switch (data_tc->modex.xform_type) {
259 	case RTE_CRYPTO_ASYM_XFORM_MODEX:
260 		data_expected = data_tc->modex.reminder.data;
261 		data_received = result_op->asym->modex.result.data;
262 		data_size = result_op->asym->modex.result.length;
263 		break;
264 	case RTE_CRYPTO_ASYM_XFORM_MODINV:
265 		data_expected = data_tc->modinv.inverse.data;
266 		data_received = result_op->asym->modinv.result.data;
267 		data_size = result_op->asym->modinv.result.length;
268 		break;
269 	case RTE_CRYPTO_ASYM_XFORM_RSA:
270 		if (op->asym->rsa.op_type == RTE_CRYPTO_ASYM_OP_ENCRYPT) {
271 			data_size = xform_tc->rsa.n.length;
272 			data_received = result_op->asym->rsa.cipher.data;
273 			data_expected = data_tc->rsa_data.ct.data;
274 		} else if (op->asym->rsa.op_type == RTE_CRYPTO_ASYM_OP_DECRYPT) {
275 			data_size = xform_tc->rsa.n.length;
276 			data_expected = data_tc->rsa_data.pt.data;
277 			data_received = result_op->asym->rsa.message.data;
278 		} else if (op->asym->rsa.op_type == RTE_CRYPTO_ASYM_OP_SIGN) {
279 			data_size = xform_tc->rsa.n.length;
280 			data_expected = data_tc->rsa_data.sign.data;
281 			data_received = result_op->asym->rsa.sign.data;
282 		} else if (op->asym->rsa.op_type == RTE_CRYPTO_ASYM_OP_VERIFY) {
283 			data_size = xform_tc->rsa.n.length;
284 			data_expected = data_tc->rsa_data.pt.data;
285 			data_received = result_op->asym->rsa.cipher.data;
286 		}
287 		break;
288 	case RTE_CRYPTO_ASYM_XFORM_DH:
289 	case RTE_CRYPTO_ASYM_XFORM_DSA:
290 	case RTE_CRYPTO_ASYM_XFORM_NONE:
291 	case RTE_CRYPTO_ASYM_XFORM_UNSPECIFIED:
292 	default:
293 		break;
294 	}
295 	ret = memcmp(data_expected, data_received, data_size);
296 	if (!ret && data_size)
297 		status = TEST_SUCCESS;
298 
299 	return status;
300 }
301 
302 static int
303 test_cryptodev_asym_op(struct crypto_testsuite_params *ts_params,
304 	union test_case_structure *data_tc,
305 	char *test_msg, int sessionless, enum rte_crypto_asym_op_type type,
306 	enum rte_crypto_rsa_priv_key_type key_type)
307 {
308 	struct rte_crypto_asym_op *asym_op = NULL;
309 	struct rte_crypto_op *op = NULL;
310 	struct rte_crypto_op *result_op = NULL;
311 	struct rte_crypto_asym_xform xform_tc;
312 	struct rte_cryptodev_asym_session *sess = NULL;
313 	struct rte_cryptodev_asym_capability_idx cap_idx;
314 	const struct rte_cryptodev_asymmetric_xform_capability *capability;
315 	uint8_t dev_id = ts_params->valid_devs[0];
316 	uint8_t input[TEST_DATA_SIZE] = {0};
317 	uint8_t *result = NULL;
318 
319 	int status = TEST_SUCCESS;
320 
321 	xform_tc.next = NULL;
322 	xform_tc.xform_type = data_tc->modex.xform_type;
323 
324 	cap_idx.type = xform_tc.xform_type;
325 	capability = rte_cryptodev_asym_capability_get(dev_id, &cap_idx);
326 
327 	if (capability == NULL) {
328 		RTE_LOG(INFO, USER1,
329 			"Device doesn't support MODEX. Test Skipped\n");
330 		return -ENOTSUP;
331 	}
332 
333 	/* Generate crypto op data structure */
334 	op = rte_crypto_op_alloc(ts_params->op_mpool,
335 		RTE_CRYPTO_OP_TYPE_ASYMMETRIC);
336 
337 	if (!op) {
338 		snprintf(test_msg, ASYM_TEST_MSG_LEN,
339 			"line %u FAILED: %s",
340 			__LINE__, "Failed to allocate asymmetric crypto "
341 			"operation struct");
342 		status = TEST_FAILED;
343 		goto error_exit;
344 	}
345 
346 	asym_op = op->asym;
347 
348 	switch (xform_tc.xform_type) {
349 	case RTE_CRYPTO_ASYM_XFORM_MODEX:
350 		result = rte_zmalloc(NULL, data_tc->modex.result_len, 0);
351 		xform_tc.modex.modulus.data = data_tc->modex.modulus.data;
352 		xform_tc.modex.modulus.length = data_tc->modex.modulus.len;
353 		xform_tc.modex.exponent.data = data_tc->modex.exponent.data;
354 		xform_tc.modex.exponent.length = data_tc->modex.exponent.len;
355 		memcpy(input, data_tc->modex.base.data,
356 			data_tc->modex.base.len);
357 		asym_op->modex.base.data = input;
358 		asym_op->modex.base.length = data_tc->modex.base.len;
359 		asym_op->modex.result.data = result;
360 		asym_op->modex.result.length = data_tc->modex.result_len;
361 		if (rte_cryptodev_asym_xform_capability_check_modlen(capability,
362 				xform_tc.modex.modulus.length)) {
363 			snprintf(test_msg, ASYM_TEST_MSG_LEN,
364 				"line %u "
365 				"FAILED: %s", __LINE__,
366 				"Invalid MODULUS length specified");
367 			status = TEST_FAILED;
368 			goto error_exit;
369 		}
370 		break;
371 	case RTE_CRYPTO_ASYM_XFORM_MODINV:
372 		result = rte_zmalloc(NULL, data_tc->modinv.result_len, 0);
373 		xform_tc.modinv.modulus.data = data_tc->modinv.modulus.data;
374 		xform_tc.modinv.modulus.length = data_tc->modinv.modulus.len;
375 		memcpy(input, data_tc->modinv.base.data,
376 			data_tc->modinv.base.len);
377 		asym_op->modinv.base.data = input;
378 		asym_op->modinv.base.length = data_tc->modinv.base.len;
379 		asym_op->modinv.result.data = result;
380 		asym_op->modinv.result.length = data_tc->modinv.result_len;
381 		if (rte_cryptodev_asym_xform_capability_check_modlen(capability,
382 				xform_tc.modinv.modulus.length)) {
383 			snprintf(test_msg, ASYM_TEST_MSG_LEN,
384 				"line %u "
385 				"FAILED: %s", __LINE__,
386 				"Invalid MODULUS length specified");
387 			status = TEST_FAILED;
388 			goto error_exit;
389 		}
390 		break;
391 	case RTE_CRYPTO_ASYM_XFORM_RSA:
392 		result = rte_zmalloc(NULL, data_tc->rsa_data.n.len, 0);
393 		op->asym->rsa.op_type = type;
394 		xform_tc.rsa.e.data = data_tc->rsa_data.e.data;
395 		xform_tc.rsa.e.length = data_tc->rsa_data.e.len;
396 		xform_tc.rsa.n.data = data_tc->rsa_data.n.data;
397 		xform_tc.rsa.n.length = data_tc->rsa_data.n.len;
398 
399 		if (key_type == RTE_RSA_KEY_TYPE_EXP) {
400 			xform_tc.rsa.d.data = data_tc->rsa_data.d.data;
401 			xform_tc.rsa.d.length = data_tc->rsa_data.d.len;
402 		} else {
403 			xform_tc.rsa.qt.p.data = data_tc->rsa_data.p.data;
404 			xform_tc.rsa.qt.p.length = data_tc->rsa_data.p.len;
405 			xform_tc.rsa.qt.q.data = data_tc->rsa_data.q.data;
406 			xform_tc.rsa.qt.q.length = data_tc->rsa_data.q.len;
407 			xform_tc.rsa.qt.dP.data = data_tc->rsa_data.dP.data;
408 			xform_tc.rsa.qt.dP.length = data_tc->rsa_data.dP.len;
409 			xform_tc.rsa.qt.dQ.data = data_tc->rsa_data.dQ.data;
410 			xform_tc.rsa.qt.dQ.length = data_tc->rsa_data.dQ.len;
411 			xform_tc.rsa.qt.qInv.data = data_tc->rsa_data.qInv.data;
412 			xform_tc.rsa.qt.qInv.length = data_tc->rsa_data.qInv.len;
413 		}
414 
415 		xform_tc.rsa.key_type = key_type;
416 		op->asym->rsa.pad = data_tc->rsa_data.padding;
417 
418 		if (op->asym->rsa.op_type == RTE_CRYPTO_ASYM_OP_ENCRYPT) {
419 			asym_op->rsa.message.data = data_tc->rsa_data.pt.data;
420 			asym_op->rsa.message.length = data_tc->rsa_data.pt.len;
421 			asym_op->rsa.cipher.data = result;
422 			asym_op->rsa.cipher.length = data_tc->rsa_data.n.len;
423 		} else if (op->asym->rsa.op_type == RTE_CRYPTO_ASYM_OP_DECRYPT) {
424 			asym_op->rsa.message.data = result;
425 			asym_op->rsa.message.length = data_tc->rsa_data.n.len;
426 			asym_op->rsa.cipher.data = data_tc->rsa_data.ct.data;
427 			asym_op->rsa.cipher.length = data_tc->rsa_data.ct.len;
428 		} else if (op->asym->rsa.op_type == RTE_CRYPTO_ASYM_OP_SIGN) {
429 			asym_op->rsa.sign.data = result;
430 			asym_op->rsa.sign.length = data_tc->rsa_data.n.len;
431 			asym_op->rsa.message.data = data_tc->rsa_data.pt.data;
432 			asym_op->rsa.message.length = data_tc->rsa_data.pt.len;
433 		} else if (op->asym->rsa.op_type == RTE_CRYPTO_ASYM_OP_VERIFY) {
434 			asym_op->rsa.cipher.data = result;
435 			asym_op->rsa.cipher.length = data_tc->rsa_data.n.len;
436 			asym_op->rsa.sign.data = data_tc->rsa_data.sign.data;
437 			asym_op->rsa.sign.length = data_tc->rsa_data.sign.len;
438 		}
439 		break;
440 	case RTE_CRYPTO_ASYM_XFORM_DH:
441 	case RTE_CRYPTO_ASYM_XFORM_DSA:
442 	case RTE_CRYPTO_ASYM_XFORM_NONE:
443 	case RTE_CRYPTO_ASYM_XFORM_UNSPECIFIED:
444 	default:
445 		snprintf(test_msg, ASYM_TEST_MSG_LEN,
446 				"line %u "
447 				"FAILED: %s", __LINE__,
448 				"Invalid ASYM algorithm specified");
449 		status = TEST_FAILED;
450 		goto error_exit;
451 	}
452 
453 	if (!sessionless) {
454 		sess = rte_cryptodev_asym_session_create(ts_params->session_mpool);
455 		if (!sess) {
456 			snprintf(test_msg, ASYM_TEST_MSG_LEN,
457 					"line %u "
458 					"FAILED: %s", __LINE__,
459 					"Session creation failed");
460 			status = TEST_FAILED;
461 			goto error_exit;
462 		}
463 
464 		if (rte_cryptodev_asym_session_init(dev_id, sess, &xform_tc,
465 				ts_params->session_mpool) < 0) {
466 			snprintf(test_msg, ASYM_TEST_MSG_LEN,
467 					"line %u FAILED: %s",
468 					__LINE__, "unabled to config sym session");
469 			status = TEST_FAILED;
470 			goto error_exit;
471 		}
472 
473 		rte_crypto_op_attach_asym_session(op, sess);
474 	} else {
475 		asym_op->xform = &xform_tc;
476 		op->sess_type = RTE_CRYPTO_OP_SESSIONLESS;
477 	}
478 	RTE_LOG(DEBUG, USER1, "Process ASYM operation");
479 
480 	/* Process crypto operation */
481 	if (rte_cryptodev_enqueue_burst(dev_id, 0, &op, 1) != 1) {
482 		snprintf(test_msg, ASYM_TEST_MSG_LEN,
483 				"line %u FAILED: %s",
484 				__LINE__, "Error sending packet for operation");
485 		status = TEST_FAILED;
486 		goto error_exit;
487 	}
488 
489 	while (rte_cryptodev_dequeue_burst(dev_id, 0, &result_op, 1) == 0)
490 		rte_pause();
491 
492 	if (result_op == NULL) {
493 		snprintf(test_msg, ASYM_TEST_MSG_LEN,
494 				"line %u FAILED: %s",
495 				__LINE__, "Failed to process asym crypto op");
496 		status = TEST_FAILED;
497 		goto error_exit;
498 	}
499 
500 	if (test_cryptodev_asym_ver(op, &xform_tc, data_tc, result_op) != TEST_SUCCESS) {
501 		snprintf(test_msg, ASYM_TEST_MSG_LEN,
502 			"line %u FAILED: %s",
503 			__LINE__, "Verification failed ");
504 		status = TEST_FAILED;
505 		goto error_exit;
506 	}
507 
508 	if (!sessionless)
509 		snprintf(test_msg, ASYM_TEST_MSG_LEN, "PASS");
510 	else
511 		snprintf(test_msg, ASYM_TEST_MSG_LEN, "SESSIONLESS PASS");
512 
513 error_exit:
514 		if (sess != NULL) {
515 			rte_cryptodev_asym_session_clear(dev_id, sess);
516 			rte_cryptodev_asym_session_free(sess);
517 		}
518 
519 		if (op != NULL)
520 			rte_crypto_op_free(op);
521 
522 		if (result != NULL)
523 			rte_free(result);
524 
525 	return status;
526 }
527 
528 static int
529 test_one_case(const void *test_case, int sessionless)
530 {
531 	int status = TEST_SUCCESS, i = 0;
532 	char test_msg[ASYM_TEST_MSG_LEN + 1];
533 
534 	/* Map the case to union */
535 	union test_case_structure tc;
536 	memcpy(&tc, test_case, sizeof(tc));
537 
538 	if (tc.modex.xform_type == RTE_CRYPTO_ASYM_XFORM_MODEX
539 			|| tc.modex.xform_type == RTE_CRYPTO_ASYM_XFORM_MODINV) {
540 		status = test_cryptodev_asym_op(&testsuite_params, &tc, test_msg,
541 				sessionless, 0, 0);
542 		printf("  %u) TestCase %s %s\n", test_index++,
543 			tc.modex.description, test_msg);
544 	} else {
545 		for (i = 0; i < RTE_CRYPTO_ASYM_OP_LIST_END; i++) {
546 			if (tc.modex.xform_type == RTE_CRYPTO_ASYM_XFORM_RSA) {
547 				if (tc.rsa_data.op_type_flags & (1 << i)) {
548 					if (tc.rsa_data.key_exp) {
549 						status = test_cryptodev_asym_op(
550 							&testsuite_params, &tc,
551 							test_msg, sessionless, i,
552 							RTE_RSA_KEY_TYPE_EXP);
553 					}
554 					if (status)
555 						break;
556 					if (tc.rsa_data.key_qt && (i ==
557 							RTE_CRYPTO_ASYM_OP_DECRYPT ||
558 							i == RTE_CRYPTO_ASYM_OP_SIGN)) {
559 						status = test_cryptodev_asym_op(
560 							&testsuite_params,
561 							&tc, test_msg, sessionless, i,
562 							RTE_RSA_KET_TYPE_QT);
563 					}
564 					if (status)
565 						break;
566 				}
567 			}
568 		}
569 		printf("  %u) TestCase %s %s\n", test_index++,
570 			tc.modex.description, test_msg);
571 	}
572 
573 	return status;
574 }
575 
576 static int
577 load_test_vectors(void)
578 {
579 	uint32_t i = 0, v_size = 0;
580 	/* Load MODEX vector*/
581 	v_size = RTE_DIM(modex_test_case);
582 	for (i = 0; i < v_size; i++) {
583 		if (test_vector.size >= (TEST_VECTOR_SIZE)) {
584 			RTE_LOG(DEBUG, USER1,
585 				"TEST_VECTOR_SIZE too small\n");
586 			return -1;
587 		}
588 		test_vector.address[test_vector.size] = &modex_test_case[i];
589 		test_vector.size++;
590 	}
591 	/* Load MODINV vector*/
592 	v_size = RTE_DIM(modinv_test_case);
593 	for (i = 0; i < v_size; i++) {
594 		if (test_vector.size >= (TEST_VECTOR_SIZE)) {
595 			RTE_LOG(DEBUG, USER1,
596 				"TEST_VECTOR_SIZE too small\n");
597 			return -1;
598 		}
599 		test_vector.address[test_vector.size] = &modinv_test_case[i];
600 		test_vector.size++;
601 	}
602 	/* Load RSA vector*/
603 	v_size = RTE_DIM(rsa_test_case_list);
604 	for (i = 0; i < v_size; i++) {
605 		if (test_vector.size >= (TEST_VECTOR_SIZE)) {
606 			RTE_LOG(DEBUG, USER1,
607 				"TEST_VECTOR_SIZE too small\n");
608 			return -1;
609 		}
610 		test_vector.address[test_vector.size] = &rsa_test_case_list[i];
611 		test_vector.size++;
612 	}
613 	return 0;
614 }
615 
616 static int
617 test_one_by_one(void)
618 {
619 	int status = TEST_SUCCESS;
620 	struct crypto_testsuite_params *ts_params = &testsuite_params;
621 	uint32_t i = 0;
622 	uint8_t dev_id = ts_params->valid_devs[0];
623 	struct rte_cryptodev_info dev_info;
624 	int sessionless = 0;
625 
626 	rte_cryptodev_info_get(dev_id, &dev_info);
627 	if ((dev_info.feature_flags &
628 			RTE_CRYPTODEV_FF_ASYM_SESSIONLESS)) {
629 		sessionless = 1;
630 	}
631 
632 	/* Go through all test cases */
633 	test_index = 0;
634 	for (i = 0; i < test_vector.size; i++) {
635 		if (test_one_case(test_vector.address[i], 0) != TEST_SUCCESS)
636 			status = TEST_FAILED;
637 	}
638 	if (sessionless) {
639 		for (i = 0; i < test_vector.size; i++) {
640 			if (test_one_case(test_vector.address[i], 1)
641 					!= TEST_SUCCESS)
642 				status = TEST_FAILED;
643 		}
644 	}
645 
646 	TEST_ASSERT_EQUAL(status, 0, "Test failed");
647 	return status;
648 }
649 
650 static int
651 test_rsa_sign_verify(void)
652 {
653 	struct crypto_testsuite_params *ts_params = &testsuite_params;
654 	struct rte_mempool *sess_mpool = ts_params->session_mpool;
655 	uint8_t dev_id = ts_params->valid_devs[0];
656 	struct rte_cryptodev_asym_session *sess;
657 	struct rte_cryptodev_info dev_info;
658 	int status = TEST_SUCCESS;
659 
660 	/* Test case supports op with exponent key only,
661 	 * Check in PMD feature flag for RSA exponent key type support.
662 	 */
663 	rte_cryptodev_info_get(dev_id, &dev_info);
664 	if (!(dev_info.feature_flags &
665 				RTE_CRYPTODEV_FF_RSA_PRIV_OP_KEY_EXP)) {
666 		RTE_LOG(INFO, USER1, "Device doesn't support sign op with "
667 			"exponent key type. Test Skipped\n");
668 		return -ENOTSUP;
669 	}
670 
671 	sess = rte_cryptodev_asym_session_create(sess_mpool);
672 
673 	if (!sess) {
674 		RTE_LOG(ERR, USER1, "Session creation failed for "
675 			"sign_verify\n");
676 		return TEST_FAILED;
677 	}
678 
679 	if (rte_cryptodev_asym_session_init(dev_id, sess, &rsa_xform,
680 				sess_mpool) < 0) {
681 		RTE_LOG(ERR, USER1, "Unable to config asym session for "
682 			"sign_verify\n");
683 		status = TEST_FAILED;
684 		goto error_exit;
685 	}
686 
687 	status = queue_ops_rsa_sign_verify(sess);
688 
689 error_exit:
690 
691 	rte_cryptodev_asym_session_clear(dev_id, sess);
692 	rte_cryptodev_asym_session_free(sess);
693 
694 	TEST_ASSERT_EQUAL(status, 0, "Test failed");
695 
696 	return status;
697 }
698 
699 static int
700 test_rsa_enc_dec(void)
701 {
702 	struct crypto_testsuite_params *ts_params = &testsuite_params;
703 	struct rte_mempool *sess_mpool = ts_params->session_mpool;
704 	uint8_t dev_id = ts_params->valid_devs[0];
705 	struct rte_cryptodev_asym_session *sess;
706 	struct rte_cryptodev_info dev_info;
707 	int status = TEST_SUCCESS;
708 
709 	/* Test case supports op with exponent key only,
710 	 * Check in PMD feature flag for RSA exponent key type support.
711 	 */
712 	rte_cryptodev_info_get(dev_id, &dev_info);
713 	if (!(dev_info.feature_flags &
714 				RTE_CRYPTODEV_FF_RSA_PRIV_OP_KEY_EXP)) {
715 		RTE_LOG(INFO, USER1, "Device doesn't support decrypt op with "
716 			"exponent key type. Test skipped\n");
717 		return -ENOTSUP;
718 	}
719 
720 	sess = rte_cryptodev_asym_session_create(sess_mpool);
721 
722 	if (!sess) {
723 		RTE_LOG(ERR, USER1, "Session creation failed for enc_dec\n");
724 		return TEST_FAILED;
725 	}
726 
727 	if (rte_cryptodev_asym_session_init(dev_id, sess, &rsa_xform,
728 				sess_mpool) < 0) {
729 		RTE_LOG(ERR, USER1, "Unable to config asym session for "
730 			"enc_dec\n");
731 		status = TEST_FAILED;
732 		goto error_exit;
733 	}
734 
735 	status = queue_ops_rsa_enc_dec(sess);
736 
737 error_exit:
738 
739 	rte_cryptodev_asym_session_clear(dev_id, sess);
740 	rte_cryptodev_asym_session_free(sess);
741 
742 	TEST_ASSERT_EQUAL(status, 0, "Test failed");
743 
744 	return status;
745 }
746 
747 static int
748 test_rsa_sign_verify_crt(void)
749 {
750 	struct crypto_testsuite_params *ts_params = &testsuite_params;
751 	struct rte_mempool *sess_mpool = ts_params->session_mpool;
752 	uint8_t dev_id = ts_params->valid_devs[0];
753 	struct rte_cryptodev_asym_session *sess;
754 	struct rte_cryptodev_info dev_info;
755 	int status = TEST_SUCCESS;
756 
757 	/* Test case supports op with quintuple format key only,
758 	 * Check im PMD feature flag for RSA quintuple key type support.
759 	 */
760 	rte_cryptodev_info_get(dev_id, &dev_info);
761 	if (!(dev_info.feature_flags & RTE_CRYPTODEV_FF_RSA_PRIV_OP_KEY_QT)) {
762 		RTE_LOG(INFO, USER1, "Device doesn't support sign op with "
763 			"quintuple key type. Test skipped\n");
764 		return -ENOTSUP;
765 	}
766 
767 	sess = rte_cryptodev_asym_session_create(sess_mpool);
768 
769 	if (!sess) {
770 		RTE_LOG(ERR, USER1, "Session creation failed for "
771 			"sign_verify_crt\n");
772 		status = TEST_FAILED;
773 		return status;
774 	}
775 
776 	if (rte_cryptodev_asym_session_init(dev_id, sess, &rsa_xform_crt,
777 				sess_mpool) < 0) {
778 		RTE_LOG(ERR, USER1, "Unable to config asym session for "
779 			"sign_verify_crt\n");
780 		status = TEST_FAILED;
781 		goto error_exit;
782 	}
783 	status = queue_ops_rsa_sign_verify(sess);
784 
785 error_exit:
786 
787 	rte_cryptodev_asym_session_clear(dev_id, sess);
788 	rte_cryptodev_asym_session_free(sess);
789 
790 	TEST_ASSERT_EQUAL(status, 0, "Test failed");
791 
792 	return status;
793 }
794 
795 static int
796 test_rsa_enc_dec_crt(void)
797 {
798 	struct crypto_testsuite_params *ts_params = &testsuite_params;
799 	struct rte_mempool *sess_mpool = ts_params->session_mpool;
800 	uint8_t dev_id = ts_params->valid_devs[0];
801 	struct rte_cryptodev_asym_session *sess;
802 	struct rte_cryptodev_info dev_info;
803 	int status = TEST_SUCCESS;
804 
805 	/* Test case supports op with quintuple format key only,
806 	 * Check in PMD feature flag for RSA quintuple key type support.
807 	 */
808 	rte_cryptodev_info_get(dev_id, &dev_info);
809 	if (!(dev_info.feature_flags & RTE_CRYPTODEV_FF_RSA_PRIV_OP_KEY_QT)) {
810 		RTE_LOG(INFO, USER1, "Device doesn't support decrypt op with "
811 			"quintuple key type. Test skipped\n");
812 		return -ENOTSUP;
813 	}
814 
815 	sess = rte_cryptodev_asym_session_create(sess_mpool);
816 
817 	if (!sess) {
818 		RTE_LOG(ERR, USER1, "Session creation failed for "
819 			"enc_dec_crt\n");
820 		return TEST_FAILED;
821 	}
822 
823 	if (rte_cryptodev_asym_session_init(dev_id, sess, &rsa_xform_crt,
824 				sess_mpool) < 0) {
825 		RTE_LOG(ERR, USER1, "Unable to config asym session for "
826 			"enc_dec_crt\n");
827 		status = TEST_FAILED;
828 		goto error_exit;
829 	}
830 	status = queue_ops_rsa_enc_dec(sess);
831 
832 error_exit:
833 
834 	rte_cryptodev_asym_session_clear(dev_id, sess);
835 	rte_cryptodev_asym_session_free(sess);
836 
837 	TEST_ASSERT_EQUAL(status, 0, "Test failed");
838 
839 	return status;
840 }
841 
842 static int
843 testsuite_setup(void)
844 {
845 	struct crypto_testsuite_params *ts_params = &testsuite_params;
846 	uint8_t valid_devs[RTE_CRYPTO_MAX_DEVS];
847 	struct rte_cryptodev_info info;
848 	int ret, dev_id = -1;
849 	uint32_t i, nb_devs;
850 	uint16_t qp_id;
851 
852 	memset(ts_params, 0, sizeof(*ts_params));
853 
854 	test_vector.size = 0;
855 	load_test_vectors();
856 
857 	ts_params->op_mpool = rte_crypto_op_pool_create(
858 			"CRYPTO_ASYM_OP_POOL",
859 			RTE_CRYPTO_OP_TYPE_ASYMMETRIC,
860 			TEST_NUM_BUFS, 0,
861 			0,
862 			rte_socket_id());
863 	if (ts_params->op_mpool == NULL) {
864 		RTE_LOG(ERR, USER1, "Can't create ASYM_CRYPTO_OP_POOL\n");
865 		return TEST_FAILED;
866 	}
867 
868 	/* Create an OPENSSL device if required */
869 	if (gbl_driver_id == rte_cryptodev_driver_id_get(
870 			RTE_STR(CRYPTODEV_NAME_OPENSSL_PMD))) {
871 		nb_devs = rte_cryptodev_device_count_by_driver(
872 				rte_cryptodev_driver_id_get(
873 				RTE_STR(CRYPTODEV_NAME_OPENSSL_PMD)));
874 		if (nb_devs < 1) {
875 			ret = rte_vdev_init(
876 				RTE_STR(CRYPTODEV_NAME_OPENSSL_PMD),
877 				NULL);
878 
879 			TEST_ASSERT(ret == 0, "Failed to create "
880 				"instance of pmd : %s",
881 				RTE_STR(CRYPTODEV_NAME_OPENSSL_PMD));
882 		}
883 	}
884 
885 	/* Get list of valid crypto devs */
886 	nb_devs = rte_cryptodev_devices_get(
887 				rte_cryptodev_driver_name_get(gbl_driver_id),
888 				valid_devs, RTE_CRYPTO_MAX_DEVS);
889 	if (nb_devs < 1) {
890 		RTE_LOG(ERR, USER1, "No crypto devices found?\n");
891 		return TEST_FAILED;
892 	}
893 
894 	/*
895 	 * Get first valid asymmetric device found in test suite param and
896 	 * break
897 	 */
898 	for (i = 0; i < nb_devs ; i++) {
899 		rte_cryptodev_info_get(valid_devs[i], &info);
900 		if (info.feature_flags & RTE_CRYPTODEV_FF_ASYMMETRIC_CRYPTO) {
901 			dev_id = ts_params->valid_devs[0] = valid_devs[i];
902 			break;
903 		}
904 	}
905 
906 	if (dev_id == -1) {
907 		RTE_LOG(ERR, USER1, "Device doesn't support asymmetric. "
908 			"Test skipped.\n");
909 		return TEST_FAILED;
910 	}
911 
912 	/* Set valid device count */
913 	ts_params->valid_dev_count = nb_devs;
914 
915 	/* configure device with num qp */
916 	ts_params->conf.nb_queue_pairs = info.max_nb_queue_pairs;
917 	ts_params->conf.socket_id = SOCKET_ID_ANY;
918 	ts_params->conf.ff_disable = RTE_CRYPTODEV_FF_SECURITY |
919 			RTE_CRYPTODEV_FF_SYMMETRIC_CRYPTO;
920 	TEST_ASSERT_SUCCESS(rte_cryptodev_configure(dev_id,
921 			&ts_params->conf),
922 			"Failed to configure cryptodev %u with %u qps",
923 			dev_id, ts_params->conf.nb_queue_pairs);
924 
925 	/* configure qp */
926 	ts_params->qp_conf.nb_descriptors = DEFAULT_NUM_OPS_INFLIGHT;
927 	ts_params->qp_conf.mp_session = ts_params->session_mpool;
928 	ts_params->qp_conf.mp_session_private = ts_params->session_mpool;
929 	for (qp_id = 0; qp_id < info.max_nb_queue_pairs; qp_id++) {
930 		TEST_ASSERT_SUCCESS(rte_cryptodev_queue_pair_setup(
931 			dev_id, qp_id, &ts_params->qp_conf,
932 			rte_cryptodev_socket_id(dev_id)),
933 			"Failed to setup queue pair %u on cryptodev %u ASYM",
934 			qp_id, dev_id);
935 	}
936 
937 	/* setup asym session pool */
938 	unsigned int session_size =
939 		rte_cryptodev_asym_get_private_session_size(dev_id);
940 	/*
941 	 * Create mempool with TEST_NUM_SESSIONS * 2,
942 	 * to include the session headers
943 	 */
944 	ts_params->session_mpool = rte_mempool_create(
945 				"test_asym_sess_mp",
946 				TEST_NUM_SESSIONS * 2,
947 				session_size,
948 				0, 0, NULL, NULL, NULL,
949 				NULL, SOCKET_ID_ANY,
950 				0);
951 
952 	TEST_ASSERT_NOT_NULL(ts_params->session_mpool,
953 			"session mempool allocation failed");
954 
955 	return TEST_SUCCESS;
956 }
957 
958 static void
959 testsuite_teardown(void)
960 {
961 	struct crypto_testsuite_params *ts_params = &testsuite_params;
962 
963 	if (ts_params->op_mpool != NULL) {
964 		RTE_LOG(DEBUG, USER1, "CRYPTO_OP_POOL count %u\n",
965 		rte_mempool_avail_count(ts_params->op_mpool));
966 	}
967 
968 	/* Free session mempools */
969 	if (ts_params->session_mpool != NULL) {
970 		rte_mempool_free(ts_params->session_mpool);
971 		ts_params->session_mpool = NULL;
972 	}
973 }
974 
975 static int
976 ut_setup(void)
977 {
978 	struct crypto_testsuite_params *ts_params = &testsuite_params;
979 
980 	uint16_t qp_id;
981 
982 	/* Reconfigure device to default parameters */
983 	ts_params->conf.socket_id = SOCKET_ID_ANY;
984 
985 	TEST_ASSERT_SUCCESS(rte_cryptodev_configure(ts_params->valid_devs[0],
986 			&ts_params->conf),
987 			"Failed to configure cryptodev %u",
988 			ts_params->valid_devs[0]);
989 
990 	for (qp_id = 0; qp_id < ts_params->conf.nb_queue_pairs ; qp_id++) {
991 		TEST_ASSERT_SUCCESS(rte_cryptodev_queue_pair_setup(
992 			ts_params->valid_devs[0], qp_id,
993 			&ts_params->qp_conf,
994 			rte_cryptodev_socket_id(ts_params->valid_devs[0])),
995 			"Failed to setup queue pair %u on cryptodev %u",
996 			qp_id, ts_params->valid_devs[0]);
997 	}
998 
999 	rte_cryptodev_stats_reset(ts_params->valid_devs[0]);
1000 
1001 	/* Start the device */
1002 	TEST_ASSERT_SUCCESS(rte_cryptodev_start(ts_params->valid_devs[0]),
1003 						"Failed to start cryptodev %u",
1004 						ts_params->valid_devs[0]);
1005 
1006 	return TEST_SUCCESS;
1007 }
1008 
1009 static void
1010 ut_teardown(void)
1011 {
1012 	struct crypto_testsuite_params *ts_params = &testsuite_params;
1013 	struct rte_cryptodev_stats stats;
1014 
1015 	rte_cryptodev_stats_get(ts_params->valid_devs[0], &stats);
1016 
1017 	/* Stop the device */
1018 	rte_cryptodev_stop(ts_params->valid_devs[0]);
1019 }
1020 
1021 static inline void print_asym_capa(
1022 		const struct rte_cryptodev_asymmetric_xform_capability *capa)
1023 {
1024 	int i = 0;
1025 
1026 	printf("\nxform type: %s\n===================\n",
1027 			rte_crypto_asym_xform_strings[capa->xform_type]);
1028 	printf("operation supported -");
1029 
1030 	for (i = 0; i < RTE_CRYPTO_ASYM_OP_LIST_END; i++) {
1031 		/* check supported operations */
1032 		if (rte_cryptodev_asym_xform_capability_check_optype(capa, i))
1033 			printf(" %s",
1034 					rte_crypto_asym_op_strings[i]);
1035 		}
1036 		switch (capa->xform_type) {
1037 		case RTE_CRYPTO_ASYM_XFORM_RSA:
1038 		case RTE_CRYPTO_ASYM_XFORM_MODINV:
1039 		case RTE_CRYPTO_ASYM_XFORM_MODEX:
1040 		case RTE_CRYPTO_ASYM_XFORM_DH:
1041 		case RTE_CRYPTO_ASYM_XFORM_DSA:
1042 			printf(" modlen: min %d max %d increment %d",
1043 					capa->modlen.min,
1044 					capa->modlen.max,
1045 					capa->modlen.increment);
1046 		break;
1047 		case RTE_CRYPTO_ASYM_XFORM_ECDSA:
1048 		case RTE_CRYPTO_ASYM_XFORM_ECPM:
1049 		default:
1050 			break;
1051 		}
1052 		printf("\n");
1053 }
1054 
1055 static int
1056 test_capability(void)
1057 {
1058 	struct crypto_testsuite_params *ts_params = &testsuite_params;
1059 	uint8_t dev_id = ts_params->valid_devs[0];
1060 	struct rte_cryptodev_info dev_info;
1061 	const struct rte_cryptodev_capabilities *dev_capa;
1062 	int i = 0;
1063 	struct rte_cryptodev_asym_capability_idx idx;
1064 	const struct rte_cryptodev_asymmetric_xform_capability *capa;
1065 
1066 	rte_cryptodev_info_get(dev_id, &dev_info);
1067 	if (!(dev_info.feature_flags &
1068 				RTE_CRYPTODEV_FF_ASYMMETRIC_CRYPTO)) {
1069 		RTE_LOG(INFO, USER1,
1070 				"Device doesn't support asymmetric. Test Skipped\n");
1071 		return TEST_SUCCESS;
1072 	}
1073 
1074 	/* print xform capability */
1075 	for (i = 0;
1076 		dev_info.capabilities[i].op != RTE_CRYPTO_OP_TYPE_UNDEFINED;
1077 		i++) {
1078 		dev_capa = &(dev_info.capabilities[i]);
1079 		if (dev_info.capabilities[i].op ==
1080 				RTE_CRYPTO_OP_TYPE_ASYMMETRIC) {
1081 			idx.type = dev_capa->asym.xform_capa.xform_type;
1082 
1083 			capa = rte_cryptodev_asym_capability_get(dev_id,
1084 				(const struct
1085 				rte_cryptodev_asym_capability_idx *) &idx);
1086 			print_asym_capa(capa);
1087 			}
1088 	}
1089 	return TEST_SUCCESS;
1090 }
1091 
1092 static int
1093 test_dh_gen_shared_sec(struct rte_crypto_asym_xform *xfrm)
1094 {
1095 	struct crypto_testsuite_params *ts_params = &testsuite_params;
1096 	struct rte_mempool *op_mpool = ts_params->op_mpool;
1097 	struct rte_mempool *sess_mpool = ts_params->session_mpool;
1098 	uint8_t dev_id = ts_params->valid_devs[0];
1099 	struct rte_crypto_asym_op *asym_op = NULL;
1100 	struct rte_crypto_op *op = NULL, *result_op = NULL;
1101 	struct rte_cryptodev_asym_session *sess = NULL;
1102 	int status = TEST_SUCCESS;
1103 	uint8_t output[TEST_DH_MOD_LEN];
1104 	struct rte_crypto_asym_xform xform = *xfrm;
1105 	uint8_t peer[] = "01234567890123456789012345678901234567890123456789";
1106 
1107 	sess = rte_cryptodev_asym_session_create(sess_mpool);
1108 	if (sess == NULL) {
1109 		RTE_LOG(ERR, USER1,
1110 				"line %u FAILED: %s", __LINE__,
1111 				"Session creation failed");
1112 		status = TEST_FAILED;
1113 		goto error_exit;
1114 	}
1115 	/* set up crypto op data structure */
1116 	op = rte_crypto_op_alloc(op_mpool, RTE_CRYPTO_OP_TYPE_ASYMMETRIC);
1117 	if (!op) {
1118 		RTE_LOG(ERR, USER1,
1119 			"line %u FAILED: %s",
1120 			__LINE__, "Failed to allocate asymmetric crypto "
1121 			"operation struct");
1122 		status = TEST_FAILED;
1123 		goto error_exit;
1124 	}
1125 	asym_op = op->asym;
1126 
1127 	/* Setup a xform and op to generate private key only */
1128 	xform.dh.type = RTE_CRYPTO_ASYM_OP_SHARED_SECRET_COMPUTE;
1129 	xform.next = NULL;
1130 	asym_op->dh.priv_key.data = dh_test_params.priv_key.data;
1131 	asym_op->dh.priv_key.length = dh_test_params.priv_key.length;
1132 	asym_op->dh.pub_key.data = (uint8_t *)peer;
1133 	asym_op->dh.pub_key.length = sizeof(peer);
1134 	asym_op->dh.shared_secret.data = output;
1135 	asym_op->dh.shared_secret.length = sizeof(output);
1136 
1137 	if (rte_cryptodev_asym_session_init(dev_id, sess, &xform,
1138 			sess_mpool) < 0) {
1139 		RTE_LOG(ERR, USER1,
1140 				"line %u FAILED: %s",
1141 				__LINE__, "unabled to config sym session");
1142 		status = TEST_FAILED;
1143 		goto error_exit;
1144 	}
1145 
1146 	/* attach asymmetric crypto session to crypto operations */
1147 	rte_crypto_op_attach_asym_session(op, sess);
1148 
1149 	RTE_LOG(DEBUG, USER1, "Process ASYM operation");
1150 
1151 	/* Process crypto operation */
1152 	if (rte_cryptodev_enqueue_burst(dev_id, 0, &op, 1) != 1) {
1153 		RTE_LOG(ERR, USER1,
1154 			"line %u FAILED: %s",
1155 			__LINE__, "Error sending packet for operation");
1156 		status = TEST_FAILED;
1157 		goto error_exit;
1158 	}
1159 
1160 	while (rte_cryptodev_dequeue_burst(dev_id, 0, &result_op, 1) == 0)
1161 		rte_pause();
1162 
1163 	if (result_op == NULL) {
1164 		RTE_LOG(ERR, USER1,
1165 			"line %u FAILED: %s",
1166 			__LINE__, "Failed to process asym crypto op");
1167 		status = TEST_FAILED;
1168 		goto error_exit;
1169 	}
1170 
1171 	debug_hexdump(stdout, "shared secret:",
1172 			asym_op->dh.shared_secret.data,
1173 			asym_op->dh.shared_secret.length);
1174 
1175 error_exit:
1176 	if (sess != NULL) {
1177 		rte_cryptodev_asym_session_clear(dev_id, sess);
1178 		rte_cryptodev_asym_session_free(sess);
1179 	}
1180 	if (op != NULL)
1181 		rte_crypto_op_free(op);
1182 	return status;
1183 }
1184 
1185 static int
1186 test_dh_gen_priv_key(struct rte_crypto_asym_xform *xfrm)
1187 {
1188 	struct crypto_testsuite_params *ts_params = &testsuite_params;
1189 	struct rte_mempool *op_mpool = ts_params->op_mpool;
1190 	struct rte_mempool *sess_mpool = ts_params->session_mpool;
1191 	uint8_t dev_id = ts_params->valid_devs[0];
1192 	struct rte_crypto_asym_op *asym_op = NULL;
1193 	struct rte_crypto_op *op = NULL, *result_op = NULL;
1194 	struct rte_cryptodev_asym_session *sess = NULL;
1195 	int status = TEST_SUCCESS;
1196 	uint8_t output[TEST_DH_MOD_LEN];
1197 	struct rte_crypto_asym_xform xform = *xfrm;
1198 
1199 	sess = rte_cryptodev_asym_session_create(sess_mpool);
1200 	if (sess == NULL) {
1201 		RTE_LOG(ERR, USER1,
1202 				 "line %u FAILED: %s", __LINE__,
1203 				"Session creation failed");
1204 		status = TEST_FAILED;
1205 		goto error_exit;
1206 	}
1207 	/* set up crypto op data structure */
1208 	op = rte_crypto_op_alloc(op_mpool, RTE_CRYPTO_OP_TYPE_ASYMMETRIC);
1209 	if (!op) {
1210 		RTE_LOG(ERR, USER1,
1211 			"line %u FAILED: %s",
1212 			__LINE__, "Failed to allocate asymmetric crypto "
1213 			"operation struct");
1214 		status = TEST_FAILED;
1215 		goto error_exit;
1216 	}
1217 	asym_op = op->asym;
1218 
1219 	/* Setup a xform and op to generate private key only */
1220 	xform.dh.type = RTE_CRYPTO_ASYM_OP_PRIVATE_KEY_GENERATE;
1221 	xform.next = NULL;
1222 	asym_op->dh.priv_key.data = output;
1223 	asym_op->dh.priv_key.length = sizeof(output);
1224 
1225 	if (rte_cryptodev_asym_session_init(dev_id, sess, &xform,
1226 			sess_mpool) < 0) {
1227 		RTE_LOG(ERR, USER1,
1228 				"line %u FAILED: %s",
1229 				__LINE__, "unabled to config sym session");
1230 		status = TEST_FAILED;
1231 		goto error_exit;
1232 	}
1233 
1234 	/* attach asymmetric crypto session to crypto operations */
1235 	rte_crypto_op_attach_asym_session(op, sess);
1236 
1237 	RTE_LOG(DEBUG, USER1, "Process ASYM operation");
1238 
1239 	/* Process crypto operation */
1240 	if (rte_cryptodev_enqueue_burst(dev_id, 0, &op, 1) != 1) {
1241 		RTE_LOG(ERR, USER1,
1242 			"line %u FAILED: %s",
1243 			__LINE__, "Error sending packet for operation");
1244 		status = TEST_FAILED;
1245 		goto error_exit;
1246 	}
1247 
1248 	while (rte_cryptodev_dequeue_burst(dev_id, 0, &result_op, 1) == 0)
1249 		rte_pause();
1250 
1251 	if (result_op == NULL) {
1252 		RTE_LOG(ERR, USER1,
1253 			"line %u FAILED: %s",
1254 			__LINE__, "Failed to process asym crypto op");
1255 		status = TEST_FAILED;
1256 		goto error_exit;
1257 	}
1258 
1259 	debug_hexdump(stdout, "private key:",
1260 			asym_op->dh.priv_key.data,
1261 			asym_op->dh.priv_key.length);
1262 
1263 
1264 error_exit:
1265 	if (sess != NULL) {
1266 		rte_cryptodev_asym_session_clear(dev_id, sess);
1267 		rte_cryptodev_asym_session_free(sess);
1268 	}
1269 	if (op != NULL)
1270 		rte_crypto_op_free(op);
1271 
1272 	return status;
1273 }
1274 
1275 
1276 static int
1277 test_dh_gen_pub_key(struct rte_crypto_asym_xform *xfrm)
1278 {
1279 	struct crypto_testsuite_params *ts_params = &testsuite_params;
1280 	struct rte_mempool *op_mpool = ts_params->op_mpool;
1281 	struct rte_mempool *sess_mpool = ts_params->session_mpool;
1282 	uint8_t dev_id = ts_params->valid_devs[0];
1283 	struct rte_crypto_asym_op *asym_op = NULL;
1284 	struct rte_crypto_op *op = NULL, *result_op = NULL;
1285 	struct rte_cryptodev_asym_session *sess = NULL;
1286 	int status = TEST_SUCCESS;
1287 	uint8_t output[TEST_DH_MOD_LEN];
1288 	struct rte_crypto_asym_xform xform = *xfrm;
1289 
1290 	sess = rte_cryptodev_asym_session_create(sess_mpool);
1291 	if (sess == NULL) {
1292 		RTE_LOG(ERR, USER1,
1293 				 "line %u FAILED: %s", __LINE__,
1294 				"Session creation failed");
1295 		status = TEST_FAILED;
1296 		goto error_exit;
1297 	}
1298 	/* set up crypto op data structure */
1299 	op = rte_crypto_op_alloc(op_mpool, RTE_CRYPTO_OP_TYPE_ASYMMETRIC);
1300 	if (!op) {
1301 		RTE_LOG(ERR, USER1,
1302 			"line %u FAILED: %s",
1303 			__LINE__, "Failed to allocate asymmetric crypto "
1304 			"operation struct");
1305 		status = TEST_FAILED;
1306 		goto error_exit;
1307 	}
1308 	asym_op = op->asym;
1309 	/* Setup a xform chain to generate public key
1310 	 * using test private key
1311 	 *
1312 	 */
1313 	xform.dh.type = RTE_CRYPTO_ASYM_OP_PUBLIC_KEY_GENERATE;
1314 	xform.next = NULL;
1315 
1316 	asym_op->dh.pub_key.data = output;
1317 	asym_op->dh.pub_key.length = sizeof(output);
1318 	/* load pre-defined private key */
1319 	asym_op->dh.priv_key.data = rte_malloc(NULL,
1320 					dh_test_params.priv_key.length,
1321 					0);
1322 	asym_op->dh.priv_key = dh_test_params.priv_key;
1323 
1324 	if (rte_cryptodev_asym_session_init(dev_id, sess, &xform,
1325 			sess_mpool) < 0) {
1326 		RTE_LOG(ERR, USER1,
1327 				"line %u FAILED: %s",
1328 				__LINE__, "unabled to config sym session");
1329 		status = TEST_FAILED;
1330 		goto error_exit;
1331 	}
1332 
1333 	/* attach asymmetric crypto session to crypto operations */
1334 	rte_crypto_op_attach_asym_session(op, sess);
1335 
1336 	RTE_LOG(DEBUG, USER1, "Process ASYM operation");
1337 
1338 	/* Process crypto operation */
1339 	if (rte_cryptodev_enqueue_burst(dev_id, 0, &op, 1) != 1) {
1340 		RTE_LOG(ERR, USER1,
1341 			"line %u FAILED: %s",
1342 			__LINE__, "Error sending packet for operation");
1343 		status = TEST_FAILED;
1344 		goto error_exit;
1345 	}
1346 
1347 	while (rte_cryptodev_dequeue_burst(dev_id, 0, &result_op, 1) == 0)
1348 		rte_pause();
1349 
1350 	if (result_op == NULL) {
1351 		RTE_LOG(ERR, USER1,
1352 			"line %u FAILED: %s",
1353 			__LINE__, "Failed to process asym crypto op");
1354 		status = TEST_FAILED;
1355 		goto error_exit;
1356 	}
1357 
1358 	debug_hexdump(stdout, "pub key:",
1359 			asym_op->dh.pub_key.data, asym_op->dh.pub_key.length);
1360 
1361 	debug_hexdump(stdout, "priv key:",
1362 			asym_op->dh.priv_key.data, asym_op->dh.priv_key.length);
1363 
1364 error_exit:
1365 	if (sess != NULL) {
1366 		rte_cryptodev_asym_session_clear(dev_id, sess);
1367 		rte_cryptodev_asym_session_free(sess);
1368 	}
1369 	if (op != NULL)
1370 		rte_crypto_op_free(op);
1371 
1372 	return status;
1373 }
1374 
1375 static int
1376 test_dh_gen_kp(struct rte_crypto_asym_xform *xfrm)
1377 {
1378 	struct crypto_testsuite_params *ts_params = &testsuite_params;
1379 	struct rte_mempool *op_mpool = ts_params->op_mpool;
1380 	struct rte_mempool *sess_mpool = ts_params->session_mpool;
1381 	uint8_t dev_id = ts_params->valid_devs[0];
1382 	struct rte_crypto_asym_op *asym_op = NULL;
1383 	struct rte_crypto_op *op = NULL, *result_op = NULL;
1384 	struct rte_cryptodev_asym_session *sess = NULL;
1385 	int status = TEST_SUCCESS;
1386 	uint8_t out_pub_key[TEST_DH_MOD_LEN];
1387 	uint8_t out_prv_key[TEST_DH_MOD_LEN];
1388 	struct rte_crypto_asym_xform pub_key_xform;
1389 	struct rte_crypto_asym_xform xform = *xfrm;
1390 
1391 	sess = rte_cryptodev_asym_session_create(sess_mpool);
1392 	if (sess == NULL) {
1393 		RTE_LOG(ERR, USER1,
1394 				 "line %u FAILED: %s", __LINE__,
1395 				"Session creation failed");
1396 		status = TEST_FAILED;
1397 		goto error_exit;
1398 	}
1399 
1400 	/* set up crypto op data structure */
1401 	op = rte_crypto_op_alloc(op_mpool, RTE_CRYPTO_OP_TYPE_ASYMMETRIC);
1402 	if (!op) {
1403 		RTE_LOG(ERR, USER1,
1404 			"line %u FAILED: %s",
1405 			__LINE__, "Failed to allocate asymmetric crypto "
1406 			"operation struct");
1407 		status = TEST_FAILED;
1408 		goto error_exit;
1409 	}
1410 	asym_op = op->asym;
1411 	/* Setup a xform chain to generate
1412 	 * private key first followed by
1413 	 * public key
1414 	 */xform.dh.type = RTE_CRYPTO_ASYM_OP_PRIVATE_KEY_GENERATE;
1415 	pub_key_xform.xform_type = RTE_CRYPTO_ASYM_XFORM_DH;
1416 	pub_key_xform.dh.type = RTE_CRYPTO_ASYM_OP_PUBLIC_KEY_GENERATE;
1417 	xform.next = &pub_key_xform;
1418 
1419 	asym_op->dh.pub_key.data = out_pub_key;
1420 	asym_op->dh.pub_key.length = sizeof(out_pub_key);
1421 	asym_op->dh.priv_key.data = out_prv_key;
1422 	asym_op->dh.priv_key.length = sizeof(out_prv_key);
1423 	if (rte_cryptodev_asym_session_init(dev_id, sess, &xform,
1424 			sess_mpool) < 0) {
1425 		RTE_LOG(ERR, USER1,
1426 				"line %u FAILED: %s",
1427 				__LINE__, "unabled to config sym session");
1428 		status = TEST_FAILED;
1429 		goto error_exit;
1430 	}
1431 
1432 	/* attach asymmetric crypto session to crypto operations */
1433 	rte_crypto_op_attach_asym_session(op, sess);
1434 
1435 	RTE_LOG(DEBUG, USER1, "Process ASYM operation");
1436 
1437 	/* Process crypto operation */
1438 	if (rte_cryptodev_enqueue_burst(dev_id, 0, &op, 1) != 1) {
1439 		RTE_LOG(ERR, USER1,
1440 			"line %u FAILED: %s",
1441 			__LINE__, "Error sending packet for operation");
1442 		status = TEST_FAILED;
1443 		goto error_exit;
1444 	}
1445 
1446 	while (rte_cryptodev_dequeue_burst(dev_id, 0, &result_op, 1) == 0)
1447 		rte_pause();
1448 
1449 	if (result_op == NULL) {
1450 		RTE_LOG(ERR, USER1,
1451 			"line %u FAILED: %s",
1452 			__LINE__, "Failed to process asym crypto op");
1453 		status = TEST_FAILED;
1454 		goto error_exit;
1455 	}
1456 	debug_hexdump(stdout, "priv key:",
1457 			out_prv_key, asym_op->dh.priv_key.length);
1458 	debug_hexdump(stdout, "pub key:",
1459 			out_pub_key, asym_op->dh.pub_key.length);
1460 
1461 error_exit:
1462 	if (sess != NULL) {
1463 		rte_cryptodev_asym_session_clear(dev_id, sess);
1464 		rte_cryptodev_asym_session_free(sess);
1465 	}
1466 	if (op != NULL)
1467 		rte_crypto_op_free(op);
1468 
1469 	return status;
1470 }
1471 
1472 static int
1473 test_mod_inv(void)
1474 {
1475 	struct crypto_testsuite_params *ts_params = &testsuite_params;
1476 	struct rte_mempool *op_mpool = ts_params->op_mpool;
1477 	struct rte_mempool *sess_mpool = ts_params->session_mpool;
1478 	uint8_t dev_id = ts_params->valid_devs[0];
1479 	struct rte_crypto_asym_op *asym_op = NULL;
1480 	struct rte_crypto_op *op = NULL, *result_op = NULL;
1481 	struct rte_cryptodev_asym_session *sess = NULL;
1482 	int status = TEST_SUCCESS;
1483 	struct rte_cryptodev_asym_capability_idx cap_idx;
1484 	const struct rte_cryptodev_asymmetric_xform_capability *capability;
1485 	uint8_t input[TEST_DATA_SIZE] = {0};
1486 	int ret = 0;
1487 	uint8_t result[sizeof(mod_p)] = { 0 };
1488 
1489 	if (rte_cryptodev_asym_get_xform_enum(
1490 		&modinv_xform.xform_type, "modinv") < 0) {
1491 		RTE_LOG(ERR, USER1,
1492 				 "Invalid ASYM algorithm specified\n");
1493 		return -1;
1494 	}
1495 
1496 	cap_idx.type = modinv_xform.xform_type;
1497 	capability = rte_cryptodev_asym_capability_get(dev_id,
1498 					&cap_idx);
1499 
1500 	if (capability == NULL) {
1501 		RTE_LOG(INFO, USER1,
1502 			"Device doesn't support MOD INV. Test Skipped\n");
1503 		return -ENOTSUP;
1504 	}
1505 
1506 	if (rte_cryptodev_asym_xform_capability_check_modlen(
1507 		capability,
1508 		modinv_xform.modinv.modulus.length)) {
1509 		RTE_LOG(ERR, USER1,
1510 				 "Invalid MODULUS length specified\n");
1511 				return -ENOTSUP;
1512 		}
1513 
1514 	sess = rte_cryptodev_asym_session_create(sess_mpool);
1515 	if (!sess) {
1516 		RTE_LOG(ERR, USER1, "line %u "
1517 				"FAILED: %s", __LINE__,
1518 				"Session creation failed");
1519 		status = TEST_FAILED;
1520 		goto error_exit;
1521 	}
1522 
1523 	if (rte_cryptodev_asym_session_init(dev_id, sess, &modinv_xform,
1524 			sess_mpool) < 0) {
1525 		RTE_LOG(ERR, USER1,
1526 				"line %u FAILED: %s",
1527 				__LINE__, "unabled to config sym session");
1528 		status = TEST_FAILED;
1529 		goto error_exit;
1530 	}
1531 
1532 	/* generate crypto op data structure */
1533 	op = rte_crypto_op_alloc(op_mpool, RTE_CRYPTO_OP_TYPE_ASYMMETRIC);
1534 	if (!op) {
1535 		RTE_LOG(ERR, USER1,
1536 			"line %u FAILED: %s",
1537 			__LINE__, "Failed to allocate asymmetric crypto "
1538 			"operation struct");
1539 		status = TEST_FAILED;
1540 		goto error_exit;
1541 	}
1542 
1543 	asym_op = op->asym;
1544 	memcpy(input, base, sizeof(base));
1545 	asym_op->modinv.base.data = input;
1546 	asym_op->modinv.base.length = sizeof(base);
1547 	asym_op->modinv.result.data = result;
1548 	asym_op->modinv.result.length = sizeof(result);
1549 
1550 	/* attach asymmetric crypto session to crypto operations */
1551 	rte_crypto_op_attach_asym_session(op, sess);
1552 
1553 	RTE_LOG(DEBUG, USER1, "Process ASYM operation");
1554 
1555 	/* Process crypto operation */
1556 	if (rte_cryptodev_enqueue_burst(dev_id, 0, &op, 1) != 1) {
1557 		RTE_LOG(ERR, USER1,
1558 			"line %u FAILED: %s",
1559 			__LINE__, "Error sending packet for operation");
1560 		status = TEST_FAILED;
1561 		goto error_exit;
1562 	}
1563 
1564 	while (rte_cryptodev_dequeue_burst(dev_id, 0, &result_op, 1) == 0)
1565 		rte_pause();
1566 
1567 	if (result_op == NULL) {
1568 		RTE_LOG(ERR, USER1,
1569 				"line %u FAILED: %s",
1570 				__LINE__, "Failed to process asym crypto op");
1571 		status = TEST_FAILED;
1572 		goto error_exit;
1573 	}
1574 
1575 	ret = verify_modinv(mod_inv, result_op);
1576 	if (ret) {
1577 		RTE_LOG(ERR, USER1,
1578 			 "operation verification failed\n");
1579 		status = TEST_FAILED;
1580 	}
1581 
1582 error_exit:
1583 	if (sess) {
1584 		rte_cryptodev_asym_session_clear(dev_id, sess);
1585 		rte_cryptodev_asym_session_free(sess);
1586 	}
1587 
1588 	if (op)
1589 		rte_crypto_op_free(op);
1590 
1591 	TEST_ASSERT_EQUAL(status, 0, "Test failed");
1592 
1593 	return status;
1594 }
1595 
1596 static int
1597 test_mod_exp(void)
1598 {
1599 	struct crypto_testsuite_params *ts_params = &testsuite_params;
1600 	struct rte_mempool *op_mpool = ts_params->op_mpool;
1601 	struct rte_mempool *sess_mpool = ts_params->session_mpool;
1602 	uint8_t dev_id = ts_params->valid_devs[0];
1603 	struct rte_crypto_asym_op *asym_op = NULL;
1604 	struct rte_crypto_op *op = NULL, *result_op = NULL;
1605 	struct rte_cryptodev_asym_session *sess = NULL;
1606 	int status = TEST_SUCCESS;
1607 	struct rte_cryptodev_asym_capability_idx cap_idx;
1608 	const struct rte_cryptodev_asymmetric_xform_capability *capability;
1609 	uint8_t input[TEST_DATA_SIZE] = {0};
1610 	int ret = 0;
1611 	uint8_t result[sizeof(mod_p)] = { 0 };
1612 
1613 	if (rte_cryptodev_asym_get_xform_enum(&modex_xform.xform_type,
1614 		"modexp")
1615 		< 0) {
1616 		RTE_LOG(ERR, USER1,
1617 				"Invalid ASYM algorithm specified\n");
1618 		return -1;
1619 	}
1620 
1621 	/* check for modlen capability */
1622 	cap_idx.type = modex_xform.xform_type;
1623 	capability = rte_cryptodev_asym_capability_get(dev_id, &cap_idx);
1624 
1625 	if (capability == NULL) {
1626 		RTE_LOG(INFO, USER1,
1627 			"Device doesn't support MOD EXP. Test Skipped\n");
1628 		return -ENOTSUP;
1629 	}
1630 
1631 	if (rte_cryptodev_asym_xform_capability_check_modlen(
1632 			capability, modex_xform.modex.modulus.length)) {
1633 		RTE_LOG(ERR, USER1,
1634 				"Invalid MODULUS length specified\n");
1635 				return -ENOTSUP;
1636 		}
1637 
1638 	/* generate crypto op data structure */
1639 	op = rte_crypto_op_alloc(op_mpool, RTE_CRYPTO_OP_TYPE_ASYMMETRIC);
1640 	if (!op) {
1641 		RTE_LOG(ERR, USER1,
1642 			"line %u FAILED: %s",
1643 			__LINE__, "Failed to allocate asymmetric crypto "
1644 			"operation struct");
1645 		status = TEST_FAILED;
1646 		goto error_exit;
1647 	}
1648 
1649 	sess = rte_cryptodev_asym_session_create(sess_mpool);
1650 	if (!sess) {
1651 		RTE_LOG(ERR, USER1,
1652 				 "line %u "
1653 				"FAILED: %s", __LINE__,
1654 				"Session creation failed");
1655 		status = TEST_FAILED;
1656 		goto error_exit;
1657 	}
1658 
1659 	if (rte_cryptodev_asym_session_init(dev_id, sess, &modex_xform,
1660 			sess_mpool) < 0) {
1661 		RTE_LOG(ERR, USER1,
1662 				"line %u FAILED: %s",
1663 				__LINE__, "unabled to config sym session");
1664 		status = TEST_FAILED;
1665 		goto error_exit;
1666 	}
1667 
1668 	asym_op = op->asym;
1669 	memcpy(input, base, sizeof(base));
1670 	asym_op->modex.base.data = input;
1671 	asym_op->modex.base.length = sizeof(base);
1672 	asym_op->modex.result.data = result;
1673 	asym_op->modex.result.length = sizeof(result);
1674 	/* attach asymmetric crypto session to crypto operations */
1675 	rte_crypto_op_attach_asym_session(op, sess);
1676 
1677 	RTE_LOG(DEBUG, USER1, "Process ASYM operation");
1678 	/* Process crypto operation */
1679 	if (rte_cryptodev_enqueue_burst(dev_id, 0, &op, 1) != 1) {
1680 		RTE_LOG(ERR, USER1,
1681 				"line %u FAILED: %s",
1682 				__LINE__, "Error sending packet for operation");
1683 		status = TEST_FAILED;
1684 		goto error_exit;
1685 	}
1686 
1687 	while (rte_cryptodev_dequeue_burst(dev_id, 0, &result_op, 1) == 0)
1688 		rte_pause();
1689 
1690 	if (result_op == NULL) {
1691 		RTE_LOG(ERR, USER1,
1692 				"line %u FAILED: %s",
1693 				__LINE__, "Failed to process asym crypto op");
1694 		status = TEST_FAILED;
1695 		goto error_exit;
1696 	}
1697 
1698 	ret = verify_modexp(mod_exp, result_op);
1699 	if (ret) {
1700 		RTE_LOG(ERR, USER1,
1701 			 "operation verification failed\n");
1702 		status = TEST_FAILED;
1703 	}
1704 
1705 error_exit:
1706 	if (sess != NULL) {
1707 		rte_cryptodev_asym_session_clear(dev_id, sess);
1708 		rte_cryptodev_asym_session_free(sess);
1709 	}
1710 
1711 	if (op != NULL)
1712 		rte_crypto_op_free(op);
1713 
1714 	TEST_ASSERT_EQUAL(status, 0, "Test failed");
1715 
1716 	return status;
1717 }
1718 
1719 static int
1720 test_dh_keygenration(void)
1721 {
1722 	int status;
1723 
1724 	debug_hexdump(stdout, "p:", dh_xform.dh.p.data, dh_xform.dh.p.length);
1725 	debug_hexdump(stdout, "g:", dh_xform.dh.g.data, dh_xform.dh.g.length);
1726 	debug_hexdump(stdout, "priv_key:", dh_test_params.priv_key.data,
1727 			dh_test_params.priv_key.length);
1728 
1729 	RTE_LOG(INFO, USER1,
1730 		"Test Public and Private key pair generation\n");
1731 
1732 	status = test_dh_gen_kp(&dh_xform);
1733 	TEST_ASSERT_EQUAL(status, 0, "Test failed");
1734 
1735 	RTE_LOG(INFO, USER1,
1736 		"Test Public Key Generation using pre-defined priv key\n");
1737 
1738 	status = test_dh_gen_pub_key(&dh_xform);
1739 	TEST_ASSERT_EQUAL(status, 0, "Test failed");
1740 
1741 	RTE_LOG(INFO, USER1,
1742 		"Test Private Key Generation only\n");
1743 
1744 	status = test_dh_gen_priv_key(&dh_xform);
1745 	TEST_ASSERT_EQUAL(status, 0, "Test failed");
1746 
1747 	RTE_LOG(INFO, USER1,
1748 		"Test shared secret compute\n");
1749 
1750 	status = test_dh_gen_shared_sec(&dh_xform);
1751 	TEST_ASSERT_EQUAL(status, 0, "Test failed");
1752 
1753 	return status;
1754 }
1755 
1756 static int
1757 test_dsa_sign(void)
1758 {
1759 	struct crypto_testsuite_params *ts_params = &testsuite_params;
1760 	struct rte_mempool *op_mpool = ts_params->op_mpool;
1761 	struct rte_mempool *sess_mpool = ts_params->session_mpool;
1762 	uint8_t dev_id = ts_params->valid_devs[0];
1763 	struct rte_crypto_asym_op *asym_op = NULL;
1764 	struct rte_crypto_op *op = NULL, *result_op = NULL;
1765 	struct rte_cryptodev_asym_session *sess = NULL;
1766 	int status = TEST_SUCCESS;
1767 	uint8_t r[TEST_DH_MOD_LEN];
1768 	uint8_t s[TEST_DH_MOD_LEN];
1769 	uint8_t dgst[] = "35d81554afaad2cf18f3a1770d5fedc4ea5be344";
1770 
1771 	sess = rte_cryptodev_asym_session_create(sess_mpool);
1772 	if (sess == NULL) {
1773 		RTE_LOG(ERR, USER1,
1774 				 "line %u FAILED: %s", __LINE__,
1775 				"Session creation failed");
1776 		status = TEST_FAILED;
1777 		goto error_exit;
1778 	}
1779 	/* set up crypto op data structure */
1780 	op = rte_crypto_op_alloc(op_mpool, RTE_CRYPTO_OP_TYPE_ASYMMETRIC);
1781 	if (!op) {
1782 		RTE_LOG(ERR, USER1,
1783 			"line %u FAILED: %s",
1784 			__LINE__, "Failed to allocate asymmetric crypto "
1785 			"operation struct");
1786 		status = TEST_FAILED;
1787 		goto error_exit;
1788 	}
1789 	asym_op = op->asym;
1790 
1791 	debug_hexdump(stdout, "p: ", dsa_xform.dsa.p.data,
1792 			dsa_xform.dsa.p.length);
1793 	debug_hexdump(stdout, "q: ", dsa_xform.dsa.q.data,
1794 			dsa_xform.dsa.q.length);
1795 	debug_hexdump(stdout, "g: ", dsa_xform.dsa.g.data,
1796 			dsa_xform.dsa.g.length);
1797 	debug_hexdump(stdout, "priv_key: ", dsa_xform.dsa.x.data,
1798 			dsa_xform.dsa.x.length);
1799 
1800 	if (rte_cryptodev_asym_session_init(dev_id, sess, &dsa_xform,
1801 				sess_mpool) < 0) {
1802 		RTE_LOG(ERR, USER1,
1803 				"line %u FAILED: %s",
1804 				__LINE__, "unabled to config sym session");
1805 		status = TEST_FAILED;
1806 		goto error_exit;
1807 	}
1808 
1809 	/* attach asymmetric crypto session to crypto operations */
1810 	rte_crypto_op_attach_asym_session(op, sess);
1811 	asym_op->dsa.op_type = RTE_CRYPTO_ASYM_OP_SIGN;
1812 	asym_op->dsa.message.data = dgst;
1813 	asym_op->dsa.message.length = sizeof(dgst);
1814 	asym_op->dsa.r.length = sizeof(r);
1815 	asym_op->dsa.r.data = r;
1816 	asym_op->dsa.s.length = sizeof(s);
1817 	asym_op->dsa.s.data = s;
1818 
1819 	RTE_LOG(DEBUG, USER1, "Process ASYM operation");
1820 
1821 	/* Process crypto operation */
1822 	if (rte_cryptodev_enqueue_burst(dev_id, 0, &op, 1) != 1) {
1823 		RTE_LOG(ERR, USER1,
1824 			"line %u FAILED: %s",
1825 			__LINE__, "Error sending packet for operation");
1826 		status = TEST_FAILED;
1827 		goto error_exit;
1828 	}
1829 
1830 	while (rte_cryptodev_dequeue_burst(dev_id, 0, &result_op, 1) == 0)
1831 		rte_pause();
1832 
1833 	if (result_op == NULL) {
1834 		RTE_LOG(ERR, USER1,
1835 			"line %u FAILED: %s",
1836 			__LINE__, "Failed to process asym crypto op");
1837 		status = TEST_FAILED;
1838 		goto error_exit;
1839 	}
1840 
1841 	asym_op = result_op->asym;
1842 
1843 	debug_hexdump(stdout, "r:",
1844 			asym_op->dsa.r.data, asym_op->dsa.r.length);
1845 	debug_hexdump(stdout, "s:",
1846 			asym_op->dsa.s.data, asym_op->dsa.s.length);
1847 
1848 	/* Test PMD DSA sign verification using signer public key */
1849 	asym_op->dsa.op_type = RTE_CRYPTO_ASYM_OP_VERIFY;
1850 
1851 	/* copy signer public key */
1852 	asym_op->dsa.y.data = dsa_test_params.y.data;
1853 	asym_op->dsa.y.length = dsa_test_params.y.length;
1854 
1855 	/* Process crypto operation */
1856 	if (rte_cryptodev_enqueue_burst(dev_id, 0, &op, 1) != 1) {
1857 		RTE_LOG(ERR, USER1,
1858 			"line %u FAILED: %s",
1859 			__LINE__, "Error sending packet for operation");
1860 		status = TEST_FAILED;
1861 		goto error_exit;
1862 	}
1863 
1864 	while (rte_cryptodev_dequeue_burst(dev_id, 0, &result_op, 1) == 0)
1865 		rte_pause();
1866 
1867 	if (result_op == NULL) {
1868 		RTE_LOG(ERR, USER1,
1869 			"line %u FAILED: %s",
1870 			__LINE__, "Failed to process asym crypto op");
1871 		status = TEST_FAILED;
1872 		goto error_exit;
1873 	}
1874 
1875 	if (result_op->status != RTE_CRYPTO_OP_STATUS_SUCCESS) {
1876 		RTE_LOG(ERR, USER1,
1877 				"line %u FAILED: %s",
1878 				__LINE__, "Failed to process asym crypto op");
1879 		status = TEST_FAILED;
1880 	}
1881 error_exit:
1882 	if (sess != NULL) {
1883 		rte_cryptodev_asym_session_clear(dev_id, sess);
1884 		rte_cryptodev_asym_session_free(sess);
1885 	}
1886 	if (op != NULL)
1887 		rte_crypto_op_free(op);
1888 	return status;
1889 }
1890 
1891 static int
1892 test_dsa(void)
1893 {
1894 	int status;
1895 	status = test_dsa_sign();
1896 	TEST_ASSERT_EQUAL(status, 0, "Test failed");
1897 	return status;
1898 }
1899 
1900 static int
1901 test_ecdsa_sign_verify(enum curve curve_id)
1902 {
1903 	struct crypto_testsuite_params *ts_params = &testsuite_params;
1904 	struct rte_mempool *sess_mpool = ts_params->session_mpool;
1905 	struct rte_mempool *op_mpool = ts_params->op_mpool;
1906 	struct crypto_testsuite_ecdsa_params input_params;
1907 	struct rte_cryptodev_asym_session *sess = NULL;
1908 	uint8_t dev_id = ts_params->valid_devs[0];
1909 	struct rte_crypto_op *result_op = NULL;
1910 	uint8_t output_buf_r[TEST_DATA_SIZE];
1911 	uint8_t output_buf_s[TEST_DATA_SIZE];
1912 	struct rte_crypto_asym_xform xform;
1913 	struct rte_crypto_asym_op *asym_op;
1914 	struct rte_cryptodev_info dev_info;
1915 	struct rte_crypto_op *op = NULL;
1916 	int status = TEST_SUCCESS, ret;
1917 
1918 	switch (curve_id) {
1919 	case SECP192R1:
1920 		input_params = ecdsa_param_secp192r1;
1921 		break;
1922 	case SECP224R1:
1923 		input_params = ecdsa_param_secp224r1;
1924 		break;
1925 	case SECP256R1:
1926 		input_params = ecdsa_param_secp256r1;
1927 		break;
1928 	case SECP384R1:
1929 		input_params = ecdsa_param_secp384r1;
1930 		break;
1931 	case SECP521R1:
1932 		input_params = ecdsa_param_secp521r1;
1933 		break;
1934 	default:
1935 		RTE_LOG(ERR, USER1,
1936 				"line %u FAILED: %s", __LINE__,
1937 				"Unsupported curve id\n");
1938 		status = TEST_FAILED;
1939 		goto exit;
1940 	}
1941 
1942 	rte_cryptodev_info_get(dev_id, &dev_info);
1943 
1944 	sess = rte_cryptodev_asym_session_create(sess_mpool);
1945 	if (sess == NULL) {
1946 		RTE_LOG(ERR, USER1,
1947 				"line %u FAILED: %s", __LINE__,
1948 				"Session creation failed\n");
1949 		status = TEST_FAILED;
1950 		goto exit;
1951 	}
1952 
1953 	/* Setup crypto op data structure */
1954 	op = rte_crypto_op_alloc(op_mpool, RTE_CRYPTO_OP_TYPE_ASYMMETRIC);
1955 	if (op == NULL) {
1956 		RTE_LOG(ERR, USER1,
1957 				"line %u FAILED: %s", __LINE__,
1958 				"Failed to allocate asymmetric crypto "
1959 				"operation struct\n");
1960 		status = TEST_FAILED;
1961 		goto exit;
1962 	}
1963 	asym_op = op->asym;
1964 
1965 	/* Setup asym xform */
1966 	xform.next = NULL;
1967 	xform.xform_type = RTE_CRYPTO_ASYM_XFORM_ECDSA;
1968 	xform.ec.curve_id = input_params.curve;
1969 
1970 	if (rte_cryptodev_asym_session_init(dev_id, sess, &xform,
1971 				sess_mpool) < 0) {
1972 		RTE_LOG(ERR, USER1,
1973 				"line %u FAILED: %s", __LINE__,
1974 				"Unable to config asym session\n");
1975 		status = TEST_FAILED;
1976 		goto exit;
1977 	}
1978 
1979 	/* Attach asymmetric crypto session to crypto operations */
1980 	rte_crypto_op_attach_asym_session(op, sess);
1981 
1982 	/* Compute sign */
1983 
1984 	/* Populate op with operational details */
1985 	op->asym->ecdsa.op_type = RTE_CRYPTO_ASYM_OP_SIGN;
1986 	op->asym->ecdsa.message.data = input_params.digest.data;
1987 	op->asym->ecdsa.message.length = input_params.digest.length;
1988 	op->asym->ecdsa.k.data = input_params.scalar.data;
1989 	op->asym->ecdsa.k.length = input_params.scalar.length;
1990 	op->asym->ecdsa.pkey.data = input_params.pkey.data;
1991 	op->asym->ecdsa.pkey.length = input_params.pkey.length;
1992 
1993 	/* Init out buf */
1994 	op->asym->ecdsa.r.data = output_buf_r;
1995 	op->asym->ecdsa.s.data = output_buf_s;
1996 
1997 	RTE_LOG(DEBUG, USER1, "Process ASYM operation\n");
1998 
1999 	/* Process crypto operation */
2000 	if (rte_cryptodev_enqueue_burst(dev_id, 0, &op, 1) != 1) {
2001 		RTE_LOG(ERR, USER1,
2002 				"line %u FAILED: %s", __LINE__,
2003 				"Error sending packet for operation\n");
2004 		status = TEST_FAILED;
2005 		goto exit;
2006 	}
2007 
2008 	while (rte_cryptodev_dequeue_burst(dev_id, 0, &result_op, 1) == 0)
2009 		rte_pause();
2010 
2011 	if (result_op == NULL) {
2012 		RTE_LOG(ERR, USER1,
2013 				"line %u FAILED: %s", __LINE__,
2014 				"Failed to process asym crypto op\n");
2015 		status = TEST_FAILED;
2016 		goto exit;
2017 	}
2018 
2019 	if (result_op->status != RTE_CRYPTO_OP_STATUS_SUCCESS) {
2020 		RTE_LOG(ERR, USER1,
2021 				"line %u FAILED: %s", __LINE__,
2022 				"Failed to process asym crypto op\n");
2023 		status = TEST_FAILED;
2024 		goto exit;
2025 	}
2026 
2027 	asym_op = result_op->asym;
2028 
2029 	debug_hexdump(stdout, "r:",
2030 			asym_op->ecdsa.r.data, asym_op->ecdsa.r.length);
2031 	debug_hexdump(stdout, "s:",
2032 			asym_op->ecdsa.s.data, asym_op->ecdsa.s.length);
2033 
2034 	ret = verify_ecdsa_sign(input_params.sign_r.data,
2035 				input_params.sign_s.data, result_op);
2036 	if (ret) {
2037 		status = TEST_FAILED;
2038 		RTE_LOG(ERR, USER1,
2039 				"line %u FAILED: %s", __LINE__,
2040 				"ECDSA sign failed.\n");
2041 		goto exit;
2042 	}
2043 
2044 	/* Verify sign */
2045 
2046 	/* Populate op with operational details */
2047 	op->asym->ecdsa.op_type = RTE_CRYPTO_ASYM_OP_VERIFY;
2048 	op->asym->ecdsa.q.x.data = input_params.pubkey_qx.data;
2049 	op->asym->ecdsa.q.x.length = input_params.pubkey_qx.length;
2050 	op->asym->ecdsa.q.y.data = input_params.pubkey_qy.data;
2051 	op->asym->ecdsa.q.y.length = input_params.pubkey_qx.length;
2052 	op->asym->ecdsa.r.data = asym_op->ecdsa.r.data;
2053 	op->asym->ecdsa.r.length = asym_op->ecdsa.r.length;
2054 	op->asym->ecdsa.s.data = asym_op->ecdsa.s.data;
2055 	op->asym->ecdsa.s.length = asym_op->ecdsa.s.length;
2056 
2057 	/* Enqueue sign result for verify */
2058 	if (rte_cryptodev_enqueue_burst(dev_id, 0, &op, 1) != 1) {
2059 		status = TEST_FAILED;
2060 		RTE_LOG(ERR, USER1,
2061 				"line %u FAILED: %s", __LINE__,
2062 				"Error sending packet for operation\n");
2063 		goto exit;
2064 	}
2065 
2066 	while (rte_cryptodev_dequeue_burst(dev_id, 0, &result_op, 1) == 0)
2067 		rte_pause();
2068 
2069 	if (result_op == NULL) {
2070 		status = TEST_FAILED;
2071 		goto exit;
2072 	}
2073 	if (result_op->status != RTE_CRYPTO_OP_STATUS_SUCCESS) {
2074 		status = TEST_FAILED;
2075 		RTE_LOG(ERR, USER1,
2076 				"line %u FAILED: %s", __LINE__,
2077 				"ECDSA verify failed.\n");
2078 		goto exit;
2079 	}
2080 
2081 exit:
2082 	if (sess != NULL) {
2083 		rte_cryptodev_asym_session_clear(dev_id, sess);
2084 		rte_cryptodev_asym_session_free(sess);
2085 	}
2086 	if (op != NULL)
2087 		rte_crypto_op_free(op);
2088 	return status;
2089 };
2090 
2091 static int
2092 test_ecdsa_sign_verify_all_curve(void)
2093 {
2094 	int status, overall_status = TEST_SUCCESS;
2095 	enum curve curve_id;
2096 	int test_index = 0;
2097 	const char *msg;
2098 
2099 	for (curve_id = SECP192R1; curve_id < END_OF_CURVE_LIST; curve_id++) {
2100 		status = test_ecdsa_sign_verify(curve_id);
2101 		if (status == TEST_SUCCESS) {
2102 			msg = "succeeded";
2103 		} else {
2104 			msg = "failed";
2105 			overall_status = status;
2106 		}
2107 		printf("  %u) TestCase Sign/Veriy Curve %s  %s\n",
2108 		       test_index ++, curve[curve_id], msg);
2109 	}
2110 	return overall_status;
2111 }
2112 
2113 static int
2114 test_ecpm(enum curve curve_id)
2115 {
2116 	struct crypto_testsuite_params *ts_params = &testsuite_params;
2117 	struct rte_mempool *sess_mpool = ts_params->session_mpool;
2118 	struct rte_mempool *op_mpool = ts_params->op_mpool;
2119 	struct crypto_testsuite_ecpm_params input_params;
2120 	struct rte_cryptodev_asym_session *sess = NULL;
2121 	uint8_t dev_id = ts_params->valid_devs[0];
2122 	struct rte_crypto_op *result_op = NULL;
2123 	uint8_t output_buf_x[TEST_DATA_SIZE];
2124 	uint8_t output_buf_y[TEST_DATA_SIZE];
2125 	struct rte_crypto_asym_xform xform;
2126 	struct rte_crypto_asym_op *asym_op;
2127 	struct rte_cryptodev_info dev_info;
2128 	struct rte_crypto_op *op = NULL;
2129 	int status = TEST_SUCCESS, ret;
2130 
2131 	switch (curve_id) {
2132 	case SECP192R1:
2133 		input_params = ecpm_param_secp192r1;
2134 		break;
2135 	case SECP224R1:
2136 		input_params = ecpm_param_secp224r1;
2137 		break;
2138 	case SECP256R1:
2139 		input_params = ecpm_param_secp256r1;
2140 		break;
2141 	case SECP384R1:
2142 		input_params = ecpm_param_secp384r1;
2143 		break;
2144 	case SECP521R1:
2145 		input_params = ecpm_param_secp521r1;
2146 		break;
2147 	default:
2148 		RTE_LOG(ERR, USER1,
2149 				"line %u FAILED: %s", __LINE__,
2150 				"Unsupported curve id\n");
2151 		status = TEST_FAILED;
2152 		goto exit;
2153 	}
2154 
2155 	rte_cryptodev_info_get(dev_id, &dev_info);
2156 
2157 	sess = rte_cryptodev_asym_session_create(sess_mpool);
2158 	if (sess == NULL) {
2159 		RTE_LOG(ERR, USER1,
2160 				"line %u FAILED: %s", __LINE__,
2161 				"Session creation failed\n");
2162 		status = TEST_FAILED;
2163 		goto exit;
2164 	}
2165 
2166 	/* Setup crypto op data structure */
2167 	op = rte_crypto_op_alloc(op_mpool, RTE_CRYPTO_OP_TYPE_ASYMMETRIC);
2168 	if (op == NULL) {
2169 		RTE_LOG(ERR, USER1,
2170 				"line %u FAILED: %s", __LINE__,
2171 				"Failed to allocate asymmetric crypto "
2172 				"operation struct\n");
2173 		status = TEST_FAILED;
2174 		goto exit;
2175 	}
2176 	asym_op = op->asym;
2177 
2178 	/* Setup asym xform */
2179 	xform.next = NULL;
2180 	xform.xform_type = RTE_CRYPTO_ASYM_XFORM_ECPM;
2181 	xform.ec.curve_id = input_params.curve;
2182 
2183 	if (rte_cryptodev_asym_session_init(dev_id, sess, &xform,
2184 				sess_mpool) < 0) {
2185 		RTE_LOG(ERR, USER1,
2186 				"line %u FAILED: %s", __LINE__,
2187 				"Unable to config asym session\n");
2188 		status = TEST_FAILED;
2189 		goto exit;
2190 	}
2191 
2192 	/* Attach asymmetric crypto session to crypto operations */
2193 	rte_crypto_op_attach_asym_session(op, sess);
2194 
2195 	/* Populate op with operational details */
2196 	op->asym->ecpm.p.x.data = input_params.gen_x.data;
2197 	op->asym->ecpm.p.x.length = input_params.gen_x.length;
2198 	op->asym->ecpm.p.y.data = input_params.gen_y.data;
2199 	op->asym->ecpm.p.y.length = input_params.gen_y.length;
2200 	op->asym->ecpm.scalar.data = input_params.privkey.data;
2201 	op->asym->ecpm.scalar.length = input_params.privkey.length;
2202 
2203 	/* Init out buf */
2204 	op->asym->ecpm.r.x.data = output_buf_x;
2205 	op->asym->ecpm.r.y.data = output_buf_y;
2206 
2207 	RTE_LOG(DEBUG, USER1, "Process ASYM operation\n");
2208 
2209 	/* Process crypto operation */
2210 	if (rte_cryptodev_enqueue_burst(dev_id, 0, &op, 1) != 1) {
2211 		RTE_LOG(ERR, USER1,
2212 				"line %u FAILED: %s", __LINE__,
2213 				"Error sending packet for operation\n");
2214 		status = TEST_FAILED;
2215 		goto exit;
2216 	}
2217 
2218 	while (rte_cryptodev_dequeue_burst(dev_id, 0, &result_op, 1) == 0)
2219 		rte_pause();
2220 
2221 	if (result_op == NULL) {
2222 		RTE_LOG(ERR, USER1,
2223 				"line %u FAILED: %s", __LINE__,
2224 				"Failed to process asym crypto op\n");
2225 		status = TEST_FAILED;
2226 		goto exit;
2227 	}
2228 
2229 	if (result_op->status != RTE_CRYPTO_OP_STATUS_SUCCESS) {
2230 		RTE_LOG(ERR, USER1,
2231 				"line %u FAILED: %s", __LINE__,
2232 				"Failed to process asym crypto op\n");
2233 		status = TEST_FAILED;
2234 		goto exit;
2235 	}
2236 
2237 	asym_op = result_op->asym;
2238 
2239 	debug_hexdump(stdout, "r x:",
2240 			asym_op->ecpm.r.x.data, asym_op->ecpm.r.x.length);
2241 	debug_hexdump(stdout, "r y:",
2242 			asym_op->ecpm.r.y.data, asym_op->ecpm.r.y.length);
2243 
2244 	ret = verify_ecpm(input_params.pubkey_x.data,
2245 				input_params.pubkey_y.data, result_op);
2246 	if (ret) {
2247 		status = TEST_FAILED;
2248 		RTE_LOG(ERR, USER1,
2249 				"line %u FAILED: %s", __LINE__,
2250 				"EC Point Multiplication failed.\n");
2251 		goto exit;
2252 	}
2253 
2254 exit:
2255 	if (sess != NULL) {
2256 		rte_cryptodev_asym_session_clear(dev_id, sess);
2257 		rte_cryptodev_asym_session_free(sess);
2258 	}
2259 	if (op != NULL)
2260 		rte_crypto_op_free(op);
2261 	return status;
2262 }
2263 
2264 static int
2265 test_ecpm_all_curve(void)
2266 {
2267 	int status, overall_status = TEST_SUCCESS;
2268 	enum curve curve_id;
2269 	int test_index = 0;
2270 	const char *msg;
2271 
2272 	for (curve_id = SECP192R1; curve_id < END_OF_CURVE_LIST; curve_id++) {
2273 		status = test_ecpm(curve_id);
2274 		if (status == TEST_SUCCESS) {
2275 			msg = "succeeded";
2276 		} else {
2277 			msg = "failed";
2278 			overall_status = status;
2279 		}
2280 		printf("  %u) TestCase EC Point Mul Curve %s  %s\n",
2281 		       test_index ++, curve[curve_id], msg);
2282 	}
2283 	return overall_status;
2284 }
2285 
2286 static struct unit_test_suite cryptodev_openssl_asym_testsuite  = {
2287 	.suite_name = "Crypto Device OPENSSL ASYM Unit Test Suite",
2288 	.setup = testsuite_setup,
2289 	.teardown = testsuite_teardown,
2290 	.unit_test_cases = {
2291 		TEST_CASE_ST(ut_setup, ut_teardown, test_capability),
2292 		TEST_CASE_ST(ut_setup, ut_teardown, test_dsa),
2293 		TEST_CASE_ST(ut_setup, ut_teardown, test_dh_keygenration),
2294 		TEST_CASE_ST(ut_setup, ut_teardown, test_rsa_enc_dec),
2295 		TEST_CASE_ST(ut_setup, ut_teardown, test_rsa_sign_verify),
2296 		TEST_CASE_ST(ut_setup, ut_teardown, test_rsa_enc_dec_crt),
2297 		TEST_CASE_ST(ut_setup, ut_teardown, test_rsa_sign_verify_crt),
2298 		TEST_CASE_ST(ut_setup, ut_teardown, test_mod_inv),
2299 		TEST_CASE_ST(ut_setup, ut_teardown, test_mod_exp),
2300 		TEST_CASE_ST(ut_setup, ut_teardown, test_one_by_one),
2301 		TEST_CASES_END() /**< NULL terminate unit test array */
2302 	}
2303 };
2304 
2305 static struct unit_test_suite cryptodev_qat_asym_testsuite  = {
2306 	.suite_name = "Crypto Device QAT ASYM Unit Test Suite",
2307 	.setup = testsuite_setup,
2308 	.teardown = testsuite_teardown,
2309 	.unit_test_cases = {
2310 		TEST_CASE_ST(ut_setup, ut_teardown, test_one_by_one),
2311 		TEST_CASES_END() /**< NULL terminate unit test array */
2312 	}
2313 };
2314 
2315 static struct unit_test_suite cryptodev_octeontx_asym_testsuite  = {
2316 	.suite_name = "Crypto Device OCTEONTX ASYM Unit Test Suite",
2317 	.setup = testsuite_setup,
2318 	.teardown = testsuite_teardown,
2319 	.unit_test_cases = {
2320 		TEST_CASE_ST(ut_setup, ut_teardown, test_capability),
2321 		TEST_CASE_ST(ut_setup, ut_teardown, test_rsa_enc_dec_crt),
2322 		TEST_CASE_ST(ut_setup, ut_teardown, test_rsa_sign_verify_crt),
2323 		TEST_CASE_ST(ut_setup, ut_teardown, test_mod_exp),
2324 		TEST_CASE_ST(ut_setup, ut_teardown,
2325 			     test_ecdsa_sign_verify_all_curve),
2326 		TEST_CASE_ST(ut_setup, ut_teardown, test_ecpm_all_curve),
2327 		TEST_CASES_END() /**< NULL terminate unit test array */
2328 	}
2329 };
2330 
2331 static int
2332 test_cryptodev_openssl_asym(void)
2333 {
2334 	gbl_driver_id = rte_cryptodev_driver_id_get(
2335 			RTE_STR(CRYPTODEV_NAME_OPENSSL_PMD));
2336 
2337 	if (gbl_driver_id == -1) {
2338 		RTE_LOG(ERR, USER1, "OPENSSL PMD must be loaded. Check if "
2339 				"CONFIG_RTE_LIBRTE_PMD_OPENSSL is enabled "
2340 				"in config file to run this testsuite.\n");
2341 		return TEST_FAILED;
2342 	}
2343 
2344 	return unit_test_suite_runner(&cryptodev_openssl_asym_testsuite);
2345 }
2346 
2347 static int
2348 test_cryptodev_qat_asym(void)
2349 {
2350 	gbl_driver_id = rte_cryptodev_driver_id_get(
2351 			RTE_STR(CRYPTODEV_NAME_QAT_ASYM_PMD));
2352 
2353 	if (gbl_driver_id == -1) {
2354 		RTE_LOG(ERR, USER1, "QAT PMD must be loaded. Check if "
2355 				    "CONFIG_RTE_LIBRTE_PMD_QAT_ASYM is enabled "
2356 				    "in config file to run this testsuite.\n");
2357 		return TEST_FAILED;
2358 	}
2359 
2360 	return unit_test_suite_runner(&cryptodev_qat_asym_testsuite);
2361 }
2362 
2363 static int
2364 test_cryptodev_octeontx_asym(void)
2365 {
2366 	gbl_driver_id = rte_cryptodev_driver_id_get(
2367 			RTE_STR(CRYPTODEV_NAME_OCTEONTX_SYM_PMD));
2368 	if (gbl_driver_id == -1) {
2369 		RTE_LOG(ERR, USER1, "OCTEONTX PMD must be loaded. Check if "
2370 				"CONFIG_RTE_LIBRTE_PMD_OCTEONTX_CRYPTO is "
2371 				"enabled in config file to run this "
2372 				"testsuite.\n");
2373 		return TEST_FAILED;
2374 	}
2375 	return unit_test_suite_runner(&cryptodev_octeontx_asym_testsuite);
2376 }
2377 
2378 static int
2379 test_cryptodev_octeontx2_asym(void)
2380 {
2381 	gbl_driver_id = rte_cryptodev_driver_id_get(
2382 			RTE_STR(CRYPTODEV_NAME_OCTEONTX2_PMD));
2383 	if (gbl_driver_id == -1) {
2384 		RTE_LOG(ERR, USER1, "OCTEONTX2 PMD must be loaded. Check if "
2385 				"CONFIG_RTE_LIBRTE_PMD_OCTEONTX2_CRYPTO is "
2386 				"enabled in config file to run this "
2387 				"testsuite.\n");
2388 		return TEST_FAILED;
2389 	}
2390 
2391 	/* Use test suite registered for crypto_octeontx PMD */
2392 	return unit_test_suite_runner(&cryptodev_octeontx_asym_testsuite);
2393 }
2394 
2395 REGISTER_TEST_COMMAND(cryptodev_openssl_asym_autotest,
2396 					  test_cryptodev_openssl_asym);
2397 
2398 REGISTER_TEST_COMMAND(cryptodev_qat_asym_autotest, test_cryptodev_qat_asym);
2399 
2400 REGISTER_TEST_COMMAND(cryptodev_octeontx_asym_autotest,
2401 					  test_cryptodev_octeontx_asym);
2402 
2403 REGISTER_TEST_COMMAND(cryptodev_octeontx2_asym_autotest,
2404 					  test_cryptodev_octeontx2_asym);
2405