Show a patch.

GET /api/patches/43273/?format=api
HTTP 200 OK
Allow: GET, PUT, PATCH, HEAD, OPTIONS
Content-Type: application/json
Vary: Accept

{
    "id": 43273,
    "url": "http://patches.dpdk.org/api/patches/43273/?format=api",
    "web_url": "http://patches.dpdk.org/patch/43273/",
    "project": {
        "id": 1,
        "url": "http://patches.dpdk.org/api/projects/1/?format=api",
        "name": "DPDK",
        "link_name": "dpdk",
        "list_id": "dev.dpdk.org",
        "list_email": "dev@dpdk.org",
        "web_url": "http://core.dpdk.org",
        "scm_url": "git://dpdk.org/dpdk",
        "webscm_url": "http://git.dpdk.org/dpdk"
    },
    "msgid": "<1532357165-8575-2-git-send-email-shally.verma@caviumnetworks.com>",
    "date": "2018-07-23T14:46:03",
    "name": "[v5,1/3] crypto/openssl: add rsa and mod asym op",
    "commit_ref": null,
    "pull_url": null,
    "state": "accepted",
    "archived": true,
    "hash": "58557bc2915e2e2f9b930eb729bf11cae36d0628",
    "submitter": {
        "id": 960,
        "url": "http://patches.dpdk.org/api/people/960/?format=api",
        "name": "Shally Verma",
        "email": "shally.verma@caviumnetworks.com"
    },
    "delegate": {
        "id": 22,
        "url": "http://patches.dpdk.org/api/users/22/?format=api",
        "username": "pdelarag",
        "first_name": "Pablo",
        "last_name": "de Lara Guarch",
        "email": "pablo.de.lara.guarch@intel.com"
    },
    "mbox": "http://patches.dpdk.org/patch/43273/mbox/",
    "series": [
        {
            "id": 717,
            "url": "http://patches.dpdk.org/api/series/717/?format=api",
            "web_url": "http://patches.dpdk.org/project/dpdk/list/?series=717",
            "date": "2018-07-23T14:46:02",
            "name": "crypto/openssl: support asymmetric crypto",
            "version": 5,
            "mbox": "http://patches.dpdk.org/series/717/mbox/"
        }
    ],
    "comments": "http://patches.dpdk.org/api/patches/43273/comments/",
    "check": "success",
    "checks": "http://patches.dpdk.org/api/patches/43273/checks/",
    "tags": {},
    "headers": {
        "X-Forefront-Antispam-Report": "SFV:NSPM;\n\tSFS:(10009020)(376002)(346002)(396003)(366004)(39860400002)(136003)(189003)(199004)(6486002)(42882007)(16586007)(478600001)(305945005)(446003)(50226002)(50466002)(5660300001)(11346002)(7736002)(476003)(48376002)(36756003)(44832011)(8676002)(486006)(2616005)(956004)(3846002)(14444005)(575784001)(68736007)(54906003)(47776003)(72206003)(6116002)(97736004)(316002)(69596002)(107886003)(4326008)(2906002)(81166006)(66066001)(81156014)(2361001)(8936002)(25786009)(6512007)(53416004)(26005)(106356001)(6916009)(105586002)(55236004)(186003)(386003)(52116002)(6506007)(53936002)(6666003)(76176011)(51416003)(2351001)(16526019);\n\tDIR:OUT; SFP:1101; SCL:1; SRVR:DM5PR0701MB3640;\n\tH:hyd1sverma-dt.caveonetworks.com; FPR:; SPF:None; LANG:en;\n\tPTR:InfoNoRecords; MX:1; A:1; ",
        "SpamDiagnosticOutput": "1:99",
        "DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/relaxed;\n\td=CAVIUMNETWORKS.onmicrosoft.com; s=selector1-cavium-com;\n\th=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck;\n\tbh=6o/bbODMR+gT4nIpUNKEr+D3LKNIaNzqShZqj3YEBC4=;\n\tb=TBtNyDvuZLMfyep357QrQ1ALnU1htz6bwZjOb8G5rj5PHMjM72/h5zvgfhqjXapfHmjFREMQzwaVaUvuHHI4+EyWxiYV0Cdq6NA2TCmvTzkrDEKgkd4i2ybG6A51MBHPsndIwUM/youvXb89kUXXJkKIDi0hu1xXkq3X0LmFh7U=",
        "X-Mailman-Version": "2.1.15",
        "X-MS-Exchange-SenderADCheck": "1",
        "X-MS-Exchange-CrossTenant-OriginalArrivalTime": "23 Jul 2018 14:46:35.0547\n\t(UTC)",
        "X-MS-Office365-Filtering-Correlation-Id": "577cd0c3-f56d-4e5a-90a1-08d5f0ab17c9",
        "Content-Type": "text/plain",
        "X-Originating-IP": "[115.113.156.2]",
        "X-MS-TrafficTypeDiagnostic": "DM5PR0701MB3640:",
        "X-Microsoft-Antispam": "BCL:0; PCL:0;\n\tRULEID:(7020095)(4652040)(8989117)(5600073)(711020)(4534165)(7168020)(4627221)(201703031133081)(201702281549075)(8990107)(2017052603328)(7153060)(7193020);\n\tSRVR:DM5PR0701MB3640; ",
        "References": "<1532357165-8575-1-git-send-email-shally.verma@caviumnetworks.com>",
        "Return-Path": "<dev-bounces@dpdk.org>",
        "List-Subscribe": "<https://mails.dpdk.org/listinfo/dev>,\n\t<mailto:dev-request@dpdk.org?subject=subscribe>",
        "List-Post": "<mailto:dev@dpdk.org>",
        "X-Microsoft-Antispam-Message-Info": "GV//lDTBIyx6uJzuAeRM5NCvoaldyQ4Imfg9fHjikeMNS5wLCWnTvxZhVutV6di4FLnQmpzmgpyRmPutLc90SdZWrcxe1Ae27AJExfs2R7o0DINtGieJafWcbeIonduy618A0yMRPoK6zvj6pSpLpQEeBoOjpGlu8WA5teq87ZEh23WwScQpYsiLAQFQf4tsY5hjjlrXtMaACgsFo/3QuH23MAwBZiyXsrn5n2i64D01BgPDG0SK95nUKCFC+jAtJ353AjVVb5McPOZFFIvwTTuh+edWjBKmZeNvBj7GuYgfBs9PQ79Gmu0cOfNgHWgVZtK09yExpir/NzA0ogkZ6e2exDX0jeXVNvnZxo81wAA=",
        "Date": "Mon, 23 Jul 2018 20:16:03 +0530",
        "List-Archive": "<http://mails.dpdk.org/archives/dev/>",
        "X-Exchange-Antispam-Report-CFA-Test": "BCL:0; PCL:0;\n\tRULEID:(8211001083)(6040522)(2401047)(5005006)(8121501046)(3002001)(10201501046)(3231311)(944501410)(52105095)(93006095)(149027)(150027)(6041310)(20161123558120)(20161123562045)(20161123560045)(20161123564045)(201703131423095)(201702281528075)(20161123555045)(201703061421075)(201703061406153)(6072148)(201708071742011)(7699016);\n\tSRVR:DM5PR0701MB3640; BCL:0; PCL:0; RULEID:; SRVR:DM5PR0701MB3640; ",
        "Subject": "[dpdk-dev] [PATCH v5 1/3] crypto/openssl: add rsa and mod asym op",
        "In-Reply-To": "<1532357165-8575-1-git-send-email-shally.verma@caviumnetworks.com>",
        "MIME-Version": "1.0",
        "X-Microsoft-Antispam-PRVS": "<DM5PR0701MB3640E98F5D1E0E29E705A0D2F0560@DM5PR0701MB3640.namprd07.prod.outlook.com>",
        "X-BeenThere": "dev@dpdk.org",
        "Received-SPF": "None (protection.outlook.com: cavium.com does not designate\n\tpermitted sender hosts)",
        "X-MS-Exchange-CrossTenant-Network-Message-Id": "577cd0c3-f56d-4e5a-90a1-08d5f0ab17c9",
        "List-Id": "DPDK patches and discussions <dev.dpdk.org>",
        "From": "Shally Verma <shally.verma@caviumnetworks.com>",
        "List-Help": "<mailto:dev-request@dpdk.org?subject=help>",
        "X-Microsoft-Exchange-Diagnostics": [
            "1; DM5PR0701MB3640;\n\t3:mY5pL4veZAtovPH7c2HqEliQSr4xDApzzRpucQDbr+vPfyFZE84cvP6Hw7aAfVgLqnrLORLsZUkzDDx2JDtIpCATWB8Kd4hKt1LuyGKQ5AnoFYWz/oiw0Sras7lP1DFzd0jkOduJjTIj2h7jRLBuSsOxlriQ3+WV4BhsBxFNnv8KzIRillW+tC2AHrnbpgAwA0R/dddlOdLOvvE9eYxrgPeILwzuU0JpO7lmSM28LmBNVd2mBxGJhl2Tqnn7UTE8;\n\t25:hl2dv/3LvWF3olFvd7h7J2GhKyirM9syspjbmGj1+G28/xUX0R0TiVmN4f/HUJB7MYGNJJHSDme8T8px08Yxd6EVkWRoBAO41YnGXxreLUhjG5U9Fak0U+wrwMeSvo3pk8sboivSm08BTxIOmH46H1plSACRpB5YbPE2vI6XoNH8JZm/HxF9N8E5nt1j0zBcLRnG8DqDsO9ANx6oqpUuYHzqeL8hcEO33HbjBz0iyvGsVU+Tev3lmona0mkO/Ktd9vwwMds1RqIeP7Qdp76P9t7GnrOWzMDC3eUlyxeV8C/h9B71ojwWm9zl3nju3mv+PH7KN9jZMTXmBVttjd3Pgw==;\n\t31:zK+LRIH2h9hySSUmt22ei6l2gYVcxuPtTxDNjqVFG6lEHb1X0PKMNXslM4j02tt4wcQdr5mzYuB7zKwFz7UWXKWzx4yplHi60rsB4isEPnZGsRVImcxBCLnV3Di40fQ9xXBaTGnwdQhVQszBZQXtBTGH44tRjSJqmL/C0Nu20VRlKrF7VS9AzVjKZ8zW1tmpA/zrHEzwgB6RIAZH9MOk8BYlLs/xJyW/pN78q63Cptc=",
            "1; DM5PR0701MB3640;\n\t20:/iBL6Ocp1miWIhpGFQYceK4yB5hMA3hV2KmcJJhJDrGhwGn9m6E4oYrd+ol6/tmmYCB6Km/tWw85lz0+YwLRAv6m7CiyIZh96bWGDMqvAiMLkMVTowILRs1b+2+uxV/3txFBRJvsUv04j+HVPVAlOLQV9Yq5ZBUuN6Hb8oXxtCFlww+cv1ZPoDRgdezuWWrsSSBGZ+maD6kvMLeIp8X5KPm2jeWNaFUTZcTdS/ax5OpMiZQFP+yTfVSkadCH/g/0biyehyNMKN4dDqjYPKMzgbDSzd0Ni+SiLxg/R7Br3DYLLPyd09K9OD78m2UGD5kNJfUpd/DZB/rNayMt5BTnvR/ejNf0lugZTti3bOR48SMEWDkWLHCMhUviVGZhSZHSP4L6ipbw5K5iDAHkBvFxJ/Wz2uEZ1rf5gFFpnmm9hBe/jnC5Nd0A4qN/ey1BRys9Vb2liQ7UYbYhMcSKmBrM3vwGYGwyrSTSVLJixdsyZp2SWnWmLWiV+Ir14ntCvMY680eZv+yHR1u4D5wiwQEh269GDezOzbdE+OaJmUIP7p/+i6BDptanam6pYFDe/3gXJjtltpy2ygnvjtU8h0qdB7A4vDjeRCsSxUTNh897zKk=;\n\t4:/UyvJKof7rkX4T87SsHj6/zCMbxZXtRqIrbMXdLfsXFKKPEFQDhGkW3JHg2w3yGJ5geXb19oRMwhom1I/x/t17ILJT2a5ijm5dvS5TVZavqrriEwQB9GRBhS+X0qML+yabbvuAKKgBzegQWFlGj7kFVru9MH/C6sK6DZpsdBCs4tImMke9W0X1waL6yyiLmgIEMLDtTbWZCBN/Wsq2TgDxwhv3XGVsvxyw9F5lf3/05LWUn0yZ8ObA0Fe0gty5CEwllEgKemVdTeFd8z6d1aYA==",
            "=?us-ascii?Q?1; DM5PR0701MB3640;\n\t23:lYEo8c/FBjW6XnxxbUV0Wh7C9O/HNFsIx1JxjOp?=\n\tTUysi9lEwnRIVsHMNq5jPbyygx19LBY9lRc6vLVwGQfJOHWvIenYspT1Hk6det+MYACB86R9C/QjforOSvTzSNAj9la0tO0LG3uhAv/8CN7ufUfIsof3EXKBf/NjQwd8KmNz8kWTDc2lYiaZUy+NfdDRIHZUKrymqRQ8lJwcua1633xXVhf27qXCtFbcZPt01V2vsZFQc9jT7boJVzVqSM4q2Lufu8PWDT2E7WurhkRnwikXWJqkzIj06rG52Ppnv9N5B9FhPFQyOAFwt35WqgcyCKlNJ7uf9ZLBlqPe+glHbJQPFFhRN6lXj584QKJAUF6P9ywMHaoiILYXxxpMX8bL5dP4BziNd90FA750fdboF2+rESYyhLiBNExr7BzFqiEmXAsfPJKDyo9RqLuvqh0lMcbqHogDfd/+OunCnd90z91V/WAy9N7T/7q1V9HNuhYUBFc0RbiPgI75t9Ny3MZOGSpquSssYy3JqwIdotL0nIxKe+gqZ/4047icdtrkt714VPLD5VTNC9h4Nt6udy0J5KD+wTF+f+1QK7P2GZ4VPgnFEbpwoAXTNT0d/wNwPu+OHlvTwMXlY9r2Wf3zJ1sK6JlcQ+JtgG58kNs4CnSdgO3B1Sz6iHeOwX3AO9aVu/Mb+tcdJpvfoLk84Nm5qnl1wmBM/lXh4AJ15pMocZGuXkTSMTqdVT0/RsfDiA9Ltc5Cd0Ek0Su/OpzJ74cmQ1ud7sw8Ay48jv3SqGKtExwjbX59Pk6X3wlvsu/3UrRxPA9OhH65lY6Y060HZ6CMAL3LqLmfzHh1wx62WKaYlbCk/b5z/3dnpaLXaYMvo68+QgpgIEQdV4PlZHKAA6Y0fUiBZkDkLIKAxyfYLZKwGTSbeX6+FpoexBTS8+eVwU3QOkQAhIU8mzj5yCrkcHS5NkCp3K12/E2JzmvrU7XNUTjPPuTEwseH01tqcAHSEqv92jp0uhWqNbonb8K6Agu0snVPrUQzayL/x8rzFSxlVkzz3T9IuYNTJko/VIV97BwU5SsABKREYvSKc8GXzTmdtgTk6nU7h8oWCYJh110yzB+JjqLUDUfdLrbMo1wd/EYONRK4VpvlBr3OuXY2Yo6urwg6EUBsWlocPyS0F5BHvcG382C3ZWZVcl0/m0pZxHuWDOB9Oglm/veUjsitlpPcXySx1SKP9izFXLhsCg7ogoppb5/qTaDoeoWFCm3E8GgHL7fsY99URqRkXmROJDx8rUbY07MkBqszJPt2KUIspHPZKZgxMO4lAQFauazthPJM2d2YM7I/WJJQ2KwV4iM4rZxRLtfH3RRETHpmshi2R5dtcWZUkwrQFr0z8UpC0bqm5yTA/VZt7tYxFr6gQq+OjIS7o",
            "1; DM5PR0701MB3640;\n\t6:tjwX7WSQoHegSTxp2PFSAEpwp/jz0eKy8QrP9ySXNiqLzy66O+3yb20lc8nIAuvfTSOIh3srHqhc5lwJGUyRJf9acTRkbL0c4Mjp0nmla4eBFly4nembtt7Le4N7gx0gMby8GxgQ7InUcFGGQxsNTxLdtB9jU/lzs2GHcHS74NuRAjx5I6f6p5HISCMdM8JwFGuzpsOeomGD52vJxZJGplys13MYlqTEMzxrP2vEPRMjPgN/r9/qIZIHa7eBqIn0QgzL95rlqILMFzKELnp3hUGIWYTa+oeL+zZ4ApgCr4I30hMZvxmvwOIlGUDQ7dkcOXQiXqGk4FVg1f3mcEktrhOrc70bIqSdJAEdxecWyRutt0YWnmlfLOekE02pllr2g4etq4L/ipXuUF2voCBUmdl/hYlnikbt4AWWZAMvwF1g1cTip0MOo2R50uK+aJGqNWctnd/EJAhI8g5x7qbfBQ==;\n\t5:5r7ndXEpGWunUaQOC0x5+jzZQ8guJ9SIM7K/tk8lPeYkWMwv+ZWV4oe4qyPEhL4sx1DYu+DNqy6wUln8vv38eVHg0JRrbQSDjkxNqWtS6lWa2QMkz1Nu/rTWJ5Fs88AlOcCDmCzphYJqSvIyoF7GSVhha98QJ5pNKafA03hufiU=;\n\t7:WxTWosZYZaAzGYaUXbnoH9pbKwiKtXPSMNbMJ/D5bf5CoBKg8rLMwx0IF3YrmSRzT54hsjUIuZZ7BP9RaRow2WMPaERH0IGSRrxrAmsU4DXxUaHTyZt48SpPrAkpmY+Us/Zu7IDtb6uzPWAbdfuAWAQfMwiGShVQnG0OHsAjd+i91ZIxJ+b8Q3+9qD9Vi3EJrhO5mIQtgh2lj4pECLFuzpwh7yLXJS5jKVyErSJ60iwKKtP8BC7ULiwQDI1Io6sE"
        ],
        "Delivered-To": "patchwork@dpdk.org",
        "Cc": "dev@dpdk.org, pathreya@caviumnetworks.com, nmurthy@caviumnetworks.com,\n\tSunila Sahu <sunila.sahu@caviumnetworks.com>,\n\tAshish Gupta <ashish.gupta@caviumnetworks.com>",
        "To": "pablo.de.lara.guarch@intel.com",
        "X-ClientProxiedBy": "MA1PR0101CA0020.INDPRD01.PROD.OUTLOOK.COM\n\t(2603:1096:a00:21::30) To DM5PR0701MB3640.namprd07.prod.outlook.com\n\t(2603:10b6:4:7e::12)",
        "Errors-To": "dev-bounces@dpdk.org",
        "Sender": "\"dev\" <dev-bounces@dpdk.org>",
        "X-Mailer": "git-send-email 1.9.1",
        "SpamDiagnosticMetadata": "NSPM",
        "Received": [
            "from [92.243.14.124] (localhost [127.0.0.1])\n\tby dpdk.org (Postfix) with ESMTP id 7F27A31FC;\n\tMon, 23 Jul 2018 16:46:40 +0200 (CEST)",
            "from NAM04-SN1-obe.outbound.protection.outlook.com\n\t(mail-eopbgr700088.outbound.protection.outlook.com [40.107.70.88])\n\tby dpdk.org (Postfix) with ESMTP id C300F20BD\n\tfor <dev@dpdk.org>; Mon, 23 Jul 2018 16:46:38 +0200 (CEST)",
            "from hyd1sverma-dt.caveonetworks.com (115.113.156.2) by\n\tDM5PR0701MB3640.namprd07.prod.outlook.com (2603:10b6:4:7e::12) with\n\tMicrosoft SMTP Server (version=TLS1_2,\n\tcipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id\n\t15.20.973.20; Mon, 23 Jul 2018 14:46:35 +0000"
        ],
        "X-MS-Exchange-CrossTenant-Id": "711e4ccf-2e9b-4bcf-a551-4094005b6194",
        "X-Forefront-PRVS": "0742443479",
        "X-Original-To": "patchwork@dpdk.org",
        "X-MS-PublicTrafficType": "Email",
        "X-OriginatorOrg": "caviumnetworks.com",
        "Message-Id": "<1532357165-8575-2-git-send-email-shally.verma@caviumnetworks.com>",
        "Precedence": "list",
        "X-MS-Exchange-CrossTenant-FromEntityHeader": "Hosted",
        "Authentication-Results": "spf=none (sender IP is )\n\tsmtp.mailfrom=Shally.Verma@cavium.com; ",
        "List-Unsubscribe": "<https://mails.dpdk.org/options/dev>,\n\t<mailto:dev-request@dpdk.org?subject=unsubscribe>",
        "X-MS-Exchange-Transport-CrossTenantHeadersStamped": "DM5PR0701MB3640",
        "X-Exchange-Antispam-Report-Test": "UriScan:;"
    },
    "content": "From: Sunila Sahu <sunila.sahu@caviumnetworks.com>\n\n- Add compat.h to make pmd compatible to openssl-1.1.0 and\n  backward version\n- Add rsa sign/verify/encrypt/decrypt and modular operation\n  support\n\nSigned-off-by: Sunila Sahu <sunila.sahu@caviumnetworks.com>\nSigned-off-by: Shally Verma <shally.verma@caviumnetworks.com>\nSigned-off-by: Ashish Gupta <ashish.gupta@caviumnetworks.com>\n---\n drivers/crypto/openssl/compat.h                  |  40 +++\n drivers/crypto/openssl/rte_openssl_pmd.c         | 231 +++++++++++++++-\n drivers/crypto/openssl/rte_openssl_pmd_ops.c     | 336 ++++++++++++++++++++++-\n drivers/crypto/openssl/rte_openssl_pmd_private.h |  19 ++\n 4 files changed, 614 insertions(+), 12 deletions(-)",
    "diff": "diff --git a/drivers/crypto/openssl/compat.h b/drivers/crypto/openssl/compat.h\nnew file mode 100644\nindex 0000000..8ece808\n--- /dev/null\n+++ b/drivers/crypto/openssl/compat.h\n@@ -0,0 +1,40 @@\n+/* SPDX-License-Identifier: BSD-3-Clause\n+ * Copyright(c) 2018 Cavium Networks\n+ */\n+\n+#ifndef __RTA_COMPAT_H__\n+#define __RTA_COMPAT_H__\n+\n+#if (OPENSSL_VERSION_NUMBER < 0x10100000L)\n+\n+#define set_rsa_params(rsa, p, q, ret) \\\n+\tdo {rsa->p = p; rsa->q = q; ret = 0; } while (0)\n+\n+#define set_rsa_crt_params(rsa, dmp1, dmq1, iqmp, ret) \\\n+\tdo { \\\n+\t\trsa->dmp1 = dmp1; \\\n+\t\trsa->dmq1 = dmq1; \\\n+\t\trsa->iqmp = iqmp; \\\n+\t\tret = 0; \\\n+\t} while (0)\n+\n+#define set_rsa_keys(rsa, n, e, d, ret) \\\n+\tdo { \\\n+\t\trsa->n = n; rsa->e = e; rsa->d = d; ret = 0; \\\n+\t} while (0)\n+\n+#else\n+\n+#define set_rsa_params(rsa, p, q, ret) \\\n+\t(ret = !RSA_set0_factors(rsa, p, q))\n+\n+#define set_rsa_crt_params(rsa, dmp1, dmq1, iqmp, ret) \\\n+\t(ret = !RSA_set0_crt_params(rsa, dmp1, dmq1, iqmp))\n+\n+/* n, e must be non-null, d can be NULL */\n+#define set_rsa_keys(rsa, n, e, d, ret) \\\n+\t(ret = !RSA_set0_key(rsa, n, e, d))\n+\n+#endif /* version < 10100000 */\n+\n+#endif /* __RTA_COMPAT_H__ */\ndiff --git a/drivers/crypto/openssl/rte_openssl_pmd.c b/drivers/crypto/openssl/rte_openssl_pmd.c\nindex 96b0fd2..9d18e67 100644\n--- a/drivers/crypto/openssl/rte_openssl_pmd.c\n+++ b/drivers/crypto/openssl/rte_openssl_pmd.c\n@@ -14,6 +14,7 @@\n #include <openssl/evp.h>\n \n #include \"rte_openssl_pmd_private.h\"\n+#include \"compat.h\"\n \n #define DES_BLOCK_SIZE 8\n \n@@ -730,19 +731,36 @@ openssl_reset_session(struct openssl_session *sess)\n }\n \n /** Provide session for operation */\n-static struct openssl_session *\n+static void *\n get_session(struct openssl_qp *qp, struct rte_crypto_op *op)\n {\n \tstruct openssl_session *sess = NULL;\n+\tstruct openssl_asym_session *asym_sess = NULL;\n \n \tif (op->sess_type == RTE_CRYPTO_OP_WITH_SESSION) {\n-\t\t/* get existing session */\n-\t\tif (likely(op->sym->session != NULL))\n-\t\t\tsess = (struct openssl_session *)\n-\t\t\t\t\tget_sym_session_private_data(\n-\t\t\t\t\top->sym->session,\n-\t\t\t\t\tcryptodev_driver_id);\n+\t\tif (op->type == RTE_CRYPTO_OP_TYPE_SYMMETRIC) {\n+\t\t\t/* get existing session */\n+\t\t\tif (likely(op->sym->session != NULL))\n+\t\t\t\tsess = (struct openssl_session *)\n+\t\t\t\t\t\tget_sym_session_private_data(\n+\t\t\t\t\t\top->sym->session,\n+\t\t\t\t\t\tcryptodev_driver_id);\n+\t\t} else {\n+\t\t\tif (likely(op->asym->session != NULL))\n+\t\t\t\tasym_sess = (struct openssl_asym_session *)\n+\t\t\t\t\t\tget_asym_session_private_data(\n+\t\t\t\t\t\top->asym->session,\n+\t\t\t\t\t\tcryptodev_driver_id);\n+\t\t\tif (asym_sess == NULL)\n+\t\t\t\top->status =\n+\t\t\t\t\tRTE_CRYPTO_OP_STATUS_INVALID_SESSION;\n+\t\t\treturn asym_sess;\n+\t\t}\n \t} else {\n+\t\t/* sessionless asymmetric not supported */\n+\t\tif (op->type == RTE_CRYPTO_OP_TYPE_ASYMMETRIC)\n+\t\t\treturn NULL;\n+\n \t\t/* provide internal session */\n \t\tvoid *_sess = NULL;\n \t\tvoid *_sess_private_data = NULL;\n@@ -1528,6 +1546,193 @@ process_openssl_auth_op(struct openssl_qp *qp, struct rte_crypto_op *op,\n \t\top->status = RTE_CRYPTO_OP_STATUS_ERROR;\n }\n \n+/* process modinv operation */\n+static int process_openssl_modinv_op(struct rte_crypto_op *cop,\n+\t\tstruct openssl_asym_session *sess)\n+{\n+\tstruct rte_crypto_asym_op *op = cop->asym;\n+\tBIGNUM *base = BN_CTX_get(sess->u.m.ctx);\n+\tBIGNUM *res = BN_CTX_get(sess->u.m.ctx);\n+\n+\tif (unlikely(base == NULL || res == NULL)) {\n+\t\tif (base)\n+\t\t\tBN_free(base);\n+\t\tif (res)\n+\t\t\tBN_free(res);\n+\t\tcop->status = RTE_CRYPTO_OP_STATUS_NOT_PROCESSED;\n+\t\treturn -1;\n+\t}\n+\n+\tbase = BN_bin2bn((const unsigned char *)op->modinv.base.data,\n+\t\t\top->modinv.base.length, base);\n+\n+\tif (BN_mod_inverse(res, base, sess->u.m.modulus, sess->u.m.ctx)) {\n+\t\tcop->status = RTE_CRYPTO_OP_STATUS_SUCCESS;\n+\t\top->modinv.base.length = BN_bn2bin(res, op->modinv.base.data);\n+\t} else {\n+\t\tcop->status = RTE_CRYPTO_OP_STATUS_ERROR;\n+\t}\n+\n+\treturn 0;\n+}\n+\n+/* process modexp operation */\n+static int process_openssl_modexp_op(struct rte_crypto_op *cop,\n+\t\tstruct openssl_asym_session *sess)\n+{\n+\tstruct rte_crypto_asym_op *op = cop->asym;\n+\tBIGNUM *base = BN_CTX_get(sess->u.e.ctx);\n+\tBIGNUM *res = BN_CTX_get(sess->u.e.ctx);\n+\n+\tif (unlikely(base == NULL || res == NULL)) {\n+\t\tif (base)\n+\t\t\tBN_free(base);\n+\t\tif (res)\n+\t\t\tBN_free(res);\n+\t\tcop->status = RTE_CRYPTO_OP_STATUS_NOT_PROCESSED;\n+\t\treturn -1;\n+\t}\n+\n+\tbase = BN_bin2bn((const unsigned char *)op->modinv.base.data,\n+\t\t\top->modinv.base.length, base);\n+\n+\tif (BN_mod_exp(res, base, sess->u.e.exp,\n+\t\t\t\tsess->u.e.mod, sess->u.e.ctx)) {\n+\t\top->modinv.base.length = BN_bn2bin(res, op->modinv.base.data);\n+\t\tcop->status = RTE_CRYPTO_OP_STATUS_SUCCESS;\n+\t} else {\n+\t\tcop->status = RTE_CRYPTO_OP_STATUS_ERROR;\n+\t}\n+\n+\treturn 0;\n+}\n+\n+/* process rsa operations */\n+static int process_openssl_rsa_op(struct rte_crypto_op *cop,\n+\t\tstruct openssl_asym_session *sess)\n+{\n+\tint ret = 0;\n+\tstruct rte_crypto_asym_op *op = cop->asym;\n+\tRSA *rsa = sess->u.r.rsa;\n+\tuint32_t pad = (op->rsa.pad);\n+\n+\tswitch (pad) {\n+\tcase RTE_CRYPTO_RSA_PKCS1_V1_5_BT0:\n+\tcase RTE_CRYPTO_RSA_PKCS1_V1_5_BT1:\n+\tcase RTE_CRYPTO_RSA_PKCS1_V1_5_BT2:\n+\t\tpad = RSA_PKCS1_PADDING;\n+\t\tbreak;\n+\tcase RTE_CRYPTO_RSA_PADDING_NONE:\n+\t\tpad = RSA_NO_PADDING;\n+\t\tbreak;\n+\tdefault:\n+\t\tcop->status = RTE_CRYPTO_OP_STATUS_INVALID_ARGS;\n+\t\tOPENSSL_LOG(ERR,\n+\t\t\t\t\"rsa pad type not supported %d\\n\", pad);\n+\t\treturn 0;\n+\t}\n+\n+\tswitch (op->rsa.op_type) {\n+\tcase RTE_CRYPTO_ASYM_OP_ENCRYPT:\n+\t\tret = RSA_public_encrypt(op->rsa.message.length,\n+\t\t\t\top->rsa.message.data,\n+\t\t\t\top->rsa.message.data,\n+\t\t\t\trsa,\n+\t\t\t\tpad);\n+\n+\t\tif (ret > 0)\n+\t\t\top->rsa.message.length = ret;\n+\t\tOPENSSL_LOG(DEBUG,\n+\t\t\t\t\"length of encrypted text %d\\n\", ret);\n+\t\tbreak;\n+\n+\tcase RTE_CRYPTO_ASYM_OP_DECRYPT:\n+\t\tret = RSA_private_decrypt(op->rsa.message.length,\n+\t\t\t\top->rsa.message.data,\n+\t\t\t\top->rsa.message.data,\n+\t\t\t\trsa,\n+\t\t\t\tpad);\n+\t\tif (ret > 0)\n+\t\t\top->rsa.message.length = ret;\n+\t\tbreak;\n+\n+\tcase RTE_CRYPTO_ASYM_OP_SIGN:\n+\t\tret = RSA_private_encrypt(op->rsa.message.length,\n+\t\t\t\top->rsa.message.data,\n+\t\t\t\top->rsa.sign.data,\n+\t\t\t\trsa,\n+\t\t\t\tpad);\n+\t\tif (ret > 0)\n+\t\t\top->rsa.sign.length = ret;\n+\t\tbreak;\n+\n+\tcase RTE_CRYPTO_ASYM_OP_VERIFY:\n+\t\tret = RSA_public_decrypt(op->rsa.sign.length,\n+\t\t\t\top->rsa.sign.data,\n+\t\t\t\top->rsa.sign.data,\n+\t\t\t\trsa,\n+\t\t\t\tpad);\n+\n+\t\tOPENSSL_LOG(DEBUG,\n+\t\t\t\t\"Length of public_decrypt %d \"\n+\t\t\t\t\"length of message %zd\\n\",\n+\t\t\t\tret, op->rsa.message.length);\n+\n+\t\tif (memcmp(op->rsa.sign.data, op->rsa.message.data,\n+\t\t\t\t\top->rsa.message.length)) {\n+\t\t\tOPENSSL_LOG(ERR,\n+\t\t\t\t\t\"RSA sign Verification failed\");\n+\t\t\treturn -1;\n+\t\t}\n+\t\tbreak;\n+\n+\tdefault:\n+\t\t/* allow ops with invalid args to be pushed to\n+\t\t * completion queue\n+\t\t */\n+\t\tcop->status = RTE_CRYPTO_OP_STATUS_INVALID_ARGS;\n+\t\tbreak;\n+\t}\n+\n+\tif (ret < 0)\n+\t\tcop->status = RTE_CRYPTO_OP_STATUS_ERROR;\n+\n+\treturn 0;\n+}\n+\n+static int\n+process_asym_op(struct openssl_qp *qp, struct rte_crypto_op *op,\n+\t\tstruct openssl_asym_session *sess)\n+{\n+\tint retval = 0;\n+\n+\top->status = RTE_CRYPTO_OP_STATUS_NOT_PROCESSED;\n+\n+\tswitch (sess->xfrm_type) {\n+\tcase RTE_CRYPTO_ASYM_XFORM_RSA:\n+\t\tretval = process_openssl_rsa_op(op, sess);\n+\t\tbreak;\n+\tcase RTE_CRYPTO_ASYM_XFORM_MODEX:\n+\t\tretval = process_openssl_modexp_op(op, sess);\n+\t\tbreak;\n+\tcase RTE_CRYPTO_ASYM_XFORM_MODINV:\n+\t\tretval = process_openssl_modinv_op(op, sess);\n+\t\tbreak;\n+\tdefault:\n+\t\top->status = RTE_CRYPTO_OP_STATUS_INVALID_ARGS;\n+\t\tbreak;\n+\t}\n+\tif (!retval) {\n+\t\t/* op processed so push to completion queue as processed */\n+\t\tretval = rte_ring_enqueue(qp->processed_ops, (void *)op);\n+\t\tif (retval)\n+\t\t\t/* return error if failed to put in completion queue */\n+\t\t\tretval = -1;\n+\t}\n+\n+\treturn retval;\n+}\n+\n /** Process crypto operation for mbuf */\n static int\n process_op(struct openssl_qp *qp, struct rte_crypto_op *op,\n@@ -1600,7 +1805,7 @@ static uint16_t\n openssl_pmd_enqueue_burst(void *queue_pair, struct rte_crypto_op **ops,\n \t\tuint16_t nb_ops)\n {\n-\tstruct openssl_session *sess;\n+\tvoid *sess;\n \tstruct openssl_qp *qp = queue_pair;\n \tint i, retval;\n \n@@ -1609,7 +1814,12 @@ openssl_pmd_enqueue_burst(void *queue_pair, struct rte_crypto_op **ops,\n \t\tif (unlikely(sess == NULL))\n \t\t\tgoto enqueue_err;\n \n-\t\tretval = process_op(qp, ops[i], sess);\n+\t\tif (ops[i]->type == RTE_CRYPTO_OP_TYPE_SYMMETRIC)\n+\t\t\tretval = process_op(qp, ops[i],\n+\t\t\t\t\t(struct openssl_session *) sess);\n+\t\telse\n+\t\t\tretval = process_asym_op(qp, ops[i],\n+\t\t\t\t\t(struct openssl_asym_session *) sess);\n \t\tif (unlikely(retval < 0))\n \t\t\tgoto enqueue_err;\n \t}\n@@ -1664,7 +1874,8 @@ cryptodev_openssl_create(const char *name,\n \t\t\tRTE_CRYPTODEV_FF_SYM_OPERATION_CHAINING |\n \t\t\tRTE_CRYPTODEV_FF_CPU_AESNI |\n \t\t\tRTE_CRYPTODEV_FF_OOP_SGL_IN_LB_OUT |\n-\t\t\tRTE_CRYPTODEV_FF_OOP_LB_IN_LB_OUT;\n+\t\t\tRTE_CRYPTODEV_FF_OOP_LB_IN_LB_OUT |\n+\t\t\tRTE_CRYPTODEV_FF_ASYMMETRIC_CRYPTO;\n \n \t/* Set vector instructions mode supported */\n \tinternals = dev->data->dev_private;\ndiff --git a/drivers/crypto/openssl/rte_openssl_pmd_ops.c b/drivers/crypto/openssl/rte_openssl_pmd_ops.c\nindex 05f452d..bbc203e 100644\n--- a/drivers/crypto/openssl/rte_openssl_pmd_ops.c\n+++ b/drivers/crypto/openssl/rte_openssl_pmd_ops.c\n@@ -9,6 +9,7 @@\n #include <rte_cryptodev_pmd.h>\n \n #include \"rte_openssl_pmd_private.h\"\n+#include \"compat.h\"\n \n \n static const struct rte_cryptodev_capabilities openssl_pmd_capabilities[] = {\n@@ -469,6 +470,63 @@ static const struct rte_cryptodev_capabilities openssl_pmd_capabilities[] = {\n \t\t\t}, }\n \t\t}, }\n \t},\n+\t{\t/* RSA */\n+\t\t.op = RTE_CRYPTO_OP_TYPE_ASYMMETRIC,\n+\t\t{.asym = {\n+\t\t\t.xform_capa = {\n+\t\t\t\t.xform_type = RTE_CRYPTO_ASYM_XFORM_RSA,\n+\t\t\t\t.op_types = ((1 << RTE_CRYPTO_ASYM_OP_SIGN) |\n+\t\t\t\t\t(1 << RTE_CRYPTO_ASYM_OP_VERIFY) |\n+\t\t\t\t\t(1 << RTE_CRYPTO_ASYM_OP_ENCRYPT) |\n+\t\t\t\t\t(1 << RTE_CRYPTO_ASYM_OP_DECRYPT)),\n+\t\t\t\t{\n+\t\t\t\t.modlen = {\n+\t\t\t\t/* min length is based on openssl rsa keygen */\n+\t\t\t\t.min = 30,\n+\t\t\t\t/* value 0 symbolizes no limit on max length */\n+\t\t\t\t.max = 0,\n+\t\t\t\t.increment = 1\n+\t\t\t\t}, }\n+\t\t\t}\n+\t\t},\n+\t\t}\n+\t},\n+\t{\t/* modexp */\n+\t\t.op = RTE_CRYPTO_OP_TYPE_ASYMMETRIC,\n+\t\t{.asym = {\n+\t\t\t.xform_capa = {\n+\t\t\t\t.xform_type = RTE_CRYPTO_ASYM_XFORM_MODEX,\n+\t\t\t\t.op_types = 0,\n+\t\t\t\t{\n+\t\t\t\t.modlen = {\n+\t\t\t\t/* value 0 symbolizes no limit on min length */\n+\t\t\t\t.min = 0,\n+\t\t\t\t/* value 0 symbolizes no limit on max length */\n+\t\t\t\t.max = 0,\n+\t\t\t\t.increment = 1\n+\t\t\t\t}, }\n+\t\t\t}\n+\t\t},\n+\t\t}\n+\t},\n+\t{\t/* modinv */\n+\t\t.op = RTE_CRYPTO_OP_TYPE_ASYMMETRIC,\n+\t\t{.asym = {\n+\t\t\t.xform_capa = {\n+\t\t\t\t.xform_type = RTE_CRYPTO_ASYM_XFORM_MODINV,\n+\t\t\t\t.op_types = 0,\n+\t\t\t\t{\n+\t\t\t\t.modlen = {\n+\t\t\t\t/* value 0 symbolizes no limit on min length */\n+\t\t\t\t.min = 0,\n+\t\t\t\t/* value 0 symbolizes no limit on max length */\n+\t\t\t\t.max = 0,\n+\t\t\t\t.increment = 1\n+\t\t\t\t}, }\n+\t\t\t}\n+\t\t},\n+\t\t}\n+\t},\n \n \tRTE_CRYPTODEV_END_OF_CAPABILITIES_LIST()\n };\n@@ -655,13 +713,20 @@ openssl_pmd_qp_count(struct rte_cryptodev *dev)\n \treturn dev->data->nb_queue_pairs;\n }\n \n-/** Returns the size of the session structure */\n+/** Returns the size of the symmetric session structure */\n static unsigned\n openssl_pmd_sym_session_get_size(struct rte_cryptodev *dev __rte_unused)\n {\n \treturn sizeof(struct openssl_session);\n }\n \n+/** Returns the size of the asymmetric session structure */\n+static unsigned\n+openssl_pmd_asym_session_get_size(struct rte_cryptodev *dev __rte_unused)\n+{\n+\treturn sizeof(struct openssl_asym_session);\n+}\n+\n /** Configure the session from a crypto xform chain */\n static int\n openssl_pmd_sym_session_configure(struct rte_cryptodev *dev __rte_unused,\n@@ -698,6 +763,226 @@ openssl_pmd_sym_session_configure(struct rte_cryptodev *dev __rte_unused,\n \treturn 0;\n }\n \n+static int openssl_set_asym_session_parameters(\n+\t\tstruct openssl_asym_session *asym_session,\n+\t\tstruct rte_crypto_asym_xform *xform)\n+{\n+\tint ret = 0;\n+\n+\tif (xform->next != NULL) {\n+\t\tOPENSSL_LOG(ERR, \"chained xfrms are not supported on %s\",\n+\t\t\trte_crypto_asym_xform_strings[xform->xform_type]);\n+\t\treturn -1;\n+\t}\n+\n+\tswitch (xform->xform_type) {\n+\tcase RTE_CRYPTO_ASYM_XFORM_RSA:\n+\t{\n+\t\tBIGNUM *n = NULL;\n+\t\tBIGNUM *e = NULL;\n+\t\tBIGNUM *d = NULL;\n+\t\tBIGNUM *p = NULL, *q = NULL, *dmp1 = NULL;\n+\t\tBIGNUM *iqmp = NULL, *dmq1 = NULL;\n+\n+\t\t/* copy xfrm data into rsa struct */\n+\t\tn = BN_bin2bn((const unsigned char *)xform->rsa.n.data,\n+\t\t\t\txform->rsa.n.length, n);\n+\t\te = BN_bin2bn((const unsigned char *)xform->rsa.e.data,\n+\t\t\t\txform->rsa.e.length, e);\n+\n+\t\tif (!n || !e)\n+\t\t\tgoto err_rsa;\n+\n+\t\tRSA *rsa = RSA_new();\n+\t\tif (rsa == NULL)\n+\t\t\tgoto err_rsa;\n+\n+\t\tif (xform->rsa.key_type == RTE_RSA_KEY_TYPE_EXP) {\n+\t\t\td = BN_bin2bn(\n+\t\t\t(const unsigned char *)xform->rsa.d.data,\n+\t\t\txform->rsa.d.length,\n+\t\t\td);\n+\t\t\tif (!d) {\n+\t\t\t\tRSA_free(rsa);\n+\t\t\t\tgoto err_rsa;\n+\t\t\t}\n+\t\t} else {\n+\t\t\tp = BN_bin2bn((const unsigned char *)\n+\t\t\t\t\txform->rsa.qt.p.data,\n+\t\t\t\t\txform->rsa.qt.p.length,\n+\t\t\t\t\tp);\n+\t\t\tq = BN_bin2bn((const unsigned char *)\n+\t\t\t\t\txform->rsa.qt.q.data,\n+\t\t\t\t\txform->rsa.qt.q.length,\n+\t\t\t\t\tq);\n+\t\t\tdmp1 = BN_bin2bn((const unsigned char *)\n+\t\t\t\t\txform->rsa.qt.dP.data,\n+\t\t\t\t\txform->rsa.qt.dP.length,\n+\t\t\t\t\tdmp1);\n+\t\t\tdmq1 = BN_bin2bn((const unsigned char *)\n+\t\t\t\t\txform->rsa.qt.dQ.data,\n+\t\t\t\t\txform->rsa.qt.dQ.length,\n+\t\t\t\t\tdmq1);\n+\t\t\tiqmp = BN_bin2bn((const unsigned char *)\n+\t\t\t\t\txform->rsa.qt.qInv.data,\n+\t\t\t\t\txform->rsa.qt.qInv.length,\n+\t\t\t\t\tiqmp);\n+\n+\t\t\tif (!p || !q || !dmp1 || !dmq1 || !iqmp) {\n+\t\t\t\tRSA_free(rsa);\n+\t\t\t\tgoto err_rsa;\n+\t\t\t}\n+\t\t\tset_rsa_params(rsa, p, q, ret);\n+\t\t\tif (ret) {\n+\t\t\t\tOPENSSL_LOG(ERR,\n+\t\t\t\t\t\"failed to set rsa params\\n\");\n+\t\t\t\tRSA_free(rsa);\n+\t\t\t\tgoto err_rsa;\n+\t\t\t}\n+\t\t\tset_rsa_crt_params(rsa, dmp1, dmq1, iqmp, ret);\n+\t\t\tif (ret) {\n+\t\t\t\tOPENSSL_LOG(ERR,\n+\t\t\t\t\t\"failed to set crt params\\n\");\n+\t\t\t\tRSA_free(rsa);\n+\t\t\t\t/*\n+\t\t\t\t * set already populated params to NULL\n+\t\t\t\t * as its freed by call to RSA_free\n+\t\t\t\t */\n+\t\t\t\tp = q = NULL;\n+\t\t\t\tgoto err_rsa;\n+\t\t\t}\n+\t\t}\n+\n+\t\tset_rsa_keys(rsa, n, e, d, ret);\n+\t\tif (ret) {\n+\t\t\tOPENSSL_LOG(ERR, \"Failed to load rsa keys\\n\");\n+\t\t\tRSA_free(rsa);\n+\t\t\treturn -1;\n+\t\t}\n+\t\tasym_session->u.r.rsa = rsa;\n+\t\tasym_session->xfrm_type = RTE_CRYPTO_ASYM_XFORM_RSA;\n+\t\tbreak;\n+err_rsa:\n+\t\tif (n)\n+\t\t\tBN_free(n);\n+\t\tif (e)\n+\t\t\tBN_free(e);\n+\t\tif (d)\n+\t\t\tBN_free(d);\n+\t\tif (p)\n+\t\t\tBN_free(p);\n+\t\tif (q)\n+\t\t\tBN_free(q);\n+\t\tif (dmp1)\n+\t\t\tBN_free(dmp1);\n+\t\tif (dmq1)\n+\t\t\tBN_free(dmq1);\n+\t\tif (iqmp)\n+\t\t\tBN_free(iqmp);\n+\n+\t\treturn -1;\n+\t}\n+\tcase RTE_CRYPTO_ASYM_XFORM_MODEX:\n+\t{\n+\t\tstruct rte_crypto_modex_xform *xfrm = &(xform->modex);\n+\n+\t\tBN_CTX *ctx = BN_CTX_new();\n+\t\tif (ctx == NULL) {\n+\t\t\tOPENSSL_LOG(ERR,\n+\t\t\t\t\" failed to allocate resources\\n\");\n+\t\t\treturn -1;\n+\t\t}\n+\t\tBN_CTX_start(ctx);\n+\t\tBIGNUM *mod = BN_CTX_get(ctx);\n+\t\tBIGNUM *exp = BN_CTX_get(ctx);\n+\t\tif (mod == NULL || exp == NULL) {\n+\t\t\tBN_CTX_end(ctx);\n+\t\t\tBN_CTX_free(ctx);\n+\t\t\treturn -1;\n+\t\t}\n+\n+\t\tmod = BN_bin2bn((const unsigned char *)\n+\t\t\t\txfrm->modulus.data,\n+\t\t\t\txfrm->modulus.length, mod);\n+\t\texp = BN_bin2bn((const unsigned char *)\n+\t\t\t\txfrm->exponent.data,\n+\t\t\t\txfrm->exponent.length, exp);\n+\t\tasym_session->u.e.ctx = ctx;\n+\t\tasym_session->u.e.mod = mod;\n+\t\tasym_session->u.e.exp = exp;\n+\t\tasym_session->xfrm_type = RTE_CRYPTO_ASYM_XFORM_MODEX;\n+\t\tbreak;\n+\t}\n+\tcase RTE_CRYPTO_ASYM_XFORM_MODINV:\n+\t{\n+\t\tstruct rte_crypto_modinv_xform *xfrm = &(xform->modinv);\n+\n+\t\tBN_CTX *ctx = BN_CTX_new();\n+\t\tif (ctx == NULL) {\n+\t\t\tOPENSSL_LOG(ERR,\n+\t\t\t\t\" failed to allocate resources\\n\");\n+\t\t\treturn -1;\n+\t\t}\n+\t\tBN_CTX_start(ctx);\n+\t\tBIGNUM *mod = BN_CTX_get(ctx);\n+\t\tif (mod == NULL) {\n+\t\t\tBN_CTX_end(ctx);\n+\t\t\tBN_CTX_free(ctx);\n+\t\t\treturn -1;\n+\t\t}\n+\n+\t\tmod = BN_bin2bn((const unsigned char *)\n+\t\t\t\txfrm->modulus.data,\n+\t\t\t\txfrm->modulus.length,\n+\t\t\t\tmod);\n+\t\tasym_session->u.m.ctx = ctx;\n+\t\tasym_session->u.m.modulus = mod;\n+\t\tasym_session->xfrm_type = RTE_CRYPTO_ASYM_XFORM_MODINV;\n+\t\tbreak;\n+\t}\n+\tdefault:\n+\t\treturn -1;\n+\t}\n+\n+\treturn 0;\n+}\n+\n+/** Configure the session from a crypto xform chain */\n+static int\n+openssl_pmd_asym_session_configure(struct rte_cryptodev *dev __rte_unused,\n+\t\tstruct rte_crypto_asym_xform *xform,\n+\t\tstruct rte_cryptodev_asym_session *sess,\n+\t\tstruct rte_mempool *mempool)\n+{\n+\tvoid *asym_sess_private_data;\n+\tint ret;\n+\n+\tif (unlikely(sess == NULL)) {\n+\t\tOPENSSL_LOG(ERR, \"invalid asymmetric session struct\");\n+\t\treturn -EINVAL;\n+\t}\n+\n+\tif (rte_mempool_get(mempool, &asym_sess_private_data)) {\n+\t\tCDEV_LOG_ERR(\n+\t\t\t\"Couldn't get object from session mempool\");\n+\t\treturn -ENOMEM;\n+\t}\n+\n+\tret = openssl_set_asym_session_parameters(asym_sess_private_data,\n+\t\t\txform);\n+\tif (ret != 0) {\n+\t\tOPENSSL_LOG(ERR, \"failed configure session parameters\");\n+\n+\t\t/* Return session to mempool */\n+\t\trte_mempool_put(mempool, asym_sess_private_data);\n+\t\treturn ret;\n+\t}\n+\n+\tset_asym_session_private_data(sess, dev->driver_id,\n+\t\t\tasym_sess_private_data);\n+\n+\treturn 0;\n+}\n \n /** Clear the memory of session so it doesn't leave key material behind */\n static void\n@@ -717,6 +1002,50 @@ openssl_pmd_sym_session_clear(struct rte_cryptodev *dev,\n \t}\n }\n \n+static void openssl_reset_asym_session(struct openssl_asym_session *sess)\n+{\n+\tswitch (sess->xfrm_type) {\n+\tcase RTE_CRYPTO_ASYM_XFORM_RSA:\n+\t\tif (sess->u.r.rsa)\n+\t\t\tRSA_free(sess->u.r.rsa);\n+\t\tbreak;\n+\tcase RTE_CRYPTO_ASYM_XFORM_MODEX:\n+\t\tif (sess->u.e.ctx) {\n+\t\t\tBN_CTX_end(sess->u.e.ctx);\n+\t\t\tBN_CTX_free(sess->u.e.ctx);\n+\t\t}\n+\t\tbreak;\n+\tcase RTE_CRYPTO_ASYM_XFORM_MODINV:\n+\t\tif (sess->u.m.ctx) {\n+\t\t\tBN_CTX_end(sess->u.m.ctx);\n+\t\t\tBN_CTX_free(sess->u.m.ctx);\n+\t\t}\n+\t\tbreak;\n+\tdefault:\n+\t\tbreak;\n+\t}\n+}\n+\n+/** Clear the memory of asymmetric session\n+ * so it doesn't leave key material behind\n+ */\n+static void\n+openssl_pmd_asym_session_clear(struct rte_cryptodev *dev,\n+\t\tstruct rte_cryptodev_asym_session *sess)\n+{\n+\tuint8_t index = dev->driver_id;\n+\tvoid *sess_priv = get_asym_session_private_data(sess, index);\n+\n+\t/* Zero out the whole structure */\n+\tif (sess_priv) {\n+\t\topenssl_reset_asym_session(sess_priv);\n+\t\tmemset(sess_priv, 0, sizeof(struct openssl_asym_session));\n+\t\tstruct rte_mempool *sess_mp = rte_mempool_from_obj(sess_priv);\n+\t\tset_asym_session_private_data(sess, index, NULL);\n+\t\trte_mempool_put(sess_mp, sess_priv);\n+\t}\n+}\n+\n struct rte_cryptodev_ops openssl_pmd_ops = {\n \t\t.dev_configure\t\t= openssl_pmd_config,\n \t\t.dev_start\t\t= openssl_pmd_start,\n@@ -733,8 +1062,11 @@ struct rte_cryptodev_ops openssl_pmd_ops = {\n \t\t.queue_pair_count\t= openssl_pmd_qp_count,\n \n \t\t.sym_session_get_size\t= openssl_pmd_sym_session_get_size,\n+\t\t.asym_session_get_size\t= openssl_pmd_asym_session_get_size,\n \t\t.sym_session_configure\t= openssl_pmd_sym_session_configure,\n-\t\t.sym_session_clear\t= openssl_pmd_sym_session_clear\n+\t\t.asym_session_configure\t= openssl_pmd_asym_session_configure,\n+\t\t.sym_session_clear\t= openssl_pmd_sym_session_clear,\n+\t\t.asym_session_clear\t= openssl_pmd_asym_session_clear\n };\n \n struct rte_cryptodev_ops *rte_openssl_pmd_ops = &openssl_pmd_ops;\ndiff --git a/drivers/crypto/openssl/rte_openssl_pmd_private.h b/drivers/crypto/openssl/rte_openssl_pmd_private.h\nindex 29fcb76..0ebe596 100644\n--- a/drivers/crypto/openssl/rte_openssl_pmd_private.h\n+++ b/drivers/crypto/openssl/rte_openssl_pmd_private.h\n@@ -8,6 +8,7 @@\n #include <openssl/evp.h>\n #include <openssl/hmac.h>\n #include <openssl/des.h>\n+#include <openssl/rsa.h>\n \n #define CRYPTODEV_NAME_OPENSSL_PMD\tcrypto_openssl\n /**< Open SSL Crypto PMD device name */\n@@ -142,6 +143,24 @@ struct openssl_session {\n \n } __rte_cache_aligned;\n \n+/** OPENSSL crypto private asymmetric session structure */\n+struct openssl_asym_session {\n+\tenum rte_crypto_asym_xform_type xfrm_type;\n+\tunion {\n+\t\tstruct rsa {\n+\t\t\tRSA *rsa;\n+\t\t} r;\n+\t\tstruct exp {\n+\t\t\tBIGNUM *exp;\n+\t\t\tBIGNUM *mod;\n+\t\t\tBN_CTX *ctx;\n+\t\t} e;\n+\t\tstruct mod {\n+\t\t\tBIGNUM *modulus;\n+\t\t\tBN_CTX *ctx;\n+\t\t} m;\n+\t} u;\n+} __rte_cache_aligned;\n /** Set and validate OPENSSL crypto session parameters */\n extern int\n openssl_set_session_parameters(struct openssl_session *sess,\n",
    "prefixes": [
        "v5",
        "1/3"
    ]
}