xref: /dpdk/drivers/crypto/openssl/rte_openssl_pmd_ops.c (revision ffe18b05b48b96b0ba1ea8fec03f7a197144b494)
1 /* SPDX-License-Identifier: BSD-3-Clause
2  * Copyright(c) 2016-2017 Intel Corporation
3  */
4 
5 #include <string.h>
6 
7 #include <rte_common.h>
8 #include <rte_malloc.h>
9 #include <cryptodev_pmd.h>
10 
11 #include "openssl_pmd_private.h"
12 #include "compat.h"
13 #if (OPENSSL_VERSION_NUMBER >= 0x30000000L)
14 #include <openssl/provider.h>
15 #include <openssl/core_names.h>
16 #include <openssl/param_build.h>
17 #endif
18 
19 static const struct rte_cryptodev_capabilities openssl_pmd_capabilities[] = {
20 	{	/* MD5 HMAC */
21 		.op = RTE_CRYPTO_OP_TYPE_SYMMETRIC,
22 		{.sym = {
23 			.xform_type = RTE_CRYPTO_SYM_XFORM_AUTH,
24 			{.auth = {
25 				.algo = RTE_CRYPTO_AUTH_MD5_HMAC,
26 				.block_size = 64,
27 				.key_size = {
28 					.min = 1,
29 					.max = 64,
30 					.increment = 1
31 				},
32 				.digest_size = {
33 					.min = 1,
34 					.max = 16,
35 					.increment = 1
36 				},
37 				.iv_size = { 0 }
38 			}, }
39 		}, }
40 	},
41 	{	/* MD5 */
42 		.op = RTE_CRYPTO_OP_TYPE_SYMMETRIC,
43 		{.sym = {
44 			.xform_type = RTE_CRYPTO_SYM_XFORM_AUTH,
45 			{.auth = {
46 				.algo = RTE_CRYPTO_AUTH_MD5,
47 				.block_size = 64,
48 				.key_size = {
49 					.min = 0,
50 					.max = 0,
51 					.increment = 0
52 				},
53 				.digest_size = {
54 					.min = 16,
55 					.max = 16,
56 					.increment = 0
57 				},
58 				.iv_size = { 0 }
59 			}, }
60 		}, }
61 	},
62 	{	/* SHA1 HMAC */
63 		.op = RTE_CRYPTO_OP_TYPE_SYMMETRIC,
64 		{.sym = {
65 			.xform_type = RTE_CRYPTO_SYM_XFORM_AUTH,
66 			{.auth = {
67 				.algo = RTE_CRYPTO_AUTH_SHA1_HMAC,
68 				.block_size = 64,
69 				.key_size = {
70 					.min = 1,
71 					.max = 64,
72 					.increment = 1
73 				},
74 				.digest_size = {
75 					.min = 1,
76 					.max = 20,
77 					.increment = 1
78 				},
79 				.iv_size = { 0 }
80 			}, }
81 		}, }
82 	},
83 	{	/* SHA1 */
84 		.op = RTE_CRYPTO_OP_TYPE_SYMMETRIC,
85 		{.sym = {
86 			.xform_type = RTE_CRYPTO_SYM_XFORM_AUTH,
87 			{.auth = {
88 				.algo = RTE_CRYPTO_AUTH_SHA1,
89 				.block_size = 64,
90 				.key_size = {
91 					.min = 0,
92 					.max = 0,
93 					.increment = 0
94 				},
95 				.digest_size = {
96 					.min = 20,
97 					.max = 20,
98 					.increment = 0
99 				},
100 				.iv_size = { 0 }
101 			}, }
102 		}, }
103 	},
104 	{	/* SHA224 HMAC */
105 		.op = RTE_CRYPTO_OP_TYPE_SYMMETRIC,
106 		{.sym = {
107 			.xform_type = RTE_CRYPTO_SYM_XFORM_AUTH,
108 			{.auth = {
109 				.algo = RTE_CRYPTO_AUTH_SHA224_HMAC,
110 				.block_size = 64,
111 				.key_size = {
112 					.min = 1,
113 					.max = 64,
114 					.increment = 1
115 				},
116 				.digest_size = {
117 					.min = 1,
118 					.max = 28,
119 					.increment = 1
120 				},
121 				.iv_size = { 0 }
122 			}, }
123 		}, }
124 	},
125 	{	/* SHA224 */
126 		.op = RTE_CRYPTO_OP_TYPE_SYMMETRIC,
127 		{.sym = {
128 			.xform_type = RTE_CRYPTO_SYM_XFORM_AUTH,
129 			{.auth = {
130 				.algo = RTE_CRYPTO_AUTH_SHA224,
131 				.block_size = 64,
132 				.key_size = {
133 					.min = 0,
134 					.max = 0,
135 					.increment = 0
136 				},
137 				.digest_size = {
138 					.min = 1,
139 					.max = 28,
140 					.increment = 1
141 				},
142 				.iv_size = { 0 }
143 			}, }
144 		}, }
145 	},
146 	{	/* SHA256 HMAC */
147 		.op = RTE_CRYPTO_OP_TYPE_SYMMETRIC,
148 		{.sym = {
149 			.xform_type = RTE_CRYPTO_SYM_XFORM_AUTH,
150 			{.auth = {
151 				.algo = RTE_CRYPTO_AUTH_SHA256_HMAC,
152 				.block_size = 64,
153 				.key_size = {
154 					.min = 1,
155 					.max = 64,
156 					.increment = 1
157 				},
158 				.digest_size = {
159 					.min = 1,
160 					.max = 32,
161 					.increment = 1
162 				},
163 				.iv_size = { 0 }
164 			}, }
165 		}, }
166 	},
167 	{	/* SHA256 */
168 		.op = RTE_CRYPTO_OP_TYPE_SYMMETRIC,
169 		{.sym = {
170 			.xform_type = RTE_CRYPTO_SYM_XFORM_AUTH,
171 			{.auth = {
172 				.algo = RTE_CRYPTO_AUTH_SHA256,
173 				.block_size = 64,
174 				.key_size = {
175 					.min = 0,
176 					.max = 0,
177 					.increment = 0
178 				},
179 				.digest_size = {
180 					.min = 32,
181 					.max = 32,
182 					.increment = 0
183 				},
184 				.iv_size = { 0 }
185 			}, }
186 		}, }
187 	},
188 	{	/* SHA384 HMAC */
189 		.op = RTE_CRYPTO_OP_TYPE_SYMMETRIC,
190 		{.sym = {
191 			.xform_type = RTE_CRYPTO_SYM_XFORM_AUTH,
192 			{.auth = {
193 				.algo = RTE_CRYPTO_AUTH_SHA384_HMAC,
194 				.block_size = 128,
195 				.key_size = {
196 					.min = 1,
197 					.max = 128,
198 					.increment = 1
199 				},
200 				.digest_size = {
201 					.min = 1,
202 					.max = 48,
203 					.increment = 1
204 				},
205 				.iv_size = { 0 }
206 			}, }
207 		}, }
208 	},
209 	{	/* SHA384 */
210 		.op = RTE_CRYPTO_OP_TYPE_SYMMETRIC,
211 		{.sym = {
212 			.xform_type = RTE_CRYPTO_SYM_XFORM_AUTH,
213 			{.auth = {
214 				.algo = RTE_CRYPTO_AUTH_SHA384,
215 				.block_size = 128,
216 				.key_size = {
217 					.min = 0,
218 					.max = 0,
219 					.increment = 0
220 				},
221 				.digest_size = {
222 					.min = 48,
223 					.max = 48,
224 					.increment = 0
225 				},
226 				.iv_size = { 0 }
227 			}, }
228 		}, }
229 	},
230 	{	/* SHA512 HMAC */
231 		.op = RTE_CRYPTO_OP_TYPE_SYMMETRIC,
232 		{.sym = {
233 			.xform_type = RTE_CRYPTO_SYM_XFORM_AUTH,
234 			{.auth = {
235 				.algo = RTE_CRYPTO_AUTH_SHA512_HMAC,
236 				.block_size = 128,
237 				.key_size = {
238 					.min = 1,
239 					.max = 128,
240 					.increment = 1
241 				},
242 				.digest_size = {
243 					.min = 1,
244 					.max = 64,
245 					.increment = 1
246 				},
247 				.iv_size = { 0 }
248 			}, }
249 		}, }
250 	},
251 	{	/* SHA512  */
252 		.op = RTE_CRYPTO_OP_TYPE_SYMMETRIC,
253 		{.sym = {
254 			.xform_type = RTE_CRYPTO_SYM_XFORM_AUTH,
255 			{.auth = {
256 				.algo = RTE_CRYPTO_AUTH_SHA512,
257 				.block_size = 128,
258 				.key_size = {
259 					.min = 0,
260 					.max = 0,
261 					.increment = 0
262 				},
263 				.digest_size = {
264 					.min = 64,
265 					.max = 64,
266 					.increment = 0
267 				},
268 				.iv_size = { 0 }
269 			}, }
270 		}, }
271 	},
272 	{	/* AES CBC */
273 		.op = RTE_CRYPTO_OP_TYPE_SYMMETRIC,
274 		{.sym = {
275 			.xform_type = RTE_CRYPTO_SYM_XFORM_CIPHER,
276 			{.cipher = {
277 				.algo = RTE_CRYPTO_CIPHER_AES_CBC,
278 				.block_size = 16,
279 				.key_size = {
280 					.min = 16,
281 					.max = 32,
282 					.increment = 8
283 				},
284 				.iv_size = {
285 					.min = 16,
286 					.max = 16,
287 					.increment = 0
288 				}
289 			}, }
290 		}, }
291 	},
292 	{	/* AES CTR */
293 		.op = RTE_CRYPTO_OP_TYPE_SYMMETRIC,
294 		{.sym = {
295 			.xform_type = RTE_CRYPTO_SYM_XFORM_CIPHER,
296 			{.cipher = {
297 				.algo = RTE_CRYPTO_CIPHER_AES_CTR,
298 				.block_size = 16,
299 				.key_size = {
300 					.min = 16,
301 					.max = 32,
302 					.increment = 8
303 				},
304 				.iv_size = {
305 					.min = 16,
306 					.max = 16,
307 					.increment = 0
308 				}
309 			}, }
310 		}, }
311 	},
312 	{	/* AES GCM */
313 		.op = RTE_CRYPTO_OP_TYPE_SYMMETRIC,
314 		{.sym = {
315 			.xform_type = RTE_CRYPTO_SYM_XFORM_AEAD,
316 			{.aead = {
317 				.algo = RTE_CRYPTO_AEAD_AES_GCM,
318 				.block_size = 16,
319 				.key_size = {
320 					.min = 16,
321 					.max = 32,
322 					.increment = 8
323 				},
324 				.digest_size = {
325 					.min = 16,
326 					.max = 16,
327 					.increment = 0
328 				},
329 				.aad_size = {
330 					.min = 0,
331 					.max = 65535,
332 					.increment = 1
333 				},
334 				.iv_size = {
335 					.min = 12,
336 					.max = 16,
337 					.increment = 4
338 				},
339 			}, }
340 		}, }
341 	},
342 	{	/* AES CCM */
343 		.op = RTE_CRYPTO_OP_TYPE_SYMMETRIC,
344 		{.sym = {
345 			.xform_type = RTE_CRYPTO_SYM_XFORM_AEAD,
346 			{.aead = {
347 				.algo = RTE_CRYPTO_AEAD_AES_CCM,
348 				.block_size = 16,
349 				.key_size = {
350 					.min = 16,
351 					.max = 32,
352 					.increment = 8
353 				},
354 				.digest_size = {
355 					.min = 4,
356 					.max = 16,
357 					.increment = 2
358 				},
359 				.aad_size = {
360 					.min = 0,
361 					.max = 65535,
362 					.increment = 1
363 				},
364 				.iv_size = {
365 					.min = 7,
366 					.max = 13,
367 					.increment = 1
368 				},
369 			}, }
370 		}, }
371 	},
372 	{	/* AES GMAC (AUTH) */
373 		.op = RTE_CRYPTO_OP_TYPE_SYMMETRIC,
374 		{.sym = {
375 			.xform_type = RTE_CRYPTO_SYM_XFORM_AUTH,
376 			{.auth = {
377 				.algo = RTE_CRYPTO_AUTH_AES_GMAC,
378 				.block_size = 16,
379 				.key_size = {
380 					.min = 16,
381 					.max = 32,
382 					.increment = 8
383 				},
384 				.digest_size = {
385 					.min = 16,
386 					.max = 16,
387 					.increment = 0
388 				},
389 				.iv_size = {
390 					.min = 12,
391 					.max = 16,
392 					.increment = 4
393 				}
394 			}, }
395 		}, }
396 	},
397 	{	/* AES CMAC (AUTH) */
398 		.op = RTE_CRYPTO_OP_TYPE_SYMMETRIC,
399 		{.sym = {
400 			.xform_type = RTE_CRYPTO_SYM_XFORM_AUTH,
401 			{.auth = {
402 				.algo = RTE_CRYPTO_AUTH_AES_CMAC,
403 				.block_size = 16,
404 				.key_size = {
405 					.min = 16,
406 					.max = 32,
407 					.increment = 8
408 				},
409 				.digest_size = {
410 					.min = 4,
411 					.max = 16,
412 					.increment = 4
413 				},
414 			}, }
415 		}, }
416 	},
417 	{	/* 3DES CBC */
418 		.op = RTE_CRYPTO_OP_TYPE_SYMMETRIC,
419 		{.sym = {
420 			.xform_type = RTE_CRYPTO_SYM_XFORM_CIPHER,
421 			{.cipher = {
422 				.algo = RTE_CRYPTO_CIPHER_3DES_CBC,
423 				.block_size = 8,
424 				.key_size = {
425 					.min = 8,
426 					.max = 24,
427 					.increment = 8
428 				},
429 				.iv_size = {
430 					.min = 8,
431 					.max = 8,
432 					.increment = 0
433 				}
434 			}, }
435 		}, }
436 	},
437 	{	/* 3DES CTR */
438 		.op = RTE_CRYPTO_OP_TYPE_SYMMETRIC,
439 		{.sym = {
440 			.xform_type = RTE_CRYPTO_SYM_XFORM_CIPHER,
441 			{.cipher = {
442 				.algo = RTE_CRYPTO_CIPHER_3DES_CTR,
443 				.block_size = 8,
444 				.key_size = {
445 					.min = 16,
446 					.max = 24,
447 					.increment = 8
448 				},
449 				.iv_size = {
450 					.min = 8,
451 					.max = 8,
452 					.increment = 0
453 				}
454 			}, }
455 		}, }
456 	},
457 	{	/* DES CBC */
458 		.op = RTE_CRYPTO_OP_TYPE_SYMMETRIC,
459 		{.sym = {
460 			.xform_type = RTE_CRYPTO_SYM_XFORM_CIPHER,
461 			{.cipher = {
462 				.algo = RTE_CRYPTO_CIPHER_DES_CBC,
463 				.block_size = 8,
464 				.key_size = {
465 					.min = 8,
466 					.max = 8,
467 					.increment = 0
468 				},
469 				.iv_size = {
470 					.min = 8,
471 					.max = 8,
472 					.increment = 0
473 				}
474 			}, }
475 		}, }
476 	},
477 	{	/* DES DOCSIS BPI */
478 		.op = RTE_CRYPTO_OP_TYPE_SYMMETRIC,
479 		{.sym = {
480 			.xform_type = RTE_CRYPTO_SYM_XFORM_CIPHER,
481 			{.cipher = {
482 				.algo = RTE_CRYPTO_CIPHER_DES_DOCSISBPI,
483 				.block_size = 8,
484 				.key_size = {
485 					.min = 8,
486 					.max = 8,
487 					.increment = 0
488 				},
489 				.iv_size = {
490 					.min = 8,
491 					.max = 8,
492 					.increment = 0
493 				}
494 			}, }
495 		}, }
496 	},
497 	{	/* RSA */
498 		.op = RTE_CRYPTO_OP_TYPE_ASYMMETRIC,
499 		{.asym = {
500 			.xform_capa = {
501 				.xform_type = RTE_CRYPTO_ASYM_XFORM_RSA,
502 				.op_types = ((1 << RTE_CRYPTO_ASYM_OP_SIGN) |
503 					(1 << RTE_CRYPTO_ASYM_OP_VERIFY) |
504 					(1 << RTE_CRYPTO_ASYM_OP_ENCRYPT) |
505 					(1 << RTE_CRYPTO_ASYM_OP_DECRYPT)),
506 				{
507 				.modlen = {
508 				/* min length is based on openssl rsa keygen */
509 				.min = 30,
510 				/* value 0 symbolizes no limit on max length */
511 				.max = 0,
512 				.increment = 1
513 				}, }
514 			}
515 		},
516 		}
517 	},
518 	{	/* modexp */
519 		.op = RTE_CRYPTO_OP_TYPE_ASYMMETRIC,
520 		{.asym = {
521 			.xform_capa = {
522 				.xform_type = RTE_CRYPTO_ASYM_XFORM_MODEX,
523 				.op_types = 0,
524 				{
525 				.modlen = {
526 				/* value 0 symbolizes no limit on min length */
527 				.min = 0,
528 				/* value 0 symbolizes no limit on max length */
529 				.max = 0,
530 				.increment = 1
531 				}, }
532 			}
533 		},
534 		}
535 	},
536 	{	/* modinv */
537 		.op = RTE_CRYPTO_OP_TYPE_ASYMMETRIC,
538 		{.asym = {
539 			.xform_capa = {
540 				.xform_type = RTE_CRYPTO_ASYM_XFORM_MODINV,
541 				.op_types = 0,
542 				{
543 				.modlen = {
544 				/* value 0 symbolizes no limit on min length */
545 				.min = 0,
546 				/* value 0 symbolizes no limit on max length */
547 				.max = 0,
548 				.increment = 1
549 				}, }
550 			}
551 		},
552 		}
553 	},
554 	{	/* dh */
555 		.op = RTE_CRYPTO_OP_TYPE_ASYMMETRIC,
556 		{.asym = {
557 			.xform_capa = {
558 				.xform_type = RTE_CRYPTO_ASYM_XFORM_DH,
559 				.op_types =
560 				((1<<RTE_CRYPTO_ASYM_KE_PRIV_KEY_GENERATE) |
561 				(1 << RTE_CRYPTO_ASYM_KE_PUB_KEY_GENERATE |
562 				(1 <<
563 				RTE_CRYPTO_ASYM_KE_SHARED_SECRET_COMPUTE))),
564 				{
565 				.modlen = {
566 				/* value 0 symbolizes no limit on min length */
567 				.min = 0,
568 				/* value 0 symbolizes no limit on max length */
569 				.max = 0,
570 				.increment = 1
571 				}, }
572 			}
573 		},
574 		}
575 	},
576 	{	/* dsa */
577 		.op = RTE_CRYPTO_OP_TYPE_ASYMMETRIC,
578 		{.asym = {
579 			.xform_capa = {
580 				.xform_type = RTE_CRYPTO_ASYM_XFORM_DSA,
581 				.op_types =
582 				((1<<RTE_CRYPTO_ASYM_OP_SIGN) |
583 				(1 << RTE_CRYPTO_ASYM_OP_VERIFY)),
584 				{
585 				.modlen = {
586 				/* value 0 symbolizes no limit on min length */
587 				.min = 0,
588 				/* value 0 symbolizes no limit on max length */
589 				.max = 0,
590 				.increment = 1
591 				}, }
592 			}
593 		},
594 		}
595 	},
596 	{	/* SM2 */
597 		.op = RTE_CRYPTO_OP_TYPE_ASYMMETRIC,
598 		{.asym = {
599 			.xform_capa = {
600 				.xform_type = RTE_CRYPTO_ASYM_XFORM_SM2,
601 				.hash_algos = (1 << RTE_CRYPTO_AUTH_SM3),
602 				.op_types =
603 				((1<<RTE_CRYPTO_ASYM_OP_SIGN) |
604 				 (1 << RTE_CRYPTO_ASYM_OP_VERIFY) |
605 				 (1 << RTE_CRYPTO_ASYM_OP_ENCRYPT) |
606 				 (1 << RTE_CRYPTO_ASYM_OP_DECRYPT)),
607 				{.internal_rng = 1
608 				}
609 			}
610 		}
611 		}
612 	},
613 
614 	RTE_CRYPTODEV_END_OF_CAPABILITIES_LIST()
615 };
616 
617 
618 /** Configure device */
619 static int
620 openssl_pmd_config(__rte_unused struct rte_cryptodev *dev,
621 		__rte_unused struct rte_cryptodev_config *config)
622 {
623 	return 0;
624 }
625 
626 /** Start device */
627 static int
628 openssl_pmd_start(__rte_unused struct rte_cryptodev *dev)
629 {
630 	return 0;
631 }
632 
633 /** Stop device */
634 static void
635 openssl_pmd_stop(__rte_unused struct rte_cryptodev *dev)
636 {
637 }
638 
639 /** Close device */
640 static int
641 openssl_pmd_close(__rte_unused struct rte_cryptodev *dev)
642 {
643 	return 0;
644 }
645 
646 
647 /** Get device statistics */
648 static void
649 openssl_pmd_stats_get(struct rte_cryptodev *dev,
650 		struct rte_cryptodev_stats *stats)
651 {
652 	int qp_id;
653 
654 	for (qp_id = 0; qp_id < dev->data->nb_queue_pairs; qp_id++) {
655 		struct openssl_qp *qp = dev->data->queue_pairs[qp_id];
656 
657 		stats->enqueued_count += qp->stats.enqueued_count;
658 		stats->dequeued_count += qp->stats.dequeued_count;
659 
660 		stats->enqueue_err_count += qp->stats.enqueue_err_count;
661 		stats->dequeue_err_count += qp->stats.dequeue_err_count;
662 	}
663 }
664 
665 /** Reset device statistics */
666 static void
667 openssl_pmd_stats_reset(struct rte_cryptodev *dev)
668 {
669 	int qp_id;
670 
671 	for (qp_id = 0; qp_id < dev->data->nb_queue_pairs; qp_id++) {
672 		struct openssl_qp *qp = dev->data->queue_pairs[qp_id];
673 
674 		memset(&qp->stats, 0, sizeof(qp->stats));
675 	}
676 }
677 
678 
679 /** Get device info */
680 static void
681 openssl_pmd_info_get(struct rte_cryptodev *dev,
682 		struct rte_cryptodev_info *dev_info)
683 {
684 	struct openssl_private *internals = dev->data->dev_private;
685 
686 	if (dev_info != NULL) {
687 		dev_info->driver_id = dev->driver_id;
688 		dev_info->feature_flags = dev->feature_flags;
689 		dev_info->capabilities = openssl_pmd_capabilities;
690 		dev_info->max_nb_queue_pairs = internals->max_nb_qpairs;
691 		/* No limit of number of sessions */
692 		dev_info->sym.max_nb_sessions = 0;
693 	}
694 }
695 
696 /** Release queue pair */
697 static int
698 openssl_pmd_qp_release(struct rte_cryptodev *dev, uint16_t qp_id)
699 {
700 	if (dev->data->queue_pairs[qp_id] != NULL) {
701 		struct openssl_qp *qp = dev->data->queue_pairs[qp_id];
702 
703 		rte_ring_free(qp->processed_ops);
704 
705 		rte_free(dev->data->queue_pairs[qp_id]);
706 		dev->data->queue_pairs[qp_id] = NULL;
707 	}
708 	return 0;
709 }
710 
711 /** set a unique name for the queue pair based on it's name, dev_id and qp_id */
712 static int
713 openssl_pmd_qp_set_unique_name(struct rte_cryptodev *dev,
714 		struct openssl_qp *qp)
715 {
716 	unsigned int n = snprintf(qp->name, sizeof(qp->name),
717 			"openssl_pmd_%u_qp_%u",
718 			dev->data->dev_id, qp->id);
719 
720 	if (n >= sizeof(qp->name))
721 		return -1;
722 
723 	return 0;
724 }
725 
726 
727 /** Create a ring to place processed operations on */
728 static struct rte_ring *
729 openssl_pmd_qp_create_processed_ops_ring(struct openssl_qp *qp,
730 		unsigned int ring_size, int socket_id)
731 {
732 	struct rte_ring *r;
733 
734 	r = rte_ring_lookup(qp->name);
735 	if (r) {
736 		if (rte_ring_get_size(r) >= ring_size) {
737 			OPENSSL_LOG(INFO,
738 					"Reusing existing ring %s for processed ops",
739 				 qp->name);
740 			return r;
741 		}
742 
743 		OPENSSL_LOG(ERR,
744 				"Unable to reuse existing ring %s for processed ops",
745 			 qp->name);
746 		return NULL;
747 	}
748 
749 	return rte_ring_create(qp->name, ring_size, socket_id,
750 			RING_F_SP_ENQ | RING_F_SC_DEQ);
751 }
752 
753 
754 /** Setup a queue pair */
755 static int
756 openssl_pmd_qp_setup(struct rte_cryptodev *dev, uint16_t qp_id,
757 		const struct rte_cryptodev_qp_conf *qp_conf,
758 		int socket_id)
759 {
760 	struct openssl_qp *qp = NULL;
761 
762 	/* Free memory prior to re-allocation if needed. */
763 	if (dev->data->queue_pairs[qp_id] != NULL)
764 		openssl_pmd_qp_release(dev, qp_id);
765 
766 	/* Allocate the queue pair data structure. */
767 	qp = rte_zmalloc_socket("OPENSSL PMD Queue Pair", sizeof(*qp),
768 					RTE_CACHE_LINE_SIZE, socket_id);
769 	if (qp == NULL)
770 		return -ENOMEM;
771 
772 	qp->id = qp_id;
773 	dev->data->queue_pairs[qp_id] = qp;
774 
775 	if (openssl_pmd_qp_set_unique_name(dev, qp))
776 		goto qp_setup_cleanup;
777 
778 	qp->processed_ops = openssl_pmd_qp_create_processed_ops_ring(qp,
779 			qp_conf->nb_descriptors, socket_id);
780 	if (qp->processed_ops == NULL)
781 		goto qp_setup_cleanup;
782 
783 	qp->sess_mp = qp_conf->mp_session;
784 
785 	memset(&qp->stats, 0, sizeof(qp->stats));
786 
787 	return 0;
788 
789 qp_setup_cleanup:
790 	rte_free(qp);
791 
792 	return -1;
793 }
794 
795 /** Returns the size of the symmetric session structure */
796 static unsigned
797 openssl_pmd_sym_session_get_size(struct rte_cryptodev *dev __rte_unused)
798 {
799 	return sizeof(struct openssl_session);
800 }
801 
802 /** Returns the size of the asymmetric session structure */
803 static unsigned
804 openssl_pmd_asym_session_get_size(struct rte_cryptodev *dev __rte_unused)
805 {
806 	return sizeof(struct openssl_asym_session);
807 }
808 
809 /** Configure the session from a crypto xform chain */
810 static int
811 openssl_pmd_sym_session_configure(struct rte_cryptodev *dev __rte_unused,
812 		struct rte_crypto_sym_xform *xform,
813 		struct rte_cryptodev_sym_session *sess)
814 {
815 	void *sess_private_data = CRYPTODEV_GET_SYM_SESS_PRIV(sess);
816 	int ret;
817 
818 	if (unlikely(sess == NULL)) {
819 		OPENSSL_LOG(ERR, "invalid session struct");
820 		return -EINVAL;
821 	}
822 
823 	ret = openssl_set_session_parameters(sess_private_data, xform);
824 	if (ret != 0) {
825 		OPENSSL_LOG(ERR, "failed configure session parameters");
826 
827 		/* Return session to mempool */
828 		return ret;
829 	}
830 
831 	return 0;
832 }
833 
834 static int openssl_set_asym_session_parameters(
835 		struct openssl_asym_session *asym_session,
836 		struct rte_crypto_asym_xform *xform)
837 {
838 	int ret = -1;
839 
840 	if ((xform->xform_type != RTE_CRYPTO_ASYM_XFORM_DH) &&
841 		(xform->next != NULL)) {
842 		OPENSSL_LOG(ERR, "chained xfrms are not supported on %s",
843 			rte_cryptodev_asym_get_xform_string(xform->xform_type));
844 		return ret;
845 	}
846 
847 	switch (xform->xform_type) {
848 	case RTE_CRYPTO_ASYM_XFORM_RSA:
849 	{
850 		BIGNUM *n = NULL;
851 		BIGNUM *e = NULL;
852 		BIGNUM *d = NULL;
853 		BIGNUM *p = NULL, *q = NULL, *dmp1 = NULL;
854 		BIGNUM *iqmp = NULL, *dmq1 = NULL;
855 
856 		/* copy xfrm data into rsa struct */
857 		n = BN_bin2bn((const unsigned char *)xform->rsa.n.data,
858 				xform->rsa.n.length, n);
859 		e = BN_bin2bn((const unsigned char *)xform->rsa.e.data,
860 				xform->rsa.e.length, e);
861 
862 		if (!n || !e)
863 			goto err_rsa;
864 
865 #if (OPENSSL_VERSION_NUMBER >= 0x30000000L)
866 		OSSL_PARAM_BLD * param_bld = OSSL_PARAM_BLD_new();
867 		if (!param_bld) {
868 			OPENSSL_LOG(ERR, "failed to allocate resources\n");
869 			goto err_rsa;
870 		}
871 
872 		if (!OSSL_PARAM_BLD_push_BN(param_bld, OSSL_PKEY_PARAM_RSA_N, n)
873 			|| !OSSL_PARAM_BLD_push_BN(param_bld,
874 					OSSL_PKEY_PARAM_RSA_E, e)) {
875 			OSSL_PARAM_BLD_free(param_bld);
876 			OPENSSL_LOG(ERR, "failed to allocate resources\n");
877 			goto err_rsa;
878 		}
879 
880 		if (xform->rsa.key_type == RTE_RSA_KEY_TYPE_EXP) {
881 			d = BN_bin2bn(
882 			(const unsigned char *)xform->rsa.d.data,
883 			xform->rsa.d.length,
884 			d);
885 			if (!d) {
886 				OSSL_PARAM_BLD_free(param_bld);
887 				goto err_rsa;
888 			}
889 		} else {
890 			p = BN_bin2bn((const unsigned char *)
891 					xform->rsa.qt.p.data,
892 					xform->rsa.qt.p.length,
893 					p);
894 			q = BN_bin2bn((const unsigned char *)
895 					xform->rsa.qt.q.data,
896 					xform->rsa.qt.q.length,
897 					q);
898 			dmp1 = BN_bin2bn((const unsigned char *)
899 					xform->rsa.qt.dP.data,
900 					xform->rsa.qt.dP.length,
901 					dmp1);
902 			dmq1 = BN_bin2bn((const unsigned char *)
903 					xform->rsa.qt.dQ.data,
904 					xform->rsa.qt.dQ.length,
905 					dmq1);
906 			iqmp = BN_bin2bn((const unsigned char *)
907 					xform->rsa.qt.qInv.data,
908 					xform->rsa.qt.qInv.length,
909 					iqmp);
910 
911 			if (!p || !q || !dmp1 || !dmq1 || !iqmp) {
912 				OSSL_PARAM_BLD_free(param_bld);
913 				goto err_rsa;
914 			}
915 
916 			if (!OSSL_PARAM_BLD_push_BN(param_bld,
917 							OSSL_PKEY_PARAM_RSA_FACTOR1, p)
918 				|| !OSSL_PARAM_BLD_push_BN(param_bld,
919 							OSSL_PKEY_PARAM_RSA_FACTOR2, q)
920 				|| !OSSL_PARAM_BLD_push_BN(param_bld,
921 							OSSL_PKEY_PARAM_RSA_EXPONENT1, dmp1)
922 				|| !OSSL_PARAM_BLD_push_BN(param_bld,
923 							OSSL_PKEY_PARAM_RSA_EXPONENT2, dmq1)
924 				|| !OSSL_PARAM_BLD_push_BN(param_bld,
925 							OSSL_PKEY_PARAM_RSA_COEFFICIENT1, iqmp)) {
926 				OSSL_PARAM_BLD_free(param_bld);
927 				goto err_rsa;
928 			}
929 		}
930 
931 		if (!OSSL_PARAM_BLD_push_BN(param_bld, OSSL_PKEY_PARAM_RSA_N, n)
932 			|| !OSSL_PARAM_BLD_push_BN(param_bld, OSSL_PKEY_PARAM_RSA_E, e)
933 			|| !OSSL_PARAM_BLD_push_BN(param_bld,
934 						OSSL_PKEY_PARAM_RSA_D, d)) {
935 			OSSL_PARAM_BLD_free(param_bld);
936 			goto err_rsa;
937 		}
938 
939 		EVP_PKEY_CTX *key_ctx = EVP_PKEY_CTX_new_from_name(NULL, "RSA", NULL);
940 		EVP_PKEY *pkey = NULL;
941 		EVP_PKEY_CTX *rsa_ctx = NULL;
942 		OSSL_PARAM *params = NULL;
943 
944 		params = OSSL_PARAM_BLD_to_param(param_bld);
945 		if (!params) {
946 			OSSL_PARAM_BLD_free(param_bld);
947 			goto err_rsa;
948 		}
949 
950 		if (key_ctx == NULL
951 			|| EVP_PKEY_fromdata_init(key_ctx) <= 0
952 			|| EVP_PKEY_fromdata(key_ctx, &pkey,
953 				EVP_PKEY_KEYPAIR, params) <= 0) {
954 			OSSL_PARAM_free(params);
955 			goto err_rsa;
956 		}
957 
958 		rsa_ctx = EVP_PKEY_CTX_new(pkey, NULL);
959 		asym_session->xfrm_type = RTE_CRYPTO_ASYM_XFORM_RSA;
960 		asym_session->u.r.ctx = rsa_ctx;
961 		EVP_PKEY_CTX_free(key_ctx);
962 		OSSL_PARAM_free(params);
963 		break;
964 #else
965 		RSA *rsa = RSA_new();
966 		if (rsa == NULL)
967 			goto err_rsa;
968 
969 		if (xform->rsa.key_type == RTE_RSA_KEY_TYPE_EXP) {
970 			d = BN_bin2bn(
971 			(const unsigned char *)xform->rsa.d.data,
972 			xform->rsa.d.length,
973 			d);
974 			if (!d) {
975 				RSA_free(rsa);
976 				goto err_rsa;
977 			}
978 		} else {
979 			p = BN_bin2bn((const unsigned char *)
980 					xform->rsa.qt.p.data,
981 					xform->rsa.qt.p.length,
982 					p);
983 			q = BN_bin2bn((const unsigned char *)
984 					xform->rsa.qt.q.data,
985 					xform->rsa.qt.q.length,
986 					q);
987 			dmp1 = BN_bin2bn((const unsigned char *)
988 					xform->rsa.qt.dP.data,
989 					xform->rsa.qt.dP.length,
990 					dmp1);
991 			dmq1 = BN_bin2bn((const unsigned char *)
992 					xform->rsa.qt.dQ.data,
993 					xform->rsa.qt.dQ.length,
994 					dmq1);
995 			iqmp = BN_bin2bn((const unsigned char *)
996 					xform->rsa.qt.qInv.data,
997 					xform->rsa.qt.qInv.length,
998 					iqmp);
999 
1000 			if (!p || !q || !dmp1 || !dmq1 || !iqmp) {
1001 				RSA_free(rsa);
1002 				goto err_rsa;
1003 			}
1004 			ret = set_rsa_params(rsa, p, q);
1005 			if (ret) {
1006 				OPENSSL_LOG(ERR,
1007 					"failed to set rsa params\n");
1008 				RSA_free(rsa);
1009 				goto err_rsa;
1010 			}
1011 			ret = set_rsa_crt_params(rsa, dmp1, dmq1, iqmp);
1012 			if (ret) {
1013 				OPENSSL_LOG(ERR,
1014 					"failed to set crt params\n");
1015 				RSA_free(rsa);
1016 				/*
1017 				 * set already populated params to NULL
1018 				 * as its freed by call to RSA_free
1019 				 */
1020 				p = q = NULL;
1021 				goto err_rsa;
1022 			}
1023 		}
1024 
1025 		ret = set_rsa_keys(rsa, n, e, d);
1026 		if (ret) {
1027 			OPENSSL_LOG(ERR, "Failed to load rsa keys\n");
1028 			RSA_free(rsa);
1029 			return ret;
1030 		}
1031 		asym_session->u.r.rsa = rsa;
1032 		asym_session->xfrm_type = RTE_CRYPTO_ASYM_XFORM_RSA;
1033 		break;
1034 #endif
1035 err_rsa:
1036 		BN_clear_free(n);
1037 		BN_clear_free(e);
1038 		BN_clear_free(d);
1039 		BN_clear_free(p);
1040 		BN_clear_free(q);
1041 		BN_clear_free(dmp1);
1042 		BN_clear_free(dmq1);
1043 		BN_clear_free(iqmp);
1044 
1045 		return -1;
1046 	}
1047 	case RTE_CRYPTO_ASYM_XFORM_MODEX:
1048 	{
1049 		struct rte_crypto_modex_xform *xfrm = &(xform->modex);
1050 
1051 		BN_CTX *ctx = BN_CTX_new();
1052 		if (ctx == NULL) {
1053 			OPENSSL_LOG(ERR,
1054 				" failed to allocate resources\n");
1055 			return ret;
1056 		}
1057 		BN_CTX_start(ctx);
1058 		BIGNUM *mod = BN_CTX_get(ctx);
1059 		BIGNUM *exp = BN_CTX_get(ctx);
1060 		if (mod == NULL || exp == NULL) {
1061 			BN_CTX_end(ctx);
1062 			BN_CTX_free(ctx);
1063 			return ret;
1064 		}
1065 
1066 		mod = BN_bin2bn((const unsigned char *)
1067 				xfrm->modulus.data,
1068 				xfrm->modulus.length, mod);
1069 		exp = BN_bin2bn((const unsigned char *)
1070 				xfrm->exponent.data,
1071 				xfrm->exponent.length, exp);
1072 		asym_session->u.e.ctx = ctx;
1073 		asym_session->u.e.mod = mod;
1074 		asym_session->u.e.exp = exp;
1075 		asym_session->xfrm_type = RTE_CRYPTO_ASYM_XFORM_MODEX;
1076 		break;
1077 	}
1078 	case RTE_CRYPTO_ASYM_XFORM_MODINV:
1079 	{
1080 		struct rte_crypto_modinv_xform *xfrm = &(xform->modinv);
1081 
1082 		BN_CTX *ctx = BN_CTX_new();
1083 		if (ctx == NULL) {
1084 			OPENSSL_LOG(ERR,
1085 				" failed to allocate resources\n");
1086 			return ret;
1087 		}
1088 		BN_CTX_start(ctx);
1089 		BIGNUM *mod = BN_CTX_get(ctx);
1090 		if (mod == NULL) {
1091 			BN_CTX_end(ctx);
1092 			BN_CTX_free(ctx);
1093 			return ret;
1094 		}
1095 
1096 		mod = BN_bin2bn((const unsigned char *)
1097 				xfrm->modulus.data,
1098 				xfrm->modulus.length,
1099 				mod);
1100 		asym_session->u.m.ctx = ctx;
1101 		asym_session->u.m.modulus = mod;
1102 		asym_session->xfrm_type = RTE_CRYPTO_ASYM_XFORM_MODINV;
1103 		break;
1104 	}
1105 	case RTE_CRYPTO_ASYM_XFORM_DH:
1106 	{
1107 		BIGNUM *p = NULL;
1108 		BIGNUM *g = NULL;
1109 
1110 		p = BN_bin2bn((const unsigned char *)
1111 				xform->dh.p.data,
1112 				xform->dh.p.length,
1113 				p);
1114 		g = BN_bin2bn((const unsigned char *)
1115 				xform->dh.g.data,
1116 				xform->dh.g.length,
1117 				g);
1118 		if (!p || !g)
1119 			goto err_dh;
1120 
1121 		DH *dh = NULL;
1122 #if (OPENSSL_VERSION_NUMBER >= 0x30000000L)
1123 		OSSL_PARAM_BLD *param_bld = NULL;
1124 		param_bld = OSSL_PARAM_BLD_new();
1125 		if (!param_bld) {
1126 			OPENSSL_LOG(ERR, "failed to allocate resources\n");
1127 			goto err_dh;
1128 		}
1129 		if ((!OSSL_PARAM_BLD_push_utf8_string(param_bld,
1130 					"group", "ffdhe2048", 0))
1131 			|| (!OSSL_PARAM_BLD_push_BN(param_bld,
1132 					OSSL_PKEY_PARAM_FFC_P, p))
1133 			|| (!OSSL_PARAM_BLD_push_BN(param_bld,
1134 					OSSL_PKEY_PARAM_FFC_G, g))) {
1135 			OSSL_PARAM_BLD_free(param_bld);
1136 			goto err_dh;
1137 		}
1138 
1139 		OSSL_PARAM_BLD *param_bld_peer = NULL;
1140 		param_bld_peer = OSSL_PARAM_BLD_new();
1141 		if (!param_bld_peer) {
1142 			OPENSSL_LOG(ERR, "failed to allocate resources\n");
1143 			OSSL_PARAM_BLD_free(param_bld);
1144 			goto err_dh;
1145 		}
1146 		if ((!OSSL_PARAM_BLD_push_utf8_string(param_bld_peer,
1147 					"group", "ffdhe2048", 0))
1148 			|| (!OSSL_PARAM_BLD_push_BN(param_bld_peer,
1149 					OSSL_PKEY_PARAM_FFC_P, p))
1150 			|| (!OSSL_PARAM_BLD_push_BN(param_bld_peer,
1151 					OSSL_PKEY_PARAM_FFC_G, g))) {
1152 			OSSL_PARAM_BLD_free(param_bld);
1153 			OSSL_PARAM_BLD_free(param_bld_peer);
1154 			goto err_dh;
1155 		}
1156 
1157 		asym_session->u.dh.param_bld = param_bld;
1158 		asym_session->u.dh.param_bld_peer = param_bld_peer;
1159 #else
1160 		dh = DH_new();
1161 		if (dh == NULL) {
1162 			OPENSSL_LOG(ERR,
1163 				"failed to allocate resources\n");
1164 			goto err_dh;
1165 		}
1166 		ret = set_dh_params(dh, p, g);
1167 		if (ret) {
1168 			DH_free(dh);
1169 			goto err_dh;
1170 		}
1171 #endif
1172 		asym_session->u.dh.dh_key = dh;
1173 		asym_session->xfrm_type = RTE_CRYPTO_ASYM_XFORM_DH;
1174 		break;
1175 
1176 err_dh:
1177 		OPENSSL_LOG(ERR, " failed to set dh params\n");
1178 		BN_free(p);
1179 		BN_free(g);
1180 		return -1;
1181 	}
1182 	case RTE_CRYPTO_ASYM_XFORM_DSA:
1183 	{
1184 #if (OPENSSL_VERSION_NUMBER >= 0x30000000L)
1185 		BIGNUM *p = NULL, *g = NULL;
1186 		BIGNUM *q = NULL, *priv_key = NULL;
1187 		BIGNUM *pub_key = BN_new();
1188 		BN_zero(pub_key);
1189 		OSSL_PARAM_BLD *param_bld = NULL;
1190 
1191 		p = BN_bin2bn((const unsigned char *)
1192 				xform->dsa.p.data,
1193 				xform->dsa.p.length,
1194 				p);
1195 
1196 		g = BN_bin2bn((const unsigned char *)
1197 				xform->dsa.g.data,
1198 				xform->dsa.g.length,
1199 				g);
1200 
1201 		q = BN_bin2bn((const unsigned char *)
1202 				xform->dsa.q.data,
1203 				xform->dsa.q.length,
1204 				q);
1205 		if (!p || !q || !g)
1206 			goto err_dsa;
1207 
1208 		priv_key = BN_bin2bn((const unsigned char *)
1209 				xform->dsa.x.data,
1210 				xform->dsa.x.length,
1211 				priv_key);
1212 		if (priv_key == NULL)
1213 			goto err_dsa;
1214 
1215 		param_bld = OSSL_PARAM_BLD_new();
1216 		if (!param_bld) {
1217 			OPENSSL_LOG(ERR, "failed to allocate resources\n");
1218 			goto err_dsa;
1219 		}
1220 
1221 		if (!OSSL_PARAM_BLD_push_BN(param_bld, OSSL_PKEY_PARAM_FFC_P, p)
1222 			|| !OSSL_PARAM_BLD_push_BN(param_bld, OSSL_PKEY_PARAM_FFC_G, g)
1223 			|| !OSSL_PARAM_BLD_push_BN(param_bld, OSSL_PKEY_PARAM_FFC_Q, q)
1224 			|| !OSSL_PARAM_BLD_push_BN(param_bld, OSSL_PKEY_PARAM_PRIV_KEY, priv_key)) {
1225 			OSSL_PARAM_BLD_free(param_bld);
1226 			OPENSSL_LOG(ERR, "failed to allocate resources\n");
1227 			goto err_dsa;
1228 		}
1229 		asym_session->xfrm_type = RTE_CRYPTO_ASYM_XFORM_DSA;
1230 		asym_session->u.s.param_bld = param_bld;
1231 
1232 		break;
1233 #else
1234 		BIGNUM *p = NULL, *g = NULL;
1235 		BIGNUM *q = NULL, *priv_key = NULL;
1236 		BIGNUM *pub_key = BN_new();
1237 		BN_zero(pub_key);
1238 
1239 		p = BN_bin2bn((const unsigned char *)
1240 				xform->dsa.p.data,
1241 				xform->dsa.p.length,
1242 				p);
1243 
1244 		g = BN_bin2bn((const unsigned char *)
1245 				xform->dsa.g.data,
1246 				xform->dsa.g.length,
1247 				g);
1248 
1249 		q = BN_bin2bn((const unsigned char *)
1250 				xform->dsa.q.data,
1251 				xform->dsa.q.length,
1252 				q);
1253 		if (!p || !q || !g)
1254 			goto err_dsa;
1255 
1256 		priv_key = BN_bin2bn((const unsigned char *)
1257 				xform->dsa.x.data,
1258 				xform->dsa.x.length,
1259 				priv_key);
1260 		if (priv_key == NULL)
1261 			goto err_dsa;
1262 
1263 		DSA *dsa = DSA_new();
1264 		if (dsa == NULL) {
1265 			OPENSSL_LOG(ERR,
1266 				" failed to allocate resources\n");
1267 			goto err_dsa;
1268 		}
1269 
1270 		ret = set_dsa_params(dsa, p, q, g);
1271 		if (ret) {
1272 			DSA_free(dsa);
1273 			OPENSSL_LOG(ERR, "Failed to dsa params\n");
1274 			goto err_dsa;
1275 		}
1276 
1277 		/*
1278 		 * openssl 1.1.0 mandate that public key can't be
1279 		 * NULL in very first call. so set a dummy pub key.
1280 		 * to keep consistency, lets follow same approach for
1281 		 * both versions
1282 		 */
1283 		/* just set dummy public for very 1st call */
1284 		ret = set_dsa_keys(dsa, pub_key, priv_key);
1285 		if (ret) {
1286 			DSA_free(dsa);
1287 			OPENSSL_LOG(ERR, "Failed to set keys\n");
1288 			return -1;
1289 		}
1290 		asym_session->u.s.dsa = dsa;
1291 		asym_session->xfrm_type = RTE_CRYPTO_ASYM_XFORM_DSA;
1292 		break;
1293 #endif
1294 err_dsa:
1295 		BN_free(p);
1296 		BN_free(q);
1297 		BN_free(g);
1298 		BN_free(priv_key);
1299 		BN_free(pub_key);
1300 		return -1;
1301 	}
1302 	case RTE_CRYPTO_ASYM_XFORM_SM2:
1303 	{
1304 #if (OPENSSL_VERSION_NUMBER >= 0x30000000L)
1305 #ifndef OPENSSL_NO_SM2
1306 		OSSL_PARAM_BLD *param_bld = NULL;
1307 		OSSL_PARAM *params = NULL;
1308 		BIGNUM *pkey_bn = NULL;
1309 		uint8_t pubkey[64];
1310 		size_t len = 0;
1311 		int ret = -1;
1312 
1313 		param_bld = OSSL_PARAM_BLD_new();
1314 		if (!param_bld) {
1315 			OPENSSL_LOG(ERR, "failed to allocate params\n");
1316 			goto err_sm2;
1317 		}
1318 
1319 		ret = OSSL_PARAM_BLD_push_utf8_string(param_bld,
1320 				OSSL_ASYM_CIPHER_PARAM_DIGEST, "SM3", 0);
1321 		if (!ret) {
1322 			OPENSSL_LOG(ERR, "failed to push params\n");
1323 			goto err_sm2;
1324 		}
1325 
1326 		ret = OSSL_PARAM_BLD_push_utf8_string(param_bld,
1327 				OSSL_PKEY_PARAM_GROUP_NAME, "SM2", 0);
1328 		if (!ret) {
1329 			OPENSSL_LOG(ERR, "failed to push params\n");
1330 			goto err_sm2;
1331 		}
1332 
1333 		pkey_bn = BN_bin2bn((const unsigned char *)xform->ec.pkey.data,
1334 							xform->ec.pkey.length, pkey_bn);
1335 
1336 		ret = OSSL_PARAM_BLD_push_BN(param_bld, OSSL_PKEY_PARAM_PRIV_KEY,
1337 									 pkey_bn);
1338 		if (!ret) {
1339 			OPENSSL_LOG(ERR, "failed to push params\n");
1340 			goto err_sm2;
1341 		}
1342 
1343 		memset(pubkey, 0, sizeof(pubkey));
1344 		pubkey[0] = 0x04;
1345 		len += 1;
1346 		memcpy(&pubkey[len], xform->ec.q.x.data, xform->ec.q.x.length);
1347 		len += xform->ec.q.x.length;
1348 		memcpy(&pubkey[len], xform->ec.q.y.data, xform->ec.q.y.length);
1349 		len += xform->ec.q.y.length;
1350 
1351 		ret = OSSL_PARAM_BLD_push_octet_string(param_bld,
1352 				OSSL_PKEY_PARAM_PUB_KEY, pubkey, len);
1353 		if (!ret) {
1354 			OPENSSL_LOG(ERR, "failed to push params\n");
1355 			goto err_sm2;
1356 		}
1357 
1358 		params = OSSL_PARAM_BLD_to_param(param_bld);
1359 		if (!params) {
1360 			OPENSSL_LOG(ERR, "failed to push params\n");
1361 			goto err_sm2;
1362 		}
1363 
1364 		asym_session->u.sm2.params = params;
1365 		OSSL_PARAM_BLD_free(param_bld);
1366 
1367 		asym_session->xfrm_type = RTE_CRYPTO_ASYM_XFORM_SM2;
1368 		break;
1369 err_sm2:
1370 		if (param_bld)
1371 			OSSL_PARAM_BLD_free(param_bld);
1372 
1373 		if (asym_session->u.sm2.params)
1374 			OSSL_PARAM_free(asym_session->u.sm2.params);
1375 
1376 		return -1;
1377 #else
1378 		OPENSSL_LOG(WARNING, "SM2 unsupported in current OpenSSL Version");
1379 		return -ENOTSUP;
1380 #endif
1381 #else
1382 		OPENSSL_LOG(WARNING, "SM2 unsupported for OpenSSL Version < 3.0");
1383 		return -ENOTSUP;
1384 #endif
1385 	}
1386 	default:
1387 		return ret;
1388 	}
1389 
1390 	return 0;
1391 }
1392 
1393 /** Configure the session from a crypto xform chain */
1394 static int
1395 openssl_pmd_asym_session_configure(struct rte_cryptodev *dev __rte_unused,
1396 		struct rte_crypto_asym_xform *xform,
1397 		struct rte_cryptodev_asym_session *sess)
1398 {
1399 	void *asym_sess_private_data;
1400 	int ret;
1401 
1402 	if (unlikely(sess == NULL)) {
1403 		OPENSSL_LOG(ERR, "invalid asymmetric session struct");
1404 		return -EINVAL;
1405 	}
1406 
1407 	asym_sess_private_data = sess->sess_private_data;
1408 	ret = openssl_set_asym_session_parameters(asym_sess_private_data,
1409 			xform);
1410 	if (ret != 0) {
1411 		OPENSSL_LOG(ERR, "failed configure session parameters");
1412 		return ret;
1413 	}
1414 
1415 	return 0;
1416 }
1417 
1418 /** Clear the memory of session so it doesn't leave key material behind */
1419 static void
1420 openssl_pmd_sym_session_clear(struct rte_cryptodev *dev __rte_unused,
1421 		struct rte_cryptodev_sym_session *sess)
1422 {
1423 	void *sess_priv = CRYPTODEV_GET_SYM_SESS_PRIV(sess);
1424 
1425 	/* Zero out the whole structure */
1426 	openssl_reset_session(sess_priv);
1427 }
1428 
1429 static void openssl_reset_asym_session(struct openssl_asym_session *sess)
1430 {
1431 	switch (sess->xfrm_type) {
1432 	case RTE_CRYPTO_ASYM_XFORM_RSA:
1433 #if (OPENSSL_VERSION_NUMBER >= 0x30000000L)
1434 		if (sess->u.r.ctx)
1435 			EVP_PKEY_CTX_free(sess->u.r.ctx);
1436 #else
1437 		if (sess->u.r.rsa)
1438 			RSA_free(sess->u.r.rsa);
1439 #endif
1440 		break;
1441 	case RTE_CRYPTO_ASYM_XFORM_MODEX:
1442 		if (sess->u.e.ctx) {
1443 			BN_CTX_end(sess->u.e.ctx);
1444 			BN_CTX_free(sess->u.e.ctx);
1445 		}
1446 		break;
1447 	case RTE_CRYPTO_ASYM_XFORM_MODINV:
1448 		if (sess->u.m.ctx) {
1449 			BN_CTX_end(sess->u.m.ctx);
1450 			BN_CTX_free(sess->u.m.ctx);
1451 		}
1452 		break;
1453 	case RTE_CRYPTO_ASYM_XFORM_DH:
1454 #if (OPENSSL_VERSION_NUMBER >= 0x30000000L)
1455 		sess->u.dh.param_bld = NULL;
1456 		sess->u.dh.param_bld_peer = NULL;
1457 #else
1458 		if (sess->u.dh.dh_key)
1459 			DH_free(sess->u.dh.dh_key);
1460 #endif
1461 		break;
1462 	case RTE_CRYPTO_ASYM_XFORM_DSA:
1463 #if (OPENSSL_VERSION_NUMBER >= 0x30000000L)
1464 		sess->u.s.param_bld = NULL;
1465 #else
1466 		if (sess->u.s.dsa)
1467 			DSA_free(sess->u.s.dsa);
1468 #endif
1469 		break;
1470 	case RTE_CRYPTO_ASYM_XFORM_SM2:
1471 #if (OPENSSL_VERSION_NUMBER >= 0x30000000L)
1472 		OSSL_PARAM_free(sess->u.sm2.params);
1473 #endif
1474 	default:
1475 		break;
1476 	}
1477 }
1478 
1479 /** Clear the memory of asymmetric session
1480  * so it doesn't leave key material behind
1481  */
1482 static void
1483 openssl_pmd_asym_session_clear(struct rte_cryptodev *dev __rte_unused,
1484 		struct rte_cryptodev_asym_session *sess)
1485 {
1486 	void *sess_priv = sess->sess_private_data;
1487 
1488 	/* Zero out the whole structure */
1489 	if (sess_priv) {
1490 		openssl_reset_asym_session(sess_priv);
1491 		memset(sess_priv, 0, sizeof(struct openssl_asym_session));
1492 	}
1493 }
1494 
1495 struct rte_cryptodev_ops openssl_pmd_ops = {
1496 		.dev_configure		= openssl_pmd_config,
1497 		.dev_start		= openssl_pmd_start,
1498 		.dev_stop		= openssl_pmd_stop,
1499 		.dev_close		= openssl_pmd_close,
1500 
1501 		.stats_get		= openssl_pmd_stats_get,
1502 		.stats_reset		= openssl_pmd_stats_reset,
1503 
1504 		.dev_infos_get		= openssl_pmd_info_get,
1505 
1506 		.queue_pair_setup	= openssl_pmd_qp_setup,
1507 		.queue_pair_release	= openssl_pmd_qp_release,
1508 
1509 		.sym_session_get_size	= openssl_pmd_sym_session_get_size,
1510 		.asym_session_get_size	= openssl_pmd_asym_session_get_size,
1511 		.sym_session_configure	= openssl_pmd_sym_session_configure,
1512 		.asym_session_configure	= openssl_pmd_asym_session_configure,
1513 		.sym_session_clear	= openssl_pmd_sym_session_clear,
1514 		.asym_session_clear	= openssl_pmd_asym_session_clear
1515 };
1516 
1517 struct rte_cryptodev_ops *rte_openssl_pmd_ops = &openssl_pmd_ops;
1518