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