From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from mails.dpdk.org (mails.dpdk.org [217.70.189.124]) by smtp.lore.kernel.org (Postfix) with ESMTP id 91AB3C98328 for ; Mon, 28 Sep 2026 05:05:12 +0000 (UTC) Received: from mails.dpdk.org (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id 5E27840A7F; Mon, 28 Sep 2026 07:05:04 +0200 (CEST) Received: from mx0a-0016f401.pphosted.com (mx0a-0016f401.pphosted.com [67.231.148.174]) by mails.dpdk.org (Postfix) with ESMTP id 44E71406BB for ; Mon, 28 Sep 2026 07:05:00 +0200 (CEST) Received: from pps.filterd (m0431384.ppops.net [127.0.0.1]) by mx0a-0016f401.pphosted.com (8.18.1.11/8.18.1.11) with ESMTP id 68RLcnLt1035918; Sun, 27 Sep 2026 22:04:59 -0700 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=marvell.com; h= cc:content-transfer-encoding:content-type:date:from:in-reply-to :message-id:mime-version:references:subject:to; s=pfpt0220; bh=i ihPP5M6oD6gfrkvY1lgKBF2dswBDd/8CTRNy6M6UF8=; b=V7FEZdtITjRlBQTFv F6FlzuQ70KNCSDXC91YB5BZ+TF/cNbOp1ExEUliJCrLkYzVFa8VDmh6SJzNuB30X mZpqklxnxDM4s1/v+08vtbxS8vMAnWccbvZIT7lFl88h5GGATd+9mehAMjJcfbch b4VzLfY/7tafneHV3uk1kFwSmwsicPiXB3+p37N+fcKBdVw5OsBKODpuKWFVCk7H iALorhekRMALy5ig7rA2HFoIz+doD5SOLjWZvoGaxB76XQ11MZLhq++oODJ3AhpR zxPZdKCnw1BBzmplUmw0KT/gBDQRqYmVKpzlveiHb5+ucVgnHm32AhifcxPzq4xe GgIrw== Received: from dc5-exch05.marvell.com ([199.233.59.128]) by mx0a-0016f401.pphosted.com (PPS) with ESMTPS id 4gy2a6hue2-2 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Sun, 27 Sep 2026 22:04:59 -0700 (PDT) Received: from DC5-EXCH05.marvell.com (10.69.176.209) by DC5-EXCH05.marvell.com (10.69.176.209) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.1544.25; Sun, 27 Sep 2026 22:04:57 -0700 Received: from maili.marvell.com (10.69.176.80) by DC5-EXCH05.marvell.com (10.69.176.209) with Microsoft SMTP Server id 15.2.1544.25 via Frontend Transport; Sun, 27 Sep 2026 22:04:57 -0700 Received: from ssarananaga.marvell.com (unknown [10.29.57.26]) by maili.marvell.com (Postfix) with ESMTP id 2E7433F70BB; Sun, 27 Sep 2026 22:04:53 -0700 (PDT) From: Sucharitha Sarananaga To: CC: , , , , , , , , , Sucharitha Sarananaga Subject: [PATCH v4 5/8] crypto/openssl: support RSA-OAEP Date: Mon, 28 Sep 2026 05:04:09 +0000 Message-ID: <20260928050412.276760-6-ssarananaga@marvell.com> X-Mailer: git-send-email 2.54.0 In-Reply-To: <20260928050412.276760-1-ssarananaga@marvell.com> References: <20260925081500.3848187-1-ssarananaga@marvell.com> <20260928050412.276760-1-ssarananaga@marvell.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Content-Type: text/plain X-Proofpoint-GUID: 4AwIO8kxljOIeTJzvz9vNRxuQ2dKVvAi X-Proofpoint-Spam-Info: AW1haW4tMjYwOTI4MDAxOSBTYWx0ZWRfXymwzW+WhX0KU ATf+m+6zbxa9vvgtCCQwmAhZmsjp18aRneA1v9EZPAH37XvJinxZ5f54D84MGCIYBgoL82JBmKs leXzy++kIlF9klp25S9qbxj+etn1de0= X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwOTI4MDAxOSBTYWx0ZWRfXz1Sig1j9zPtN vK2vfB+/q3Qk8HH4an5uKmIpp2W5PXqOUor+D32Mm8tN/usbv/C0RB4+r5q0UCKB2cHjmNiSwnz wEACDPBQYS7eV3l4vMqmswql8aJ2ryWcKyu8aNZLQ59Zo4lKVDNK13sW6EvmpUXsyPbDH3wWdZ/ FaZ+rxzCCur9znEVrVUXQEPE0qM40qHTS4OdQi/6rhywsuhMIricUrkCougWhTOAjFr/pQ1RMVR cDz4OgMvStO4wFzJE5Lugyx+wmTerU/tKsZyOWAskOsq8tOWGcHpI+dDE20v1tRsDb0ATcSGxVX MVsoQ564iyn6euWXhjBVtYbwAl1htcq9URlGq1xdq2YVwO0iGzJNjoBh4vrE+5t57I3TAXeTe+9 kvpzA8wW5liuD8iG4VSMa1YVKK5HSY4SJTnVvZe5Uh6fY2Vf1j++aUohVdW2thor03WhghlL/Fr 2hp6+Sq9UL6V0YKa8ow== X-Proofpoint-ORIG-GUID: 4AwIO8kxljOIeTJzvz9vNRxuQ2dKVvAi X-Authority-Analysis: v=2.4 cv=DJIacCNb c=1 sm=1 tr=0 ts=6ab9f57b cx=c_pps a=rEv8fa4AjpPjGxpoe8rlIQ==:117 a=rEv8fa4AjpPjGxpoe8rlIQ==:17 a=VdqzKS8jKosA:10 a=VkNPw1HP01LnGYTKEx00:22 a=l0iWHRpgs5sLHlkKQ1IR:22 a=TtqV-g6YmW1Jfm2GSLaY:22 a=M5GUcnROAAAA:8 a=MdwzAXbWYWzcP4Eo634A:9 a=OBjm3rFKGHvpk9ecZwUJ:22 X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1176,Hydra:6.1.134,FMLib:17.12.100.49 definitions=2026-09-26_05,2026-09-21_02,2025-10-01_01 X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org Add support for RSA OAEP padding in the OpenSSL PMD OpenSSL 3.x implementation. Store OAEP configuration parameters in the RSA asymmetric session, including the OAEP hash, MGF1 hash, and optional label. Configure these parameters on the EVP_PKEY context during RSA encrypt and decrypt operations, and default the MGF1 hash to the OAEP hash when not specified by the application. Validate OAEP-specific usage, restrict it to encrypt/decrypt operations, and add proper cleanup of allocated label resources on error and session teardown paths. Signed-off-by: Sucharitha Sarananaga --- drivers/crypto/openssl/openssl_pmd_private.h | 4 + drivers/crypto/openssl/rte_openssl_pmd.c | 53 ++++++++++++ drivers/crypto/openssl/rte_openssl_pmd_ops.c | 90 ++++++++++++++++++++ 3 files changed, 147 insertions(+) diff --git a/drivers/crypto/openssl/openssl_pmd_private.h b/drivers/crypto/openssl/openssl_pmd_private.h index ab40012d61..2807629630 100644 --- a/drivers/crypto/openssl/openssl_pmd_private.h +++ b/drivers/crypto/openssl/openssl_pmd_private.h @@ -181,6 +181,10 @@ struct __rte_cache_aligned openssl_asym_session { RSA *rsa; uint32_t pad; EVP_PKEY_CTX * ctx; + const EVP_MD *oaep_md; + const EVP_MD *mgf1_md; + uint8_t *label; + uint32_t label_len; } r; struct exp { BIGNUM *exp; diff --git a/drivers/crypto/openssl/rte_openssl_pmd.c b/drivers/crypto/openssl/rte_openssl_pmd.c index 2319c7cfa9..4fbbb73bfa 100644 --- a/drivers/crypto/openssl/rte_openssl_pmd.c +++ b/drivers/crypto/openssl/rte_openssl_pmd.c @@ -2292,6 +2292,41 @@ process_openssl_modexp_op(struct rte_crypto_op *cop, return 0; } +/** + * Configure RSA-OAEP parameters on an initialized EVP_PKEY_CTX. + * Must be called after EVP_PKEY_encrypt_init() or EVP_PKEY_decrypt_init(). + * + * @return 0 on success, -1 on failure. + */ +static int +openssl_rsa_set_oaep_params(EVP_PKEY_CTX *ctx, + const struct openssl_asym_session *sess) +{ + if (sess->u.r.pad != RTE_CRYPTO_RSA_PADDING_OAEP) + return 0; + + if (EVP_PKEY_CTX_set_rsa_oaep_md(ctx, sess->u.r.oaep_md) <= 0) + return -1; + + if (EVP_PKEY_CTX_set_rsa_mgf1_md(ctx, sess->u.r.mgf1_md) <= 0) + return -1; + + if (sess->u.r.label_len > 0) { + void *label = OPENSSL_memdup(sess->u.r.label, sess->u.r.label_len); + + if (label == NULL) + return -1; + + if (EVP_PKEY_CTX_set0_rsa_oaep_label(ctx, label, sess->u.r.label_len) <= 0) { + OPENSSL_free(label); + return -1; + } + } + /* Empty label is default; set0_rsa_oaep_label(NULL,0) fails on OpenSSL 3. */ + + return 0; +} + /* process rsa operations */ static int process_openssl_rsa_op_evp(struct rte_crypto_op *cop, @@ -2308,6 +2343,15 @@ process_openssl_rsa_op_evp(struct rte_crypto_op *cop, if (!rsa_ctx) return ret; + /* OAEP is only valid for encrypt/decrypt */ + if (sess->u.r.pad == RTE_CRYPTO_RSA_PADDING_OAEP && + op->rsa.op_type != RTE_CRYPTO_ASYM_OP_ENCRYPT && + op->rsa.op_type != RTE_CRYPTO_ASYM_OP_DECRYPT) { + OPENSSL_LOG(ERR, "OAEP supports encrypt/decrypt only"); + cop->status = RTE_CRYPTO_OP_STATUS_INVALID_ARGS; + return ret; + } + switch (pad) { case RTE_CRYPTO_RSA_PADDING_PKCS1_5: pad = RSA_PKCS1_PADDING; @@ -2315,6 +2359,9 @@ process_openssl_rsa_op_evp(struct rte_crypto_op *cop, case RTE_CRYPTO_RSA_PADDING_NONE: pad = RSA_NO_PADDING; break; + case RTE_CRYPTO_RSA_PADDING_OAEP: + pad = RSA_PKCS1_OAEP_PADDING; + break; default: cop->status = RTE_CRYPTO_OP_STATUS_INVALID_ARGS; OPENSSL_LOG(ERR, @@ -2330,6 +2377,9 @@ process_openssl_rsa_op_evp(struct rte_crypto_op *cop, if (EVP_PKEY_CTX_set_rsa_padding(rsa_ctx, pad) <= 0) goto err_rsa; + if (openssl_rsa_set_oaep_params(rsa_ctx, sess) < 0) + goto err_rsa; + if (EVP_PKEY_encrypt(rsa_ctx, NULL, &outlen, op->rsa.message.data, op->rsa.message.length) <= 0) @@ -2355,6 +2405,9 @@ process_openssl_rsa_op_evp(struct rte_crypto_op *cop, if (EVP_PKEY_CTX_set_rsa_padding(rsa_ctx, pad) <= 0) goto err_rsa; + if (openssl_rsa_set_oaep_params(rsa_ctx, sess) < 0) + goto err_rsa; + if (EVP_PKEY_decrypt(rsa_ctx, NULL, &outlen, op->rsa.cipher.data, op->rsa.cipher.length) <= 0) diff --git a/drivers/crypto/openssl/rte_openssl_pmd_ops.c b/drivers/crypto/openssl/rte_openssl_pmd_ops.c index 60d33f3474..d2f699c266 100644 --- a/drivers/crypto/openssl/rte_openssl_pmd_ops.c +++ b/drivers/crypto/openssl/rte_openssl_pmd_ops.c @@ -2,6 +2,7 @@ * Copyright(c) 2016-2017 Intel Corporation */ +#include #include #include @@ -1208,6 +1209,33 @@ openssl_pmd_sym_session_configure(struct rte_cryptodev *dev, return 0; } +static const EVP_MD * +openssl_get_md(enum rte_crypto_auth_algorithm alg) +{ + switch (alg) { + case RTE_CRYPTO_AUTH_SHA1: + return EVP_sha1(); + case RTE_CRYPTO_AUTH_SHA224: + return EVP_sha224(); + case RTE_CRYPTO_AUTH_SHA256: + return EVP_sha256(); + case RTE_CRYPTO_AUTH_SHA384: + return EVP_sha384(); + case RTE_CRYPTO_AUTH_SHA512: + return EVP_sha512(); + case RTE_CRYPTO_AUTH_SHA3_224: + return EVP_sha3_224(); + case RTE_CRYPTO_AUTH_SHA3_256: + return EVP_sha3_256(); + case RTE_CRYPTO_AUTH_SHA3_384: + return EVP_sha3_384(); + case RTE_CRYPTO_AUTH_SHA3_512: + return EVP_sha3_512(); + default: + return NULL; + } +} + static int openssl_set_asym_session_parameters( struct openssl_asym_session *asym_session, struct rte_crypto_asym_xform *xform) @@ -1229,6 +1257,8 @@ static int openssl_set_asym_session_parameters( BIGNUM *d = NULL; BIGNUM *p = NULL, *q = NULL, *dmp1 = NULL; BIGNUM *iqmp = NULL, *dmq1 = NULL; + uint32_t label_len = 0; + enum rte_crypto_auth_algorithm mgf1; /* copy xfrm data into rsa struct */ n = BN_bin2bn((const unsigned char *)xform->rsa.n.data, @@ -1240,6 +1270,56 @@ static int openssl_set_asym_session_parameters( goto err_rsa; asym_session->u.r.pad = xform->rsa.padding.type; + if (xform->rsa.padding.type == RTE_CRYPTO_RSA_PADDING_OAEP) { + asym_session->u.r.oaep_md = openssl_get_md(xform->rsa.padding.hash); + + if (asym_session->u.r.oaep_md == NULL) { + OPENSSL_LOG(ERR, + "Unsupported OAEP hash algorithm %u", + xform->rsa.padding.hash); + goto err_rsa; + } + + mgf1 = xform->rsa.padding.mgf1hash; + if (mgf1 == 0) + mgf1 = xform->rsa.padding.hash; + + asym_session->u.r.mgf1_md = openssl_get_md(mgf1); + if (asym_session->u.r.mgf1_md == NULL) { + OPENSSL_LOG(ERR, + "Unsupported OAEP MGF1 hash algorithm %u", mgf1); + goto err_rsa; + } + + if (xform->rsa.padding.oaep_label.length > (size_t)INT_MAX) { + OPENSSL_LOG(ERR, + "OAEP label length %zu is too large", + xform->rsa.padding.oaep_label.length); + goto err_rsa; + } + + label_len = (uint32_t)xform->rsa.padding.oaep_label.length; + if (label_len > 0) { + if (xform->rsa.padding.oaep_label.data == NULL) { + OPENSSL_LOG(ERR, + "OAEP label length is non-zero but data is NULL"); + goto err_rsa; + } + + asym_session->u.r.label = OPENSSL_zalloc(label_len); + if (asym_session->u.r.label == NULL) + goto err_rsa; + + memcpy(asym_session->u.r.label, + xform->rsa.padding.oaep_label.data, + label_len); + asym_session->u.r.label_len = label_len; + } else { + asym_session->u.r.label_len = 0; + asym_session->u.r.label = NULL; + } + } + OSSL_PARAM_BLD * param_bld = OSSL_PARAM_BLD_new(); if (!param_bld) { OPENSSL_LOG(ERR, "failed to allocate resources"); @@ -1342,6 +1422,11 @@ static int openssl_set_asym_session_parameters( ret = 0; err_rsa: + if (ret != 0 && asym_session->u.r.label) { + OPENSSL_free(asym_session->u.r.label); + asym_session->u.r.label = NULL; + asym_session->u.r.label_len = 0; + } BN_clear_free(n); BN_clear_free(e); BN_clear_free(d); @@ -1817,6 +1902,11 @@ static void openssl_reset_asym_session(struct openssl_asym_session *sess) switch (sess->xfrm_type) { case RTE_CRYPTO_ASYM_XFORM_RSA: EVP_PKEY_CTX_free(sess->u.r.ctx); + if (sess->u.r.label_len > 0) { + OPENSSL_free(sess->u.r.label); + sess->u.r.label = NULL; + sess->u.r.label_len = 0; + } break; case RTE_CRYPTO_ASYM_XFORM_MODEX: if (sess->u.e.ctx) { -- 2.54.0