get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

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

{
    "id": 42979,
    "url": "http://patches.dpdk.org/api/patches/42979/?format=api",
    "web_url": "http://patches.dpdk.org/project/dpdk/patch/1531404526-17984-2-git-send-email-shally.verma@caviumnetworks.com/",
    "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",
        "list_archive_url": "https://inbox.dpdk.org/dev",
        "list_archive_url_format": "https://inbox.dpdk.org/dev/{}",
        "commit_url_format": ""
    },
    "msgid": "<1531404526-17984-2-git-send-email-shally.verma@caviumnetworks.com>",
    "list_archive_url": "https://inbox.dpdk.org/dev/1531404526-17984-2-git-send-email-shally.verma@caviumnetworks.com",
    "date": "2018-07-12T14:08:44",
    "name": "[v4,1/3] crypto/openssl: add rsa and mod asym op",
    "commit_ref": null,
    "pull_url": null,
    "state": "superseded",
    "archived": true,
    "hash": "18218a5944522a85baef99aef1f69ed98de156c0",
    "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/project/dpdk/patch/1531404526-17984-2-git-send-email-shally.verma@caviumnetworks.com/mbox/",
    "series": [
        {
            "id": 550,
            "url": "http://patches.dpdk.org/api/series/550/?format=api",
            "web_url": "http://patches.dpdk.org/project/dpdk/list/?series=550",
            "date": "2018-07-12T14:08:43",
            "name": "crypto/openssl: support asymmetric crypto",
            "version": 4,
            "mbox": "http://patches.dpdk.org/series/550/mbox/"
        }
    ],
    "comments": "http://patches.dpdk.org/api/patches/42979/comments/",
    "check": "success",
    "checks": "http://patches.dpdk.org/api/patches/42979/checks/",
    "tags": {},
    "related": [],
    "headers": {
        "Return-Path": "<dev-bounces@dpdk.org>",
        "X-Original-To": "patchwork@dpdk.org",
        "Delivered-To": "patchwork@dpdk.org",
        "Received": [
            "from [92.243.14.124] (localhost [127.0.0.1])\n\tby dpdk.org (Postfix) with ESMTP id 5DB611B472;\n\tThu, 12 Jul 2018 16:09:21 +0200 (CEST)",
            "from NAM05-DM3-obe.outbound.protection.outlook.com\n\t(mail-eopbgr730078.outbound.protection.outlook.com [40.107.73.78])\n\tby dpdk.org (Postfix) with ESMTP id 61AF81B464\n\tfor <dev@dpdk.org>; Thu, 12 Jul 2018 16:09:18 +0200 (CEST)",
            "from hyd1sverma-dt.caveonetworks.com (115.113.156.2) by\n\tDM5PR0701MB3637.namprd07.prod.outlook.com (2603:10b6:4:7d::38) with\n\tMicrosoft SMTP Server (version=TLS1_2,\n\tcipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id\n\t15.20.952.18; Thu, 12 Jul 2018 14:09:14 +0000"
        ],
        "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=vbKAJlpUgUIe7jlRZUObpeZX+HilIlxPALkW52Z8G6c=;\n\tb=ju4kyypvFT8J4CXjHkGGuBpndWC+8JVfn2FLwXJ8sRseKyRum1CIzj8EIB/J3KQOv6y5SSDHF+/DgorJJ7elsUluLCnP/km0KxN+O3xYRYyjhMyFWd1L8vUkgrHncNR4O4o1AgNWi3zmuejYXwjs6IgZhFZ6Ol8rWzjGmyvmgis=",
        "Authentication-Results": "spf=none (sender IP is )\n\tsmtp.mailfrom=Shally.Verma@cavium.com; ",
        "From": "Shally Verma <shally.verma@caviumnetworks.com>",
        "To": "pablo.de.lara.guarch@intel.com",
        "Cc": "dev@dpdk.org, pathreya@caviumnetworks.com, nmurthy@caviumnetworks.com,\n\tSunila Sahu <sunila.sahu@caviumnetworks.com>,\n\tAshish Gupta <ashish.gupta@caviumnetworks.com>",
        "Date": "Thu, 12 Jul 2018 19:38:44 +0530",
        "Message-Id": "<1531404526-17984-2-git-send-email-shally.verma@caviumnetworks.com>",
        "X-Mailer": "git-send-email 1.9.1",
        "In-Reply-To": "<1531404526-17984-1-git-send-email-shally.verma@caviumnetworks.com>",
        "References": "<1531404526-17984-1-git-send-email-shally.verma@caviumnetworks.com>",
        "MIME-Version": "1.0",
        "Content-Type": "text/plain",
        "X-Originating-IP": "[115.113.156.2]",
        "X-ClientProxiedBy": "MAXPR0101CA0029.INDPRD01.PROD.OUTLOOK.COM\n\t(2603:1096:a00:d::15) To DM5PR0701MB3637.namprd07.prod.outlook.com\n\t(2603:10b6:4:7d::38)",
        "X-MS-PublicTrafficType": "Email",
        "X-MS-Office365-Filtering-Correlation-Id": "cc61757a-4862-45c8-0790-08d5e8010d93",
        "X-Microsoft-Antispam": "UriScan:; BCL:0; PCL:0;\n\tRULEID:(7020095)(4652040)(8989117)(5600053)(711020)(4534165)(7168020)(4627221)(201703031133081)(201702281549075)(8990107)(2017052603328)(7153060)(7193020);\n\tSRVR:DM5PR0701MB3637; ",
        "X-Microsoft-Exchange-Diagnostics": [
            "1; DM5PR0701MB3637;\n\t3:u9jC86K+yWgabP9BNOuzuvBYAyD4jy9Ra3KwhKtjAAEWrgM0ub06SqIl3iIKpcCb1VESybdQvgplz573RsgiH1LUcB1In34R+LMKpVaKPHFdshlgNT+n/BTQZJ8X+OqHWj6fZlzlovAzn6Rebz14js5Kbhw7SBp0b+w3ceu0uKvNrnTPW5syfzUrI+jlyYVtUqEjHH1DtWmEkoBDykkBkdd4BMMkh+j7FLtYErKSU39dMbo0XBRB9fIXQNI0Jg3Z;\n\t25:zySobmT57bIw/XZYJMa8nC8QsmvVWVVAjCcwYGsRAR1mh7FowJhCcsfMFJZA3O9zJNI5q2OsemNYC/p6dm9lmbVTmXlCp0cZLAKJI/36Or58h/OYjbTxiyictWRT+HUBubyVOg/2pVtd9pSLORVdwkHCLFh5/xex+EKzrtuscd1EqPxr9BINOJQfF98a2cF02la2v0CMzcdt4WPK2S2fUeU5ujENcGC3WrKenM5AypRH2hP0w1eOKU81L1Qgx2CjdQ4z6MhK8RtF1E/q9t86dQGtEfOY2pHGbH6hQwRm3O+swP3fI8gQRI8WQGu4EhtPVBbHjw0QkhbXknv9logTQQ==;\n\t31:KqhIb5T3NZQEBRtmNf17nBbmt15pIblP3a7654QVIK3PdMFN46KVx2DKSchyHtccw0Gc/evBepPtfRsTw473FzcoQjYhXBubFrfxm1yWNKBmjICn1EubDJ6acxad2MI010cze/0exUR60CM54vFju5V6NAcz9s88BB5CWzbeIfRxB21VYK8lXLEoMAON7VjXCtIvtP9/v4EcoyKEgelPtvtBkhtqjXCGeyH0B1iEyNo=",
            "1; DM5PR0701MB3637;\n\t20:QR2BvyfuKzCSCN0GJy+G7/dybO2LrkrObXm/gRVQaJVJf/BmojYzbCDq1xknK3em6cj34QPEYFdL3epu7suhhanTS3JVeoyTSiNIbqa7d+LbOq+SrU0p4W9m4OSaOCy4jiqyTAVKpDsV8Nn9PxH8LYdsq+k9fLQ5/Tmt+ZWbDihtP1qCmtOEg9iUX3JkefmnpUOsk01nS41fUXWfSlGz2zg3n5nEyIv8dJzsNqbLUcBH9AgA46NX1yNkpv0CeU7YNjbB2IgE6OgPwAU3bGfrE+ePEI977GVaRHhsujIJwujivi7HVd31GQC5HVWQKIUasCXdtbbPydt1VkX/AidjD+5/HetFQPjRGfLVZ1bvjN3e5A1+R/P+4n3AdvmXMjnu0H6p4K9g4oYmkSGNyLvk5h2FMOSTtE29QNdBfZSpHx4ZG4PU5gN9pHvHt0saSs0r9g2x2MQSr+J0YuhXyZUJlAnKTkQlxfSGWMv26OofoCcN+95+1nAbIY5FYxC7eDVo1Wxo7GvksYMAyBtxhr1cRA3DzojHWmhOXPxWiBQS8GlJ6/MZbJJVfwAM1+amAKvU2jKibKohiuash5x1fBQ/HKOYr/qSaLz4c0IEUmhlAgk=;\n\t4:SkV+xtWLgDJ2PfAOu4PbR3pET3UDRslr5qvEc2H/cSDZMbR60MJrQaMVHoCqhp4LA+jm9OLgWG9gzgKj8drK247B5uzB47Io7zIBsK9QtGlB5psjmkX5/vmzCUmaHnA2ZGn8imV8aPlrOmY9t0wyMBWT7gtn0x6oHLDy85tEdKmGqu2E+f73vmGf6CVgYOsUMIXtKsB8VwCf3ZTIAChNWlfi5UscIJxbQMQi1t2HTRRLjxqbu3AvkRYtDdk7Y3cP77BaOchIGxoh4gBJSeNBMw==",
            "=?us-ascii?Q?1; DM5PR0701MB3637;\n\t23:Wnj/vYbyGKerVd5Ot1iOceMsqiFdcZ6GhDMVRIC?=\n\ttuEJEtAU7+J6BhIogmaga5SDFPU+Zbeq6+sxfhUlmOwOA/ubZ3jV/tyiAj/2EOUgOb31ZPW5nkfao2oTVf3tRh2E5D5/74u6e51h6/rDrEovJ2jYibYs4fEQsymKuopHyjWwGU+Ky/1VARGbVgXfedI1k39OggaoE5UaMfngr5cTXc6g67aoYge30ZnxME4WCk3mOwiATNm1VWvUUPxnOlnbRHPHJ4xo9kz2xLkhbxBW4Qa2l/QiGpQwZ4ktqfJ4EkHyfWpPy9faZl7jR+GhhWwYFjYdps7/ujGmFzfumSQeadyOU+KNHKxejGrBIAHVNIHmn3XpegB3rkMeLPog5RUGWTWXQRE8MSBug8LeQiAOhg5GGP+FqnNrKnUr3JWU1iPHa1irbSHcaLz4XyUfeN6uMRtNMwYJi93eEzz9Y48JfMEuq0Kit2TlfEWqJs5nNS9aH+ZwrcWJmH+JQCDP/IfplN3WKf6R/IHDTgsWgocxPfFmLd8kwaXXxGZ53DrKi27EmEhLivJF89tojsmWHzFrw7L6z6Ht8zTmrX+FVyNnalTL4b5OfWYkqLAa9tbfDrOM5comEeQgfGk4tAhX2rPd2QpW++ZX6soIsbBrvSCfWSILQVbxw1uKp9RkkJ7IA2f6X7vNovLNzYgVAHQoFaNcLC8tX4JzDsQ1bz3wfHvyHEg6BJ0rG/S5eqbl39oPEpV1iFew38qB+w8NcP1EW09UyTgaR+9FnbsIAA9AnwP5M6QeMpVCcQDUPZ3hlE8OxuK2sTsm4rc4FzR/jX8Jui23F7sZoKFgMvPh9PAoeYKJjiCj5CE3UKrYbkxHE/n+JvBdy8u1VvlSaW3ddW2xy2pRmWvGT2G6jVEleAjXU+2HSHkyn0Z0YaTHRpHPD2OtiiJ5pjiCA+WfPt9dLueHNtAqlXlsRDxcrIsaRSj+m/DGUdGpHRiqe5y8QKEdRrgKQlG8LpiMvLsxhS56BY5GOgw0Fm9+8Hbtz3HJsSL6DR7hswTwDwNaVtgAPrJ7TMG/vMihPcDPoOkUUeSRc3OFeYhpuvVD7ixP31vM3ElS6kHnScvnUymvpRFDVJ+/xeKdZLRI2824cmXQZotcLctSaNvNvHAMEyIWujTj6nGwao1mXhIi1nn+aWraKhQxFkwHkC2GOBmmEdjeTSb4zxNzIT6fhhcOKh/dSPfHlPBddTrNBFkQF26akso9H6wpRLmY82BD5elTrsHBVVOiuAND21x/VLef7DcDVCOo0jKPXTLefIEV0D0gK2+sMAvZAy7ckND3TYXsXnXXYn4sn4LNhC/qHTw0ajstLL2Jc0D9lF34URRqT2GyEAZ2iazeKvzmkxjY=",
            "1; DM5PR0701MB3637;\n\t6:+pg8B2Qi6/7O6ooNGaD7q8AB2ZT4HVan9jaQMK1+DsxWMbmHybMh4iKTqnN2xNYn39VOOEIf/GiBfjojUDlJOhsA6PS4DZ8x5Z6aj0RlXizyf+eA/XtV4gzQ+tEwXfvdCwAtnkqXyUZLXaA2P+HdjGeTrqv9NJpZVW7zBkmJk3EQGtqWG6GwqKi5aYK8TY/+NmzkfFzCq5AIDrtEHKAI/fmda3KvgDnLSoDBlR4WaUZBjf4hugKFIZEpY+XZ2tAusjEY5nlEBOQZOS6EimEjXmGKGY8HW6QWBCCxUgPoN0cyniwpUQpyGkfmCAETaFRFnJ3KZLbae9/ZnKZKiPGbEQ/jla/4Jb0Qzy4fu+O0dCmLgFylxvnFcZl23DoBywAOtpOm3ytzFfBQIQOT66IAngsHG3D/KVEofW1hmS9j6GebcDZPlgsC79+B5jjw6aGGIKtwPG4w60gjY5MhjeZXVg==;\n\t5:lQQqlj6aorX8NLl44hFvSEJ5cMMRwmb+n+ybmjPDpJuTL9kKW2iIJ7VArSAYL7gEXKHeUEfrG80jF0nwqQMQCPHSjFf20+txZrmCoZYV6o4l0XxdallN1+mndZJeNK/XKFsjpCXP0Ox7Z/wsOd0Df3HQyMM+wHzbm9qNUcDVobU=;\n\t24:zkFXOtDwQL7f40YbTjWy7NItNQGW97ydd5l45cfG+i1ytLDsxsZkVj+gNM9fASMjWd4BJkKTv7kfn/tTx1ZXyObZY4ssYhZCdBlic4H7/Co=",
            "1; DM5PR0701MB3637;\n\t7:qPSqXIFFJcilgU0t2+MFCvCspJY8f7NuADcrMZDOvoB5wxouLNreH2CcJMqxVTwk5OSRsmrG9qLGlfXDLZxqHfzbogKPkgRzrTvrSZaRsA7oh6b42xTl2IsKdhfYmc/A5qnXzTb8MoeHyiWyHX1iyMKUcFW4ulxS26C+SBa1uckhwGyNgEyAwArcOTzYeG3vCmQpQvSLYN1dlfW/SK6N5L6kazPpBDVBNC5IMvkAMvjt/cH7ZrVmqs1L6Y+fYhga"
        ],
        "X-MS-TrafficTypeDiagnostic": "DM5PR0701MB3637:",
        "X-Microsoft-Antispam-PRVS": "<DM5PR0701MB3637C65B2BC66F19A68F18B7F0590@DM5PR0701MB3637.namprd07.prod.outlook.com>",
        "X-Exchange-Antispam-Report-Test": "UriScan:;",
        "X-MS-Exchange-SenderADCheck": "1",
        "X-Exchange-Antispam-Report-CFA-Test": "BCL:0; PCL:0;\n\tRULEID:(8211001083)(6040522)(2401047)(8121501046)(5005006)(3231311)(944501410)(52105095)(3002001)(10201501046)(93006095)(149027)(150027)(6041310)(201703131423095)(201702281528075)(20161123555045)(201703061421075)(201703061406153)(20161123558120)(20161123564045)(20161123562045)(20161123560045)(6072148)(201708071742011)(7699016);\n\tSRVR:DM5PR0701MB3637; BCL:0; PCL:0; RULEID:; SRVR:DM5PR0701MB3637; ",
        "X-Forefront-PRVS": "0731AA2DE6",
        "X-Forefront-Antispam-Report": "SFV:NSPM;\n\tSFS:(10009020)(136003)(396003)(366004)(39860400002)(376002)(346002)(189003)(199004)(25786009)(6116002)(3846002)(81166006)(2351001)(8936002)(81156014)(8676002)(7736002)(305945005)(53416004)(2906002)(105586002)(106356001)(97736004)(6916009)(6666003)(69596002)(6486002)(36756003)(53936002)(47776003)(6512007)(50226002)(66066001)(4326008)(72206003)(446003)(2616005)(316002)(956004)(54906003)(2361001)(478600001)(14444005)(26005)(107886003)(486006)(16526019)(50466002)(11346002)(76176011)(476003)(44832011)(386003)(52116002)(42882007)(186003)(51416003)(55236004)(6506007)(48376002)(68736007)(5660300001)(16586007);\n\tDIR:OUT; SFP:1101; SCL:1; SRVR:DM5PR0701MB3637;\n\tH:hyd1sverma-dt.caveonetworks.com; FPR:; SPF:None; LANG:en;\n\tPTR:InfoNoRecords; MX:1; A:1; ",
        "Received-SPF": "None (protection.outlook.com: cavium.com does not designate\n\tpermitted sender hosts)",
        "X-Microsoft-Antispam-Message-Info": "V4LvfuIFSjfH33ww+THBziycNa2oGWB4Prywon8tbW3J9giyAzPQJdUqthroNdUX9YQ+P4LzIbmXpEpSr2LIafacHOV+7Ce90n43i6qmZ+V4n/JLYIy8FqXyMXCparYSnM8WhY6mlDPlZ5jqyXcfTNsbIzSShgQzNRe7QVzaN3whZcY+yRMwwqP12lhgPecgZewGFhK4jkBf+110zudXAR/NG3hFzOdZygZdMDNQeBEhmeiQgxereL4GKvFW/1TDRPQQY9QczGp+RYp0wK/BSqxS2LvDpNqfzQwZnRNaWXcM1MpP0uBDPG/6Us/c2rsfY3RofsHWjnxFZxKC8dN3464FRVudAnj4IFMaujKwvdA=",
        "SpamDiagnosticOutput": "1:99",
        "SpamDiagnosticMetadata": "NSPM",
        "X-OriginatorOrg": "caviumnetworks.com",
        "X-MS-Exchange-CrossTenant-OriginalArrivalTime": "12 Jul 2018 14:09:14.1425\n\t(UTC)",
        "X-MS-Exchange-CrossTenant-Network-Message-Id": "cc61757a-4862-45c8-0790-08d5e8010d93",
        "X-MS-Exchange-CrossTenant-FromEntityHeader": "Hosted",
        "X-MS-Exchange-CrossTenant-Id": "711e4ccf-2e9b-4bcf-a551-4094005b6194",
        "X-MS-Exchange-Transport-CrossTenantHeadersStamped": "DM5PR0701MB3637",
        "Subject": "[dpdk-dev] [PATCH v4 1/3] crypto/openssl: add rsa and mod asym op",
        "X-BeenThere": "dev@dpdk.org",
        "X-Mailman-Version": "2.1.15",
        "Precedence": "list",
        "List-Id": "DPDK patches and discussions <dev.dpdk.org>",
        "List-Unsubscribe": "<https://mails.dpdk.org/options/dev>,\n\t<mailto:dev-request@dpdk.org?subject=unsubscribe>",
        "List-Archive": "<http://mails.dpdk.org/archives/dev/>",
        "List-Post": "<mailto:dev@dpdk.org>",
        "List-Help": "<mailto:dev-request@dpdk.org?subject=help>",
        "List-Subscribe": "<https://mails.dpdk.org/listinfo/dev>,\n\t<mailto:dev-request@dpdk.org?subject=subscribe>",
        "Errors-To": "dev-bounces@dpdk.org",
        "Sender": "\"dev\" <dev-bounces@dpdk.org>"
    },
    "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         | 229 ++++++++++++++-\n drivers/crypto/openssl/rte_openssl_pmd_ops.c     | 336 ++++++++++++++++++++++-\n drivers/crypto/openssl/rte_openssl_pmd_private.h |  19 ++\n 4 files changed, 612 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 5228b92..e21a6a1 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@@ -727,19 +728,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@@ -1525,6 +1543,191 @@ 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+\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@@ -1597,7 +1800,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@@ -1606,7 +1809,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@@ -1661,7 +1869,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 5335685..a23a9e2 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": [
        "v4",
        "1/3"
    ]
}