From: Sucharitha Sarananaga <ssaranan...@marvell.com> This patch introduces a new API to get AE EC group table address and added static_assert checks to ensure that each enum value in roc_ae_ec_id matches its expected constant. This helps catch accidental changes or reordering of enum values at compile time.
Signed-off-by: Sucharitha Sarananaga <ssaranan...@marvell.com> --- drivers/crypto/cnxk/cnxk_cryptodev_ops.c | 47 ++++++++++++++ drivers/crypto/cnxk/rte_pmd_cnxk_crypto.h | 77 +++++++++++++++++++++++ 2 files changed, 124 insertions(+) diff --git a/drivers/crypto/cnxk/cnxk_cryptodev_ops.c b/drivers/crypto/cnxk/cnxk_cryptodev_ops.c index 97c12c6087..8bc7b2c345 100644 --- a/drivers/crypto/cnxk/cnxk_cryptodev_ops.c +++ b/drivers/crypto/cnxk/cnxk_cryptodev_ops.c @@ -43,6 +43,29 @@ #define CNXK_CPT_MAX_ASYM_OP_MOD_LEN 1024 #define CNXK_CPT_META_BUF_MAX_CACHE_SIZE 128 +static_assert((uint16_t)RTE_PMD_CNXK_AE_EC_ID_P192 == (uint16_t)ROC_AE_EC_ID_P192, + "Enum value mismatch"); +static_assert((uint16_t)RTE_PMD_CNXK_AE_EC_ID_P224 == (uint16_t)ROC_AE_EC_ID_P224, + "Enum value mismatch"); +static_assert((uint16_t)RTE_PMD_CNXK_AE_EC_ID_P256 == (uint16_t)ROC_AE_EC_ID_P256, + "Enum value mismatch"); +static_assert((uint16_t)RTE_PMD_CNXK_AE_EC_ID_P384 == (uint16_t)ROC_AE_EC_ID_P384, + "Enum value mismatch"); +static_assert((uint16_t)RTE_PMD_CNXK_AE_EC_ID_P521 == (uint16_t)ROC_AE_EC_ID_P521, + "Enum value mismatch"); +static_assert((uint16_t)RTE_PMD_CNXK_AE_EC_ID_P160 == (uint16_t)ROC_AE_EC_ID_P160, + "Enum value mismatch"); +static_assert((uint16_t)RTE_PMD_CNXK_AE_EC_ID_P320 == (uint16_t)ROC_AE_EC_ID_P320, + "Enum value mismatch"); +static_assert((uint16_t)RTE_PMD_CNXK_AE_EC_ID_P512 == (uint16_t)ROC_AE_EC_ID_P512, + "Enum value mismatch"); +static_assert((uint16_t)RTE_PMD_CNXK_AE_EC_ID_SM2 == (uint16_t)ROC_AE_EC_ID_SM2, + "Enum value mismatch"); +static_assert((uint16_t)RTE_PMD_CNXK_AE_EC_ID_ED25519 == (uint16_t)ROC_AE_EC_ID_ED25519, + "Enum value mismatch"); +static_assert((uint16_t)RTE_PMD_CNXK_AE_EC_ID_ED448 == (uint16_t)ROC_AE_EC_ID_ED448, + "Enum value mismatch"); + static int cnxk_cpt_get_mlen(void) { @@ -1018,6 +1041,30 @@ rte_pmd_cnxk_ae_fpm_table_get(uint8_t dev_id) return vf->cnxk_fpm_iova; } +RTE_EXPORT_EXPERIMENTAL_SYMBOL(rte_pmd_cnxk_ae_ec_grp_table_get, 25.07) +const struct rte_pmd_cnxk_crypto_ae_ec_group_params ** +rte_pmd_cnxk_ae_ec_grp_table_get(uint8_t dev_id, uint16_t *nb_max_entries) +{ + struct rte_cryptodev *dev; + struct cnxk_cpt_vf *vf; + + dev = rte_cryptodev_pmd_get_dev(dev_id); + if (dev == NULL) { + plt_err("Invalid dev_id %u", dev_id); + return NULL; + } + + vf = dev->data->dev_private; + if (vf == NULL) { + plt_err("VF is not initialized"); + return NULL; + } + + *nb_max_entries = ROC_AE_EC_ID_PMAX; + + return (const struct rte_pmd_cnxk_crypto_ae_ec_group_params **)(void *)vf->ec_grp; +} + static inline void cnxk_crypto_cn10k_submit(struct rte_pmd_cnxk_crypto_qptr *qptr, void *inst, uint16_t nb_inst) { diff --git a/drivers/crypto/cnxk/rte_pmd_cnxk_crypto.h b/drivers/crypto/cnxk/rte_pmd_cnxk_crypto.h index fbf0a2d75d..b9ee322241 100644 --- a/drivers/crypto/cnxk/rte_pmd_cnxk_crypto.h +++ b/drivers/crypto/cnxk/rte_pmd_cnxk_crypto.h @@ -16,6 +16,26 @@ #include <rte_crypto.h> #include <rte_security.h> +#define AE_EC_DATA_MAX 66 + +/** + * Enumerates supported elliptic curves + */ +typedef enum { + RTE_PMD_CNXK_AE_EC_ID_P192 = 0, + RTE_PMD_CNXK_AE_EC_ID_P224 = 1, + RTE_PMD_CNXK_AE_EC_ID_P256 = 2, + RTE_PMD_CNXK_AE_EC_ID_P384 = 3, + RTE_PMD_CNXK_AE_EC_ID_P521 = 4, + RTE_PMD_CNXK_AE_EC_ID_P160 = 5, + RTE_PMD_CNXK_AE_EC_ID_P320 = 6, + RTE_PMD_CNXK_AE_EC_ID_P512 = 7, + RTE_PMD_CNXK_AE_EC_ID_SM2 = 8, + RTE_PMD_CNXK_AE_EC_ID_ED25519 = 9, + RTE_PMD_CNXK_AE_EC_ID_ED448 = 10, + RTE_PMD_CNXK_AE_EC_ID_PMAX +} rte_pmd_cnxk_ae_ec_id; + /* Forward declarations */ /** @@ -72,6 +92,41 @@ struct rte_pmd_cnxk_crypto_sess { }; }; +/** + * @brief AE EC (Elliptic Curve) group parameters structure. + * + * This structure holds the parameters for an elliptic curve group used in + * AE (Asymmetric Encryption) operations. It contains the prime, order, + * and curve constants (consta and constb), each represented as a byte array + * with an associated length. The maximum length is set to accommodate the + * largest supported curve (e.g., P521). + */ +struct rte_pmd_cnxk_crypto_ae_ec_group_params { + struct { + /* P521 maximum length */ + uint8_t data[AE_EC_DATA_MAX]; + unsigned int length; + } prime; + + struct { + /* P521 maximum length */ + uint8_t data[AE_EC_DATA_MAX]; + unsigned int length; + } order; + + struct { + /* P521 maximum length */ + uint8_t data[AE_EC_DATA_MAX]; + unsigned int length; + } consta; + + struct { + /* P521 maximum length */ + uint8_t data[AE_EC_DATA_MAX]; + unsigned int length; + } constb; +}; + /** * Get queue pointer of a specific queue in a cryptodev. * @@ -230,4 +285,26 @@ int rte_pmd_cnxk_crypto_qp_stats_get(struct rte_pmd_cnxk_crypto_qptr *qptr, */ __rte_experimental const uint64_t *rte_pmd_cnxk_ae_fpm_table_get(uint8_t dev_id); +/** + * Retrieves the addresses of the AE EC group table. + * + * This API should be called only after the cryptodev device has been + * successfully configured. The returned pointer reference memory that is + * valid as long as the device remains configured and is not destroyed or + * reconfigured. If the device is reconfigured or destroyed, the memory + * referenced by the returned pointer becomes invalid and must not be used. + * + * @param dev_id + * Device identifier of cryptodev device. + * @param nb_max_entries + * Pointer to store the maximum number of entries in the EC group table. + * This value is set by the function to indicate how many entries can be + * retrieved from the table. + * @return + * - On success, pointer to the AE EC group table structure address. + * - NULL on error. + */ +__rte_experimental const struct rte_pmd_cnxk_crypto_ae_ec_group_params ** +rte_pmd_cnxk_ae_ec_grp_table_get(uint8_t dev_id, uint16_t *nb_max_entries); + #endif /* _PMD_CNXK_CRYPTO_H_ */ -- 2.25.1