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