Asymmetric crypto algorithms such as SM2, EdDSA would need per op capability and based on it, the input param to a crypto operation is chosen wisely.
Signed-off-by: Gowrishankar Muthukrishnan <gmuthukri...@marvell.com> --- v3: - Removed unused rte_crypto_sm2_op_capa enum value RTE_CRYPTO_SM2_PKE_KDF. HW that needs it can add this enum. - Test and driver changes split from it and follows within same series. --- lib/cryptodev/rte_crypto_asym.h | 10 ++++++++++ lib/cryptodev/rte_cryptodev.c | 16 ++++++++++++++++ lib/cryptodev/rte_cryptodev.h | 23 +++++++++++++++++++++++ lib/cryptodev/version.map | 3 +++ 4 files changed, 52 insertions(+) diff --git a/lib/cryptodev/rte_crypto_asym.h b/lib/cryptodev/rte_crypto_asym.h index 39d3da3952..1adbe9c389 100644 --- a/lib/cryptodev/rte_crypto_asym.h +++ b/lib/cryptodev/rte_crypto_asym.h @@ -633,6 +633,16 @@ struct rte_crypto_asym_xform { }; }; +/** + * SM2 operation capabilities + */ +enum rte_crypto_sm2_op_capa { + RTE_CRYPTO_SM2_RNG, + /**< Random number generator supported in SM2 ops. */ + RTE_CRYPTO_SM2_PH, + /**< Prehash message before crypto op. */ +}; + /** * SM2 operation params. */ diff --git a/lib/cryptodev/rte_cryptodev.c b/lib/cryptodev/rte_cryptodev.c index 682c9f49d0..d3d8e25b39 100644 --- a/lib/cryptodev/rte_cryptodev.c +++ b/lib/cryptodev/rte_cryptodev.c @@ -628,6 +628,22 @@ rte_cryptodev_asym_xform_capability_check_hash( return ret; } +int +rte_cryptodev_asym_xform_capability_check_opcap( + const struct rte_cryptodev_asymmetric_xform_capability *capability, + enum rte_crypto_asym_op_type op_type, uint8_t cap) +{ + int ret = 0; + + if (!(capability->op_types & (1 << op_type))) + return ret; + + if (capability->op_capa[op_type] & (1 << cap)) + ret = 1; + + return ret; +} + /* spinlock for crypto device enq callbacks */ static rte_spinlock_t rte_cryptodev_callback_lock = RTE_SPINLOCK_INITIALIZER; diff --git a/lib/cryptodev/rte_cryptodev.h b/lib/cryptodev/rte_cryptodev.h index bec947f6d5..aa6ef3a94d 100644 --- a/lib/cryptodev/rte_cryptodev.h +++ b/lib/cryptodev/rte_cryptodev.h @@ -185,6 +185,9 @@ struct rte_cryptodev_asymmetric_xform_capability { * Value 0 means unavailable, and application should pass the required * random value. Otherwise, PMD would internally compute the random number. */ + + uint32_t op_capa[RTE_CRYPTO_ASYM_OP_LIST_END]; + /**< Operation specific capabilities. */ }; uint64_t hash_algos; @@ -359,6 +362,26 @@ rte_cryptodev_asym_xform_capability_check_hash( const struct rte_cryptodev_asymmetric_xform_capability *capability, enum rte_crypto_auth_algorithm hash); +/** + * @warning + * @b EXPERIMENTAL: this API may change without prior notice. + * + * Check if op capability is supported + * + * @param capability Description of the asymmetric crypto capability. + * @param op_type op type + * @param cap op capability + * + * @return + * - Return 1 if the op capability is supported + * - Return 0 if unsupported + */ +__rte_experimental +int +rte_cryptodev_asym_xform_capability_check_opcap( + const struct rte_cryptodev_asymmetric_xform_capability *capability, + enum rte_crypto_asym_op_type op_type, uint8_t cap); + /** * Provide the cipher algorithm enum, given an algorithm string * diff --git a/lib/cryptodev/version.map b/lib/cryptodev/version.map index 594c501855..5d40b7fed0 100644 --- a/lib/cryptodev/version.map +++ b/lib/cryptodev/version.map @@ -87,6 +87,9 @@ EXPERIMENTAL { # added in 24.03 __rte_cryptodev_trace_qp_depth_used; + + # added in 24.11 + rte_cryptodev_asym_xform_capability_check_opcap; }; INTERNAL { -- 2.21.0