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; +}; + +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_padded", 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_digestinfo_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_digestinfo_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