cryptodev: add asymmetric xform and op definitions
authorUmesh Kartha <umesh.kartha@caviumnetworks.com>
Tue, 10 Jul 2018 15:33:18 +0000 (21:03 +0530)
committerPablo de Lara <pablo.de.lara.guarch@intel.com>
Wed, 11 Jul 2018 01:57:25 +0000 (03:57 +0200)
Add rte_crypto_asym.h with supported xforms
and associated op structures and APIs

API currently supports:
- RSA Encrypt, Decrypt, Sign and Verify
- Modular Exponentiation and Inversion
- DSA Sign and Verify
- Diffie-Hellman private key exchange
- Diffie-Hellman public key exchange
- Diffie-Hellman shared secret compute
- Diffie-Hellman public/private key pair generation
using xform chain

Signed-off-by: Shally Verma <shally.verma@caviumnetworks.com>
Signed-off-by: Sunila Sahu <sunila.sahu@caviumnetworks.com>
Signed-off-by: Ashish Gupta <ashish.gupta@caviumnetworks.com>
Signed-off-by: Umesh Kartha <umesh.kartha@caviumnetworks.com>
Acked-by: Pablo de Lara <pablo.de.lara.guarch@intel.com>
lib/librte_cryptodev/Makefile
lib/librte_cryptodev/meson.build
lib/librte_cryptodev/rte_crypto_asym.h [new file with mode: 0644]

index bba8dee..c114888 100644 (file)
@@ -23,6 +23,7 @@ SYMLINK-y-include += rte_crypto.h
 SYMLINK-y-include += rte_crypto_sym.h
 SYMLINK-y-include += rte_cryptodev.h
 SYMLINK-y-include += rte_cryptodev_pmd.h
+SYMLINK-y-include += rte_crypto_asym.h
 
 # versioning export map
 EXPORT_MAP := rte_cryptodev_version.map
index bd5fed8..295f509 100644 (file)
@@ -6,5 +6,6 @@ sources = files('rte_cryptodev.c', 'rte_cryptodev_pmd.c')
 headers = files('rte_cryptodev.h',
        'rte_cryptodev_pmd.h',
        'rte_crypto.h',
-       'rte_crypto_sym.h')
+       'rte_crypto_sym.h',
+       'rte_crypto_asym.h')
 deps += ['kvargs', 'mbuf']
diff --git a/lib/librte_cryptodev/rte_crypto_asym.h b/lib/librte_cryptodev/rte_crypto_asym.h
new file mode 100644 (file)
index 0000000..5e185b2
--- /dev/null
@@ -0,0 +1,496 @@
+/* SPDX-License-Identifier: BSD-3-Clause
+ * Copyright(c) 2018 Cavium Networks
+ */
+
+#ifndef _RTE_CRYPTO_ASYM_H_
+#define _RTE_CRYPTO_ASYM_H_
+
+/**
+ * @file rte_crypto_asym.h
+ *
+ * RTE Definitions for Asymmetric Cryptography
+ *
+ * Defines asymmetric algorithms and modes, as well as supported
+ * asymmetric crypto operations.
+ */
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <string.h>
+#include <stdint.h>
+
+#include <rte_memory.h>
+#include <rte_mempool.h>
+#include <rte_common.h>
+
+typedef struct rte_crypto_param_t {
+       uint8_t *data;
+       /**< pointer to buffer holding data */
+       rte_iova_t iova;
+       /**< IO address of data buffer */
+       size_t length;
+       /**< length of data in bytes */
+} rte_crypto_param;
+
+/** asym xform type name strings */
+extern const char *
+rte_crypto_asym_xform_strings[];
+
+/** asym operations type name strings */
+extern const char *
+rte_crypto_asym_op_strings[];
+
+/**
+ * Asymmetric crypto transformation types.
+ * Each xform type maps to one asymmetric algorithm
+ * performing specific operation
+ *
+ */
+enum rte_crypto_asym_xform_type {
+       RTE_CRYPTO_ASYM_XFORM_UNSPECIFIED = 0,
+       /**< Invalid xform. */
+       RTE_CRYPTO_ASYM_XFORM_NONE,
+       /**< Xform type None.
+        * May be supported by PMD to support
+        * passthrough op for debugging purpose.
+        * if xform_type none , op_type is disregarded.
+        */
+       RTE_CRYPTO_ASYM_XFORM_RSA,
+       /**< RSA. Performs Encrypt, Decrypt, Sign and Verify.
+        * Refer to rte_crypto_asym_op_type
+        */
+       RTE_CRYPTO_ASYM_XFORM_DH,
+       /**< Diffie-Hellman.
+        * Performs Key Generate and Shared Secret Compute.
+        * Refer to rte_crypto_asym_op_type
+        */
+       RTE_CRYPTO_ASYM_XFORM_DSA,
+       /**< Digital Signature Algorithm
+        * Performs Signature Generation and Verification.
+        * Refer to rte_crypto_asym_op_type
+        */
+       RTE_CRYPTO_ASYM_XFORM_MODINV,
+       /**< Modular Inverse
+        * Perform Modulus inverse b^(-1) mod n
+        */
+       RTE_CRYPTO_ASYM_XFORM_MODEX,
+       /**< Modular Exponentiation
+        * Perform Modular Exponentiation b^e mod n
+        */
+       RTE_CRYPTO_ASYM_XFORM_TYPE_LIST_END
+       /**< End of list */
+};
+
+/**
+ * Asymmetric crypto operation type variants
+ */
+enum rte_crypto_asym_op_type {
+       RTE_CRYPTO_ASYM_OP_ENCRYPT,
+       /**< Asymmetric Encrypt operation */
+       RTE_CRYPTO_ASYM_OP_DECRYPT,
+       /**< Asymmetric Decrypt operation */
+       RTE_CRYPTO_ASYM_OP_SIGN,
+       /**< Signature Generation operation */
+       RTE_CRYPTO_ASYM_OP_VERIFY,
+       /**< Signature Verification operation */
+       RTE_CRYPTO_ASYM_OP_PRIVATE_KEY_GENERATE,
+       /**< DH Private Key generation operation */
+       RTE_CRYPTO_ASYM_OP_PUBLIC_KEY_GENERATE,
+       /**< DH Public Key generation operation */
+       RTE_CRYPTO_ASYM_OP_SHARED_SECRET_COMPUTE,
+       /**< DH Shared Secret compute operation */
+       RTE_CRYPTO_ASYM_OP_LIST_END
+};
+
+/**
+ * Padding types for RSA signature.
+ */
+enum rte_crypto_rsa_padding_type {
+       RTE_CRYPTO_RSA_PADDING_NONE = 0,
+       /**< RSA no padding scheme */
+       RTE_CRYPTO_RSA_PKCS1_V1_5_BT0,
+       /**< RSA PKCS#1 V1.5 Block Type 0 padding scheme
+        * as descibed in rfc2313
+        */
+       RTE_CRYPTO_RSA_PKCS1_V1_5_BT1,
+       /**< RSA PKCS#1 V1.5 Block Type 01 padding scheme
+        * as descibed in rfc2313
+        */
+       RTE_CRYPTO_RSA_PKCS1_V1_5_BT2,
+       /**< RSA PKCS#1 V1.5 Block Type 02 padding scheme
+        * as descibed in rfc2313
+        */
+       RTE_CRYPTO_RSA_PADDING_OAEP,
+       /**< RSA PKCS#1 OAEP padding scheme */
+       RTE_CRYPTO_RSA_PADDING_PSS,
+       /**< RSA PKCS#1 PSS padding scheme */
+       RTE_CRYPTO_RSA_PADDING_TYPE_LIST_END
+};
+
+/**
+ * RSA private key type enumeration
+ *
+ * enumerates private key format required to perform RSA crypto
+ * transform.
+ *
+ */
+enum rte_crypto_rsa_priv_key_type {
+       RTE_RSA_KEY_TYPE_EXP,
+       /**< RSA private key is an exponent */
+       RTE_RSA_KET_TYPE_QT,
+       /**< RSA private key is in quintuple format
+        * See rte_crypto_rsa_priv_key_qt
+        */
+};
+
+/**
+ * Structure describing RSA private key in quintuple format.
+ * See PKCS V1.5 RSA Cryptography Standard.
+ */
+struct rte_crypto_rsa_priv_key_qt {
+       rte_crypto_param p;
+       /**< p - Private key component P
+        * Private key component of RSA parameter  required for CRT method
+        * of private key operations in Octet-string network byte order
+        * format.
+        */
+
+       rte_crypto_param q;
+       /**< q - Private key component Q
+        * Private key component of RSA parameter  required for CRT method
+        * of private key operations in Octet-string network byte order
+        * format.
+        */
+
+       rte_crypto_param dP;
+       /**< dP - Private CRT component
+        * Private CRT component of RSA parameter  required for CRT method
+        * RSA private key operations in Octet-string network byte order
+        * format.
+        * dP = d mod ( p - 1 )
+        */
+
+       rte_crypto_param dQ;
+       /**< dQ - Private CRT component
+        * Private CRT component of RSA parameter  required for CRT method
+        * RSA private key operations in Octet-string network byte order
+        * format.
+        * dQ = d mod ( q - 1 )
+        */
+
+       rte_crypto_param qInv;
+       /**< qInv - Private CRT component
+        * Private CRT component of RSA parameter  required for CRT method
+        * RSA private key operations in Octet-string network byte order
+        * format.
+        * qInv = inv q mod p
+        */
+};
+
+/**
+ * Asymmetric RSA transform data
+ *
+ * Structure describing RSA xform params
+ *
+ */
+struct rte_crypto_rsa_xform {
+       rte_crypto_param n;
+       /**< n - Prime modulus
+        * Prime modulus data of RSA operation in Octet-string network
+        * byte order format.
+        */
+
+       rte_crypto_param e;
+       /**< e - Public key exponent
+        * Public key exponent used for RSA public key operations in Octet-
+        * string network byte order format.
+        */
+
+       enum rte_crypto_rsa_priv_key_type key_type;
+
+       __extension__
+       union {
+               rte_crypto_param d;
+               /**< d - Private key exponent
+                * Private key exponent used for RSA
+                * private key operations in
+                * Octet-string  network byte order format.
+                */
+
+               struct rte_crypto_rsa_priv_key_qt qt;
+               /**< qt - Private key in quintuple format */
+       };
+};
+
+/**
+ * Asymmetric Modular exponentiation transform data
+ *
+ * Structure describing modular exponentation xform param
+ *
+ */
+struct rte_crypto_modex_xform {
+       rte_crypto_param modulus;
+       /**< modulus
+        * Prime modulus of the modexp transform operation in octet-string
+        * network byte order format.
+        */
+
+       rte_crypto_param exponent;
+       /**< exponent
+        * Private exponent of the modexp transform operation in
+        * octet-string network byte order format.
+        */
+};
+
+/**
+ * Asymmetric modular inverse transform operation
+ *
+ * Structure describing modulus inverse xform params
+ *
+ */
+struct rte_crypto_modinv_xform {
+       rte_crypto_param modulus;
+       /**<
+        * Pointer to the prime modulus data for modular
+        * inverse operation in octet-string network byte
+        * order format.
+        */
+};
+
+/**
+ * Asymmetric DH transform data
+ *
+ * Structure describing deffie-hellman xform params
+ *
+ */
+struct rte_crypto_dh_xform {
+       enum rte_crypto_asym_op_type type;
+       /**< Setup xform for key generate or shared secret compute */
+
+       rte_crypto_param p;
+       /**< p : Prime modulus data
+        * DH prime modulous data in octet-string network byte order format.
+        *
+        */
+
+       rte_crypto_param g;
+       /**< g : Generator
+        * DH group generator data in octet-string network byte order
+        * format.
+        *
+        */
+};
+
+/**
+ * Asymmetric Digital Signature transform operation
+ *
+ * Structure describing DSA xform params
+ *
+ */
+struct rte_crypto_dsa_xform {
+       rte_crypto_param p;
+       /**< p - Prime modulus
+        * Prime modulus data for DSA operation in Octet-string network byte
+        * order format.
+        */
+       rte_crypto_param q;
+       /**< q : Order of the subgroup.
+        * Order of the subgroup data in Octet-string network byte order
+        * format.
+        * (p-1) % q = 0
+        */
+       rte_crypto_param g;
+       /**< g: Generator of the subgroup
+        * Generator  data in Octet-string network byte order format.
+        */
+       rte_crypto_param x;
+       /**< x: Private key of the signer in octet-string network
+        * byte order format.
+        * Used when app has pre-defined private key.
+        * Valid only when xform chain is DSA ONLY.
+        * if xform chain is DH private key generate + DSA, then DSA sign
+        * compute will use internally generated key.
+        */
+};
+
+/**
+ * Operations params for modular operations:
+ * exponentiation and invert
+ *
+ */
+struct rte_crypto_mod_op_param {
+       rte_crypto_param base;
+       /**<
+        * Pointer to base of modular exponentiation/inversion data in
+        * Octet-string network byte order format.
+        */
+};
+
+/**
+ * Asymmetric crypto transform data
+ *
+ * Structure describing asym xforms.
+ */
+struct rte_crypto_asym_xform {
+       struct rte_crypto_asym_xform *next;
+       /**< Pointer to next xform to set up xform chain.*/
+       enum rte_crypto_asym_xform_type xform_type;
+       /**< Asymmetric crypto transform */
+
+       __extension__
+       union {
+               struct rte_crypto_rsa_xform rsa;
+               /**< RSA xform parameters */
+
+               struct rte_crypto_modex_xform modex;
+               /**< Modular Exponentiation xform parameters */
+
+               struct rte_crypto_modinv_xform modinv;
+               /**< Modulus Inverse xform parameters */
+
+               struct rte_crypto_dh_xform dh;
+               /**< DH xform parameters */
+
+               struct rte_crypto_dsa_xform dsa;
+               /**< DSA xform parameters */
+       };
+};
+
+struct rte_cryptodev_asym_session;
+
+/**
+ * RSA operation params
+ *
+ */
+struct rte_crypto_rsa_op_param {
+       enum rte_crypto_asym_op_type op_type;
+       /**< Type of RSA operation for transform */;
+
+       rte_crypto_param message;
+       /**<
+        * Pointer to data
+        * - to be encrypted for RSA public encrypt.
+        * - to be decrypted for RSA private decrypt.
+        * - to be signed for RSA sign generation.
+        * - to be authenticated for RSA sign verification.
+        */
+
+       rte_crypto_param sign;
+       /**<
+        * Pointer to RSA signature data. If operation is RSA
+        * sign @ref RTE_CRYPTO_ASYM_OP_SIGN, buffer will be
+        * over-written with generated signature.
+        *
+        * Length of the signature data will be equal to the
+        * RSA prime modulus length.
+        */
+
+       enum rte_crypto_rsa_padding_type pad;
+       /**< RSA padding scheme to be used for transform */
+
+       enum rte_crypto_auth_algorithm md;
+       /**< Hash algorithm to be used for data hash if padding
+        * scheme is either OAEP or PSS. Valid hash algorithms
+        * are:
+        * MD5, SHA1, SHA224, SHA256, SHA384, SHA512
+        */
+
+       enum rte_crypto_auth_algorithm mgf1md;
+       /**<
+        * Hash algorithm to be used for mask generation if
+        * padding scheme is either OAEP or PSS. If padding
+        * scheme is unspecified data hash algorithm is used
+        * for mask generation. Valid hash algorithms are:
+        * MD5, SHA1, SHA224, SHA256, SHA384, SHA512
+        */
+};
+
+/**
+ * Diffie-Hellman Operations params.
+ * @note:
+ */
+struct rte_crypto_dh_op_param {
+       rte_crypto_param pub_key;
+       /**<
+        * Output generated public key when xform type is
+        * DH PUB_KEY_GENERATION.
+        * Input peer public key when xform type is DH
+        * SHARED_SECRET_COMPUTATION
+        * pub_key is in octet-string network byte order format.
+        *
+        */
+
+       rte_crypto_param priv_key;
+       /**<
+        * Output generated private key if xform type is
+        * DH PRIVATE_KEY_GENERATION
+        * Input when xform type is DH SHARED_SECRET_COMPUTATION.
+        * priv_key is in octet-string network byte order format.
+        *
+        */
+
+       rte_crypto_param shared_secret;
+       /**<
+        * Output with calculated shared secret
+        * when dh xform set up with op type = SHARED_SECRET_COMPUTATION.
+        * shared_secret is an octet-string network byte order format.
+        *
+        */
+};
+
+/**
+ * DSA Operations params
+ *
+ */
+struct rte_crypto_dsa_op_param {
+       enum rte_crypto_asym_op_type op_type;
+       /**< Signature Generation or Verification */
+       rte_crypto_param message;
+       /**< input message to be signed or verified */
+       rte_crypto_param r;
+       /**< dsa sign component 'r' value
+        *
+        * output if op_type = sign generate,
+        * input if op_type = sign verify
+        */
+       rte_crypto_param s;
+       /**< dsa sign component 's' value
+        *
+        * output if op_type = sign generate,
+        * input if op_type = sign verify
+        */
+       rte_crypto_param y;
+       /**< y : Public key of the signer.
+        * Public key data of the signer in Octet-string network byte order
+        * format.
+        * y = g^x mod p
+        */
+};
+
+/**
+ * Asymmetric Cryptographic Operation.
+ *
+ * Structure describing asymmetric crypto operation params.
+ *
+ */
+struct rte_crypto_asym_op {
+       struct rte_cryptodev_asym_session *session;
+       /**< Handle for the initialised session context */
+
+       __extension__
+       union {
+               struct rte_crypto_rsa_op_param rsa;
+               struct rte_crypto_mod_op_param modex;
+               struct rte_crypto_mod_op_param modinv;
+               struct rte_crypto_dh_op_param dh;
+               struct rte_crypto_dsa_op_param dsa;
+       };
+} __rte_cache_aligned;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _RTE_CRYPTO_ASYM_H_ */