When the legacy provider is unavailable, DES ciphers were still
reported as supported, causing runtime failures when applications
attempted to use them.

Add openssl_pmd_caps_init() to build a filtered capability list at
device init, excluding DES-CBC and DES-DOCSISBPI based on legacy
provider availability. Add a warning when DES algorithms are
unavailable.

Signed-off-by: Pratik Senapati <[email protected]>
---
 drivers/crypto/openssl/openssl_pmd_private.h |  2 ++
 drivers/crypto/openssl/rte_openssl_pmd.c     |  3 +-
 drivers/crypto/openssl/rte_openssl_pmd_ops.c | 29 +++++++++++++++++++-
 3 files changed, 32 insertions(+), 2 deletions(-)

diff --git a/drivers/crypto/openssl/openssl_pmd_private.h 
b/drivers/crypto/openssl/openssl_pmd_private.h
index ab40012d61..71d78459ee 100644
--- a/drivers/crypto/openssl/openssl_pmd_private.h
+++ b/drivers/crypto/openssl/openssl_pmd_private.h
@@ -21,6 +21,8 @@
 
 /** OPENSSL PMD LOGTYPE DRIVER */
 extern int openssl_logtype_driver;
+/** Initialize filtered capability list based on legacy provider availability 
*/
+extern void openssl_pmd_caps_init(void);
 #define RTE_LOGTYPE_OPENSSL_DRIVER openssl_logtype_driver
 #define OPENSSL_LOG(level, ...)  \
        RTE_LOG_LINE_PREFIX(level, OPENSSL_DRIVER, "%s() line %u: ", \
diff --git a/drivers/crypto/openssl/rte_openssl_pmd.c 
b/drivers/crypto/openssl/rte_openssl_pmd.c
index 2319c7cfa9..275078050a 100644
--- a/drivers/crypto/openssl/rte_openssl_pmd.c
+++ b/drivers/crypto/openssl/rte_openssl_pmd.c
@@ -37,7 +37,7 @@ static void ossl_legacy_provider_load(void)
        /* Load Multiple providers into the default (NULL) library context */
        legacy = OSSL_PROVIDER_load(NULL, "legacy");
        if (legacy == NULL) {
-               OPENSSL_LOG(ERR, "Failed to load Legacy provider");
+               OPENSSL_LOG(WARNING, "Failed to load Legacy provider");
                return;
        }
 
@@ -3941,6 +3941,7 @@ cryptodev_openssl_create(const char *name,
         * unless the legacy provider explicitly loaded. e.g. DES
         */
        ossl_legacy_provider_load();
+       openssl_pmd_caps_init();
 
        return 0;
 
diff --git a/drivers/crypto/openssl/rte_openssl_pmd_ops.c 
b/drivers/crypto/openssl/rte_openssl_pmd_ops.c
index d927cc5228..3dc1ee11a2 100644
--- a/drivers/crypto/openssl/rte_openssl_pmd_ops.c
+++ b/drivers/crypto/openssl/rte_openssl_pmd_ops.c
@@ -929,6 +929,7 @@ static const struct rte_cryptodev_capabilities 
openssl_pmd_capabilities[] = {
        RTE_CRYPTODEV_END_OF_CAPABILITIES_LIST()
 };
 
+static struct rte_cryptodev_capabilities 
openssl_pmd_caps_active[RTE_DIM(openssl_pmd_capabilities)];
 const char *ml_kem_type_names[] = {
        NULL,
        "ML-KEM-512",
@@ -943,6 +944,29 @@ const char *ml_dsa_type_names[] = {
        "ML-DSA-87",
 };
 
+/** Initialize active capability list, filtering unsupported entries. */
+void
+openssl_pmd_caps_init(void)
+{
+       uint32_t i, j = 0;
+
+       for (i = 0; openssl_pmd_capabilities[i].op != 
RTE_CRYPTO_OP_TYPE_UNDEFINED; i++) {
+               const struct rte_cryptodev_capabilities *cap = 
&openssl_pmd_capabilities[i];
+
+               if (cap->op == RTE_CRYPTO_OP_TYPE_SYMMETRIC &&
+                               cap->sym.xform_type == 
RTE_CRYPTO_SYM_XFORM_CIPHER &&
+                               (cap->sym.cipher.algo == 
RTE_CRYPTO_CIPHER_DES_CBC ||
+                                cap->sym.cipher.algo == 
RTE_CRYPTO_CIPHER_DES_DOCSISBPI)) {
+                       EVP_CIPHER *des_cbc = EVP_CIPHER_fetch(NULL, "DES-CBC", 
"provider=legacy");
+                       if (des_cbc == NULL)
+                               continue;
+                       EVP_CIPHER_free(des_cbc);
+               }
+               openssl_pmd_caps_active[j++] = *cap;
+       }
+       openssl_pmd_caps_active[j] = openssl_pmd_capabilities[i];
+}
+
 /** Configure device */
 static int
 openssl_pmd_config(__rte_unused struct rte_cryptodev *dev,
@@ -1014,7 +1038,10 @@ openssl_pmd_info_get(struct rte_cryptodev *dev,
        if (dev_info != NULL) {
                dev_info->driver_id = dev->driver_id;
                dev_info->feature_flags = dev->feature_flags;
-               dev_info->capabilities = openssl_pmd_capabilities;
+               if (openssl_pmd_caps_active[0].op == 
RTE_CRYPTO_OP_TYPE_UNDEFINED)
+                       dev_info->capabilities = openssl_pmd_capabilities;
+               else
+                       dev_info->capabilities = openssl_pmd_caps_active;
                dev_info->max_nb_queue_pairs = internals->max_nb_qpairs;
                /* No limit of number of sessions */
                dev_info->sym.max_nb_sessions = 0;
-- 
2.43.0

Reply via email to