Hi,

> -----Original Message-----
> From: Kusztal, ArkadiuszX <arkadiuszx.kusz...@intel.com>
> Sent: Tuesday, March 22, 2022 9:11 AM
> To: dev@dpdk.org
> Cc: gak...@marvell.com; Zhang, Roy Fan <roy.fan.zh...@intel.com>;
> ano...@marvell.com; Kusztal, ArkadiuszX <arkadiuszx.kusz...@intel.com>
> Subject: [RFC PATCH 2/2] test: add proper pkcs1 signature tests for rsa
> 
> This commit adds example pkcs1 signature tests.
> 
> Signed-off-by: Arek Kusztal <arkadiuszx.kusz...@intel.com>
> ---
>  app/test/test_cryptodev_asym.c           | 249
> +++++++++++++++++++++++++++++--
>  drivers/crypto/openssl/rte_openssl_pmd.c |  34 ++++-
>  lib/cryptodev/rte_crypto_asym.h          |   6 +-
>  3 files changed, 270 insertions(+), 19 deletions(-)
> 
> diff --git a/app/test/test_cryptodev_asym.c b/app/test/test_cryptodev_asym.c
> index 71378cbdb2..512eb34377 100644
> --- a/app/test/test_cryptodev_asym.c
> +++ b/app/test/test_cryptodev_asym.c
> @@ -15,6 +15,7 @@
> 
>  #include <rte_cryptodev.h>
>  #include <rte_crypto.h>
> +#include <openssl/rsa.h>
> 
>  #include "test_cryptodev.h"
>  #include "test_cryptodev_dh_test_vectors.h"
> @@ -163,6 +164,222 @@ queue_ops_rsa_sign_verify(void *sess)
>       return status;
>  }
> 
> +/* DPDK RFC RSA 22.07 */
> +
> +static uint8_t
> +rsa_sign_pkcs_15_pt[] = {
> +     0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08,
> +     0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, 0x10,
> +     0x11, 0x12, 0x13, 0x14,
> +};
> +
> +static uint8_t
> +rsa_sign_pkcs_15_pt_sha256[] = {
> +     0xB1, 0xB2, 0xB3, 0xB4, 0xA1, 0xA2, 0xA3, 0xA4,
> +     0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08,
> +     0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, 0x10,
> +     0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, };
> +
> +static uint8_t
> +rsa_sign_pkcs_15_padded[] = {
> +     0x00, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
> +     0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
> +     0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
> +     0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
> +     0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
> +     0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
> +     0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
> +     0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
> +     0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
> +     0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
> +     0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
> +     0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
> +     0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
> +     0xFF, 0xFF, 0xFF, 0x00, 0x01, 0x02, 0x03, 0x04,
> +     0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C,
> +     0x0D, 0x0E, 0x0F, 0x10, 0x11, 0x12, 0x13, 0x14,
> +};
> +
> +static uint8_t
> +rsa_sign_pkcs_15_padded_digestinfo_sha1[] = {
> +     0x00, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
> +     0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
> +     0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
> +     0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
> +     0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
> +     0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
> +     0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
> +     0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
> +     0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
> +     0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
> +     0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
> +     0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x30, 0x21, 0x30,
> +     0x09, 0x06, 0x05, 0x2b, 0x0e, 0x03, 0x02, 0x1a,
> +     0x05, 0x00, 0x04, 0x14, 0x01, 0x02, 0x03, 0x04,
> +     0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C,
> +     0x0D, 0x0E, 0x0F, 0x10, 0x11, 0x12, 0x13, 0x14,
> +};
> +
> +static uint8_t
> +rsa_sign_pkcs_15_padded_digestinfo_sha256[] = {
> +     0x00, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
> +     0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
> +     0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
> +     0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
> +     0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
> +     0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
> +     0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
> +     0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
> +     0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
> +     0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x30, 0x31, 0x30,
> +     0x0d, 0x06, 0x09, 0x60, 0x86, 0x48, 0x01, 0x65,
> +     0x03, 0x04, 0x02, 0x01, 0x05, 0x00, 0x04, 0x20,
> +     0xB1, 0xB2, 0xB3, 0xB4, 0xA1, 0xA2, 0xA3, 0xA4,
> +     0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08,
> +     0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, 0x10,
> +     0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, };
> +
> +static void*
> +rfc2207_rsa_sign_pkcs_15_sesscreat(void)
> +{
> +     struct crypto_testsuite_params_asym *ts_params = &testsuite_params;
> +     struct rte_mempool *sess_mpool = ts_params->session_mpool;
> +     uint8_t dev_id = ts_params->valid_devs[0];
> +     static void *sess = NULL;
> +     int ret;
> +
> +     if (sess)
> +             return sess;
> +     ret = rte_cryptodev_asym_session_create(dev_id, &rsa_xform,
> +sess_mpool, &sess);
> +
> +     if (ret < 0) {
> +             RTE_LOG(ERR, USER1, "Session creation failed for "
> +                     "sign_verify\n");
> +             return NULL;
> +     }
> +     return sess;
> +}
> +
> +struct rfc2207_rsa_test_data
> +{
> +     enum rte_crypto_rsa_padding_type type;
> +     rte_crypto_param input;
> +     enum rte_crypto_auth_algorithm hash;
> +};
> +
[Arek] - rfc2207_rsa_test_data_ssl23 and rfc2207_rsa_test_data_pkcs15_sha1 
creates PKCS1_5 signature from same data, but signatures are different as 
RTE_CRYPTO_RSA_PADDING_SSL23 (PKCS1_5 flag in other patch) which is what we 
currently have in Cryptodev does not use AlgorithmIdentifier.

> +struct rfc2207_rsa_test_data
> +rfc2207_rsa_test_data_ssl23 = {
> +     .type = RTE_CRYPTO_RSA_PADDING_SSL23,
> +     .input.data = rsa_sign_pkcs_15_pt,
> +     .input.length = sizeof(rsa_sign_pkcs_15_pt), };
> +
> +struct rfc2207_rsa_test_data
> +rfc2207_rsa_test_data_ssl23_padded = {
> +     .type = RTE_CRYPTO_RSA_PADDING_NONE,
> +     .input.data = rsa_sign_pkcs_15_padded,
> +     .input.length = sizeof(rsa_sign_pkcs_15_padded), };
> +
> +struct rfc2207_rsa_test_data
> +rfc2207_rsa_test_data_pkcs15_sha1 = {
> +     .type = RTE_CRYPTO_RSA_PADDING_PKCS1_5,
> +     .hash = RTE_CRYPTO_AUTH_SHA1,
> +     .input.data = rsa_sign_pkcs_15_pt,
> +     .input.length = sizeof(rsa_sign_pkcs_15_pt), };
> +
> +struct rfc2207_rsa_test_data
> +rfc2207_rsa_test_data_pkcs15_digestinfo_sha1 = {
> +     .type = RTE_CRYPTO_RSA_PADDING_NONE,
> +     .input.data = rsa_sign_pkcs_15_padded_digestinfo_sha1,
> +     .input.length = sizeof(rsa_sign_pkcs_15_padded_digestinfo_sha1),
> +};
> +
> +struct rfc2207_rsa_test_data
> +rfc2207_rsa_test_data_pkcs15_sha256 = {
> +     .type = RTE_CRYPTO_RSA_PADDING_PKCS1_5,
> +     .hash = RTE_CRYPTO_AUTH_SHA256,
> +     .input.data = rsa_sign_pkcs_15_pt_sha256,
> +     .input.length = sizeof(rsa_sign_pkcs_15_pt_sha256),
> +};
> +
> +struct rfc2207_rsa_test_data
> +rfc2207_rsa_test_data_pkcs15_digestinfo_sha256 = {
> +     .type = RTE_CRYPTO_RSA_PADDING_NONE,
> +     .input.data = rsa_sign_pkcs_15_padded_digestinfo_sha256,
> +     .input.length = sizeof(rsa_sign_pkcs_15_padded_digestinfo_sha256),
> +};
> +
> +struct rfc2207_rsa_test_data
> +rfc2207_rsa_test_data_pkcs15_oaep = {
> +     .type = RTE_CRYPTO_RSA_PADDING_NONE,
> +     .input.data = rsa_sign_pkcs_15_padded_digestinfo_sha256,
> +     .input.length = sizeof(rsa_sign_pkcs_15_padded_digestinfo_sha256),
> +};
> +
> +static int
> +rfc2207_rsa_sign_pkcs_15(const void *test_data) {
> +     struct crypto_testsuite_params_asym *ts_params;
> +     uint8_t dev_id;
> +     struct rte_crypto_op *op, *result_op;
> +     struct rte_crypto_asym_op *asym_op;
> +     struct rte_mempool *op_mpool;
> +     void *sess;
> +     uint8_t result[TEST_DATA_SIZE];
> +     const struct rfc2207_rsa_test_data *tdata = test_data;
> +
> +     ts_params = &testsuite_params;
> +     dev_id = ts_params->valid_devs[0];
> +     op_mpool = ts_params->op_mpool;
> +     op = rte_crypto_op_alloc(op_mpool,
> RTE_CRYPTO_OP_TYPE_ASYMMETRIC);
> +     if (op == NULL) {
> +             RTE_LOG(ERR, USER1, "Failed to allocate asymmetric crypto "
> +                     "operation struct\n");
> +             return TEST_FAILED;
> +     }
> +
> +     sess = rfc2207_rsa_sign_pkcs_15_sesscreat();
> +     if (sess == NULL) {
> +             RTE_LOG(ERR, USER1, "Failed to allocate asymmetric crypto "
> +                     "operation struct\n");
> +             return TEST_FAILED;
> +     }
> +
> +     asym_op = op->asym;
> +     asym_op->rsa.op_type = RTE_CRYPTO_ASYM_OP_SIGN;
> +     asym_op->rsa.padding.type = tdata->type;
> +     asym_op->rsa.padding.hash = tdata->hash;
> +     asym_op->rsa.input = tdata->input;
> +     asym_op->rsa.output.data = result;
> +
> +     rte_crypto_op_attach_asym_session(op, sess);
> +
> +     /* Process crypto operation */
> +     if (rte_cryptodev_enqueue_burst(dev_id, 0, &op, 1) != 1) {
> +             RTE_LOG(ERR, USER1, "Error sending packet for encryption\n");
> +             return -1;
> +     }
> +
> +     while (rte_cryptodev_dequeue_burst(dev_id, 0, &result_op, 1) == 0)
> +             rte_pause();
> +
> +     if (result_op == NULL) {
> +             RTE_LOG(ERR, USER1, "Failed to process encryption op\n");
> +             return -1;
> +     }
> +
> +     printf("\nOutput len = %lu", asym_op->rsa.output.length);
> +     rte_hexdump(stdout, "Signature", asym_op->rsa.output.data,
> +asym_op->rsa.output.length);
> +
> +     return 0;
> +}
> +
> +/* !---! DPDK RFC RSA 22.07 */
> +
>  static int
>  queue_ops_rsa_enc_dec(void *sess)
>  {
> @@ -2147,20 +2364,32 @@ static struct unit_test_suite
> cryptodev_openssl_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_dsa),
> -             TEST_CASE_ST(ut_setup_asym, ut_teardown_asym,
> +             TEST_CASE_ST_DISABLED(ut_setup_asym, ut_teardown_asym,
> test_capability),
> +             TEST_CASE_ST_DISABLED(ut_setup_asym, ut_teardown_asym,
> test_dsa),
> +             TEST_CASE_ST_DISABLED(ut_setup_asym, ut_teardown_asym,
>                               test_dh_keygenration),
> -             TEST_CASE_ST(ut_setup_asym, ut_teardown_asym,
> test_rsa_enc_dec),
> -             TEST_CASE_ST(ut_setup_asym, ut_teardown_asym,
> +             TEST_CASE_ST_DISABLED(ut_setup_asym, ut_teardown_asym,
> test_rsa_enc_dec),
> +             TEST_CASE_ST_DISABLED(ut_setup_asym, ut_teardown_asym,
>                               test_rsa_sign_verify),
> -             TEST_CASE_ST(ut_setup_asym, ut_teardown_asym,
> +             TEST_CASE_ST_DISABLED(ut_setup_asym, ut_teardown_asym,
>                               test_rsa_enc_dec_crt),
> -             TEST_CASE_ST(ut_setup_asym, ut_teardown_asym,
> +             TEST_CASE_ST_DISABLED(ut_setup_asym, ut_teardown_asym,
>                               test_rsa_sign_verify_crt),
> -             TEST_CASE_ST(ut_setup_asym, ut_teardown_asym,
> test_mod_inv),
> -             TEST_CASE_ST(ut_setup_asym, ut_teardown_asym,
> test_mod_exp),
> -             TEST_CASE_ST(ut_setup_asym, ut_teardown_asym,
> test_one_by_one),
> +             TEST_CASE_ST_DISABLED(ut_setup_asym, ut_teardown_asym,
> test_mod_inv),
> +             TEST_CASE_ST_DISABLED(ut_setup_asym, ut_teardown_asym,
> test_mod_exp),
> +             TEST_CASE_ST_DISABLED(ut_setup_asym, ut_teardown_asym,
> test_one_by_one),
> +
>       TEST_CASE_NAMED_WITH_DATA("rfc2207_rsa_sign_pkcs_15_ssl23",
> ut_setup_asym, ut_teardown_asym,
> +                             rfc2207_rsa_sign_pkcs_15,
> &rfc2207_rsa_test_data_ssl23),
> +
>       TEST_CASE_NAMED_WITH_DATA("rfc2207_rsa_sign_pkcs_15_ssl23_pa
> dded", ut_setup_asym, ut_teardown_asym,
> +                             rfc2207_rsa_sign_pkcs_15,
> &rfc2207_rsa_test_data_ssl23_padded),
> +
>       TEST_CASE_NAMED_WITH_DATA("rfc2207_rsa_sign_pkcs_15_sha1",
> ut_setup_asym, ut_teardown_asym,
> +                             rfc2207_rsa_sign_pkcs_15,
> &rfc2207_rsa_test_data_pkcs15_sha1),
> +
>       TEST_CASE_NAMED_WITH_DATA("rfc2207_rsa_sign_pkcs_15_digestinf
> o_sha1", ut_setup_asym, ut_teardown_asym,
> +                             rfc2207_rsa_sign_pkcs_15,
> &rfc2207_rsa_test_data_pkcs15_digestinfo_sha1),
> +
>       TEST_CASE_NAMED_WITH_DATA("rfc2207_rsa_sign_pkcs_15_sha256",
> ut_setup_asym, ut_teardown_asym,
> +                             rfc2207_rsa_sign_pkcs_15,
> &rfc2207_rsa_test_data_pkcs15_sha256),
> +
>       TEST_CASE_NAMED_WITH_DATA("rfc2207_rsa_sign_pkcs_15_digestinf
> o_sha256", ut_setup_asym, ut_teardown_asym,
> +                             rfc2207_rsa_sign_pkcs_15,
> +&rfc2207_rsa_test_data_pkcs15_digestinfo_sha256),
>               TEST_CASES_END() /**< NULL terminate unit test array */
>       }
>  };
> diff --git a/drivers/crypto/openssl/rte_openssl_pmd.c
> b/drivers/crypto/openssl/rte_openssl_pmd.c
> index 45cee47c5d..32da143ea0 100644
> --- a/drivers/crypto/openssl/rte_openssl_pmd.c
> +++ b/drivers/crypto/openssl/rte_openssl_pmd.c
> @@ -1899,11 +1899,24 @@ process_openssl_rsa_op(struct rte_crypto_op
> *cop,
>       RSA *rsa = sess->u.r.rsa;
>       uint32_t pad = (op->rsa.padding.type);
>       uint8_t *tmp;
> +     int sha;
> +
> +     switch (op->rsa.padding.hash) {
> +     case RTE_CRYPTO_AUTH_SHA1:
> +             sha = NID_sha1;
> +             break;
> +     case RTE_CRYPTO_AUTH_SHA256:
> +             sha = NID_sha256;
> +             break;
> +     default:
> +             sha = NID_sha1;
> +     }
> 
>       cop->status = RTE_CRYPTO_OP_STATUS_SUCCESS;
> 
>       switch (pad) {
>       case RTE_CRYPTO_RSA_PADDING_PKCS1_5:
> +     case RTE_CRYPTO_RSA_PADDING_SSL23:
>               pad = RSA_PKCS1_PADDING;
>               break;
>       case RTE_CRYPTO_RSA_PADDING_NONE:
> @@ -1941,13 +1954,20 @@ process_openssl_rsa_op(struct rte_crypto_op
> *cop,
>               break;
> 
>       case RTE_CRYPTO_ASYM_OP_SIGN:
> -             ret = RSA_private_encrypt(op->rsa.input.length,
> -                             op->rsa.input.data,
> -                             op->rsa.output.data,
> -                             rsa,
> -                             pad);
> -             if (ret > 0)
> -                     op->rsa.output.length = ret;
> +             if (op->rsa.padding.type !=
> RTE_CRYPTO_RSA_PADDING_PKCS1_5) {
> +                     ret = RSA_private_encrypt(op->rsa.input.length,
> +                                     op->rsa.input.data,
> +                                     op->rsa.output.data,
> +                                     rsa,
> +                                     pad);
> +                     if (ret > 0)
> +                             op->rsa.output.length = ret;
> +             } else {
> +                     ret = RSA_sign(sha, op->rsa.input.data, op-
> >rsa.input.length,
> +                                             op->rsa.output.data, (unsigned
> int *)&op->rsa.output.length, rsa);
> +                     if (ret == 0)
> +                             ret = -1;
> +             }
>               break;
> 
>       case RTE_CRYPTO_ASYM_OP_VERIFY:
> diff --git a/lib/cryptodev/rte_crypto_asym.h b/lib/cryptodev/rte_crypto_asym.h
> index 834e06b96b..b3906b08e3 100644
> --- a/lib/cryptodev/rte_crypto_asym.h
> +++ b/lib/cryptodev/rte_crypto_asym.h
> @@ -149,6 +149,7 @@ enum rte_crypto_mgf {
>  /**
>   * Padding types for RSA signature.
>   */
> + #define TEMP
>  enum rte_crypto_rsa_padding_type {
>       RTE_CRYPTO_RSA_PADDING_NONE = 0,
>       /**< RSA no padding scheme */
> @@ -160,6 +161,7 @@ enum rte_crypto_rsa_padding_type {
>       /**< RSA PKCS#1 OAEP padding scheme */
>       RTE_CRYPTO_RSA_PADDING_PSS,
>       /**< RSA PKCS#1 PSS padding scheme */
> +     TEMP RTE_CRYPTO_RSA_PADDING_SSL23,
>       RTE_CRYPTO_RSA_PADDING_TYPE_LIST_END
>  };
> 
> @@ -426,7 +428,7 @@ struct rte_crypto_rsa_op_param {
>        *
>        * If padding.type = RTE_CRYPTO_RSA_PADDING_NONE
>        * input should only be used along with cryptographically
> -      * secure padding scheme.        *
> +      * secure padding scheme.
>        * If padding.type = RTE_CRYPTO_RSA_PADDING_PKCS1_5 or
>        * RTE_CRYPTO_RSA_PADDING_PSS
>        * if the RTE_CRYPTO_RSA_FLAG_PT flag is set, input shall contain @@ -
> 434,7 +436,7 @@ struct rte_crypto_rsa_op_param {
>        * the digest of the message to be signed.
>        *
>        * When op_type == RTE_CRYPTO_ASYM_OP_DECRYPT:
> -      *
> +      *
>        * Input shall contain previously encrypted RSA message.
>        *
>        * When op_type == RTE_CRYPTO_ASYM_OP_VERIFY:
> --
> 2.13.6

Reply via email to