From: Arek Kusztal <arkadiuszx.kusztal@intel.com>
To: dev@dpdk.org
Cc: gakhil@marvell.com, Arek Kusztal <arkadiuszx.kusztal@intel.com>
Subject: [PATCH 1/2] test/crypto: add ecdsa qat test cases
Date: Thu, 18 Aug 2022 07:05:25 +0100 [thread overview]
Message-ID: <20220818060526.17343-2-arkadiuszx.kusztal@intel.com> (raw)
In-Reply-To: <20220818060526.17343-1-arkadiuszx.kusztal@intel.com>
This commit adds ECDSA test cases to Intel QuickAssist
Technology testsuite.
Signed-off-by: Arek Kusztal <arkadiuszx.kusztal@intel.com>
---
app/test/test_cryptodev_asym.c | 196 +++++++++++++++++++++++++++++++++++++++++
1 file changed, 196 insertions(+)
diff --git a/app/test/test_cryptodev_asym.c b/app/test/test_cryptodev_asym.c
index fc1a727472..0fea47c42e 100644
--- a/app/test/test_cryptodev_asym.c
+++ b/app/test/test_cryptodev_asym.c
@@ -2190,6 +2190,178 @@ test_ecpm_all_curve(void)
return overall_status;
}
+/*
+ * ECDSA Signature generation function
+ */
+static int
+test_ecdsa_sign(const void *input_vector)
+{
+ const struct crypto_testsuite_ecdsa_params *test_vector = input_vector;
+ struct crypto_testsuite_params_asym *ts_params = &testsuite_params;
+ struct rte_mempool *op_mpool = ts_params->op_mpool;
+ struct rte_crypto_op *op;
+ struct rte_crypto_op *result_op = NULL;
+ struct rte_crypto_asym_xform xform = {
+ .next = NULL,
+ .xform_type = RTE_CRYPTO_ASYM_XFORM_ECDSA,
+ .ec.curve_id = test_vector->curve
+ };
+ uint8_t R[test_vector->sign_r.length];
+ uint8_t S[test_vector->sign_s.length];
+ const uint8_t dev_id = ts_params->valid_devs[0];
+
+ op = rte_crypto_op_alloc(op_mpool, RTE_CRYPTO_OP_TYPE_ASYMMETRIC);
+ if (op == NULL) {
+ RTE_LOG(ERR, USER1,
+ "line %u FAILED: %s", __LINE__,
+ "Failed to allocate asymmetric crypto operation struct\n"
+ );
+ return TEST_FAILED;
+ }
+ /*
+ * Set input data
+ * - Sessionless operation, no session will be created. User is
+ * responsible for taking care of xform lifetime -> in case of ECDSA
+ * no keys are stored in xform so it is not security crucial to clear
+ * data, although it is recommended to clear xform anyway.
+ * - Generation of signature pair R, S.
+ * - Message is a digest of message to be signed.
+ * - k is a random integer in interval (1, n - 1)
+ * - pkey is a private key
+ */
+ op->sess_type = RTE_CRYPTO_OP_SESSIONLESS;
+ op->asym->xform = &xform;
+ op->asym->ecdsa.op_type = RTE_CRYPTO_ASYM_OP_SIGN;
+ op->asym->ecdsa.message.data = test_vector->digest.data;
+ op->asym->ecdsa.message.length = test_vector->digest.length;
+ op->asym->ecdsa.k.data = test_vector->scalar.data;
+ op->asym->ecdsa.k.length = test_vector->scalar.length;
+ op->asym->ecdsa.pkey.data = test_vector->pkey.data;
+ op->asym->ecdsa.pkey.length = test_vector->pkey.length;
+
+ /*
+ * Set output data
+ * Signature pair R, S. Positive integers.
+ */
+ op->asym->ecdsa.r.data = R;
+ op->asym->ecdsa.s.data = S;
+
+ /* Sending packet for signature generation */
+ if (rte_cryptodev_enqueue_burst(dev_id, 0, &op, 1) != 1) {
+ RTE_LOG(ERR, USER1,
+ "line %u FAILED: %s", __LINE__,
+ "Error sending packet for operation\n");
+ return TEST_FAILED;
+ }
+ /* Waiting for packet to be dequeued */
+ while (rte_cryptodev_dequeue_burst(dev_id, 0, &result_op, 1) == 0)
+ rte_pause();
+
+ if (result_op == NULL) {
+ RTE_LOG(ERR, USER1,
+ "line %u FAILED: %s", __LINE__,
+ "Failed to process asym crypto op\n");
+ return TEST_FAILED;
+ }
+
+ if (result_op->status != RTE_CRYPTO_OP_STATUS_SUCCESS) {
+ RTE_LOG(ERR, USER1,
+ "line %u FAILED: %s", __LINE__,
+ "ECDSA generation failed.\n");
+ return TEST_FAILED;
+ }
+
+ /* Generated signature R, S */
+ debug_hexdump(stdout, "R:", result_op->asym->ecdsa.r.data,
+ result_op->asym->ecdsa.r.length);
+ debug_hexdump(stdout, "S:", result_op->asym->ecdsa.s.data,
+ result_op->asym->ecdsa.s.length);
+
+ return TEST_SUCCESS;
+}
+
+/*
+ * ECDSA Signature verification function
+ */
+static int
+test_ecdsa_verify(const void *input_vector)
+{
+ const struct crypto_testsuite_ecdsa_params *test_vector = input_vector;
+ struct crypto_testsuite_params_asym *ts_params = &testsuite_params;
+ struct rte_mempool *op_mpool = ts_params->op_mpool;
+ struct rte_crypto_op *op;
+ struct rte_crypto_op *result_op = NULL;
+ struct rte_crypto_asym_xform xform = {
+ .next = NULL,
+ .xform_type = RTE_CRYPTO_ASYM_XFORM_ECDSA,
+ .ec.curve_id = test_vector->curve
+ };
+ const uint8_t dev_id = ts_params->valid_devs[0];
+
+ op = rte_crypto_op_alloc(op_mpool, RTE_CRYPTO_OP_TYPE_ASYMMETRIC);
+ if (op == NULL) {
+ RTE_LOG(ERR, USER1,
+ "line %u FAILED: %s", __LINE__,
+ "Failed to allocate asymmetric crypto operation struct\n"
+ );
+ return TEST_FAILED;
+ }
+ /*
+ * Set input data
+ * - Sessionless operation, no session will be created. User is
+ * responsible for taking care of xform lifetime -> in case of
+ * ECDSA no keys are stored in xform so it is not security crucial to
+ * clear data, although it is recommended to clear xform anyway.
+ * - Verification of signature pair R, S.
+ * - Message is a digest of message that was signed.
+ * - q is a public key
+ */
+ op->sess_type = RTE_CRYPTO_OP_SESSIONLESS;
+ op->asym->xform = &xform;
+ op->asym->ecdsa.op_type = RTE_CRYPTO_ASYM_OP_VERIFY;
+ op->asym->ecdsa.message.data = test_vector->digest.data;
+ op->asym->ecdsa.message.length = test_vector->digest.length;
+ op->asym->ecdsa.q.x.data = test_vector->pubkey_qx.data;
+ op->asym->ecdsa.q.x.length = test_vector->pubkey_qx.length;
+ op->asym->ecdsa.q.y.data = test_vector->pubkey_qy.data;
+ op->asym->ecdsa.q.y.length = test_vector->pubkey_qx.length;
+ op->asym->ecdsa.r.data = test_vector->sign_r.data;
+ op->asym->ecdsa.r.length = test_vector->sign_r.length;
+ op->asym->ecdsa.s.data = test_vector->sign_s.data;
+ op->asym->ecdsa.s.length = test_vector->sign_s.length;
+
+ /* Sending packet for signature generation */
+ if (rte_cryptodev_enqueue_burst(dev_id, 0, &op, 1) != 1) {
+ RTE_LOG(ERR, USER1,
+ "line %u FAILED: %s", __LINE__,
+ "Error sending packet for operation\n");
+ return TEST_FAILED;
+ }
+ /* Waiting for packet to be dequeued */
+ while (rte_cryptodev_dequeue_burst(dev_id, 0, &result_op, 1) == 0)
+ rte_pause();
+
+ if (result_op == NULL) {
+ RTE_LOG(ERR, USER1,
+ "line %u FAILED: %s", __LINE__,
+ "Failed to process asym crypto op\n");
+ return TEST_FAILED;
+ }
+
+ /*
+ * If result_op->status equals RTE_CRYPTO_OP_STATUS_SUCCESS
+ * signature was verified correctly
+ */
+ if (result_op->status != RTE_CRYPTO_OP_STATUS_SUCCESS) {
+ RTE_LOG(ERR, USER1,
+ "line %u FAILED: %s", __LINE__,
+ "ECDSA verify failed.\n");
+ return TEST_FAILED;
+ }
+
+ return TEST_SUCCESS;
+}
+
static struct unit_test_suite cryptodev_openssl_asym_testsuite = {
.suite_name = "Crypto Device OPENSSL ASYM Unit Test Suite",
.setup = testsuite_setup,
@@ -2218,6 +2390,30 @@ static struct unit_test_suite cryptodev_qat_asym_testsuite = {
.setup = testsuite_setup,
.teardown = testsuite_teardown,
.unit_test_cases = {
+ TEST_CASE_NAMED_WITH_DATA(
+ "Test - ECDSA secp256r1 signature generation",
+ ut_setup_asym, ut_teardown_asym,
+ test_ecdsa_sign, &ecdsa_param_secp256r1),
+ TEST_CASE_NAMED_WITH_DATA(
+ "Test - ECDSA secp256r1 signature verification",
+ ut_setup_asym, ut_teardown_asym,
+ test_ecdsa_verify, &ecdsa_param_secp256r1),
+ TEST_CASE_NAMED_WITH_DATA(
+ "Test - ECDSA secp384r1 signature generation",
+ ut_setup_asym, ut_teardown_asym,
+ test_ecdsa_sign, &ecdsa_param_secp384r1),
+ TEST_CASE_NAMED_WITH_DATA(
+ "Test - ECDSA secp384r1 signature verification",
+ ut_setup_asym, ut_teardown_asym,
+ test_ecdsa_verify, &ecdsa_param_secp384r1),
+ TEST_CASE_NAMED_WITH_DATA(
+ "Test - ECDSA secp521r1 signature generation",
+ ut_setup_asym, ut_teardown_asym,
+ test_ecdsa_sign, &ecdsa_param_secp521r1),
+ TEST_CASE_NAMED_WITH_DATA(
+ "Test - ECDSA secp521r1 signature verification",
+ ut_setup_asym, ut_teardown_asym,
+ test_ecdsa_verify, &ecdsa_param_secp521r1),
TEST_CASE_ST(ut_setup_asym, ut_teardown_asym, test_one_by_one),
TEST_CASES_END() /**< NULL terminate unit test array */
}
--
2.13.6
next prev parent reply other threads:[~2022-08-18 7:14 UTC|newest]
Thread overview: 4+ messages / expand[flat|nested] mbox.gz Atom feed top
2022-08-18 6:05 [PATCH 0/2] test: add elliptic curve tests Arek Kusztal
2022-08-18 6:05 ` Arek Kusztal [this message]
2022-08-18 6:05 ` [PATCH 2/2] test/crypto: add ecdh tests Arek Kusztal
2022-10-21 15:09 ` [EXT] [PATCH 0/2] test: add elliptic curve tests Akhil Goyal
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=20220818060526.17343-2-arkadiuszx.kusztal@intel.com \
--to=arkadiuszx.kusztal@intel.com \
--cc=dev@dpdk.org \
--cc=gakhil@marvell.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).