From patchwork Sun Jun 4 09:42:44 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Gowrishankar Muthukrishnan X-Patchwork-Id: 128025 X-Patchwork-Delegate: gakhil@marvell.com Return-Path: X-Original-To: patchwork@inbox.dpdk.org Delivered-To: patchwork@inbox.dpdk.org Received: from mails.dpdk.org (mails.dpdk.org [217.70.189.124]) by inbox.dpdk.org (Postfix) with ESMTP id D723E42C26; Sun, 4 Jun 2023 11:43:03 +0200 (CEST) Received: from mails.dpdk.org (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id D9B0842D0B; Sun, 4 Jun 2023 11:43:00 +0200 (CEST) Received: from mx0b-0016f401.pphosted.com (mx0a-0016f401.pphosted.com [67.231.148.174]) by mails.dpdk.org (Postfix) with ESMTP id D566842C76 for ; Sun, 4 Jun 2023 11:42:58 +0200 (CEST) Received: from pps.filterd (m0045849.ppops.net [127.0.0.1]) by mx0a-0016f401.pphosted.com (8.17.1.19/8.17.1.19) with ESMTP id 3545tYHO009864; Sun, 4 Jun 2023 02:42:57 -0700 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=marvell.com; h=from : to : cc : subject : date : message-id : in-reply-to : references : mime-version : content-transfer-encoding : content-type; s=pfpt0220; bh=+rmptUCs5Qa4G/rbPUEdmAe1mz+4mAx4F5bkaIfAi3g=; b=XoNiwS7rFXhE6DCB8aNGsnQw4WFUJ9od4eLezH4jyszLN6VdYyKSadGrvIX8AbRQXMl/ OPk2B3mP7US4BWCX56NGXvj00tTA2Vz6EdeE3bQ27onxQ/I3Z3rHYqs0Bq8DsvXaNTu4 I5N8wm23H3zinThqIlSnhRGho8mqHgk2OHUXElcFhVHg7FkUhLincBMm3Yj+fGO57+S8 27dNDqLc+KcL+kw60E5Ps92xxR/kLlRi8DfFmt6zNccBQEfrEqo+sN6tFhkmbLYd/wAw cwYHRoiwRyu9WdNjvIXPNoar9uvWAk4KSW8XtJb6ELb4dm7AmU7rZ05SXlXhH7Ayc/Bu VA== Received: from dc5-exch01.marvell.com ([199.233.59.181]) by mx0a-0016f401.pphosted.com (PPS) with ESMTPS id 3r02vpanu4-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-SHA384 bits=256 verify=NOT); Sun, 04 Jun 2023 02:42:57 -0700 Received: from DC5-EXCH02.marvell.com (10.69.176.39) by DC5-EXCH01.marvell.com (10.69.176.38) with Microsoft SMTP Server (TLS) id 15.0.1497.48; Sun, 4 Jun 2023 02:42:56 -0700 Received: from maili.marvell.com (10.69.176.80) by DC5-EXCH02.marvell.com (10.69.176.39) with Microsoft SMTP Server id 15.0.1497.48 via Frontend Transport; Sun, 4 Jun 2023 02:42:55 -0700 Received: from BG-LT91401.marvell.com (BG-LT91401.marvell.com [10.28.175.191]) by maili.marvell.com (Postfix) with ESMTP id 71A113F70A3; Sun, 4 Jun 2023 02:42:53 -0700 (PDT) From: Gowrishankar Muthukrishnan To: CC: , Akhil Goyal , Arkadiusz Kusztal , Fan Zhang , Kai Ji , Gowrishankar Muthukrishnan Subject: [PATCH v3 1/3] cryptodev: add SM2 asymmetric crypto algorithm Date: Sun, 4 Jun 2023 15:12:44 +0530 Message-ID: <87bbd8b9642bf20513448c3747f9e6f28eef0561.1685870993.git.gmuthukrishn@marvell.com> X-Mailer: git-send-email 2.21.0 In-Reply-To: References: MIME-Version: 1.0 X-Proofpoint-GUID: oMrGoMSQkIEbf54fQKKO9pIsjcEXM7sh X-Proofpoint-ORIG-GUID: oMrGoMSQkIEbf54fQKKO9pIsjcEXM7sh X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.254,Aquarius:18.0.957,Hydra:6.0.573,FMLib:17.11.176.26 definitions=2023-06-03_08,2023-06-02_02,2023-05-22_02 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 ShangMi 2 (SM2) is set of public-key cryptography algorithms based on elliptic curves. Added support for asymmetric SM2 in cryptodev along with prime field curve, as referenced in RFC: https://datatracker.ietf.org/doc/html/draft-shen-sm2-ecdsa-02 Signed-off-by: Gowrishankar Muthukrishnan Acked-by: Arek Kusztal --- doc/guides/cryptodevs/features/default.ini | 1 + doc/guides/rel_notes/release_23_07.rst | 5 ++ lib/cryptodev/rte_crypto_asym.h | 87 ++++++++++++++++++++++ lib/cryptodev/rte_cryptodev.c | 1 + 4 files changed, 94 insertions(+) diff --git a/doc/guides/cryptodevs/features/default.ini b/doc/guides/cryptodevs/features/default.ini index 523da0cfa8..a69967bb9e 100644 --- a/doc/guides/cryptodevs/features/default.ini +++ b/doc/guides/cryptodevs/features/default.ini @@ -125,6 +125,7 @@ Diffie-hellman = ECDSA = ECPM = ECDH = +SM2 = ; ; Supported Operating systems of a default crypto driver. diff --git a/doc/guides/rel_notes/release_23_07.rst b/doc/guides/rel_notes/release_23_07.rst index a9b1293689..8b8e69d619 100644 --- a/doc/guides/rel_notes/release_23_07.rst +++ b/doc/guides/rel_notes/release_23_07.rst @@ -55,6 +55,11 @@ New Features Also, make sure to start the actual text at the margin. ======================================================= +* **Added SM2 asymmetric algorithm in cryptodev.** + + Added support for ShamMi 2 (SM2) asymmetric crypto algorithm + along with prime field curve support. + Removed Items ------------- diff --git a/lib/cryptodev/rte_crypto_asym.h b/lib/cryptodev/rte_crypto_asym.h index 989f38323f..ab0b4abea7 100644 --- a/lib/cryptodev/rte_crypto_asym.h +++ b/lib/cryptodev/rte_crypto_asym.h @@ -119,6 +119,11 @@ enum rte_crypto_asym_xform_type { /**< Elliptic Curve Point Multiplication */ RTE_CRYPTO_ASYM_XFORM_ECFPM, /**< Elliptic Curve Fixed Point Multiplication */ + RTE_CRYPTO_ASYM_XFORM_SM2, + /**< ShangMi 2 + * Performs Encrypt, Decrypt, Sign and Verify. + * Refer to rte_crypto_asym_op_type. + */ RTE_CRYPTO_ASYM_XFORM_TYPE_LIST_END /**< End of list */ }; @@ -382,6 +387,17 @@ struct rte_crypto_ec_xform { /**< Pre-defined ec groups */ }; +/** + * Asymmetric SM2 transform data + * + * Structure describing SM2 xform params + * + */ +struct rte_crypto_sm2_xform { + enum rte_crypto_auth_algorithm hash; + /**< Hash algorithm used in SM2 op. */ +}; + /** * Operations params for modular operations: * exponentiation and multiplicative inverse @@ -637,9 +653,79 @@ struct rte_crypto_asym_xform { /**< EC xform parameters, used by elliptic curve based * operations. */ + + struct rte_crypto_sm2_xform sm2; + /**< SM2 xform parameters */ }; }; +/** + * SM2 operation params + */ +struct rte_crypto_sm2_op_param { + enum rte_crypto_asym_op_type op_type; + /**< Signature generation or verification */ + + rte_crypto_uint pkey; + /**< Private key for encryption or sign generation */ + + struct rte_crypto_ec_point q; + /**< Public key for decryption or verification */ + + rte_crypto_param message; + /**< + * Pointer to input data + * - to be encrypted for SM2 public encrypt. + * - to be signed for SM2 sign generation. + * - to be authenticated for SM2 sign verification. + * + * Pointer to output data + * - for SM2 private decrypt. + * In this case the underlying array should have been + * allocated with enough memory to hold plaintext output + * (at least encrypted text length). The message.length field + * will be overwritten by the PMD with the decrypted length. + */ + + rte_crypto_param cipher; + /**< + * Pointer to input data + * - to be decrypted for SM2 private decrypt. + * + * Pointer to output data + * - for SM2 public encrypt. + * In this case the underlying array should have been allocated + * with enough memory to hold ciphertext output (at least X bytes + * for prime field curve of N bytes and for message M bytes, + * where X = (C1 + C2 + C3) and computed based on SM2 RFC as + * C1 (1 + N + N), C2 = M, C3 = N. The cipher.length field will + * be overwritten by the PMD with the encrypted length. + */ + + rte_crypto_uint id; + /**< The SM2 id used by signer and verifier and is in interval (1, n-1). */ + + rte_crypto_uint k; + /**< The SM2 per-message secret number, which is an integer + * in the interval (1, n-1). + * If the random number is generated by the PMD, + * the 'rte_crypto_param.data' parameter should be set to NULL. + */ + + rte_crypto_uint r; + /**< r component of elliptic curve signature + * output : for signature generation (of at least N bytes + * where prime field length is N bytes) + * input : for signature verification + */ + rte_crypto_uint s; + /**< s component of elliptic curve signature + * output : for signature generation (of at least N bytes + * where prime field length is N bytes) + * input : for signature verification + */ +}; + /** * Asymmetric Cryptographic Operation. * @@ -665,6 +751,7 @@ struct rte_crypto_asym_op { struct rte_crypto_dsa_op_param dsa; struct rte_crypto_ecdsa_op_param ecdsa; struct rte_crypto_ecpm_op_param ecpm; + struct rte_crypto_sm2_op_param sm2; }; uint16_t flags; /**< diff --git a/lib/cryptodev/rte_cryptodev.c b/lib/cryptodev/rte_cryptodev.c index a96114b2da..21cabc3ffd 100644 --- a/lib/cryptodev/rte_cryptodev.c +++ b/lib/cryptodev/rte_cryptodev.c @@ -299,6 +299,7 @@ crypto_asym_xform_strings[] = { [RTE_CRYPTO_ASYM_XFORM_DSA] = "dsa", [RTE_CRYPTO_ASYM_XFORM_ECDSA] = "ecdsa", [RTE_CRYPTO_ASYM_XFORM_ECPM] = "ecpm", + [RTE_CRYPTO_ASYM_XFORM_SM2] = "sm2", }; /**