From: Gowrishankar Muthukrishnan <gmuthukrishn@marvell.com>
To: Przemyslaw Zegan <przemyslawx.zegan@intel.com>,
"dev@dpdk.org" <dev@dpdk.org>
Cc: Akhil Goyal <gakhil@marvell.com>,
"roy.fan.zhang@intel.com" <roy.fan.zhang@intel.com>
Subject: RE: [EXT] [dpdk-dev v2] app/test: random test vectors for Asymc RSA
Date: Tue, 27 Sep 2022 11:42:53 +0000 [thread overview]
Message-ID: <CO1PR18MB4714DB97AC18902CD602C527CB559@CO1PR18MB4714.namprd18.prod.outlook.com> (raw)
In-Reply-To: <20220817141444.18437-1-przemyslawx.zegan@intel.com>
> -----Original Message-----
> From: Przemyslaw Zegan <przemyslawx.zegan@intel.com>
> Sent: Wednesday, August 17, 2022 7:45 PM
> To: dev@dpdk.org
> Cc: Akhil Goyal <gakhil@marvell.com>; roy.fan.zhang@intel.com;
> Przemyslaw Zegan <przemyslawx.zegan@intel.com>
> Subject: [EXT] [dpdk-dev v2] app/test: random test vectors for Asymc RSA
>
> External Email
>
> ----------------------------------------------------------------------
> This patch add random test vectors generator for asymc RSA algorithm, base
> on OpenSSL 1.1.x lib.
>
> Added functions for create RSA test vectors base on defined rules.
> The randome generated test vector include plaintext, RSA key in exponent
> and quintuple format, digest and expected cipher and sign.
>
> Replace crypto_testsuite_params_asym struct from test_cryptodev_asym.c
> to test_cryptodev_asym_types.h, as it's used in other test suit.
>
> Description of new files:
> test_cryptodev_asym_creator.c: generator for random plaintext
> test_cryptodev_asym_rsa_creator.c: RSA vector generator
> test_cryptodev_asym_rsa_creator.c RSA test suite
> test_cryptodev_asym_vectors.c: memory allocator for vectors
>
> Signed-off-by: Przemyslaw Zegan <przemyslawx.zegan@intel.com>
> ---
> v2: fixed coding style issues
> ---
> app/test/meson.build | 5 +
> app/test/test_cryptodev_asym.c | 63 ++--
> app/test/test_cryptodev_asym_common.c | 117 +++++++
> app/test/test_cryptodev_asym_common.h | 49 +++
> app/test/test_cryptodev_asym_creator.c | 42 +++
> app/test/test_cryptodev_asym_creator.h | 13 +
> app/test/test_cryptodev_asym_rsa.c | 309 +++++++++++++++++++
> app/test/test_cryptodev_asym_rsa.h | 17 +
> app/test/test_cryptodev_asym_rsa_creator.c | 145 +++++++++
> app/test/test_cryptodev_asym_rsa_creator.h | 16 +
> app/test/test_cryptodev_asym_types.h | 20 ++
> app/test/test_cryptodev_asym_vectors.c | 31 ++
> app/test/test_cryptodev_asym_vectors.h | 18 ++
> app/test/test_cryptodev_asym_vectors_def.h | 132 ++++++++
> app/test/test_cryptodev_asym_vectors_rules.h | 42 +++
> lib/cryptodev/rte_crypto_asym.h | 1 +
> 16 files changed, 986 insertions(+), 34 deletions(-) create mode 100644
> app/test/test_cryptodev_asym_common.c
> create mode 100644 app/test/test_cryptodev_asym_common.h
> create mode 100644 app/test/test_cryptodev_asym_creator.c
> create mode 100644 app/test/test_cryptodev_asym_creator.h
> create mode 100644 app/test/test_cryptodev_asym_rsa.c
> create mode 100644 app/test/test_cryptodev_asym_rsa.h
> create mode 100644 app/test/test_cryptodev_asym_rsa_creator.c
> create mode 100644 app/test/test_cryptodev_asym_rsa_creator.h
> create mode 100644 app/test/test_cryptodev_asym_types.h
> create mode 100644 app/test/test_cryptodev_asym_vectors.c
> create mode 100644 app/test/test_cryptodev_asym_vectors.h
> create mode 100644 app/test/test_cryptodev_asym_vectors_def.h
> create mode 100644 app/test/test_cryptodev_asym_vectors_rules.h
>
> diff --git a/app/test/meson.build b/app/test/meson.build index
> 431c5bd318..8dc5a3e516 100644
> --- a/app/test/meson.build
> +++ b/app/test/meson.build
> @@ -146,6 +146,11 @@ test_sources = files(
> 'test_trace_perf.c',
> 'test_version.c',
> 'virtual_pmd.c',
> + 'test_cryptodev_asym_common.c',
> + 'test_cryptodev_asym_vectors.c',
> + 'test_cryptodev_asym_rsa.c',
> + 'test_cryptodev_asym_rsa_creator.c',
> + 'test_cryptodev_asym_creator.c'
> )
>
> test_deps = enabled_libs
> diff --git a/app/test/test_cryptodev_asym.c
> b/app/test/test_cryptodev_asym.c index fc1a727472..b692af3760 100644
> --- a/app/test/test_cryptodev_asym.c
> +++ b/app/test/test_cryptodev_asym.c
> @@ -23,6 +23,8 @@
> #include "test_cryptodev_rsa_test_vectors.h"
> #include "test_cryptodev_asym_util.h"
> #include "test.h"
> +#include "test_cryptodev_asym_types.h"
> +#include "test_cryptodev_asym_rsa.h"
>
> #define TEST_NUM_BUFS 10
> #define TEST_NUM_SESSIONS 4
> @@ -34,14 +36,6 @@
> #define TEST_VECTOR_SIZE 256
>
> static int gbl_driver_id;
> -struct crypto_testsuite_params_asym {
> - struct rte_mempool *op_mpool;
> - struct rte_mempool *session_mpool;
> - struct rte_cryptodev_config conf;
> - struct rte_cryptodev_qp_conf qp_conf;
> - uint8_t valid_devs[RTE_CRYPTO_MAX_DEVS];
> - uint8_t valid_dev_count;
> -};
>
> struct crypto_unittest_params {
> void *sess;
> @@ -62,12 +56,12 @@ static struct test_cases_array test_vector = {0, { NULL
> } };
>
> static uint32_t test_index;
>
> -static struct crypto_testsuite_params_asym testsuite_params = { NULL };
> +struct crypto_testsuite_params_asym testsuite_params_asym = { NULL };
Coul this variable rename be avoided here, as we have many patch hunks below
because of it.
>
> static int
> queue_ops_rsa_sign_verify(void *sess)
> {
> - struct crypto_testsuite_params_asym *ts_params =
> &testsuite_params;
> + struct crypto_testsuite_params_asym *ts_params =
> +&testsuite_params_asym;
> struct rte_mempool *op_mpool = ts_params->op_mpool;
> uint8_t dev_id = ts_params->valid_devs[0];
> struct rte_crypto_op *op, *result_op;
> @@ -158,7 +152,7 @@ queue_ops_rsa_sign_verify(void *sess) static int
> queue_ops_rsa_enc_dec(void *sess) {
> - struct crypto_testsuite_params_asym *ts_params =
> &testsuite_params;
> + struct crypto_testsuite_params_asym *ts_params =
> +&testsuite_params_asym;
> struct rte_mempool *op_mpool = ts_params->op_mpool;
> uint8_t dev_id = ts_params->valid_devs[0];
> struct rte_crypto_op *op, *result_op;
> @@ -524,7 +518,7 @@ test_one_case(const void *test_case, int sessionless)
>
> if (tc.modex.xform_type == RTE_CRYPTO_ASYM_XFORM_MODEX
> || tc.modex.xform_type ==
> RTE_CRYPTO_ASYM_XFORM_MODINV) {
> - status = test_cryptodev_asym_op(&testsuite_params, &tc,
> test_msg,
> + status =
> test_cryptodev_asym_op(&testsuite_params_asym, &tc,
> +test_msg,
> sessionless, 0, 0);
> printf(" %u) TestCase %s %s\n", test_index++,
> tc.modex.description, test_msg);
> @@ -534,7 +528,7 @@ test_one_case(const void *test_case, int sessionless)
> if (tc.rsa_data.op_type_flags & (1 << i)) {
> if (tc.rsa_data.key_exp) {
> status =
> test_cryptodev_asym_op(
> - &testsuite_params,
> &tc,
> +
> &testsuite_params_asym, &tc,
> test_msg,
> sessionless, i,
>
> RTE_RSA_KEY_TYPE_EXP);
> }
> @@ -544,7 +538,7 @@ test_one_case(const void *test_case, int sessionless)
>
> RTE_CRYPTO_ASYM_OP_DECRYPT ||
> i ==
> RTE_CRYPTO_ASYM_OP_SIGN)) {
> status =
> test_cryptodev_asym_op(
> - &testsuite_params,
> +
> &testsuite_params_asym,
> &tc, test_msg,
> sessionless, i,
>
> RTE_RSA_KEY_TYPE_QT);
> }
> @@ -604,7 +598,7 @@ static int
> test_one_by_one(void)
> {
> int status = TEST_SUCCESS;
> - struct crypto_testsuite_params_asym *ts_params =
> &testsuite_params;
> + struct crypto_testsuite_params_asym *ts_params =
> +&testsuite_params_asym;
> uint32_t i = 0;
> uint8_t dev_id = ts_params->valid_devs[0];
> struct rte_cryptodev_info dev_info;
> @@ -637,7 +631,7 @@ test_one_by_one(void) static int
> test_rsa_sign_verify(void)
> {
> - struct crypto_testsuite_params_asym *ts_params =
> &testsuite_params;
> + struct crypto_testsuite_params_asym *ts_params =
> +&testsuite_params_asym;
> struct rte_mempool *sess_mpool = ts_params->session_mpool;
> uint8_t dev_id = ts_params->valid_devs[0];
> void *sess = NULL;
> @@ -677,7 +671,7 @@ test_rsa_sign_verify(void) static int
> test_rsa_enc_dec(void)
> {
> - struct crypto_testsuite_params_asym *ts_params =
> &testsuite_params;
> + struct crypto_testsuite_params_asym *ts_params =
> +&testsuite_params_asym;
> struct rte_mempool *sess_mpool = ts_params->session_mpool;
> uint8_t dev_id = ts_params->valid_devs[0];
> void *sess = NULL;
> @@ -717,7 +711,7 @@ test_rsa_enc_dec(void) static int
> test_rsa_sign_verify_crt(void)
> {
> - struct crypto_testsuite_params_asym *ts_params =
> &testsuite_params;
> + struct crypto_testsuite_params_asym *ts_params =
> +&testsuite_params_asym;
> struct rte_mempool *sess_mpool = ts_params->session_mpool;
> uint8_t dev_id = ts_params->valid_devs[0];
> void *sess = NULL;
> @@ -757,7 +751,7 @@ test_rsa_sign_verify_crt(void) static int
> test_rsa_enc_dec_crt(void)
> {
> - struct crypto_testsuite_params_asym *ts_params =
> &testsuite_params;
> + struct crypto_testsuite_params_asym *ts_params =
> +&testsuite_params_asym;
> struct rte_mempool *sess_mpool = ts_params->session_mpool;
> uint8_t dev_id = ts_params->valid_devs[0];
> void *sess = NULL;
> @@ -797,7 +791,7 @@ test_rsa_enc_dec_crt(void) static int
> testsuite_setup(void)
> {
> - struct crypto_testsuite_params_asym *ts_params =
> &testsuite_params;
> + struct crypto_testsuite_params_asym *ts_params =
> +&testsuite_params_asym;
> uint8_t valid_devs[RTE_CRYPTO_MAX_DEVS];
> struct rte_cryptodev_info info;
> int ret, dev_id = -1;
> @@ -902,7 +896,7 @@ testsuite_setup(void) static void
> testsuite_teardown(void)
> {
> - struct crypto_testsuite_params_asym *ts_params =
> &testsuite_params;
> + struct crypto_testsuite_params_asym *ts_params =
> +&testsuite_params_asym;
>
> if (ts_params->op_mpool != NULL) {
> RTE_LOG(DEBUG, USER1, "CRYPTO_OP_POOL count %u\n",
> @@ -919,7 +913,7 @@ testsuite_teardown(void) static int
> ut_setup_asym(void)
> {
> - struct crypto_testsuite_params_asym *ts_params =
> &testsuite_params;
> + struct crypto_testsuite_params_asym *ts_params =
> +&testsuite_params_asym;
>
> uint16_t qp_id;
>
> @@ -953,7 +947,7 @@ ut_setup_asym(void)
> static void
> ut_teardown_asym(void)
> {
> - struct crypto_testsuite_params_asym *ts_params =
> &testsuite_params;
> + struct crypto_testsuite_params_asym *ts_params =
> +&testsuite_params_asym;
> struct rte_cryptodev_stats stats;
>
> rte_cryptodev_stats_get(ts_params->valid_devs[0], &stats); @@ -
> 1002,7 +996,7 @@ static inline void print_asym_capa( static int
> test_capability(void)
> {
> - struct crypto_testsuite_params_asym *ts_params =
> &testsuite_params;
> + struct crypto_testsuite_params_asym *ts_params =
> +&testsuite_params_asym;
> uint8_t dev_id = ts_params->valid_devs[0];
> struct rte_cryptodev_info dev_info;
> const struct rte_cryptodev_capabilities *dev_capa; @@ -1039,7
> +1033,7 @@ test_capability(void) static int test_dh_gen_shared_sec(struct
> rte_crypto_asym_xform *xfrm) {
> - struct crypto_testsuite_params_asym *ts_params =
> &testsuite_params;
> + struct crypto_testsuite_params_asym *ts_params =
> +&testsuite_params_asym;
> struct rte_mempool *op_mpool = ts_params->op_mpool;
> struct rte_mempool *sess_mpool = ts_params->session_mpool;
> uint8_t dev_id = ts_params->valid_devs[0]; @@ -1121,7 +1115,7 @@
> test_dh_gen_shared_sec(struct rte_crypto_asym_xform *xfrm) static int
> test_dh_gen_priv_key(struct rte_crypto_asym_xform *xfrm) {
> - struct crypto_testsuite_params_asym *ts_params =
> &testsuite_params;
> + struct crypto_testsuite_params_asym *ts_params =
> +&testsuite_params_asym;
> struct rte_mempool *op_mpool = ts_params->op_mpool;
> struct rte_mempool *sess_mpool = ts_params->session_mpool;
> uint8_t dev_id = ts_params->valid_devs[0]; @@ -1201,7 +1195,7 @@
> test_dh_gen_priv_key(struct rte_crypto_asym_xform *xfrm) static int
> test_dh_gen_pub_key(struct rte_crypto_asym_xform *xfrm) {
> - struct crypto_testsuite_params_asym *ts_params =
> &testsuite_params;
> + struct crypto_testsuite_params_asym *ts_params =
> +&testsuite_params_asym;
> struct rte_mempool *op_mpool = ts_params->op_mpool;
> struct rte_mempool *sess_mpool = ts_params->session_mpool;
> uint8_t dev_id = ts_params->valid_devs[0]; @@ -1289,7 +1283,7 @@
> test_dh_gen_pub_key(struct rte_crypto_asym_xform *xfrm) static int
> test_dh_gen_kp(struct rte_crypto_asym_xform *xfrm) {
> - struct crypto_testsuite_params_asym *ts_params =
> &testsuite_params;
> + struct crypto_testsuite_params_asym *ts_params =
> +&testsuite_params_asym;
> struct rte_mempool *op_mpool = ts_params->op_mpool;
> struct rte_mempool *sess_mpool = ts_params->session_mpool;
> uint8_t dev_id = ts_params->valid_devs[0]; @@ -1375,7 +1369,7 @@
> test_dh_gen_kp(struct rte_crypto_asym_xform *xfrm) static int
> test_mod_inv(void)
> {
> - struct crypto_testsuite_params_asym *ts_params =
> &testsuite_params;
> + struct crypto_testsuite_params_asym *ts_params =
> +&testsuite_params_asym;
> struct rte_mempool *op_mpool = ts_params->op_mpool;
> struct rte_mempool *sess_mpool = ts_params->session_mpool;
> uint8_t dev_id = ts_params->valid_devs[0]; @@ -1487,7 +1481,7 @@
> test_mod_inv(void) static int
> test_mod_exp(void)
> {
> - struct crypto_testsuite_params_asym *ts_params =
> &testsuite_params;
> + struct crypto_testsuite_params_asym *ts_params =
> +&testsuite_params_asym;
> struct rte_mempool *op_mpool = ts_params->op_mpool;
> struct rte_mempool *sess_mpool = ts_params->session_mpool;
> uint8_t dev_id = ts_params->valid_devs[0]; @@ -1635,7 +1629,7 @@
> test_dh_keygenration(void) static int test_dsa_sign(struct
> rte_crypto_dsa_op_param *dsa_op) {
> - struct crypto_testsuite_params_asym *ts_params =
> &testsuite_params;
> + struct crypto_testsuite_params_asym *ts_params =
> +&testsuite_params_asym;
> struct rte_mempool *op_mpool = ts_params->op_mpool;
> struct rte_mempool *sess_mpool = ts_params->session_mpool;
> uint8_t dev_id = ts_params->valid_devs[0]; @@ -1718,7 +1712,7 @@
> test_dsa_sign(struct rte_crypto_dsa_op_param *dsa_op) static int
> test_dsa_verify(struct rte_crypto_dsa_op_param *dsa_op) {
> - struct crypto_testsuite_params_asym *ts_params =
> &testsuite_params;
> + struct crypto_testsuite_params_asym *ts_params =
> +&testsuite_params_asym;
> struct rte_mempool *op_mpool = ts_params->op_mpool;
> struct rte_mempool *sess_mpool = ts_params->session_mpool;
> uint8_t dev_id = ts_params->valid_devs[0]; @@ -1831,7 +1825,7 @@
> test_dsa(void) static int test_ecdsa_sign_verify(enum curve curve_id) {
> - struct crypto_testsuite_params_asym *ts_params =
> &testsuite_params;
> + struct crypto_testsuite_params_asym *ts_params =
> +&testsuite_params_asym;
> struct rte_mempool *sess_mpool = ts_params->session_mpool;
> struct rte_mempool *op_mpool = ts_params->op_mpool;
> struct crypto_testsuite_ecdsa_params input_params; @@ -2032,7
> +2026,7 @@ test_ecdsa_sign_verify_all_curve(void)
> static int
> test_ecpm(enum curve curve_id)
> {
> - struct crypto_testsuite_params_asym *ts_params =
> &testsuite_params;
> + struct crypto_testsuite_params_asym *ts_params =
> +&testsuite_params_asym;
> struct rte_mempool *sess_mpool = ts_params->session_mpool;
> struct rte_mempool *op_mpool = ts_params->op_mpool;
> struct crypto_testsuite_ecpm_params input_params; @@ -2219,6
> +2213,7 @@ static struct unit_test_suite cryptodev_qat_asym_testsuite = {
> .teardown = testsuite_teardown,
> .unit_test_cases = {
> TEST_CASE_ST(ut_setup_asym, ut_teardown_asym,
> test_one_by_one),
> + TEST_CASE_ST(ats_rsa_setup, ats_rsa_teardown,
> ats_rsa_run),
> TEST_CASES_END() /**< NULL terminate unit test array */
> }
> };
> diff --git a/app/test/test_cryptodev_asym_common.c
> b/app/test/test_cryptodev_asym_common.c
> new file mode 100644
> index 0000000000..f0e3987db8
> --- /dev/null
> +++ b/app/test/test_cryptodev_asym_common.c
> @@ -0,0 +1,117 @@
> +/* SPDX-License-Identifier: BSD-3-Clause
> + * Copyright (c) 2022 Intel Corporation */
> +
> +#include <stdint.h>
> +
> +#include "test_cryptodev_asym_common.h"
> +#include "test.h"
This test.h could below the one below.
> +#include "test_cryptodev.h"
> +
> +int ats_common_setup(struct crypto_testsuite_params_asym *ts) {
> + uint16_t qp_id;
> +
> + /* Reconfigure device to default parameters */
> + ts->conf.socket_id = SOCKET_ID_ANY;
> +
> + TEST_ASSERT_SUCCESS(rte_cryptodev_configure(ts->valid_devs[0],
> + &ts->conf),
> + "Failed to configure cryptodev %u",
> + ts->valid_devs[0]);
> +
> + for (qp_id = 0; qp_id < ts->conf.nb_queue_pairs ; qp_id++) {
> + TEST_ASSERT_SUCCESS(rte_cryptodev_queue_pair_setup(
> + ts->valid_devs[0], qp_id,
> + &ts->qp_conf,
> + rte_cryptodev_socket_id(ts->valid_devs[0])),
> + "Failed to setup queue pair %u on cryptodev %u",
> + qp_id, ts->valid_devs[0]);
> + }
> +
> + rte_cryptodev_stats_reset(ts->valid_devs[0]);
> +
> + /* Start the device */
> + TEST_ASSERT_SUCCESS(rte_cryptodev_start(ts->valid_devs[0]),
> + "Failed to start cryptodev
> %u",
> + ts->valid_devs[0]);
> +
> + return TEST_SUCCESS;
> +}
> +
> +void ats_common_teardown(struct crypto_testsuite_params_asym *ts) {
> + struct rte_cryptodev_stats stats;
> +
> + rte_cryptodev_stats_get(ts->valid_devs[0], &stats);
> +
Any purpose _stats_get called for here ?
> + rte_cryptodev_stop(ts->valid_devs[0]);
> +}
> +
> +void ats_err_msg_cap(void)
> +{
> + RTE_LOG(INFO, USER1, "Device doesn't support MODEX. Test
> Skipped\n");
> +}
> +
> +void ats_err_msg_op(char *msg, uint32_t len, uint32_t line) {
> + snprintf(msg, len,
> + "line %u FAILED: %s", line,
> + "Failed to allocate asymmetric crypto operation struct"); }
" Failed to allocate struct for asymmetirc crypto op" ..
> +
> +void ats_err_msg_mod_len(char *msg, uint32_t len, uint32_t line) {
> + snprintf(msg, len,
> + "line %u FAILED: %s", line,
> + "Invalid MODULUS length specified");
Except for library mnemonics like ASYM, RSA, we can avoid capital letters IMO - "modulus".
> +}
> +
> +void ats_err_msg_inv_alg(char *msg, uint32_t len, uint32_t line) {
> + snprintf(msg, len,
> + "line %u FAILED: %s", line,
> + "Invalid ASYM algorithm specified");
> +}
> +
> +void ats_err_msg_sess_create(char *msg, uint32_t len, uint32_t line) {
> + snprintf(msg, len,
> + "line %u FAILED: %s", line,
> + "Session creation failed");
> +}
> +
> +void ats_err_msg_sess_init(char *msg, uint32_t len, uint32_t line) {
> + snprintf(msg, len,
> + "line %u FAILED: %s", line,
> + "unabled to config sym session");
"Unable to config SYM session" ?
> +}
> +
> +void ats_err_msg_enque(char *msg, uint32_t len, uint32_t line) {
> + snprintf(msg, len,
> + "line %u FAILED: %s", line,
> + "Error sending packet for operation"); }
> +
> +void ats_err_msg_burst(char *msg, uint32_t len, uint32_t line) {
> + snprintf(msg, len,
> + "line %u FAILED: %s", line,
> + "Error sending packet for operation"); }
"multiple packets" ?
> +
> +void ats_err_msg_deq(char *msg, uint32_t len, uint32_t line) {
> + snprintf(msg, len,
> + "line %u FAILED: %s", line,
> + "Failed to process asym crypto op");
"ASYM" just for uniformity.
> +}
> +
> +void ats_err_msg_ver(char *msg, uint32_t len, uint32_t line) {
> + snprintf(msg, len,
> + "line %u FAILED: %s", line,
> + "Verification failed ");
> +}
> diff --git a/app/test/test_cryptodev_asym_common.h
> b/app/test/test_cryptodev_asym_common.h
> new file mode 100644
> index 0000000000..f61e49f5dc
> --- /dev/null
> +++ b/app/test/test_cryptodev_asym_common.h
> @@ -0,0 +1,49 @@
> +/* SPDX-License-Identifier: BSD-3-Clause
> + * Copyright (c) 2022 Intel Corporation */
> +
> +#ifndef TEST_CRYPTODEV_ASYM_COMMON_H_
> +#define TEST_CRYPTODEV_ASYM_COMMON_H_
> +
> +#include <stdlib.h>
> +#include <stdint.h>
> +
> +#include <rte_bus_vdev.h>
> +#include <rte_common.h>
> +#include <rte_hexdump.h>
> +#include <rte_mbuf.h>
> +#include <rte_malloc.h>
> +#include <rte_memcpy.h>
> +#include <rte_pause.h>
> +
> +#include <rte_cryptodev.h>
> +#include <rte_crypto.h>
> +
> +#include "test_cryptodev_asym_types.h"
> +
> +int ats_common_setup(struct crypto_testsuite_params_asym *ts);
> +
> +void ats_common_teardown(struct crypto_testsuite_params_asym *ts);
> +
> +void ats_err_msg_cap(void);
> +
> +void ats_err_msg_op(char *msg, uint32_t len, uint32_t line);
> +
> +void ats_err_msg_mod_len(char *msg, uint32_t len, uint32_t line);
> +
> +void ats_err_msg_inv_alg(char *msg, uint32_t len, uint32_t line);
> +
> +void ats_err_msg_sess_create(char *msg, uint32_t len, uint32_t line);
> +
> +void ats_err_msg_sess_init(char *msg, uint32_t len, uint32_t line);
> +
> +void ats_err_msg_enque(char *msg, uint32_t len, uint32_t line);
> +
> +void ats_err_msg_burst(char *msg, uint32_t len, uint32_t line);
> +
> +void ats_err_msg_deq(char *msg, uint32_t len, uint32_t line);
> +
> +void ats_err_msg_ver(char *msg, uint32_t len, uint32_t line);
> +
> +
> +#endif /* TEST_CRYPTODEV_ASYM_COMMON_H_ */
> diff --git a/app/test/test_cryptodev_asym_creator.c
> b/app/test/test_cryptodev_asym_creator.c
> new file mode 100644
> index 0000000000..2be9755791
> --- /dev/null
> +++ b/app/test/test_cryptodev_asym_creator.c
> @@ -0,0 +1,42 @@
> +/* SPDX-License-Identifier: BSD-3-Clause
> + * Copyright (c) 2022 Intel Corporation */
> +
> +#include <stdio.h>
> +#include <stdlib.h>
> +#include <stdint.h>
> +#include <string.h>
> +
> +#include <sys/time.h>
> +
#ifdef USE_OPENSSL
> +#include <openssl/bn.h>
> +#include <openssl/rand.h>
> +
I am adding RTE_HAS_OPENSSL in
https://patches.dpdk.org/project/dpdk/patch/da6c7aec7de7da40883d3dc2ce4792ef7969c958.1664263264.git.gmuthukrishn@marvell.com/
We can add dependency with openssl here.
However, I could not find any openSSL fn used in this .c file.
> +#include "test_cryptodev_asym_creator.h"
> +
> +int atv_create_data(uint8_t *data, int len) {
> + struct timespec ts;
> + struct timeval tv;
> + int i;
> +
> + ts.tv_sec = 0;
> + ts.tv_nsec = 10000000;
> + nanosleep(&ts, NULL);
> +
> + gettimeofday(&tv, NULL);
> + int seed = 1000000 * tv.tv_sec + tv.tv_usec;
> +
> + srand(seed);
> +
> + memset(data, 0, len);
> +
> + int *dt = (int *) data;
> + int ln = len / sizeof(int);
> +
> + for (i = 0; i < ln; i++)
> + dt[i] = rand();
> +
> + return 0;
> +}
> +
> diff --git a/app/test/test_cryptodev_asym_creator.h
> b/app/test/test_cryptodev_asym_creator.h
> new file mode 100644
> index 0000000000..9587fadb55
> --- /dev/null
> +++ b/app/test/test_cryptodev_asym_creator.h
> @@ -0,0 +1,13 @@
> +/* SPDX-License-Identifier: BSD-3-Clause
> + * Copyright (c) 2022 Intel Corporation */
> +
> +#ifndef TEST_CRYPTODEV_ASYM_CREATOR_H_
> +#define TEST_CRYPTODEV_ASYM_CREATOR_H_
> +
> +#include <stdlib.h>
> +#include <stdint.h>
> +
> +int atv_create_data(uint8_t *data, int len);
> +
> +#endif /* TEST_CRYPTODEV_ASYM_CREATOR_H_ */
> diff --git a/app/test/test_cryptodev_asym_rsa.c
> b/app/test/test_cryptodev_asym_rsa.c
> new file mode 100644
> index 0000000000..6f90877e6c
> --- /dev/null
> +++ b/app/test/test_cryptodev_asym_rsa.c
> @@ -0,0 +1,309 @@
> +/* SPDX-License-Identifier: BSD-3-Clause
> + * Copyright (c) 2022 Intel Corporation */
> +
> +#include "test_cryptodev_asym_common.h"
> +#include "test_cryptodev_asym_rsa.h"
> +#include "test_cryptodev_asym_vectors.h"
> +
> +#include "test.h"
> +#include "test_cryptodev.h"
> +#include "test_cryptodev_asym_types.h"
> +#include "test_cryptodev_asym_vectors.h"
> +
> +#define ASYM_TEST_MSG_LEN 256
(256)
> +#define TEST_DATA_SIZE 4096
(4096)
> +
> +struct crypto_unittest_params {
> + struct rte_cryptodev_asym_session *sess;
> + struct rte_crypto_op *op;
> +};
> +
> +static struct asym_test_rsa_vct *vct;
> +static int vct_nb;
"vec" could be used as variable name for test vector purpose, but up to you.
> +
> +extern struct crypto_testsuite_params_asym testsuite_params_asym;
> +
> +int ats_rsa_setup(void)
> +{
> + vct = atv_rsa(&vct_nb);
> +
Check for atv_rsa return status.
> + int status = ats_common_setup(&testsuite_params_asym);
> +
> + return status;
> +}
> +
> +void ats_rsa_teardown(void)
> +{
> + atv_free(vct);
> +
> + ats_common_teardown(&testsuite_params_asym);
> +}
> +
> +static int ats_case_rsa_op(struct crypto_testsuite_params_asym
> *ts_params,
> + struct asym_test_rsa_vct *data_tc, char *test_msg, int
tc_data may suite better than data_tc for uniformity here.
tc_msg instead of test_msg .
> sessionless,
> + enum rte_crypto_asym_op_type op_type,
> + enum rte_crypto_rsa_priv_key_type key_type) {
> + struct rte_crypto_asym_op *asym_op = NULL;
> + struct rte_crypto_op *op = NULL;
> + struct rte_crypto_op *result_op = NULL;
> + 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;
> + uint8_t dev_id = ts_params->valid_devs[0];
> + uint8_t *result = NULL;
> + uint8_t *data_expected = NULL, *data_received = NULL;
> + size_t data_size = 0;
> +
Like in other places, my suggestion to arrange vars declaration in some
inverted tree format just for easier readability.
var aaaaa = 11;
var bbb = 12;
var c = 3;
> + int ret, status = TEST_SUCCESS;
> +
> + xform_tc.next = NULL;
> + xform_tc.xform_type = data_tc->xform_type;
> +
> + cap_idx.type = xform_tc.xform_type;
> + capability = rte_cryptodev_asym_capability_get(dev_id, &cap_idx);
> +
> + if (capability == NULL) {
> + ats_err_msg_cap();
> + return TEST_SKIPPED;
> + }
> +
> + /* Generate crypto op data structure */
> + op = rte_crypto_op_alloc(ts_params->op_mpool,
> + RTE_CRYPTO_OP_TYPE_ASYMMETRIC);
> +
> + if (!op) {
> + ats_err_msg_op(test_msg, ASYM_TEST_MSG_LEN,
> __LINE__);
> + status = TEST_FAILED;
> + goto error_exit;
> + }
> +
> + asym_op = op->asym;
> +
> + switch (xform_tc.xform_type) {
> + case RTE_CRYPTO_ASYM_XFORM_RSA:
> + result = rte_zmalloc(NULL, data_tc->n.len, 0);
> + op->asym->rsa.op_type = op_type;
asym_op->rsa.op_type
> + xform_tc.rsa.e.data = data_tc->e.data;
> + xform_tc.rsa.e.length = data_tc->e.len;
> + xform_tc.rsa.n.data = data_tc->n.data;
> + xform_tc.rsa.n.length = data_tc->n.len;
> +
> + if (key_type == RTE_RSA_KEY_TYPE_EXP) {
> + xform_tc.rsa.d.data = data_tc->d.data;
> + xform_tc.rsa.d.length = data_tc->d.len;
> + } else {
> + xform_tc.rsa.qt.p.data = data_tc->p.data;
> + xform_tc.rsa.qt.p.length = data_tc->p.len;
> + xform_tc.rsa.qt.q.data = data_tc->q.data;
> + xform_tc.rsa.qt.q.length = data_tc->q.len;
> + xform_tc.rsa.qt.dP.data = data_tc->dP.data;
> + xform_tc.rsa.qt.dP.length = data_tc->dP.len;
> + xform_tc.rsa.qt.dQ.data = data_tc->dQ.data;
> + xform_tc.rsa.qt.dQ.length = data_tc->dQ.len;
> + xform_tc.rsa.qt.qInv.data = data_tc->qInv.data;
> + xform_tc.rsa.qt.qInv.length = data_tc->qInv.len;
> + }
> +
> + xform_tc.rsa.key_type = key_type;
> + op->asym->rsa.padding.type = data_tc->padding;
> +
> + if (op->asym->rsa.op_type ==
> RTE_CRYPTO_ASYM_OP_ENCRYPT) {
> + asym_op->rsa.message.data = data_tc->pt.data;
> + asym_op->rsa.message.length = data_tc->pt.len;
> + asym_op->rsa.cipher.data = result;
> + asym_op->rsa.cipher.length = data_tc->n.len;
> + } else if (op->asym->rsa.op_type ==
> RTE_CRYPTO_ASYM_OP_DECRYPT) {
> + asym_op->rsa.message.data = result;
> + asym_op->rsa.message.length = 0;
> + asym_op->rsa.cipher.data = data_tc->ct.data;
> + asym_op->rsa.cipher.length = data_tc->ct.len;
> + } else if (op->asym->rsa.op_type ==
> RTE_CRYPTO_ASYM_OP_SIGN) {
> + asym_op->rsa.sign.data = result;
> + asym_op->rsa.sign.length = data_tc->n.len;
> + asym_op->rsa.message.data = data_tc->digest.data;
> + asym_op->rsa.message.length = data_tc->digest.len;
> + } else if (op->asym->rsa.op_type ==
> RTE_CRYPTO_ASYM_OP_VERIFY) {
> + asym_op->rsa.cipher.data = result;
> + asym_op->rsa.cipher.length = data_tc->n.len;
> + asym_op->rsa.sign.data = data_tc->sign.data;
> + asym_op->rsa.sign.length = data_tc->sign.len;
> + }
> + break;
> +
> + default:
> + ats_err_msg_inv_alg(test_msg, ASYM_TEST_MSG_LEN,
> __LINE__);
> + status = TEST_FAILED;
> + goto error_exit;
> + }
> +
> + if (!sessionless) {
> + ret = rte_cryptodev_asym_session_create(dev_id,
> &xform_tc,
> + ts_params->session_mpool, &sess);
> + if (ret < 0) {
> + ats_err_msg_sess_create(test_msg,
> ASYM_TEST_MSG_LEN, __LINE__);
> + status = (ret == -ENOTSUP) ? TEST_SKIPPED :
> TEST_FAILED;
> + goto error_exit;
> + }
> +
> + rte_crypto_op_attach_asym_session(op, sess);
> + } else {
> + asym_op->xform = &xform_tc;
> + op->sess_type = RTE_CRYPTO_OP_SESSIONLESS;
> + }
> + RTE_LOG(DEBUG, USER1, "Process ASYM operation");
> +
> + /* Process crypto operation */
> + if (rte_cryptodev_enqueue_burst(dev_id, 0, &op, 1) != 1) {
> + ats_err_msg_enque(test_msg, ASYM_TEST_MSG_LEN,
> __LINE__);
> + status = TEST_FAILED;
> + goto error_exit;
> + }
> +
> + while (rte_cryptodev_dequeue_burst(dev_id, 0, &result_op, 1) ==
> 0)
> + rte_pause();
> +
> + if (result_op == NULL) {
> + ats_err_msg_deq(test_msg, ASYM_TEST_MSG_LEN,
> __LINE__);
> + status = TEST_FAILED;
> + goto error_exit;
> + }
> +
> + if (op->asym->rsa.op_type == RTE_CRYPTO_ASYM_OP_ENCRYPT) {
> + data_size = xform_tc.rsa.n.length;
> + data_received = result_op->asym->rsa.cipher.data;
> + data_expected = data_tc->ct.data;
> + } else if (op->asym->rsa.op_type ==
> RTE_CRYPTO_ASYM_OP_DECRYPT) {
> + data_size = xform_tc.rsa.n.length;
> + data_expected = data_tc->pt.data;
> + data_received = result_op->asym->rsa.message.data;
> + } else if (op->asym->rsa.op_type == RTE_CRYPTO_ASYM_OP_SIGN) {
> + data_size = xform_tc.rsa.n.length;
> + data_expected = data_tc->sign.data;
> + data_received = result_op->asym->rsa.sign.data;
> + } else if (op->asym->rsa.op_type ==
> RTE_CRYPTO_ASYM_OP_VERIFY) {
> + data_size = xform_tc.rsa.n.length;
> + data_expected = data_tc->digest.data;
> + data_received = result_op->asym->rsa.cipher.data;
> + }
> +
> + if ((memcmp(data_expected, data_received, data_size) != 0)
> + || (data_size == 0)) {
> + ats_err_msg_ver(test_msg, ASYM_TEST_MSG_LEN,
> __LINE__);
> + status = TEST_FAILED;
> + goto error_exit;
> + }
> +
> +error_exit:
> + if (sess != NULL)
> + rte_cryptodev_asym_session_free(dev_id, sess);
> +
> + if (op != NULL)
> + rte_crypto_op_free(op);
> +
> + if (result != NULL)
> + rte_free(result);
> +
> + return status;
> +}
> +
> +int ats_rsa_run(void)
> +{
> + int status = TEST_SUCCESS;
> + int i, key_type;
> + char test_msg[ASYM_TEST_MSG_LEN + 1];
> + int sessionless = 0;
> + struct crypto_testsuite_params_asym *ts_params =
> &testsuite_params_asym;
> + uint8_t dev_id = ts_params->valid_devs[0];
> + struct rte_cryptodev_info dev_info;
> +
> + rte_cryptodev_info_get(dev_id, &dev_info);
> + if ((dev_info.feature_flags &
> + RTE_CRYPTODEV_FF_ASYM_SESSIONLESS)) {
> + sessionless = 1;
> + }
> +
> + for (i = 0; i < vct_nb; i++) {
> +
> + printf("\n %u) TestSubCase %s - %s\n", i + 1,
> vct[i].description,
> + test_msg);
> + debug_hexdump(stdout, "plaintext:", vct[i].pt.data,
> vct[i].pt.len);
> + debug_hexdump(stdout, "ciphertext:", vct[i].ct.data,
> vct[i].ct.len);
> + debug_hexdump(stdout, "digest:", vct[i].digest.data,
> vct[i].digest.len);
> + debug_hexdump(stdout, "sign:", vct[i].sign.data,
> vct[i].sign.len);
> +
> + debug_hexdump(stdout, "e:", vct[i].e.data, vct[i].e.len);
> + debug_hexdump(stdout, "d:", vct[i].d.data, vct[i].d.len);
> + debug_hexdump(stdout, "n:", vct[i].n.data, vct[i].n.len);
> + debug_hexdump(stdout, "p:", vct[i].p.data, vct[i].p.len);
> + debug_hexdump(stdout, "q:", vct[i].q.data, vct[i].q.len);
> + debug_hexdump(stdout, "dP:", vct[i].dP.data, vct[i].dP.len);
> + debug_hexdump(stdout, "dQ:", vct[i].dQ.data,
> vct[i].dQ.len);
> + debug_hexdump(stdout, "qInv:", vct[i].qInv.data,
> vct[i].qInv.len);
> +
> + for (key_type = RTE_RSA_KEY_TYPE_EXP;
> + key_type < RTE_RSA_KEY_TYPE_LIST_END;
Only two key types we have at the moment (QT and EXP). Adding LIST_END is
unnecessarily touching lib/crypto. Could this be handled accordingly here ?
Same thing can be done like:
for (int i=0; i<2; i++) {
if (i == RTE_RSA_KEY_TYPE_EXP)
..
else if (I == RTE_RSA_KEY_TYPE_QT)
..
else
error
...
}
Also check if dev supports respective key type before calling each test.
> key_type++) {
> +
> + int sess = 0;
> +
> + if (key_type == 0)
> + printf("\n RSA key is an exponent:\n");
> + else
> + printf(" RSA key is in quintuple format:\n");
> + do {
> + if (sess == 1 && sessionless != 1)
> + break;
> +
> + if (sess == 0)
> + printf("\n With Session:\n");
> + else
> + printf("\n Without Session:\n");
> +
> + if
> (ats_case_rsa_op(&testsuite_params_asym, &vct[sess],
> + test_msg, sess,
> RTE_CRYPTO_ASYM_OP_ENCRYPT,
> + key_type) != TEST_SUCCESS)
> {
> + printf(" %-20s: %s\n", "Encryption",
> "FAIL");
> + status = TEST_FAILED;
> + } else {
> + printf(" %-20s: %s\n", "Encryption",
> "PASS");
> + }
> +
> + if
> (ats_case_rsa_op(&testsuite_params_asym, &vct[sess],
> + test_msg, sess,
> RTE_CRYPTO_ASYM_OP_DECRYPT,
> + key_type) != TEST_SUCCESS)
> {
> + printf(" %-20s: %s\n", "Decryption",
> "FAIL");
> + status = TEST_FAILED;
> + } else {
> + printf(" %-20s: %s\n", "Decryption",
> "PASS");
> + }
> +
> + if
> (ats_case_rsa_op(&testsuite_params_asym, &vct[sess],
> + test_msg, sess,
> RTE_CRYPTO_ASYM_OP_SIGN,
> + key_type) != TEST_SUCCESS)
> {
> + printf(" %-20s: %s\n", "Sign",
> "FAIL");
> + status = TEST_FAILED;
> + } else {
> + printf(" %-20s: %s\n", "Sign",
> "PASS");
> + }
> +
> + if
> (ats_case_rsa_op(&testsuite_params_asym, &vct[sess],
> + test_msg, sess,
> RTE_CRYPTO_ASYM_OP_VERIFY,
> + key_type) != TEST_SUCCESS)
> {
> + printf(" %-20s: %s\n", "Verify",
> "FAIL");
> + status = TEST_FAILED;
> + } else {
> + printf(" %-20s: %s\n", "Verify",
> "PASS");
> + }
> +
> + sess++;
> +
> + } while (sess <= 1);
> + printf("\n");
> + }
> + }
> +
> + TEST_ASSERT_EQUAL(status, 0, "Test failed");
> + return status;
> +}
> diff --git a/app/test/test_cryptodev_asym_rsa.h
> b/app/test/test_cryptodev_asym_rsa.h
> new file mode 100644
> index 0000000000..055bb77700
> --- /dev/null
> +++ b/app/test/test_cryptodev_asym_rsa.h
> @@ -0,0 +1,17 @@
> +/* SPDX-License-Identifier: BSD-3-Clause
> + * Copyright (c) 2022 Intel Corporation */
> +
> +#ifndef TEST_CRYPTODEV_ASYM_RSA_H_
> +#define TEST_CRYPTODEV_ASYM_RSA_H_
> +
> +#include <stdlib.h>
> +#include <stdint.h>
> +
> +int ats_rsa_setup(void);
> +
> +void ats_rsa_teardown(void);
> +
> +int ats_rsa_run(void);
> +
> +#endif /* TEST_CRYPTODEV_ASYM_RSA_H_ */
> diff --git a/app/test/test_cryptodev_asym_rsa_creator.c
> b/app/test/test_cryptodev_asym_rsa_creator.c
> new file mode 100644
> index 0000000000..7c031721af
> --- /dev/null
> +++ b/app/test/test_cryptodev_asym_rsa_creator.c
> @@ -0,0 +1,145 @@
> +/* SPDX-License-Identifier: BSD-3-Clause
> + * Copyright (c) 2022 Intel Corporation */
> +
> +#include <stdio.h>
> +#include <stdlib.h>
> +#include <stdint.h>
> +#include <string.h>
> +
> +#include <time.h>
> +
> +#include <openssl/bn.h>
> +#include <openssl/rand.h>
> +#include <openssl/rsa.h>
> +#include <openssl/engine.h>
> +#include <rte_crypto.h>
Use USE_OPENSSL as mentioned earlier here and don't run tests if openssl not installed.
> +
> +#include "test_cryptodev_asym_rsa_creator.h"
> +#include "test_cryptodev_asym_creator.h"
> +
> +static int rsa_result(RSA *rsa, struct asym_test_rsa_vct *vct,
> + enum rte_crypto_rsa_padding_type padding) {
> + int clen, state = 0;
> + int padding_rsa;
> + unsigned char digest[SHA256_DIGEST_LENGTH];
> +
> + if (padding == RTE_CRYPTO_RSA_PADDING_PKCS1_5)
> + padding_rsa = RSA_PKCS1_PADDING;
> + else
> + padding_rsa = RSA_NO_PADDING;
> +
> + clen = RSA_public_encrypt(vct->pt.len, vct->pt.data, vct->ct.data,
> rsa,
> + padding_rsa);
> +
> + if (clen >= 0)
> + vct->ct.len = clen;
> + else
> + goto err;
> +
> + unsigned char dec_buffer[ASYM_DATA_SIZE] = { 0 };
> + clen = RSA_private_decrypt(vct->ct.len, vct->ct.data, dec_buffer,
> rsa,
> + padding_rsa);
> +
> + if (memcmp(dec_buffer, vct->pt.data, vct->pt.len) != 0)
> + goto err;
> +
> + SHA256(vct->pt.data, vct->pt.len, digest);
> +
> + if (padding_rsa == RSA_NO_PADDING) {
> + int rsa_size = RSA_size(rsa);
> + if (RSA_padding_add_PKCS1_type_1(vct->digest.data,
> rsa_size, digest,
> + SHA256_DIGEST_LENGTH) != 1)
> + goto err;
> +
> + vct->digest.len = rsa_size;
> + } else {
> + memcpy(vct->digest.data, digest, SHA256_DIGEST_LENGTH);
> + vct->digest.len = SHA256_DIGEST_LENGTH;
> + }
> +
> + clen = RSA_private_encrypt(vct->digest.len, vct->digest.data,
> + vct->sign.data, rsa, padding_rsa);
> +
> + if (clen >= 0)
> + vct->sign.len = clen;
> + else
> + goto err;
> +
> + state = 1;
> +
> +err:
> + return state;
> +}
> +
> +int atv_rsa_creator(struct asym_test_rsa_vct *vct,
> + struct asym_test_rsa_rule *rule)
> +{
> + int ret;
> + BN_CTX *ctx = NULL;
> + RSA *rsa = NULL;
> + BIGNUM *exp = NULL;
> +
> + const BIGNUM *n = NULL;
> + const BIGNUM *e = NULL;
> + const BIGNUM *p = NULL;
> + const BIGNUM *d = NULL;
> + const BIGNUM *q = NULL;
> + const BIGNUM *dmp1 = NULL;
> + const BIGNUM *dmq1 = NULL;
> + const BIGNUM *iqmp = NULL;
> +
> + for (;;) {
Can you put some limitation on loop count here ?
> + vct->pt.len = rule->pt_len;
> + atv_create_data(vct->pt.data, vct->pt.len);
> + vct->pt.data[0] = 0xAA;
> +
> + ctx = BN_CTX_new();
> + rsa = RSA_new();
> + exp = BN_new();
> +
> + ret = BN_set_word(exp, RSA_F4);
> + if (ret == 0)
> + goto err;
> +
> + ret = RSA_generate_key_ex(rsa, rule->key_size, exp, NULL);
> + if (ret == 0)
> + goto err;
> +
> + ret = rsa_result(rsa, vct, rule->padding);
> + if (ret == 0)
> + goto err;
> +
> + RSA_get0_key(rsa, &n, &e, &d);
> + RSA_get0_factors(rsa, &p, &q);
> + RSA_get0_crt_params(rsa, &dmp1, &dmq1, &iqmp);
> +
> + vct->n.len = BN_bn2bin(n, vct->n.data);
> + vct->e.len = BN_bn2bin(e, vct->e.data);
> + vct->d.len = BN_bn2bin(d, vct->d.data);
> + vct->p.len = BN_bn2bin(p, vct->p.data);
> + vct->q.len = BN_bn2bin(q, vct->q.data);
> +
> + vct->dP.len = BN_bn2bin(dmp1, vct->dP.data);
> + vct->dQ.len = BN_bn2bin(dmq1, vct->dQ.data);
> + vct->qInv.len = BN_bn2bin(iqmp, vct->qInv.data);
> +
> +err:
> + RSA_free(rsa);
> + BN_free(exp);
> + BN_CTX_free(ctx);
> +
> + if (ret == 1)
> + break;
> + }
> +
> + vct->xform_type = RTE_CRYPTO_ASYM_XFORM_RSA;
> + vct->padding = rule->padding,
> + vct->op_type_flags = rule->operation;
> + vct->key_exp = 1,
> + vct->key_qt = 1,
> +
> + sprintf(vct->description, "RSA key size: %d bits", rule->key_size);
> + return 0;
> +}
> diff --git a/app/test/test_cryptodev_asym_rsa_creator.h
> b/app/test/test_cryptodev_asym_rsa_creator.h
> new file mode 100644
> index 0000000000..58c0efd376
> --- /dev/null
> +++ b/app/test/test_cryptodev_asym_rsa_creator.h
> @@ -0,0 +1,16 @@
> +/* SPDX-License-Identifier: BSD-3-Clause
> + * Copyright (c) 2022 Intel Corporation */
> +
> +#ifndef TEST_CRYPTODEV_ASYM_RSA_CREATOR_H_
> +#define TEST_CRYPTODEV_ASYM_RSA_CREATOR_H_
> +
> +#include <stdlib.h>
> +#include <stdint.h>
> +
> +#include "test_cryptodev_asym_vectors_def.h"
> +
> +int atv_rsa_creator(struct asym_test_rsa_vct *vct,
> + struct asym_test_rsa_rule *rule);
> +
> +#endif /* TEST_CRYPTODEV_ASYM_RSA_CREATOR_H_ */
> diff --git a/app/test/test_cryptodev_asym_types.h
> b/app/test/test_cryptodev_asym_types.h
> new file mode 100644
> index 0000000000..5b2a79679c
> --- /dev/null
> +++ b/app/test/test_cryptodev_asym_types.h
> @@ -0,0 +1,20 @@
> +/* SPDX-License-Identifier: BSD-3-Clause
> + * Copyright (c) 2022 Intel Corporation */
> +
> +#ifndef TEST_CRPTODEV_ASYM_TYPES_H_
> +#define TEST_CRPTODEV_ASYM_TYPES_H_
> +
> +#include <rte_cryptodev.h>
> +#include <rte_crypto.h>
> +
> +struct crypto_testsuite_params_asym {
> + struct rte_mempool *op_mpool;
> + struct rte_mempool *session_mpool;
> + struct rte_cryptodev_config conf;
> + struct rte_cryptodev_qp_conf qp_conf;
> + uint8_t valid_devs[RTE_CRYPTO_MAX_DEVS];
> + uint8_t valid_dev_count;
> +};
> +
> +#endif /* TEST_CRPTODEV_ASYM_TYPES_H_ */
> diff --git a/app/test/test_cryptodev_asym_vectors.c
> b/app/test/test_cryptodev_asym_vectors.c
> new file mode 100644
> index 0000000000..d18aaa5426
> --- /dev/null
> +++ b/app/test/test_cryptodev_asym_vectors.c
> @@ -0,0 +1,31 @@
> +/* SPDX-License-Identifier: BSD-3-Clause
> + * Copyright (c) 2022 Intel Corporation */
> +
> +#include <stdio.h>
> +#include <stdlib.h>
> +
> +#include "test_cryptodev_asym_vectors.h"
> +#include "test_cryptodev_asym_rsa_creator.h"
> +#include "test_cryptodev_asym_vectors_rules.h"
> +
> +void atv_free(void *vct)
> +{
> + free(vct);
> +}
> +
> +struct asym_test_rsa_vct *atv_rsa(int *vct_nb) {
> + struct asym_test_rsa_vct *vct = NULL;
> + int i;
> +
> + *vct_nb = asym_test_rsa_rules_size;
> +
> + vct = calloc(*vct_nb, sizeof(struct asym_test_rsa_vct));
> +
> + if (vct)
> + for (i = 0; i < *vct_nb; i++)
> + atv_rsa_creator(&vct[i], &asym_test_rsa_rules[i]);
else ?
> +
> + return vct;
> +}
> diff --git a/app/test/test_cryptodev_asym_vectors.h
> b/app/test/test_cryptodev_asym_vectors.h
> new file mode 100644
> index 0000000000..6f47d92dd3
> --- /dev/null
> +++ b/app/test/test_cryptodev_asym_vectors.h
> @@ -0,0 +1,18 @@
> +/* SPDX-License-Identifier: BSD-3-Clause
> + * Copyright (c) 2022 Intel Corporation */
> +
> +#ifndef TEST_CRYPTODEV_ASYM_VECTORS_H_
> +#define TEST_CRYPTODEV_ASYM_VECTORS_H_
> +
> +#include <stdint.h>
> +#include "rte_crypto_asym.h"
> +#include "test_cryptodev_asym_vectors_def.h"
> +
> +void atv_free(void *vct);
> +
> +struct asym_test_modex_vct *atv_modex(int *vct_nb);
> +
> +struct asym_test_rsa_vct *atv_rsa(int *vct_nb);
> +
> +#endif /* TEST_CRYPTODEV_ASYM_VECTORS_H_ */
> diff --git a/app/test/test_cryptodev_asym_vectors_def.h
> b/app/test/test_cryptodev_asym_vectors_def.h
> new file mode 100644
> index 0000000000..b8d9c51f9b
> --- /dev/null
> +++ b/app/test/test_cryptodev_asym_vectors_def.h
> @@ -0,0 +1,132 @@
> +/* SPDX-License-Identifier: BSD-3-Clause
> + * Copyright (c) 2022 Intel Corporation */
> +
> +#ifndef TEST_CRYPTODEV_ASYM_VECTORS_DEF_H__
> +#define TEST_CRYPTODEV_ASYM_VECTORS_DEF_H__
> +
> +#include <stdint.h>
> +
> +#include "rte_crypto_asym.h"
> +
> +#define ASYM_DATA_SIZE 4096
> +
> +struct asym_test_rsa_vct {
> + enum rte_crypto_asym_xform_type xform_type;
> + char description[2048];
> + uint64_t op_type_flags;
> + struct {
> + uint8_t data[ASYM_DATA_SIZE];
> + uint16_t len;
> + } pt;
> + struct {
> + uint8_t data[ASYM_DATA_SIZE];
> + uint16_t len;
> + } ct;
> + struct {
> + uint8_t data[ASYM_DATA_SIZE];
> + uint16_t len;
> + } sign;
> + struct {
> + uint8_t data[ASYM_DATA_SIZE];
> + uint16_t len;
> + } digest;
> + struct {
> + uint8_t data[ASYM_DATA_SIZE];
> + uint16_t len;
> + } e;
> + struct {
> + uint8_t data[ASYM_DATA_SIZE];
> + uint16_t len;
> + } d;
> + struct {
> + uint8_t data[ASYM_DATA_SIZE];
> + uint16_t len;
> + } n;
> + struct {
> + uint8_t data[ASYM_DATA_SIZE];
> + uint16_t len;
> + } p;
> + struct {
> + uint8_t data[ASYM_DATA_SIZE];
> + uint16_t len;
> + } q;
> + struct {
> + uint8_t data[ASYM_DATA_SIZE];
> + uint16_t len;
> + } dP;
> + struct {
> + uint8_t data[ASYM_DATA_SIZE];
> + uint16_t len;
> + } dQ;
> + struct {
> + uint8_t data[ASYM_DATA_SIZE];
> + uint16_t len;
> + } qInv;
> +
> + uint16_t result_len;
> + enum rte_crypto_rsa_padding_type padding;
> + int key_exp;
> + int key_qt;
> +};
> +
> +struct asym_test_rsa_rule {
> + int key_size;
> + enum rte_crypto_rsa_priv_key_type key_type;
> + enum rte_crypto_rsa_padding_type padding;
> + int pt_len;
> + uint64_t operation;
> +};
> +
> +struct asym_test_modex_vct {
> + enum rte_crypto_asym_xform_type xform_type;
> + char description[ASYM_DATA_SIZE];
> + struct {
> + uint8_t data[ASYM_DATA_SIZE];
> + uint16_t len;
> + } base;
> + struct {
> + uint8_t data[ASYM_DATA_SIZE];
> + uint16_t len;
> + } exponent;
> + struct {
> + uint8_t data[ASYM_DATA_SIZE];
> + uint16_t len;
> + } modulus;
> + struct {
> + uint8_t data[ASYM_DATA_SIZE];
> + uint16_t len;
> + } reminder;
> + uint16_t result_len;
> +};
> +
> +struct asym_test_modinv_vct {
> + enum rte_crypto_asym_xform_type xform_type;
> + char description[ASYM_DATA_SIZE];
> + struct {
> + uint8_t data[ASYM_DATA_SIZE];
> + uint16_t len;
> + } base;
> + struct {
> + uint8_t data[ASYM_DATA_SIZE];
> + uint16_t len;
> + } modulus;
> + struct {
> + uint8_t data[ASYM_DATA_SIZE];
> + uint16_t len;
> + } inverse;
> + uint16_t result_len;
> +};
> +
> +struct asym_test_modexp_rule {
> + int base_len;
> + int modulus_len;
> + int exponent_len;
> +};
> +
> +struct asym_test_modinv_rule {
> + int base_len;
> + int modulus_len;
> +};
> +
> +#endif /* TEST_CRYPTODEV_ASYM_VECTORS_DEF_H__ */
> diff --git a/app/test/test_cryptodev_asym_vectors_rules.h
> b/app/test/test_cryptodev_asym_vectors_rules.h
> new file mode 100644
> index 0000000000..4e93df6f59
> --- /dev/null
> +++ b/app/test/test_cryptodev_asym_vectors_rules.h
> @@ -0,0 +1,42 @@
> +/* SPDX-License-Identifier: BSD-3-Clause
> + * Copyright (c) 2022 Intel Corporation */
> +
> +#ifndef TEST_CRYPTODEV_ASYM_VECTORS_RULES_H__
> +#define TEST_CRYPTODEV_ASYM_VECTORS_RULES_H__
> +
> +#include <stdint.h>
> +
> +#include "test_cryptodev_asym_vectors_def.h"
> +
> +static struct asym_test_rsa_rule asym_test_rsa_rules[] = { {
> + .key_size = 1024,
> + .key_type = RTE_RSA_KEY_TYPE_EXP,
> + .padding = RTE_CRYPTO_RSA_PADDING_NONE,
> + .pt_len = 128,
> + .operation = (1UL << RTE_CRYPTO_ASYM_OP_ENCRYPT) |
> + (1UL <<
> RTE_CRYPTO_ASYM_OP_DECRYPT) }, {
> + .key_size = 2048,
> + .key_type = RTE_RSA_KEY_TYPE_EXP,
> + .padding = RTE_CRYPTO_RSA_PADDING_NONE,
> + .pt_len = 256,
> + .operation = (1UL << RTE_CRYPTO_ASYM_OP_ENCRYPT) |
> + (1UL <<
> RTE_CRYPTO_ASYM_OP_DECRYPT) }, {
> + .key_size = 4096,
> + .key_type = RTE_RSA_KEY_TYPE_EXP,
> + .padding = RTE_CRYPTO_RSA_PADDING_NONE,
> + .pt_len = 512,
> + .operation = (1UL << RTE_CRYPTO_ASYM_OP_ENCRYPT) |
> + (1UL <<
> RTE_CRYPTO_ASYM_OP_DECRYPT)
> + },
> +};
> +
Could you also add some combinations of _QT type key ?
Also on padding type as well. Just to ensure nothing broken here.
> +static int asym_test_rsa_rules_size = (sizeof(asym_test_rsa_rules)
> + / sizeof(*asym_test_rsa_rules));
> +
> +#endif /* TEST_CRYPTODEV_ASYM_VECTORS_RULES_H__ */
> diff --git a/lib/cryptodev/rte_crypto_asym.h
> b/lib/cryptodev/rte_crypto_asym.h index 8ae43d5f3d..6e289832b3 100644
> --- a/lib/cryptodev/rte_crypto_asym.h
> +++ b/lib/cryptodev/rte_crypto_asym.h
> @@ -182,6 +182,7 @@ enum rte_crypto_rsa_priv_key_type {
> /**< RSA private key is in quintuple format
> * See rte_crypto_rsa_priv_key_qt
> */
> + RTE_RSA_KEY_TYPE_LIST_END,
Read my comment above to avoid this change as much as possible.
> };
>
> /**
> --
> 2.25.1
Thanks,
Gowrishankar
prev parent reply other threads:[~2022-09-27 11:42 UTC|newest]
Thread overview: 3+ messages / expand[flat|nested] mbox.gz Atom feed top
2022-08-17 10:57 [PATCH] " Przemyslaw Zegan
2022-08-17 14:14 ` [dpdk-dev v2] " Przemyslaw Zegan
2022-09-27 11:42 ` Gowrishankar Muthukrishnan [this message]
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=CO1PR18MB4714DB97AC18902CD602C527CB559@CO1PR18MB4714.namprd18.prod.outlook.com \
--to=gmuthukrishn@marvell.com \
--cc=dev@dpdk.org \
--cc=gakhil@marvell.com \
--cc=przemyslawx.zegan@intel.com \
--cc=roy.fan.zhang@intel.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).