> - Added asymmetric crypto algorithm specific capability struct.
> Included fields like random number capability, padding flags etc.
> 
> Signed-off-by: Arek Kusztal <arkadiuszx.kusz...@intel.com>
> ---
>  app/test-crypto-perf/main.c                  |  12 +-
>  app/test-eventdev/test_perf_common.c         |   2 +-
>  app/test/test_cryptodev_asym.c               | 210 
> +++++++++++++++++++++------
>  app/test/test_event_crypto_adapter.c         |  16 +-
>  drivers/crypto/openssl/rte_openssl_pmd_ops.c | 128 +++++++---------
>  drivers/crypto/qat/dev/qat_asym_pmd_gen1.c   |  68 +++++++--
>  lib/cryptodev/rte_crypto_asym.h              |  48 ++++++
>  lib/cryptodev/rte_cryptodev.c                |  80 +++++++++-
>  lib/cryptodev/rte_cryptodev.h                |  75 +++++++++-
>  lib/cryptodev/version.map                    |   4 +
>  10 files changed, 495 insertions(+), 148 deletions(-)

This would also need a change in documentation.

> 
> diff --git a/app/test-crypto-perf/main.c b/app/test-crypto-perf/main.c
> index 17e30a8e74..f8a4c9cdcf 100644
> --- a/app/test-crypto-perf/main.c
> +++ b/app/test-crypto-perf/main.c
> @@ -364,8 +364,8 @@ cperf_verify_devices_capabilities(struct cperf_options
> *opts,
>       struct rte_cryptodev_sym_capability_idx cap_idx;
>       const struct rte_cryptodev_symmetric_capability *capability;
>       struct rte_cryptodev_asym_capability_idx asym_cap_idx;
> -     const struct rte_cryptodev_asymmetric_xform_capability
> *asym_capability;
> -
> +     const struct rte_cryptodev_asymmetric_capability *asym_capability;
> +     struct rte_crypto_mod_capability mod_capa = {0};
> 
>       uint8_t i, cdev_id;
>       int ret;
> @@ -381,11 +381,11 @@ cperf_verify_devices_capabilities(struct
> cperf_options *opts,
>                       if (asym_capability == NULL)
>                               return -1;
> 
> -                     ret =
> rte_cryptodev_asym_xform_capability_check_modlen(
> -                             asym_capability, opts->modex_data-
> >modulus.len);
> -                     if (ret != 0)
> +                     mod_capa.max_mod_size = opts->modex_data-
> >modulus.len;
> +                     ret = rte_cryptodev_capa_check_mod(asym_capability,
> +                                             mod_capa);
> +                     if (ret == 0)
>                               return ret;
> -
>               }
> 
>               if (opts->op_type == CPERF_AUTH_ONLY ||
> diff --git a/app/test-eventdev/test_perf_common.c b/app/test-
> eventdev/test_perf_common.c
> index b41785492e..ac8e6410ab 100644
> --- a/app/test-eventdev/test_perf_common.c
> +++ b/app/test-eventdev/test_perf_common.c
> @@ -846,7 +846,7 @@ cryptodev_sym_sess_create(struct prod_data *p, struct
> test_perf *t)
>  static void *
>  cryptodev_asym_sess_create(struct prod_data *p, struct test_perf *t)
>  {
> -     const struct rte_cryptodev_asymmetric_xform_capability *capability;
> +     const struct rte_cryptodev_asymmetric_capability *capability;
>       struct rte_cryptodev_asym_capability_idx cap_idx;
>       struct rte_crypto_asym_xform xform;
>       void *sess;
> diff --git a/app/test/test_cryptodev_asym.c b/app/test/test_cryptodev_asym.c
> index 072dbb30f4..c531265642 100644
> --- a/app/test/test_cryptodev_asym.c
> +++ b/app/test/test_cryptodev_asym.c
> @@ -311,10 +311,11 @@ test_cryptodev_asym_op(struct
> crypto_testsuite_params_asym *ts_params,
>       struct rte_crypto_asym_xform xform_tc;
>       void *sess = NULL;
>       struct rte_cryptodev_asym_capability_idx cap_idx;
> -     const struct rte_cryptodev_asymmetric_xform_capability *capability;
> +     const struct rte_cryptodev_asymmetric_capability *capability;
>       uint8_t dev_id = ts_params->valid_devs[0];
>       uint8_t input[TEST_DATA_SIZE] = {0};
>       uint8_t *result = NULL;
> +     struct rte_crypto_mod_capability mod_capa = {0};
> 
>       int ret, status = TEST_SUCCESS;
> 
> @@ -358,8 +359,10 @@ test_cryptodev_asym_op(struct
> crypto_testsuite_params_asym *ts_params,
>               asym_op->modex.base.length = data_tc->modex.base.len;
>               asym_op->modex.result.data = result;
>               asym_op->modex.result.length = data_tc->modex.result_len;
> -             if
> (rte_cryptodev_asym_xform_capability_check_modlen(capability,
> -                             xform_tc.modex.modulus.length)) {
> +
> +             mod_capa.max_mod_size = xform_tc.modex.modulus.length;
> +             if  (!rte_cryptodev_capa_check_mod(capability,
> +                     mod_capa)) {
>                       snprintf(test_msg, ASYM_TEST_MSG_LEN,
>                               "line %u "
>                               "FAILED: %s", __LINE__,
> @@ -378,8 +381,10 @@ test_cryptodev_asym_op(struct
> crypto_testsuite_params_asym *ts_params,
>               asym_op->modinv.base.length = data_tc->modinv.base.len;
>               asym_op->modinv.result.data = result;
>               asym_op->modinv.result.length = data_tc->modinv.result_len;
> -             if
> (rte_cryptodev_asym_xform_capability_check_modlen(capability,
> -                             xform_tc.modinv.modulus.length)) {
> +
> +             mod_capa.max_mod_size = xform_tc.modinv.modulus.length;
> +             if  (!rte_cryptodev_capa_check_mod(capability,
> +                     mod_capa)) {
>                       snprintf(test_msg, ASYM_TEST_MSG_LEN,
>                               "line %u "
>                               "FAILED: %s", __LINE__,
> @@ -963,38 +968,100 @@ ut_teardown_asym(void)
>       rte_cryptodev_stop(ts_params->valid_devs[0]);
>  }
> 
> -static inline void print_asym_capa(
> -             const struct rte_cryptodev_asymmetric_xform_capability
> *capa)
> +static void
> +print_rsa_capability(
> +     const struct rte_cryptodev_asymmetric_capability *capa)
>  {
>       int i = 0;
> 
> +     printf("\nSupported paddings:");
> +     for (; i < 32; i++) {
> +             if (capa->rsa.padding & RTE_BIT32(i))
> +                     printf("\n - %s", rte_crypto_asym_rsa_padding[i]);
> +     }
> +     printf("\nSupported hash functions:");
> +     for (i = 0; i < 32; i++) {
> +             if (capa->rsa.hash & RTE_BIT32(i))
> +                     printf("\n - %s", rte_crypto_auth_algorithm_strings[i]);
> +     }
> +     printf("\nMaximum key size: ");
> +     if (capa->rsa.max_key_size == 0)
> +             printf("Unlimited");
> +     else
> +             printf("%hu", capa->rsa.max_key_size);
> +}
> +
> +static void
> +print_supported_curves(uint64_t curves)
> +{
> +     int i = 0;
> +
> +     printf("\nSupported elliptic curves:");
> +     for (; i < 64; i++) {
> +             if (curves & RTE_BIT64(i))
> +                     printf("\n - %s", rte_crypto_curves_strings[i]);
> +     }
> +}
> +
> +static inline void print_asym_capa(
> +             const struct rte_cryptodev_asymmetric_capability *capa)
> +{
>       printf("\nxform type: %s\n===================\n",
>                       rte_crypto_asym_xform_strings[capa->xform_type]);
> -     printf("operation supported -");
> 
> -     for (i = 0; i < RTE_CRYPTO_ASYM_OP_LIST_END; i++) {
> -             /* check supported operations */
> -             if (rte_cryptodev_asym_xform_capability_check_optype(capa,
> i))
> -                     printf(" %s",
> -                                     rte_crypto_asym_op_strings[i]);
> -             }
> -             switch (capa->xform_type) {
> -             case RTE_CRYPTO_ASYM_XFORM_RSA:
> -             case RTE_CRYPTO_ASYM_XFORM_MODINV:
> -             case RTE_CRYPTO_ASYM_XFORM_MODEX:
> -             case RTE_CRYPTO_ASYM_XFORM_DH:
> -             case RTE_CRYPTO_ASYM_XFORM_DSA:
> -                     printf(" modlen: min %d max %d increment %d",
> -                                     capa->modlen.min,
> -                                     capa->modlen.max,
> -                                     capa->modlen.increment);
> +     switch (capa->xform_type) {
> +     case RTE_CRYPTO_ASYM_XFORM_MODEX:
> +     case RTE_CRYPTO_ASYM_XFORM_MODINV:
> +             printf("Maximum size of modulus: ");
> +             if (capa->mod.max_mod_size == 0)
> +                     printf("Unlimited");
> +             else
> +                     printf("%hu", capa->mod.max_mod_size);
>               break;
> -             case RTE_CRYPTO_ASYM_XFORM_ECDSA:
> -             case RTE_CRYPTO_ASYM_XFORM_ECPM:
> -             default:
> -                     break;
> -             }
> -             printf("\n");
> +     case RTE_CRYPTO_ASYM_XFORM_RSA:
> +             print_rsa_capability(capa);
> +             break;
> +     case RTE_CRYPTO_ASYM_XFORM_DH:

ECDH?? I hope it will be added once it is tested in this app.

> +             printf("Maximum group size: ");
> +             if (capa->dh.max_group_size == 0)
> +                     printf("Unlimited");
> +             else
> +                     printf("%hu", capa->dh.max_group_size);
> +             printf("\nSupport for private key generation: ");
> +             if (capa->dh.priv_key_gen)
> +                     printf("Yes");
> +             else
> +                     printf("No");
> +             break;
> +     case RTE_CRYPTO_ASYM_XFORM_DSA:
> +             printf("Maximum key size: ");
> +             if (capa->dsa.max_key_size == 0)
> +                     printf("Unlimited");
> +             else
> +                     printf("%hu", capa->dsa.max_key_size);
> +             printf("\nSupport for random 'k' generation: ");
> +             if (capa->dsa.random_k)
> +                     printf("Yes");
> +             else
> +                     printf("No");
> +             break;
> +
> +             break;
> +     case RTE_CRYPTO_ASYM_XFORM_ECDSA:
> +             print_supported_curves(capa->ecdsa.curves);
> +             printf("\nSupport for random 'k' generation: ");
> +             if (capa->ecdsa.random_k)
> +                     printf("Yes");
> +             else
> +                     printf("No");
> +             break;
> +     case RTE_CRYPTO_ASYM_XFORM_ECPM:
> +             print_supported_curves(capa->ecpm.curves);
> +             break;
> +     default:
> +             break;
> +     }
> +     printf("\n");
>  }
> 
>  static int
> @@ -1006,7 +1073,7 @@ test_capability(void)
>       const struct rte_cryptodev_capabilities *dev_capa;
>       int i = 0;
>       struct rte_cryptodev_asym_capability_idx idx;
> -     const struct rte_cryptodev_asymmetric_xform_capability *capa;
> +     const struct rte_cryptodev_asymmetric_capability *capa;
> 
>       rte_cryptodev_info_get(dev_id, &dev_info);
>       if (!(dev_info.feature_flags &
> @@ -1023,7 +1090,7 @@ test_capability(void)
>               dev_capa = &(dev_info.capabilities[i]);
>               if (dev_info.capabilities[i].op ==
>                               RTE_CRYPTO_OP_TYPE_ASYMMETRIC) {
> -                     idx.type = dev_capa->asym.xform_capa.xform_type;
> +                     idx.type = dev_capa->asym.xform_type;
> 
>                       capa = rte_cryptodev_asym_capability_get(dev_id,
>                               (const struct
> @@ -1386,10 +1453,11 @@ test_mod_inv(void)
>       void *sess = NULL;
>       int status = TEST_SUCCESS;
>       struct rte_cryptodev_asym_capability_idx cap_idx;
> -     const struct rte_cryptodev_asymmetric_xform_capability *capability;
> +     const struct rte_cryptodev_asymmetric_capability *capability;
>       uint8_t input[TEST_DATA_SIZE] = {0};
>       int ret = 0;
>       uint8_t result[sizeof(mod_p)] = { 0 };
> +     struct rte_crypto_mod_capability mod_capa = {0};
> 
>       if (rte_cryptodev_asym_get_xform_enum(
>               &modinv_xform.xform_type, "modinv") < 0) {
> @@ -1408,13 +1476,11 @@ test_mod_inv(void)
>               return TEST_SKIPPED;
>       }
> 
> -     if (rte_cryptodev_asym_xform_capability_check_modlen(
> -             capability,
> -             modinv_xform.modinv.modulus.length)) {
> -             RTE_LOG(ERR, USER1,
> -                              "Invalid MODULUS length specified\n");
> -                             return TEST_SKIPPED;
> -             }
> +     mod_capa.max_mod_size = modinv_xform.modinv.modulus.length;
> +     if  (!rte_cryptodev_capa_check_mod(capability, mod_capa)) {
> +             RTE_LOG(ERR, USER1, "Invalid MODULUS length specified\n");
> +             return TEST_SKIPPED;
> +     }
> 
>       ret = rte_cryptodev_asym_session_create(dev_id, &modinv_xform,
> sess_mpool, &sess);
>       if (ret < 0) {
> @@ -1499,7 +1565,8 @@ test_mod_exp(void)
>       void *sess = NULL;
>       int status = TEST_SUCCESS;
>       struct rte_cryptodev_asym_capability_idx cap_idx;
> -     const struct rte_cryptodev_asymmetric_xform_capability *capability;
> +     const struct rte_cryptodev_asymmetric_capability *capability;
> +     struct rte_crypto_mod_capability mod_capa = {0};
>       uint8_t input[TEST_DATA_SIZE] = {0};
>       int ret = 0;
>       uint8_t result[sizeof(mod_p)] = { 0 };
> @@ -1522,12 +1589,11 @@ test_mod_exp(void)
>               return TEST_SKIPPED;
>       }
> 
> -     if (rte_cryptodev_asym_xform_capability_check_modlen(
> -                     capability, modex_xform.modex.modulus.length)) {
> -             RTE_LOG(ERR, USER1,
> -                             "Invalid MODULUS length specified\n");
> -                             return TEST_SKIPPED;
> -             }
> +     mod_capa.max_mod_size = modex_xform.modex.modulus.length;
> +     if  (!rte_cryptodev_capa_check_mod(capability, mod_capa)) {
> +             RTE_LOG(ERR, USER1, "Invalid MODULUS length specified\n");
> +             return TEST_SKIPPED;
> +     }
> 
>       /* Create op, create session, and process packets. 8< */
>       op = rte_crypto_op_alloc(op_mpool,
> RTE_CRYPTO_OP_TYPE_ASYMMETRIC);
> @@ -1785,6 +1851,8 @@ test_ecdsa_sign_verify(enum curve curve_id)
>       struct rte_crypto_asym_xform xform;
>       struct rte_crypto_asym_op *asym_op;
>       struct rte_cryptodev_info dev_info;
> +     struct rte_cryptodev_asym_capability_idx idx;
> +     const struct rte_cryptodev_asymmetric_capability *capabilities;
>       struct rte_crypto_op *op = NULL;
>       int ret, status = TEST_SUCCESS;
> 
> @@ -1814,6 +1882,25 @@ test_ecdsa_sign_verify(enum curve curve_id)
> 
>       rte_cryptodev_info_get(dev_id, &dev_info);
> 
> +     struct rte_crypto_ecdsa_capability capa = {
> +             .curves = RTE_BIT32(input_params.curve),
> +             .random_k = 0
> +     };
> +
> +     idx.type = RTE_CRYPTO_ASYM_XFORM_ECDSA;
> +     capabilities = rte_cryptodev_asym_capability_get(dev_id,
> +             (const struct
> +             rte_cryptodev_asym_capability_idx *) &idx);
> +
> +     if (capabilities == NULL) {
> +             status = TEST_SKIPPED;
> +             goto exit;
> +     }
> +     if (!rte_cryptodev_capa_check_ecdsa(capabilities, capa)) {
> +             status = TEST_SKIPPED;
> +             goto exit;
> +     }
> +
>       /* Setup crypto op data structure */
>       op = rte_crypto_op_alloc(op_mpool,
> RTE_CRYPTO_OP_TYPE_ASYMMETRIC);
>       if (op == NULL) {
> @@ -1962,6 +2049,8 @@ test_ecdsa_sign_verify_all_curve(void)
>               status = test_ecdsa_sign_verify(curve_id);
>               if (status == TEST_SUCCESS) {
>                       msg = "succeeded";
> +             } else if (status == TEST_SKIPPED) {
> +                     continue;
>               } else {
>                       msg = "failed";
>                       overall_status = status;
> @@ -1987,6 +2076,8 @@ test_ecpm(enum curve curve_id)
>       struct rte_crypto_asym_xform xform;
>       struct rte_crypto_asym_op *asym_op;
>       struct rte_cryptodev_info dev_info;
> +     struct rte_cryptodev_asym_capability_idx idx;
> +     const struct rte_cryptodev_asymmetric_capability *capabilities;
>       struct rte_crypto_op *op = NULL;
>       int ret, status = TEST_SUCCESS;
> 
> @@ -2016,6 +2107,24 @@ test_ecpm(enum curve curve_id)
> 
>       rte_cryptodev_info_get(dev_id, &dev_info);
> 
> +     struct rte_crypto_ecdsa_capability capa = {
> +             .curves = RTE_BIT32(input_params.curve)
> +     };
> +
> +     idx.type = RTE_CRYPTO_ASYM_XFORM_ECPM;
> +     capabilities = rte_cryptodev_asym_capability_get(dev_id,
> +             (const struct
> +             rte_cryptodev_asym_capability_idx *) &idx);
> +
> +     if (capabilities == NULL) {
> +             status = TEST_SKIPPED;
> +             goto exit;
> +     }
> +     if (!rte_cryptodev_capa_check_ecdsa(capabilities, capa)) {
> +             status = TEST_SKIPPED;
> +             goto exit;
> +     }
> +
>       /* Setup crypto op data structure */
>       op = rte_crypto_op_alloc(op_mpool,
> RTE_CRYPTO_OP_TYPE_ASYMMETRIC);
>       if (op == NULL) {
> @@ -2124,6 +2233,8 @@ test_ecpm_all_curve(void)
>               status = test_ecpm(curve_id);
>               if (status == TEST_SUCCESS) {
>                       msg = "succeeded";
> +             } else if (status == TEST_SKIPPED) {
> +                     continue;
>               } else {
>                       msg = "failed";
>                       overall_status = status;
> @@ -2162,7 +2273,12 @@ static struct unit_test_suite
> cryptodev_qat_asym_testsuite  = {
>       .setup = testsuite_setup,
>       .teardown = testsuite_teardown,
>       .unit_test_cases = {
> +             TEST_CASE_ST(ut_setup_asym, ut_teardown_asym,
> test_capability),
>               TEST_CASE_ST(ut_setup_asym, ut_teardown_asym,
> test_one_by_one),
> +             TEST_CASE_ST(ut_setup_asym, ut_teardown_asym,
> +                          test_ecdsa_sign_verify_all_curve),
> +             TEST_CASE_ST(ut_setup_asym, ut_teardown_asym,
> +                             test_ecpm_all_curve),
>               TEST_CASES_END() /**< NULL terminate unit test array */
>       }
>  };

I think patch need to be split for adding test app changes.


> diff --git a/app/test/test_event_crypto_adapter.c
> b/app/test/test_event_crypto_adapter.c
> index 2ecc7e2cea..9a62241371 100644
> --- a/app/test/test_event_crypto_adapter.c
> +++ b/app/test/test_event_crypto_adapter.c
> @@ -450,7 +450,7 @@ test_session_with_op_forward_mode(void)
>  static int
>  test_asym_op_forward_mode(uint8_t session_less)
>  {
> -     const struct rte_cryptodev_asymmetric_xform_capability *capability;
> +     const struct rte_cryptodev_asymmetric_capability *capability;
>       struct rte_cryptodev_asym_capability_idx cap_idx;
>       struct rte_crypto_asym_xform xform_tc;
>       union rte_event_crypto_metadata m_data;
> @@ -458,6 +458,7 @@ test_asym_op_forward_mode(uint8_t session_less)
>       struct rte_crypto_asym_op *asym_op;
>       struct rte_crypto_op *op;
>       uint8_t input[4096] = {0};
> +     struct rte_crypto_mod_capability mod_capa = {0};
>       uint8_t *result = NULL;
>       struct rte_event ev;
>       void *sess = NULL;
> @@ -503,8 +504,9 @@ test_asym_op_forward_mode(uint8_t session_less)
>       asym_op->modex.base.length = modex_test_case.base.len;
>       asym_op->modex.result.data = result;
>       asym_op->modex.result.length = modex_test_case.result_len;
> -     if (rte_cryptodev_asym_xform_capability_check_modlen(capability,
> -                     xform_tc.modex.modulus.length)) {
> +
> +     mod_capa.max_mod_size = xform_tc.modex.modulus.length;
> +     if  (!rte_cryptodev_capa_check_mod(capability, mod_capa)) {
>               RTE_LOG(INFO, USER1,
>                       "line %u FAILED: %s", __LINE__,
>                       "Invalid MODULUS length specified");
> @@ -784,7 +786,7 @@ test_session_with_op_new_mode(void)
>  static int
>  test_asym_op_new_mode(uint8_t session_less)
>  {
> -     const struct rte_cryptodev_asymmetric_xform_capability *capability;
> +     const struct rte_cryptodev_asymmetric_capability *capability;
>       struct rte_cryptodev_asym_capability_idx cap_idx;
>       struct rte_crypto_asym_xform xform_tc;
>       union rte_event_crypto_metadata m_data;
> @@ -792,6 +794,7 @@ test_asym_op_new_mode(uint8_t session_less)
>       struct rte_crypto_asym_op *asym_op;
>       struct rte_crypto_op *op;
>       uint8_t input[4096] = {0};
> +     struct rte_crypto_mod_capability mod_capa = {0};

Can you move this above to maintain reverse Xmas tree?

>       uint8_t *result = NULL;
>       void *sess = NULL;
>       uint32_t cap;
> @@ -835,8 +838,9 @@ test_asym_op_new_mode(uint8_t session_less)
>       asym_op->modex.base.length = modex_test_case.base.len;
>       asym_op->modex.result.data = result;
>       asym_op->modex.result.length = modex_test_case.result_len;
> -     if (rte_cryptodev_asym_xform_capability_check_modlen(capability,
> -                     xform_tc.modex.modulus.length)) {
> +
> +     mod_capa.max_mod_size = xform_tc.modex.modulus.length;
> +     if  (!rte_cryptodev_capa_check_mod(capability, mod_capa)) {
>               RTE_LOG(INFO, USER1,
>                       "line %u FAILED: %s", __LINE__,
>                       "Invalid MODULUS length specified");
> diff --git a/drivers/crypto/openssl/rte_openssl_pmd_ops.c
> b/drivers/crypto/openssl/rte_openssl_pmd_ops.c
> index 16ec5e15eb..e734fc2a69 100644
> --- a/drivers/crypto/openssl/rte_openssl_pmd_ops.c
> +++ b/drivers/crypto/openssl/rte_openssl_pmd_ops.c
> @@ -7,6 +7,7 @@
>  #include <rte_common.h>
>  #include <rte_malloc.h>
>  #include <cryptodev_pmd.h>
> +#include <rte_bitops.h>
> 
>  #include "openssl_pmd_private.h"
>  #include "compat.h"
> @@ -470,103 +471,82 @@ static const struct rte_cryptodev_capabilities
> openssl_pmd_capabilities[] = {
>                       }, }
>               }, }
>       },
> -     {       /* RSA */
> +     {       /* Modular exponentiation */
>               .op = RTE_CRYPTO_OP_TYPE_ASYMMETRIC,
>               {.asym = {
> -                     .xform_capa = {
> -                             .xform_type =
> RTE_CRYPTO_ASYM_XFORM_RSA,
> -                             .op_types = ((1 <<
> RTE_CRYPTO_ASYM_OP_SIGN) |
> -                                     (1 << RTE_CRYPTO_ASYM_OP_VERIFY)
> |
> -                                     (1 <<
> RTE_CRYPTO_ASYM_OP_ENCRYPT) |
> -                                     (1 <<
> RTE_CRYPTO_ASYM_OP_DECRYPT)),
> -                             {
> -                             .modlen = {
> -                             /* min length is based on openssl rsa keygen */
> -                             .min = 30,
> -                             /* value 0 symbolizes no limit on max length */
> -                             .max = 0,
> -                             .increment = 1
> -                             }, }
> +                     .xform_type = RTE_CRYPTO_ASYM_XFORM_MODEX,
> +                     .mod = {
> +                             .max_mod_size = 0
> +                             }
>                       }
> -             },
>               }
>       },
> -     {       /* modexp */
> +     {       /* Modular multiplicative inverse */
>               .op = RTE_CRYPTO_OP_TYPE_ASYMMETRIC,
>               {.asym = {
> -                     .xform_capa = {
> -                             .xform_type =
> RTE_CRYPTO_ASYM_XFORM_MODEX,
> -                             .op_types = 0,
> -                             {
> -                             .modlen = {
> -                             /* value 0 symbolizes no limit on min length */
> -                             .min = 0,
> -                             /* value 0 symbolizes no limit on max length */
> -                             .max = 0,
> -                             .increment = 1
> -                             }, }
> +                     .xform_type = RTE_CRYPTO_ASYM_XFORM_MODINV,
> +                     .mod = {
> +                             .max_mod_size = 0
> +                             }
>                       }
> -             },
>               }
>       },
> -     {       /* modinv */
> +     {       /* RSA */
>               .op = RTE_CRYPTO_OP_TYPE_ASYMMETRIC,
>               {.asym = {
> -                     .xform_capa = {
> -                             .xform_type =
> RTE_CRYPTO_ASYM_XFORM_MODINV,
> -                             .op_types = 0,
> -                             {
> -                             .modlen = {
> -                             /* value 0 symbolizes no limit on min length */
> -                             .min = 0,
> -                             /* value 0 symbolizes no limit on max length */
> -                             .max = 0,
> -                             .increment = 1
> -                             }, }
> +                     .xform_type = RTE_CRYPTO_ASYM_XFORM_RSA,
> +                     .rsa = {
> +                             .padding =
> +
>       RTE_BIT32(RTE_CRYPTO_RSA_PADDING_NONE) |
> +
>       RTE_BIT32(RTE_CRYPTO_RSA_PADDING_PKCS1_5),
> +                             .hash =
> +                                     RTE_BIT32(RTE_CRYPTO_AUTH_MD5)
> |
> +                                     RTE_BIT32(RTE_CRYPTO_AUTH_SHA1)
>       |
> +
>       RTE_BIT32(RTE_CRYPTO_AUTH_SHA224) |
> +
>       RTE_BIT32(RTE_CRYPTO_AUTH_SHA256) |
> +
>       RTE_BIT32(RTE_CRYPTO_AUTH_SHA384) |
> +
>       RTE_BIT32(RTE_CRYPTO_AUTH_SHA512),
> +                             .max_key_size = 0
> +                             }
>                       }
> -             },
>               }
>       },
> -     {       /* dh */
> +     {       /* Diffie-Hellman */
>               .op = RTE_CRYPTO_OP_TYPE_ASYMMETRIC,
>               {.asym = {
> -                     .xform_capa = {
> -                             .xform_type =
> RTE_CRYPTO_ASYM_XFORM_DH,
> -                             .op_types =
> -
>       ((1<<RTE_CRYPTO_ASYM_KE_PRIVATE_KEY_GENERATE) |
> -                             (1 <<
> RTE_CRYPTO_ASYM_KE_PUBLIC_KEY_GENERATE |
> -                             (1 <<
> -
>       RTE_CRYPTO_ASYM_KE_SHARED_SECRET_COMPUTE))),
> -                             {
> -                             .modlen = {
> -                             /* value 0 symbolizes no limit on min length */
> -                             .min = 0,
> -                             /* value 0 symbolizes no limit on max length */
> -                             .max = 0,
> -                             .increment = 1
> -                             }, }
> +                     .xform_type = RTE_CRYPTO_ASYM_XFORM_DH,
> +                     .dh = {
> +                             .max_group_size = 0,
> +                             .priv_key_gen = 1
> +                             }
>                       }
> -             },
>               }
>       },
> -     {       /* dsa */
> +     {       /* DSA */
>               .op = RTE_CRYPTO_OP_TYPE_ASYMMETRIC,
>               {.asym = {
> -                     .xform_capa = {
> -                             .xform_type =
> RTE_CRYPTO_ASYM_XFORM_DSA,
> -                             .op_types =
> -                             ((1<<RTE_CRYPTO_ASYM_OP_SIGN) |
> -                             (1 << RTE_CRYPTO_ASYM_OP_VERIFY)),
> -                             {
> -                             .modlen = {
> -                             /* value 0 symbolizes no limit on min length */
> -                             .min = 0,
> -                             /* value 0 symbolizes no limit on max length */
> -                             .max = 0,
> -                             .increment = 1
> -                             }, }
> +                     .xform_type = RTE_CRYPTO_ASYM_XFORM_DSA,
> +                     .dsa = {
> +                             .max_key_size = 0,
> +                             .random_k = 1
> +                             }
> +                     }
> +             }
> +     },
> +     {       /* ECDSA */
> +             .op = RTE_CRYPTO_OP_TYPE_ASYMMETRIC,
> +             {.asym = {
> +                     .xform_type = RTE_CRYPTO_ASYM_XFORM_ECDSA,
> +                     .ecdsa = {
> +                             .curves =
> +
>       RTE_BIT64(RTE_CRYPTO_EC_GROUP_SECP192R1) |
> +
>       RTE_BIT64(RTE_CRYPTO_EC_GROUP_SECP224R1) |
> +
>       RTE_BIT64(RTE_CRYPTO_EC_GROUP_SECP256R1) |
> +
>       RTE_BIT64(RTE_CRYPTO_EC_GROUP_SECP384R1) |
> +
>       RTE_BIT64(RTE_CRYPTO_EC_GROUP_SECP521R1),
> +                             .random_k = 1
> +                             }
>                       }
> -             },
>               }
>       },
> 

Do not combine PMD changes for capabilities in cryptodev patch for new APIs.


> diff --git a/drivers/crypto/qat/dev/qat_asym_pmd_gen1.c
> b/drivers/crypto/qat/dev/qat_asym_pmd_gen1.c
> index 4499fdaf2d..d5144bca84 100644
> --- a/drivers/crypto/qat/dev/qat_asym_pmd_gen1.c
> +++ b/drivers/crypto/qat/dev/qat_asym_pmd_gen1.c
> @@ -28,16 +28,64 @@ struct rte_cryptodev_ops qat_asym_crypto_ops_gen1 =
> {
>  };
> 
>  static struct rte_cryptodev_capabilities qat_asym_crypto_caps_gen1[] = {
> -     QAT_ASYM_CAP(MODEX,
> -             0, 1, 512, 1),
> -     QAT_ASYM_CAP(MODINV,
> -             0, 1, 512, 1),
> -     QAT_ASYM_CAP(RSA,
> -                     ((1 << RTE_CRYPTO_ASYM_OP_SIGN) |
> -                     (1 << RTE_CRYPTO_ASYM_OP_VERIFY) |
> -                     (1 << RTE_CRYPTO_ASYM_OP_ENCRYPT) |
> -                     (1 << RTE_CRYPTO_ASYM_OP_DECRYPT)),
> -                     64, 512, 64),
> +     {       /* Modular exponentiation */
> +             .op = RTE_CRYPTO_OP_TYPE_ASYMMETRIC,
> +             {.asym = {
> +                     .xform_type = RTE_CRYPTO_ASYM_XFORM_MODEX,
> +                     .mod = {
> +                             .max_mod_size = 4096
> +                             }
> +                     }
> +             }
> +     },
> +     {       /* Modular multiplicative inverse */
> +             .op = RTE_CRYPTO_OP_TYPE_ASYMMETRIC,
> +             {.asym = {
> +                     .xform_type = RTE_CRYPTO_ASYM_XFORM_MODINV,
> +                     .mod = {
> +                             .max_mod_size = 4096
> +                             }
> +                     }
> +             }
> +     },
> +     {       /* RSA */
> +             .op = RTE_CRYPTO_OP_TYPE_ASYMMETRIC,
> +             {.asym = {
> +                     .xform_type = RTE_CRYPTO_ASYM_XFORM_RSA,
> +                     .rsa = {
> +                             .padding =
> +
>       RTE_BIT32(RTE_CRYPTO_RSA_PADDING_NONE),
> +                             .hash = 0,
> +                             .max_key_size = 4096
> +                             }
> +                     }
> +             }
> +     },
> +     {       /* ECDSA */
> +             .op = RTE_CRYPTO_OP_TYPE_ASYMMETRIC,
> +             {.asym = {
> +                     .xform_type = RTE_CRYPTO_ASYM_XFORM_ECDSA,
> +                     .ecdsa = {
> +                             .curves =
> +
>       RTE_BIT64(RTE_CRYPTO_EC_GROUP_SECP256R1) |
> +
>       RTE_BIT64(RTE_CRYPTO_EC_GROUP_SECP521R1),
> +                             .random_k = 0
> +                             }
> +                     }
> +             }
> +     },
> +     {       /* ECPM */
> +             .op = RTE_CRYPTO_OP_TYPE_ASYMMETRIC,
> +             {.asym = {
> +                     .xform_type = RTE_CRYPTO_ASYM_XFORM_ECPM,
> +                     .ecdsa = {
> +                             .curves =
> +
>       RTE_BIT64(RTE_CRYPTO_EC_GROUP_SECP256R1) |
> +
>       RTE_BIT64(RTE_CRYPTO_EC_GROUP_SECP521R1)
> +                             }
> +                     }
> +             }
> +     },
>       RTE_CRYPTODEV_END_OF_CAPABILITIES_LIST()
>  };
> 
> diff --git a/lib/cryptodev/rte_crypto_asym.h b/lib/cryptodev/rte_crypto_asym.h
> index d90a7a1957..41b22450d3 100644
> --- a/lib/cryptodev/rte_crypto_asym.h
> +++ b/lib/cryptodev/rte_crypto_asym.h
> @@ -41,6 +41,14 @@ rte_crypto_asym_ke_strings[];
>  extern const char *
>  rte_crypto_asym_op_strings[];
> 
> +/** RSA padding type name strings */
> +extern const char *
> +rte_crypto_asym_rsa_padding[];

rte_crypto_asym_rsa_padding_strings

> +
> +/** Elliptic curves name strings */
> +extern const char *
> +rte_crypto_curves_strings[];
> +
>  /**
>   * Buffer to hold crypto params required for asym operations.
>   *
> @@ -265,6 +273,46 @@ struct rte_crypto_rsa_padding {
>        */
>  };
> 
> +struct rte_crypto_mod_capability {
> +     uint16_t max_mod_size;
> +     /**< Maximum supported modulus size in bytes, 0 means no limit */
> +};
> +
> +struct rte_crypto_rsa_capability {
> +     uint32_t padding;
> +     /**< List of supported paddings */
How is this list supposed to work?
I believe this should be enum to specify a single value.
Driver can maintain a static array to list all supported ones.
And application can query if a particular capability which it intend to use
Is supported by the PMD.

> +     uint32_t hash;
> +     /**< List of supported hash functions */
Same comment here as well

> +     uint32_t max_key_size;
> +     /**< Maximum supported key size in bytes, 0 means no limit */
> +};
> +
> +struct rte_crypto_dh_capability {
> +     uint16_t max_group_size;
> +     /**< Maximum group  in bytes, 0 means no limit */
Maximum group size in bytes ...

> +     uint8_t priv_key_gen;
> +     /**< Does PMD supports private key generation generation */
Is it a flag? Please comment it properly.

> +};
> +
> +struct rte_crypto_dsa_capability {
> +     uint16_t max_key_size;
> +     /**< Maximum supported key size in bytes, 0 means no limit */
> +     uint8_t random_k;
> +     /**< Does PMD supports random 'k' generation */

Comments should not ask questions.

> +};
> +
> +struct rte_crypto_ecdsa_capability {
> +     uint64_t curves;
> +     /**< Supported elliptic curve ids */
Shouldn't this also be enum?

> +     uint8_t random_k;
> +     /**< Does PMD supports random 'k' generation */

Same comment as above.
> +};
> +
> +struct rte_crypto_ecpm_capability {
> +     uint64_t curves;
> +     /**< Supported elliptic curve ids */

Enum??

> +};
> +
>  /**
>   * Asymmetric RSA transform data
>   *
> diff --git a/lib/cryptodev/rte_cryptodev.c b/lib/cryptodev/rte_cryptodev.c
> index 57ee6b3f07..b1ad1112fe 100644
> --- a/lib/cryptodev/rte_cryptodev.c
> +++ b/lib/cryptodev/rte_cryptodev.c
> @@ -190,6 +190,27 @@ const char *rte_crypto_asym_ke_strings[] = {
>  };
> 
>  /**
> + * RSA padding string identifiers
> + */
> +const char *rte_crypto_asym_rsa_padding[] = {
> +     [RTE_CRYPTO_RSA_PADDING_NONE] =
> "RTE_CRYPTO_RSA_PADDING_NONE",
> +     [RTE_CRYPTO_RSA_PADDING_PKCS1_5] =
> "RTE_CRYPTO_RSA_PADDING_PKCS1_5",
> +     [RTE_CRYPTO_RSA_PADDING_OAEP] =
> "RTE_CRYPTO_RSA_PADDING_OAEP",
> +     [RTE_CRYPTO_RSA_PADDING_PSS] =
> "RTE_CRYPTO_RSA_PADDING_PSS"
> +};
> +
> +/**
> + * Elliptic curves string identifiers
> + */
> +const char *rte_crypto_curves_strings[] = {
> +     [RTE_CRYPTO_EC_GROUP_SECP192R1] =
> "RTE_CRYPTO_EC_GROUP_SECP192R1",
> +     [RTE_CRYPTO_EC_GROUP_SECP224R1] =
> "RTE_CRYPTO_EC_GROUP_SECP224R1",
> +     [RTE_CRYPTO_EC_GROUP_SECP256R1] =
> "RTE_CRYPTO_EC_GROUP_SECP256R1",
> +     [RTE_CRYPTO_EC_GROUP_SECP384R1] =
> "RTE_CRYPTO_EC_GROUP_SECP384R1",
> +     [RTE_CRYPTO_EC_GROUP_SECP521R1] =
> "RTE_CRYPTO_EC_GROUP_SECP521R1",
> +};
> +
> +/**
>   * The private data structure stored in the sym session mempool private data.
>   */
>  struct rte_cryptodev_sym_session_pool_private_data {
> @@ -347,7 +368,7 @@ param_range_check(uint16_t size, const struct
> rte_crypto_param_range *range)
>       return -1;
>  }
> 
> -const struct rte_cryptodev_asymmetric_xform_capability *
> +const struct rte_cryptodev_asymmetric_capability *
>  rte_cryptodev_asym_capability_get(uint8_t dev_id,
>               const struct rte_cryptodev_asym_capability_idx *idx)
>  {
> @@ -363,8 +384,8 @@ rte_cryptodev_asym_capability_get(uint8_t dev_id,
>               if (capability->op != RTE_CRYPTO_OP_TYPE_ASYMMETRIC)
>                       continue;
> 
> -             if (capability->asym.xform_capa.xform_type == idx->type)
> -                     return &capability->asym.xform_capa;
> +             if (capability->asym.xform_type == idx->type)
> +                     return &capability->asym;
>       }
>       return NULL;
>  };
> @@ -456,6 +477,59 @@ rte_cryptodev_asym_xform_capability_check_modlen(
>       return 0;
>  }
> 
> +int
> +rte_cryptodev_capa_check_mod(

API name should be rte_cryptodev_mod_capa_check
Verb should come in the end.
Fix other APIs also.

> +     const struct rte_cryptodev_asymmetric_capability *capa,
> +     struct rte_crypto_mod_capability mod)
> +{
> +     if (capa->mod.max_mod_size == 0)
> +             return 1;
> +
> +     if (mod.max_mod_size <= capa->mod.max_mod_size)
> +             return 1;
> +     else
> +             return 0;
> +}
> +
> +int
> +rte_cryptodev_capa_check_rsa(
> +     const struct rte_cryptodev_asymmetric_capability *capa,
> +     struct rte_crypto_rsa_capability rsa)
> +{
> +     if (rsa.padding != (capa->rsa.padding & rsa.padding))
> +             return 0;
> +     if (rsa.hash != (capa->rsa.hash & rsa.hash))
> +             return 0;
> +     if (capa->rsa.max_key_size == 0)
> +             return 1;
> +     if (rsa.max_key_size <= capa->rsa.max_key_size)
> +             return 1;
> +     else
> +             return 0;
> +}

Can we have something similar to symmetric crypto/rte_security capabilities?

> +
> +int
> +rte_cryptodev_capa_check_ecdsa(
> +     const struct rte_cryptodev_asymmetric_capability *capa,
> +     struct rte_crypto_ecdsa_capability ecdsa)
> +{
> +     if (ecdsa.curves != (capa->ecdsa.curves & ecdsa.curves))
> +             return 0;
> +     if (ecdsa.random_k == 1 && capa->ecdsa.random_k == 0)
> +             return 0;
> +     return 1;
> +}
> +
> +int
> +rte_cryptodev_capa_check_ecpm(
> +     const struct rte_cryptodev_asymmetric_capability *capa,
> +     struct rte_crypto_ecpm_capability ecpm)
> +{
> +     if (ecpm.curves != (capa->ecpm.curves & ecpm.curves))
> +             return 0;
> +     return 1;
> +}
> +
>  /* 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 2c2c2edeb7..6c5bd819b2 100644
> --- a/lib/cryptodev/rte_cryptodev.h
> +++ b/lib/cryptodev/rte_cryptodev.h
> @@ -184,6 +184,19 @@ struct rte_cryptodev_asymmetric_xform_capability {
>   *
>   */
>  struct rte_cryptodev_asymmetric_capability {
> +     enum rte_crypto_asym_xform_type xform_type;
> +     /**< Asymmetric transform type */
> +     uint32_t op_types;
> +     /**< bitmask for supported rte_crypto_asym_op_type */
> +     union {
> +             struct rte_crypto_mod_capability mod;
> +             struct rte_crypto_rsa_capability rsa;
> +             struct rte_crypto_dh_capability dh;
> +             struct rte_crypto_dsa_capability dsa;
> +             struct rte_crypto_ecdsa_capability ecdsa;
> +             struct rte_crypto_ecpm_capability ecpm;
> +     };
> +
>       struct rte_cryptodev_asymmetric_xform_capability xform_capa;
>  };
> 
> @@ -247,7 +260,7 @@ rte_cryptodev_sym_capability_get(uint8_t dev_id,
>   *   - Return NULL if the capability not exist.
>   */
>  __rte_experimental
> -const struct rte_cryptodev_asymmetric_xform_capability *
> +const struct rte_cryptodev_asymmetric_capability *
>  rte_cryptodev_asym_capability_get(uint8_t dev_id,
>               const struct rte_cryptodev_asym_capability_idx *idx);
> 
> @@ -339,6 +352,66 @@ rte_cryptodev_asym_xform_capability_check_modlen(
>               uint16_t modlen);
> 
>  /**
> + * Check if requested Modexp features are supported
> + *
> + * @param    capability      Description of the asymmetric crypto
> capability.
> + * @param    mod             Modexp requested capability.
> + *
> + * @return
> + *   - Return 1 if the parameters are in range of the capability.
> + *   - Return 0 if the parameters are out of range of the capability.
> + */
> +__rte_experimental
> +int
> +rte_cryptodev_capa_check_mod(
> +     const struct rte_cryptodev_asymmetric_capability *capa,
> +     struct rte_crypto_mod_capability mod);
> +/**
> + * Check if requested RSA features are supported
> + *
> + * @param    capability      Description of the asymmetric crypto
> capability.
> + * @param    rsa             RSA requested capability.
> + *
> + * @return
> + *   - Return 1 if the parameters are in range of the capability.
> + *   - Return 0 if the parameters are out of range of the capability.
> + */
> +__rte_experimental
> +int
> +rte_cryptodev_capa_check_rsa(
> +     const struct rte_cryptodev_asymmetric_capability *capa,
> +     struct rte_crypto_rsa_capability rsa);
> +/**
> + * Check if requested ECDSA features are supported
> + *
> + * @param    capability      Description of the asymmetric crypto
> capability.
> + * @param    ecdsa           ECDSA requested capability.
> + *
> + * @return
> + *   - Return 1 if the parameters are in range of the capability.
> + *   - Return 0 if the parameters are out of range of the capability.
> + */
> +__rte_experimental
> +int
> +rte_cryptodev_capa_check_ecdsa(
> +     const struct rte_cryptodev_asymmetric_capability *capa,
> +     struct rte_crypto_ecdsa_capability ecdsa);
> +/**
> + * Check if requested ECPM features are supported
> + *
> + * @param    capability      Description of the asymmetric crypto
> capability.
> + * @param    ecpm            ECPM requested capability.
> + *
> + * @return
> + *   - Return 1 if the parameters are in range of the capability.
> + *   - Return 0 if the parameters are out of range of the capability.
> + */
> +__rte_experimental
> +int
> +rte_cryptodev_capa_check_ecpm(
> +     const struct rte_cryptodev_asymmetric_capability *capa,
> +     struct rte_crypto_ecpm_capability ecpm);
> +/**
>   * Provide the cipher algorithm enum, given an algorithm string
>   *
>   * @param    algo_enum       A pointer to the cipher algorithm
> diff --git a/lib/cryptodev/version.map b/lib/cryptodev/version.map
> index f0abfaa47d..4d93b9a947 100644
> --- a/lib/cryptodev/version.map
> +++ b/lib/cryptodev/version.map
> @@ -108,6 +108,10 @@ EXPERIMENTAL {
> 
>       #added in 22.07
>       rte_cryptodev_session_event_mdata_set;
> +     rte_cryptodev_capa_check_mod;
> +     rte_cryptodev_capa_check_rsa;
> +     rte_cryptodev_capa_check_ecdsa;
> +     rte_cryptodev_capa_check_ecpm;
>  };
> 
>  INTERNAL {
> --
> 2.13.6

Reply via email to