get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

GET /api/patches/63788/?format=api
HTTP 200 OK
Allow: GET, PUT, PATCH, HEAD, OPTIONS
Content-Type: application/json
Vary: Accept

{
    "id": 63788,
    "url": "http://patches.dpdk.org/api/patches/63788/?format=api",
    "web_url": "http://patches.dpdk.org/project/dpdk/patch/20191211161015.9845-2-adamx.dybkowski@intel.com/",
    "project": {
        "id": 1,
        "url": "http://patches.dpdk.org/api/projects/1/?format=api",
        "name": "DPDK",
        "link_name": "dpdk",
        "list_id": "dev.dpdk.org",
        "list_email": "dev@dpdk.org",
        "web_url": "http://core.dpdk.org",
        "scm_url": "git://dpdk.org/dpdk",
        "webscm_url": "http://git.dpdk.org/dpdk",
        "list_archive_url": "https://inbox.dpdk.org/dev",
        "list_archive_url_format": "https://inbox.dpdk.org/dev/{}",
        "commit_url_format": ""
    },
    "msgid": "<20191211161015.9845-2-adamx.dybkowski@intel.com>",
    "list_archive_url": "https://inbox.dpdk.org/dev/20191211161015.9845-2-adamx.dybkowski@intel.com",
    "date": "2019-12-11T16:10:15",
    "name": "[1/1] test/crypto: refactor unit tests into one combined array",
    "commit_ref": null,
    "pull_url": null,
    "state": "superseded",
    "archived": true,
    "hash": "94967a5b4fcd8aa38fe9ac7c10af0836c652c834",
    "submitter": {
        "id": 1322,
        "url": "http://patches.dpdk.org/api/people/1322/?format=api",
        "name": "Dybkowski, AdamX",
        "email": "adamx.dybkowski@intel.com"
    },
    "delegate": null,
    "mbox": "http://patches.dpdk.org/project/dpdk/patch/20191211161015.9845-2-adamx.dybkowski@intel.com/mbox/",
    "series": [
        {
            "id": 7798,
            "url": "http://patches.dpdk.org/api/series/7798/?format=api",
            "web_url": "http://patches.dpdk.org/project/dpdk/list/?series=7798",
            "date": "2019-12-11T16:10:14",
            "name": "Refactor crypto unit tests.",
            "version": 1,
            "mbox": "http://patches.dpdk.org/series/7798/mbox/"
        }
    ],
    "comments": "http://patches.dpdk.org/api/patches/63788/comments/",
    "check": "fail",
    "checks": "http://patches.dpdk.org/api/patches/63788/checks/",
    "tags": {},
    "related": [],
    "headers": {
        "Return-Path": "<dev-bounces@dpdk.org>",
        "X-Original-To": "patchwork@inbox.dpdk.org",
        "Delivered-To": "patchwork@inbox.dpdk.org",
        "Received": [
            "from dpdk.org (dpdk.org [92.243.14.124])\n\tby inbox.dpdk.org (Postfix) with ESMTP id 7E529A04F5;\n\tThu, 12 Dec 2019 10:56:13 +0100 (CET)",
            "from [92.243.14.124] (localhost [127.0.0.1])\n\tby dpdk.org (Postfix) with ESMTP id AEF161BF7E;\n\tThu, 12 Dec 2019 10:55:43 +0100 (CET)",
            "from mga04.intel.com (mga04.intel.com [192.55.52.120])\n by dpdk.org (Postfix) with ESMTP id 657541BE3D\n for <dev@dpdk.org>; Wed, 11 Dec 2019 17:11:28 +0100 (CET)",
            "from fmsmga002.fm.intel.com ([10.253.24.26])\n by fmsmga104.fm.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384;\n 11 Dec 2019 08:11:27 -0800",
            "from adamdybx-mobl.ger.corp.intel.com (HELO localhost.localdomain)\n ([10.104.14.181])\n by fmsmga002.fm.intel.com with ESMTP; 11 Dec 2019 08:11:21 -0800"
        ],
        "X-Amp-Result": "SKIPPED(no attachment in message)",
        "X-Amp-File-Uploaded": "False",
        "X-ExtLoop1": "1",
        "X-IronPort-AV": "E=Sophos;i=\"5.69,301,1571727600\"; d=\"scan'208\";a=\"245336946\"",
        "From": "Adam Dybkowski <adamx.dybkowski@intel.com>",
        "To": "dev@dpdk.org, fiona.trahe@intel.com, akhil.goyal@nxp.com,\n arkadiuszx.kusztal@intel.com",
        "Cc": "Adam Dybkowski <adamx.dybkowski@intel.com>",
        "Date": "Wed, 11 Dec 2019 17:10:15 +0100",
        "Message-Id": "<20191211161015.9845-2-adamx.dybkowski@intel.com>",
        "X-Mailer": "git-send-email 2.17.1",
        "In-Reply-To": "<20191211161015.9845-1-adamx.dybkowski@intel.com>",
        "References": "<20191211161015.9845-1-adamx.dybkowski@intel.com>",
        "X-Mailman-Approved-At": "Thu, 12 Dec 2019 10:55:34 +0100",
        "Subject": "[dpdk-dev] [PATCH 1/1] test/crypto: refactor unit tests into one\n\tcombined array",
        "X-BeenThere": "dev@dpdk.org",
        "X-Mailman-Version": "2.1.15",
        "Precedence": "list",
        "List-Id": "DPDK patches and discussions <dev.dpdk.org>",
        "List-Unsubscribe": "<https://mails.dpdk.org/options/dev>,\n <mailto:dev-request@dpdk.org?subject=unsubscribe>",
        "List-Archive": "<http://mails.dpdk.org/archives/dev/>",
        "List-Post": "<mailto:dev@dpdk.org>",
        "List-Help": "<mailto:dev-request@dpdk.org?subject=help>",
        "List-Subscribe": "<https://mails.dpdk.org/listinfo/dev>,\n <mailto:dev-request@dpdk.org?subject=subscribe>",
        "Errors-To": "dev-bounces@dpdk.org",
        "Sender": "\"dev\" <dev-bounces@dpdk.org>"
    },
    "content": "This patch refactors most of unit tests to be contained in one\ncombined array, and run depending on the PMD capabilities instead of\nproviding multiple array with tests for individual PMDs.\nOnly a subset of unit tests was merged into one array - it combines\nall tests originally meant to be run on these PMDs:\nnull, aesni_mb, aesni_gcm, openssl, qat, sw_snow3g, sw_kasumi, sw_zuc.\n\nSigned-off-by: Adam Dybkowski <adamx.dybkowski@intel.com>\n---\n app/test/test_cryptodev.c                  | 16113 +++++++++----------\n app/test/test_cryptodev_blockcipher.c      |     2 +-\n app/test/test_cryptodev_des_test_vectors.h |     6 +-\n 3 files changed, 7430 insertions(+), 8691 deletions(-)",
    "diff": "diff --git a/app/test/test_cryptodev.c b/app/test/test_cryptodev.c\nindex 9c2b99200..9fe0d9995 100644\n--- a/app/test/test_cryptodev.c\n+++ b/app/test/test_cryptodev.c\n@@ -669,6 +669,13 @@ test_device_configure_invalid_queue_pair_ids(void)\n \tstruct crypto_testsuite_params *ts_params = &testsuite_params;\n \tuint16_t orig_nb_qps = ts_params->conf.nb_queue_pairs;\n \n+\t/* This test is for QAT and NITROX PMDs only */\n+\tif (gbl_driver_id != rte_cryptodev_driver_id_get(\n+\t\t\tRTE_STR(CRYPTODEV_NAME_QAT_SYM_PMD)) &&\n+\t    gbl_driver_id != rte_cryptodev_driver_id_get(\n+\t\t\tRTE_STR(CRYPTODEV_NAME_NITROX_PMD)))\n+\t\treturn -ENOTSUP;\n+\n \t/* Stop the device in case it's started so it can be configured */\n \trte_cryptodev_stop(ts_params->valid_devs[0]);\n \n@@ -740,6 +747,11 @@ test_queue_pair_descriptor_setup(void)\n \n \tuint16_t qp_id;\n \n+\t/* This test is for QAT PMD only */\n+\tif (gbl_driver_id != rte_cryptodev_driver_id_get(\n+\t\t\tRTE_STR(CRYPTODEV_NAME_QAT_SYM_PMD)))\n+\t\treturn -ENOTSUP;\n+\n \t/* Stop the device in case it's started so it can be configured */\n \trte_cryptodev_stop(ts_params->valid_devs[0]);\n \n@@ -1348,6 +1360,19 @@ test_AES_CBC_HMAC_SHA1_encrypt_digest(void)\n \tstruct crypto_testsuite_params *ts_params = &testsuite_params;\n \tstruct crypto_unittest_params *ut_params = &unittest_params;\n \n+\t/* Verify the capabilities */\n+\tstruct rte_cryptodev_sym_capability_idx cap_idx;\n+\tcap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;\n+\tcap_idx.algo.auth = RTE_CRYPTO_AUTH_SHA1_HMAC;\n+\tif (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],\n+\t\t\t&cap_idx) == NULL)\n+\t\treturn -ENOTSUP;\n+\tcap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;\n+\tcap_idx.algo.cipher = RTE_CRYPTO_CIPHER_AES_CBC;\n+\tif (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],\n+\t\t\t&cap_idx) == NULL)\n+\t\treturn -ENOTSUP;\n+\n \t/* Generate test mbuf data and space for digest */\n \tut_params->ibuf = setup_test_string(ts_params->mbuf_pool,\n \t\t\tcatch_22_quote,\tQUOTE_512_BYTES, 0);\n@@ -1591,7 +1616,7 @@ test_AES_CBC_HMAC_SHA512_decrypt_perform(struct rte_cryptodev_sym_session *sess,\n }\n \n static int\n-test_AES_cipheronly_mb_all(void)\n+test_blockcipher(enum blockcipher_test_type test_type)\n {\n \tstruct crypto_testsuite_params *ts_params = &testsuite_params;\n \tint status;\n@@ -1600,9 +1625,11 @@ test_AES_cipheronly_mb_all(void)\n \t\tts_params->op_mpool,\n \t\tts_params->session_mpool, ts_params->session_priv_mpool,\n \t\tts_params->valid_devs[0],\n-\t\trte_cryptodev_driver_id_get(\n-\t\tRTE_STR(CRYPTODEV_NAME_AESNI_MB_PMD)),\n-\t\tBLKCIPHER_AES_CIPHERONLY_TYPE);\n+\t\tgbl_driver_id,\n+\t\ttest_type);\n+\n+\tif (status == -ENOTSUP)\n+\t\treturn status;\n \n \tTEST_ASSERT_EQUAL(status, 0, \"Test failed\");\n \n@@ -1610,1572 +1637,1650 @@ test_AES_cipheronly_mb_all(void)\n }\n \n static int\n-test_AES_docsis_mb_all(void)\n+test_AES_cipheronly_all(void)\n {\n-\tstruct crypto_testsuite_params *ts_params = &testsuite_params;\n-\tint status;\n-\n-\tstatus = test_blockcipher_all_tests(ts_params->mbuf_pool,\n-\t\tts_params->op_mpool,\n-\t\tts_params->session_mpool, ts_params->session_priv_mpool,\n-\t\tts_params->valid_devs[0],\n-\t\trte_cryptodev_driver_id_get(\n-\t\tRTE_STR(CRYPTODEV_NAME_AESNI_MB_PMD)),\n-\t\tBLKCIPHER_AES_DOCSIS_TYPE);\n-\n-\tTEST_ASSERT_EQUAL(status, 0, \"Test failed\");\n-\n-\treturn TEST_SUCCESS;\n+\treturn test_blockcipher(BLKCIPHER_AES_CIPHERONLY_TYPE);\n }\n \n static int\n-test_AES_docsis_qat_all(void)\n+test_AES_docsis_all(void)\n {\n-\tstruct crypto_testsuite_params *ts_params = &testsuite_params;\n-\tint status;\n-\n-\tstatus = test_blockcipher_all_tests(ts_params->mbuf_pool,\n-\t\tts_params->op_mpool,\n-\t\tts_params->session_mpool, ts_params->session_priv_mpool,\n-\t\tts_params->valid_devs[0],\n-\t\trte_cryptodev_driver_id_get(\n-\t\tRTE_STR(CRYPTODEV_NAME_QAT_SYM_PMD)),\n-\t\tBLKCIPHER_AES_DOCSIS_TYPE);\n-\n-\tTEST_ASSERT_EQUAL(status, 0, \"Test failed\");\n-\n-\treturn TEST_SUCCESS;\n+\treturn test_blockcipher(BLKCIPHER_AES_DOCSIS_TYPE);\n }\n \n static int\n-test_DES_docsis_qat_all(void)\n+test_DES_docsis_all(void)\n {\n-\tstruct crypto_testsuite_params *ts_params = &testsuite_params;\n-\tint status;\n-\n-\tstatus = test_blockcipher_all_tests(ts_params->mbuf_pool,\n-\t\tts_params->op_mpool,\n-\t\tts_params->session_mpool, ts_params->session_priv_mpool,\n-\t\tts_params->valid_devs[0],\n-\t\trte_cryptodev_driver_id_get(\n-\t\tRTE_STR(CRYPTODEV_NAME_QAT_SYM_PMD)),\n-\t\tBLKCIPHER_DES_DOCSIS_TYPE);\n-\n-\tTEST_ASSERT_EQUAL(status, 0, \"Test failed\");\n-\n-\treturn TEST_SUCCESS;\n+\treturn test_blockcipher(BLKCIPHER_DES_DOCSIS_TYPE);\n }\n \n static int\n-test_authonly_mb_all(void)\n+test_DES_cipheronly_all(void)\n {\n-\tstruct crypto_testsuite_params *ts_params = &testsuite_params;\n-\tint status;\n-\n-\tstatus = test_blockcipher_all_tests(ts_params->mbuf_pool,\n-\t\tts_params->op_mpool,\n-\t\tts_params->session_mpool, ts_params->session_priv_mpool,\n-\t\tts_params->valid_devs[0],\n-\t\trte_cryptodev_driver_id_get(\n-\t\tRTE_STR(CRYPTODEV_NAME_AESNI_MB_PMD)),\n-\t\tBLKCIPHER_AUTHONLY_TYPE);\n-\n-\tTEST_ASSERT_EQUAL(status, 0, \"Test failed\");\n-\n-\treturn TEST_SUCCESS;\n+\treturn test_blockcipher(BLKCIPHER_DES_CIPHERONLY_TYPE);\n }\n \n static int\n-test_authonly_qat_all(void)\n+test_authonly_all(void)\n {\n-\tstruct crypto_testsuite_params *ts_params = &testsuite_params;\n-\tint status;\n-\n-\tstatus = test_blockcipher_all_tests(ts_params->mbuf_pool,\n-\t\tts_params->op_mpool,\n-\t\tts_params->session_mpool, ts_params->session_priv_mpool,\n-\t\tts_params->valid_devs[0],\n-\t\trte_cryptodev_driver_id_get(\n-\t\tRTE_STR(CRYPTODEV_NAME_QAT_SYM_PMD)),\n-\t\tBLKCIPHER_AUTHONLY_TYPE);\n+\treturn test_blockcipher(BLKCIPHER_AUTHONLY_TYPE);\n \n-\tTEST_ASSERT_EQUAL(status, 0, \"Test failed\");\n-\n-\treturn TEST_SUCCESS;\n }\n \n static int\n-test_AES_chain_null_all(void)\n+test_AES_chain_all(void)\n {\n-\tstruct crypto_testsuite_params *ts_params = &testsuite_params;\n-\tint status;\n-\n-\tstatus = test_blockcipher_all_tests(ts_params->mbuf_pool,\n-\t\tts_params->op_mpool,\n-\t\tts_params->session_mpool, ts_params->session_priv_mpool,\n-\t\tts_params->valid_devs[0],\n-\t\trte_cryptodev_driver_id_get(\n-\t\tRTE_STR(CRYPTODEV_NAME_NULL_PMD)),\n-\t\tBLKCIPHER_AES_CHAIN_TYPE);\n-\n-\tTEST_ASSERT_EQUAL(status, 0, \"Test failed\");\n-\n-\treturn TEST_SUCCESS;\n+\treturn test_blockcipher(BLKCIPHER_AES_CHAIN_TYPE);\n }\n \n static int\n-test_AES_cipheronly_null_all(void)\n+test_3DES_chain_all(void)\n {\n-\tstruct crypto_testsuite_params *ts_params = &testsuite_params;\n-\tint status;\n-\n-\tstatus = test_blockcipher_all_tests(ts_params->mbuf_pool,\n-\t\tts_params->op_mpool,\n-\t\tts_params->session_mpool, ts_params->session_priv_mpool,\n-\t\tts_params->valid_devs[0],\n-\t\trte_cryptodev_driver_id_get(\n-\t\tRTE_STR(CRYPTODEV_NAME_NULL_PMD)),\n-\t\tBLKCIPHER_AES_CIPHERONLY_TYPE);\n-\n-\tTEST_ASSERT_EQUAL(status, 0, \"Test failed\");\n-\n-\treturn TEST_SUCCESS;\n+\treturn test_blockcipher(BLKCIPHER_3DES_CHAIN_TYPE);\n }\n \n static int\n-test_authonly_null_all(void)\n+test_3DES_cipheronly_all(void)\n {\n-\tstruct crypto_testsuite_params *ts_params = &testsuite_params;\n-\tint status;\n-\n-\tstatus = test_blockcipher_all_tests(ts_params->mbuf_pool,\n-\t\tts_params->op_mpool,\n-\t\tts_params->session_mpool, ts_params->session_priv_mpool,\n-\t\tts_params->valid_devs[0],\n-\t\trte_cryptodev_driver_id_get(\n-\t\tRTE_STR(CRYPTODEV_NAME_NULL_PMD)),\n-\t\tBLKCIPHER_AUTHONLY_TYPE);\n-\n-\tTEST_ASSERT_EQUAL(status, 0, \"Test failed\");\n-\n-\treturn TEST_SUCCESS;\n+\treturn test_blockcipher(BLKCIPHER_3DES_CIPHERONLY_TYPE);\n }\n \n+/* ***** SNOW 3G Tests ***** */\n static int\n-test_AES_chain_mb_all(void)\n+create_wireless_algo_hash_session(uint8_t dev_id,\n+\tconst uint8_t *key, const uint8_t key_len,\n+\tconst uint8_t iv_len, const uint8_t auth_len,\n+\tenum rte_crypto_auth_operation op,\n+\tenum rte_crypto_auth_algorithm algo)\n {\n-\tstruct crypto_testsuite_params *ts_params = &testsuite_params;\n+\tuint8_t hash_key[key_len];\n \tint status;\n \n-\tstatus = test_blockcipher_all_tests(ts_params->mbuf_pool,\n-\t\tts_params->op_mpool,\n-\t\tts_params->session_mpool, ts_params->session_priv_mpool,\n-\t\tts_params->valid_devs[0],\n-\t\trte_cryptodev_driver_id_get(\n-\t\tRTE_STR(CRYPTODEV_NAME_AESNI_MB_PMD)),\n-\t\tBLKCIPHER_AES_CHAIN_TYPE);\n-\n-\tTEST_ASSERT_EQUAL(status, 0, \"Test failed\");\n-\n-\treturn TEST_SUCCESS;\n-}\n+\tstruct crypto_testsuite_params *ts_params = &testsuite_params;\n+\tstruct crypto_unittest_params *ut_params = &unittest_params;\n \n-#ifdef RTE_LIBRTE_PMD_CRYPTO_SCHEDULER\n+\tmemcpy(hash_key, key, key_len);\n \n-static int\n-test_AES_cipheronly_scheduler_all(void)\n-{\n-\tstruct crypto_testsuite_params *ts_params = &testsuite_params;\n-\tint status;\n+\tdebug_hexdump(stdout, \"key:\", key, key_len);\n \n-\tstatus = test_blockcipher_all_tests(ts_params->mbuf_pool,\n-\t\tts_params->op_mpool,\n-\t\tts_params->session_mpool, ts_params->session_priv_mpool,\n-\t\tts_params->valid_devs[0],\n-\t\trte_cryptodev_driver_id_get(\n-\t\tRTE_STR(CRYPTODEV_NAME_SCHEDULER_PMD)),\n-\t\tBLKCIPHER_AES_CIPHERONLY_TYPE);\n+\t/* Setup Authentication Parameters */\n+\tut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;\n+\tut_params->auth_xform.next = NULL;\n \n-\tTEST_ASSERT_EQUAL(status, 0, \"Test failed\");\n+\tut_params->auth_xform.auth.op = op;\n+\tut_params->auth_xform.auth.algo = algo;\n+\tut_params->auth_xform.auth.key.length = key_len;\n+\tut_params->auth_xform.auth.key.data = hash_key;\n+\tut_params->auth_xform.auth.digest_length = auth_len;\n+\tut_params->auth_xform.auth.iv.offset = IV_OFFSET;\n+\tut_params->auth_xform.auth.iv.length = iv_len;\n+\tut_params->sess = rte_cryptodev_sym_session_create(\n+\t\t\tts_params->session_mpool);\n \n-\treturn TEST_SUCCESS;\n+\tstatus = rte_cryptodev_sym_session_init(dev_id, ut_params->sess,\n+\t\t\t&ut_params->auth_xform,\n+\t\t\tts_params->session_priv_mpool);\n+\tTEST_ASSERT_EQUAL(status, 0, \"session init failed\");\n+\tTEST_ASSERT_NOT_NULL(ut_params->sess, \"Session creation failed\");\n+\treturn 0;\n }\n \n static int\n-test_AES_chain_scheduler_all(void)\n+create_wireless_algo_cipher_session(uint8_t dev_id,\n+\t\t\tenum rte_crypto_cipher_operation op,\n+\t\t\tenum rte_crypto_cipher_algorithm algo,\n+\t\t\tconst uint8_t *key, const uint8_t key_len,\n+\t\t\tuint8_t iv_len)\n {\n-\tstruct crypto_testsuite_params *ts_params = &testsuite_params;\n+\tuint8_t cipher_key[key_len];\n \tint status;\n+\tstruct crypto_testsuite_params *ts_params = &testsuite_params;\n+\tstruct crypto_unittest_params *ut_params = &unittest_params;\n \n-\tstatus = test_blockcipher_all_tests(ts_params->mbuf_pool,\n-\t\tts_params->op_mpool,\n-\t\tts_params->session_mpool, ts_params->session_priv_mpool,\n-\t\tts_params->valid_devs[0],\n-\t\trte_cryptodev_driver_id_get(\n-\t\tRTE_STR(CRYPTODEV_NAME_SCHEDULER_PMD)),\n-\t\tBLKCIPHER_AES_CHAIN_TYPE);\n-\n-\tTEST_ASSERT_EQUAL(status, 0, \"Test failed\");\n+\tmemcpy(cipher_key, key, key_len);\n \n-\treturn TEST_SUCCESS;\n-}\n+\t/* Setup Cipher Parameters */\n+\tut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER;\n+\tut_params->cipher_xform.next = NULL;\n \n-static int\n-test_authonly_scheduler_all(void)\n-{\n-\tstruct crypto_testsuite_params *ts_params = &testsuite_params;\n-\tint status;\n+\tut_params->cipher_xform.cipher.algo = algo;\n+\tut_params->cipher_xform.cipher.op = op;\n+\tut_params->cipher_xform.cipher.key.data = cipher_key;\n+\tut_params->cipher_xform.cipher.key.length = key_len;\n+\tut_params->cipher_xform.cipher.iv.offset = IV_OFFSET;\n+\tut_params->cipher_xform.cipher.iv.length = iv_len;\n \n-\tstatus = test_blockcipher_all_tests(ts_params->mbuf_pool,\n-\t\tts_params->op_mpool,\n-\t\tts_params->session_mpool, ts_params->session_priv_mpool,\n-\t\tts_params->valid_devs[0],\n-\t\trte_cryptodev_driver_id_get(\n-\t\tRTE_STR(CRYPTODEV_NAME_SCHEDULER_PMD)),\n-\t\tBLKCIPHER_AUTHONLY_TYPE);\n+\tdebug_hexdump(stdout, \"key:\", key, key_len);\n \n-\tTEST_ASSERT_EQUAL(status, 0, \"Test failed\");\n+\t/* Create Crypto session */\n+\tut_params->sess = rte_cryptodev_sym_session_create(\n+\t\t\tts_params->session_mpool);\n \n-\treturn TEST_SUCCESS;\n+\tstatus = rte_cryptodev_sym_session_init(dev_id, ut_params->sess,\n+\t\t\t&ut_params->cipher_xform,\n+\t\t\tts_params->session_priv_mpool);\n+\tTEST_ASSERT_EQUAL(status, 0, \"session init failed\");\n+\tTEST_ASSERT_NOT_NULL(ut_params->sess, \"Session creation failed\");\n+\treturn 0;\n }\n \n-#endif /* RTE_LIBRTE_PMD_CRYPTO_SCHEDULER */\n-\n static int\n-test_AES_chain_openssl_all(void)\n+create_wireless_algo_cipher_operation(const uint8_t *iv, uint8_t iv_len,\n+\t\t\tunsigned int cipher_len,\n+\t\t\tunsigned int cipher_offset)\n {\n \tstruct crypto_testsuite_params *ts_params = &testsuite_params;\n-\tint status;\n-\n-\tstatus = test_blockcipher_all_tests(ts_params->mbuf_pool,\n-\t\tts_params->op_mpool,\n-\t\tts_params->session_mpool, ts_params->session_priv_mpool,\n-\t\tts_params->valid_devs[0],\n-\t\trte_cryptodev_driver_id_get(\n-\t\tRTE_STR(CRYPTODEV_NAME_OPENSSL_PMD)),\n-\t\tBLKCIPHER_AES_CHAIN_TYPE);\n-\n-\tTEST_ASSERT_EQUAL(status, 0, \"Test failed\");\n+\tstruct crypto_unittest_params *ut_params = &unittest_params;\n \n-\treturn TEST_SUCCESS;\n-}\n+\t/* Generate Crypto op data structure */\n+\tut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,\n+\t\t\t\tRTE_CRYPTO_OP_TYPE_SYMMETRIC);\n+\tTEST_ASSERT_NOT_NULL(ut_params->op,\n+\t\t\t\t\"Failed to allocate pktmbuf offload\");\n \n-static int\n-test_AES_cipheronly_openssl_all(void)\n-{\n-\tstruct crypto_testsuite_params *ts_params = &testsuite_params;\n-\tint status;\n+\t/* Set crypto operation data parameters */\n+\trte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);\n \n-\tstatus = test_blockcipher_all_tests(ts_params->mbuf_pool,\n-\t\tts_params->op_mpool,\n-\t\tts_params->session_mpool, ts_params->session_priv_mpool,\n-\t\tts_params->valid_devs[0],\n-\t\trte_cryptodev_driver_id_get(\n-\t\tRTE_STR(CRYPTODEV_NAME_OPENSSL_PMD)),\n-\t\tBLKCIPHER_AES_CIPHERONLY_TYPE);\n+\tstruct rte_crypto_sym_op *sym_op = ut_params->op->sym;\n \n-\tTEST_ASSERT_EQUAL(status, 0, \"Test failed\");\n+\t/* set crypto operation source mbuf */\n+\tsym_op->m_src = ut_params->ibuf;\n \n-\treturn TEST_SUCCESS;\n+\t/* iv */\n+\trte_memcpy(rte_crypto_op_ctod_offset(ut_params->op, uint8_t *,\n+\t\t\tIV_OFFSET), iv, iv_len);\n+\tsym_op->cipher.data.length = cipher_len;\n+\tsym_op->cipher.data.offset = cipher_offset;\n+\treturn 0;\n }\n \n static int\n-test_AES_chain_ccp_all(void)\n+create_wireless_algo_cipher_operation_oop(const uint8_t *iv, uint8_t iv_len,\n+\t\t\tunsigned int cipher_len,\n+\t\t\tunsigned int cipher_offset)\n {\n \tstruct crypto_testsuite_params *ts_params = &testsuite_params;\n-\tint status;\n+\tstruct crypto_unittest_params *ut_params = &unittest_params;\n \n-\tstatus = test_blockcipher_all_tests(ts_params->mbuf_pool,\n-\t\tts_params->op_mpool,\n-\t\tts_params->session_mpool, ts_params->session_priv_mpool,\n-\t\tts_params->valid_devs[0],\n-\t\trte_cryptodev_driver_id_get(\n-\t\tRTE_STR(CRYPTODEV_NAME_CCP_PMD)),\n-\t\tBLKCIPHER_AES_CHAIN_TYPE);\n+\t/* Generate Crypto op data structure */\n+\tut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,\n+\t\t\t\tRTE_CRYPTO_OP_TYPE_SYMMETRIC);\n+\tTEST_ASSERT_NOT_NULL(ut_params->op,\n+\t\t\t\t\"Failed to allocate pktmbuf offload\");\n \n-\tTEST_ASSERT_EQUAL(status, 0, \"Test failed\");\n+\t/* Set crypto operation data parameters */\n+\trte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);\n \n-\treturn TEST_SUCCESS;\n+\tstruct rte_crypto_sym_op *sym_op = ut_params->op->sym;\n+\n+\t/* set crypto operation source mbuf */\n+\tsym_op->m_src = ut_params->ibuf;\n+\tsym_op->m_dst = ut_params->obuf;\n+\n+\t/* iv */\n+\trte_memcpy(rte_crypto_op_ctod_offset(ut_params->op, uint8_t *,\n+\t\t\tIV_OFFSET), iv, iv_len);\n+\tsym_op->cipher.data.length = cipher_len;\n+\tsym_op->cipher.data.offset = cipher_offset;\n+\treturn 0;\n }\n \n static int\n-test_AES_cipheronly_ccp_all(void)\n+create_wireless_algo_cipher_auth_session(uint8_t dev_id,\n+\t\tenum rte_crypto_cipher_operation cipher_op,\n+\t\tenum rte_crypto_auth_operation auth_op,\n+\t\tenum rte_crypto_auth_algorithm auth_algo,\n+\t\tenum rte_crypto_cipher_algorithm cipher_algo,\n+\t\tconst uint8_t *key, uint8_t key_len,\n+\t\tuint8_t auth_iv_len, uint8_t auth_len,\n+\t\tuint8_t cipher_iv_len)\n+\n {\n-\tstruct crypto_testsuite_params *ts_params = &testsuite_params;\n+\tuint8_t cipher_auth_key[key_len];\n \tint status;\n \n-\tstatus = test_blockcipher_all_tests(ts_params->mbuf_pool,\n-\t\tts_params->op_mpool,\n-\t\tts_params->session_mpool, ts_params->session_priv_mpool,\n-\t\tts_params->valid_devs[0],\n-\t\trte_cryptodev_driver_id_get(\n-\t\tRTE_STR(CRYPTODEV_NAME_CCP_PMD)),\n-\t\tBLKCIPHER_AES_CIPHERONLY_TYPE);\n+\tstruct crypto_testsuite_params *ts_params = &testsuite_params;\n+\tstruct crypto_unittest_params *ut_params = &unittest_params;\n \n-\tTEST_ASSERT_EQUAL(status, 0, \"Test failed\");\n+\tmemcpy(cipher_auth_key, key, key_len);\n \n-\treturn TEST_SUCCESS;\n-}\n+\t/* Setup Authentication Parameters */\n+\tut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;\n+\tut_params->auth_xform.next = NULL;\n \n-static int\n-test_AES_chain_qat_all(void)\n-{\n-\tstruct crypto_testsuite_params *ts_params = &testsuite_params;\n-\tint status;\n+\tut_params->auth_xform.auth.op = auth_op;\n+\tut_params->auth_xform.auth.algo = auth_algo;\n+\tut_params->auth_xform.auth.key.length = key_len;\n+\t/* Hash key = cipher key */\n+\tut_params->auth_xform.auth.key.data = cipher_auth_key;\n+\tut_params->auth_xform.auth.digest_length = auth_len;\n+\t/* Auth IV will be after cipher IV */\n+\tut_params->auth_xform.auth.iv.offset = IV_OFFSET + cipher_iv_len;\n+\tut_params->auth_xform.auth.iv.length = auth_iv_len;\n \n-\tstatus = test_blockcipher_all_tests(ts_params->mbuf_pool,\n-\t\tts_params->op_mpool,\n-\t\tts_params->session_mpool, ts_params->session_priv_mpool,\n-\t\tts_params->valid_devs[0],\n-\t\trte_cryptodev_driver_id_get(\n-\t\tRTE_STR(CRYPTODEV_NAME_QAT_SYM_PMD)),\n-\t\tBLKCIPHER_AES_CHAIN_TYPE);\n+\t/* Setup Cipher Parameters */\n+\tut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER;\n+\tut_params->cipher_xform.next = &ut_params->auth_xform;\n \n-\tTEST_ASSERT_EQUAL(status, 0, \"Test failed\");\n+\tut_params->cipher_xform.cipher.algo = cipher_algo;\n+\tut_params->cipher_xform.cipher.op = cipher_op;\n+\tut_params->cipher_xform.cipher.key.data = cipher_auth_key;\n+\tut_params->cipher_xform.cipher.key.length = key_len;\n+\tut_params->cipher_xform.cipher.iv.offset = IV_OFFSET;\n+\tut_params->cipher_xform.cipher.iv.length = cipher_iv_len;\n \n-\treturn TEST_SUCCESS;\n+\tdebug_hexdump(stdout, \"key:\", key, key_len);\n+\n+\t/* Create Crypto session*/\n+\tut_params->sess = rte_cryptodev_sym_session_create(\n+\t\t\tts_params->session_mpool);\n+\tTEST_ASSERT_NOT_NULL(ut_params->sess, \"Session creation failed\");\n+\n+\tstatus = rte_cryptodev_sym_session_init(dev_id, ut_params->sess,\n+\t\t\t&ut_params->cipher_xform,\n+\t\t\tts_params->session_priv_mpool);\n+\tif (status == -ENOTSUP)\n+\t\treturn status;\n+\n+\tTEST_ASSERT_EQUAL(status, 0, \"session init failed\");\n+\treturn 0;\n }\n \n static int\n-test_AES_cipheronly_qat_all(void)\n+create_wireless_cipher_auth_session(uint8_t dev_id,\n+\t\tenum rte_crypto_cipher_operation cipher_op,\n+\t\tenum rte_crypto_auth_operation auth_op,\n+\t\tenum rte_crypto_auth_algorithm auth_algo,\n+\t\tenum rte_crypto_cipher_algorithm cipher_algo,\n+\t\tconst struct wireless_test_data *tdata)\n {\n-\tstruct crypto_testsuite_params *ts_params = &testsuite_params;\n+\tconst uint8_t key_len = tdata->key.len;\n+\tuint8_t cipher_auth_key[key_len];\n \tint status;\n \n-\tstatus = test_blockcipher_all_tests(ts_params->mbuf_pool,\n-\t\tts_params->op_mpool,\n-\t\tts_params->session_mpool, ts_params->session_priv_mpool,\n-\t\tts_params->valid_devs[0],\n-\t\trte_cryptodev_driver_id_get(\n-\t\tRTE_STR(CRYPTODEV_NAME_QAT_SYM_PMD)),\n-\t\tBLKCIPHER_AES_CIPHERONLY_TYPE);\n+\tstruct crypto_testsuite_params *ts_params = &testsuite_params;\n+\tstruct crypto_unittest_params *ut_params = &unittest_params;\n+\tconst uint8_t *key = tdata->key.data;\n+\tconst uint8_t auth_len = tdata->digest.len;\n+\tuint8_t cipher_iv_len = tdata->cipher_iv.len;\n+\tuint8_t auth_iv_len = tdata->auth_iv.len;\n \n-\tTEST_ASSERT_EQUAL(status, 0, \"Test failed\");\n+\tmemcpy(cipher_auth_key, key, key_len);\n \n-\treturn TEST_SUCCESS;\n-}\n+\t/* Setup Authentication Parameters */\n+\tut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;\n+\tut_params->auth_xform.next = NULL;\n \n-static int\n-test_AES_cipheronly_virtio_all(void)\n-{\n-\tstruct crypto_testsuite_params *ts_params = &testsuite_params;\n-\tint status;\n+\tut_params->auth_xform.auth.op = auth_op;\n+\tut_params->auth_xform.auth.algo = auth_algo;\n+\tut_params->auth_xform.auth.key.length = key_len;\n+\t/* Hash key = cipher key */\n+\tut_params->auth_xform.auth.key.data = cipher_auth_key;\n+\tut_params->auth_xform.auth.digest_length = auth_len;\n+\t/* Auth IV will be after cipher IV */\n+\tut_params->auth_xform.auth.iv.offset = IV_OFFSET + cipher_iv_len;\n+\tut_params->auth_xform.auth.iv.length = auth_iv_len;\n \n-\tstatus = test_blockcipher_all_tests(ts_params->mbuf_pool,\n-\t\tts_params->op_mpool,\n-\t\tts_params->session_mpool, ts_params->session_priv_mpool,\n-\t\tts_params->valid_devs[0],\n-\t\trte_cryptodev_driver_id_get(\n-\t\tRTE_STR(CRYPTODEV_NAME_VIRTIO_PMD)),\n-\t\tBLKCIPHER_AES_CIPHERONLY_TYPE);\n+\t/* Setup Cipher Parameters */\n+\tut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER;\n+\tut_params->cipher_xform.next = &ut_params->auth_xform;\n \n-\tTEST_ASSERT_EQUAL(status, 0, \"Test failed\");\n+\tut_params->cipher_xform.cipher.algo = cipher_algo;\n+\tut_params->cipher_xform.cipher.op = cipher_op;\n+\tut_params->cipher_xform.cipher.key.data = cipher_auth_key;\n+\tut_params->cipher_xform.cipher.key.length = key_len;\n+\tut_params->cipher_xform.cipher.iv.offset = IV_OFFSET;\n+\tut_params->cipher_xform.cipher.iv.length = cipher_iv_len;\n \n-\treturn TEST_SUCCESS;\n-}\n \n-static int\n-test_AES_chain_caam_jr_all(void)\n-{\n-\tstruct crypto_testsuite_params *ts_params = &testsuite_params;\n-\tint status;\n+\tdebug_hexdump(stdout, \"key:\", key, key_len);\n \n-\tstatus = test_blockcipher_all_tests(ts_params->mbuf_pool,\n-\t\tts_params->op_mpool,\n-\t\tts_params->session_mpool, ts_params->session_priv_mpool,\n-\t\tts_params->valid_devs[0],\n-\t\trte_cryptodev_driver_id_get(\n-\t\tRTE_STR(CRYPTODEV_NAME_CAAM_JR_PMD)),\n-\t\tBLKCIPHER_AES_CHAIN_TYPE);\n+\t/* Create Crypto session*/\n+\tut_params->sess = rte_cryptodev_sym_session_create(\n+\t\t\tts_params->session_mpool);\n \n-\tTEST_ASSERT_EQUAL(status, 0, \"Test failed\");\n+\tstatus = rte_cryptodev_sym_session_init(dev_id, ut_params->sess,\n+\t\t\t&ut_params->cipher_xform,\n+\t\t\tts_params->session_priv_mpool);\n \n-\treturn TEST_SUCCESS;\n+\tTEST_ASSERT_EQUAL(status, 0, \"session init failed\");\n+\tTEST_ASSERT_NOT_NULL(ut_params->sess, \"Session creation failed\");\n+\treturn 0;\n }\n \n static int\n-test_AES_cipheronly_caam_jr_all(void)\n+create_zuc_cipher_auth_encrypt_generate_session(uint8_t dev_id,\n+\t\tconst struct wireless_test_data *tdata)\n {\n-\tstruct crypto_testsuite_params *ts_params = &testsuite_params;\n-\tint status;\n-\n-\tstatus = test_blockcipher_all_tests(ts_params->mbuf_pool,\n-\t\tts_params->op_mpool,\n-\t\tts_params->session_mpool, ts_params->session_priv_mpool,\n-\t\tts_params->valid_devs[0],\n-\t\trte_cryptodev_driver_id_get(\n-\t\tRTE_STR(CRYPTODEV_NAME_CAAM_JR_PMD)),\n-\t\tBLKCIPHER_AES_CIPHERONLY_TYPE);\n-\n-\tTEST_ASSERT_EQUAL(status, 0, \"Test failed\");\n-\n-\treturn TEST_SUCCESS;\n+\treturn create_wireless_cipher_auth_session(dev_id,\n+\t\tRTE_CRYPTO_CIPHER_OP_ENCRYPT,\n+\t\tRTE_CRYPTO_AUTH_OP_GENERATE, RTE_CRYPTO_AUTH_ZUC_EIA3,\n+\t\tRTE_CRYPTO_CIPHER_ZUC_EEA3, tdata);\n }\n \n static int\n-test_authonly_caam_jr_all(void)\n+create_wireless_algo_auth_cipher_session(uint8_t dev_id,\n+\t\tenum rte_crypto_cipher_operation cipher_op,\n+\t\tenum rte_crypto_auth_operation auth_op,\n+\t\tenum rte_crypto_auth_algorithm auth_algo,\n+\t\tenum rte_crypto_cipher_algorithm cipher_algo,\n+\t\tconst uint8_t *key, const uint8_t key_len,\n+\t\tuint8_t auth_iv_len, uint8_t auth_len,\n+\t\tuint8_t cipher_iv_len)\n {\n-\tstruct crypto_testsuite_params *ts_params = &testsuite_params;\n+\tuint8_t auth_cipher_key[key_len];\n \tint status;\n+\tstruct crypto_testsuite_params *ts_params = &testsuite_params;\n+\tstruct crypto_unittest_params *ut_params = &unittest_params;\n \n-\tstatus = test_blockcipher_all_tests(ts_params->mbuf_pool,\n-\t\tts_params->op_mpool,\n-\t\tts_params->session_mpool, ts_params->session_priv_mpool,\n-\t\tts_params->valid_devs[0],\n-\t\trte_cryptodev_driver_id_get(\n-\t\tRTE_STR(CRYPTODEV_NAME_CAAM_JR_PMD)),\n-\t\tBLKCIPHER_AUTHONLY_TYPE);\n+\tmemcpy(auth_cipher_key, key, key_len);\n \n-\tTEST_ASSERT_EQUAL(status, 0, \"Test failed\");\n+\t/* Setup Authentication Parameters */\n+\tut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;\n+\tut_params->auth_xform.auth.op = auth_op;\n+\tut_params->auth_xform.next = &ut_params->cipher_xform;\n+\tut_params->auth_xform.auth.algo = auth_algo;\n+\tut_params->auth_xform.auth.key.length = key_len;\n+\tut_params->auth_xform.auth.key.data = auth_cipher_key;\n+\tut_params->auth_xform.auth.digest_length = auth_len;\n+\t/* Auth IV will be after cipher IV */\n+\tut_params->auth_xform.auth.iv.offset = IV_OFFSET + cipher_iv_len;\n+\tut_params->auth_xform.auth.iv.length = auth_iv_len;\n \n-\treturn TEST_SUCCESS;\n-}\n+\t/* Setup Cipher Parameters */\n+\tut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER;\n+\tut_params->cipher_xform.next = NULL;\n+\tut_params->cipher_xform.cipher.algo = cipher_algo;\n+\tut_params->cipher_xform.cipher.op = cipher_op;\n+\tut_params->cipher_xform.cipher.key.data = auth_cipher_key;\n+\tut_params->cipher_xform.cipher.key.length = key_len;\n+\tut_params->cipher_xform.cipher.iv.offset = IV_OFFSET;\n+\tut_params->cipher_xform.cipher.iv.length = cipher_iv_len;\n \n+\tdebug_hexdump(stdout, \"key:\", key, key_len);\n \n-static int\n-test_AES_chain_dpaa_sec_all(void)\n-{\n-\tstruct crypto_testsuite_params *ts_params = &testsuite_params;\n-\tint status;\n+\t/* Create Crypto session*/\n+\tut_params->sess = rte_cryptodev_sym_session_create(\n+\t\t\tts_params->session_mpool);\n+\tTEST_ASSERT_NOT_NULL(ut_params->sess, \"Session creation failed\");\n \n-\tstatus = test_blockcipher_all_tests(ts_params->mbuf_pool,\n-\t\tts_params->op_mpool,\n-\t\tts_params->session_mpool, ts_params->session_priv_mpool,\n-\t\tts_params->valid_devs[0],\n-\t\trte_cryptodev_driver_id_get(\n-\t\tRTE_STR(CRYPTODEV_NAME_DPAA_SEC_PMD)),\n-\t\tBLKCIPHER_AES_CHAIN_TYPE);\n+\tstatus = rte_cryptodev_sym_session_init(dev_id, ut_params->sess,\n+\t\t\t&ut_params->auth_xform,\n+\t\t\tts_params->session_priv_mpool);\n+\tif (status == -ENOTSUP)\n+\t\treturn status;\n \n-\tTEST_ASSERT_EQUAL(status, 0, \"Test failed\");\n+\tTEST_ASSERT_EQUAL(status, 0, \"session init failed\");\n \n-\treturn TEST_SUCCESS;\n+\treturn 0;\n }\n \n static int\n-test_AES_cipheronly_dpaa_sec_all(void)\n+create_wireless_algo_hash_operation(const uint8_t *auth_tag,\n+\t\tunsigned int auth_tag_len,\n+\t\tconst uint8_t *iv, unsigned int iv_len,\n+\t\tunsigned int data_pad_len,\n+\t\tenum rte_crypto_auth_operation op,\n+\t\tunsigned int auth_len, unsigned int auth_offset)\n {\n \tstruct crypto_testsuite_params *ts_params = &testsuite_params;\n-\tint status;\n \n-\tstatus = test_blockcipher_all_tests(ts_params->mbuf_pool,\n-\t\tts_params->op_mpool,\n-\t\tts_params->session_mpool, ts_params->session_priv_mpool,\n-\t\tts_params->valid_devs[0],\n-\t\trte_cryptodev_driver_id_get(\n-\t\tRTE_STR(CRYPTODEV_NAME_DPAA_SEC_PMD)),\n-\t\tBLKCIPHER_AES_CIPHERONLY_TYPE);\n+\tstruct crypto_unittest_params *ut_params = &unittest_params;\n \n-\tTEST_ASSERT_EQUAL(status, 0, \"Test failed\");\n+\t/* Generate Crypto op data structure */\n+\tut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,\n+\t\t\tRTE_CRYPTO_OP_TYPE_SYMMETRIC);\n+\tTEST_ASSERT_NOT_NULL(ut_params->op,\n+\t\t\"Failed to allocate pktmbuf offload\");\n \n-\treturn TEST_SUCCESS;\n-}\n+\t/* Set crypto operation data parameters */\n+\trte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);\n \n-static int\n-test_authonly_dpaa_sec_all(void)\n-{\n-\tstruct crypto_testsuite_params *ts_params = &testsuite_params;\n-\tint status;\n-\n-\tstatus = test_blockcipher_all_tests(ts_params->mbuf_pool,\n-\t\tts_params->op_mpool,\n-\t\tts_params->session_mpool, ts_params->session_priv_mpool,\n-\t\tts_params->valid_devs[0],\n-\t\trte_cryptodev_driver_id_get(\n-\t\tRTE_STR(CRYPTODEV_NAME_DPAA_SEC_PMD)),\n-\t\tBLKCIPHER_AUTHONLY_TYPE);\n+\tstruct rte_crypto_sym_op *sym_op = ut_params->op->sym;\n \n-\tTEST_ASSERT_EQUAL(status, 0, \"Test failed\");\n+\t/* set crypto operation source mbuf */\n+\tsym_op->m_src = ut_params->ibuf;\n \n-\treturn TEST_SUCCESS;\n-}\n+\t/* iv */\n+\trte_memcpy(rte_crypto_op_ctod_offset(ut_params->op, uint8_t *,\n+\t\t\tIV_OFFSET), iv, iv_len);\n+\t/* digest */\n+\tsym_op->auth.digest.data = (uint8_t *)rte_pktmbuf_append(\n+\t\t\t\t\tut_params->ibuf, auth_tag_len);\n \n-static int\n-test_AES_chain_dpaa2_sec_all(void)\n-{\n-\tstruct crypto_testsuite_params *ts_params = &testsuite_params;\n-\tint status;\n+\tTEST_ASSERT_NOT_NULL(sym_op->auth.digest.data,\n+\t\t\t\t\"no room to append auth tag\");\n+\tut_params->digest = sym_op->auth.digest.data;\n+\tsym_op->auth.digest.phys_addr = rte_pktmbuf_iova_offset(\n+\t\t\tut_params->ibuf, data_pad_len);\n+\tif (op == RTE_CRYPTO_AUTH_OP_GENERATE)\n+\t\tmemset(sym_op->auth.digest.data, 0, auth_tag_len);\n+\telse\n+\t\trte_memcpy(sym_op->auth.digest.data, auth_tag, auth_tag_len);\n \n-\tstatus = test_blockcipher_all_tests(ts_params->mbuf_pool,\n-\t\tts_params->op_mpool,\n-\t\tts_params->session_mpool, ts_params->session_priv_mpool,\n-\t\tts_params->valid_devs[0],\n-\t\trte_cryptodev_driver_id_get(\n-\t\tRTE_STR(CRYPTODEV_NAME_DPAA2_SEC_PMD)),\n-\t\tBLKCIPHER_AES_CHAIN_TYPE);\n+\tdebug_hexdump(stdout, \"digest:\",\n+\t\tsym_op->auth.digest.data,\n+\t\tauth_tag_len);\n \n-\tTEST_ASSERT_EQUAL(status, 0, \"Test failed\");\n+\tsym_op->auth.data.length = auth_len;\n+\tsym_op->auth.data.offset = auth_offset;\n \n-\treturn TEST_SUCCESS;\n+\treturn 0;\n }\n \n static int\n-test_AES_cipheronly_dpaa2_sec_all(void)\n+create_wireless_cipher_hash_operation(const struct wireless_test_data *tdata,\n+\tenum rte_crypto_auth_operation op)\n {\n \tstruct crypto_testsuite_params *ts_params = &testsuite_params;\n-\tint status;\n+\tstruct crypto_unittest_params *ut_params = &unittest_params;\n \n-\tstatus = test_blockcipher_all_tests(ts_params->mbuf_pool,\n-\t\tts_params->op_mpool,\n-\t\tts_params->session_mpool, ts_params->session_priv_mpool,\n-\t\tts_params->valid_devs[0],\n-\t\trte_cryptodev_driver_id_get(\n-\t\tRTE_STR(CRYPTODEV_NAME_DPAA2_SEC_PMD)),\n-\t\tBLKCIPHER_AES_CIPHERONLY_TYPE);\n+\tconst uint8_t *auth_tag = tdata->digest.data;\n+\tconst unsigned int auth_tag_len = tdata->digest.len;\n+\tunsigned int plaintext_len = ceil_byte_length(tdata->plaintext.len);\n+\tunsigned int data_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16);\n \n-\tTEST_ASSERT_EQUAL(status, 0, \"Test failed\");\n+\tconst uint8_t *cipher_iv = tdata->cipher_iv.data;\n+\tconst uint8_t cipher_iv_len = tdata->cipher_iv.len;\n+\tconst uint8_t *auth_iv = tdata->auth_iv.data;\n+\tconst uint8_t auth_iv_len = tdata->auth_iv.len;\n+\tconst unsigned int cipher_len = tdata->validCipherLenInBits.len;\n+\tconst unsigned int auth_len = tdata->validAuthLenInBits.len;\n \n-\treturn TEST_SUCCESS;\n-}\n+\t/* Generate Crypto op data structure */\n+\tut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,\n+\t\t\tRTE_CRYPTO_OP_TYPE_SYMMETRIC);\n+\tTEST_ASSERT_NOT_NULL(ut_params->op,\n+\t\t\t\"Failed to allocate pktmbuf offload\");\n+\t/* Set crypto operation data parameters */\n+\trte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);\n \n-static int\n-test_authonly_dpaa2_sec_all(void)\n-{\n-\tstruct crypto_testsuite_params *ts_params = &testsuite_params;\n-\tint status;\n+\tstruct rte_crypto_sym_op *sym_op = ut_params->op->sym;\n \n-\tstatus = test_blockcipher_all_tests(ts_params->mbuf_pool,\n-\t\tts_params->op_mpool,\n-\t\tts_params->session_mpool, ts_params->session_priv_mpool,\n-\t\tts_params->valid_devs[0],\n-\t\trte_cryptodev_driver_id_get(\n-\t\tRTE_STR(CRYPTODEV_NAME_DPAA2_SEC_PMD)),\n-\t\tBLKCIPHER_AUTHONLY_TYPE);\n+\t/* set crypto operation source mbuf */\n+\tsym_op->m_src = ut_params->ibuf;\n \n-\tTEST_ASSERT_EQUAL(status, 0, \"Test failed\");\n+\t/* digest */\n+\tsym_op->auth.digest.data = (uint8_t *)rte_pktmbuf_append(\n+\t\t\tut_params->ibuf, auth_tag_len);\n \n-\treturn TEST_SUCCESS;\n-}\n+\tTEST_ASSERT_NOT_NULL(sym_op->auth.digest.data,\n+\t\t\t\"no room to append auth tag\");\n+\tut_params->digest = sym_op->auth.digest.data;\n+\tsym_op->auth.digest.phys_addr = rte_pktmbuf_iova_offset(\n+\t\t\tut_params->ibuf, data_pad_len);\n+\tif (op == RTE_CRYPTO_AUTH_OP_GENERATE)\n+\t\tmemset(sym_op->auth.digest.data, 0, auth_tag_len);\n+\telse\n+\t\trte_memcpy(sym_op->auth.digest.data, auth_tag, auth_tag_len);\n \n-static int\n-test_authonly_openssl_all(void)\n-{\n-\tstruct crypto_testsuite_params *ts_params = &testsuite_params;\n-\tint status;\n+\tdebug_hexdump(stdout, \"digest:\",\n+\t\tsym_op->auth.digest.data,\n+\t\tauth_tag_len);\n \n-\tstatus = test_blockcipher_all_tests(ts_params->mbuf_pool,\n-\t\tts_params->op_mpool,\n-\t\tts_params->session_mpool, ts_params->session_priv_mpool,\n-\t\tts_params->valid_devs[0],\n-\t\trte_cryptodev_driver_id_get(\n-\t\tRTE_STR(CRYPTODEV_NAME_OPENSSL_PMD)),\n-\t\tBLKCIPHER_AUTHONLY_TYPE);\n+\t/* Copy cipher and auth IVs at the end of the crypto operation */\n+\tuint8_t *iv_ptr = rte_crypto_op_ctod_offset(ut_params->op, uint8_t *,\n+\t\t\t\t\t\tIV_OFFSET);\n+\trte_memcpy(iv_ptr, cipher_iv, cipher_iv_len);\n+\tiv_ptr += cipher_iv_len;\n+\trte_memcpy(iv_ptr, auth_iv, auth_iv_len);\n \n-\tTEST_ASSERT_EQUAL(status, 0, \"Test failed\");\n+\tsym_op->cipher.data.length = cipher_len;\n+\tsym_op->cipher.data.offset = 0;\n+\tsym_op->auth.data.length = auth_len;\n+\tsym_op->auth.data.offset = 0;\n \n-\treturn TEST_SUCCESS;\n+\treturn 0;\n }\n \n static int\n-test_authonly_ccp_all(void)\n+create_zuc_cipher_hash_generate_operation(\n+\t\tconst struct wireless_test_data *tdata)\n {\n-\tstruct crypto_testsuite_params *ts_params = &testsuite_params;\n-\tint status;\n-\n-\tstatus = test_blockcipher_all_tests(ts_params->mbuf_pool,\n-\t\tts_params->op_mpool,\n-\t\tts_params->session_mpool, ts_params->session_priv_mpool,\n-\t\tts_params->valid_devs[0],\n-\t\trte_cryptodev_driver_id_get(\n-\t\tRTE_STR(CRYPTODEV_NAME_CCP_PMD)),\n-\t\tBLKCIPHER_AUTHONLY_TYPE);\n-\n-\tTEST_ASSERT_EQUAL(status, 0, \"Test failed\");\n-\n-\treturn TEST_SUCCESS;\n+\treturn create_wireless_cipher_hash_operation(tdata,\n+\t\tRTE_CRYPTO_AUTH_OP_GENERATE);\n }\n \n static int\n-test_AES_chain_armv8_all(void)\n+create_wireless_algo_cipher_hash_operation(const uint8_t *auth_tag,\n+\t\tconst unsigned auth_tag_len,\n+\t\tconst uint8_t *auth_iv, uint8_t auth_iv_len,\n+\t\tunsigned data_pad_len,\n+\t\tenum rte_crypto_auth_operation op,\n+\t\tconst uint8_t *cipher_iv, uint8_t cipher_iv_len,\n+\t\tconst unsigned cipher_len, const unsigned cipher_offset,\n+\t\tconst unsigned auth_len, const unsigned auth_offset)\n {\n \tstruct crypto_testsuite_params *ts_params = &testsuite_params;\n-\tint status;\n-\n-\tstatus = test_blockcipher_all_tests(ts_params->mbuf_pool,\n-\t\tts_params->op_mpool,\n-\t\tts_params->session_mpool, ts_params->session_priv_mpool,\n-\t\tts_params->valid_devs[0],\n-\t\trte_cryptodev_driver_id_get(\n-\t\tRTE_STR(CRYPTODEV_NAME_ARMV8_PMD)),\n-\t\tBLKCIPHER_AES_CHAIN_TYPE);\n+\tstruct crypto_unittest_params *ut_params = &unittest_params;\n \n-\tTEST_ASSERT_EQUAL(status, 0, \"Test failed\");\n+\tenum rte_crypto_cipher_algorithm cipher_algo =\n+\t\t\tut_params->cipher_xform.cipher.algo;\n+\tenum rte_crypto_auth_algorithm auth_algo =\n+\t\t\tut_params->auth_xform.auth.algo;\n \n-\treturn TEST_SUCCESS;\n-}\n+\t/* Generate Crypto op data structure */\n+\tut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,\n+\t\t\tRTE_CRYPTO_OP_TYPE_SYMMETRIC);\n+\tTEST_ASSERT_NOT_NULL(ut_params->op,\n+\t\t\t\"Failed to allocate pktmbuf offload\");\n+\t/* Set crypto operation data parameters */\n+\trte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);\n \n-static int\n-test_AES_chain_mrvl_all(void)\n-{\n-\tstruct crypto_testsuite_params *ts_params = &testsuite_params;\n-\tint status;\n+\tstruct rte_crypto_sym_op *sym_op = ut_params->op->sym;\n \n-\tstatus = test_blockcipher_all_tests(ts_params->mbuf_pool,\n-\t\tts_params->op_mpool,\n-\t\tts_params->session_mpool, ts_params->session_priv_mpool,\n-\t\tts_params->valid_devs[0],\n-\t\trte_cryptodev_driver_id_get(\n-\t\tRTE_STR(CRYPTODEV_NAME_MVSAM_PMD)),\n-\t\tBLKCIPHER_AES_CHAIN_TYPE);\n+\t/* set crypto operation source mbuf */\n+\tsym_op->m_src = ut_params->ibuf;\n \n-\tTEST_ASSERT_EQUAL(status, 0, \"Test failed\");\n+\t/* digest */\n+\tsym_op->auth.digest.data = (uint8_t *)rte_pktmbuf_append(\n+\t\t\tut_params->ibuf, auth_tag_len);\n \n-\treturn TEST_SUCCESS;\n-}\n+\tTEST_ASSERT_NOT_NULL(sym_op->auth.digest.data,\n+\t\t\t\"no room to append auth tag\");\n+\tut_params->digest = sym_op->auth.digest.data;\n \n-static int\n-test_AES_cipheronly_mrvl_all(void)\n-{\n-\tstruct crypto_testsuite_params *ts_params = &testsuite_params;\n-\tint status;\n+\tif (rte_pktmbuf_is_contiguous(ut_params->ibuf)) {\n+\t\tsym_op->auth.digest.phys_addr = rte_pktmbuf_iova_offset(\n+\t\t\t\tut_params->ibuf, data_pad_len);\n+\t} else {\n+\t\tstruct rte_mbuf *m = ut_params->ibuf;\n+\t\tunsigned int offset = data_pad_len;\n \n-\tstatus = test_blockcipher_all_tests(ts_params->mbuf_pool,\n-\t\tts_params->op_mpool,\n-\t\tts_params->session_mpool, ts_params->session_priv_mpool,\n-\t\tts_params->valid_devs[0],\n-\t\trte_cryptodev_driver_id_get(\n-\t\tRTE_STR(CRYPTODEV_NAME_MVSAM_PMD)),\n-\t\tBLKCIPHER_AES_CIPHERONLY_TYPE);\n+\t\twhile (offset > m->data_len && m->next != NULL) {\n+\t\t\toffset -= m->data_len;\n+\t\t\tm = m->next;\n+\t\t}\n+\t\tsym_op->auth.digest.phys_addr = rte_pktmbuf_iova_offset(\n+\t\t\tm, offset);\n+\t}\n \n-\tTEST_ASSERT_EQUAL(status, 0, \"Test failed\");\n+\tif (op == RTE_CRYPTO_AUTH_OP_GENERATE)\n+\t\tmemset(sym_op->auth.digest.data, 0, auth_tag_len);\n+\telse\n+\t\trte_memcpy(sym_op->auth.digest.data, auth_tag, auth_tag_len);\n \n-\treturn TEST_SUCCESS;\n-}\n+\tdebug_hexdump(stdout, \"digest:\",\n+\t\tsym_op->auth.digest.data,\n+\t\tauth_tag_len);\n \n-static int\n-test_authonly_mrvl_all(void)\n-{\n-\tstruct crypto_testsuite_params *ts_params = &testsuite_params;\n-\tint status;\n+\t/* Copy cipher and auth IVs at the end of the crypto operation */\n+\tuint8_t *iv_ptr = rte_crypto_op_ctod_offset(ut_params->op, uint8_t *,\n+\t\t\t\t\t\tIV_OFFSET);\n+\trte_memcpy(iv_ptr, cipher_iv, cipher_iv_len);\n+\tiv_ptr += cipher_iv_len;\n+\trte_memcpy(iv_ptr, auth_iv, auth_iv_len);\n \n-\tstatus = test_blockcipher_all_tests(ts_params->mbuf_pool,\n-\t\tts_params->op_mpool,\n-\t\tts_params->session_mpool, ts_params->session_priv_mpool,\n-\t\tts_params->valid_devs[0],\n-\t\trte_cryptodev_driver_id_get(\n-\t\tRTE_STR(CRYPTODEV_NAME_MVSAM_PMD)),\n-\t\tBLKCIPHER_AUTHONLY_TYPE);\n+\tif (cipher_algo == RTE_CRYPTO_CIPHER_SNOW3G_UEA2 ||\n+\t\tcipher_algo == RTE_CRYPTO_CIPHER_KASUMI_F8 ||\n+\t\tcipher_algo == RTE_CRYPTO_CIPHER_ZUC_EEA3) {\n+\t\tsym_op->cipher.data.length = cipher_len;\n+\t\tsym_op->cipher.data.offset = cipher_offset;\n+\t} else {\n+\t\tsym_op->cipher.data.length = cipher_len >> 3;\n+\t\tsym_op->cipher.data.offset = cipher_offset >> 3;\n+\t}\n \n-\tTEST_ASSERT_EQUAL(status, 0, \"Test failed\");\n+\tif (auth_algo == RTE_CRYPTO_AUTH_SNOW3G_UIA2 ||\n+\t\tauth_algo == RTE_CRYPTO_AUTH_KASUMI_F9 ||\n+\t\tauth_algo == RTE_CRYPTO_AUTH_ZUC_EIA3) {\n+\t\tsym_op->auth.data.length = auth_len;\n+\t\tsym_op->auth.data.offset = auth_offset;\n+\t} else {\n+\t\tsym_op->auth.data.length = auth_len >> 3;\n+\t\tsym_op->auth.data.offset = auth_offset >> 3;\n+\t}\n \n-\treturn TEST_SUCCESS;\n+\treturn 0;\n }\n \n static int\n-test_3DES_chain_mrvl_all(void)\n-{\n-\tstruct crypto_testsuite_params *ts_params = &testsuite_params;\n-\tint status;\n-\n-\tstatus = test_blockcipher_all_tests(ts_params->mbuf_pool,\n-\t\tts_params->op_mpool,\n-\t\tts_params->session_mpool, ts_params->session_priv_mpool,\n-\t\tts_params->valid_devs[0],\n-\t\trte_cryptodev_driver_id_get(\n-\t\tRTE_STR(CRYPTODEV_NAME_MVSAM_PMD)),\n-\t\tBLKCIPHER_3DES_CHAIN_TYPE);\n+create_wireless_algo_auth_cipher_operation(unsigned int auth_tag_len,\n+\t\tconst uint8_t *cipher_iv, uint8_t cipher_iv_len,\n+\t\tconst uint8_t *auth_iv, uint8_t auth_iv_len,\n+\t\tunsigned int data_pad_len,\n+\t\tunsigned int cipher_len, unsigned int cipher_offset,\n+\t\tunsigned int auth_len, unsigned int auth_offset,\n+\t\tuint8_t op_mode, uint8_t do_sgl)\n+{\n+\tstruct crypto_testsuite_params *ts_params = &testsuite_params;\n+\tstruct crypto_unittest_params *ut_params = &unittest_params;\n \n-\tTEST_ASSERT_EQUAL(status, 0, \"Test failed\");\n+\tenum rte_crypto_cipher_algorithm cipher_algo =\n+\t\t\tut_params->cipher_xform.cipher.algo;\n+\tenum rte_crypto_auth_algorithm auth_algo =\n+\t\t\tut_params->auth_xform.auth.algo;\n \n-\treturn TEST_SUCCESS;\n-}\n+\t/* Generate Crypto op data structure */\n+\tut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,\n+\t\t\tRTE_CRYPTO_OP_TYPE_SYMMETRIC);\n+\tTEST_ASSERT_NOT_NULL(ut_params->op,\n+\t\t\t\"Failed to allocate pktmbuf offload\");\n \n-static int\n-test_3DES_cipheronly_mrvl_all(void)\n-{\n-\tstruct crypto_testsuite_params *ts_params = &testsuite_params;\n-\tint status;\n+\t/* Set crypto operation data parameters */\n+\trte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);\n \n-\tstatus = test_blockcipher_all_tests(ts_params->mbuf_pool,\n-\t\tts_params->op_mpool,\n-\t\tts_params->session_mpool, ts_params->session_priv_mpool,\n-\t\tts_params->valid_devs[0],\n-\t\trte_cryptodev_driver_id_get(\n-\t\tRTE_STR(CRYPTODEV_NAME_MVSAM_PMD)),\n-\t\tBLKCIPHER_3DES_CIPHERONLY_TYPE);\n+\tstruct rte_crypto_sym_op *sym_op = ut_params->op->sym;\n \n-\tTEST_ASSERT_EQUAL(status, 0, \"Test failed\");\n+\t/* set crypto operation mbufs */\n+\tsym_op->m_src = ut_params->ibuf;\n+\tif (op_mode == OUT_OF_PLACE)\n+\t\tsym_op->m_dst = ut_params->obuf;\n \n-\treturn TEST_SUCCESS;\n-}\n+\t/* digest */\n+\tif (!do_sgl) {\n+\t\tsym_op->auth.digest.data = rte_pktmbuf_mtod_offset(\n+\t\t\t(op_mode == IN_PLACE ?\n+\t\t\t\tut_params->ibuf : ut_params->obuf),\n+\t\t\tuint8_t *, data_pad_len);\n+\t\tsym_op->auth.digest.phys_addr = rte_pktmbuf_iova_offset(\n+\t\t\t(op_mode == IN_PLACE ?\n+\t\t\t\tut_params->ibuf : ut_params->obuf),\n+\t\t\tdata_pad_len);\n+\t\tmemset(sym_op->auth.digest.data, 0, auth_tag_len);\n+\t} else {\n+\t\tuint16_t remaining_off = (auth_offset >> 3) + (auth_len >> 3);\n+\t\tstruct rte_mbuf *sgl_buf = (op_mode == IN_PLACE ?\n+\t\t\t\tsym_op->m_src : sym_op->m_dst);\n+\t\twhile (remaining_off >= rte_pktmbuf_data_len(sgl_buf)) {\n+\t\t\tremaining_off -= rte_pktmbuf_data_len(sgl_buf);\n+\t\t\tsgl_buf = sgl_buf->next;\n+\t\t}\n+\t\tsym_op->auth.digest.data = rte_pktmbuf_mtod_offset(sgl_buf,\n+\t\t\t\tuint8_t *, remaining_off);\n+\t\tsym_op->auth.digest.phys_addr = rte_pktmbuf_iova_offset(sgl_buf,\n+\t\t\t\tremaining_off);\n+\t\tmemset(sym_op->auth.digest.data, 0, remaining_off);\n+\t\twhile (sgl_buf->next != NULL) {\n+\t\t\tmemset(rte_pktmbuf_mtod(sgl_buf, uint8_t *),\n+\t\t\t\t0, rte_pktmbuf_data_len(sgl_buf));\n+\t\t\tsgl_buf = sgl_buf->next;\n+\t\t}\n+\t}\n \n-static int\n-test_AES_chain_octeontx_all(void)\n-{\n-\tstruct crypto_testsuite_params *ts_params = &testsuite_params;\n-\tint status;\n+\t/* Copy cipher and auth IVs at the end of the crypto operation */\n+\tuint8_t *iv_ptr = rte_crypto_op_ctod_offset(\n+\t\t\tut_params->op, uint8_t *, IV_OFFSET);\n \n-\tstatus = test_blockcipher_all_tests(ts_params->mbuf_pool,\n-\t\tts_params->op_mpool, ts_params->session_mpool,\n-\t\tts_params->session_priv_mpool,\n-\t\tts_params->valid_devs[0],\n-\t\trte_cryptodev_driver_id_get(\n-\t\tRTE_STR(CRYPTODEV_NAME_OCTEONTX_SYM_PMD)),\n-\t\tBLKCIPHER_AES_CHAIN_TYPE);\n+\trte_memcpy(iv_ptr, cipher_iv, cipher_iv_len);\n+\tiv_ptr += cipher_iv_len;\n+\trte_memcpy(iv_ptr, auth_iv, auth_iv_len);\n \n-\tTEST_ASSERT_EQUAL(status, 0, \"Test failed\");\n+\tif (cipher_algo == RTE_CRYPTO_CIPHER_SNOW3G_UEA2 ||\n+\t\tcipher_algo == RTE_CRYPTO_CIPHER_KASUMI_F8 ||\n+\t\tcipher_algo == RTE_CRYPTO_CIPHER_ZUC_EEA3) {\n+\t\tsym_op->cipher.data.length = cipher_len;\n+\t\tsym_op->cipher.data.offset = cipher_offset;\n+\t} else {\n+\t\tsym_op->cipher.data.length = cipher_len >> 3;\n+\t\tsym_op->cipher.data.offset = cipher_offset >> 3;\n+\t}\n \n-\treturn TEST_SUCCESS;\n+\tif (auth_algo == RTE_CRYPTO_AUTH_SNOW3G_UIA2 ||\n+\t\tauth_algo == RTE_CRYPTO_AUTH_KASUMI_F9 ||\n+\t\tauth_algo == RTE_CRYPTO_AUTH_ZUC_EIA3) {\n+\t\tsym_op->auth.data.length = auth_len;\n+\t\tsym_op->auth.data.offset = auth_offset;\n+\t} else {\n+\t\tsym_op->auth.data.length = auth_len >> 3;\n+\t\tsym_op->auth.data.offset = auth_offset >> 3;\n+\t}\n+\n+\treturn 0;\n }\n \n static int\n-test_AES_cipheronly_octeontx_all(void)\n+test_snow3g_authentication(const struct snow3g_hash_test_data *tdata)\n {\n \tstruct crypto_testsuite_params *ts_params = &testsuite_params;\n-\tint status;\n+\tstruct crypto_unittest_params *ut_params = &unittest_params;\n \n-\tstatus = test_blockcipher_all_tests(ts_params->mbuf_pool,\n-\t\tts_params->op_mpool, ts_params->session_mpool,\n-\t\tts_params->session_priv_mpool,\n-\t\tts_params->valid_devs[0],\n-\t\trte_cryptodev_driver_id_get(\n-\t\tRTE_STR(CRYPTODEV_NAME_OCTEONTX_SYM_PMD)),\n-\t\tBLKCIPHER_AES_CIPHERONLY_TYPE);\n+\tint retval;\n+\tunsigned plaintext_pad_len;\n+\tunsigned plaintext_len;\n+\tuint8_t *plaintext;\n \n-\tTEST_ASSERT_EQUAL(status, 0, \"Test failed\");\n+\t/* QAT PMD supports byte-aligned data only */\n+\tif ((tdata->validAuthLenInBits.len % 8 != 0) &&\n+\t\t\t(gbl_driver_id == rte_cryptodev_driver_id_get(\n+\t\t\t\tRTE_STR(CRYPTODEV_NAME_QAT_SYM_PMD))))\n+\t\treturn -ENOTSUP;\n \n-\treturn TEST_SUCCESS;\n-}\n+\t/* Verify the capabilities */\n+\tstruct rte_cryptodev_sym_capability_idx cap_idx;\n+\tcap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;\n+\tcap_idx.algo.auth = RTE_CRYPTO_AUTH_SNOW3G_UIA2;\n+\tif (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],\n+\t\t\t&cap_idx) == NULL)\n+\t\treturn -ENOTSUP;\n \n-static int\n-test_3DES_chain_octeontx_all(void)\n-{\n-\tstruct crypto_testsuite_params *ts_params = &testsuite_params;\n-\tint status;\n+\t/* Create SNOW 3G session */\n+\tretval = create_wireless_algo_hash_session(ts_params->valid_devs[0],\n+\t\t\ttdata->key.data, tdata->key.len,\n+\t\t\ttdata->auth_iv.len, tdata->digest.len,\n+\t\t\tRTE_CRYPTO_AUTH_OP_GENERATE,\n+\t\t\tRTE_CRYPTO_AUTH_SNOW3G_UIA2);\n+\tif (retval < 0)\n+\t\treturn retval;\n \n-\tstatus = test_blockcipher_all_tests(ts_params->mbuf_pool,\n-\t\tts_params->op_mpool, ts_params->session_mpool,\n-\t\tts_params->session_priv_mpool,\n-\t\tts_params->valid_devs[0],\n-\t\trte_cryptodev_driver_id_get(\n-\t\tRTE_STR(CRYPTODEV_NAME_OCTEONTX_SYM_PMD)),\n-\t\tBLKCIPHER_3DES_CHAIN_TYPE);\n+\t/* alloc mbuf and set payload */\n+\tut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);\n \n-\tTEST_ASSERT_EQUAL(status, 0, \"Test failed\");\n+\tmemset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,\n+\trte_pktmbuf_tailroom(ut_params->ibuf));\n \n-\treturn TEST_SUCCESS;\n-}\n+\tplaintext_len = ceil_byte_length(tdata->plaintext.len);\n+\t/* Append data which is padded to a multiple of */\n+\t/* the algorithms block size */\n+\tplaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16);\n+\tplaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,\n+\t\t\t\tplaintext_pad_len);\n+\tmemcpy(plaintext, tdata->plaintext.data, plaintext_len);\n \n-static int\n-test_AES_chain_nitrox_all(void)\n-{\n-\tstruct crypto_testsuite_params *ts_params = &testsuite_params;\n-\tint status;\n+\t/* Create SNOW 3G operation */\n+\tretval = create_wireless_algo_hash_operation(NULL, tdata->digest.len,\n+\t\t\ttdata->auth_iv.data, tdata->auth_iv.len,\n+\t\t\tplaintext_pad_len, RTE_CRYPTO_AUTH_OP_GENERATE,\n+\t\t\ttdata->validAuthLenInBits.len,\n+\t\t\t0);\n+\tif (retval < 0)\n+\t\treturn retval;\n \n-\tstatus = test_blockcipher_all_tests(ts_params->mbuf_pool,\n-\t\tts_params->op_mpool,\n-\t\tts_params->session_mpool, ts_params->session_priv_mpool,\n-\t\tts_params->valid_devs[0],\n-\t\trte_cryptodev_driver_id_get(\n-\t\tRTE_STR(CRYPTODEV_NAME_NITROX_PMD)),\n-\t\tBLKCIPHER_AES_CHAIN_TYPE);\n+\tut_params->op = process_crypto_request(ts_params->valid_devs[0],\n+\t\t\t\tut_params->op);\n+\tut_params->obuf = ut_params->op->sym->m_src;\n+\tTEST_ASSERT_NOT_NULL(ut_params->op, \"failed to retrieve obuf\");\n+\tut_params->digest = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *)\n+\t\t\t+ plaintext_pad_len;\n \n-\tTEST_ASSERT_EQUAL(status, 0, \"Test failed\");\n+\t/* Validate obuf */\n+\tTEST_ASSERT_BUFFERS_ARE_EQUAL(\n+\tut_params->digest,\n+\ttdata->digest.data,\n+\tDIGEST_BYTE_LENGTH_SNOW3G_UIA2,\n+\t\"SNOW 3G Generated auth tag not as expected\");\n \n-\treturn TEST_SUCCESS;\n+\treturn 0;\n }\n \n static int\n-test_3DES_cipheronly_octeontx_all(void)\n+test_snow3g_authentication_verify(const struct snow3g_hash_test_data *tdata)\n {\n \tstruct crypto_testsuite_params *ts_params = &testsuite_params;\n-\tint status;\n+\tstruct crypto_unittest_params *ut_params = &unittest_params;\n \n-\tstatus = test_blockcipher_all_tests(ts_params->mbuf_pool,\n-\t\tts_params->op_mpool, ts_params->session_mpool,\n-\t\tts_params->session_priv_mpool,\n-\t\tts_params->valid_devs[0],\n-\t\trte_cryptodev_driver_id_get(\n-\t\tRTE_STR(CRYPTODEV_NAME_OCTEONTX_SYM_PMD)),\n-\t\tBLKCIPHER_3DES_CIPHERONLY_TYPE);\n+\tint retval;\n+\tunsigned plaintext_pad_len;\n+\tunsigned plaintext_len;\n+\tuint8_t *plaintext;\n \n-\tTEST_ASSERT_EQUAL(status, 0, \"Test failed\");\n+\t/* QAT PMD supports byte-aligned data only */\n+\tif ((tdata->validAuthLenInBits.len % 8 != 0) &&\n+\t\t\t(gbl_driver_id == rte_cryptodev_driver_id_get(\n+\t\t\t\tRTE_STR(CRYPTODEV_NAME_QAT_SYM_PMD))))\n+\t\treturn -ENOTSUP;\n \n-\treturn TEST_SUCCESS;\n-}\n+\t/* Verify the capabilities */\n+\tstruct rte_cryptodev_sym_capability_idx cap_idx;\n+\tcap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;\n+\tcap_idx.algo.auth = RTE_CRYPTO_AUTH_SNOW3G_UIA2;\n+\tif (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],\n+\t\t\t&cap_idx) == NULL)\n+\t\treturn -ENOTSUP;\n \n-static int\n-test_authonly_octeontx_all(void)\n-{\n-\tstruct crypto_testsuite_params *ts_params = &testsuite_params;\n-\tint status;\n+\t/* Create SNOW 3G session */\n+\tretval = create_wireless_algo_hash_session(ts_params->valid_devs[0],\n+\t\t\t\ttdata->key.data, tdata->key.len,\n+\t\t\t\ttdata->auth_iv.len, tdata->digest.len,\n+\t\t\t\tRTE_CRYPTO_AUTH_OP_VERIFY,\n+\t\t\t\tRTE_CRYPTO_AUTH_SNOW3G_UIA2);\n+\tif (retval < 0)\n+\t\treturn retval;\n+\t/* alloc mbuf and set payload */\n+\tut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);\n \n-\tstatus = test_blockcipher_all_tests(ts_params->mbuf_pool,\n-\t\tts_params->op_mpool, ts_params->session_mpool,\n-\t\tts_params->session_priv_mpool,\n-\t\tts_params->valid_devs[0],\n-\t\trte_cryptodev_driver_id_get(\n-\t\tRTE_STR(CRYPTODEV_NAME_OCTEONTX_SYM_PMD)),\n-\t\tBLKCIPHER_AUTHONLY_TYPE);\n+\tmemset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,\n+\trte_pktmbuf_tailroom(ut_params->ibuf));\n \n-\tTEST_ASSERT_EQUAL(status, 0, \"Test failed\");\n+\tplaintext_len = ceil_byte_length(tdata->plaintext.len);\n+\t/* Append data which is padded to a multiple of */\n+\t/* the algorithms block size */\n+\tplaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16);\n+\tplaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,\n+\t\t\t\tplaintext_pad_len);\n+\tmemcpy(plaintext, tdata->plaintext.data, plaintext_len);\n \n-\treturn TEST_SUCCESS;\n+\t/* Create SNOW 3G operation */\n+\tretval = create_wireless_algo_hash_operation(tdata->digest.data,\n+\t\t\ttdata->digest.len,\n+\t\t\ttdata->auth_iv.data, tdata->auth_iv.len,\n+\t\t\tplaintext_pad_len,\n+\t\t\tRTE_CRYPTO_AUTH_OP_VERIFY,\n+\t\t\ttdata->validAuthLenInBits.len,\n+\t\t\t0);\n+\tif (retval < 0)\n+\t\treturn retval;\n+\n+\tut_params->op = process_crypto_request(ts_params->valid_devs[0],\n+\t\t\t\tut_params->op);\n+\tTEST_ASSERT_NOT_NULL(ut_params->op, \"failed to retrieve obuf\");\n+\tut_params->obuf = ut_params->op->sym->m_src;\n+\tut_params->digest = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *)\n+\t\t\t\t+ plaintext_pad_len;\n+\n+\t/* Validate obuf */\n+\tif (ut_params->op->status == RTE_CRYPTO_OP_STATUS_SUCCESS)\n+\t\treturn 0;\n+\telse\n+\t\treturn -1;\n+\n+\treturn 0;\n }\n \n static int\n-test_AES_chain_octeontx2_all(void)\n+test_kasumi_authentication(const struct kasumi_hash_test_data *tdata)\n {\n \tstruct crypto_testsuite_params *ts_params = &testsuite_params;\n-\tint status;\n+\tstruct crypto_unittest_params *ut_params = &unittest_params;\n \n-\tstatus = test_blockcipher_all_tests(ts_params->mbuf_pool,\n-\t\tts_params->op_mpool, ts_params->session_mpool,\n-\t\tts_params->session_priv_mpool,\n-\t\tts_params->valid_devs[0],\n-\t\trte_cryptodev_driver_id_get(\n-\t\tRTE_STR(CRYPTODEV_NAME_OCTEONTX2_PMD)),\n-\t\tBLKCIPHER_AES_CHAIN_TYPE);\n+\tint retval;\n+\tunsigned plaintext_pad_len;\n+\tunsigned plaintext_len;\n+\tuint8_t *plaintext;\n \n-\tTEST_ASSERT_EQUAL(status, 0, \"Test failed\");\n+\t/* Verify the capabilities */\n+\tstruct rte_cryptodev_sym_capability_idx cap_idx;\n+\tcap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;\n+\tcap_idx.algo.auth = RTE_CRYPTO_AUTH_KASUMI_F9;\n+\tif (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],\n+\t\t\t&cap_idx) == NULL)\n+\t\treturn -ENOTSUP;\n \n-\treturn TEST_SUCCESS;\n-}\n+\t/* Create KASUMI session */\n+\tretval = create_wireless_algo_hash_session(ts_params->valid_devs[0],\n+\t\t\ttdata->key.data, tdata->key.len,\n+\t\t\t0, tdata->digest.len,\n+\t\t\tRTE_CRYPTO_AUTH_OP_GENERATE,\n+\t\t\tRTE_CRYPTO_AUTH_KASUMI_F9);\n+\tif (retval < 0)\n+\t\treturn retval;\n \n-static int\n-test_AES_cipheronly_octeontx2_all(void)\n-{\n-\tstruct crypto_testsuite_params *ts_params = &testsuite_params;\n-\tint status;\n+\t/* alloc mbuf and set payload */\n+\tut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);\n \n-\tstatus = test_blockcipher_all_tests(ts_params->mbuf_pool,\n-\t\tts_params->op_mpool, ts_params->session_mpool,\n-\t\tts_params->session_priv_mpool,\n-\t\tts_params->valid_devs[0],\n-\t\trte_cryptodev_driver_id_get(\n-\t\tRTE_STR(CRYPTODEV_NAME_OCTEONTX2_PMD)),\n-\t\tBLKCIPHER_AES_CIPHERONLY_TYPE);\n+\tmemset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,\n+\trte_pktmbuf_tailroom(ut_params->ibuf));\n \n-\tTEST_ASSERT_EQUAL(status, 0, \"Test failed\");\n+\tplaintext_len = ceil_byte_length(tdata->plaintext.len);\n+\t/* Append data which is padded to a multiple of */\n+\t/* the algorithms block size */\n+\tplaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 8);\n+\tplaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,\n+\t\t\t\tplaintext_pad_len);\n+\tmemcpy(plaintext, tdata->plaintext.data, plaintext_len);\n \n-\treturn TEST_SUCCESS;\n+\t/* Create KASUMI operation */\n+\tretval = create_wireless_algo_hash_operation(NULL, tdata->digest.len,\n+\t\t\tNULL, 0,\n+\t\t\tplaintext_pad_len, RTE_CRYPTO_AUTH_OP_GENERATE,\n+\t\t\ttdata->plaintext.len,\n+\t\t\t0);\n+\tif (retval < 0)\n+\t\treturn retval;\n+\n+\tut_params->op = process_crypto_request(ts_params->valid_devs[0],\n+\t\t\t\tut_params->op);\n+\tut_params->obuf = ut_params->op->sym->m_src;\n+\tTEST_ASSERT_NOT_NULL(ut_params->op, \"failed to retrieve obuf\");\n+\tut_params->digest = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *)\n+\t\t\t+ plaintext_pad_len;\n+\n+\t/* Validate obuf */\n+\tTEST_ASSERT_BUFFERS_ARE_EQUAL(\n+\tut_params->digest,\n+\ttdata->digest.data,\n+\tDIGEST_BYTE_LENGTH_KASUMI_F9,\n+\t\"KASUMI Generated auth tag not as expected\");\n+\n+\treturn 0;\n }\n \n static int\n-test_3DES_chain_octeontx2_all(void)\n+test_kasumi_authentication_verify(const struct kasumi_hash_test_data *tdata)\n {\n \tstruct crypto_testsuite_params *ts_params = &testsuite_params;\n-\tint status;\n+\tstruct crypto_unittest_params *ut_params = &unittest_params;\n \n-\tstatus = test_blockcipher_all_tests(ts_params->mbuf_pool,\n-\t\tts_params->op_mpool, ts_params->session_mpool,\n-\t\tts_params->session_priv_mpool,\n-\t\tts_params->valid_devs[0],\n-\t\trte_cryptodev_driver_id_get(\n-\t\tRTE_STR(CRYPTODEV_NAME_OCTEONTX2_PMD)),\n-\t\tBLKCIPHER_3DES_CHAIN_TYPE);\n+\tint retval;\n+\tunsigned plaintext_pad_len;\n+\tunsigned plaintext_len;\n+\tuint8_t *plaintext;\n \n-\tTEST_ASSERT_EQUAL(status, 0, \"Test failed\");\n+\t/* Verify the capabilities */\n+\tstruct rte_cryptodev_sym_capability_idx cap_idx;\n+\tcap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;\n+\tcap_idx.algo.auth = RTE_CRYPTO_AUTH_KASUMI_F9;\n+\tif (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],\n+\t\t\t&cap_idx) == NULL)\n+\t\treturn -ENOTSUP;\n \n-\treturn TEST_SUCCESS;\n+\t/* Create KASUMI session */\n+\tretval = create_wireless_algo_hash_session(ts_params->valid_devs[0],\n+\t\t\t\ttdata->key.data, tdata->key.len,\n+\t\t\t\t0, tdata->digest.len,\n+\t\t\t\tRTE_CRYPTO_AUTH_OP_VERIFY,\n+\t\t\t\tRTE_CRYPTO_AUTH_KASUMI_F9);\n+\tif (retval < 0)\n+\t\treturn retval;\n+\t/* alloc mbuf and set payload */\n+\tut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);\n+\n+\tmemset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,\n+\trte_pktmbuf_tailroom(ut_params->ibuf));\n+\n+\tplaintext_len = ceil_byte_length(tdata->plaintext.len);\n+\t/* Append data which is padded to a multiple */\n+\t/* of the algorithms block size */\n+\tplaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 8);\n+\tplaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,\n+\t\t\t\tplaintext_pad_len);\n+\tmemcpy(plaintext, tdata->plaintext.data, plaintext_len);\n+\n+\t/* Create KASUMI operation */\n+\tretval = create_wireless_algo_hash_operation(tdata->digest.data,\n+\t\t\ttdata->digest.len,\n+\t\t\tNULL, 0,\n+\t\t\tplaintext_pad_len,\n+\t\t\tRTE_CRYPTO_AUTH_OP_VERIFY,\n+\t\t\ttdata->plaintext.len,\n+\t\t\t0);\n+\tif (retval < 0)\n+\t\treturn retval;\n+\n+\tut_params->op = process_crypto_request(ts_params->valid_devs[0],\n+\t\t\t\tut_params->op);\n+\tTEST_ASSERT_NOT_NULL(ut_params->op, \"failed to retrieve obuf\");\n+\tut_params->obuf = ut_params->op->sym->m_src;\n+\tut_params->digest = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *)\n+\t\t\t\t+ plaintext_pad_len;\n+\n+\t/* Validate obuf */\n+\tif (ut_params->op->status == RTE_CRYPTO_OP_STATUS_SUCCESS)\n+\t\treturn 0;\n+\telse\n+\t\treturn -1;\n+\n+\treturn 0;\n }\n \n static int\n-test_3DES_cipheronly_octeontx2_all(void)\n+test_snow3g_hash_generate_test_case_1(void)\n {\n-\tstruct crypto_testsuite_params *ts_params = &testsuite_params;\n-\tint status;\n+\treturn test_snow3g_authentication(&snow3g_hash_test_case_1);\n+}\n \n-\tstatus = test_blockcipher_all_tests(ts_params->mbuf_pool,\n-\t\tts_params->op_mpool, ts_params->session_mpool,\n-\t\tts_params->session_priv_mpool,\n-\t\tts_params->valid_devs[0],\n-\t\trte_cryptodev_driver_id_get(\n-\t\tRTE_STR(CRYPTODEV_NAME_OCTEONTX2_PMD)),\n-\t\tBLKCIPHER_3DES_CIPHERONLY_TYPE);\n+static int\n+test_snow3g_hash_generate_test_case_2(void)\n+{\n+\treturn test_snow3g_authentication(&snow3g_hash_test_case_2);\n+}\n \n-\tTEST_ASSERT_EQUAL(status, 0, \"Test failed\");\n+static int\n+test_snow3g_hash_generate_test_case_3(void)\n+{\n+\treturn test_snow3g_authentication(&snow3g_hash_test_case_3);\n+}\n \n-\treturn TEST_SUCCESS;\n+static int\n+test_snow3g_hash_generate_test_case_4(void)\n+{\n+\treturn test_snow3g_authentication(&snow3g_hash_test_case_4);\n }\n \n static int\n-test_authonly_octeontx2_all(void)\n+test_snow3g_hash_generate_test_case_5(void)\n {\n-\tstruct crypto_testsuite_params *ts_params = &testsuite_params;\n-\tint status;\n+\treturn test_snow3g_authentication(&snow3g_hash_test_case_5);\n+}\n \n-\tstatus = test_blockcipher_all_tests(ts_params->mbuf_pool,\n-\t\tts_params->op_mpool, ts_params->session_mpool,\n-\t\tts_params->session_priv_mpool,\n-\t\tts_params->valid_devs[0],\n-\t\trte_cryptodev_driver_id_get(\n-\t\tRTE_STR(CRYPTODEV_NAME_OCTEONTX2_PMD)),\n-\t\tBLKCIPHER_AUTHONLY_TYPE);\n+static int\n+test_snow3g_hash_generate_test_case_6(void)\n+{\n+\treturn test_snow3g_authentication(&snow3g_hash_test_case_6);\n+}\n \n-\tTEST_ASSERT_EQUAL(status, 0, \"Test failed\");\n+static int\n+test_snow3g_hash_verify_test_case_1(void)\n+{\n+\treturn test_snow3g_authentication_verify(&snow3g_hash_test_case_1);\n \n-\treturn TEST_SUCCESS;\n }\n \n-/* ***** SNOW 3G Tests ***** */\n static int\n-create_wireless_algo_hash_session(uint8_t dev_id,\n-\tconst uint8_t *key, const uint8_t key_len,\n-\tconst uint8_t iv_len, const uint8_t auth_len,\n-\tenum rte_crypto_auth_operation op,\n-\tenum rte_crypto_auth_algorithm algo)\n+test_snow3g_hash_verify_test_case_2(void)\n {\n-\tuint8_t hash_key[key_len];\n-\tint status;\n-\n-\tstruct crypto_testsuite_params *ts_params = &testsuite_params;\n-\tstruct crypto_unittest_params *ut_params = &unittest_params;\n+\treturn test_snow3g_authentication_verify(&snow3g_hash_test_case_2);\n+}\n \n-\tmemcpy(hash_key, key, key_len);\n+static int\n+test_snow3g_hash_verify_test_case_3(void)\n+{\n+\treturn test_snow3g_authentication_verify(&snow3g_hash_test_case_3);\n+}\n \n-\tdebug_hexdump(stdout, \"key:\", key, key_len);\n+static int\n+test_snow3g_hash_verify_test_case_4(void)\n+{\n+\treturn test_snow3g_authentication_verify(&snow3g_hash_test_case_4);\n+}\n \n-\t/* Setup Authentication Parameters */\n-\tut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;\n-\tut_params->auth_xform.next = NULL;\n+static int\n+test_snow3g_hash_verify_test_case_5(void)\n+{\n+\treturn test_snow3g_authentication_verify(&snow3g_hash_test_case_5);\n+}\n \n-\tut_params->auth_xform.auth.op = op;\n-\tut_params->auth_xform.auth.algo = algo;\n-\tut_params->auth_xform.auth.key.length = key_len;\n-\tut_params->auth_xform.auth.key.data = hash_key;\n-\tut_params->auth_xform.auth.digest_length = auth_len;\n-\tut_params->auth_xform.auth.iv.offset = IV_OFFSET;\n-\tut_params->auth_xform.auth.iv.length = iv_len;\n-\tut_params->sess = rte_cryptodev_sym_session_create(\n-\t\t\tts_params->session_mpool);\n+static int\n+test_snow3g_hash_verify_test_case_6(void)\n+{\n+\treturn test_snow3g_authentication_verify(&snow3g_hash_test_case_6);\n+}\n \n-\tstatus = rte_cryptodev_sym_session_init(dev_id, ut_params->sess,\n-\t\t\t&ut_params->auth_xform,\n-\t\t\tts_params->session_priv_mpool);\n-\tTEST_ASSERT_EQUAL(status, 0, \"session init failed\");\n-\tTEST_ASSERT_NOT_NULL(ut_params->sess, \"Session creation failed\");\n-\treturn 0;\n+static int\n+test_kasumi_hash_generate_test_case_1(void)\n+{\n+\treturn test_kasumi_authentication(&kasumi_hash_test_case_1);\n }\n \n static int\n-create_wireless_algo_cipher_session(uint8_t dev_id,\n-\t\t\tenum rte_crypto_cipher_operation op,\n-\t\t\tenum rte_crypto_cipher_algorithm algo,\n-\t\t\tconst uint8_t *key, const uint8_t key_len,\n-\t\t\tuint8_t iv_len)\n+test_kasumi_hash_generate_test_case_2(void)\n {\n-\tuint8_t cipher_key[key_len];\n-\tint status;\n-\tstruct crypto_testsuite_params *ts_params = &testsuite_params;\n-\tstruct crypto_unittest_params *ut_params = &unittest_params;\n+\treturn test_kasumi_authentication(&kasumi_hash_test_case_2);\n+}\n \n-\tmemcpy(cipher_key, key, key_len);\n+static int\n+test_kasumi_hash_generate_test_case_3(void)\n+{\n+\treturn test_kasumi_authentication(&kasumi_hash_test_case_3);\n+}\n \n-\t/* Setup Cipher Parameters */\n-\tut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER;\n-\tut_params->cipher_xform.next = NULL;\n+static int\n+test_kasumi_hash_generate_test_case_4(void)\n+{\n+\treturn test_kasumi_authentication(&kasumi_hash_test_case_4);\n+}\n \n-\tut_params->cipher_xform.cipher.algo = algo;\n-\tut_params->cipher_xform.cipher.op = op;\n-\tut_params->cipher_xform.cipher.key.data = cipher_key;\n-\tut_params->cipher_xform.cipher.key.length = key_len;\n-\tut_params->cipher_xform.cipher.iv.offset = IV_OFFSET;\n-\tut_params->cipher_xform.cipher.iv.length = iv_len;\n-\n-\tdebug_hexdump(stdout, \"key:\", key, key_len);\n-\n-\t/* Create Crypto session */\n-\tut_params->sess = rte_cryptodev_sym_session_create(\n-\t\t\tts_params->session_mpool);\n-\n-\tstatus = rte_cryptodev_sym_session_init(dev_id, ut_params->sess,\n-\t\t\t&ut_params->cipher_xform,\n-\t\t\tts_params->session_priv_mpool);\n-\tTEST_ASSERT_EQUAL(status, 0, \"session init failed\");\n-\tTEST_ASSERT_NOT_NULL(ut_params->sess, \"Session creation failed\");\n-\treturn 0;\n+static int\n+test_kasumi_hash_generate_test_case_5(void)\n+{\n+\treturn test_kasumi_authentication(&kasumi_hash_test_case_5);\n }\n \n static int\n-create_wireless_algo_cipher_operation(const uint8_t *iv, uint8_t iv_len,\n-\t\t\tunsigned int cipher_len,\n-\t\t\tunsigned int cipher_offset)\n+test_kasumi_hash_generate_test_case_6(void)\n {\n-\tstruct crypto_testsuite_params *ts_params = &testsuite_params;\n-\tstruct crypto_unittest_params *ut_params = &unittest_params;\n-\n-\t/* Generate Crypto op data structure */\n-\tut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,\n-\t\t\t\tRTE_CRYPTO_OP_TYPE_SYMMETRIC);\n-\tTEST_ASSERT_NOT_NULL(ut_params->op,\n-\t\t\t\t\"Failed to allocate pktmbuf offload\");\n-\n-\t/* Set crypto operation data parameters */\n-\trte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);\n-\n-\tstruct rte_crypto_sym_op *sym_op = ut_params->op->sym;\n-\n-\t/* set crypto operation source mbuf */\n-\tsym_op->m_src = ut_params->ibuf;\n-\n-\t/* iv */\n-\trte_memcpy(rte_crypto_op_ctod_offset(ut_params->op, uint8_t *, IV_OFFSET),\n-\t\t\tiv, iv_len);\n-\tsym_op->cipher.data.length = cipher_len;\n-\tsym_op->cipher.data.offset = cipher_offset;\n-\treturn 0;\n+\treturn test_kasumi_authentication(&kasumi_hash_test_case_6);\n }\n \n static int\n-create_wireless_algo_cipher_operation_oop(const uint8_t *iv, uint8_t iv_len,\n-\t\t\tunsigned int cipher_len,\n-\t\t\tunsigned int cipher_offset)\n+test_kasumi_hash_verify_test_case_1(void)\n {\n-\tstruct crypto_testsuite_params *ts_params = &testsuite_params;\n-\tstruct crypto_unittest_params *ut_params = &unittest_params;\n-\n-\t/* Generate Crypto op data structure */\n-\tut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,\n-\t\t\t\tRTE_CRYPTO_OP_TYPE_SYMMETRIC);\n-\tTEST_ASSERT_NOT_NULL(ut_params->op,\n-\t\t\t\t\"Failed to allocate pktmbuf offload\");\n-\n-\t/* Set crypto operation data parameters */\n-\trte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);\n-\n-\tstruct rte_crypto_sym_op *sym_op = ut_params->op->sym;\n+\treturn test_kasumi_authentication_verify(&kasumi_hash_test_case_1);\n+}\n \n-\t/* set crypto operation source mbuf */\n-\tsym_op->m_src = ut_params->ibuf;\n-\tsym_op->m_dst = ut_params->obuf;\n+static int\n+test_kasumi_hash_verify_test_case_2(void)\n+{\n+\treturn test_kasumi_authentication_verify(&kasumi_hash_test_case_2);\n+}\n \n-\t/* iv */\n-\trte_memcpy(rte_crypto_op_ctod_offset(ut_params->op, uint8_t *, IV_OFFSET),\n-\t\t\tiv, iv_len);\n-\tsym_op->cipher.data.length = cipher_len;\n-\tsym_op->cipher.data.offset = cipher_offset;\n-\treturn 0;\n+static int\n+test_kasumi_hash_verify_test_case_3(void)\n+{\n+\treturn test_kasumi_authentication_verify(&kasumi_hash_test_case_3);\n }\n \n static int\n-create_wireless_algo_cipher_auth_session(uint8_t dev_id,\n-\t\tenum rte_crypto_cipher_operation cipher_op,\n-\t\tenum rte_crypto_auth_operation auth_op,\n-\t\tenum rte_crypto_auth_algorithm auth_algo,\n-\t\tenum rte_crypto_cipher_algorithm cipher_algo,\n-\t\tconst uint8_t *key, uint8_t key_len,\n-\t\tuint8_t auth_iv_len, uint8_t auth_len,\n-\t\tuint8_t cipher_iv_len)\n+test_kasumi_hash_verify_test_case_4(void)\n+{\n+\treturn test_kasumi_authentication_verify(&kasumi_hash_test_case_4);\n+}\n \n+static int\n+test_kasumi_hash_verify_test_case_5(void)\n {\n-\tuint8_t cipher_auth_key[key_len];\n-\tint status;\n+\treturn test_kasumi_authentication_verify(&kasumi_hash_test_case_5);\n+}\n \n+static int\n+test_kasumi_encryption(const struct kasumi_test_data *tdata)\n+{\n \tstruct crypto_testsuite_params *ts_params = &testsuite_params;\n \tstruct crypto_unittest_params *ut_params = &unittest_params;\n \n-\tmemcpy(cipher_auth_key, key, key_len);\n+\tint retval;\n+\tuint8_t *plaintext, *ciphertext;\n+\tunsigned plaintext_pad_len;\n+\tunsigned plaintext_len;\n \n-\t/* Setup Authentication Parameters */\n-\tut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;\n-\tut_params->auth_xform.next = NULL;\n+\t/* Verify the capabilities */\n+\tstruct rte_cryptodev_sym_capability_idx cap_idx;\n+\tcap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;\n+\tcap_idx.algo.cipher = RTE_CRYPTO_CIPHER_KASUMI_F8;\n+\tif (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],\n+\t\t\t&cap_idx) == NULL)\n+\t\treturn -ENOTSUP;\n \n-\tut_params->auth_xform.auth.op = auth_op;\n-\tut_params->auth_xform.auth.algo = auth_algo;\n-\tut_params->auth_xform.auth.key.length = key_len;\n-\t/* Hash key = cipher key */\n-\tut_params->auth_xform.auth.key.data = cipher_auth_key;\n-\tut_params->auth_xform.auth.digest_length = auth_len;\n-\t/* Auth IV will be after cipher IV */\n-\tut_params->auth_xform.auth.iv.offset = IV_OFFSET + cipher_iv_len;\n-\tut_params->auth_xform.auth.iv.length = auth_iv_len;\n+\t/* Create KASUMI session */\n+\tretval = create_wireless_algo_cipher_session(ts_params->valid_devs[0],\n+\t\t\t\t\tRTE_CRYPTO_CIPHER_OP_ENCRYPT,\n+\t\t\t\t\tRTE_CRYPTO_CIPHER_KASUMI_F8,\n+\t\t\t\t\ttdata->key.data, tdata->key.len,\n+\t\t\t\t\ttdata->cipher_iv.len);\n+\tif (retval < 0)\n+\t\treturn retval;\n \n-\t/* Setup Cipher Parameters */\n-\tut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER;\n-\tut_params->cipher_xform.next = &ut_params->auth_xform;\n+\tut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);\n \n-\tut_params->cipher_xform.cipher.algo = cipher_algo;\n-\tut_params->cipher_xform.cipher.op = cipher_op;\n-\tut_params->cipher_xform.cipher.key.data = cipher_auth_key;\n-\tut_params->cipher_xform.cipher.key.length = key_len;\n-\tut_params->cipher_xform.cipher.iv.offset = IV_OFFSET;\n-\tut_params->cipher_xform.cipher.iv.length = cipher_iv_len;\n+\t/* Clear mbuf payload */\n+\tmemset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,\n+\t       rte_pktmbuf_tailroom(ut_params->ibuf));\n \n-\tdebug_hexdump(stdout, \"key:\", key, key_len);\n+\tplaintext_len = ceil_byte_length(tdata->plaintext.len);\n+\t/* Append data which is padded to a multiple */\n+\t/* of the algorithms block size */\n+\tplaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 8);\n+\tplaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,\n+\t\t\t\tplaintext_pad_len);\n+\tmemcpy(plaintext, tdata->plaintext.data, plaintext_len);\n \n-\t/* Create Crypto session*/\n-\tut_params->sess = rte_cryptodev_sym_session_create(\n-\t\t\tts_params->session_mpool);\n-\tTEST_ASSERT_NOT_NULL(ut_params->sess, \"Session creation failed\");\n+\tdebug_hexdump(stdout, \"plaintext:\", plaintext, plaintext_len);\n \n-\tstatus = rte_cryptodev_sym_session_init(dev_id, ut_params->sess,\n-\t\t\t&ut_params->cipher_xform,\n-\t\t\tts_params->session_priv_mpool);\n-\tif (status == -ENOTSUP)\n-\t\treturn status;\n+\t/* Create KASUMI operation */\n+\tretval = create_wireless_algo_cipher_operation(tdata->cipher_iv.data,\n+\t\t\t\ttdata->cipher_iv.len,\n+\t\t\t\tRTE_ALIGN_CEIL(tdata->validCipherLenInBits.len,\n+\t\t\t\t\t\t8),\n+\t\t\t\ttdata->validCipherOffsetInBits.len);\n+\tif (retval < 0)\n+\t\treturn retval;\n \n-\tTEST_ASSERT_EQUAL(status, 0, \"session init failed\");\n+\tut_params->op = process_crypto_request(ts_params->valid_devs[0],\n+\t\t\t\t\t\tut_params->op);\n+\tTEST_ASSERT_NOT_NULL(ut_params->op, \"failed to retrieve obuf\");\n+\n+\tut_params->obuf = ut_params->op->sym->m_dst;\n+\tif (ut_params->obuf)\n+\t\tciphertext = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *);\n+\telse\n+\t\tciphertext = plaintext +\n+\t\t\t\t(tdata->validCipherOffsetInBits.len >> 3);\n+\n+\tdebug_hexdump(stdout, \"ciphertext:\", ciphertext, plaintext_len);\n+\n+\tconst uint8_t *reference_ciphertext = tdata->ciphertext.data +\n+\t\t\t\t(tdata->validCipherOffsetInBits.len >> 3);\n+\t/* Validate obuf */\n+\tTEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(\n+\t\tciphertext,\n+\t\treference_ciphertext,\n+\t\ttdata->validCipherLenInBits.len,\n+\t\t\"KASUMI Ciphertext data not as expected\");\n \treturn 0;\n }\n \n static int\n-create_wireless_cipher_auth_session(uint8_t dev_id,\n-\t\tenum rte_crypto_cipher_operation cipher_op,\n-\t\tenum rte_crypto_auth_operation auth_op,\n-\t\tenum rte_crypto_auth_algorithm auth_algo,\n-\t\tenum rte_crypto_cipher_algorithm cipher_algo,\n-\t\tconst struct wireless_test_data *tdata)\n+test_kasumi_encryption_sgl(const struct kasumi_test_data *tdata)\n {\n-\tconst uint8_t key_len = tdata->key.len;\n-\tuint8_t cipher_auth_key[key_len];\n-\tint status;\n-\n \tstruct crypto_testsuite_params *ts_params = &testsuite_params;\n \tstruct crypto_unittest_params *ut_params = &unittest_params;\n-\tconst uint8_t *key = tdata->key.data;\n-\tconst uint8_t auth_len = tdata->digest.len;\n-\tuint8_t cipher_iv_len = tdata->cipher_iv.len;\n-\tuint8_t auth_iv_len = tdata->auth_iv.len;\n \n-\tmemcpy(cipher_auth_key, key, key_len);\n+\tint retval;\n \n-\t/* Setup Authentication Parameters */\n-\tut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;\n-\tut_params->auth_xform.next = NULL;\n+\tunsigned int plaintext_pad_len;\n+\tunsigned int plaintext_len;\n \n-\tut_params->auth_xform.auth.op = auth_op;\n-\tut_params->auth_xform.auth.algo = auth_algo;\n-\tut_params->auth_xform.auth.key.length = key_len;\n-\t/* Hash key = cipher key */\n-\tut_params->auth_xform.auth.key.data = cipher_auth_key;\n-\tut_params->auth_xform.auth.digest_length = auth_len;\n-\t/* Auth IV will be after cipher IV */\n-\tut_params->auth_xform.auth.iv.offset = IV_OFFSET + cipher_iv_len;\n-\tut_params->auth_xform.auth.iv.length = auth_iv_len;\n+\tuint8_t buffer[10000];\n+\tconst uint8_t *ciphertext;\n \n-\t/* Setup Cipher Parameters */\n-\tut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER;\n-\tut_params->cipher_xform.next = &ut_params->auth_xform;\n+\tstruct rte_cryptodev_info dev_info;\n \n-\tut_params->cipher_xform.cipher.algo = cipher_algo;\n-\tut_params->cipher_xform.cipher.op = cipher_op;\n-\tut_params->cipher_xform.cipher.key.data = cipher_auth_key;\n-\tut_params->cipher_xform.cipher.key.length = key_len;\n-\tut_params->cipher_xform.cipher.iv.offset = IV_OFFSET;\n-\tut_params->cipher_xform.cipher.iv.length = cipher_iv_len;\n+\t/* Verify the capabilities */\n+\tstruct rte_cryptodev_sym_capability_idx cap_idx;\n+\tcap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;\n+\tcap_idx.algo.cipher = RTE_CRYPTO_CIPHER_KASUMI_F8;\n+\tif (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],\n+\t\t\t&cap_idx) == NULL)\n+\t\treturn -ENOTSUP;\n \n+\trte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);\n \n-\tdebug_hexdump(stdout, \"key:\", key, key_len);\n+\tuint64_t feat_flags = dev_info.feature_flags;\n \n-\t/* Create Crypto session*/\n-\tut_params->sess = rte_cryptodev_sym_session_create(\n-\t\t\tts_params->session_mpool);\n+\tif (!(feat_flags & RTE_CRYPTODEV_FF_IN_PLACE_SGL)) {\n+\t\tprintf(\"Device doesn't support in-place scatter-gather. \"\n+\t\t\t\t\"Test Skipped.\\n\");\n+\t\treturn -ENOTSUP;\n+\t}\n \n-\tstatus = rte_cryptodev_sym_session_init(dev_id, ut_params->sess,\n-\t\t\t&ut_params->cipher_xform,\n-\t\t\tts_params->session_priv_mpool);\n+\t/* Create KASUMI session */\n+\tretval = create_wireless_algo_cipher_session(ts_params->valid_devs[0],\n+\t\t\t\t\tRTE_CRYPTO_CIPHER_OP_ENCRYPT,\n+\t\t\t\t\tRTE_CRYPTO_CIPHER_KASUMI_F8,\n+\t\t\t\t\ttdata->key.data, tdata->key.len,\n+\t\t\t\t\ttdata->cipher_iv.len);\n+\tif (retval < 0)\n+\t\treturn retval;\n \n-\tTEST_ASSERT_EQUAL(status, 0, \"session init failed\");\n-\tTEST_ASSERT_NOT_NULL(ut_params->sess, \"Session creation failed\");\n-\treturn 0;\n-}\n+\tplaintext_len = ceil_byte_length(tdata->plaintext.len);\n \n-static int\n-create_zuc_cipher_auth_encrypt_generate_session(uint8_t dev_id,\n-\t\tconst struct wireless_test_data *tdata)\n-{\n-\treturn create_wireless_cipher_auth_session(dev_id,\n-\t\tRTE_CRYPTO_CIPHER_OP_ENCRYPT,\n-\t\tRTE_CRYPTO_AUTH_OP_GENERATE, RTE_CRYPTO_AUTH_ZUC_EIA3,\n-\t\tRTE_CRYPTO_CIPHER_ZUC_EEA3, tdata);\n-}\n \n-static int\n-create_wireless_algo_auth_cipher_session(uint8_t dev_id,\n-\t\tenum rte_crypto_cipher_operation cipher_op,\n-\t\tenum rte_crypto_auth_operation auth_op,\n-\t\tenum rte_crypto_auth_algorithm auth_algo,\n-\t\tenum rte_crypto_cipher_algorithm cipher_algo,\n-\t\tconst uint8_t *key, const uint8_t key_len,\n-\t\tuint8_t auth_iv_len, uint8_t auth_len,\n-\t\tuint8_t cipher_iv_len)\n-{\n-\tuint8_t auth_cipher_key[key_len];\n-\tint status;\n-\tstruct crypto_testsuite_params *ts_params = &testsuite_params;\n-\tstruct crypto_unittest_params *ut_params = &unittest_params;\n+\t/* Append data which is padded to a multiple */\n+\t/* of the algorithms block size */\n+\tplaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 8);\n \n-\tmemcpy(auth_cipher_key, key, key_len);\n+\tut_params->ibuf = create_segmented_mbuf(ts_params->mbuf_pool,\n+\t\t\tplaintext_pad_len, 10, 0);\n \n-\t/* Setup Authentication Parameters */\n-\tut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;\n-\tut_params->auth_xform.auth.op = auth_op;\n-\tut_params->auth_xform.next = &ut_params->cipher_xform;\n-\tut_params->auth_xform.auth.algo = auth_algo;\n-\tut_params->auth_xform.auth.key.length = key_len;\n-\tut_params->auth_xform.auth.key.data = auth_cipher_key;\n-\tut_params->auth_xform.auth.digest_length = auth_len;\n-\t/* Auth IV will be after cipher IV */\n-\tut_params->auth_xform.auth.iv.offset = IV_OFFSET + cipher_iv_len;\n-\tut_params->auth_xform.auth.iv.length = auth_iv_len;\n+\tpktmbuf_write(ut_params->ibuf, 0, plaintext_len, tdata->plaintext.data);\n \n-\t/* Setup Cipher Parameters */\n-\tut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER;\n-\tut_params->cipher_xform.next = NULL;\n-\tut_params->cipher_xform.cipher.algo = cipher_algo;\n-\tut_params->cipher_xform.cipher.op = cipher_op;\n-\tut_params->cipher_xform.cipher.key.data = auth_cipher_key;\n-\tut_params->cipher_xform.cipher.key.length = key_len;\n-\tut_params->cipher_xform.cipher.iv.offset = IV_OFFSET;\n-\tut_params->cipher_xform.cipher.iv.length = cipher_iv_len;\n+\t/* Create KASUMI operation */\n+\tretval = create_wireless_algo_cipher_operation(tdata->cipher_iv.data,\n+\t\t\t\ttdata->cipher_iv.len,\n+\t\t\t\tRTE_ALIGN_CEIL(tdata->validCipherLenInBits.len,\n+\t\t\t\t\t\t8),\n+\t\t\t\ttdata->validCipherOffsetInBits.len);\n+\tif (retval < 0)\n+\t\treturn retval;\n \n-\tdebug_hexdump(stdout, \"key:\", key, key_len);\n+\tut_params->op = process_crypto_request(ts_params->valid_devs[0],\n+\t\t\t\t\t\tut_params->op);\n+\tTEST_ASSERT_NOT_NULL(ut_params->op, \"failed to retrieve obuf\");\n \n-\t/* Create Crypto session*/\n-\tut_params->sess = rte_cryptodev_sym_session_create(\n-\t\t\tts_params->session_mpool);\n-\tTEST_ASSERT_NOT_NULL(ut_params->sess, \"Session creation failed\");\n+\tut_params->obuf = ut_params->op->sym->m_dst;\n \n-\tstatus = rte_cryptodev_sym_session_init(dev_id, ut_params->sess,\n-\t\t\t&ut_params->auth_xform,\n-\t\t\tts_params->session_priv_mpool);\n-\tif (status == -ENOTSUP)\n-\t\treturn status;\n+\tif (ut_params->obuf)\n+\t\tciphertext = rte_pktmbuf_read(ut_params->obuf, 0,\n+\t\t\t\tplaintext_len, buffer);\n+\telse\n+\t\tciphertext = rte_pktmbuf_read(ut_params->ibuf,\n+\t\t\t\ttdata->validCipherOffsetInBits.len >> 3,\n+\t\t\t\tplaintext_len, buffer);\n \n-\tTEST_ASSERT_EQUAL(status, 0, \"session init failed\");\n+\t/* Validate obuf */\n+\tdebug_hexdump(stdout, \"ciphertext:\", ciphertext, plaintext_len);\n \n+\tconst uint8_t *reference_ciphertext = tdata->ciphertext.data +\n+\t\t\t\t(tdata->validCipherOffsetInBits.len >> 3);\n+\t/* Validate obuf */\n+\tTEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(\n+\t\tciphertext,\n+\t\treference_ciphertext,\n+\t\ttdata->validCipherLenInBits.len,\n+\t\t\"KASUMI Ciphertext data not as expected\");\n \treturn 0;\n }\n \n static int\n-create_wireless_algo_hash_operation(const uint8_t *auth_tag,\n-\t\tunsigned int auth_tag_len,\n-\t\tconst uint8_t *iv, unsigned int iv_len,\n-\t\tunsigned int data_pad_len,\n-\t\tenum rte_crypto_auth_operation op,\n-\t\tunsigned int auth_len, unsigned int auth_offset)\n+test_kasumi_encryption_oop(const struct kasumi_test_data *tdata)\n {\n \tstruct crypto_testsuite_params *ts_params = &testsuite_params;\n-\n \tstruct crypto_unittest_params *ut_params = &unittest_params;\n \n-\t/* Generate Crypto op data structure */\n-\tut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,\n-\t\t\tRTE_CRYPTO_OP_TYPE_SYMMETRIC);\n-\tTEST_ASSERT_NOT_NULL(ut_params->op,\n-\t\t\"Failed to allocate pktmbuf offload\");\n+\tint retval;\n+\tuint8_t *plaintext, *ciphertext;\n+\tunsigned plaintext_pad_len;\n+\tunsigned plaintext_len;\n \n-\t/* Set crypto operation data parameters */\n-\trte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);\n+\t/* Verify the capabilities */\n+\tstruct rte_cryptodev_sym_capability_idx cap_idx;\n+\tcap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;\n+\tcap_idx.algo.cipher = RTE_CRYPTO_CIPHER_KASUMI_F8;\n+\tif (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],\n+\t\t\t&cap_idx) == NULL)\n+\t\treturn -ENOTSUP;\n \n-\tstruct rte_crypto_sym_op *sym_op = ut_params->op->sym;\n+\t/* Create KASUMI session */\n+\tretval = create_wireless_algo_cipher_session(ts_params->valid_devs[0],\n+\t\t\t\t\tRTE_CRYPTO_CIPHER_OP_ENCRYPT,\n+\t\t\t\t\tRTE_CRYPTO_CIPHER_KASUMI_F8,\n+\t\t\t\t\ttdata->key.data, tdata->key.len,\n+\t\t\t\t\ttdata->cipher_iv.len);\n+\tif (retval < 0)\n+\t\treturn retval;\n \n-\t/* set crypto operation source mbuf */\n-\tsym_op->m_src = ut_params->ibuf;\n+\tut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);\n+\tut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);\n \n-\t/* iv */\n-\trte_memcpy(rte_crypto_op_ctod_offset(ut_params->op, uint8_t *, IV_OFFSET),\n-\t\t\tiv, iv_len);\n-\t/* digest */\n-\tsym_op->auth.digest.data = (uint8_t *)rte_pktmbuf_append(\n-\t\t\t\t\tut_params->ibuf, auth_tag_len);\n+\t/* Clear mbuf payload */\n+\tmemset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,\n+\t       rte_pktmbuf_tailroom(ut_params->ibuf));\n \n-\tTEST_ASSERT_NOT_NULL(sym_op->auth.digest.data,\n-\t\t\t\t\"no room to append auth tag\");\n-\tut_params->digest = sym_op->auth.digest.data;\n-\tsym_op->auth.digest.phys_addr = rte_pktmbuf_iova_offset(\n-\t\t\tut_params->ibuf, data_pad_len);\n-\tif (op == RTE_CRYPTO_AUTH_OP_GENERATE)\n-\t\tmemset(sym_op->auth.digest.data, 0, auth_tag_len);\n-\telse\n-\t\trte_memcpy(sym_op->auth.digest.data, auth_tag, auth_tag_len);\n+\tplaintext_len = ceil_byte_length(tdata->plaintext.len);\n+\t/* Append data which is padded to a multiple */\n+\t/* of the algorithms block size */\n+\tplaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 8);\n+\tplaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,\n+\t\t\t\tplaintext_pad_len);\n+\trte_pktmbuf_append(ut_params->obuf, plaintext_pad_len);\n+\tmemcpy(plaintext, tdata->plaintext.data, plaintext_len);\n \n-\tdebug_hexdump(stdout, \"digest:\",\n-\t\tsym_op->auth.digest.data,\n-\t\tauth_tag_len);\n+\tdebug_hexdump(stdout, \"plaintext:\", plaintext, plaintext_len);\n \n-\tsym_op->auth.data.length = auth_len;\n-\tsym_op->auth.data.offset = auth_offset;\n+\t/* Create KASUMI operation */\n+\tretval = create_wireless_algo_cipher_operation_oop(\n+\t\t\t\ttdata->cipher_iv.data,\n+\t\t\t\ttdata->cipher_iv.len,\n+\t\t\t\tRTE_ALIGN_CEIL(tdata->validCipherLenInBits.len,\n+\t\t\t\t\t\t8),\n+\t\t\t\ttdata->validCipherOffsetInBits.len);\n+\tif (retval < 0)\n+\t\treturn retval;\n+\n+\tut_params->op = process_crypto_request(ts_params->valid_devs[0],\n+\t\t\t\t\t\tut_params->op);\n+\tTEST_ASSERT_NOT_NULL(ut_params->op, \"failed to retrieve obuf\");\n+\n+\tut_params->obuf = ut_params->op->sym->m_dst;\n+\tif (ut_params->obuf)\n+\t\tciphertext = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *);\n+\telse\n+\t\tciphertext = plaintext +\n+\t\t\t\t(tdata->validCipherOffsetInBits.len >> 3);\n \n+\tdebug_hexdump(stdout, \"ciphertext:\", ciphertext, plaintext_len);\n+\n+\tconst uint8_t *reference_ciphertext = tdata->ciphertext.data +\n+\t\t\t\t(tdata->validCipherOffsetInBits.len >> 3);\n+\t/* Validate obuf */\n+\tTEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(\n+\t\tciphertext,\n+\t\treference_ciphertext,\n+\t\ttdata->validCipherLenInBits.len,\n+\t\t\"KASUMI Ciphertext data not as expected\");\n \treturn 0;\n }\n \n static int\n-create_wireless_cipher_hash_operation(const struct wireless_test_data *tdata,\n-\tenum rte_crypto_auth_operation op)\n+test_kasumi_encryption_oop_sgl(const struct kasumi_test_data *tdata)\n {\n \tstruct crypto_testsuite_params *ts_params = &testsuite_params;\n \tstruct crypto_unittest_params *ut_params = &unittest_params;\n \n-\tconst uint8_t *auth_tag = tdata->digest.data;\n-\tconst unsigned int auth_tag_len = tdata->digest.len;\n-\tunsigned int plaintext_len = ceil_byte_length(tdata->plaintext.len);\n-\tunsigned int data_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16);\n+\tint retval;\n+\tunsigned int plaintext_pad_len;\n+\tunsigned int plaintext_len;\n \n-\tconst uint8_t *cipher_iv = tdata->cipher_iv.data;\n-\tconst uint8_t cipher_iv_len = tdata->cipher_iv.len;\n-\tconst uint8_t *auth_iv = tdata->auth_iv.data;\n-\tconst uint8_t auth_iv_len = tdata->auth_iv.len;\n-\tconst unsigned int cipher_len = tdata->validCipherLenInBits.len;\n-\tconst unsigned int auth_len = tdata->validAuthLenInBits.len;\n+\tconst uint8_t *ciphertext;\n+\tuint8_t buffer[2048];\n \n-\t/* Generate Crypto op data structure */\n-\tut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,\n-\t\t\tRTE_CRYPTO_OP_TYPE_SYMMETRIC);\n-\tTEST_ASSERT_NOT_NULL(ut_params->op,\n-\t\t\t\"Failed to allocate pktmbuf offload\");\n-\t/* Set crypto operation data parameters */\n-\trte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);\n+\tstruct rte_cryptodev_info dev_info;\n \n-\tstruct rte_crypto_sym_op *sym_op = ut_params->op->sym;\n+\t/* Verify the capabilities */\n+\tstruct rte_cryptodev_sym_capability_idx cap_idx;\n+\tcap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;\n+\tcap_idx.algo.cipher = RTE_CRYPTO_CIPHER_KASUMI_F8;\n+\tif (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],\n+\t\t\t&cap_idx) == NULL)\n+\t\treturn -ENOTSUP;\n \n-\t/* set crypto operation source mbuf */\n-\tsym_op->m_src = ut_params->ibuf;\n+\trte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);\n \n-\t/* digest */\n-\tsym_op->auth.digest.data = (uint8_t *)rte_pktmbuf_append(\n-\t\t\tut_params->ibuf, auth_tag_len);\n+\tuint64_t feat_flags = dev_info.feature_flags;\n+\tif (!(feat_flags & RTE_CRYPTODEV_FF_OOP_SGL_IN_SGL_OUT)) {\n+\t\tprintf(\"Device doesn't support out-of-place scatter-gather \"\n+\t\t\t\t\"in both input and output mbufs. \"\n+\t\t\t\t\"Test Skipped.\\n\");\n+\t\treturn -ENOTSUP;\n+\t}\n \n-\tTEST_ASSERT_NOT_NULL(sym_op->auth.digest.data,\n-\t\t\t\"no room to append auth tag\");\n-\tut_params->digest = sym_op->auth.digest.data;\n-\tsym_op->auth.digest.phys_addr = rte_pktmbuf_iova_offset(\n-\t\t\tut_params->ibuf, data_pad_len);\n-\tif (op == RTE_CRYPTO_AUTH_OP_GENERATE)\n-\t\tmemset(sym_op->auth.digest.data, 0, auth_tag_len);\n-\telse\n-\t\trte_memcpy(sym_op->auth.digest.data, auth_tag, auth_tag_len);\n+\t/* Create KASUMI session */\n+\tretval = create_wireless_algo_cipher_session(ts_params->valid_devs[0],\n+\t\t\t\t\tRTE_CRYPTO_CIPHER_OP_ENCRYPT,\n+\t\t\t\t\tRTE_CRYPTO_CIPHER_KASUMI_F8,\n+\t\t\t\t\ttdata->key.data, tdata->key.len,\n+\t\t\t\t\ttdata->cipher_iv.len);\n+\tif (retval < 0)\n+\t\treturn retval;\n \n-\tdebug_hexdump(stdout, \"digest:\",\n-\t\tsym_op->auth.digest.data,\n-\t\tauth_tag_len);\n+\tplaintext_len = ceil_byte_length(tdata->plaintext.len);\n+\t/* Append data which is padded to a multiple */\n+\t/* of the algorithms block size */\n+\tplaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 8);\n \n-\t/* Copy cipher and auth IVs at the end of the crypto operation */\n-\tuint8_t *iv_ptr = rte_crypto_op_ctod_offset(ut_params->op, uint8_t *,\n-\t\t\t\t\t\tIV_OFFSET);\n-\trte_memcpy(iv_ptr, cipher_iv, cipher_iv_len);\n-\tiv_ptr += cipher_iv_len;\n-\trte_memcpy(iv_ptr, auth_iv, auth_iv_len);\n+\tut_params->ibuf = create_segmented_mbuf(ts_params->mbuf_pool,\n+\t\t\tplaintext_pad_len, 10, 0);\n+\tut_params->obuf = create_segmented_mbuf(ts_params->mbuf_pool,\n+\t\t\tplaintext_pad_len, 3, 0);\n \n-\tsym_op->cipher.data.length = cipher_len;\n-\tsym_op->cipher.data.offset = 0;\n-\tsym_op->auth.data.length = auth_len;\n-\tsym_op->auth.data.offset = 0;\n+\t/* Append data which is padded to a multiple */\n+\t/* of the algorithms block size */\n+\tpktmbuf_write(ut_params->ibuf, 0, plaintext_len, tdata->plaintext.data);\n+\n+\t/* Create KASUMI operation */\n+\tretval = create_wireless_algo_cipher_operation_oop(\n+\t\t\t\ttdata->cipher_iv.data,\n+\t\t\t\ttdata->cipher_iv.len,\n+\t\t\t\tRTE_ALIGN_CEIL(tdata->validCipherLenInBits.len,\n+\t\t\t\t\t\t8),\n+\t\t\t\ttdata->validCipherOffsetInBits.len);\n+\tif (retval < 0)\n+\t\treturn retval;\n+\n+\tut_params->op = process_crypto_request(ts_params->valid_devs[0],\n+\t\t\t\t\t\tut_params->op);\n+\tTEST_ASSERT_NOT_NULL(ut_params->op, \"failed to retrieve obuf\");\n+\n+\tut_params->obuf = ut_params->op->sym->m_dst;\n+\tif (ut_params->obuf)\n+\t\tciphertext = rte_pktmbuf_read(ut_params->obuf, 0,\n+\t\t\t\tplaintext_pad_len, buffer);\n+\telse\n+\t\tciphertext = rte_pktmbuf_read(ut_params->ibuf,\n+\t\t\t\ttdata->validCipherOffsetInBits.len >> 3,\n+\t\t\t\tplaintext_pad_len, buffer);\n \n+\tconst uint8_t *reference_ciphertext = tdata->ciphertext.data +\n+\t\t\t\t(tdata->validCipherOffsetInBits.len >> 3);\n+\t/* Validate obuf */\n+\tTEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(\n+\t\tciphertext,\n+\t\treference_ciphertext,\n+\t\ttdata->validCipherLenInBits.len,\n+\t\t\"KASUMI Ciphertext data not as expected\");\n \treturn 0;\n }\n \n-static int\n-create_zuc_cipher_hash_generate_operation(\n-\t\tconst struct wireless_test_data *tdata)\n-{\n-\treturn create_wireless_cipher_hash_operation(tdata,\n-\t\tRTE_CRYPTO_AUTH_OP_GENERATE);\n-}\n \n static int\n-create_wireless_algo_cipher_hash_operation(const uint8_t *auth_tag,\n-\t\tconst unsigned auth_tag_len,\n-\t\tconst uint8_t *auth_iv, uint8_t auth_iv_len,\n-\t\tunsigned data_pad_len,\n-\t\tenum rte_crypto_auth_operation op,\n-\t\tconst uint8_t *cipher_iv, uint8_t cipher_iv_len,\n-\t\tconst unsigned cipher_len, const unsigned cipher_offset,\n-\t\tconst unsigned auth_len, const unsigned auth_offset)\n+test_kasumi_decryption_oop(const struct kasumi_test_data *tdata)\n {\n \tstruct crypto_testsuite_params *ts_params = &testsuite_params;\n \tstruct crypto_unittest_params *ut_params = &unittest_params;\n \n-\tenum rte_crypto_cipher_algorithm cipher_algo =\n-\t\t\tut_params->cipher_xform.cipher.algo;\n-\tenum rte_crypto_auth_algorithm auth_algo =\n-\t\t\tut_params->auth_xform.auth.algo;\n-\n-\t/* Generate Crypto op data structure */\n-\tut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,\n-\t\t\tRTE_CRYPTO_OP_TYPE_SYMMETRIC);\n-\tTEST_ASSERT_NOT_NULL(ut_params->op,\n-\t\t\t\"Failed to allocate pktmbuf offload\");\n-\t/* Set crypto operation data parameters */\n-\trte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);\n-\n-\tstruct rte_crypto_sym_op *sym_op = ut_params->op->sym;\n+\tint retval;\n+\tuint8_t *ciphertext, *plaintext;\n+\tunsigned ciphertext_pad_len;\n+\tunsigned ciphertext_len;\n \n-\t/* set crypto operation source mbuf */\n-\tsym_op->m_src = ut_params->ibuf;\n+\t/* Verify the capabilities */\n+\tstruct rte_cryptodev_sym_capability_idx cap_idx;\n+\tcap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;\n+\tcap_idx.algo.cipher = RTE_CRYPTO_CIPHER_KASUMI_F8;\n+\tif (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],\n+\t\t\t&cap_idx) == NULL)\n+\t\treturn -ENOTSUP;\n \n-\t/* digest */\n-\tsym_op->auth.digest.data = (uint8_t *)rte_pktmbuf_append(\n-\t\t\tut_params->ibuf, auth_tag_len);\n+\t/* Create KASUMI session */\n+\tretval = create_wireless_algo_cipher_session(ts_params->valid_devs[0],\n+\t\t\t\t\tRTE_CRYPTO_CIPHER_OP_DECRYPT,\n+\t\t\t\t\tRTE_CRYPTO_CIPHER_KASUMI_F8,\n+\t\t\t\t\ttdata->key.data, tdata->key.len,\n+\t\t\t\t\ttdata->cipher_iv.len);\n+\tif (retval < 0)\n+\t\treturn retval;\n \n-\tTEST_ASSERT_NOT_NULL(sym_op->auth.digest.data,\n-\t\t\t\"no room to append auth tag\");\n-\tut_params->digest = sym_op->auth.digest.data;\n+\tut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);\n+\tut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);\n \n-\tif (rte_pktmbuf_is_contiguous(ut_params->ibuf)) {\n-\t\tsym_op->auth.digest.phys_addr = rte_pktmbuf_iova_offset(\n-\t\t\t\tut_params->ibuf, data_pad_len);\n-\t} else {\n-\t\tstruct rte_mbuf *m = ut_params->ibuf;\n-\t\tunsigned int offset = data_pad_len;\n+\t/* Clear mbuf payload */\n+\tmemset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,\n+\t       rte_pktmbuf_tailroom(ut_params->ibuf));\n \n-\t\twhile (offset > m->data_len && m->next != NULL) {\n-\t\t\toffset -= m->data_len;\n-\t\t\tm = m->next;\n-\t\t}\n-\t\tsym_op->auth.digest.phys_addr = rte_pktmbuf_iova_offset(\n-\t\t\tm, offset);\n-\t}\n+\tciphertext_len = ceil_byte_length(tdata->ciphertext.len);\n+\t/* Append data which is padded to a multiple */\n+\t/* of the algorithms block size */\n+\tciphertext_pad_len = RTE_ALIGN_CEIL(ciphertext_len, 8);\n+\tciphertext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,\n+\t\t\t\tciphertext_pad_len);\n+\trte_pktmbuf_append(ut_params->obuf, ciphertext_pad_len);\n+\tmemcpy(ciphertext, tdata->ciphertext.data, ciphertext_len);\n \n-\tif (op == RTE_CRYPTO_AUTH_OP_GENERATE)\n-\t\tmemset(sym_op->auth.digest.data, 0, auth_tag_len);\n-\telse\n-\t\trte_memcpy(sym_op->auth.digest.data, auth_tag, auth_tag_len);\n+\tdebug_hexdump(stdout, \"ciphertext:\", ciphertext, ciphertext_len);\n \n-\tdebug_hexdump(stdout, \"digest:\",\n-\t\tsym_op->auth.digest.data,\n-\t\tauth_tag_len);\n+\t/* Create KASUMI operation */\n+\tretval = create_wireless_algo_cipher_operation_oop(\n+\t\t\t\ttdata->cipher_iv.data,\n+\t\t\t\ttdata->cipher_iv.len,\n+\t\t\t\tRTE_ALIGN_CEIL(tdata->validCipherLenInBits.len,\n+\t\t\t\t\t\t8),\n+\t\t\t\ttdata->validCipherOffsetInBits.len);\n+\tif (retval < 0)\n+\t\treturn retval;\n \n-\t/* Copy cipher and auth IVs at the end of the crypto operation */\n-\tuint8_t *iv_ptr = rte_crypto_op_ctod_offset(ut_params->op, uint8_t *,\n-\t\t\t\t\t\tIV_OFFSET);\n-\trte_memcpy(iv_ptr, cipher_iv, cipher_iv_len);\n-\tiv_ptr += cipher_iv_len;\n-\trte_memcpy(iv_ptr, auth_iv, auth_iv_len);\n+\tut_params->op = process_crypto_request(ts_params->valid_devs[0],\n+\t\t\t\t\t\tut_params->op);\n+\tTEST_ASSERT_NOT_NULL(ut_params->op, \"failed to retrieve obuf\");\n \n-\tif (cipher_algo == RTE_CRYPTO_CIPHER_SNOW3G_UEA2 ||\n-\t\tcipher_algo == RTE_CRYPTO_CIPHER_KASUMI_F8 ||\n-\t\tcipher_algo == RTE_CRYPTO_CIPHER_ZUC_EEA3) {\n-\t\tsym_op->cipher.data.length = cipher_len;\n-\t\tsym_op->cipher.data.offset = cipher_offset;\n-\t} else {\n-\t\tsym_op->cipher.data.length = cipher_len >> 3;\n-\t\tsym_op->cipher.data.offset = cipher_offset >> 3;\n-\t}\n+\tut_params->obuf = ut_params->op->sym->m_dst;\n+\tif (ut_params->obuf)\n+\t\tplaintext = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *);\n+\telse\n+\t\tplaintext = ciphertext +\n+\t\t\t\t(tdata->validCipherOffsetInBits.len >> 3);\n \n-\tif (auth_algo == RTE_CRYPTO_AUTH_SNOW3G_UIA2 ||\n-\t\tauth_algo == RTE_CRYPTO_AUTH_KASUMI_F9 ||\n-\t\tauth_algo == RTE_CRYPTO_AUTH_ZUC_EIA3) {\n-\t\tsym_op->auth.data.length = auth_len;\n-\t\tsym_op->auth.data.offset = auth_offset;\n-\t} else {\n-\t\tsym_op->auth.data.length = auth_len >> 3;\n-\t\tsym_op->auth.data.offset = auth_offset >> 3;\n-\t}\n+\tdebug_hexdump(stdout, \"plaintext:\", plaintext, ciphertext_len);\n \n+\tconst uint8_t *reference_plaintext = tdata->plaintext.data +\n+\t\t\t\t(tdata->validCipherOffsetInBits.len >> 3);\n+\t/* Validate obuf */\n+\tTEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(\n+\t\tplaintext,\n+\t\treference_plaintext,\n+\t\ttdata->validCipherLenInBits.len,\n+\t\t\"KASUMI Plaintext data not as expected\");\n \treturn 0;\n }\n \n static int\n-create_wireless_algo_auth_cipher_operation(unsigned int auth_tag_len,\n-\t\tconst uint8_t *cipher_iv, uint8_t cipher_iv_len,\n-\t\tconst uint8_t *auth_iv, uint8_t auth_iv_len,\n-\t\tunsigned int data_pad_len,\n-\t\tunsigned int cipher_len, unsigned int cipher_offset,\n-\t\tunsigned int auth_len, unsigned int auth_offset,\n-\t\tuint8_t op_mode, uint8_t do_sgl)\n+test_kasumi_decryption(const struct kasumi_test_data *tdata)\n {\n \tstruct crypto_testsuite_params *ts_params = &testsuite_params;\n \tstruct crypto_unittest_params *ut_params = &unittest_params;\n \n-\tenum rte_crypto_cipher_algorithm cipher_algo =\n-\t\t\tut_params->cipher_xform.cipher.algo;\n-\tenum rte_crypto_auth_algorithm auth_algo =\n-\t\t\tut_params->auth_xform.auth.algo;\n+\tint retval;\n+\tuint8_t *ciphertext, *plaintext;\n+\tunsigned ciphertext_pad_len;\n+\tunsigned ciphertext_len;\n \n-\t/* Generate Crypto op data structure */\n-\tut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,\n-\t\t\tRTE_CRYPTO_OP_TYPE_SYMMETRIC);\n-\tTEST_ASSERT_NOT_NULL(ut_params->op,\n-\t\t\t\"Failed to allocate pktmbuf offload\");\n+\t/* Verify the capabilities */\n+\tstruct rte_cryptodev_sym_capability_idx cap_idx;\n+\tcap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;\n+\tcap_idx.algo.cipher = RTE_CRYPTO_CIPHER_KASUMI_F8;\n+\tif (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],\n+\t\t\t&cap_idx) == NULL)\n+\t\treturn -ENOTSUP;\n \n-\t/* Set crypto operation data parameters */\n-\trte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);\n+\t/* Create KASUMI session */\n+\tretval = create_wireless_algo_cipher_session(ts_params->valid_devs[0],\n+\t\t\t\t\tRTE_CRYPTO_CIPHER_OP_DECRYPT,\n+\t\t\t\t\tRTE_CRYPTO_CIPHER_KASUMI_F8,\n+\t\t\t\t\ttdata->key.data, tdata->key.len,\n+\t\t\t\t\ttdata->cipher_iv.len);\n+\tif (retval < 0)\n+\t\treturn retval;\n \n-\tstruct rte_crypto_sym_op *sym_op = ut_params->op->sym;\n+\tut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);\n \n-\t/* set crypto operation mbufs */\n-\tsym_op->m_src = ut_params->ibuf;\n-\tif (op_mode == OUT_OF_PLACE)\n-\t\tsym_op->m_dst = ut_params->obuf;\n+\t/* Clear mbuf payload */\n+\tmemset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,\n+\t       rte_pktmbuf_tailroom(ut_params->ibuf));\n \n-\t/* digest */\n-\tif (!do_sgl) {\n-\t\tsym_op->auth.digest.data = rte_pktmbuf_mtod_offset(\n-\t\t\t(op_mode == IN_PLACE ?\n-\t\t\t\tut_params->ibuf : ut_params->obuf),\n-\t\t\tuint8_t *, data_pad_len);\n-\t\tsym_op->auth.digest.phys_addr = rte_pktmbuf_iova_offset(\n-\t\t\t(op_mode == IN_PLACE ?\n-\t\t\t\tut_params->ibuf : ut_params->obuf),\n-\t\t\tdata_pad_len);\n-\t\tmemset(sym_op->auth.digest.data, 0, auth_tag_len);\n-\t} else {\n-\t\tuint16_t remaining_off = (auth_offset >> 3) + (auth_len >> 3);\n-\t\tstruct rte_mbuf *sgl_buf = (op_mode == IN_PLACE ?\n-\t\t\t\tsym_op->m_src : sym_op->m_dst);\n-\t\twhile (remaining_off >= rte_pktmbuf_data_len(sgl_buf)) {\n-\t\t\tremaining_off -= rte_pktmbuf_data_len(sgl_buf);\n-\t\t\tsgl_buf = sgl_buf->next;\n-\t\t}\n-\t\tsym_op->auth.digest.data = rte_pktmbuf_mtod_offset(sgl_buf,\n-\t\t\t\tuint8_t *, remaining_off);\n-\t\tsym_op->auth.digest.phys_addr = rte_pktmbuf_iova_offset(sgl_buf,\n-\t\t\t\tremaining_off);\n-\t\tmemset(sym_op->auth.digest.data, 0, remaining_off);\n-\t\twhile (sgl_buf->next != NULL) {\n-\t\t\tmemset(rte_pktmbuf_mtod(sgl_buf, uint8_t *),\n-\t\t\t\t0, rte_pktmbuf_data_len(sgl_buf));\n-\t\t\tsgl_buf = sgl_buf->next;\n-\t\t}\n-\t}\n+\tciphertext_len = ceil_byte_length(tdata->ciphertext.len);\n+\t/* Append data which is padded to a multiple */\n+\t/* of the algorithms block size */\n+\tciphertext_pad_len = RTE_ALIGN_CEIL(ciphertext_len, 8);\n+\tciphertext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,\n+\t\t\t\tciphertext_pad_len);\n+\tmemcpy(ciphertext, tdata->ciphertext.data, ciphertext_len);\n \n-\t/* Copy cipher and auth IVs at the end of the crypto operation */\n-\tuint8_t *iv_ptr = rte_crypto_op_ctod_offset(\n-\t\t\tut_params->op, uint8_t *, IV_OFFSET);\n+\tdebug_hexdump(stdout, \"ciphertext:\", ciphertext, ciphertext_len);\n \n-\trte_memcpy(iv_ptr, cipher_iv, cipher_iv_len);\n-\tiv_ptr += cipher_iv_len;\n-\trte_memcpy(iv_ptr, auth_iv, auth_iv_len);\n+\t/* Create KASUMI operation */\n+\tretval = create_wireless_algo_cipher_operation(tdata->cipher_iv.data,\n+\t\t\t\t\ttdata->cipher_iv.len,\n+\t\t\t\t\ttdata->ciphertext.len,\n+\t\t\t\t\ttdata->validCipherOffsetInBits.len);\n+\tif (retval < 0)\n+\t\treturn retval;\n \n-\tif (cipher_algo == RTE_CRYPTO_CIPHER_SNOW3G_UEA2 ||\n-\t\tcipher_algo == RTE_CRYPTO_CIPHER_KASUMI_F8 ||\n-\t\tcipher_algo == RTE_CRYPTO_CIPHER_ZUC_EEA3) {\n-\t\tsym_op->cipher.data.length = cipher_len;\n-\t\tsym_op->cipher.data.offset = cipher_offset;\n-\t} else {\n-\t\tsym_op->cipher.data.length = cipher_len >> 3;\n-\t\tsym_op->cipher.data.offset = cipher_offset >> 3;\n-\t}\n+\tut_params->op = process_crypto_request(ts_params->valid_devs[0],\n+\t\t\t\t\t\tut_params->op);\n+\tTEST_ASSERT_NOT_NULL(ut_params->op, \"failed to retrieve obuf\");\n \n-\tif (auth_algo == RTE_CRYPTO_AUTH_SNOW3G_UIA2 ||\n-\t\tauth_algo == RTE_CRYPTO_AUTH_KASUMI_F9 ||\n-\t\tauth_algo == RTE_CRYPTO_AUTH_ZUC_EIA3) {\n-\t\tsym_op->auth.data.length = auth_len;\n-\t\tsym_op->auth.data.offset = auth_offset;\n-\t} else {\n-\t\tsym_op->auth.data.length = auth_len >> 3;\n-\t\tsym_op->auth.data.offset = auth_offset >> 3;\n-\t}\n+\tut_params->obuf = ut_params->op->sym->m_dst;\n+\tif (ut_params->obuf)\n+\t\tplaintext = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *);\n+\telse\n+\t\tplaintext = ciphertext +\n+\t\t\t\t(tdata->validCipherOffsetInBits.len >> 3);\n \n+\tdebug_hexdump(stdout, \"plaintext:\", plaintext, ciphertext_len);\n+\n+\tconst uint8_t *reference_plaintext = tdata->plaintext.data +\n+\t\t\t\t(tdata->validCipherOffsetInBits.len >> 3);\n+\t/* Validate obuf */\n+\tTEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(\n+\t\tplaintext,\n+\t\treference_plaintext,\n+\t\ttdata->validCipherLenInBits.len,\n+\t\t\"KASUMI Plaintext data not as expected\");\n \treturn 0;\n }\n \n static int\n-test_snow3g_authentication(const struct snow3g_hash_test_data *tdata)\n+test_snow3g_encryption(const struct snow3g_test_data *tdata)\n {\n \tstruct crypto_testsuite_params *ts_params = &testsuite_params;\n \tstruct crypto_unittest_params *ut_params = &unittest_params;\n \n \tint retval;\n+\tuint8_t *plaintext, *ciphertext;\n \tunsigned plaintext_pad_len;\n \tunsigned plaintext_len;\n-\tuint8_t *plaintext;\n+\n+\t/* Verify the capabilities */\n+\tstruct rte_cryptodev_sym_capability_idx cap_idx;\n+\tcap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;\n+\tcap_idx.algo.cipher = RTE_CRYPTO_CIPHER_SNOW3G_UEA2;\n+\tif (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],\n+\t\t\t&cap_idx) == NULL)\n+\t\treturn -ENOTSUP;\n \n \t/* Create SNOW 3G session */\n-\tretval = create_wireless_algo_hash_session(ts_params->valid_devs[0],\n-\t\t\ttdata->key.data, tdata->key.len,\n-\t\t\ttdata->auth_iv.len, tdata->digest.len,\n-\t\t\tRTE_CRYPTO_AUTH_OP_GENERATE,\n-\t\t\tRTE_CRYPTO_AUTH_SNOW3G_UIA2);\n+\tretval = create_wireless_algo_cipher_session(ts_params->valid_devs[0],\n+\t\t\t\t\tRTE_CRYPTO_CIPHER_OP_ENCRYPT,\n+\t\t\t\t\tRTE_CRYPTO_CIPHER_SNOW3G_UEA2,\n+\t\t\t\t\ttdata->key.data, tdata->key.len,\n+\t\t\t\t\ttdata->cipher_iv.len);\n \tif (retval < 0)\n \t\treturn retval;\n \n-\t/* alloc mbuf and set payload */\n \tut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);\n \n+\t/* Clear mbuf payload */\n \tmemset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,\n-\trte_pktmbuf_tailroom(ut_params->ibuf));\n+\t       rte_pktmbuf_tailroom(ut_params->ibuf));\n \n \tplaintext_len = ceil_byte_length(tdata->plaintext.len);\n \t/* Append data which is padded to a multiple of */\n@@ -3185,56 +3290,77 @@ test_snow3g_authentication(const struct snow3g_hash_test_data *tdata)\n \t\t\t\tplaintext_pad_len);\n \tmemcpy(plaintext, tdata->plaintext.data, plaintext_len);\n \n+\tdebug_hexdump(stdout, \"plaintext:\", plaintext, plaintext_len);\n+\n \t/* Create SNOW 3G operation */\n-\tretval = create_wireless_algo_hash_operation(NULL, tdata->digest.len,\n-\t\t\ttdata->auth_iv.data, tdata->auth_iv.len,\n-\t\t\tplaintext_pad_len, RTE_CRYPTO_AUTH_OP_GENERATE,\n-\t\t\ttdata->validAuthLenInBits.len,\n-\t\t\t0);\n+\tretval = create_wireless_algo_cipher_operation(tdata->cipher_iv.data,\n+\t\t\t\t\ttdata->cipher_iv.len,\n+\t\t\t\t\ttdata->validCipherLenInBits.len,\n+\t\t\t\t\t0);\n \tif (retval < 0)\n \t\treturn retval;\n \n \tut_params->op = process_crypto_request(ts_params->valid_devs[0],\n-\t\t\t\tut_params->op);\n-\tut_params->obuf = ut_params->op->sym->m_src;\n+\t\t\t\t\t\tut_params->op);\n \tTEST_ASSERT_NOT_NULL(ut_params->op, \"failed to retrieve obuf\");\n-\tut_params->digest = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *)\n-\t\t\t+ plaintext_pad_len;\n \n-\t/* Validate obuf */\n-\tTEST_ASSERT_BUFFERS_ARE_EQUAL(\n-\tut_params->digest,\n-\ttdata->digest.data,\n-\tDIGEST_BYTE_LENGTH_SNOW3G_UIA2,\n-\t\"SNOW 3G Generated auth tag not as expected\");\n+\tut_params->obuf = ut_params->op->sym->m_dst;\n+\tif (ut_params->obuf)\n+\t\tciphertext = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *);\n+\telse\n+\t\tciphertext = plaintext;\n+\n+\tdebug_hexdump(stdout, \"ciphertext:\", ciphertext, plaintext_len);\n \n+\t/* Validate obuf */\n+\tTEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(\n+\t\tciphertext,\n+\t\ttdata->ciphertext.data,\n+\t\ttdata->validDataLenInBits.len,\n+\t\t\"SNOW 3G Ciphertext data not as expected\");\n \treturn 0;\n }\n \n+\n static int\n-test_snow3g_authentication_verify(const struct snow3g_hash_test_data *tdata)\n+test_snow3g_encryption_oop(const struct snow3g_test_data *tdata)\n {\n \tstruct crypto_testsuite_params *ts_params = &testsuite_params;\n \tstruct crypto_unittest_params *ut_params = &unittest_params;\n+\tuint8_t *plaintext, *ciphertext;\n \n \tint retval;\n \tunsigned plaintext_pad_len;\n \tunsigned plaintext_len;\n-\tuint8_t *plaintext;\n+\n+\t/* Verify the capabilities */\n+\tstruct rte_cryptodev_sym_capability_idx cap_idx;\n+\tcap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;\n+\tcap_idx.algo.cipher = RTE_CRYPTO_CIPHER_SNOW3G_UEA2;\n+\tif (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],\n+\t\t\t&cap_idx) == NULL)\n+\t\treturn -ENOTSUP;\n \n \t/* Create SNOW 3G session */\n-\tretval = create_wireless_algo_hash_session(ts_params->valid_devs[0],\n-\t\t\t\ttdata->key.data, tdata->key.len,\n-\t\t\t\ttdata->auth_iv.len, tdata->digest.len,\n-\t\t\t\tRTE_CRYPTO_AUTH_OP_VERIFY,\n-\t\t\t\tRTE_CRYPTO_AUTH_SNOW3G_UIA2);\n+\tretval = create_wireless_algo_cipher_session(ts_params->valid_devs[0],\n+\t\t\t\t\tRTE_CRYPTO_CIPHER_OP_ENCRYPT,\n+\t\t\t\t\tRTE_CRYPTO_CIPHER_SNOW3G_UEA2,\n+\t\t\t\t\ttdata->key.data, tdata->key.len,\n+\t\t\t\t\ttdata->cipher_iv.len);\n \tif (retval < 0)\n \t\treturn retval;\n-\t/* alloc mbuf and set payload */\n+\n \tut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);\n+\tut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);\n+\n+\tTEST_ASSERT_NOT_NULL(ut_params->ibuf,\n+\t\t\t\"Failed to allocate input buffer in mempool\");\n+\tTEST_ASSERT_NOT_NULL(ut_params->obuf,\n+\t\t\t\"Failed to allocate output buffer in mempool\");\n \n+\t/* Clear mbuf payload */\n \tmemset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,\n-\trte_pktmbuf_tailroom(ut_params->ibuf));\n+\t       rte_pktmbuf_tailroom(ut_params->ibuf));\n \n \tplaintext_len = ceil_byte_length(tdata->plaintext.len);\n \t/* Append data which is padded to a multiple of */\n@@ -3242,1176 +3368,1486 @@ test_snow3g_authentication_verify(const struct snow3g_hash_test_data *tdata)\n \tplaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16);\n \tplaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,\n \t\t\t\tplaintext_pad_len);\n+\trte_pktmbuf_append(ut_params->obuf, plaintext_pad_len);\n \tmemcpy(plaintext, tdata->plaintext.data, plaintext_len);\n \n+\tdebug_hexdump(stdout, \"plaintext:\", plaintext, plaintext_len);\n+\n \t/* Create SNOW 3G operation */\n-\tretval = create_wireless_algo_hash_operation(tdata->digest.data,\n-\t\t\ttdata->digest.len,\n-\t\t\ttdata->auth_iv.data, tdata->auth_iv.len,\n-\t\t\tplaintext_pad_len,\n-\t\t\tRTE_CRYPTO_AUTH_OP_VERIFY,\n-\t\t\ttdata->validAuthLenInBits.len,\n-\t\t\t0);\n+\tretval = create_wireless_algo_cipher_operation_oop(\n+\t\t\t\t\ttdata->cipher_iv.data,\n+\t\t\t\t\ttdata->cipher_iv.len,\n+\t\t\t\t\ttdata->validCipherLenInBits.len,\n+\t\t\t\t\t0);\n \tif (retval < 0)\n \t\treturn retval;\n \n \tut_params->op = process_crypto_request(ts_params->valid_devs[0],\n-\t\t\t\tut_params->op);\n+\t\t\t\t\t\tut_params->op);\n \tTEST_ASSERT_NOT_NULL(ut_params->op, \"failed to retrieve obuf\");\n-\tut_params->obuf = ut_params->op->sym->m_src;\n-\tut_params->digest = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *)\n-\t\t\t\t+ plaintext_pad_len;\n \n-\t/* Validate obuf */\n-\tif (ut_params->op->status == RTE_CRYPTO_OP_STATUS_SUCCESS)\n-\t\treturn 0;\n+\tut_params->obuf = ut_params->op->sym->m_dst;\n+\tif (ut_params->obuf)\n+\t\tciphertext = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *);\n \telse\n-\t\treturn -1;\n+\t\tciphertext = plaintext;\n+\n+\tdebug_hexdump(stdout, \"ciphertext:\", ciphertext, plaintext_len);\n \n+\t/* Validate obuf */\n+\tTEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(\n+\t\tciphertext,\n+\t\ttdata->ciphertext.data,\n+\t\ttdata->validDataLenInBits.len,\n+\t\t\"SNOW 3G Ciphertext data not as expected\");\n \treturn 0;\n }\n \n static int\n-test_kasumi_authentication(const struct kasumi_hash_test_data *tdata)\n+test_snow3g_encryption_oop_sgl(const struct snow3g_test_data *tdata)\n {\n \tstruct crypto_testsuite_params *ts_params = &testsuite_params;\n \tstruct crypto_unittest_params *ut_params = &unittest_params;\n \n \tint retval;\n-\tunsigned plaintext_pad_len;\n-\tunsigned plaintext_len;\n-\tuint8_t *plaintext;\n+\tunsigned int plaintext_pad_len;\n+\tunsigned int plaintext_len;\n+\tuint8_t buffer[10000];\n+\tconst uint8_t *ciphertext;\n \n-\t/* Create KASUMI session */\n-\tretval = create_wireless_algo_hash_session(ts_params->valid_devs[0],\n-\t\t\ttdata->key.data, tdata->key.len,\n-\t\t\t0, tdata->digest.len,\n-\t\t\tRTE_CRYPTO_AUTH_OP_GENERATE,\n-\t\t\tRTE_CRYPTO_AUTH_KASUMI_F9);\n-\tif (retval < 0)\n-\t\treturn retval;\n+\tstruct rte_cryptodev_info dev_info;\n \n-\t/* alloc mbuf and set payload */\n-\tut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);\n+\t/* Verify the capabilities */\n+\tstruct rte_cryptodev_sym_capability_idx cap_idx;\n+\tcap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;\n+\tcap_idx.algo.cipher = RTE_CRYPTO_CIPHER_SNOW3G_UEA2;\n+\tif (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],\n+\t\t\t&cap_idx) == NULL)\n+\t\treturn -ENOTSUP;\n \n-\tmemset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,\n-\trte_pktmbuf_tailroom(ut_params->ibuf));\n+\trte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);\n \n-\tplaintext_len = ceil_byte_length(tdata->plaintext.len);\n-\t/* Append data which is padded to a multiple of */\n-\t/* the algorithms block size */\n-\tplaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 8);\n-\tplaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,\n-\t\t\t\tplaintext_pad_len);\n-\tmemcpy(plaintext, tdata->plaintext.data, plaintext_len);\n+\tuint64_t feat_flags = dev_info.feature_flags;\n \n-\t/* Create KASUMI operation */\n-\tretval = create_wireless_algo_hash_operation(NULL, tdata->digest.len,\n-\t\t\tNULL, 0,\n-\t\t\tplaintext_pad_len, RTE_CRYPTO_AUTH_OP_GENERATE,\n-\t\t\ttdata->plaintext.len,\n-\t\t\t0);\n+\tif (!(feat_flags & RTE_CRYPTODEV_FF_OOP_SGL_IN_SGL_OUT)) {\n+\t\tprintf(\"Device doesn't support out-of-place scatter-gather \"\n+\t\t\t\t\"in both input and output mbufs. \"\n+\t\t\t\t\"Test Skipped.\\n\");\n+\t\treturn -ENOTSUP;\n+\t}\n+\n+\t/* Create SNOW 3G session */\n+\tretval = create_wireless_algo_cipher_session(ts_params->valid_devs[0],\n+\t\t\t\t\tRTE_CRYPTO_CIPHER_OP_ENCRYPT,\n+\t\t\t\t\tRTE_CRYPTO_CIPHER_SNOW3G_UEA2,\n+\t\t\t\t\ttdata->key.data, tdata->key.len,\n+\t\t\t\t\ttdata->cipher_iv.len);\n \tif (retval < 0)\n \t\treturn retval;\n \n-\tut_params->op = process_crypto_request(ts_params->valid_devs[0],\n-\t\t\t\tut_params->op);\n-\tut_params->obuf = ut_params->op->sym->m_src;\n-\tTEST_ASSERT_NOT_NULL(ut_params->op, \"failed to retrieve obuf\");\n-\tut_params->digest = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *)\n-\t\t\t+ plaintext_pad_len;\n+\tplaintext_len = ceil_byte_length(tdata->plaintext.len);\n+\t/* Append data which is padded to a multiple of */\n+\t/* the algorithms block size */\n+\tplaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16);\n \n-\t/* Validate obuf */\n-\tTEST_ASSERT_BUFFERS_ARE_EQUAL(\n-\tut_params->digest,\n-\ttdata->digest.data,\n-\tDIGEST_BYTE_LENGTH_KASUMI_F9,\n-\t\"KASUMI Generated auth tag not as expected\");\n+\tut_params->ibuf = create_segmented_mbuf(ts_params->mbuf_pool,\n+\t\t\tplaintext_pad_len, 10, 0);\n+\tut_params->obuf = create_segmented_mbuf(ts_params->mbuf_pool,\n+\t\t\tplaintext_pad_len, 3, 0);\n+\n+\tTEST_ASSERT_NOT_NULL(ut_params->ibuf,\n+\t\t\t\"Failed to allocate input buffer in mempool\");\n+\tTEST_ASSERT_NOT_NULL(ut_params->obuf,\n+\t\t\t\"Failed to allocate output buffer in mempool\");\n+\n+\tpktmbuf_write(ut_params->ibuf, 0, plaintext_len, tdata->plaintext.data);\n+\n+\t/* Create SNOW 3G operation */\n+\tretval = create_wireless_algo_cipher_operation_oop(\n+\t\t\t\t\ttdata->cipher_iv.data,\n+\t\t\t\t\ttdata->cipher_iv.len,\n+\t\t\t\t\ttdata->validCipherLenInBits.len,\n+\t\t\t\t\t0);\n+\tif (retval < 0)\n+\t\treturn retval;\n+\n+\tut_params->op = process_crypto_request(ts_params->valid_devs[0],\n+\t\t\t\t\t\tut_params->op);\n+\tTEST_ASSERT_NOT_NULL(ut_params->op, \"failed to retrieve obuf\");\n+\n+\tut_params->obuf = ut_params->op->sym->m_dst;\n+\tif (ut_params->obuf)\n+\t\tciphertext = rte_pktmbuf_read(ut_params->obuf, 0,\n+\t\t\t\tplaintext_len, buffer);\n+\telse\n+\t\tciphertext = rte_pktmbuf_read(ut_params->ibuf, 0,\n+\t\t\t\tplaintext_len, buffer);\n+\n+\tdebug_hexdump(stdout, \"ciphertext:\", ciphertext, plaintext_len);\n+\n+\t/* Validate obuf */\n+\tTEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(\n+\t\tciphertext,\n+\t\ttdata->ciphertext.data,\n+\t\ttdata->validDataLenInBits.len,\n+\t\t\"SNOW 3G Ciphertext data not as expected\");\n \n \treturn 0;\n }\n \n+/* Shift right a buffer by \"offset\" bits, \"offset\" < 8 */\n+static void\n+buffer_shift_right(uint8_t *buffer, uint32_t length, uint8_t offset)\n+{\n+\tuint8_t curr_byte, prev_byte;\n+\tuint32_t length_in_bytes = ceil_byte_length(length + offset);\n+\tuint8_t lower_byte_mask = (1 << offset) - 1;\n+\tunsigned i;\n+\n+\tprev_byte = buffer[0];\n+\tbuffer[0] >>= offset;\n+\n+\tfor (i = 1; i < length_in_bytes; i++) {\n+\t\tcurr_byte = buffer[i];\n+\t\tbuffer[i] = ((prev_byte & lower_byte_mask) << (8 - offset)) |\n+\t\t\t\t(curr_byte >> offset);\n+\t\tprev_byte = curr_byte;\n+\t}\n+}\n+\n static int\n-test_kasumi_authentication_verify(const struct kasumi_hash_test_data *tdata)\n+test_snow3g_encryption_offset_oop(const struct snow3g_test_data *tdata)\n {\n \tstruct crypto_testsuite_params *ts_params = &testsuite_params;\n \tstruct crypto_unittest_params *ut_params = &unittest_params;\n-\n+\tuint8_t *plaintext, *ciphertext;\n \tint retval;\n-\tunsigned plaintext_pad_len;\n-\tunsigned plaintext_len;\n-\tuint8_t *plaintext;\n+\tuint32_t plaintext_len;\n+\tuint32_t plaintext_pad_len;\n+\tuint8_t extra_offset = 4;\n+\tuint8_t *expected_ciphertext_shifted;\n \n-\t/* Create KASUMI session */\n-\tretval = create_wireless_algo_hash_session(ts_params->valid_devs[0],\n-\t\t\t\ttdata->key.data, tdata->key.len,\n-\t\t\t\t0, tdata->digest.len,\n-\t\t\t\tRTE_CRYPTO_AUTH_OP_VERIFY,\n-\t\t\t\tRTE_CRYPTO_AUTH_KASUMI_F9);\n+\t/* QAT PMD supports byte-aligned data only */\n+\tif (gbl_driver_id == rte_cryptodev_driver_id_get(\n+\t\t\tRTE_STR(CRYPTODEV_NAME_QAT_SYM_PMD)))\n+\t\treturn -ENOTSUP;\n+\n+\t/* Verify the capabilities */\n+\tstruct rte_cryptodev_sym_capability_idx cap_idx;\n+\tcap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;\n+\tcap_idx.algo.cipher = RTE_CRYPTO_CIPHER_SNOW3G_UEA2;\n+\tif (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],\n+\t\t\t&cap_idx) == NULL)\n+\t\treturn -ENOTSUP;\n+\n+\t/* Create SNOW 3G session */\n+\tretval = create_wireless_algo_cipher_session(ts_params->valid_devs[0],\n+\t\t\t\t\tRTE_CRYPTO_CIPHER_OP_ENCRYPT,\n+\t\t\t\t\tRTE_CRYPTO_CIPHER_SNOW3G_UEA2,\n+\t\t\t\t\ttdata->key.data, tdata->key.len,\n+\t\t\t\t\ttdata->cipher_iv.len);\n \tif (retval < 0)\n \t\treturn retval;\n-\t/* alloc mbuf and set payload */\n+\n \tut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);\n+\tut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);\n \n+\tTEST_ASSERT_NOT_NULL(ut_params->ibuf,\n+\t\t\t\"Failed to allocate input buffer in mempool\");\n+\tTEST_ASSERT_NOT_NULL(ut_params->obuf,\n+\t\t\t\"Failed to allocate output buffer in mempool\");\n+\n+\t/* Clear mbuf payload */\n \tmemset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,\n-\trte_pktmbuf_tailroom(ut_params->ibuf));\n+\t       rte_pktmbuf_tailroom(ut_params->ibuf));\n \n-\tplaintext_len = ceil_byte_length(tdata->plaintext.len);\n-\t/* Append data which is padded to a multiple */\n-\t/* of the algorithms block size */\n-\tplaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 8);\n-\tplaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,\n-\t\t\t\tplaintext_pad_len);\n-\tmemcpy(plaintext, tdata->plaintext.data, plaintext_len);\n+\tplaintext_len = ceil_byte_length(tdata->plaintext.len + extra_offset);\n+\t/*\n+\t * Append data which is padded to a\n+\t * multiple of the algorithms block size\n+\t */\n+\tplaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16);\n \n-\t/* Create KASUMI operation */\n-\tretval = create_wireless_algo_hash_operation(tdata->digest.data,\n-\t\t\ttdata->digest.len,\n-\t\t\tNULL, 0,\n-\t\t\tplaintext_pad_len,\n-\t\t\tRTE_CRYPTO_AUTH_OP_VERIFY,\n-\t\t\ttdata->plaintext.len,\n-\t\t\t0);\n+\tplaintext = (uint8_t *) rte_pktmbuf_append(ut_params->ibuf,\n+\t\t\t\t\t\tplaintext_pad_len);\n+\n+\trte_pktmbuf_append(ut_params->obuf, plaintext_pad_len);\n+\n+\tmemcpy(plaintext, tdata->plaintext.data, (tdata->plaintext.len >> 3));\n+\tbuffer_shift_right(plaintext, tdata->plaintext.len, extra_offset);\n+\n+#ifdef RTE_APP_TEST_DEBUG\n+\trte_hexdump(stdout, \"plaintext:\", plaintext, tdata->plaintext.len);\n+#endif\n+\t/* Create SNOW 3G operation */\n+\tretval = create_wireless_algo_cipher_operation_oop(\n+\t\t\t\t\ttdata->cipher_iv.data,\n+\t\t\t\t\ttdata->cipher_iv.len,\n+\t\t\t\t\ttdata->validCipherLenInBits.len,\n+\t\t\t\t\textra_offset);\n \tif (retval < 0)\n \t\treturn retval;\n \n \tut_params->op = process_crypto_request(ts_params->valid_devs[0],\n-\t\t\t\tut_params->op);\n+\t\t\t\t\t\tut_params->op);\n \tTEST_ASSERT_NOT_NULL(ut_params->op, \"failed to retrieve obuf\");\n-\tut_params->obuf = ut_params->op->sym->m_src;\n-\tut_params->digest = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *)\n-\t\t\t\t+ plaintext_pad_len;\n \n-\t/* Validate obuf */\n-\tif (ut_params->op->status == RTE_CRYPTO_OP_STATUS_SUCCESS)\n-\t\treturn 0;\n+\tut_params->obuf = ut_params->op->sym->m_dst;\n+\tif (ut_params->obuf)\n+\t\tciphertext = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *);\n \telse\n-\t\treturn -1;\n+\t\tciphertext = plaintext;\n \n-\treturn 0;\n-}\n+#ifdef RTE_APP_TEST_DEBUG\n+\trte_hexdump(stdout, \"ciphertext:\", ciphertext, plaintext_len);\n+#endif\n \n-static int\n-test_snow3g_hash_generate_test_case_1(void)\n-{\n-\treturn test_snow3g_authentication(&snow3g_hash_test_case_1);\n-}\n+\texpected_ciphertext_shifted = rte_malloc(NULL, plaintext_len, 8);\n \n-static int\n-test_snow3g_hash_generate_test_case_2(void)\n-{\n-\treturn test_snow3g_authentication(&snow3g_hash_test_case_2);\n-}\n+\tTEST_ASSERT_NOT_NULL(expected_ciphertext_shifted,\n+\t\t\t\"failed to reserve memory for ciphertext shifted\\n\");\n \n-static int\n-test_snow3g_hash_generate_test_case_3(void)\n-{\n-\treturn test_snow3g_authentication(&snow3g_hash_test_case_3);\n+\tmemcpy(expected_ciphertext_shifted, tdata->ciphertext.data,\n+\t\t\tceil_byte_length(tdata->ciphertext.len));\n+\tbuffer_shift_right(expected_ciphertext_shifted, tdata->ciphertext.len,\n+\t\t\textra_offset);\n+\t/* Validate obuf */\n+\tTEST_ASSERT_BUFFERS_ARE_EQUAL_BIT_OFFSET(\n+\t\tciphertext,\n+\t\texpected_ciphertext_shifted,\n+\t\ttdata->validDataLenInBits.len,\n+\t\textra_offset,\n+\t\t\"SNOW 3G Ciphertext data not as expected\");\n+\treturn 0;\n }\n \n-static int\n-test_snow3g_hash_generate_test_case_4(void)\n+static int test_snow3g_decryption(const struct snow3g_test_data *tdata)\n {\n-\treturn test_snow3g_authentication(&snow3g_hash_test_case_4);\n-}\n+\tstruct crypto_testsuite_params *ts_params = &testsuite_params;\n+\tstruct crypto_unittest_params *ut_params = &unittest_params;\n \n-static int\n-test_snow3g_hash_generate_test_case_5(void)\n-{\n-\treturn test_snow3g_authentication(&snow3g_hash_test_case_5);\n-}\n+\tint retval;\n \n-static int\n-test_snow3g_hash_generate_test_case_6(void)\n-{\n-\treturn test_snow3g_authentication(&snow3g_hash_test_case_6);\n-}\n+\tuint8_t *plaintext, *ciphertext;\n+\tunsigned ciphertext_pad_len;\n+\tunsigned ciphertext_len;\n \n-static int\n-test_snow3g_hash_verify_test_case_1(void)\n-{\n-\treturn test_snow3g_authentication_verify(&snow3g_hash_test_case_1);\n+\t/* Verify the capabilities */\n+\tstruct rte_cryptodev_sym_capability_idx cap_idx;\n+\tcap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;\n+\tcap_idx.algo.cipher = RTE_CRYPTO_CIPHER_SNOW3G_UEA2;\n+\tif (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],\n+\t\t\t&cap_idx) == NULL)\n+\t\treturn -ENOTSUP;\n \n-}\n+\t/* Create SNOW 3G session */\n+\tretval = create_wireless_algo_cipher_session(ts_params->valid_devs[0],\n+\t\t\t\t\tRTE_CRYPTO_CIPHER_OP_DECRYPT,\n+\t\t\t\t\tRTE_CRYPTO_CIPHER_SNOW3G_UEA2,\n+\t\t\t\t\ttdata->key.data, tdata->key.len,\n+\t\t\t\t\ttdata->cipher_iv.len);\n+\tif (retval < 0)\n+\t\treturn retval;\n \n-static int\n-test_snow3g_hash_verify_test_case_2(void)\n-{\n-\treturn test_snow3g_authentication_verify(&snow3g_hash_test_case_2);\n-}\n+\tut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);\n \n-static int\n-test_snow3g_hash_verify_test_case_3(void)\n-{\n-\treturn test_snow3g_authentication_verify(&snow3g_hash_test_case_3);\n-}\n+\t/* Clear mbuf payload */\n+\tmemset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,\n+\t       rte_pktmbuf_tailroom(ut_params->ibuf));\n \n-static int\n-test_snow3g_hash_verify_test_case_4(void)\n-{\n-\treturn test_snow3g_authentication_verify(&snow3g_hash_test_case_4);\n-}\n+\tciphertext_len = ceil_byte_length(tdata->ciphertext.len);\n+\t/* Append data which is padded to a multiple of */\n+\t/* the algorithms block size */\n+\tciphertext_pad_len = RTE_ALIGN_CEIL(ciphertext_len, 16);\n+\tciphertext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,\n+\t\t\t\tciphertext_pad_len);\n+\tmemcpy(ciphertext, tdata->ciphertext.data, ciphertext_len);\n \n-static int\n-test_snow3g_hash_verify_test_case_5(void)\n-{\n-\treturn test_snow3g_authentication_verify(&snow3g_hash_test_case_5);\n-}\n-\n-static int\n-test_snow3g_hash_verify_test_case_6(void)\n-{\n-\treturn test_snow3g_authentication_verify(&snow3g_hash_test_case_6);\n-}\n-\n-static int\n-test_kasumi_hash_generate_test_case_1(void)\n-{\n-\treturn test_kasumi_authentication(&kasumi_hash_test_case_1);\n-}\n-\n-static int\n-test_kasumi_hash_generate_test_case_2(void)\n-{\n-\treturn test_kasumi_authentication(&kasumi_hash_test_case_2);\n-}\n-\n-static int\n-test_kasumi_hash_generate_test_case_3(void)\n-{\n-\treturn test_kasumi_authentication(&kasumi_hash_test_case_3);\n-}\n-\n-static int\n-test_kasumi_hash_generate_test_case_4(void)\n-{\n-\treturn test_kasumi_authentication(&kasumi_hash_test_case_4);\n-}\n-\n-static int\n-test_kasumi_hash_generate_test_case_5(void)\n-{\n-\treturn test_kasumi_authentication(&kasumi_hash_test_case_5);\n-}\n-\n-static int\n-test_kasumi_hash_generate_test_case_6(void)\n-{\n-\treturn test_kasumi_authentication(&kasumi_hash_test_case_6);\n-}\n-\n-static int\n-test_kasumi_hash_verify_test_case_1(void)\n-{\n-\treturn test_kasumi_authentication_verify(&kasumi_hash_test_case_1);\n-}\n+\tdebug_hexdump(stdout, \"ciphertext:\", ciphertext, ciphertext_len);\n \n-static int\n-test_kasumi_hash_verify_test_case_2(void)\n-{\n-\treturn test_kasumi_authentication_verify(&kasumi_hash_test_case_2);\n-}\n+\t/* Create SNOW 3G operation */\n+\tretval = create_wireless_algo_cipher_operation(tdata->cipher_iv.data,\n+\t\t\t\t\ttdata->cipher_iv.len,\n+\t\t\t\t\ttdata->validCipherLenInBits.len,\n+\t\t\t\t\ttdata->cipher.offset_bits);\n+\tif (retval < 0)\n+\t\treturn retval;\n \n-static int\n-test_kasumi_hash_verify_test_case_3(void)\n-{\n-\treturn test_kasumi_authentication_verify(&kasumi_hash_test_case_3);\n-}\n+\tut_params->op = process_crypto_request(ts_params->valid_devs[0],\n+\t\t\t\t\t\tut_params->op);\n+\tTEST_ASSERT_NOT_NULL(ut_params->op, \"failed to retrieve obuf\");\n+\tut_params->obuf = ut_params->op->sym->m_dst;\n+\tif (ut_params->obuf)\n+\t\tplaintext = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *);\n+\telse\n+\t\tplaintext = ciphertext;\n \n-static int\n-test_kasumi_hash_verify_test_case_4(void)\n-{\n-\treturn test_kasumi_authentication_verify(&kasumi_hash_test_case_4);\n-}\n+\tdebug_hexdump(stdout, \"plaintext:\", plaintext, ciphertext_len);\n \n-static int\n-test_kasumi_hash_verify_test_case_5(void)\n-{\n-\treturn test_kasumi_authentication_verify(&kasumi_hash_test_case_5);\n+\t/* Validate obuf */\n+\tTEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(plaintext,\n+\t\t\t\ttdata->plaintext.data,\n+\t\t\t\ttdata->validDataLenInBits.len,\n+\t\t\t\t\"SNOW 3G Plaintext data not as expected\");\n+\treturn 0;\n }\n \n-static int\n-test_kasumi_encryption(const struct kasumi_test_data *tdata)\n+static int test_snow3g_decryption_oop(const struct snow3g_test_data *tdata)\n {\n \tstruct crypto_testsuite_params *ts_params = &testsuite_params;\n \tstruct crypto_unittest_params *ut_params = &unittest_params;\n \n \tint retval;\n+\n \tuint8_t *plaintext, *ciphertext;\n-\tunsigned plaintext_pad_len;\n-\tunsigned plaintext_len;\n+\tunsigned ciphertext_pad_len;\n+\tunsigned ciphertext_len;\n \n-\t/* Create KASUMI session */\n+\t/* Verify the capabilities */\n+\tstruct rte_cryptodev_sym_capability_idx cap_idx;\n+\tcap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;\n+\tcap_idx.algo.cipher = RTE_CRYPTO_CIPHER_SNOW3G_UEA2;\n+\tif (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],\n+\t\t\t&cap_idx) == NULL)\n+\t\treturn -ENOTSUP;\n+\n+\t/* Create SNOW 3G session */\n \tretval = create_wireless_algo_cipher_session(ts_params->valid_devs[0],\n-\t\t\t\t\tRTE_CRYPTO_CIPHER_OP_ENCRYPT,\n-\t\t\t\t\tRTE_CRYPTO_CIPHER_KASUMI_F8,\n+\t\t\t\t\tRTE_CRYPTO_CIPHER_OP_DECRYPT,\n+\t\t\t\t\tRTE_CRYPTO_CIPHER_SNOW3G_UEA2,\n \t\t\t\t\ttdata->key.data, tdata->key.len,\n \t\t\t\t\ttdata->cipher_iv.len);\n \tif (retval < 0)\n \t\treturn retval;\n \n \tut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);\n+\tut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);\n+\n+\tTEST_ASSERT_NOT_NULL(ut_params->ibuf,\n+\t\t\t\"Failed to allocate input buffer\");\n+\tTEST_ASSERT_NOT_NULL(ut_params->obuf,\n+\t\t\t\"Failed to allocate output buffer\");\n \n \t/* Clear mbuf payload */\n \tmemset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,\n \t       rte_pktmbuf_tailroom(ut_params->ibuf));\n \n-\tplaintext_len = ceil_byte_length(tdata->plaintext.len);\n-\t/* Append data which is padded to a multiple */\n-\t/* of the algorithms block size */\n-\tplaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 8);\n-\tplaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,\n-\t\t\t\tplaintext_pad_len);\n-\tmemcpy(plaintext, tdata->plaintext.data, plaintext_len);\n+\tmemset(rte_pktmbuf_mtod(ut_params->obuf, uint8_t *), 0,\n+\t\t       rte_pktmbuf_tailroom(ut_params->obuf));\n \n-\tdebug_hexdump(stdout, \"plaintext:\", plaintext, plaintext_len);\n+\tciphertext_len = ceil_byte_length(tdata->ciphertext.len);\n+\t/* Append data which is padded to a multiple of */\n+\t/* the algorithms block size */\n+\tciphertext_pad_len = RTE_ALIGN_CEIL(ciphertext_len, 16);\n+\tciphertext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,\n+\t\t\t\tciphertext_pad_len);\n+\trte_pktmbuf_append(ut_params->obuf, ciphertext_pad_len);\n+\tmemcpy(ciphertext, tdata->ciphertext.data, ciphertext_len);\n \n-\t/* Create KASUMI operation */\n-\tretval = create_wireless_algo_cipher_operation(tdata->cipher_iv.data,\n-\t\t\t\ttdata->cipher_iv.len,\n-\t\t\t\tRTE_ALIGN_CEIL(tdata->validCipherLenInBits.len, 8),\n-\t\t\t\ttdata->validCipherOffsetInBits.len);\n+\tdebug_hexdump(stdout, \"ciphertext:\", ciphertext, ciphertext_len);\n+\n+\t/* Create SNOW 3G operation */\n+\tretval = create_wireless_algo_cipher_operation_oop(tdata->cipher_iv.data,\n+\t\t\t\t\ttdata->cipher_iv.len,\n+\t\t\t\t\ttdata->validCipherLenInBits.len,\n+\t\t\t\t\t0);\n \tif (retval < 0)\n \t\treturn retval;\n \n \tut_params->op = process_crypto_request(ts_params->valid_devs[0],\n \t\t\t\t\t\tut_params->op);\n \tTEST_ASSERT_NOT_NULL(ut_params->op, \"failed to retrieve obuf\");\n-\n \tut_params->obuf = ut_params->op->sym->m_dst;\n \tif (ut_params->obuf)\n-\t\tciphertext = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *);\n+\t\tplaintext = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *);\n \telse\n-\t\tciphertext = plaintext + (tdata->validCipherOffsetInBits.len >> 3);\n+\t\tplaintext = ciphertext;\n \n-\tdebug_hexdump(stdout, \"ciphertext:\", ciphertext, plaintext_len);\n+\tdebug_hexdump(stdout, \"plaintext:\", plaintext, ciphertext_len);\n \n-\tconst uint8_t *reference_ciphertext = tdata->ciphertext.data +\n-\t\t\t\t(tdata->validCipherOffsetInBits.len >> 3);\n \t/* Validate obuf */\n-\tTEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(\n-\t\tciphertext,\n-\t\treference_ciphertext,\n-\t\ttdata->validCipherLenInBits.len,\n-\t\t\"KASUMI Ciphertext data not as expected\");\n+\tTEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(plaintext,\n+\t\t\t\ttdata->plaintext.data,\n+\t\t\t\ttdata->validDataLenInBits.len,\n+\t\t\t\t\"SNOW 3G Plaintext data not as expected\");\n \treturn 0;\n }\n \n static int\n-test_kasumi_encryption_sgl(const struct kasumi_test_data *tdata)\n+test_zuc_cipher_auth(const struct wireless_test_data *tdata)\n {\n \tstruct crypto_testsuite_params *ts_params = &testsuite_params;\n \tstruct crypto_unittest_params *ut_params = &unittest_params;\n \n \tint retval;\n \n+\tuint8_t *plaintext, *ciphertext;\n \tunsigned int plaintext_pad_len;\n \tunsigned int plaintext_len;\n \n-\tuint8_t buffer[10000];\n-\tconst uint8_t *ciphertext;\n+\tstruct rte_cryptodev_sym_capability_idx cap_idx;\n \n-\tstruct rte_cryptodev_info dev_info;\n+\t/* Check if device supports ZUC EEA3 */\n+\tcap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;\n+\tcap_idx.algo.cipher = RTE_CRYPTO_CIPHER_ZUC_EEA3;\n \n-\trte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);\n+\tif (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],\n+\t\t\t&cap_idx) == NULL)\n+\t\treturn -ENOTSUP;\n \n-\tuint64_t feat_flags = dev_info.feature_flags;\n+\t/* Check if device supports ZUC EIA3 */\n+\tcap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;\n+\tcap_idx.algo.auth = RTE_CRYPTO_AUTH_ZUC_EIA3;\n \n-\tif (!(feat_flags & RTE_CRYPTODEV_FF_IN_PLACE_SGL)) {\n-\t\tprintf(\"Device doesn't support in-place scatter-gather. \"\n-\t\t\t\t\"Test Skipped.\\n\");\n+\tif (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],\n+\t\t\t&cap_idx) == NULL)\n \t\treturn -ENOTSUP;\n-\t}\n \n-\t/* Create KASUMI session */\n-\tretval = create_wireless_algo_cipher_session(ts_params->valid_devs[0],\n-\t\t\t\t\tRTE_CRYPTO_CIPHER_OP_ENCRYPT,\n-\t\t\t\t\tRTE_CRYPTO_CIPHER_KASUMI_F8,\n-\t\t\t\t\ttdata->key.data, tdata->key.len,\n-\t\t\t\t\ttdata->cipher_iv.len);\n+\t/* Create ZUC session */\n+\tretval = create_zuc_cipher_auth_encrypt_generate_session(\n+\t\t\tts_params->valid_devs[0],\n+\t\t\ttdata);\n \tif (retval < 0)\n \t\treturn retval;\n+\tut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);\n \n-\tplaintext_len = ceil_byte_length(tdata->plaintext.len);\n-\n-\n-\t/* Append data which is padded to a multiple */\n-\t/* of the algorithms block size */\n-\tplaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 8);\n+\t/* clear mbuf payload */\n+\tmemset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,\n+\t\t\trte_pktmbuf_tailroom(ut_params->ibuf));\n \n-\tut_params->ibuf = create_segmented_mbuf(ts_params->mbuf_pool,\n-\t\t\tplaintext_pad_len, 10, 0);\n+\tplaintext_len = ceil_byte_length(tdata->plaintext.len);\n+\t/* Append data which is padded to a multiple of */\n+\t/* the algorithms block size */\n+\tplaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16);\n+\tplaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,\n+\t\t\t\tplaintext_pad_len);\n+\tmemcpy(plaintext, tdata->plaintext.data, plaintext_len);\n \n-\tpktmbuf_write(ut_params->ibuf, 0, plaintext_len, tdata->plaintext.data);\n+\tdebug_hexdump(stdout, \"plaintext:\", plaintext, plaintext_len);\n \n-\t/* Create KASUMI operation */\n-\tretval = create_wireless_algo_cipher_operation(tdata->cipher_iv.data,\n-\t\t\t\ttdata->cipher_iv.len,\n-\t\t\t\tRTE_ALIGN_CEIL(tdata->validCipherLenInBits.len, 8),\n-\t\t\t\ttdata->validCipherOffsetInBits.len);\n+\t/* Create ZUC operation */\n+\tretval = create_zuc_cipher_hash_generate_operation(tdata);\n \tif (retval < 0)\n \t\treturn retval;\n \n \tut_params->op = process_crypto_request(ts_params->valid_devs[0],\n-\t\t\t\t\t\tut_params->op);\n+\t\t\tut_params->op);\n \tTEST_ASSERT_NOT_NULL(ut_params->op, \"failed to retrieve obuf\");\n-\n-\tut_params->obuf = ut_params->op->sym->m_dst;\n-\n+\tut_params->obuf = ut_params->op->sym->m_src;\n \tif (ut_params->obuf)\n-\t\tciphertext = rte_pktmbuf_read(ut_params->obuf, 0,\n-\t\t\t\tplaintext_len, buffer);\n+\t\tciphertext = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *);\n \telse\n-\t\tciphertext = rte_pktmbuf_read(ut_params->ibuf,\n-\t\t\t\ttdata->validCipherOffsetInBits.len >> 3,\n-\t\t\t\tplaintext_len, buffer);\n+\t\tciphertext = plaintext;\n \n-\t/* Validate obuf */\n \tdebug_hexdump(stdout, \"ciphertext:\", ciphertext, plaintext_len);\n-\n-\tconst uint8_t *reference_ciphertext = tdata->ciphertext.data +\n-\t\t\t\t(tdata->validCipherOffsetInBits.len >> 3);\n \t/* Validate obuf */\n \tTEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(\n-\t\tciphertext,\n-\t\treference_ciphertext,\n-\t\ttdata->validCipherLenInBits.len,\n-\t\t\"KASUMI Ciphertext data not as expected\");\n-\treturn 0;\n-}\n+\t\t\tciphertext,\n+\t\t\ttdata->ciphertext.data,\n+\t\t\ttdata->validDataLenInBits.len,\n+\t\t\t\"ZUC Ciphertext data not as expected\");\n \n-static int\n-test_kasumi_encryption_oop(const struct kasumi_test_data *tdata)\n-{\n-\tstruct crypto_testsuite_params *ts_params = &testsuite_params;\n-\tstruct crypto_unittest_params *ut_params = &unittest_params;\n+\tut_params->digest = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *)\n+\t    + plaintext_pad_len;\n+\n+\t/* Validate obuf */\n+\tTEST_ASSERT_BUFFERS_ARE_EQUAL(\n+\t\t\tut_params->digest,\n+\t\t\ttdata->digest.data,\n+\t\t\t4,\n+\t\t\t\"ZUC Generated auth tag not as expected\");\n+\treturn 0;\n+}\n+\n+static int\n+test_snow3g_cipher_auth(const struct snow3g_test_data *tdata)\n+{\n+\tstruct crypto_testsuite_params *ts_params = &testsuite_params;\n+\tstruct crypto_unittest_params *ut_params = &unittest_params;\n \n \tint retval;\n+\n \tuint8_t *plaintext, *ciphertext;\n \tunsigned plaintext_pad_len;\n \tunsigned plaintext_len;\n \n-\t/* Create KASUMI session */\n-\tretval = create_wireless_algo_cipher_session(ts_params->valid_devs[0],\n-\t\t\t\t\tRTE_CRYPTO_CIPHER_OP_ENCRYPT,\n-\t\t\t\t\tRTE_CRYPTO_CIPHER_KASUMI_F8,\n-\t\t\t\t\ttdata->key.data, tdata->key.len,\n-\t\t\t\t\ttdata->cipher_iv.len);\n+\t/* Verify the capabilities */\n+\tstruct rte_cryptodev_sym_capability_idx cap_idx;\n+\tcap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;\n+\tcap_idx.algo.auth = RTE_CRYPTO_AUTH_SNOW3G_UIA2;\n+\tif (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],\n+\t\t\t&cap_idx) == NULL)\n+\t\treturn -ENOTSUP;\n+\tcap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;\n+\tcap_idx.algo.cipher = RTE_CRYPTO_CIPHER_SNOW3G_UEA2;\n+\tif (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],\n+\t\t\t&cap_idx) == NULL)\n+\t\treturn -ENOTSUP;\n+\n+\t/* Create SNOW 3G session */\n+\tretval = create_wireless_algo_cipher_auth_session(\n+\t\t\tts_params->valid_devs[0],\n+\t\t\tRTE_CRYPTO_CIPHER_OP_ENCRYPT,\n+\t\t\tRTE_CRYPTO_AUTH_OP_GENERATE,\n+\t\t\tRTE_CRYPTO_AUTH_SNOW3G_UIA2,\n+\t\t\tRTE_CRYPTO_CIPHER_SNOW3G_UEA2,\n+\t\t\ttdata->key.data, tdata->key.len,\n+\t\t\ttdata->auth_iv.len, tdata->digest.len,\n+\t\t\ttdata->cipher_iv.len);\n \tif (retval < 0)\n \t\treturn retval;\n-\n \tut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);\n-\tut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);\n \n-\t/* Clear mbuf payload */\n+\t/* clear mbuf payload */\n \tmemset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,\n-\t       rte_pktmbuf_tailroom(ut_params->ibuf));\n+\t\t\trte_pktmbuf_tailroom(ut_params->ibuf));\n \n \tplaintext_len = ceil_byte_length(tdata->plaintext.len);\n-\t/* Append data which is padded to a multiple */\n-\t/* of the algorithms block size */\n-\tplaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 8);\n+\t/* Append data which is padded to a multiple of */\n+\t/* the algorithms block size */\n+\tplaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16);\n \tplaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,\n \t\t\t\tplaintext_pad_len);\n-\trte_pktmbuf_append(ut_params->obuf, plaintext_pad_len);\n \tmemcpy(plaintext, tdata->plaintext.data, plaintext_len);\n \n \tdebug_hexdump(stdout, \"plaintext:\", plaintext, plaintext_len);\n \n-\t/* Create KASUMI operation */\n-\tretval = create_wireless_algo_cipher_operation_oop(tdata->cipher_iv.data,\n-\t\t\t\ttdata->cipher_iv.len,\n-\t\t\t\tRTE_ALIGN_CEIL(tdata->validCipherLenInBits.len, 8),\n-\t\t\t\ttdata->validCipherOffsetInBits.len);\n+\t/* Create SNOW 3G operation */\n+\tretval = create_wireless_algo_cipher_hash_operation(tdata->digest.data,\n+\t\t\ttdata->digest.len, tdata->auth_iv.data,\n+\t\t\ttdata->auth_iv.len,\n+\t\t\tplaintext_pad_len, RTE_CRYPTO_AUTH_OP_GENERATE,\n+\t\t\ttdata->cipher_iv.data, tdata->cipher_iv.len,\n+\t\t\ttdata->validCipherLenInBits.len,\n+\t\t\t0,\n+\t\t\ttdata->validAuthLenInBits.len,\n+\t\t\t0\n+\t\t\t);\n \tif (retval < 0)\n \t\treturn retval;\n \n \tut_params->op = process_crypto_request(ts_params->valid_devs[0],\n-\t\t\t\t\t\tut_params->op);\n+\t\t\tut_params->op);\n \tTEST_ASSERT_NOT_NULL(ut_params->op, \"failed to retrieve obuf\");\n-\n-\tut_params->obuf = ut_params->op->sym->m_dst;\n+\tut_params->obuf = ut_params->op->sym->m_src;\n \tif (ut_params->obuf)\n \t\tciphertext = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *);\n \telse\n-\t\tciphertext = plaintext + (tdata->validCipherOffsetInBits.len >> 3);\n+\t\tciphertext = plaintext;\n \n \tdebug_hexdump(stdout, \"ciphertext:\", ciphertext, plaintext_len);\n-\n-\tconst uint8_t *reference_ciphertext = tdata->ciphertext.data +\n-\t\t\t\t(tdata->validCipherOffsetInBits.len >> 3);\n \t/* Validate obuf */\n \tTEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(\n-\t\tciphertext,\n-\t\treference_ciphertext,\n-\t\ttdata->validCipherLenInBits.len,\n-\t\t\"KASUMI Ciphertext data not as expected\");\n+\t\t\tciphertext,\n+\t\t\ttdata->ciphertext.data,\n+\t\t\ttdata->validDataLenInBits.len,\n+\t\t\t\"SNOW 3G Ciphertext data not as expected\");\n+\n+\tut_params->digest = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *)\n+\t    + plaintext_pad_len;\n+\n+\t/* Validate obuf */\n+\tTEST_ASSERT_BUFFERS_ARE_EQUAL(\n+\t\t\tut_params->digest,\n+\t\t\ttdata->digest.data,\n+\t\t\tDIGEST_BYTE_LENGTH_SNOW3G_UIA2,\n+\t\t\t\"SNOW 3G Generated auth tag not as expected\");\n \treturn 0;\n }\n \n static int\n-test_kasumi_encryption_oop_sgl(const struct kasumi_test_data *tdata)\n+test_snow3g_auth_cipher(const struct snow3g_test_data *tdata,\n+\tuint8_t op_mode, uint8_t verify)\n {\n \tstruct crypto_testsuite_params *ts_params = &testsuite_params;\n \tstruct crypto_unittest_params *ut_params = &unittest_params;\n \n \tint retval;\n+\n+\tuint8_t *plaintext = NULL, *ciphertext = NULL;\n \tunsigned int plaintext_pad_len;\n \tunsigned int plaintext_len;\n-\n-\tconst uint8_t *ciphertext;\n-\tuint8_t buffer[2048];\n+\tunsigned int ciphertext_pad_len;\n+\tunsigned int ciphertext_len;\n \n \tstruct rte_cryptodev_info dev_info;\n \n+\t/* Verify the capabilities */\n+\tstruct rte_cryptodev_sym_capability_idx cap_idx;\n+\tcap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;\n+\tcap_idx.algo.auth = RTE_CRYPTO_AUTH_SNOW3G_UIA2;\n+\tif (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],\n+\t\t\t&cap_idx) == NULL)\n+\t\treturn -ENOTSUP;\n+\tcap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;\n+\tcap_idx.algo.cipher = RTE_CRYPTO_CIPHER_SNOW3G_UEA2;\n+\tif (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],\n+\t\t\t&cap_idx) == NULL)\n+\t\treturn -ENOTSUP;\n+\n \trte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);\n \n \tuint64_t feat_flags = dev_info.feature_flags;\n-\tif (!(feat_flags & RTE_CRYPTODEV_FF_OOP_SGL_IN_SGL_OUT)) {\n-\t\tprintf(\"Device doesn't support out-of-place scatter-gather \"\n-\t\t\t\t\"in both input and output mbufs. \"\n-\t\t\t\t\"Test Skipped.\\n\");\n-\t\treturn -ENOTSUP;\n+\n+\tif (op_mode == OUT_OF_PLACE) {\n+\t\tif (!(feat_flags & RTE_CRYPTODEV_FF_DIGEST_ENCRYPTED)) {\n+\t\t\tprintf(\"Device doesn't support digest encrypted.\\n\");\n+\t\t\treturn -ENOTSUP;\n+\t\t}\n \t}\n \n-\t/* Create KASUMI session */\n-\tretval = create_wireless_algo_cipher_session(ts_params->valid_devs[0],\n-\t\t\t\t\tRTE_CRYPTO_CIPHER_OP_ENCRYPT,\n-\t\t\t\t\tRTE_CRYPTO_CIPHER_KASUMI_F8,\n-\t\t\t\t\ttdata->key.data, tdata->key.len,\n-\t\t\t\t\ttdata->cipher_iv.len);\n+\t/* Create SNOW 3G session */\n+\tretval = create_wireless_algo_auth_cipher_session(\n+\t\t\tts_params->valid_devs[0],\n+\t\t\t(verify ? RTE_CRYPTO_CIPHER_OP_DECRYPT\n+\t\t\t\t\t: RTE_CRYPTO_CIPHER_OP_ENCRYPT),\n+\t\t\t(verify ? RTE_CRYPTO_AUTH_OP_VERIFY\n+\t\t\t\t\t: RTE_CRYPTO_AUTH_OP_GENERATE),\n+\t\t\tRTE_CRYPTO_AUTH_SNOW3G_UIA2,\n+\t\t\tRTE_CRYPTO_CIPHER_SNOW3G_UEA2,\n+\t\t\ttdata->key.data, tdata->key.len,\n+\t\t\ttdata->auth_iv.len, tdata->digest.len,\n+\t\t\ttdata->cipher_iv.len);\n+\n \tif (retval < 0)\n \t\treturn retval;\n \n+\tut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);\n+\tif (op_mode == OUT_OF_PLACE)\n+\t\tut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);\n+\n+\t/* clear mbuf payload */\n+\tmemset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,\n+\t\trte_pktmbuf_tailroom(ut_params->ibuf));\n+\tif (op_mode == OUT_OF_PLACE)\n+\t\tmemset(rte_pktmbuf_mtod(ut_params->obuf, uint8_t *), 0,\n+\t\t\trte_pktmbuf_tailroom(ut_params->obuf));\n+\n+\tciphertext_len = ceil_byte_length(tdata->ciphertext.len);\n \tplaintext_len = ceil_byte_length(tdata->plaintext.len);\n-\t/* Append data which is padded to a multiple */\n-\t/* of the algorithms block size */\n-\tplaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 8);\n+\tciphertext_pad_len = RTE_ALIGN_CEIL(ciphertext_len, 16);\n+\tplaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16);\n \n-\tut_params->ibuf = create_segmented_mbuf(ts_params->mbuf_pool,\n-\t\t\tplaintext_pad_len, 10, 0);\n-\tut_params->obuf = create_segmented_mbuf(ts_params->mbuf_pool,\n-\t\t\tplaintext_pad_len, 3, 0);\n+\tif (verify) {\n+\t\tciphertext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,\n+\t\t\t\t\tciphertext_pad_len);\n+\t\tmemcpy(ciphertext, tdata->ciphertext.data, ciphertext_len);\n+\t\tif (op_mode == OUT_OF_PLACE)\n+\t\t\trte_pktmbuf_append(ut_params->obuf, ciphertext_pad_len);\n+\t\tdebug_hexdump(stdout, \"ciphertext:\", ciphertext,\n+\t\t\tciphertext_len);\n+\t} else {\n+\t\tplaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,\n+\t\t\t\t\tplaintext_pad_len);\n+\t\tmemcpy(plaintext, tdata->plaintext.data, plaintext_len);\n+\t\tif (op_mode == OUT_OF_PLACE)\n+\t\t\trte_pktmbuf_append(ut_params->obuf, plaintext_pad_len);\n+\t\tdebug_hexdump(stdout, \"plaintext:\", plaintext, plaintext_len);\n+\t}\n \n-\t/* Append data which is padded to a multiple */\n-\t/* of the algorithms block size */\n-\tpktmbuf_write(ut_params->ibuf, 0, plaintext_len, tdata->plaintext.data);\n+\t/* Create SNOW 3G operation */\n+\tretval = create_wireless_algo_auth_cipher_operation(\n+\t\ttdata->digest.len,\n+\t\ttdata->cipher_iv.data, tdata->cipher_iv.len,\n+\t\ttdata->auth_iv.data, tdata->auth_iv.len,\n+\t\t(tdata->digest.offset_bytes == 0 ?\n+\t\t(verify ? ciphertext_pad_len : plaintext_pad_len)\n+\t\t\t: tdata->digest.offset_bytes),\n+\t\ttdata->validCipherLenInBits.len,\n+\t\ttdata->cipher.offset_bits,\n+\t\ttdata->validAuthLenInBits.len,\n+\t\ttdata->auth.offset_bits,\n+\t\top_mode, 0);\n \n-\t/* Create KASUMI operation */\n-\tretval = create_wireless_algo_cipher_operation_oop(tdata->cipher_iv.data,\n-\t\t\t\ttdata->cipher_iv.len,\n-\t\t\t\tRTE_ALIGN_CEIL(tdata->validCipherLenInBits.len, 8),\n-\t\t\t\ttdata->validCipherOffsetInBits.len);\n \tif (retval < 0)\n \t\treturn retval;\n \n \tut_params->op = process_crypto_request(ts_params->valid_devs[0],\n-\t\t\t\t\t\tut_params->op);\n+\t\t\tut_params->op);\n+\n \tTEST_ASSERT_NOT_NULL(ut_params->op, \"failed to retrieve obuf\");\n \n-\tut_params->obuf = ut_params->op->sym->m_dst;\n-\tif (ut_params->obuf)\n-\t\tciphertext = rte_pktmbuf_read(ut_params->obuf, 0,\n-\t\t\t\tplaintext_pad_len, buffer);\n-\telse\n-\t\tciphertext = rte_pktmbuf_read(ut_params->ibuf,\n-\t\t\t\ttdata->validCipherOffsetInBits.len >> 3,\n-\t\t\t\tplaintext_pad_len, buffer);\n+\tut_params->obuf = (op_mode == IN_PLACE ?\n+\t\tut_params->op->sym->m_src : ut_params->op->sym->m_dst);\n \n-\tconst uint8_t *reference_ciphertext = tdata->ciphertext.data +\n-\t\t\t\t(tdata->validCipherOffsetInBits.len >> 3);\n-\t/* Validate obuf */\n-\tTEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(\n-\t\tciphertext,\n-\t\treference_ciphertext,\n-\t\ttdata->validCipherLenInBits.len,\n-\t\t\"KASUMI Ciphertext data not as expected\");\n-\treturn 0;\n-}\n+\tif (verify) {\n+\t\tif (ut_params->obuf)\n+\t\t\tplaintext = rte_pktmbuf_mtod(ut_params->obuf,\n+\t\t\t\t\t\t\tuint8_t *);\n+\t\telse\n+\t\t\tplaintext = ciphertext +\n+\t\t\t\t(tdata->cipher.offset_bits >> 3);\n \n+\t\tdebug_hexdump(stdout, \"plaintext:\", plaintext,\n+\t\t\t(tdata->plaintext.len >> 3) - tdata->digest.len);\n+\t\tdebug_hexdump(stdout, \"plaintext expected:\",\n+\t\t\ttdata->plaintext.data,\n+\t\t\t(tdata->plaintext.len >> 3) - tdata->digest.len);\n+\t} else {\n+\t\tif (ut_params->obuf)\n+\t\t\tciphertext = rte_pktmbuf_mtod(ut_params->obuf,\n+\t\t\t\t\t\t\tuint8_t *);\n+\t\telse\n+\t\t\tciphertext = plaintext;\n \n-static int\n-test_kasumi_decryption_oop(const struct kasumi_test_data *tdata)\n-{\n-\tstruct crypto_testsuite_params *ts_params = &testsuite_params;\n-\tstruct crypto_unittest_params *ut_params = &unittest_params;\n+\t\tdebug_hexdump(stdout, \"ciphertext:\", ciphertext,\n+\t\t\tciphertext_len);\n+\t\tdebug_hexdump(stdout, \"ciphertext expected:\",\n+\t\t\ttdata->ciphertext.data, tdata->ciphertext.len >> 3);\n \n-\tint retval;\n-\tuint8_t *ciphertext, *plaintext;\n-\tunsigned ciphertext_pad_len;\n-\tunsigned ciphertext_len;\n-\n-\t/* Create KASUMI session */\n-\tretval = create_wireless_algo_cipher_session(ts_params->valid_devs[0],\n-\t\t\t\t\tRTE_CRYPTO_CIPHER_OP_DECRYPT,\n-\t\t\t\t\tRTE_CRYPTO_CIPHER_KASUMI_F8,\n-\t\t\t\t\ttdata->key.data, tdata->key.len,\n-\t\t\t\t\ttdata->cipher_iv.len);\n-\tif (retval < 0)\n-\t\treturn retval;\n-\n-\tut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);\n-\tut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);\n-\n-\t/* Clear mbuf payload */\n-\tmemset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,\n-\t       rte_pktmbuf_tailroom(ut_params->ibuf));\n-\n-\tciphertext_len = ceil_byte_length(tdata->ciphertext.len);\n-\t/* Append data which is padded to a multiple */\n-\t/* of the algorithms block size */\n-\tciphertext_pad_len = RTE_ALIGN_CEIL(ciphertext_len, 8);\n-\tciphertext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,\n-\t\t\t\tciphertext_pad_len);\n-\trte_pktmbuf_append(ut_params->obuf, ciphertext_pad_len);\n-\tmemcpy(ciphertext, tdata->ciphertext.data, ciphertext_len);\n-\n-\tdebug_hexdump(stdout, \"ciphertext:\", ciphertext, ciphertext_len);\n-\n-\t/* Create KASUMI operation */\n-\tretval = create_wireless_algo_cipher_operation_oop(tdata->cipher_iv.data,\n-\t\t\t\ttdata->cipher_iv.len,\n-\t\t\t\tRTE_ALIGN_CEIL(tdata->validCipherLenInBits.len, 8),\n-\t\t\t\ttdata->validCipherOffsetInBits.len);\n-\tif (retval < 0)\n-\t\treturn retval;\n-\n-\tut_params->op = process_crypto_request(ts_params->valid_devs[0],\n-\t\t\t\t\t\tut_params->op);\n-\tTEST_ASSERT_NOT_NULL(ut_params->op, \"failed to retrieve obuf\");\n-\n-\tut_params->obuf = ut_params->op->sym->m_dst;\n-\tif (ut_params->obuf)\n-\t\tplaintext = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *);\n-\telse\n-\t\tplaintext = ciphertext + (tdata->validCipherOffsetInBits.len >> 3);\n+\t\tut_params->digest = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *)\n+\t\t\t+ (tdata->digest.offset_bytes == 0 ?\n+\t\tplaintext_pad_len : tdata->digest.offset_bytes);\n \n-\tdebug_hexdump(stdout, \"plaintext:\", plaintext, ciphertext_len);\n+\t\tdebug_hexdump(stdout, \"digest:\", ut_params->digest,\n+\t\t\ttdata->digest.len);\n+\t\tdebug_hexdump(stdout, \"digest expected:\", tdata->digest.data,\n+\t\t\t\ttdata->digest.len);\n+\t}\n \n-\tconst uint8_t *reference_plaintext = tdata->plaintext.data +\n-\t\t\t\t(tdata->validCipherOffsetInBits.len >> 3);\n \t/* Validate obuf */\n-\tTEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(\n-\t\tplaintext,\n-\t\treference_plaintext,\n-\t\ttdata->validCipherLenInBits.len,\n-\t\t\"KASUMI Plaintext data not as expected\");\n+\tif (verify) {\n+\t\tTEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(\n+\t\t\tplaintext,\n+\t\t\ttdata->plaintext.data,\n+\t\t\ttdata->plaintext.len >> 3,\n+\t\t\t\"SNOW 3G Plaintext data not as expected\");\n+\t} else {\n+\t\tTEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(\n+\t\t\tciphertext,\n+\t\t\ttdata->ciphertext.data,\n+\t\t\ttdata->validDataLenInBits.len,\n+\t\t\t\"SNOW 3G Ciphertext data not as expected\");\n+\n+\t\tTEST_ASSERT_BUFFERS_ARE_EQUAL(\n+\t\t\tut_params->digest,\n+\t\t\ttdata->digest.data,\n+\t\t\tDIGEST_BYTE_LENGTH_SNOW3G_UIA2,\n+\t\t\t\"SNOW 3G Generated auth tag not as expected\");\n+\t}\n \treturn 0;\n }\n \n static int\n-test_kasumi_decryption(const struct kasumi_test_data *tdata)\n+test_snow3g_auth_cipher_sgl(const struct snow3g_test_data *tdata,\n+\tuint8_t op_mode, uint8_t verify)\n {\n \tstruct crypto_testsuite_params *ts_params = &testsuite_params;\n \tstruct crypto_unittest_params *ut_params = &unittest_params;\n \n \tint retval;\n-\tuint8_t *ciphertext, *plaintext;\n-\tunsigned ciphertext_pad_len;\n-\tunsigned ciphertext_len;\n \n-\t/* Create KASUMI session */\n-\tretval = create_wireless_algo_cipher_session(ts_params->valid_devs[0],\n-\t\t\t\t\tRTE_CRYPTO_CIPHER_OP_DECRYPT,\n-\t\t\t\t\tRTE_CRYPTO_CIPHER_KASUMI_F8,\n-\t\t\t\t\ttdata->key.data, tdata->key.len,\n-\t\t\t\t\ttdata->cipher_iv.len);\n-\tif (retval < 0)\n-\t\treturn retval;\n+\tconst uint8_t *plaintext = NULL;\n+\tconst uint8_t *ciphertext = NULL;\n+\tconst uint8_t *digest = NULL;\n+\tunsigned int plaintext_pad_len;\n+\tunsigned int plaintext_len;\n+\tunsigned int ciphertext_pad_len;\n+\tunsigned int ciphertext_len;\n+\tuint8_t buffer[10000];\n+\tuint8_t digest_buffer[10000];\n \n-\tut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);\n+\tstruct rte_cryptodev_info dev_info;\n \n-\t/* Clear mbuf payload */\n-\tmemset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,\n-\t       rte_pktmbuf_tailroom(ut_params->ibuf));\n+\t/* Verify the capabilities */\n+\tstruct rte_cryptodev_sym_capability_idx cap_idx;\n+\tcap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;\n+\tcap_idx.algo.auth = RTE_CRYPTO_AUTH_SNOW3G_UIA2;\n+\tif (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],\n+\t\t\t&cap_idx) == NULL)\n+\t\treturn -ENOTSUP;\n+\tcap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;\n+\tcap_idx.algo.cipher = RTE_CRYPTO_CIPHER_SNOW3G_UEA2;\n+\tif (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],\n+\t\t\t&cap_idx) == NULL)\n+\t\treturn -ENOTSUP;\n \n-\tciphertext_len = ceil_byte_length(tdata->ciphertext.len);\n-\t/* Append data which is padded to a multiple */\n-\t/* of the algorithms block size */\n-\tciphertext_pad_len = RTE_ALIGN_CEIL(ciphertext_len, 8);\n-\tciphertext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,\n-\t\t\t\tciphertext_pad_len);\n-\tmemcpy(ciphertext, tdata->ciphertext.data, ciphertext_len);\n+\trte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);\n \n-\tdebug_hexdump(stdout, \"ciphertext:\", ciphertext, ciphertext_len);\n+\tuint64_t feat_flags = dev_info.feature_flags;\n+\n+\tif (op_mode == IN_PLACE) {\n+\t\tif (!(feat_flags & RTE_CRYPTODEV_FF_IN_PLACE_SGL)) {\n+\t\t\tprintf(\"Device doesn't support in-place scatter-gather \"\n+\t\t\t\t\t\"in both input and output mbufs.\\n\");\n+\t\t\treturn -ENOTSUP;\n+\t\t}\n+\t} else {\n+\t\tif (!(feat_flags & RTE_CRYPTODEV_FF_OOP_SGL_IN_SGL_OUT)) {\n+\t\t\tprintf(\"Device doesn't support out-of-place scatter-gather \"\n+\t\t\t\t\t\"in both input and output mbufs.\\n\");\n+\t\t\treturn -ENOTSUP;\n+\t\t}\n+\t\tif (!(feat_flags & RTE_CRYPTODEV_FF_DIGEST_ENCRYPTED)) {\n+\t\t\tprintf(\"Device doesn't support digest encrypted.\\n\");\n+\t\t\treturn -ENOTSUP;\n+\t\t}\n+\t}\n+\n+\t/* Create SNOW 3G session */\n+\tretval = create_wireless_algo_auth_cipher_session(\n+\t\t\tts_params->valid_devs[0],\n+\t\t\t(verify ? RTE_CRYPTO_CIPHER_OP_DECRYPT\n+\t\t\t\t\t: RTE_CRYPTO_CIPHER_OP_ENCRYPT),\n+\t\t\t(verify ? RTE_CRYPTO_AUTH_OP_VERIFY\n+\t\t\t\t\t: RTE_CRYPTO_AUTH_OP_GENERATE),\n+\t\t\tRTE_CRYPTO_AUTH_SNOW3G_UIA2,\n+\t\t\tRTE_CRYPTO_CIPHER_SNOW3G_UEA2,\n+\t\t\ttdata->key.data, tdata->key.len,\n+\t\t\ttdata->auth_iv.len, tdata->digest.len,\n+\t\t\ttdata->cipher_iv.len);\n \n-\t/* Create KASUMI operation */\n-\tretval = create_wireless_algo_cipher_operation(tdata->cipher_iv.data,\n-\t\t\t\t\ttdata->cipher_iv.len,\n-\t\t\t\t\ttdata->ciphertext.len,\n-\t\t\t\t\ttdata->validCipherOffsetInBits.len);\n \tif (retval < 0)\n \t\treturn retval;\n \n-\tut_params->op = process_crypto_request(ts_params->valid_devs[0],\n-\t\t\t\t\t\tut_params->op);\n-\tTEST_ASSERT_NOT_NULL(ut_params->op, \"failed to retrieve obuf\");\n-\n-\tut_params->obuf = ut_params->op->sym->m_dst;\n-\tif (ut_params->obuf)\n-\t\tplaintext = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *);\n-\telse\n-\t\tplaintext = ciphertext + (tdata->validCipherOffsetInBits.len >> 3);\n+\tciphertext_len = ceil_byte_length(tdata->ciphertext.len);\n+\tplaintext_len = ceil_byte_length(tdata->plaintext.len);\n+\tciphertext_pad_len = RTE_ALIGN_CEIL(ciphertext_len, 16);\n+\tplaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16);\n \n-\tdebug_hexdump(stdout, \"plaintext:\", plaintext, ciphertext_len);\n+\tut_params->ibuf = create_segmented_mbuf(ts_params->mbuf_pool,\n+\t\t\tplaintext_pad_len, 15, 0);\n+\tTEST_ASSERT_NOT_NULL(ut_params->ibuf,\n+\t\t\t\"Failed to allocate input buffer in mempool\");\n \n-\tconst uint8_t *reference_plaintext = tdata->plaintext.data +\n-\t\t\t\t(tdata->validCipherOffsetInBits.len >> 3);\n-\t/* Validate obuf */\n-\tTEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(\n-\t\tplaintext,\n-\t\treference_plaintext,\n-\t\ttdata->validCipherLenInBits.len,\n-\t\t\"KASUMI Plaintext data not as expected\");\n-\treturn 0;\n-}\n+\tif (op_mode == OUT_OF_PLACE) {\n+\t\tut_params->obuf = create_segmented_mbuf(ts_params->mbuf_pool,\n+\t\t\t\tplaintext_pad_len, 15, 0);\n+\t\tTEST_ASSERT_NOT_NULL(ut_params->obuf,\n+\t\t\t\t\"Failed to allocate output buffer in mempool\");\n+\t}\n \n-static int\n-test_snow3g_encryption(const struct snow3g_test_data *tdata)\n-{\n-\tstruct crypto_testsuite_params *ts_params = &testsuite_params;\n-\tstruct crypto_unittest_params *ut_params = &unittest_params;\n+\tif (verify) {\n+\t\tpktmbuf_write(ut_params->ibuf, 0, ciphertext_len,\n+\t\t\ttdata->ciphertext.data);\n+\t\tciphertext = rte_pktmbuf_read(ut_params->ibuf, 0,\n+\t\t\t\t\tciphertext_len, buffer);\n+\t\tdebug_hexdump(stdout, \"ciphertext:\", ciphertext,\n+\t\t\tciphertext_len);\n+\t} else {\n+\t\tpktmbuf_write(ut_params->ibuf, 0, plaintext_len,\n+\t\t\ttdata->plaintext.data);\n+\t\tplaintext = rte_pktmbuf_read(ut_params->ibuf, 0,\n+\t\t\t\t\tplaintext_len, buffer);\n+\t\tdebug_hexdump(stdout, \"plaintext:\", plaintext,\n+\t\t\tplaintext_len);\n+\t}\n+\tmemset(buffer, 0, sizeof(buffer));\n \n-\tint retval;\n-\tuint8_t *plaintext, *ciphertext;\n-\tunsigned plaintext_pad_len;\n-\tunsigned plaintext_len;\n+\t/* Create SNOW 3G operation */\n+\tretval = create_wireless_algo_auth_cipher_operation(\n+\t\ttdata->digest.len,\n+\t\ttdata->cipher_iv.data, tdata->cipher_iv.len,\n+\t\ttdata->auth_iv.data, tdata->auth_iv.len,\n+\t\t(tdata->digest.offset_bytes == 0 ?\n+\t\t(verify ? ciphertext_pad_len : plaintext_pad_len)\n+\t\t\t: tdata->digest.offset_bytes),\n+\t\ttdata->validCipherLenInBits.len,\n+\t\ttdata->cipher.offset_bits,\n+\t\ttdata->validAuthLenInBits.len,\n+\t\ttdata->auth.offset_bits,\n+\t\top_mode, 1);\n \n-\t/* Create SNOW 3G session */\n-\tretval = create_wireless_algo_cipher_session(ts_params->valid_devs[0],\n-\t\t\t\t\tRTE_CRYPTO_CIPHER_OP_ENCRYPT,\n-\t\t\t\t\tRTE_CRYPTO_CIPHER_SNOW3G_UEA2,\n-\t\t\t\t\ttdata->key.data, tdata->key.len,\n-\t\t\t\t\ttdata->cipher_iv.len);\n \tif (retval < 0)\n \t\treturn retval;\n \n-\tut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);\n+\tut_params->op = process_crypto_request(ts_params->valid_devs[0],\n+\t\t\tut_params->op);\n \n-\t/* Clear mbuf payload */\n-\tmemset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,\n-\t       rte_pktmbuf_tailroom(ut_params->ibuf));\n+\tTEST_ASSERT_NOT_NULL(ut_params->op, \"failed to retrieve obuf\");\n \n-\tplaintext_len = ceil_byte_length(tdata->plaintext.len);\n-\t/* Append data which is padded to a multiple of */\n-\t/* the algorithms block size */\n-\tplaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16);\n-\tplaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,\n-\t\t\t\tplaintext_pad_len);\n-\tmemcpy(plaintext, tdata->plaintext.data, plaintext_len);\n+\tut_params->obuf = (op_mode == IN_PLACE ?\n+\t\tut_params->op->sym->m_src : ut_params->op->sym->m_dst);\n \n-\tdebug_hexdump(stdout, \"plaintext:\", plaintext, plaintext_len);\n+\tif (verify) {\n+\t\tif (ut_params->obuf)\n+\t\t\tplaintext = rte_pktmbuf_read(ut_params->obuf, 0,\n+\t\t\t\t\tplaintext_len, buffer);\n+\t\telse\n+\t\t\tplaintext = rte_pktmbuf_read(ut_params->ibuf, 0,\n+\t\t\t\t\tplaintext_len, buffer);\n \n-\t/* Create SNOW 3G operation */\n-\tretval = create_wireless_algo_cipher_operation(tdata->cipher_iv.data,\n-\t\t\t\t\ttdata->cipher_iv.len,\n-\t\t\t\t\ttdata->validCipherLenInBits.len,\n-\t\t\t\t\t0);\n-\tif (retval < 0)\n-\t\treturn retval;\n+\t\tdebug_hexdump(stdout, \"plaintext:\", plaintext,\n+\t\t\t(tdata->plaintext.len >> 3) - tdata->digest.len);\n+\t\tdebug_hexdump(stdout, \"plaintext expected:\",\n+\t\t\ttdata->plaintext.data,\n+\t\t\t(tdata->plaintext.len >> 3) - tdata->digest.len);\n+\t} else {\n+\t\tif (ut_params->obuf)\n+\t\t\tciphertext = rte_pktmbuf_read(ut_params->obuf, 0,\n+\t\t\t\t\tciphertext_len, buffer);\n+\t\telse\n+\t\t\tciphertext = rte_pktmbuf_read(ut_params->ibuf, 0,\n+\t\t\t\t\tciphertext_len, buffer);\n \n-\tut_params->op = process_crypto_request(ts_params->valid_devs[0],\n-\t\t\t\t\t\tut_params->op);\n-\tTEST_ASSERT_NOT_NULL(ut_params->op, \"failed to retrieve obuf\");\n+\t\tdebug_hexdump(stdout, \"ciphertext:\", ciphertext,\n+\t\t\tciphertext_len);\n+\t\tdebug_hexdump(stdout, \"ciphertext expected:\",\n+\t\t\ttdata->ciphertext.data, tdata->ciphertext.len >> 3);\n \n-\tut_params->obuf = ut_params->op->sym->m_dst;\n-\tif (ut_params->obuf)\n-\t\tciphertext = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *);\n-\telse\n-\t\tciphertext = plaintext;\n+\t\tif (ut_params->obuf)\n+\t\t\tdigest = rte_pktmbuf_read(ut_params->obuf,\n+\t\t\t\t(tdata->digest.offset_bytes == 0 ?\n+\t\t\t\tplaintext_pad_len : tdata->digest.offset_bytes),\n+\t\t\t\ttdata->digest.len, digest_buffer);\n+\t\telse\n+\t\t\tdigest = rte_pktmbuf_read(ut_params->ibuf,\n+\t\t\t\t(tdata->digest.offset_bytes == 0 ?\n+\t\t\t\tplaintext_pad_len : tdata->digest.offset_bytes),\n+\t\t\t\ttdata->digest.len, digest_buffer);\n \n-\tdebug_hexdump(stdout, \"ciphertext:\", ciphertext, plaintext_len);\n+\t\tdebug_hexdump(stdout, \"digest:\", digest,\n+\t\t\ttdata->digest.len);\n+\t\tdebug_hexdump(stdout, \"digest expected:\",\n+\t\t\ttdata->digest.data, tdata->digest.len);\n+\t}\n \n \t/* Validate obuf */\n-\tTEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(\n-\t\tciphertext,\n-\t\ttdata->ciphertext.data,\n-\t\ttdata->validDataLenInBits.len,\n-\t\t\"SNOW 3G Ciphertext data not as expected\");\n+\tif (verify) {\n+\t\tTEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(\n+\t\t\tplaintext,\n+\t\t\ttdata->plaintext.data,\n+\t\t\ttdata->plaintext.len >> 3,\n+\t\t\t\"SNOW 3G Plaintext data not as expected\");\n+\t} else {\n+\t\tTEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(\n+\t\t\tciphertext,\n+\t\t\ttdata->ciphertext.data,\n+\t\t\ttdata->validDataLenInBits.len,\n+\t\t\t\"SNOW 3G Ciphertext data not as expected\");\n+\n+\t\tTEST_ASSERT_BUFFERS_ARE_EQUAL(\n+\t\t\tdigest,\n+\t\t\ttdata->digest.data,\n+\t\t\tDIGEST_BYTE_LENGTH_SNOW3G_UIA2,\n+\t\t\t\"SNOW 3G Generated auth tag not as expected\");\n+\t}\n \treturn 0;\n }\n \n-\n static int\n-test_snow3g_encryption_oop(const struct snow3g_test_data *tdata)\n+test_kasumi_auth_cipher(const struct kasumi_test_data *tdata,\n+\tuint8_t op_mode, uint8_t verify)\n {\n \tstruct crypto_testsuite_params *ts_params = &testsuite_params;\n \tstruct crypto_unittest_params *ut_params = &unittest_params;\n-\tuint8_t *plaintext, *ciphertext;\n \n \tint retval;\n-\tunsigned plaintext_pad_len;\n-\tunsigned plaintext_len;\n \n-\t/* Create SNOW 3G session */\n-\tretval = create_wireless_algo_cipher_session(ts_params->valid_devs[0],\n-\t\t\t\t\tRTE_CRYPTO_CIPHER_OP_ENCRYPT,\n-\t\t\t\t\tRTE_CRYPTO_CIPHER_SNOW3G_UEA2,\n-\t\t\t\t\ttdata->key.data, tdata->key.len,\n-\t\t\t\t\ttdata->cipher_iv.len);\n+\tuint8_t *plaintext = NULL, *ciphertext = NULL;\n+\tunsigned int plaintext_pad_len;\n+\tunsigned int plaintext_len;\n+\tunsigned int ciphertext_pad_len;\n+\tunsigned int ciphertext_len;\n+\n+\tstruct rte_cryptodev_info dev_info;\n+\n+\t/* Verify the capabilities */\n+\tstruct rte_cryptodev_sym_capability_idx cap_idx;\n+\tcap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;\n+\tcap_idx.algo.auth = RTE_CRYPTO_AUTH_KASUMI_F9;\n+\tif (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],\n+\t\t\t&cap_idx) == NULL)\n+\t\treturn -ENOTSUP;\n+\tcap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;\n+\tcap_idx.algo.cipher = RTE_CRYPTO_CIPHER_KASUMI_F8;\n+\tif (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],\n+\t\t\t&cap_idx) == NULL)\n+\t\treturn -ENOTSUP;\n+\n+\trte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);\n+\n+\tuint64_t feat_flags = dev_info.feature_flags;\n+\n+\tif (op_mode == OUT_OF_PLACE) {\n+\t\tif (!(feat_flags & RTE_CRYPTODEV_FF_DIGEST_ENCRYPTED)) {\n+\t\t\tprintf(\"Device doesn't support digest encrypted.\\n\");\n+\t\t\treturn -ENOTSUP;\n+\t\t}\n+\t}\n+\n+\t/* Create KASUMI session */\n+\tretval = create_wireless_algo_auth_cipher_session(\n+\t\t\tts_params->valid_devs[0],\n+\t\t\t(verify ? RTE_CRYPTO_CIPHER_OP_DECRYPT\n+\t\t\t\t\t: RTE_CRYPTO_CIPHER_OP_ENCRYPT),\n+\t\t\t(verify ? RTE_CRYPTO_AUTH_OP_VERIFY\n+\t\t\t\t\t: RTE_CRYPTO_AUTH_OP_GENERATE),\n+\t\t\tRTE_CRYPTO_AUTH_KASUMI_F9,\n+\t\t\tRTE_CRYPTO_CIPHER_KASUMI_F8,\n+\t\t\ttdata->key.data, tdata->key.len,\n+\t\t\t0, tdata->digest.len,\n+\t\t\ttdata->cipher_iv.len);\n+\n \tif (retval < 0)\n \t\treturn retval;\n \n \tut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);\n-\tut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);\n-\n-\tTEST_ASSERT_NOT_NULL(ut_params->ibuf,\n-\t\t\t\"Failed to allocate input buffer in mempool\");\n-\tTEST_ASSERT_NOT_NULL(ut_params->obuf,\n-\t\t\t\"Failed to allocate output buffer in mempool\");\n+\tif (op_mode == OUT_OF_PLACE)\n+\t\tut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);\n \n-\t/* Clear mbuf payload */\n+\t/* clear mbuf payload */\n \tmemset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,\n-\t       rte_pktmbuf_tailroom(ut_params->ibuf));\n+\t\trte_pktmbuf_tailroom(ut_params->ibuf));\n+\tif (op_mode == OUT_OF_PLACE)\n+\t\tmemset(rte_pktmbuf_mtod(ut_params->obuf, uint8_t *), 0,\n+\t\t\trte_pktmbuf_tailroom(ut_params->obuf));\n \n+\tciphertext_len = ceil_byte_length(tdata->ciphertext.len);\n \tplaintext_len = ceil_byte_length(tdata->plaintext.len);\n-\t/* Append data which is padded to a multiple of */\n-\t/* the algorithms block size */\n+\tciphertext_pad_len = RTE_ALIGN_CEIL(ciphertext_len, 16);\n \tplaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16);\n-\tplaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,\n-\t\t\t\tplaintext_pad_len);\n-\trte_pktmbuf_append(ut_params->obuf, plaintext_pad_len);\n-\tmemcpy(plaintext, tdata->plaintext.data, plaintext_len);\n \n-\tdebug_hexdump(stdout, \"plaintext:\", plaintext, plaintext_len);\n+\tif (verify) {\n+\t\tciphertext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,\n+\t\t\t\t\tciphertext_pad_len);\n+\t\tmemcpy(ciphertext, tdata->ciphertext.data, ciphertext_len);\n+\t\tif (op_mode == OUT_OF_PLACE)\n+\t\t\trte_pktmbuf_append(ut_params->obuf, ciphertext_pad_len);\n+\t\tdebug_hexdump(stdout, \"ciphertext:\", ciphertext,\n+\t\t\tciphertext_len);\n+\t} else {\n+\t\tplaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,\n+\t\t\t\t\tplaintext_pad_len);\n+\t\tmemcpy(plaintext, tdata->plaintext.data, plaintext_len);\n+\t\tif (op_mode == OUT_OF_PLACE)\n+\t\t\trte_pktmbuf_append(ut_params->obuf, plaintext_pad_len);\n+\t\tdebug_hexdump(stdout, \"plaintext:\", plaintext,\n+\t\t\tplaintext_len);\n+\t}\n+\n+\t/* Create KASUMI operation */\n+\tretval = create_wireless_algo_auth_cipher_operation(\n+\t\ttdata->digest.len,\n+\t\ttdata->cipher_iv.data, tdata->cipher_iv.len,\n+\t\tNULL, 0,\n+\t\t(tdata->digest.offset_bytes == 0 ?\n+\t\t(verify ? ciphertext_pad_len : plaintext_pad_len)\n+\t\t\t: tdata->digest.offset_bytes),\n+\t\ttdata->validCipherLenInBits.len,\n+\t\ttdata->validCipherOffsetInBits.len,\n+\t\ttdata->validAuthLenInBits.len,\n+\t\t0,\n+\t\top_mode, 0);\n \n-\t/* Create SNOW 3G operation */\n-\tretval = create_wireless_algo_cipher_operation_oop(tdata->cipher_iv.data,\n-\t\t\t\t\ttdata->cipher_iv.len,\n-\t\t\t\t\ttdata->validCipherLenInBits.len,\n-\t\t\t\t\t0);\n \tif (retval < 0)\n \t\treturn retval;\n \n \tut_params->op = process_crypto_request(ts_params->valid_devs[0],\n-\t\t\t\t\t\tut_params->op);\n-\tTEST_ASSERT_NOT_NULL(ut_params->op, \"failed to retrieve obuf\");\n-\n-\tut_params->obuf = ut_params->op->sym->m_dst;\n-\tif (ut_params->obuf)\n-\t\tciphertext = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *);\n-\telse\n-\t\tciphertext = plaintext;\n+\t\t\tut_params->op);\n \n-\tdebug_hexdump(stdout, \"ciphertext:\", ciphertext, plaintext_len);\n+\tTEST_ASSERT_NOT_NULL(ut_params->op, \"failed to retrieve obuf\");\n \n-\t/* Validate obuf */\n-\tTEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(\n-\t\tciphertext,\n-\t\ttdata->ciphertext.data,\n-\t\ttdata->validDataLenInBits.len,\n-\t\t\"SNOW 3G Ciphertext data not as expected\");\n-\treturn 0;\n-}\n+\tut_params->obuf = (op_mode == IN_PLACE ?\n+\t\tut_params->op->sym->m_src : ut_params->op->sym->m_dst);\n \n-static int\n-test_snow3g_encryption_oop_sgl(const struct snow3g_test_data *tdata)\n-{\n-\tstruct crypto_testsuite_params *ts_params = &testsuite_params;\n-\tstruct crypto_unittest_params *ut_params = &unittest_params;\n \n-\tint retval;\n-\tunsigned int plaintext_pad_len;\n-\tunsigned int plaintext_len;\n-\tuint8_t buffer[10000];\n-\tconst uint8_t *ciphertext;\n+\tif (verify) {\n+\t\tif (ut_params->obuf)\n+\t\t\tplaintext = rte_pktmbuf_mtod(ut_params->obuf,\n+\t\t\t\t\t\t\tuint8_t *);\n+\t\telse\n+\t\t\tplaintext = ciphertext;\n \n-\tstruct rte_cryptodev_info dev_info;\n+\t\tdebug_hexdump(stdout, \"plaintext:\", plaintext,\n+\t\t\t(tdata->plaintext.len >> 3) - tdata->digest.len);\n+\t\tdebug_hexdump(stdout, \"plaintext expected:\",\n+\t\t\ttdata->plaintext.data,\n+\t\t\t(tdata->plaintext.len >> 3) - tdata->digest.len);\n+\t} else {\n+\t\tif (ut_params->obuf)\n+\t\t\tciphertext = rte_pktmbuf_mtod(ut_params->obuf,\n+\t\t\t\t\t\t\tuint8_t *);\n+\t\telse\n+\t\t\tciphertext = plaintext;\n \n-\trte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);\n+\t\tdebug_hexdump(stdout, \"ciphertext:\", ciphertext,\n+\t\t\tciphertext_len);\n+\t\tdebug_hexdump(stdout, \"ciphertext expected:\",\n+\t\t\ttdata->ciphertext.data, tdata->ciphertext.len >> 3);\n \n-\tuint64_t feat_flags = dev_info.feature_flags;\n+\t\tut_params->digest = rte_pktmbuf_mtod(\n+\t\t\tut_params->obuf, uint8_t *) +\n+\t\t\t(tdata->digest.offset_bytes == 0 ?\n+\t\t\tplaintext_pad_len : tdata->digest.offset_bytes);\n \n-\tif (!(feat_flags & RTE_CRYPTODEV_FF_OOP_SGL_IN_SGL_OUT)) {\n-\t\tprintf(\"Device doesn't support out-of-place scatter-gather \"\n-\t\t\t\t\"in both input and output mbufs. \"\n-\t\t\t\t\"Test Skipped.\\n\");\n+\t\tdebug_hexdump(stdout, \"digest:\", ut_params->digest,\n+\t\t\ttdata->digest.len);\n+\t\tdebug_hexdump(stdout, \"digest expected:\",\n+\t\t\ttdata->digest.data, tdata->digest.len);\n+\t}\n+\n+\t/* Validate obuf */\n+\tif (verify) {\n+\t\tTEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(\n+\t\t\tplaintext,\n+\t\t\ttdata->plaintext.data,\n+\t\t\ttdata->plaintext.len >> 3,\n+\t\t\t\"KASUMI Plaintext data not as expected\");\n+\t} else {\n+\t\tTEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(\n+\t\t\tciphertext,\n+\t\t\ttdata->ciphertext.data,\n+\t\t\ttdata->ciphertext.len >> 3,\n+\t\t\t\"KASUMI Ciphertext data not as expected\");\n+\n+\t\tTEST_ASSERT_BUFFERS_ARE_EQUAL(\n+\t\t\tut_params->digest,\n+\t\t\ttdata->digest.data,\n+\t\t\tDIGEST_BYTE_LENGTH_KASUMI_F9,\n+\t\t\t\"KASUMI Generated auth tag not as expected\");\n+\t}\n+\treturn 0;\n+}\n+\n+static int\n+test_kasumi_auth_cipher_sgl(const struct kasumi_test_data *tdata,\n+\tuint8_t op_mode, uint8_t verify)\n+{\n+\tstruct crypto_testsuite_params *ts_params = &testsuite_params;\n+\tstruct crypto_unittest_params *ut_params = &unittest_params;\n+\n+\tint retval;\n+\n+\tconst uint8_t *plaintext = NULL;\n+\tconst uint8_t *ciphertext = NULL;\n+\tconst uint8_t *digest = NULL;\n+\tunsigned int plaintext_pad_len;\n+\tunsigned int plaintext_len;\n+\tunsigned int ciphertext_pad_len;\n+\tunsigned int ciphertext_len;\n+\tuint8_t buffer[10000];\n+\tuint8_t digest_buffer[10000];\n+\n+\tstruct rte_cryptodev_info dev_info;\n+\n+\t/* Verify the capabilities */\n+\tstruct rte_cryptodev_sym_capability_idx cap_idx;\n+\tcap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;\n+\tcap_idx.algo.auth = RTE_CRYPTO_AUTH_KASUMI_F9;\n+\tif (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],\n+\t\t\t&cap_idx) == NULL)\n+\t\treturn -ENOTSUP;\n+\tcap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;\n+\tcap_idx.algo.cipher = RTE_CRYPTO_CIPHER_KASUMI_F8;\n+\tif (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],\n+\t\t\t&cap_idx) == NULL)\n \t\treturn -ENOTSUP;\n+\n+\trte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);\n+\n+\tuint64_t feat_flags = dev_info.feature_flags;\n+\n+\tif (op_mode == IN_PLACE) {\n+\t\tif (!(feat_flags & RTE_CRYPTODEV_FF_IN_PLACE_SGL)) {\n+\t\t\tprintf(\"Device doesn't support in-place scatter-gather \"\n+\t\t\t\t\t\"in both input and output mbufs.\\n\");\n+\t\t\treturn -ENOTSUP;\n+\t\t}\n+\t} else {\n+\t\tif (!(feat_flags & RTE_CRYPTODEV_FF_OOP_SGL_IN_SGL_OUT)) {\n+\t\t\tprintf(\"Device doesn't support out-of-place scatter-gather \"\n+\t\t\t\t\t\"in both input and output mbufs.\\n\");\n+\t\t\treturn -ENOTSUP;\n+\t\t}\n+\t\tif (!(feat_flags & RTE_CRYPTODEV_FF_DIGEST_ENCRYPTED)) {\n+\t\t\tprintf(\"Device doesn't support digest encrypted.\\n\");\n+\t\t\treturn -ENOTSUP;\n+\t\t}\n \t}\n \n-\t/* Create SNOW 3G session */\n-\tretval = create_wireless_algo_cipher_session(ts_params->valid_devs[0],\n-\t\t\t\t\tRTE_CRYPTO_CIPHER_OP_ENCRYPT,\n-\t\t\t\t\tRTE_CRYPTO_CIPHER_SNOW3G_UEA2,\n-\t\t\t\t\ttdata->key.data, tdata->key.len,\n-\t\t\t\t\ttdata->cipher_iv.len);\n+\t/* Create KASUMI session */\n+\tretval = create_wireless_algo_auth_cipher_session(\n+\t\t\tts_params->valid_devs[0],\n+\t\t\t(verify ? RTE_CRYPTO_CIPHER_OP_DECRYPT\n+\t\t\t\t\t: RTE_CRYPTO_CIPHER_OP_ENCRYPT),\n+\t\t\t(verify ? RTE_CRYPTO_AUTH_OP_VERIFY\n+\t\t\t\t\t: RTE_CRYPTO_AUTH_OP_GENERATE),\n+\t\t\tRTE_CRYPTO_AUTH_KASUMI_F9,\n+\t\t\tRTE_CRYPTO_CIPHER_KASUMI_F8,\n+\t\t\ttdata->key.data, tdata->key.len,\n+\t\t\t0, tdata->digest.len,\n+\t\t\ttdata->cipher_iv.len);\n+\n \tif (retval < 0)\n \t\treturn retval;\n \n+\tciphertext_len = ceil_byte_length(tdata->ciphertext.len);\n \tplaintext_len = ceil_byte_length(tdata->plaintext.len);\n-\t/* Append data which is padded to a multiple of */\n-\t/* the algorithms block size */\n+\tciphertext_pad_len = RTE_ALIGN_CEIL(ciphertext_len, 16);\n \tplaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16);\n \n \tut_params->ibuf = create_segmented_mbuf(ts_params->mbuf_pool,\n-\t\t\tplaintext_pad_len, 10, 0);\n-\tut_params->obuf = create_segmented_mbuf(ts_params->mbuf_pool,\n-\t\t\tplaintext_pad_len, 3, 0);\n-\n+\t\t\tplaintext_pad_len, 15, 0);\n \tTEST_ASSERT_NOT_NULL(ut_params->ibuf,\n \t\t\t\"Failed to allocate input buffer in mempool\");\n-\tTEST_ASSERT_NOT_NULL(ut_params->obuf,\n-\t\t\t\"Failed to allocate output buffer in mempool\");\n \n-\tpktmbuf_write(ut_params->ibuf, 0, plaintext_len, tdata->plaintext.data);\n+\tif (op_mode == OUT_OF_PLACE) {\n+\t\tut_params->obuf = create_segmented_mbuf(ts_params->mbuf_pool,\n+\t\t\t\tplaintext_pad_len, 15, 0);\n+\t\tTEST_ASSERT_NOT_NULL(ut_params->obuf,\n+\t\t\t\t\"Failed to allocate output buffer in mempool\");\n+\t}\n+\n+\tif (verify) {\n+\t\tpktmbuf_write(ut_params->ibuf, 0, ciphertext_len,\n+\t\t\ttdata->ciphertext.data);\n+\t\tciphertext = rte_pktmbuf_read(ut_params->ibuf, 0,\n+\t\t\t\t\tciphertext_len, buffer);\n+\t\tdebug_hexdump(stdout, \"ciphertext:\", ciphertext,\n+\t\t\tciphertext_len);\n+\t} else {\n+\t\tpktmbuf_write(ut_params->ibuf, 0, plaintext_len,\n+\t\t\ttdata->plaintext.data);\n+\t\tplaintext = rte_pktmbuf_read(ut_params->ibuf, 0,\n+\t\t\t\t\tplaintext_len, buffer);\n+\t\tdebug_hexdump(stdout, \"plaintext:\", plaintext,\n+\t\t\tplaintext_len);\n+\t}\n+\tmemset(buffer, 0, sizeof(buffer));\n+\n+\t/* Create KASUMI operation */\n+\tretval = create_wireless_algo_auth_cipher_operation(\n+\t\ttdata->digest.len,\n+\t\ttdata->cipher_iv.data, tdata->cipher_iv.len,\n+\t\tNULL, 0,\n+\t\t(tdata->digest.offset_bytes == 0 ?\n+\t\t(verify ? ciphertext_pad_len : plaintext_pad_len)\n+\t\t\t: tdata->digest.offset_bytes),\n+\t\ttdata->validCipherLenInBits.len,\n+\t\ttdata->validCipherOffsetInBits.len,\n+\t\ttdata->validAuthLenInBits.len,\n+\t\t0,\n+\t\top_mode, 1);\n \n-\t/* Create SNOW 3G operation */\n-\tretval = create_wireless_algo_cipher_operation_oop(tdata->cipher_iv.data,\n-\t\t\t\t\ttdata->cipher_iv.len,\n-\t\t\t\t\ttdata->validCipherLenInBits.len,\n-\t\t\t\t\t0);\n \tif (retval < 0)\n \t\treturn retval;\n \n \tut_params->op = process_crypto_request(ts_params->valid_devs[0],\n-\t\t\t\t\t\tut_params->op);\n+\t\t\tut_params->op);\n+\n \tTEST_ASSERT_NOT_NULL(ut_params->op, \"failed to retrieve obuf\");\n \n-\tut_params->obuf = ut_params->op->sym->m_dst;\n-\tif (ut_params->obuf)\n-\t\tciphertext = rte_pktmbuf_read(ut_params->obuf, 0,\n-\t\t\t\tplaintext_len, buffer);\n-\telse\n-\t\tciphertext = rte_pktmbuf_read(ut_params->ibuf, 0,\n-\t\t\t\tplaintext_len, buffer);\n+\tut_params->obuf = (op_mode == IN_PLACE ?\n+\t\tut_params->op->sym->m_src : ut_params->op->sym->m_dst);\n \n-\tdebug_hexdump(stdout, \"ciphertext:\", ciphertext, plaintext_len);\n+\tif (verify) {\n+\t\tif (ut_params->obuf)\n+\t\t\tplaintext = rte_pktmbuf_read(ut_params->obuf, 0,\n+\t\t\t\t\tplaintext_len, buffer);\n+\t\telse\n+\t\t\tplaintext = rte_pktmbuf_read(ut_params->ibuf, 0,\n+\t\t\t\t\tplaintext_len, buffer);\n \n-\t/* Validate obuf */\n-\tTEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(\n-\t\tciphertext,\n-\t\ttdata->ciphertext.data,\n-\t\ttdata->validDataLenInBits.len,\n-\t\t\"SNOW 3G Ciphertext data not as expected\");\n+\t\tdebug_hexdump(stdout, \"plaintext:\", plaintext,\n+\t\t\t(tdata->plaintext.len >> 3) - tdata->digest.len);\n+\t\tdebug_hexdump(stdout, \"plaintext expected:\",\n+\t\t\ttdata->plaintext.data,\n+\t\t\t(tdata->plaintext.len >> 3) - tdata->digest.len);\n+\t} else {\n+\t\tif (ut_params->obuf)\n+\t\t\tciphertext = rte_pktmbuf_read(ut_params->obuf, 0,\n+\t\t\t\t\tciphertext_len, buffer);\n+\t\telse\n+\t\t\tciphertext = rte_pktmbuf_read(ut_params->ibuf, 0,\n+\t\t\t\t\tciphertext_len, buffer);\n \n-\treturn 0;\n-}\n+\t\tdebug_hexdump(stdout, \"ciphertext:\", ciphertext,\n+\t\t\tciphertext_len);\n+\t\tdebug_hexdump(stdout, \"ciphertext expected:\",\n+\t\t\ttdata->ciphertext.data, tdata->ciphertext.len >> 3);\n \n-/* Shift right a buffer by \"offset\" bits, \"offset\" < 8 */\n-static void\n-buffer_shift_right(uint8_t *buffer, uint32_t length, uint8_t offset)\n-{\n-\tuint8_t curr_byte, prev_byte;\n-\tuint32_t length_in_bytes = ceil_byte_length(length + offset);\n-\tuint8_t lower_byte_mask = (1 << offset) - 1;\n-\tunsigned i;\n+\t\tif (ut_params->obuf)\n+\t\t\tdigest = rte_pktmbuf_read(ut_params->obuf,\n+\t\t\t\t(tdata->digest.offset_bytes == 0 ?\n+\t\t\t\tplaintext_pad_len : tdata->digest.offset_bytes),\n+\t\t\t\ttdata->digest.len, digest_buffer);\n+\t\telse\n+\t\t\tdigest = rte_pktmbuf_read(ut_params->ibuf,\n+\t\t\t\t(tdata->digest.offset_bytes == 0 ?\n+\t\t\t\tplaintext_pad_len : tdata->digest.offset_bytes),\n+\t\t\t\ttdata->digest.len, digest_buffer);\n \n-\tprev_byte = buffer[0];\n-\tbuffer[0] >>= offset;\n+\t\tdebug_hexdump(stdout, \"digest:\", digest,\n+\t\t\ttdata->digest.len);\n+\t\tdebug_hexdump(stdout, \"digest expected:\",\n+\t\t\ttdata->digest.data, tdata->digest.len);\n+\t}\n \n-\tfor (i = 1; i < length_in_bytes; i++) {\n-\t\tcurr_byte = buffer[i];\n-\t\tbuffer[i] = ((prev_byte & lower_byte_mask) << (8 - offset)) |\n-\t\t\t\t(curr_byte >> offset);\n-\t\tprev_byte = curr_byte;\n+\t/* Validate obuf */\n+\tif (verify) {\n+\t\tTEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(\n+\t\t\tplaintext,\n+\t\t\ttdata->plaintext.data,\n+\t\t\ttdata->plaintext.len >> 3,\n+\t\t\t\"KASUMI Plaintext data not as expected\");\n+\t} else {\n+\t\tTEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(\n+\t\t\tciphertext,\n+\t\t\ttdata->ciphertext.data,\n+\t\t\ttdata->validDataLenInBits.len,\n+\t\t\t\"KASUMI Ciphertext data not as expected\");\n+\n+\t\tTEST_ASSERT_BUFFERS_ARE_EQUAL(\n+\t\t\tdigest,\n+\t\t\ttdata->digest.data,\n+\t\t\tDIGEST_BYTE_LENGTH_KASUMI_F9,\n+\t\t\t\"KASUMI Generated auth tag not as expected\");\n \t}\n+\treturn 0;\n }\n \n static int\n-test_snow3g_encryption_offset_oop(const struct snow3g_test_data *tdata)\n+test_kasumi_cipher_auth(const struct kasumi_test_data *tdata)\n {\n \tstruct crypto_testsuite_params *ts_params = &testsuite_params;\n \tstruct crypto_unittest_params *ut_params = &unittest_params;\n-\tuint8_t *plaintext, *ciphertext;\n+\n \tint retval;\n-\tuint32_t plaintext_len;\n-\tuint32_t plaintext_pad_len;\n-\tuint8_t extra_offset = 4;\n-\tuint8_t *expected_ciphertext_shifted;\n \n-\t/* Create SNOW 3G session */\n-\tretval = create_wireless_algo_cipher_session(ts_params->valid_devs[0],\n-\t\t\t\t\tRTE_CRYPTO_CIPHER_OP_ENCRYPT,\n-\t\t\t\t\tRTE_CRYPTO_CIPHER_SNOW3G_UEA2,\n-\t\t\t\t\ttdata->key.data, tdata->key.len,\n-\t\t\t\t\ttdata->cipher_iv.len);\n+\tuint8_t *plaintext, *ciphertext;\n+\tunsigned plaintext_pad_len;\n+\tunsigned plaintext_len;\n+\n+\t/* Verify the capabilities */\n+\tstruct rte_cryptodev_sym_capability_idx cap_idx;\n+\tcap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;\n+\tcap_idx.algo.auth = RTE_CRYPTO_AUTH_KASUMI_F9;\n+\tif (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],\n+\t\t\t&cap_idx) == NULL)\n+\t\treturn -ENOTSUP;\n+\tcap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;\n+\tcap_idx.algo.cipher = RTE_CRYPTO_CIPHER_KASUMI_F8;\n+\tif (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],\n+\t\t\t&cap_idx) == NULL)\n+\t\treturn -ENOTSUP;\n+\n+\t/* Create KASUMI session */\n+\tretval = create_wireless_algo_cipher_auth_session(\n+\t\t\tts_params->valid_devs[0],\n+\t\t\tRTE_CRYPTO_CIPHER_OP_ENCRYPT,\n+\t\t\tRTE_CRYPTO_AUTH_OP_GENERATE,\n+\t\t\tRTE_CRYPTO_AUTH_KASUMI_F9,\n+\t\t\tRTE_CRYPTO_CIPHER_KASUMI_F8,\n+\t\t\ttdata->key.data, tdata->key.len,\n+\t\t\t0, tdata->digest.len,\n+\t\t\ttdata->cipher_iv.len);\n \tif (retval < 0)\n \t\treturn retval;\n \n \tut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);\n-\tut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);\n \n-\tTEST_ASSERT_NOT_NULL(ut_params->ibuf,\n-\t\t\t\"Failed to allocate input buffer in mempool\");\n-\tTEST_ASSERT_NOT_NULL(ut_params->obuf,\n-\t\t\t\"Failed to allocate output buffer in mempool\");\n-\n-\t/* Clear mbuf payload */\n+\t/* clear mbuf payload */\n \tmemset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,\n-\t       rte_pktmbuf_tailroom(ut_params->ibuf));\n+\t\t\trte_pktmbuf_tailroom(ut_params->ibuf));\n \n-\tplaintext_len = ceil_byte_length(tdata->plaintext.len + extra_offset);\n-\t/*\n-\t * Append data which is padded to a\n-\t * multiple of the algorithms block size\n-\t */\n+\tplaintext_len = ceil_byte_length(tdata->plaintext.len);\n+\t/* Append data which is padded to a multiple of */\n+\t/* the algorithms block size */\n \tplaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16);\n+\tplaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,\n+\t\t\t\tplaintext_pad_len);\n+\tmemcpy(plaintext, tdata->plaintext.data, plaintext_len);\n \n-\tplaintext = (uint8_t *) rte_pktmbuf_append(ut_params->ibuf,\n-\t\t\t\t\t\tplaintext_pad_len);\n-\n-\trte_pktmbuf_append(ut_params->obuf, plaintext_pad_len);\n-\n-\tmemcpy(plaintext, tdata->plaintext.data, (tdata->plaintext.len >> 3));\n-\tbuffer_shift_right(plaintext, tdata->plaintext.len, extra_offset);\n+\tdebug_hexdump(stdout, \"plaintext:\", plaintext, plaintext_len);\n \n-#ifdef RTE_APP_TEST_DEBUG\n-\trte_hexdump(stdout, \"plaintext:\", plaintext, tdata->plaintext.len);\n-#endif\n-\t/* Create SNOW 3G operation */\n-\tretval = create_wireless_algo_cipher_operation_oop(tdata->cipher_iv.data,\n-\t\t\t\t\ttdata->cipher_iv.len,\n-\t\t\t\t\ttdata->validCipherLenInBits.len,\n-\t\t\t\t\textra_offset);\n+\t/* Create KASUMI operation */\n+\tretval = create_wireless_algo_cipher_hash_operation(tdata->digest.data,\n+\t\t\t\ttdata->digest.len, NULL, 0,\n+\t\t\t\tplaintext_pad_len, RTE_CRYPTO_AUTH_OP_GENERATE,\n+\t\t\t\ttdata->cipher_iv.data, tdata->cipher_iv.len,\n+\t\t\t\tRTE_ALIGN_CEIL(tdata->validCipherLenInBits.len,\n+\t\t\t\t\t8),\n+\t\t\t\ttdata->validCipherOffsetInBits.len,\n+\t\t\t\ttdata->validAuthLenInBits.len,\n+\t\t\t\t0\n+\t\t\t\t);\n \tif (retval < 0)\n \t\treturn retval;\n \n \tut_params->op = process_crypto_request(ts_params->valid_devs[0],\n-\t\t\t\t\t\tut_params->op);\n+\t\t\tut_params->op);\n \tTEST_ASSERT_NOT_NULL(ut_params->op, \"failed to retrieve obuf\");\n \n-\tut_params->obuf = ut_params->op->sym->m_dst;\n-\tif (ut_params->obuf)\n-\t\tciphertext = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *);\n+\tif (ut_params->op->sym->m_dst)\n+\t\tut_params->obuf = ut_params->op->sym->m_dst;\n \telse\n-\t\tciphertext = plaintext;\n-\n-#ifdef RTE_APP_TEST_DEBUG\n-\trte_hexdump(stdout, \"ciphertext:\", ciphertext, plaintext_len);\n-#endif\n+\t\tut_params->obuf = ut_params->op->sym->m_src;\n \n-\texpected_ciphertext_shifted = rte_malloc(NULL, plaintext_len, 8);\n+\tciphertext = rte_pktmbuf_mtod_offset(ut_params->obuf, uint8_t *,\n+\t\t\t\ttdata->validCipherOffsetInBits.len >> 3);\n \n-\tTEST_ASSERT_NOT_NULL(expected_ciphertext_shifted,\n-\t\t\t\"failed to reserve memory for ciphertext shifted\\n\");\n+\tut_params->digest = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *)\n+\t\t\t+ plaintext_pad_len;\n \n-\tmemcpy(expected_ciphertext_shifted, tdata->ciphertext.data,\n-\t\t\tceil_byte_length(tdata->ciphertext.len));\n-\tbuffer_shift_right(expected_ciphertext_shifted, tdata->ciphertext.len,\n-\t\t\textra_offset);\n+\tconst uint8_t *reference_ciphertext = tdata->ciphertext.data +\n+\t\t\t\t(tdata->validCipherOffsetInBits.len >> 3);\n \t/* Validate obuf */\n-\tTEST_ASSERT_BUFFERS_ARE_EQUAL_BIT_OFFSET(\n+\tTEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(\n \t\tciphertext,\n-\t\texpected_ciphertext_shifted,\n-\t\ttdata->validDataLenInBits.len,\n-\t\textra_offset,\n-\t\t\"SNOW 3G Ciphertext data not as expected\");\n+\t\treference_ciphertext,\n+\t\ttdata->validCipherLenInBits.len,\n+\t\t\"KASUMI Ciphertext data not as expected\");\n+\n+\t/* Validate obuf */\n+\tTEST_ASSERT_BUFFERS_ARE_EQUAL(\n+\t\tut_params->digest,\n+\t\ttdata->digest.data,\n+\t\tDIGEST_BYTE_LENGTH_SNOW3G_UIA2,\n+\t\t\"KASUMI Generated auth tag not as expected\");\n \treturn 0;\n }\n \n-static int test_snow3g_decryption(const struct snow3g_test_data *tdata)\n+static int\n+test_zuc_encryption(const struct wireless_test_data *tdata)\n {\n \tstruct crypto_testsuite_params *ts_params = &testsuite_params;\n \tstruct crypto_unittest_params *ut_params = &unittest_params;\n \n \tint retval;\n-\n \tuint8_t *plaintext, *ciphertext;\n-\tunsigned ciphertext_pad_len;\n-\tunsigned ciphertext_len;\n-\n-\t/* Create SNOW 3G session */\n-\tretval = create_wireless_algo_cipher_session(ts_params->valid_devs[0],\n-\t\t\t\t\tRTE_CRYPTO_CIPHER_OP_DECRYPT,\n-\t\t\t\t\tRTE_CRYPTO_CIPHER_SNOW3G_UEA2,\n-\t\t\t\t\ttdata->key.data, tdata->key.len,\n-\t\t\t\t\ttdata->cipher_iv.len);\n-\tif (retval < 0)\n-\t\treturn retval;\n-\n-\tut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);\n-\n-\t/* Clear mbuf payload */\n-\tmemset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,\n-\t       rte_pktmbuf_tailroom(ut_params->ibuf));\n-\n-\tciphertext_len = ceil_byte_length(tdata->ciphertext.len);\n-\t/* Append data which is padded to a multiple of */\n-\t/* the algorithms block size */\n-\tciphertext_pad_len = RTE_ALIGN_CEIL(ciphertext_len, 16);\n-\tciphertext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,\n-\t\t\t\tciphertext_pad_len);\n-\tmemcpy(ciphertext, tdata->ciphertext.data, ciphertext_len);\n-\n-\tdebug_hexdump(stdout, \"ciphertext:\", ciphertext, ciphertext_len);\n-\n-\t/* Create SNOW 3G operation */\n-\tretval = create_wireless_algo_cipher_operation(tdata->cipher_iv.data,\n-\t\t\t\t\ttdata->cipher_iv.len,\n-\t\t\t\t\ttdata->validCipherLenInBits.len,\n-\t\t\t\t\ttdata->cipher.offset_bits);\n-\tif (retval < 0)\n-\t\treturn retval;\n-\n-\tut_params->op = process_crypto_request(ts_params->valid_devs[0],\n-\t\t\t\t\t\tut_params->op);\n-\tTEST_ASSERT_NOT_NULL(ut_params->op, \"failed to retrieve obuf\");\n-\tut_params->obuf = ut_params->op->sym->m_dst;\n-\tif (ut_params->obuf)\n-\t\tplaintext = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *);\n-\telse\n-\t\tplaintext = ciphertext;\n-\n-\tdebug_hexdump(stdout, \"plaintext:\", plaintext, ciphertext_len);\n-\n-\t/* Validate obuf */\n-\tTEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(plaintext,\n-\t\t\t\ttdata->plaintext.data,\n-\t\t\t\ttdata->validDataLenInBits.len,\n-\t\t\t\t\"SNOW 3G Plaintext data not as expected\");\n-\treturn 0;\n-}\n+\tunsigned plaintext_pad_len;\n+\tunsigned plaintext_len;\n \n-static int test_snow3g_decryption_oop(const struct snow3g_test_data *tdata)\n-{\n-\tstruct crypto_testsuite_params *ts_params = &testsuite_params;\n-\tstruct crypto_unittest_params *ut_params = &unittest_params;\n+\tstruct rte_cryptodev_sym_capability_idx cap_idx;\n \n-\tint retval;\n+\t/* Check if device supports ZUC EEA3 */\n+\tcap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;\n+\tcap_idx.algo.cipher = RTE_CRYPTO_CIPHER_ZUC_EEA3;\n \n-\tuint8_t *plaintext, *ciphertext;\n-\tunsigned ciphertext_pad_len;\n-\tunsigned ciphertext_len;\n+\tif (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],\n+\t\t\t&cap_idx) == NULL)\n+\t\treturn -ENOTSUP;\n \n-\t/* Create SNOW 3G session */\n+\t/* Create ZUC session */\n \tretval = create_wireless_algo_cipher_session(ts_params->valid_devs[0],\n-\t\t\t\t\tRTE_CRYPTO_CIPHER_OP_DECRYPT,\n-\t\t\t\t\tRTE_CRYPTO_CIPHER_SNOW3G_UEA2,\n+\t\t\t\t\tRTE_CRYPTO_CIPHER_OP_ENCRYPT,\n+\t\t\t\t\tRTE_CRYPTO_CIPHER_ZUC_EEA3,\n \t\t\t\t\ttdata->key.data, tdata->key.len,\n \t\t\t\t\ttdata->cipher_iv.len);\n \tif (retval < 0)\n \t\treturn retval;\n \n \tut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);\n-\tut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);\n-\n-\tTEST_ASSERT_NOT_NULL(ut_params->ibuf,\n-\t\t\t\"Failed to allocate input buffer\");\n-\tTEST_ASSERT_NOT_NULL(ut_params->obuf,\n-\t\t\t\"Failed to allocate output buffer\");\n \n \t/* Clear mbuf payload */\n \tmemset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,\n \t       rte_pktmbuf_tailroom(ut_params->ibuf));\n \n-\tmemset(rte_pktmbuf_mtod(ut_params->obuf, uint8_t *), 0,\n-\t\t       rte_pktmbuf_tailroom(ut_params->obuf));\n-\n-\tciphertext_len = ceil_byte_length(tdata->ciphertext.len);\n-\t/* Append data which is padded to a multiple of */\n-\t/* the algorithms block size */\n-\tciphertext_pad_len = RTE_ALIGN_CEIL(ciphertext_len, 16);\n-\tciphertext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,\n-\t\t\t\tciphertext_pad_len);\n-\trte_pktmbuf_append(ut_params->obuf, ciphertext_pad_len);\n-\tmemcpy(ciphertext, tdata->ciphertext.data, ciphertext_len);\n+\tplaintext_len = ceil_byte_length(tdata->plaintext.len);\n+\t/* Append data which is padded to a multiple */\n+\t/* of the algorithms block size */\n+\tplaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 8);\n+\tplaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,\n+\t\t\t\tplaintext_pad_len);\n+\tmemcpy(plaintext, tdata->plaintext.data, plaintext_len);\n \n-\tdebug_hexdump(stdout, \"ciphertext:\", ciphertext, ciphertext_len);\n+\tdebug_hexdump(stdout, \"plaintext:\", plaintext, plaintext_len);\n \n-\t/* Create SNOW 3G operation */\n-\tretval = create_wireless_algo_cipher_operation_oop(tdata->cipher_iv.data,\n+\t/* Create ZUC operation */\n+\tretval = create_wireless_algo_cipher_operation(tdata->cipher_iv.data,\n \t\t\t\t\ttdata->cipher_iv.len,\n-\t\t\t\t\ttdata->validCipherLenInBits.len,\n+\t\t\t\t\ttdata->plaintext.len,\n \t\t\t\t\t0);\n \tif (retval < 0)\n \t\treturn retval;\n@@ -4419,33 +4855,37 @@ static int test_snow3g_decryption_oop(const struct snow3g_test_data *tdata)\n \tut_params->op = process_crypto_request(ts_params->valid_devs[0],\n \t\t\t\t\t\tut_params->op);\n \tTEST_ASSERT_NOT_NULL(ut_params->op, \"failed to retrieve obuf\");\n+\n \tut_params->obuf = ut_params->op->sym->m_dst;\n \tif (ut_params->obuf)\n-\t\tplaintext = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *);\n+\t\tciphertext = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *);\n \telse\n-\t\tplaintext = ciphertext;\n+\t\tciphertext = plaintext;\n \n-\tdebug_hexdump(stdout, \"plaintext:\", plaintext, ciphertext_len);\n+\tdebug_hexdump(stdout, \"ciphertext:\", ciphertext, plaintext_len);\n \n \t/* Validate obuf */\n-\tTEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(plaintext,\n-\t\t\t\ttdata->plaintext.data,\n-\t\t\t\ttdata->validDataLenInBits.len,\n-\t\t\t\t\"SNOW 3G Plaintext data not as expected\");\n+\tTEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(\n+\t\tciphertext,\n+\t\ttdata->ciphertext.data,\n+\t\ttdata->validCipherLenInBits.len,\n+\t\t\"ZUC Ciphertext data not as expected\");\n \treturn 0;\n }\n \n static int\n-test_zuc_cipher_auth(const struct wireless_test_data *tdata)\n+test_zuc_encryption_sgl(const struct wireless_test_data *tdata)\n {\n \tstruct crypto_testsuite_params *ts_params = &testsuite_params;\n \tstruct crypto_unittest_params *ut_params = &unittest_params;\n \n \tint retval;\n \n-\tuint8_t *plaintext, *ciphertext;\n \tunsigned int plaintext_pad_len;\n \tunsigned int plaintext_len;\n+\tconst uint8_t *ciphertext;\n+\tuint8_t ciphertext_buffer[2048];\n+\tstruct rte_cryptodev_info dev_info;\n \n \tstruct rte_cryptodev_sym_capability_idx cap_idx;\n \n@@ -4457,154 +4897,151 @@ test_zuc_cipher_auth(const struct wireless_test_data *tdata)\n \t\t\t&cap_idx) == NULL)\n \t\treturn -ENOTSUP;\n \n-\t/* Check if device supports ZUC EIA3 */\n-\tcap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;\n-\tcap_idx.algo.auth = RTE_CRYPTO_AUTH_ZUC_EIA3;\n+\trte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);\n \n-\tif (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],\n-\t\t\t&cap_idx) == NULL)\n+\tuint64_t feat_flags = dev_info.feature_flags;\n+\n+\tif (!(feat_flags & RTE_CRYPTODEV_FF_IN_PLACE_SGL)) {\n+\t\tprintf(\"Device doesn't support in-place scatter-gather. \"\n+\t\t\t\t\"Test Skipped.\\n\");\n \t\treturn -ENOTSUP;\n+\t}\n+\n+\tplaintext_len = ceil_byte_length(tdata->plaintext.len);\n+\n+\t/* Append data which is padded to a multiple */\n+\t/* of the algorithms block size */\n+\tplaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 8);\n+\n+\tut_params->ibuf = create_segmented_mbuf(ts_params->mbuf_pool,\n+\t\t\tplaintext_pad_len, 10, 0);\n+\n+\tpktmbuf_write(ut_params->ibuf, 0, plaintext_len,\n+\t\t\ttdata->plaintext.data);\n \n \t/* Create ZUC session */\n-\tretval = create_zuc_cipher_auth_encrypt_generate_session(\n-\t\t\tts_params->valid_devs[0],\n-\t\t\ttdata);\n+\tretval = create_wireless_algo_cipher_session(ts_params->valid_devs[0],\n+\t\t\tRTE_CRYPTO_CIPHER_OP_ENCRYPT,\n+\t\t\tRTE_CRYPTO_CIPHER_ZUC_EEA3,\n+\t\t\ttdata->key.data, tdata->key.len,\n+\t\t\ttdata->cipher_iv.len);\n \tif (retval < 0)\n \t\treturn retval;\n-\tut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);\n-\n-\t/* clear mbuf payload */\n-\tmemset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,\n-\t\t\trte_pktmbuf_tailroom(ut_params->ibuf));\n \n-\tplaintext_len = ceil_byte_length(tdata->plaintext.len);\n-\t/* Append data which is padded to a multiple of */\n-\t/* the algorithms block size */\n-\tplaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16);\n-\tplaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,\n-\t\t\t\tplaintext_pad_len);\n-\tmemcpy(plaintext, tdata->plaintext.data, plaintext_len);\n+\t/* Clear mbuf payload */\n \n-\tdebug_hexdump(stdout, \"plaintext:\", plaintext, plaintext_len);\n+\tpktmbuf_write(ut_params->ibuf, 0, plaintext_len, tdata->plaintext.data);\n \n \t/* Create ZUC operation */\n-\tretval = create_zuc_cipher_hash_generate_operation(tdata);\n+\tretval = create_wireless_algo_cipher_operation(tdata->cipher_iv.data,\n+\t\t\ttdata->cipher_iv.len, tdata->plaintext.len,\n+\t\t\t0);\n \tif (retval < 0)\n \t\treturn retval;\n \n \tut_params->op = process_crypto_request(ts_params->valid_devs[0],\n-\t\t\tut_params->op);\n+\t\t\t\t\t\tut_params->op);\n \tTEST_ASSERT_NOT_NULL(ut_params->op, \"failed to retrieve obuf\");\n-\tut_params->obuf = ut_params->op->sym->m_src;\n+\n+\tut_params->obuf = ut_params->op->sym->m_dst;\n \tif (ut_params->obuf)\n-\t\tciphertext = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *);\n+\t\tciphertext = rte_pktmbuf_read(ut_params->obuf,\n+\t\t\t0, plaintext_len, ciphertext_buffer);\n \telse\n-\t\tciphertext = plaintext;\n+\t\tciphertext = rte_pktmbuf_read(ut_params->ibuf,\n+\t\t\t0, plaintext_len, ciphertext_buffer);\n \n+\t/* Validate obuf */\n \tdebug_hexdump(stdout, \"ciphertext:\", ciphertext, plaintext_len);\n+\n \t/* Validate obuf */\n \tTEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(\n-\t\t\tciphertext,\n-\t\t\ttdata->ciphertext.data,\n-\t\t\ttdata->validDataLenInBits.len,\n-\t\t\t\"ZUC Ciphertext data not as expected\");\n-\n-\tut_params->digest = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *)\n-\t    + plaintext_pad_len;\n+\t\tciphertext,\n+\t\ttdata->ciphertext.data,\n+\t\ttdata->validCipherLenInBits.len,\n+\t\t\"ZUC Ciphertext data not as expected\");\n \n-\t/* Validate obuf */\n-\tTEST_ASSERT_BUFFERS_ARE_EQUAL(\n-\t\t\tut_params->digest,\n-\t\t\ttdata->digest.data,\n-\t\t\t4,\n-\t\t\t\"ZUC Generated auth tag not as expected\");\n \treturn 0;\n }\n \n static int\n-test_snow3g_cipher_auth(const struct snow3g_test_data *tdata)\n+test_zuc_authentication(const struct wireless_test_data *tdata)\n {\n \tstruct crypto_testsuite_params *ts_params = &testsuite_params;\n \tstruct crypto_unittest_params *ut_params = &unittest_params;\n \n \tint retval;\n-\n-\tuint8_t *plaintext, *ciphertext;\n \tunsigned plaintext_pad_len;\n \tunsigned plaintext_len;\n+\tuint8_t *plaintext;\n \n-\t/* Create SNOW 3G session */\n-\tretval = create_wireless_algo_cipher_auth_session(ts_params->valid_devs[0],\n-\t\t\tRTE_CRYPTO_CIPHER_OP_ENCRYPT,\n-\t\t\tRTE_CRYPTO_AUTH_OP_GENERATE,\n-\t\t\tRTE_CRYPTO_AUTH_SNOW3G_UIA2,\n-\t\t\tRTE_CRYPTO_CIPHER_SNOW3G_UEA2,\n+\tstruct rte_cryptodev_sym_capability_idx cap_idx;\n+\n+\t/* QAT PMD supports byte-aligned data only */\n+\tif ((tdata->validAuthLenInBits.len % 8 != 0) &&\n+\t\t\t(gbl_driver_id == rte_cryptodev_driver_id_get(\n+\t\t\t\tRTE_STR(CRYPTODEV_NAME_QAT_SYM_PMD))))\n+\t\treturn -ENOTSUP;\n+\n+\t/* Check if device supports ZUC EIA3 */\n+\tcap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;\n+\tcap_idx.algo.auth = RTE_CRYPTO_AUTH_ZUC_EIA3;\n+\n+\tif (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],\n+\t\t\t&cap_idx) == NULL)\n+\t\treturn -ENOTSUP;\n+\n+\t/* Create ZUC session */\n+\tretval = create_wireless_algo_hash_session(ts_params->valid_devs[0],\n \t\t\ttdata->key.data, tdata->key.len,\n \t\t\ttdata->auth_iv.len, tdata->digest.len,\n-\t\t\ttdata->cipher_iv.len);\n+\t\t\tRTE_CRYPTO_AUTH_OP_GENERATE,\n+\t\t\tRTE_CRYPTO_AUTH_ZUC_EIA3);\n \tif (retval < 0)\n \t\treturn retval;\n+\n+\t/* alloc mbuf and set payload */\n \tut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);\n \n-\t/* clear mbuf payload */\n \tmemset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,\n-\t\t\trte_pktmbuf_tailroom(ut_params->ibuf));\n+\trte_pktmbuf_tailroom(ut_params->ibuf));\n \n \tplaintext_len = ceil_byte_length(tdata->plaintext.len);\n \t/* Append data which is padded to a multiple of */\n \t/* the algorithms block size */\n-\tplaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16);\n+\tplaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 8);\n \tplaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,\n \t\t\t\tplaintext_pad_len);\n \tmemcpy(plaintext, tdata->plaintext.data, plaintext_len);\n \n-\tdebug_hexdump(stdout, \"plaintext:\", plaintext, plaintext_len);\n-\n-\t/* Create SNOW 3G operation */\n-\tretval = create_wireless_algo_cipher_hash_operation(tdata->digest.data,\n-\t\t\ttdata->digest.len, tdata->auth_iv.data,\n-\t\t\ttdata->auth_iv.len,\n+\t/* Create ZUC operation */\n+\tretval = create_wireless_algo_hash_operation(NULL, tdata->digest.len,\n+\t\t\ttdata->auth_iv.data, tdata->auth_iv.len,\n \t\t\tplaintext_pad_len, RTE_CRYPTO_AUTH_OP_GENERATE,\n-\t\t\ttdata->cipher_iv.data, tdata->cipher_iv.len,\n-\t\t\ttdata->validCipherLenInBits.len,\n-\t\t\t0,\n \t\t\ttdata->validAuthLenInBits.len,\n-\t\t\t0\n-\t\t\t);\n+\t\t\t0);\n \tif (retval < 0)\n \t\treturn retval;\n \n \tut_params->op = process_crypto_request(ts_params->valid_devs[0],\n-\t\t\tut_params->op);\n-\tTEST_ASSERT_NOT_NULL(ut_params->op, \"failed to retrieve obuf\");\n+\t\t\t\tut_params->op);\n \tut_params->obuf = ut_params->op->sym->m_src;\n-\tif (ut_params->obuf)\n-\t\tciphertext = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *);\n-\telse\n-\t\tciphertext = plaintext;\n-\n-\tdebug_hexdump(stdout, \"ciphertext:\", ciphertext, plaintext_len);\n-\t/* Validate obuf */\n-\tTEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(\n-\t\t\tciphertext,\n-\t\t\ttdata->ciphertext.data,\n-\t\t\ttdata->validDataLenInBits.len,\n-\t\t\t\"SNOW 3G Ciphertext data not as expected\");\n-\n+\tTEST_ASSERT_NOT_NULL(ut_params->op, \"failed to retrieve obuf\");\n \tut_params->digest = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *)\n-\t    + plaintext_pad_len;\n+\t\t\t+ plaintext_pad_len;\n \n \t/* Validate obuf */\n \tTEST_ASSERT_BUFFERS_ARE_EQUAL(\n-\t\t\tut_params->digest,\n-\t\t\ttdata->digest.data,\n-\t\t\tDIGEST_BYTE_LENGTH_SNOW3G_UIA2,\n-\t\t\t\"SNOW 3G Generated auth tag not as expected\");\n+\tut_params->digest,\n+\ttdata->digest.data,\n+\ttdata->digest.len,\n+\t\"ZUC Generated auth tag not as expected\");\n+\n \treturn 0;\n }\n \n static int\n-test_snow3g_auth_cipher(const struct snow3g_test_data *tdata,\n+test_zuc_auth_cipher(const struct wireless_test_data *tdata,\n \tuint8_t op_mode, uint8_t verify)\n {\n \tstruct crypto_testsuite_params *ts_params = &testsuite_params;\n@@ -4619,6 +5056,15 @@ test_snow3g_auth_cipher(const struct snow3g_test_data *tdata,\n \tunsigned int ciphertext_len;\n \n \tstruct rte_cryptodev_info dev_info;\n+\tstruct rte_cryptodev_sym_capability_idx cap_idx;\n+\n+\t/* Check if device supports ZUC EIA3 */\n+\tcap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;\n+\tcap_idx.algo.auth = RTE_CRYPTO_AUTH_ZUC_EIA3;\n+\n+\tif (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],\n+\t\t\t&cap_idx) == NULL)\n+\t\treturn -ENOTSUP;\n \n \trte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);\n \n@@ -4631,15 +5077,15 @@ test_snow3g_auth_cipher(const struct snow3g_test_data *tdata,\n \t\t}\n \t}\n \n-\t/* Create SNOW 3G session */\n+\t/* Create ZUC session */\n \tretval = create_wireless_algo_auth_cipher_session(\n \t\t\tts_params->valid_devs[0],\n \t\t\t(verify ? RTE_CRYPTO_CIPHER_OP_DECRYPT\n \t\t\t\t\t: RTE_CRYPTO_CIPHER_OP_ENCRYPT),\n \t\t\t(verify ? RTE_CRYPTO_AUTH_OP_VERIFY\n \t\t\t\t\t: RTE_CRYPTO_AUTH_OP_GENERATE),\n-\t\t\tRTE_CRYPTO_AUTH_SNOW3G_UIA2,\n-\t\t\tRTE_CRYPTO_CIPHER_SNOW3G_UEA2,\n+\t\t\tRTE_CRYPTO_AUTH_ZUC_EIA3,\n+\t\t\tRTE_CRYPTO_CIPHER_ZUC_EEA3,\n \t\t\ttdata->key.data, tdata->key.len,\n \t\t\ttdata->auth_iv.len, tdata->digest.len,\n \t\t\ttdata->cipher_iv.len);\n@@ -4677,10 +5123,11 @@ test_snow3g_auth_cipher(const struct snow3g_test_data *tdata,\n \t\tmemcpy(plaintext, tdata->plaintext.data, plaintext_len);\n \t\tif (op_mode == OUT_OF_PLACE)\n \t\t\trte_pktmbuf_append(ut_params->obuf, plaintext_pad_len);\n-\t\tdebug_hexdump(stdout, \"plaintext:\", plaintext, plaintext_len);\n+\t\tdebug_hexdump(stdout, \"plaintext:\", plaintext,\n+\t\t\tplaintext_len);\n \t}\n \n-\t/* Create SNOW 3G operation */\n+\t/* Create ZUC operation */\n \tretval = create_wireless_algo_auth_cipher_operation(\n \t\ttdata->digest.len,\n \t\ttdata->cipher_iv.data, tdata->cipher_iv.len,\n@@ -4689,9 +5136,9 @@ test_snow3g_auth_cipher(const struct snow3g_test_data *tdata,\n \t\t(verify ? ciphertext_pad_len : plaintext_pad_len)\n \t\t\t: tdata->digest.offset_bytes),\n \t\ttdata->validCipherLenInBits.len,\n-\t\ttdata->cipher.offset_bits,\n+\t\ttdata->validCipherOffsetInBits.len,\n \t\ttdata->validAuthLenInBits.len,\n-\t\ttdata->auth.offset_bits,\n+\t\t0,\n \t\top_mode, 0);\n \n \tif (retval < 0)\n@@ -4705,13 +5152,13 @@ test_snow3g_auth_cipher(const struct snow3g_test_data *tdata,\n \tut_params->obuf = (op_mode == IN_PLACE ?\n \t\tut_params->op->sym->m_src : ut_params->op->sym->m_dst);\n \n+\n \tif (verify) {\n \t\tif (ut_params->obuf)\n \t\t\tplaintext = rte_pktmbuf_mtod(ut_params->obuf,\n \t\t\t\t\t\t\tuint8_t *);\n \t\telse\n-\t\t\tplaintext = ciphertext +\n-\t\t\t\t(tdata->cipher.offset_bits >> 3);\n+\t\t\tplaintext = ciphertext;\n \n \t\tdebug_hexdump(stdout, \"plaintext:\", plaintext,\n \t\t\t(tdata->plaintext.len >> 3) - tdata->digest.len);\n@@ -4730,14 +5177,15 @@ test_snow3g_auth_cipher(const struct snow3g_test_data *tdata,\n \t\tdebug_hexdump(stdout, \"ciphertext expected:\",\n \t\t\ttdata->ciphertext.data, tdata->ciphertext.len >> 3);\n \n-\t\tut_params->digest = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *)\n-\t\t\t+ (tdata->digest.offset_bytes == 0 ?\n-\t\tplaintext_pad_len : tdata->digest.offset_bytes);\n+\t\tut_params->digest = rte_pktmbuf_mtod(\n+\t\t\tut_params->obuf, uint8_t *) +\n+\t\t\t(tdata->digest.offset_bytes == 0 ?\n+\t\t\tplaintext_pad_len : tdata->digest.offset_bytes);\n \n \t\tdebug_hexdump(stdout, \"digest:\", ut_params->digest,\n \t\t\ttdata->digest.len);\n-\t\tdebug_hexdump(stdout, \"digest expected:\", tdata->digest.data,\n-\t\t\t\ttdata->digest.len);\n+\t\tdebug_hexdump(stdout, \"digest expected:\",\n+\t\t\ttdata->digest.data, tdata->digest.len);\n \t}\n \n \t/* Validate obuf */\n@@ -4746,25 +5194,25 @@ test_snow3g_auth_cipher(const struct snow3g_test_data *tdata,\n \t\t\tplaintext,\n \t\t\ttdata->plaintext.data,\n \t\t\ttdata->plaintext.len >> 3,\n-\t\t\t\"SNOW 3G Plaintext data not as expected\");\n+\t\t\t\"ZUC Plaintext data not as expected\");\n \t} else {\n \t\tTEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(\n \t\t\tciphertext,\n \t\t\ttdata->ciphertext.data,\n-\t\t\ttdata->validDataLenInBits.len,\n-\t\t\t\"SNOW 3G Ciphertext data not as expected\");\n+\t\t\ttdata->ciphertext.len >> 3,\n+\t\t\t\"ZUC Ciphertext data not as expected\");\n \n \t\tTEST_ASSERT_BUFFERS_ARE_EQUAL(\n \t\t\tut_params->digest,\n \t\t\ttdata->digest.data,\n-\t\t\tDIGEST_BYTE_LENGTH_SNOW3G_UIA2,\n-\t\t\t\"SNOW 3G Generated auth tag not as expected\");\n+\t\t\tDIGEST_BYTE_LENGTH_KASUMI_F9,\n+\t\t\t\"ZUC Generated auth tag not as expected\");\n \t}\n \treturn 0;\n }\n \n static int\n-test_snow3g_auth_cipher_sgl(const struct snow3g_test_data *tdata,\n+test_zuc_auth_cipher_sgl(const struct wireless_test_data *tdata,\n \tuint8_t op_mode, uint8_t verify)\n {\n \tstruct crypto_testsuite_params *ts_params = &testsuite_params;\n@@ -4783,6 +5231,15 @@ test_snow3g_auth_cipher_sgl(const struct snow3g_test_data *tdata,\n \tuint8_t digest_buffer[10000];\n \n \tstruct rte_cryptodev_info dev_info;\n+\tstruct rte_cryptodev_sym_capability_idx cap_idx;\n+\n+\t/* Check if device supports ZUC EIA3 */\n+\tcap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;\n+\tcap_idx.algo.auth = RTE_CRYPTO_AUTH_ZUC_EIA3;\n+\n+\tif (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],\n+\t\t\t&cap_idx) == NULL)\n+\t\treturn -ENOTSUP;\n \n \trte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);\n \n@@ -4806,15 +5263,15 @@ test_snow3g_auth_cipher_sgl(const struct snow3g_test_data *tdata,\n \t\t}\n \t}\n \n-\t/* Create SNOW 3G session */\n+\t/* Create ZUC session */\n \tretval = create_wireless_algo_auth_cipher_session(\n \t\t\tts_params->valid_devs[0],\n \t\t\t(verify ? RTE_CRYPTO_CIPHER_OP_DECRYPT\n \t\t\t\t\t: RTE_CRYPTO_CIPHER_OP_ENCRYPT),\n \t\t\t(verify ? RTE_CRYPTO_AUTH_OP_VERIFY\n \t\t\t\t\t: RTE_CRYPTO_AUTH_OP_GENERATE),\n-\t\t\tRTE_CRYPTO_AUTH_SNOW3G_UIA2,\n-\t\t\tRTE_CRYPTO_CIPHER_SNOW3G_UEA2,\n+\t\t\tRTE_CRYPTO_AUTH_ZUC_EIA3,\n+\t\t\tRTE_CRYPTO_CIPHER_ZUC_EEA3,\n \t\t\ttdata->key.data, tdata->key.len,\n \t\t\ttdata->auth_iv.len, tdata->digest.len,\n \t\t\ttdata->cipher_iv.len);\n@@ -4856,18 +5313,18 @@ test_snow3g_auth_cipher_sgl(const struct snow3g_test_data *tdata,\n \t}\n \tmemset(buffer, 0, sizeof(buffer));\n \n-\t/* Create SNOW 3G operation */\n+\t/* Create ZUC operation */\n \tretval = create_wireless_algo_auth_cipher_operation(\n \t\ttdata->digest.len,\n \t\ttdata->cipher_iv.data, tdata->cipher_iv.len,\n-\t\ttdata->auth_iv.data, tdata->auth_iv.len,\n+\t\tNULL, 0,\n \t\t(tdata->digest.offset_bytes == 0 ?\n \t\t(verify ? ciphertext_pad_len : plaintext_pad_len)\n \t\t\t: tdata->digest.offset_bytes),\n \t\ttdata->validCipherLenInBits.len,\n-\t\ttdata->cipher.offset_bits,\n+\t\ttdata->validCipherOffsetInBits.len,\n \t\ttdata->validAuthLenInBits.len,\n-\t\ttdata->auth.offset_bits,\n+\t\t0,\n \t\top_mode, 1);\n \n \tif (retval < 0)\n@@ -4930,742 +5387,706 @@ test_snow3g_auth_cipher_sgl(const struct snow3g_test_data *tdata,\n \t\t\tplaintext,\n \t\t\ttdata->plaintext.data,\n \t\t\ttdata->plaintext.len >> 3,\n-\t\t\t\"SNOW 3G Plaintext data not as expected\");\n+\t\t\t\"ZUC Plaintext data not as expected\");\n \t} else {\n \t\tTEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(\n \t\t\tciphertext,\n \t\t\ttdata->ciphertext.data,\n \t\t\ttdata->validDataLenInBits.len,\n-\t\t\t\"SNOW 3G Ciphertext data not as expected\");\n+\t\t\t\"ZUC Ciphertext data not as expected\");\n \n \t\tTEST_ASSERT_BUFFERS_ARE_EQUAL(\n \t\t\tdigest,\n \t\t\ttdata->digest.data,\n-\t\t\tDIGEST_BYTE_LENGTH_SNOW3G_UIA2,\n-\t\t\t\"SNOW 3G Generated auth tag not as expected\");\n+\t\t\tDIGEST_BYTE_LENGTH_KASUMI_F9,\n+\t\t\t\"ZUC Generated auth tag not as expected\");\n \t}\n \treturn 0;\n }\n \n static int\n-test_kasumi_auth_cipher(const struct kasumi_test_data *tdata,\n-\tuint8_t op_mode, uint8_t verify)\n+test_kasumi_encryption_test_case_1(void)\n {\n-\tstruct crypto_testsuite_params *ts_params = &testsuite_params;\n-\tstruct crypto_unittest_params *ut_params = &unittest_params;\n+\treturn test_kasumi_encryption(&kasumi_test_case_1);\n+}\n \n-\tint retval;\n+static int\n+test_kasumi_encryption_test_case_1_sgl(void)\n+{\n+\treturn test_kasumi_encryption_sgl(&kasumi_test_case_1);\n+}\n \n-\tuint8_t *plaintext = NULL, *ciphertext = NULL;\n-\tunsigned int plaintext_pad_len;\n-\tunsigned int plaintext_len;\n-\tunsigned int ciphertext_pad_len;\n-\tunsigned int ciphertext_len;\n+static int\n+test_kasumi_encryption_test_case_1_oop(void)\n+{\n+\treturn test_kasumi_encryption_oop(&kasumi_test_case_1);\n+}\n \n-\tstruct rte_cryptodev_info dev_info;\n+static int\n+test_kasumi_encryption_test_case_1_oop_sgl(void)\n+{\n+\treturn test_kasumi_encryption_oop_sgl(&kasumi_test_case_1);\n+}\n \n-\trte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);\n+static int\n+test_kasumi_encryption_test_case_2(void)\n+{\n+\treturn test_kasumi_encryption(&kasumi_test_case_2);\n+}\n \n-\tuint64_t feat_flags = dev_info.feature_flags;\n+static int\n+test_kasumi_encryption_test_case_3(void)\n+{\n+\treturn test_kasumi_encryption(&kasumi_test_case_3);\n+}\n \n-\tif (op_mode == OUT_OF_PLACE) {\n-\t\tif (!(feat_flags & RTE_CRYPTODEV_FF_DIGEST_ENCRYPTED)) {\n-\t\t\tprintf(\"Device doesn't support digest encrypted.\\n\");\n-\t\t\treturn -ENOTSUP;\n-\t\t}\n-\t}\n+static int\n+test_kasumi_encryption_test_case_4(void)\n+{\n+\treturn test_kasumi_encryption(&kasumi_test_case_4);\n+}\n \n-\t/* Create KASUMI session */\n-\tretval = create_wireless_algo_auth_cipher_session(\n-\t\t\tts_params->valid_devs[0],\n-\t\t\t(verify ? RTE_CRYPTO_CIPHER_OP_DECRYPT\n-\t\t\t\t\t: RTE_CRYPTO_CIPHER_OP_ENCRYPT),\n-\t\t\t(verify ? RTE_CRYPTO_AUTH_OP_VERIFY\n-\t\t\t\t\t: RTE_CRYPTO_AUTH_OP_GENERATE),\n-\t\t\tRTE_CRYPTO_AUTH_KASUMI_F9,\n-\t\t\tRTE_CRYPTO_CIPHER_KASUMI_F8,\n-\t\t\ttdata->key.data, tdata->key.len,\n-\t\t\t0, tdata->digest.len,\n-\t\t\ttdata->cipher_iv.len);\n+static int\n+test_kasumi_encryption_test_case_5(void)\n+{\n+\treturn test_kasumi_encryption(&kasumi_test_case_5);\n+}\n \n-\tif (retval < 0)\n-\t\treturn retval;\n+static int\n+test_kasumi_decryption_test_case_1(void)\n+{\n+\treturn test_kasumi_decryption(&kasumi_test_case_1);\n+}\n \n-\tut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);\n-\tif (op_mode == OUT_OF_PLACE)\n-\t\tut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);\n+static int\n+test_kasumi_decryption_test_case_1_oop(void)\n+{\n+\treturn test_kasumi_decryption_oop(&kasumi_test_case_1);\n+}\n \n-\t/* clear mbuf payload */\n-\tmemset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,\n-\t\trte_pktmbuf_tailroom(ut_params->ibuf));\n-\tif (op_mode == OUT_OF_PLACE)\n-\t\tmemset(rte_pktmbuf_mtod(ut_params->obuf, uint8_t *), 0,\n-\t\t\trte_pktmbuf_tailroom(ut_params->obuf));\n+static int\n+test_kasumi_decryption_test_case_2(void)\n+{\n+\treturn test_kasumi_decryption(&kasumi_test_case_2);\n+}\n \n-\tciphertext_len = ceil_byte_length(tdata->ciphertext.len);\n-\tplaintext_len = ceil_byte_length(tdata->plaintext.len);\n-\tciphertext_pad_len = RTE_ALIGN_CEIL(ciphertext_len, 16);\n-\tplaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16);\n+static int\n+test_kasumi_decryption_test_case_3(void)\n+{\n+\treturn test_kasumi_decryption(&kasumi_test_case_3);\n+}\n \n-\tif (verify) {\n-\t\tciphertext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,\n-\t\t\t\t\tciphertext_pad_len);\n-\t\tmemcpy(ciphertext, tdata->ciphertext.data, ciphertext_len);\n-\t\tif (op_mode == OUT_OF_PLACE)\n-\t\t\trte_pktmbuf_append(ut_params->obuf, ciphertext_pad_len);\n-\t\tdebug_hexdump(stdout, \"ciphertext:\", ciphertext,\n-\t\t\tciphertext_len);\n-\t} else {\n-\t\tplaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,\n-\t\t\t\t\tplaintext_pad_len);\n-\t\tmemcpy(plaintext, tdata->plaintext.data, plaintext_len);\n-\t\tif (op_mode == OUT_OF_PLACE)\n-\t\t\trte_pktmbuf_append(ut_params->obuf, plaintext_pad_len);\n-\t\tdebug_hexdump(stdout, \"plaintext:\", plaintext,\n-\t\t\tplaintext_len);\n-\t}\n+static int\n+test_kasumi_decryption_test_case_4(void)\n+{\n+\treturn test_kasumi_decryption(&kasumi_test_case_4);\n+}\n \n-\t/* Create KASUMI operation */\n-\tretval = create_wireless_algo_auth_cipher_operation(\n-\t\ttdata->digest.len,\n-\t\ttdata->cipher_iv.data, tdata->cipher_iv.len,\n-\t\tNULL, 0,\n-\t\t(tdata->digest.offset_bytes == 0 ?\n-\t\t(verify ? ciphertext_pad_len : plaintext_pad_len)\n-\t\t\t: tdata->digest.offset_bytes),\n-\t\ttdata->validCipherLenInBits.len,\n-\t\ttdata->validCipherOffsetInBits.len,\n-\t\ttdata->validAuthLenInBits.len,\n-\t\t0,\n-\t\top_mode, 0);\n+static int\n+test_kasumi_decryption_test_case_5(void)\n+{\n+\treturn test_kasumi_decryption(&kasumi_test_case_5);\n+}\n+static int\n+test_snow3g_encryption_test_case_1(void)\n+{\n+\treturn test_snow3g_encryption(&snow3g_test_case_1);\n+}\n \n-\tif (retval < 0)\n-\t\treturn retval;\n+static int\n+test_snow3g_encryption_test_case_1_oop(void)\n+{\n+\treturn test_snow3g_encryption_oop(&snow3g_test_case_1);\n+}\n \n-\tut_params->op = process_crypto_request(ts_params->valid_devs[0],\n-\t\t\tut_params->op);\n+static int\n+test_snow3g_encryption_test_case_1_oop_sgl(void)\n+{\n+\treturn test_snow3g_encryption_oop_sgl(&snow3g_test_case_1);\n+}\n \n-\tTEST_ASSERT_NOT_NULL(ut_params->op, \"failed to retrieve obuf\");\n \n-\tut_params->obuf = (op_mode == IN_PLACE ?\n-\t\tut_params->op->sym->m_src : ut_params->op->sym->m_dst);\n+static int\n+test_snow3g_encryption_test_case_1_offset_oop(void)\n+{\n+\treturn test_snow3g_encryption_offset_oop(&snow3g_test_case_1);\n+}\n \n+static int\n+test_snow3g_encryption_test_case_2(void)\n+{\n+\treturn test_snow3g_encryption(&snow3g_test_case_2);\n+}\n \n-\tif (verify) {\n-\t\tif (ut_params->obuf)\n-\t\t\tplaintext = rte_pktmbuf_mtod(ut_params->obuf,\n-\t\t\t\t\t\t\tuint8_t *);\n-\t\telse\n-\t\t\tplaintext = ciphertext;\n+static int\n+test_snow3g_encryption_test_case_3(void)\n+{\n+\treturn test_snow3g_encryption(&snow3g_test_case_3);\n+}\n \n-\t\tdebug_hexdump(stdout, \"plaintext:\", plaintext,\n-\t\t\t(tdata->plaintext.len >> 3) - tdata->digest.len);\n-\t\tdebug_hexdump(stdout, \"plaintext expected:\",\n-\t\t\ttdata->plaintext.data,\n-\t\t\t(tdata->plaintext.len >> 3) - tdata->digest.len);\n-\t} else {\n-\t\tif (ut_params->obuf)\n-\t\t\tciphertext = rte_pktmbuf_mtod(ut_params->obuf,\n-\t\t\t\t\t\t\tuint8_t *);\n-\t\telse\n-\t\t\tciphertext = plaintext;\n+static int\n+test_snow3g_encryption_test_case_4(void)\n+{\n+\treturn test_snow3g_encryption(&snow3g_test_case_4);\n+}\n \n-\t\tdebug_hexdump(stdout, \"ciphertext:\", ciphertext,\n-\t\t\tciphertext_len);\n-\t\tdebug_hexdump(stdout, \"ciphertext expected:\",\n-\t\t\ttdata->ciphertext.data, tdata->ciphertext.len >> 3);\n+static int\n+test_snow3g_encryption_test_case_5(void)\n+{\n+\treturn test_snow3g_encryption(&snow3g_test_case_5);\n+}\n \n-\t\tut_params->digest = rte_pktmbuf_mtod(\n-\t\t\tut_params->obuf, uint8_t *) +\n-\t\t\t(tdata->digest.offset_bytes == 0 ?\n-\t\t\tplaintext_pad_len : tdata->digest.offset_bytes);\n+static int\n+test_snow3g_decryption_test_case_1(void)\n+{\n+\treturn test_snow3g_decryption(&snow3g_test_case_1);\n+}\n \n-\t\tdebug_hexdump(stdout, \"digest:\", ut_params->digest,\n-\t\t\ttdata->digest.len);\n-\t\tdebug_hexdump(stdout, \"digest expected:\",\n-\t\t\ttdata->digest.data, tdata->digest.len);\n-\t}\n+static int\n+test_snow3g_decryption_test_case_1_oop(void)\n+{\n+\treturn test_snow3g_decryption_oop(&snow3g_test_case_1);\n+}\n \n-\t/* Validate obuf */\n-\tif (verify) {\n-\t\tTEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(\n-\t\t\tplaintext,\n-\t\t\ttdata->plaintext.data,\n-\t\t\ttdata->plaintext.len >> 3,\n-\t\t\t\"KASUMI Plaintext data not as expected\");\n-\t} else {\n-\t\tTEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(\n-\t\t\tciphertext,\n-\t\t\ttdata->ciphertext.data,\n-\t\t\ttdata->ciphertext.len >> 3,\n-\t\t\t\"KASUMI Ciphertext data not as expected\");\n+static int\n+test_snow3g_decryption_test_case_2(void)\n+{\n+\treturn test_snow3g_decryption(&snow3g_test_case_2);\n+}\n \n-\t\tTEST_ASSERT_BUFFERS_ARE_EQUAL(\n-\t\t\tut_params->digest,\n-\t\t\ttdata->digest.data,\n-\t\t\tDIGEST_BYTE_LENGTH_KASUMI_F9,\n-\t\t\t\"KASUMI Generated auth tag not as expected\");\n-\t}\n-\treturn 0;\n+static int\n+test_snow3g_decryption_test_case_3(void)\n+{\n+\treturn test_snow3g_decryption(&snow3g_test_case_3);\n }\n \n static int\n-test_kasumi_auth_cipher_sgl(const struct kasumi_test_data *tdata,\n-\tuint8_t op_mode, uint8_t verify)\n+test_snow3g_decryption_test_case_4(void)\n {\n-\tstruct crypto_testsuite_params *ts_params = &testsuite_params;\n-\tstruct crypto_unittest_params *ut_params = &unittest_params;\n+\treturn test_snow3g_decryption(&snow3g_test_case_4);\n+}\n \n-\tint retval;\n+static int\n+test_snow3g_decryption_test_case_5(void)\n+{\n+\treturn test_snow3g_decryption(&snow3g_test_case_5);\n+}\n \n-\tconst uint8_t *plaintext = NULL;\n-\tconst uint8_t *ciphertext = NULL;\n-\tconst uint8_t *digest = NULL;\n-\tunsigned int plaintext_pad_len;\n-\tunsigned int plaintext_len;\n-\tunsigned int ciphertext_pad_len;\n-\tunsigned int ciphertext_len;\n-\tuint8_t buffer[10000];\n-\tuint8_t digest_buffer[10000];\n-\n-\tstruct rte_cryptodev_info dev_info;\n-\n-\trte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);\n+/*\n+ * Function prepares snow3g_hash_test_data from snow3g_test_data.\n+ * Pattern digest from snow3g_test_data must be allocated as\n+ * 4 last bytes in plaintext.\n+ */\n+static void\n+snow3g_hash_test_vector_setup(const struct snow3g_test_data *pattern,\n+\t\tstruct snow3g_hash_test_data *output)\n+{\n+\tif ((pattern != NULL) && (output != NULL)) {\n+\t\toutput->key.len = pattern->key.len;\n \n-\tuint64_t feat_flags = dev_info.feature_flags;\n+\t\tmemcpy(output->key.data,\n+\t\tpattern->key.data, pattern->key.len);\n \n-\tif (op_mode == IN_PLACE) {\n-\t\tif (!(feat_flags & RTE_CRYPTODEV_FF_IN_PLACE_SGL)) {\n-\t\t\tprintf(\"Device doesn't support in-place scatter-gather \"\n-\t\t\t\t\t\"in both input and output mbufs.\\n\");\n-\t\t\treturn -ENOTSUP;\n-\t\t}\n-\t} else {\n-\t\tif (!(feat_flags & RTE_CRYPTODEV_FF_OOP_SGL_IN_SGL_OUT)) {\n-\t\t\tprintf(\"Device doesn't support out-of-place scatter-gather \"\n-\t\t\t\t\t\"in both input and output mbufs.\\n\");\n-\t\t\treturn -ENOTSUP;\n-\t\t}\n-\t\tif (!(feat_flags & RTE_CRYPTODEV_FF_DIGEST_ENCRYPTED)) {\n-\t\t\tprintf(\"Device doesn't support digest encrypted.\\n\");\n-\t\t\treturn -ENOTSUP;\n-\t\t}\n-\t}\n+\t\toutput->auth_iv.len = pattern->auth_iv.len;\n \n-\t/* Create KASUMI session */\n-\tretval = create_wireless_algo_auth_cipher_session(\n-\t\t\tts_params->valid_devs[0],\n-\t\t\t(verify ? RTE_CRYPTO_CIPHER_OP_DECRYPT\n-\t\t\t\t\t: RTE_CRYPTO_CIPHER_OP_ENCRYPT),\n-\t\t\t(verify ? RTE_CRYPTO_AUTH_OP_VERIFY\n-\t\t\t\t\t: RTE_CRYPTO_AUTH_OP_GENERATE),\n-\t\t\tRTE_CRYPTO_AUTH_KASUMI_F9,\n-\t\t\tRTE_CRYPTO_CIPHER_KASUMI_F8,\n-\t\t\ttdata->key.data, tdata->key.len,\n-\t\t\t0, tdata->digest.len,\n-\t\t\ttdata->cipher_iv.len);\n+\t\tmemcpy(output->auth_iv.data,\n+\t\tpattern->auth_iv.data, pattern->auth_iv.len);\n \n-\tif (retval < 0)\n-\t\treturn retval;\n+\t\toutput->plaintext.len = pattern->plaintext.len;\n \n-\tciphertext_len = ceil_byte_length(tdata->ciphertext.len);\n-\tplaintext_len = ceil_byte_length(tdata->plaintext.len);\n-\tciphertext_pad_len = RTE_ALIGN_CEIL(ciphertext_len, 16);\n-\tplaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16);\n+\t\tmemcpy(output->plaintext.data,\n+\t\tpattern->plaintext.data, pattern->plaintext.len >> 3);\n \n-\tut_params->ibuf = create_segmented_mbuf(ts_params->mbuf_pool,\n-\t\t\tplaintext_pad_len, 15, 0);\n-\tTEST_ASSERT_NOT_NULL(ut_params->ibuf,\n-\t\t\t\"Failed to allocate input buffer in mempool\");\n+\t\toutput->digest.len = pattern->digest.len;\n \n-\tif (op_mode == OUT_OF_PLACE) {\n-\t\tut_params->obuf = create_segmented_mbuf(ts_params->mbuf_pool,\n-\t\t\t\tplaintext_pad_len, 15, 0);\n-\t\tTEST_ASSERT_NOT_NULL(ut_params->obuf,\n-\t\t\t\t\"Failed to allocate output buffer in mempool\");\n-\t}\n+\t\tmemcpy(output->digest.data,\n+\t\t&pattern->plaintext.data[pattern->digest.offset_bytes],\n+\t\tpattern->digest.len);\n \n-\tif (verify) {\n-\t\tpktmbuf_write(ut_params->ibuf, 0, ciphertext_len,\n-\t\t\ttdata->ciphertext.data);\n-\t\tciphertext = rte_pktmbuf_read(ut_params->ibuf, 0,\n-\t\t\t\t\tciphertext_len, buffer);\n-\t\tdebug_hexdump(stdout, \"ciphertext:\", ciphertext,\n-\t\t\tciphertext_len);\n-\t} else {\n-\t\tpktmbuf_write(ut_params->ibuf, 0, plaintext_len,\n-\t\t\ttdata->plaintext.data);\n-\t\tplaintext = rte_pktmbuf_read(ut_params->ibuf, 0,\n-\t\t\t\t\tplaintext_len, buffer);\n-\t\tdebug_hexdump(stdout, \"plaintext:\", plaintext,\n-\t\t\tplaintext_len);\n+\t\toutput->validAuthLenInBits.len =\n+\t\tpattern->validAuthLenInBits.len;\n \t}\n-\tmemset(buffer, 0, sizeof(buffer));\n+}\n \n-\t/* Create KASUMI operation */\n-\tretval = create_wireless_algo_auth_cipher_operation(\n-\t\ttdata->digest.len,\n-\t\ttdata->cipher_iv.data, tdata->cipher_iv.len,\n-\t\tNULL, 0,\n-\t\t(tdata->digest.offset_bytes == 0 ?\n-\t\t(verify ? ciphertext_pad_len : plaintext_pad_len)\n-\t\t\t: tdata->digest.offset_bytes),\n-\t\ttdata->validCipherLenInBits.len,\n-\t\ttdata->validCipherOffsetInBits.len,\n-\t\ttdata->validAuthLenInBits.len,\n-\t\t0,\n-\t\top_mode, 1);\n+/*\n+ * Test case verify computed cipher and digest from snow3g_test_case_7 data.\n+ */\n+static int\n+test_snow3g_decryption_with_digest_test_case_1(void)\n+{\n+\tstruct snow3g_hash_test_data snow3g_hash_data;\n \n-\tif (retval < 0)\n-\t\treturn retval;\n+\t/*\n+\t * Function prepare data for hash veryfication test case.\n+\t * Digest is allocated in 4 last bytes in plaintext, pattern.\n+\t */\n+\tsnow3g_hash_test_vector_setup(&snow3g_test_case_7, &snow3g_hash_data);\n \n-\tut_params->op = process_crypto_request(ts_params->valid_devs[0],\n-\t\t\tut_params->op);\n+\treturn test_snow3g_decryption(&snow3g_test_case_7) &\n+\t\t\ttest_snow3g_authentication_verify(&snow3g_hash_data);\n+}\n \n-\tTEST_ASSERT_NOT_NULL(ut_params->op, \"failed to retrieve obuf\");\n+static int\n+test_snow3g_cipher_auth_test_case_1(void)\n+{\n+\treturn test_snow3g_cipher_auth(&snow3g_test_case_3);\n+}\n \n-\tut_params->obuf = (op_mode == IN_PLACE ?\n-\t\tut_params->op->sym->m_src : ut_params->op->sym->m_dst);\n+static int\n+test_snow3g_auth_cipher_test_case_1(void)\n+{\n+\treturn test_snow3g_auth_cipher(\n+\t\t&snow3g_auth_cipher_test_case_1, IN_PLACE, 0);\n+}\n \n-\tif (verify) {\n-\t\tif (ut_params->obuf)\n-\t\t\tplaintext = rte_pktmbuf_read(ut_params->obuf, 0,\n-\t\t\t\t\tplaintext_len, buffer);\n-\t\telse\n-\t\t\tplaintext = rte_pktmbuf_read(ut_params->ibuf, 0,\n-\t\t\t\t\tplaintext_len, buffer);\n+static int\n+test_snow3g_auth_cipher_test_case_2(void)\n+{\n+\treturn test_snow3g_auth_cipher(\n+\t\t&snow3g_auth_cipher_test_case_2, IN_PLACE, 0);\n+}\n \n-\t\tdebug_hexdump(stdout, \"plaintext:\", plaintext,\n-\t\t\t(tdata->plaintext.len >> 3) - tdata->digest.len);\n-\t\tdebug_hexdump(stdout, \"plaintext expected:\",\n-\t\t\ttdata->plaintext.data,\n-\t\t\t(tdata->plaintext.len >> 3) - tdata->digest.len);\n-\t} else {\n-\t\tif (ut_params->obuf)\n-\t\t\tciphertext = rte_pktmbuf_read(ut_params->obuf, 0,\n-\t\t\t\t\tciphertext_len, buffer);\n-\t\telse\n-\t\t\tciphertext = rte_pktmbuf_read(ut_params->ibuf, 0,\n-\t\t\t\t\tciphertext_len, buffer);\n+static int\n+test_snow3g_auth_cipher_test_case_2_oop(void)\n+{\n+\treturn test_snow3g_auth_cipher(\n+\t\t&snow3g_auth_cipher_test_case_2, OUT_OF_PLACE, 0);\n+}\n \n-\t\tdebug_hexdump(stdout, \"ciphertext:\", ciphertext,\n-\t\t\tciphertext_len);\n-\t\tdebug_hexdump(stdout, \"ciphertext expected:\",\n-\t\t\ttdata->ciphertext.data, tdata->ciphertext.len >> 3);\n+static int\n+test_snow3g_auth_cipher_part_digest_enc(void)\n+{\n+\treturn test_snow3g_auth_cipher(\n+\t\t&snow3g_auth_cipher_partial_digest_encryption,\n+\t\t\tIN_PLACE, 0);\n+}\n \n-\t\tif (ut_params->obuf)\n-\t\t\tdigest = rte_pktmbuf_read(ut_params->obuf,\n-\t\t\t\t(tdata->digest.offset_bytes == 0 ?\n-\t\t\t\tplaintext_pad_len : tdata->digest.offset_bytes),\n-\t\t\t\ttdata->digest.len, digest_buffer);\n-\t\telse\n-\t\t\tdigest = rte_pktmbuf_read(ut_params->ibuf,\n-\t\t\t\t(tdata->digest.offset_bytes == 0 ?\n-\t\t\t\tplaintext_pad_len : tdata->digest.offset_bytes),\n-\t\t\t\ttdata->digest.len, digest_buffer);\n+static int\n+test_snow3g_auth_cipher_part_digest_enc_oop(void)\n+{\n+\treturn test_snow3g_auth_cipher(\n+\t\t&snow3g_auth_cipher_partial_digest_encryption,\n+\t\t\tOUT_OF_PLACE, 0);\n+}\n \n-\t\tdebug_hexdump(stdout, \"digest:\", digest,\n-\t\t\ttdata->digest.len);\n-\t\tdebug_hexdump(stdout, \"digest expected:\",\n-\t\t\ttdata->digest.data, tdata->digest.len);\n-\t}\n+static int\n+test_snow3g_auth_cipher_test_case_3_sgl(void)\n+{\n+\treturn test_snow3g_auth_cipher_sgl(\n+\t\t&snow3g_auth_cipher_test_case_3, IN_PLACE, 0);\n+}\n \n-\t/* Validate obuf */\n-\tif (verify) {\n-\t\tTEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(\n-\t\t\tplaintext,\n-\t\t\ttdata->plaintext.data,\n-\t\t\ttdata->plaintext.len >> 3,\n-\t\t\t\"KASUMI Plaintext data not as expected\");\n-\t} else {\n-\t\tTEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(\n-\t\t\tciphertext,\n-\t\t\ttdata->ciphertext.data,\n-\t\t\ttdata->validDataLenInBits.len,\n-\t\t\t\"KASUMI Ciphertext data not as expected\");\n+static int\n+test_snow3g_auth_cipher_test_case_3_oop_sgl(void)\n+{\n+\treturn test_snow3g_auth_cipher_sgl(\n+\t\t&snow3g_auth_cipher_test_case_3, OUT_OF_PLACE, 0);\n+}\n \n-\t\tTEST_ASSERT_BUFFERS_ARE_EQUAL(\n-\t\t\tdigest,\n-\t\t\ttdata->digest.data,\n-\t\t\tDIGEST_BYTE_LENGTH_KASUMI_F9,\n-\t\t\t\"KASUMI Generated auth tag not as expected\");\n-\t}\n-\treturn 0;\n+static int\n+test_snow3g_auth_cipher_part_digest_enc_sgl(void)\n+{\n+\treturn test_snow3g_auth_cipher_sgl(\n+\t\t&snow3g_auth_cipher_partial_digest_encryption,\n+\t\t\tIN_PLACE, 0);\n }\n \n static int\n-test_kasumi_cipher_auth(const struct kasumi_test_data *tdata)\n+test_snow3g_auth_cipher_part_digest_enc_oop_sgl(void)\n {\n-\tstruct crypto_testsuite_params *ts_params = &testsuite_params;\n-\tstruct crypto_unittest_params *ut_params = &unittest_params;\n+\treturn test_snow3g_auth_cipher_sgl(\n+\t\t&snow3g_auth_cipher_partial_digest_encryption,\n+\t\t\tOUT_OF_PLACE, 0);\n+}\n \n-\tint retval;\n-\n-\tuint8_t *plaintext, *ciphertext;\n-\tunsigned plaintext_pad_len;\n-\tunsigned plaintext_len;\n+static int\n+test_snow3g_auth_cipher_verify_test_case_1(void)\n+{\n+\treturn test_snow3g_auth_cipher(\n+\t\t&snow3g_auth_cipher_test_case_1, IN_PLACE, 1);\n+}\n \n-\t/* Create KASUMI session */\n-\tretval = create_wireless_algo_cipher_auth_session(\n-\t\t\tts_params->valid_devs[0],\n-\t\t\tRTE_CRYPTO_CIPHER_OP_ENCRYPT,\n-\t\t\tRTE_CRYPTO_AUTH_OP_GENERATE,\n-\t\t\tRTE_CRYPTO_AUTH_KASUMI_F9,\n-\t\t\tRTE_CRYPTO_CIPHER_KASUMI_F8,\n-\t\t\ttdata->key.data, tdata->key.len,\n-\t\t\t0, tdata->digest.len,\n-\t\t\ttdata->cipher_iv.len);\n-\tif (retval < 0)\n-\t\treturn retval;\n+static int\n+test_snow3g_auth_cipher_verify_test_case_2(void)\n+{\n+\treturn test_snow3g_auth_cipher(\n+\t\t&snow3g_auth_cipher_test_case_2, IN_PLACE, 1);\n+}\n \n-\tut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);\n+static int\n+test_snow3g_auth_cipher_verify_test_case_2_oop(void)\n+{\n+\treturn test_snow3g_auth_cipher(\n+\t\t&snow3g_auth_cipher_test_case_2, OUT_OF_PLACE, 1);\n+}\n \n-\t/* clear mbuf payload */\n-\tmemset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,\n-\t\t\trte_pktmbuf_tailroom(ut_params->ibuf));\n+static int\n+test_snow3g_auth_cipher_verify_part_digest_enc(void)\n+{\n+\treturn test_snow3g_auth_cipher(\n+\t\t&snow3g_auth_cipher_partial_digest_encryption,\n+\t\t\tIN_PLACE, 1);\n+}\n \n-\tplaintext_len = ceil_byte_length(tdata->plaintext.len);\n-\t/* Append data which is padded to a multiple of */\n-\t/* the algorithms block size */\n-\tplaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16);\n-\tplaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,\n-\t\t\t\tplaintext_pad_len);\n-\tmemcpy(plaintext, tdata->plaintext.data, plaintext_len);\n+static int\n+test_snow3g_auth_cipher_verify_part_digest_enc_oop(void)\n+{\n+\treturn test_snow3g_auth_cipher(\n+\t\t&snow3g_auth_cipher_partial_digest_encryption,\n+\t\t\tOUT_OF_PLACE, 1);\n+}\n \n-\tdebug_hexdump(stdout, \"plaintext:\", plaintext, plaintext_len);\n+static int\n+test_snow3g_auth_cipher_verify_test_case_3_sgl(void)\n+{\n+\treturn test_snow3g_auth_cipher_sgl(\n+\t\t&snow3g_auth_cipher_test_case_3, IN_PLACE, 1);\n+}\n \n-\t/* Create KASUMI operation */\n-\tretval = create_wireless_algo_cipher_hash_operation(tdata->digest.data,\n-\t\t\t\ttdata->digest.len, NULL, 0,\n-\t\t\t\tplaintext_pad_len, RTE_CRYPTO_AUTH_OP_GENERATE,\n-\t\t\t\ttdata->cipher_iv.data, tdata->cipher_iv.len,\n-\t\t\t\tRTE_ALIGN_CEIL(tdata->validCipherLenInBits.len, 8),\n-\t\t\t\ttdata->validCipherOffsetInBits.len,\n-\t\t\t\ttdata->validAuthLenInBits.len,\n-\t\t\t\t0\n-\t\t\t\t);\n-\tif (retval < 0)\n-\t\treturn retval;\n+static int\n+test_snow3g_auth_cipher_verify_test_case_3_oop_sgl(void)\n+{\n+\treturn test_snow3g_auth_cipher_sgl(\n+\t\t&snow3g_auth_cipher_test_case_3, OUT_OF_PLACE, 1);\n+}\n \n-\tut_params->op = process_crypto_request(ts_params->valid_devs[0],\n-\t\t\tut_params->op);\n-\tTEST_ASSERT_NOT_NULL(ut_params->op, \"failed to retrieve obuf\");\n+static int\n+test_snow3g_auth_cipher_verify_part_digest_enc_sgl(void)\n+{\n+\treturn test_snow3g_auth_cipher_sgl(\n+\t\t&snow3g_auth_cipher_partial_digest_encryption,\n+\t\t\tIN_PLACE, 1);\n+}\n \n-\tif (ut_params->op->sym->m_dst)\n-\t\tut_params->obuf = ut_params->op->sym->m_dst;\n-\telse\n-\t\tut_params->obuf = ut_params->op->sym->m_src;\n+static int\n+test_snow3g_auth_cipher_verify_part_digest_enc_oop_sgl(void)\n+{\n+\treturn test_snow3g_auth_cipher_sgl(\n+\t\t&snow3g_auth_cipher_partial_digest_encryption,\n+\t\t\tOUT_OF_PLACE, 1);\n+}\n \n-\tciphertext = rte_pktmbuf_mtod_offset(ut_params->obuf, uint8_t *,\n-\t\t\t\ttdata->validCipherOffsetInBits.len >> 3);\n+static int\n+test_snow3g_auth_cipher_with_digest_test_case_1(void)\n+{\n+\treturn test_snow3g_auth_cipher(\n+\t\t&snow3g_test_case_7, IN_PLACE, 0);\n+}\n \n-\tut_params->digest = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *)\n-\t\t\t+ plaintext_pad_len;\n+static int\n+test_kasumi_auth_cipher_test_case_1(void)\n+{\n+\treturn test_kasumi_auth_cipher(\n+\t\t&kasumi_test_case_3, IN_PLACE, 0);\n+}\n \n-\tconst uint8_t *reference_ciphertext = tdata->ciphertext.data +\n-\t\t\t\t(tdata->validCipherOffsetInBits.len >> 3);\n-\t/* Validate obuf */\n-\tTEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(\n-\t\tciphertext,\n-\t\treference_ciphertext,\n-\t\ttdata->validCipherLenInBits.len,\n-\t\t\"KASUMI Ciphertext data not as expected\");\n+static int\n+test_kasumi_auth_cipher_test_case_2(void)\n+{\n+\treturn test_kasumi_auth_cipher(\n+\t\t&kasumi_auth_cipher_test_case_2, IN_PLACE, 0);\n+}\n \n-\t/* Validate obuf */\n-\tTEST_ASSERT_BUFFERS_ARE_EQUAL(\n-\t\tut_params->digest,\n-\t\ttdata->digest.data,\n-\t\tDIGEST_BYTE_LENGTH_SNOW3G_UIA2,\n-\t\t\"KASUMI Generated auth tag not as expected\");\n-\treturn 0;\n+static int\n+test_kasumi_auth_cipher_test_case_2_oop(void)\n+{\n+\treturn test_kasumi_auth_cipher(\n+\t\t&kasumi_auth_cipher_test_case_2, OUT_OF_PLACE, 0);\n }\n \n static int\n-test_zuc_encryption(const struct wireless_test_data *tdata)\n+test_kasumi_auth_cipher_test_case_2_sgl(void)\n {\n-\tstruct crypto_testsuite_params *ts_params = &testsuite_params;\n-\tstruct crypto_unittest_params *ut_params = &unittest_params;\n+\treturn test_kasumi_auth_cipher_sgl(\n+\t\t&kasumi_auth_cipher_test_case_2, IN_PLACE, 0);\n+}\n \n-\tint retval;\n-\tuint8_t *plaintext, *ciphertext;\n-\tunsigned plaintext_pad_len;\n-\tunsigned plaintext_len;\n+static int\n+test_kasumi_auth_cipher_test_case_2_oop_sgl(void)\n+{\n+\treturn test_kasumi_auth_cipher_sgl(\n+\t\t&kasumi_auth_cipher_test_case_2, OUT_OF_PLACE, 0);\n+}\n \n-\tstruct rte_cryptodev_sym_capability_idx cap_idx;\n+static int\n+test_kasumi_auth_cipher_verify_test_case_1(void)\n+{\n+\treturn test_kasumi_auth_cipher(\n+\t\t&kasumi_test_case_3, IN_PLACE, 1);\n+}\n \n-\t/* Check if device supports ZUC EEA3 */\n-\tcap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;\n-\tcap_idx.algo.cipher = RTE_CRYPTO_CIPHER_ZUC_EEA3;\n+static int\n+test_kasumi_auth_cipher_verify_test_case_2(void)\n+{\n+\treturn test_kasumi_auth_cipher(\n+\t\t&kasumi_auth_cipher_test_case_2, IN_PLACE, 1);\n+}\n \n-\tif (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],\n-\t\t\t&cap_idx) == NULL)\n-\t\treturn -ENOTSUP;\n+static int\n+test_kasumi_auth_cipher_verify_test_case_2_oop(void)\n+{\n+\treturn test_kasumi_auth_cipher(\n+\t\t&kasumi_auth_cipher_test_case_2, OUT_OF_PLACE, 1);\n+}\n \n-\t/* Create ZUC session */\n-\tretval = create_wireless_algo_cipher_session(ts_params->valid_devs[0],\n-\t\t\t\t\tRTE_CRYPTO_CIPHER_OP_ENCRYPT,\n-\t\t\t\t\tRTE_CRYPTO_CIPHER_ZUC_EEA3,\n-\t\t\t\t\ttdata->key.data, tdata->key.len,\n-\t\t\t\t\ttdata->cipher_iv.len);\n-\tif (retval < 0)\n-\t\treturn retval;\n+static int\n+test_kasumi_auth_cipher_verify_test_case_2_sgl(void)\n+{\n+\treturn test_kasumi_auth_cipher_sgl(\n+\t\t&kasumi_auth_cipher_test_case_2, IN_PLACE, 1);\n+}\n \n-\tut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);\n+static int\n+test_kasumi_auth_cipher_verify_test_case_2_oop_sgl(void)\n+{\n+\treturn test_kasumi_auth_cipher_sgl(\n+\t\t&kasumi_auth_cipher_test_case_2, OUT_OF_PLACE, 1);\n+}\n \n-\t/* Clear mbuf payload */\n-\tmemset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,\n-\t       rte_pktmbuf_tailroom(ut_params->ibuf));\n+static int\n+test_kasumi_cipher_auth_test_case_1(void)\n+{\n+\treturn test_kasumi_cipher_auth(&kasumi_test_case_6);\n+}\n \n-\tplaintext_len = ceil_byte_length(tdata->plaintext.len);\n-\t/* Append data which is padded to a multiple */\n-\t/* of the algorithms block size */\n-\tplaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 8);\n-\tplaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,\n-\t\t\t\tplaintext_pad_len);\n-\tmemcpy(plaintext, tdata->plaintext.data, plaintext_len);\n+static int\n+test_zuc_encryption_test_case_1(void)\n+{\n+\treturn test_zuc_encryption(&zuc_test_case_cipher_193b);\n+}\n \n-\tdebug_hexdump(stdout, \"plaintext:\", plaintext, plaintext_len);\n+static int\n+test_zuc_encryption_test_case_2(void)\n+{\n+\treturn test_zuc_encryption(&zuc_test_case_cipher_800b);\n+}\n \n-\t/* Create ZUC operation */\n-\tretval = create_wireless_algo_cipher_operation(tdata->cipher_iv.data,\n-\t\t\t\t\ttdata->cipher_iv.len,\n-\t\t\t\t\ttdata->plaintext.len,\n-\t\t\t\t\t0);\n-\tif (retval < 0)\n-\t\treturn retval;\n+static int\n+test_zuc_encryption_test_case_3(void)\n+{\n+\treturn test_zuc_encryption(&zuc_test_case_cipher_1570b);\n+}\n \n-\tut_params->op = process_crypto_request(ts_params->valid_devs[0],\n-\t\t\t\t\t\tut_params->op);\n-\tTEST_ASSERT_NOT_NULL(ut_params->op, \"failed to retrieve obuf\");\n+static int\n+test_zuc_encryption_test_case_4(void)\n+{\n+\treturn test_zuc_encryption(&zuc_test_case_cipher_2798b);\n+}\n \n-\tut_params->obuf = ut_params->op->sym->m_dst;\n-\tif (ut_params->obuf)\n-\t\tciphertext = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *);\n-\telse\n-\t\tciphertext = plaintext;\n+static int\n+test_zuc_encryption_test_case_5(void)\n+{\n+\treturn test_zuc_encryption(&zuc_test_case_cipher_4019b);\n+}\n \n-\tdebug_hexdump(stdout, \"ciphertext:\", ciphertext, plaintext_len);\n+static int\n+test_zuc_encryption_test_case_6_sgl(void)\n+{\n+\treturn test_zuc_encryption_sgl(&zuc_test_case_cipher_193b);\n+}\n \n-\t/* Validate obuf */\n-\tTEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(\n-\t\tciphertext,\n-\t\ttdata->ciphertext.data,\n-\t\ttdata->validCipherLenInBits.len,\n-\t\t\"ZUC Ciphertext data not as expected\");\n-\treturn 0;\n+static int\n+test_zuc_hash_generate_test_case_1(void)\n+{\n+\treturn test_zuc_authentication(&zuc_test_case_auth_1b);\n }\n \n static int\n-test_zuc_encryption_sgl(const struct wireless_test_data *tdata)\n+test_zuc_hash_generate_test_case_2(void)\n {\n-\tstruct crypto_testsuite_params *ts_params = &testsuite_params;\n-\tstruct crypto_unittest_params *ut_params = &unittest_params;\n+\treturn test_zuc_authentication(&zuc_test_case_auth_90b);\n+}\n \n-\tint retval;\n+static int\n+test_zuc_hash_generate_test_case_3(void)\n+{\n+\treturn test_zuc_authentication(&zuc_test_case_auth_577b);\n+}\n \n-\tunsigned int plaintext_pad_len;\n-\tunsigned int plaintext_len;\n-\tconst uint8_t *ciphertext;\n-\tuint8_t ciphertext_buffer[2048];\n-\tstruct rte_cryptodev_info dev_info;\n+static int\n+test_zuc_hash_generate_test_case_4(void)\n+{\n+\treturn test_zuc_authentication(&zuc_test_case_auth_2079b);\n+}\n \n-\tstruct rte_cryptodev_sym_capability_idx cap_idx;\n+static int\n+test_zuc_hash_generate_test_case_5(void)\n+{\n+\treturn test_zuc_authentication(&zuc_test_auth_5670b);\n+}\n \n-\t/* Check if device supports ZUC EEA3 */\n-\tcap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;\n-\tcap_idx.algo.cipher = RTE_CRYPTO_CIPHER_ZUC_EEA3;\n+static int\n+test_zuc_hash_generate_test_case_6(void)\n+{\n+\treturn test_zuc_authentication(&zuc_test_case_auth_128b);\n+}\n \n-\tif (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],\n-\t\t\t&cap_idx) == NULL)\n+static int\n+test_zuc_hash_generate_test_case_7(void)\n+{\n+\t/* This test is not for SW ZUC PMD */\n+\tif (gbl_driver_id == rte_cryptodev_driver_id_get(\n+\t\t\tRTE_STR(CRYPTODEV_NAME_ZUC_PMD)))\n \t\treturn -ENOTSUP;\n \n-\trte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);\n+\treturn test_zuc_authentication(&zuc_test_case_auth_2080b);\n+}\n \n-\tuint64_t feat_flags = dev_info.feature_flags;\n+static int\n+test_zuc_hash_generate_test_case_8(void)\n+{\n+\treturn test_zuc_authentication(&zuc_test_case_auth_584b);\n+}\n \n-\tif (!(feat_flags & RTE_CRYPTODEV_FF_IN_PLACE_SGL)) {\n-\t\tprintf(\"Device doesn't support in-place scatter-gather. \"\n-\t\t\t\t\"Test Skipped.\\n\");\n+static int\n+test_zuc_cipher_auth_test_case_1(void)\n+{\n+\treturn test_zuc_cipher_auth(&zuc_test_case_cipher_200b_auth_200b);\n+}\n+\n+static int\n+test_zuc_cipher_auth_test_case_2(void)\n+{\n+\treturn test_zuc_cipher_auth(&zuc_test_case_cipher_800b_auth_120b);\n+}\n+\n+static int\n+test_zuc_auth_cipher_test_case_1(void)\n+{\n+\t/* This test is not for SW ZUC PMD */\n+\tif (gbl_driver_id == rte_cryptodev_driver_id_get(\n+\t\t\tRTE_STR(CRYPTODEV_NAME_ZUC_PMD)))\n \t\treturn -ENOTSUP;\n-\t}\n \n-\tplaintext_len = ceil_byte_length(tdata->plaintext.len);\n+\treturn test_zuc_auth_cipher(\n+\t\t&zuc_auth_cipher_test_case_1, IN_PLACE, 0);\n+}\n \n-\t/* Append data which is padded to a multiple */\n-\t/* of the algorithms block size */\n-\tplaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 8);\n+static int\n+test_zuc_auth_cipher_test_case_1_oop(void)\n+{\n+\treturn test_zuc_auth_cipher(\n+\t\t&zuc_auth_cipher_test_case_1, OUT_OF_PLACE, 0);\n+}\n \n-\tut_params->ibuf = create_segmented_mbuf(ts_params->mbuf_pool,\n-\t\t\tplaintext_pad_len, 10, 0);\n+static int\n+test_zuc_auth_cipher_test_case_1_sgl(void)\n+{\n+\treturn test_zuc_auth_cipher_sgl(\n+\t\t&zuc_auth_cipher_test_case_1, IN_PLACE, 0);\n+}\n \n-\tpktmbuf_write(ut_params->ibuf, 0, plaintext_len,\n-\t\t\ttdata->plaintext.data);\n+static int\n+test_zuc_auth_cipher_test_case_1_oop_sgl(void)\n+{\n+\treturn test_zuc_auth_cipher_sgl(\n+\t\t&zuc_auth_cipher_test_case_1, OUT_OF_PLACE, 0);\n+}\n \n-\t/* Create ZUC session */\n-\tretval = create_wireless_algo_cipher_session(ts_params->valid_devs[0],\n-\t\t\tRTE_CRYPTO_CIPHER_OP_ENCRYPT,\n-\t\t\tRTE_CRYPTO_CIPHER_ZUC_EEA3,\n-\t\t\ttdata->key.data, tdata->key.len,\n-\t\t\ttdata->cipher_iv.len);\n-\tif (retval < 0)\n-\t\treturn retval;\n+static int\n+test_zuc_auth_cipher_verify_test_case_1(void)\n+{\n+\treturn test_zuc_auth_cipher(\n+\t\t&zuc_auth_cipher_test_case_1, IN_PLACE, 1);\n+}\n \n-\t/* Clear mbuf payload */\n+static int\n+test_zuc_auth_cipher_verify_test_case_1_oop(void)\n+{\n+\treturn test_zuc_auth_cipher(\n+\t\t&zuc_auth_cipher_test_case_1, OUT_OF_PLACE, 1);\n+}\n \n-\tpktmbuf_write(ut_params->ibuf, 0, plaintext_len, tdata->plaintext.data);\n+static int\n+test_zuc_auth_cipher_verify_test_case_1_sgl(void)\n+{\n+\treturn test_zuc_auth_cipher_sgl(\n+\t\t&zuc_auth_cipher_test_case_1, IN_PLACE, 1);\n+}\n \n-\t/* Create ZUC operation */\n-\tretval = create_wireless_algo_cipher_operation(tdata->cipher_iv.data,\n-\t\t\ttdata->cipher_iv.len, tdata->plaintext.len,\n-\t\t\t0);\n-\tif (retval < 0)\n-\t\treturn retval;\n+static int\n+test_zuc_auth_cipher_verify_test_case_1_oop_sgl(void)\n+{\n+\treturn test_zuc_auth_cipher_sgl(\n+\t\t&zuc_auth_cipher_test_case_1, OUT_OF_PLACE, 1);\n+}\n \n-\tut_params->op = process_crypto_request(ts_params->valid_devs[0],\n-\t\t\t\t\t\tut_params->op);\n-\tTEST_ASSERT_NOT_NULL(ut_params->op, \"failed to retrieve obuf\");\n+static int\n+test_mixed_check_if_unsupported(const struct mixed_cipher_auth_test_data *tdata)\n+{\n+\tuint8_t dev_id = testsuite_params.valid_devs[0];\n \n-\tut_params->obuf = ut_params->op->sym->m_dst;\n-\tif (ut_params->obuf)\n-\t\tciphertext = rte_pktmbuf_read(ut_params->obuf,\n-\t\t\t0, plaintext_len, ciphertext_buffer);\n-\telse\n-\t\tciphertext = rte_pktmbuf_read(ut_params->ibuf,\n-\t\t\t0, plaintext_len, ciphertext_buffer);\n+\tstruct rte_cryptodev_sym_capability_idx cap_idx;\n \n-\t/* Validate obuf */\n-\tdebug_hexdump(stdout, \"ciphertext:\", ciphertext, plaintext_len);\n+\t/* Check if device supports particular cipher algorithm */\n+\tcap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;\n+\tcap_idx.algo.cipher = tdata->cipher_algo;\n+\tif (rte_cryptodev_sym_capability_get(dev_id, &cap_idx) == NULL)\n+\t\treturn -ENOTSUP;\n \n-\t/* Validate obuf */\n-\tTEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(\n-\t\tciphertext,\n-\t\ttdata->ciphertext.data,\n-\t\ttdata->validCipherLenInBits.len,\n-\t\t\"ZUC Ciphertext data not as expected\");\n+\t/* Check if device supports particular hash algorithm */\n+\tcap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;\n+\tcap_idx.algo.auth = tdata->auth_algo;\n+\tif (rte_cryptodev_sym_capability_get(dev_id, &cap_idx) == NULL)\n+\t\treturn -ENOTSUP;\n \n \treturn 0;\n }\n \n static int\n-test_zuc_authentication(const struct wireless_test_data *tdata)\n+test_mixed_auth_cipher(const struct mixed_cipher_auth_test_data *tdata,\n+\tuint8_t op_mode, uint8_t verify)\n {\n \tstruct crypto_testsuite_params *ts_params = &testsuite_params;\n \tstruct crypto_unittest_params *ut_params = &unittest_params;\n \n \tint retval;\n-\tunsigned plaintext_pad_len;\n-\tunsigned plaintext_len;\n-\tuint8_t *plaintext;\n \n-\tstruct rte_cryptodev_sym_capability_idx cap_idx;\n+\tuint8_t *plaintext = NULL, *ciphertext = NULL;\n+\tunsigned int plaintext_pad_len;\n+\tunsigned int plaintext_len;\n+\tunsigned int ciphertext_pad_len;\n+\tunsigned int ciphertext_len;\n \n-\t/* Check if device supports ZUC EIA3 */\n-\tcap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;\n-\tcap_idx.algo.auth = RTE_CRYPTO_AUTH_ZUC_EIA3;\n+\tstruct rte_cryptodev_info dev_info;\n+\tstruct rte_crypto_op *op;\n \n-\tif (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],\n-\t\t\t&cap_idx) == NULL)\n+\t/* Check if device supports particular algorithms separately */\n+\tif (test_mixed_check_if_unsupported(tdata))\n \t\treturn -ENOTSUP;\n \n-\t/* Create ZUC session */\n-\tretval = create_wireless_algo_hash_session(ts_params->valid_devs[0],\n-\t\t\ttdata->key.data, tdata->key.len,\n-\t\t\ttdata->auth_iv.len, tdata->digest.len,\n-\t\t\tRTE_CRYPTO_AUTH_OP_GENERATE,\n-\t\t\tRTE_CRYPTO_AUTH_ZUC_EIA3);\n-\tif (retval < 0)\n-\t\treturn retval;\n-\n-\t/* alloc mbuf and set payload */\n-\tut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);\n+\trte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);\n \n-\tmemset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,\n-\trte_pktmbuf_tailroom(ut_params->ibuf));\n+\tuint64_t feat_flags = dev_info.feature_flags;\n \n-\tplaintext_len = ceil_byte_length(tdata->plaintext.len);\n-\t/* Append data which is padded to a multiple of */\n-\t/* the algorithms block size */\n-\tplaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 8);\n-\tplaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,\n-\t\t\t\tplaintext_pad_len);\n-\tmemcpy(plaintext, tdata->plaintext.data, plaintext_len);\n-\n-\t/* Create ZUC operation */\n-\tretval = create_wireless_algo_hash_operation(NULL, tdata->digest.len,\n-\t\t\ttdata->auth_iv.data, tdata->auth_iv.len,\n-\t\t\tplaintext_pad_len, RTE_CRYPTO_AUTH_OP_GENERATE,\n-\t\t\ttdata->validAuthLenInBits.len,\n-\t\t\t0);\n-\tif (retval < 0)\n-\t\treturn retval;\n-\n-\tut_params->op = process_crypto_request(ts_params->valid_devs[0],\n-\t\t\t\tut_params->op);\n-\tut_params->obuf = ut_params->op->sym->m_src;\n-\tTEST_ASSERT_NOT_NULL(ut_params->op, \"failed to retrieve obuf\");\n-\tut_params->digest = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *)\n-\t\t\t+ plaintext_pad_len;\n-\n-\t/* Validate obuf */\n-\tTEST_ASSERT_BUFFERS_ARE_EQUAL(\n-\tut_params->digest,\n-\ttdata->digest.data,\n-\tDIGEST_BYTE_LENGTH_KASUMI_F9,\n-\t\"ZUC Generated auth tag not as expected\");\n-\n-\treturn 0;\n-}\n-\n-static int\n-test_zuc_auth_cipher(const struct wireless_test_data *tdata,\n-\tuint8_t op_mode, uint8_t verify)\n-{\n-\tstruct crypto_testsuite_params *ts_params = &testsuite_params;\n-\tstruct crypto_unittest_params *ut_params = &unittest_params;\n-\n-\tint retval;\n-\n-\tuint8_t *plaintext = NULL, *ciphertext = NULL;\n-\tunsigned int plaintext_pad_len;\n-\tunsigned int plaintext_len;\n-\tunsigned int ciphertext_pad_len;\n-\tunsigned int ciphertext_len;\n-\n-\tstruct rte_cryptodev_info dev_info;\n-\tstruct rte_cryptodev_sym_capability_idx cap_idx;\n-\n-\t/* Check if device supports ZUC EIA3 */\n-\tcap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;\n-\tcap_idx.algo.auth = RTE_CRYPTO_AUTH_ZUC_EIA3;\n-\n-\tif (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],\n-\t\t\t&cap_idx) == NULL)\n-\t\treturn -ENOTSUP;\n-\n-\trte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);\n-\n-\tuint64_t feat_flags = dev_info.feature_flags;\n-\n-\tif (op_mode == OUT_OF_PLACE) {\n-\t\tif (!(feat_flags & RTE_CRYPTODEV_FF_DIGEST_ENCRYPTED)) {\n-\t\t\tprintf(\"Device doesn't support digest encrypted.\\n\");\n-\t\t\treturn -ENOTSUP;\n-\t\t}\n-\t}\n-\n-\t/* Create ZUC session */\n-\tretval = create_wireless_algo_auth_cipher_session(\n-\t\t\tts_params->valid_devs[0],\n-\t\t\t(verify ? RTE_CRYPTO_CIPHER_OP_DECRYPT\n-\t\t\t\t\t: RTE_CRYPTO_CIPHER_OP_ENCRYPT),\n-\t\t\t(verify ? RTE_CRYPTO_AUTH_OP_VERIFY\n-\t\t\t\t\t: RTE_CRYPTO_AUTH_OP_GENERATE),\n-\t\t\tRTE_CRYPTO_AUTH_ZUC_EIA3,\n-\t\t\tRTE_CRYPTO_CIPHER_ZUC_EEA3,\n-\t\t\ttdata->key.data, tdata->key.len,\n-\t\t\ttdata->auth_iv.len, tdata->digest.len,\n-\t\t\ttdata->cipher_iv.len);\n+\tif (op_mode == OUT_OF_PLACE) {\n+\t\tif (!(feat_flags & RTE_CRYPTODEV_FF_DIGEST_ENCRYPTED)) {\n+\t\t\tprintf(\"Device doesn't support digest encrypted.\\n\");\n+\t\t\treturn -ENOTSUP;\n+\t\t}\n+\t}\n \n+\t/* Create the session */\n+\tif (verify)\n+\t\tretval = create_wireless_algo_cipher_auth_session(\n+\t\t\t\tts_params->valid_devs[0],\n+\t\t\t\tRTE_CRYPTO_CIPHER_OP_DECRYPT,\n+\t\t\t\tRTE_CRYPTO_AUTH_OP_VERIFY,\n+\t\t\t\ttdata->auth_algo,\n+\t\t\t\ttdata->cipher_algo,\n+\t\t\t\ttdata->auth_key.data, tdata->auth_key.len,\n+\t\t\t\ttdata->auth_iv.len, tdata->digest_enc.len,\n+\t\t\t\ttdata->cipher_iv.len);\n+\telse\n+\t\tretval = create_wireless_algo_auth_cipher_session(\n+\t\t\t\tts_params->valid_devs[0],\n+\t\t\t\tRTE_CRYPTO_CIPHER_OP_ENCRYPT,\n+\t\t\t\tRTE_CRYPTO_AUTH_OP_GENERATE,\n+\t\t\t\ttdata->auth_algo,\n+\t\t\t\ttdata->cipher_algo,\n+\t\t\t\ttdata->auth_key.data, tdata->auth_key.len,\n+\t\t\t\ttdata->auth_iv.len, tdata->digest_enc.len,\n+\t\t\t\ttdata->cipher_iv.len);\n \tif (retval < 0)\n \t\treturn retval;\n \n@@ -5678,117 +6099,142 @@ test_zuc_auth_cipher(const struct wireless_test_data *tdata,\n \t\trte_pktmbuf_tailroom(ut_params->ibuf));\n \tif (op_mode == OUT_OF_PLACE)\n \t\tmemset(rte_pktmbuf_mtod(ut_params->obuf, uint8_t *), 0,\n-\t\t\trte_pktmbuf_tailroom(ut_params->obuf));\n+\t\t\t\trte_pktmbuf_tailroom(ut_params->obuf));\n \n-\tciphertext_len = ceil_byte_length(tdata->ciphertext.len);\n-\tplaintext_len = ceil_byte_length(tdata->plaintext.len);\n+\tciphertext_len = ceil_byte_length(tdata->ciphertext.len_bits);\n+\tplaintext_len = ceil_byte_length(tdata->plaintext.len_bits);\n \tciphertext_pad_len = RTE_ALIGN_CEIL(ciphertext_len, 16);\n \tplaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16);\n \n \tif (verify) {\n \t\tciphertext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,\n-\t\t\t\t\tciphertext_pad_len);\n+\t\t\t\tciphertext_pad_len);\n \t\tmemcpy(ciphertext, tdata->ciphertext.data, ciphertext_len);\n \t\tif (op_mode == OUT_OF_PLACE)\n \t\t\trte_pktmbuf_append(ut_params->obuf, ciphertext_pad_len);\n \t\tdebug_hexdump(stdout, \"ciphertext:\", ciphertext,\n-\t\t\tciphertext_len);\n+\t\t\t\tciphertext_len);\n \t} else {\n \t\tplaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,\n-\t\t\t\t\tplaintext_pad_len);\n+\t\t\t\tplaintext_pad_len);\n \t\tmemcpy(plaintext, tdata->plaintext.data, plaintext_len);\n \t\tif (op_mode == OUT_OF_PLACE)\n \t\t\trte_pktmbuf_append(ut_params->obuf, plaintext_pad_len);\n-\t\tdebug_hexdump(stdout, \"plaintext:\", plaintext,\n-\t\t\tplaintext_len);\n+\t\tdebug_hexdump(stdout, \"plaintext:\", plaintext, plaintext_len);\n \t}\n \n-\t/* Create ZUC operation */\n-\tretval = create_wireless_algo_auth_cipher_operation(\n-\t\ttdata->digest.len,\n-\t\ttdata->cipher_iv.data, tdata->cipher_iv.len,\n-\t\ttdata->auth_iv.data, tdata->auth_iv.len,\n-\t\t(tdata->digest.offset_bytes == 0 ?\n-\t\t(verify ? ciphertext_pad_len : plaintext_pad_len)\n-\t\t\t: tdata->digest.offset_bytes),\n-\t\ttdata->validCipherLenInBits.len,\n-\t\ttdata->validCipherOffsetInBits.len,\n-\t\ttdata->validAuthLenInBits.len,\n-\t\t0,\n-\t\top_mode, 0);\n-\n+\t/* Create the operation */\n+\tif (verify)\n+\t\tretval = create_wireless_algo_cipher_hash_operation(\n+\t\t\t\ttdata->digest_enc.data, tdata->digest_enc.len,\n+\t\t\t\ttdata->auth_iv.data, tdata->auth_iv.len,\n+\t\t\t\tplaintext_len, RTE_CRYPTO_AUTH_OP_VERIFY,\n+\t\t\t\ttdata->cipher_iv.data, tdata->cipher_iv.len,\n+\t\t\t\ttdata->validCipherLen.len_bits,\n+\t\t\t\ttdata->cipher.offset_bits,\n+\t\t\t\ttdata->validAuthLen.len_bits,\n+\t\t\t\ttdata->auth.offset_bits);\n+\telse\n+\t\tretval = create_wireless_algo_auth_cipher_operation(\n+\t\t\t\ttdata->digest_enc.len,\n+\t\t\t\ttdata->cipher_iv.data, tdata->cipher_iv.len,\n+\t\t\t\ttdata->auth_iv.data, tdata->auth_iv.len,\n+\t\t\t\t(tdata->digest_enc.offset == 0 ?\n+\t\t\t\t\tplaintext_pad_len\n+\t\t\t\t\t: tdata->digest_enc.offset),\n+\t\t\t\ttdata->validCipherLen.len_bits,\n+\t\t\t\ttdata->cipher.offset_bits,\n+\t\t\t\ttdata->validAuthLen.len_bits,\n+\t\t\t\ttdata->auth.offset_bits,\n+\t\t\t\top_mode, 0);\n \tif (retval < 0)\n \t\treturn retval;\n \n-\tut_params->op = process_crypto_request(ts_params->valid_devs[0],\n+\top = process_crypto_request(ts_params->valid_devs[0],\n \t\t\tut_params->op);\n \n+\t/* Check if the op failed because the device doesn't */\n+\t/* support this particular combination of algorithms */\n+\tif (op == NULL && ut_params->op->status ==\n+\t\t\tRTE_CRYPTO_OP_STATUS_INVALID_SESSION) {\n+\t\tprintf(\"Device doesn't support this mixed combination. \"\n+\t\t\t\t\"Test Skipped.\\n\");\n+\t\treturn -ENOTSUP;\n+\t}\n+\n+\tut_params->op = op;\n+\n \tTEST_ASSERT_NOT_NULL(ut_params->op, \"failed to retrieve obuf\");\n \n \tut_params->obuf = (op_mode == IN_PLACE ?\n-\t\tut_params->op->sym->m_src : ut_params->op->sym->m_dst);\n-\n+\t\t\tut_params->op->sym->m_src : ut_params->op->sym->m_dst);\n \n \tif (verify) {\n \t\tif (ut_params->obuf)\n \t\t\tplaintext = rte_pktmbuf_mtod(ut_params->obuf,\n \t\t\t\t\t\t\tuint8_t *);\n \t\telse\n-\t\t\tplaintext = ciphertext;\n+\t\t\tplaintext = ciphertext +\n+\t\t\t\t\t(tdata->cipher.offset_bits >> 3);\n \n \t\tdebug_hexdump(stdout, \"plaintext:\", plaintext,\n-\t\t\t(tdata->plaintext.len >> 3) - tdata->digest.len);\n+\t\t\t\ttdata->plaintext.len_bits >> 3);\n \t\tdebug_hexdump(stdout, \"plaintext expected:\",\n-\t\t\ttdata->plaintext.data,\n-\t\t\t(tdata->plaintext.len >> 3) - tdata->digest.len);\n+\t\t\t\ttdata->plaintext.data,\n+\t\t\t\ttdata->plaintext.len_bits >> 3);\n \t} else {\n \t\tif (ut_params->obuf)\n \t\t\tciphertext = rte_pktmbuf_mtod(ut_params->obuf,\n-\t\t\t\t\t\t\tuint8_t *);\n+\t\t\t\t\tuint8_t *);\n \t\telse\n \t\t\tciphertext = plaintext;\n \n \t\tdebug_hexdump(stdout, \"ciphertext:\", ciphertext,\n-\t\t\tciphertext_len);\n+\t\t\t\tciphertext_len);\n \t\tdebug_hexdump(stdout, \"ciphertext expected:\",\n-\t\t\ttdata->ciphertext.data, tdata->ciphertext.len >> 3);\n+\t\t\t\ttdata->ciphertext.data,\n+\t\t\t\ttdata->ciphertext.len_bits >> 3);\n \n-\t\tut_params->digest = rte_pktmbuf_mtod(\n-\t\t\tut_params->obuf, uint8_t *) +\n-\t\t\t(tdata->digest.offset_bytes == 0 ?\n-\t\t\tplaintext_pad_len : tdata->digest.offset_bytes);\n+\t\tut_params->digest = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *)\n+\t\t\t\t+ (tdata->digest_enc.offset == 0 ?\n+\t\tplaintext_pad_len : tdata->digest_enc.offset);\n \n \t\tdebug_hexdump(stdout, \"digest:\", ut_params->digest,\n-\t\t\ttdata->digest.len);\n+\t\t\t\ttdata->digest_enc.len);\n \t\tdebug_hexdump(stdout, \"digest expected:\",\n-\t\t\ttdata->digest.data, tdata->digest.len);\n+\t\t\t\ttdata->digest_enc.data,\n+\t\t\t\ttdata->digest_enc.len);\n \t}\n \n \t/* Validate obuf */\n \tif (verify) {\n \t\tTEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(\n-\t\t\tplaintext,\n-\t\t\ttdata->plaintext.data,\n-\t\t\ttdata->plaintext.len >> 3,\n-\t\t\t\"ZUC Plaintext data not as expected\");\n+\t\t\t\tplaintext,\n+\t\t\t\ttdata->plaintext.data,\n+\t\t\t\ttdata->plaintext.len_bits >> 3,\n+\t\t\t\t\"Plaintext data not as expected\");\n \t} else {\n \t\tTEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(\n-\t\t\tciphertext,\n-\t\t\ttdata->ciphertext.data,\n-\t\t\ttdata->ciphertext.len >> 3,\n-\t\t\t\"ZUC Ciphertext data not as expected\");\n+\t\t\t\tciphertext,\n+\t\t\t\ttdata->ciphertext.data,\n+\t\t\t\ttdata->validDataLen.len_bits,\n+\t\t\t\t\"Ciphertext data not as expected\");\n \n \t\tTEST_ASSERT_BUFFERS_ARE_EQUAL(\n-\t\t\tut_params->digest,\n-\t\t\ttdata->digest.data,\n-\t\t\tDIGEST_BYTE_LENGTH_KASUMI_F9,\n-\t\t\t\"ZUC Generated auth tag not as expected\");\n+\t\t\t\tut_params->digest,\n+\t\t\t\ttdata->digest_enc.data,\n+\t\t\t\tDIGEST_BYTE_LENGTH_SNOW3G_UIA2,\n+\t\t\t\t\"Generated auth tag not as expected\");\n \t}\n+\n+\tTEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,\n+\t\t\t\"crypto op processing failed\");\n+\n \treturn 0;\n }\n \n static int\n-test_zuc_auth_cipher_sgl(const struct wireless_test_data *tdata,\n+test_mixed_auth_cipher_sgl(const struct mixed_cipher_auth_test_data *tdata,\n \tuint8_t op_mode, uint8_t verify)\n {\n \tstruct crypto_testsuite_params *ts_params = &testsuite_params;\n@@ -5807,14 +6253,10 @@ test_zuc_auth_cipher_sgl(const struct wireless_test_data *tdata,\n \tuint8_t digest_buffer[10000];\n \n \tstruct rte_cryptodev_info dev_info;\n-\tstruct rte_cryptodev_sym_capability_idx cap_idx;\n-\n-\t/* Check if device supports ZUC EIA3 */\n-\tcap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;\n-\tcap_idx.algo.auth = RTE_CRYPTO_AUTH_ZUC_EIA3;\n+\tstruct rte_crypto_op *op;\n \n-\tif (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],\n-\t\t\t&cap_idx) == NULL)\n+\t/* Check if device supports particular algorithms */\n+\tif (test_mixed_check_if_unsupported(tdata))\n \t\treturn -ENOTSUP;\n \n \trte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);\n@@ -5839,35 +6281,43 @@ test_zuc_auth_cipher_sgl(const struct wireless_test_data *tdata,\n \t\t}\n \t}\n \n-\t/* Create ZUC session */\n-\tretval = create_wireless_algo_auth_cipher_session(\n-\t\t\tts_params->valid_devs[0],\n-\t\t\t(verify ? RTE_CRYPTO_CIPHER_OP_DECRYPT\n-\t\t\t\t\t: RTE_CRYPTO_CIPHER_OP_ENCRYPT),\n-\t\t\t(verify ? RTE_CRYPTO_AUTH_OP_VERIFY\n-\t\t\t\t\t: RTE_CRYPTO_AUTH_OP_GENERATE),\n-\t\t\tRTE_CRYPTO_AUTH_ZUC_EIA3,\n-\t\t\tRTE_CRYPTO_CIPHER_ZUC_EEA3,\n-\t\t\ttdata->key.data, tdata->key.len,\n-\t\t\ttdata->auth_iv.len, tdata->digest.len,\n-\t\t\ttdata->cipher_iv.len);\n-\n-\tif (retval < 0)\n-\t\treturn retval;\n-\n-\tciphertext_len = ceil_byte_length(tdata->ciphertext.len);\n-\tplaintext_len = ceil_byte_length(tdata->plaintext.len);\n-\tciphertext_pad_len = RTE_ALIGN_CEIL(ciphertext_len, 16);\n-\tplaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16);\n-\n-\tut_params->ibuf = create_segmented_mbuf(ts_params->mbuf_pool,\n-\t\t\tplaintext_pad_len, 15, 0);\n-\tTEST_ASSERT_NOT_NULL(ut_params->ibuf,\n-\t\t\t\"Failed to allocate input buffer in mempool\");\n-\n-\tif (op_mode == OUT_OF_PLACE) {\n-\t\tut_params->obuf = create_segmented_mbuf(ts_params->mbuf_pool,\n-\t\t\t\tplaintext_pad_len, 15, 0);\n+\t/* Create the session */\n+\tif (verify)\n+\t\tretval = create_wireless_algo_cipher_auth_session(\n+\t\t\t\tts_params->valid_devs[0],\n+\t\t\t\tRTE_CRYPTO_CIPHER_OP_DECRYPT,\n+\t\t\t\tRTE_CRYPTO_AUTH_OP_VERIFY,\n+\t\t\t\ttdata->auth_algo,\n+\t\t\t\ttdata->cipher_algo,\n+\t\t\t\ttdata->auth_key.data, tdata->auth_key.len,\n+\t\t\t\ttdata->auth_iv.len, tdata->digest_enc.len,\n+\t\t\t\ttdata->cipher_iv.len);\n+\telse\n+\t\tretval = create_wireless_algo_auth_cipher_session(\n+\t\t\t\tts_params->valid_devs[0],\n+\t\t\t\tRTE_CRYPTO_CIPHER_OP_ENCRYPT,\n+\t\t\t\tRTE_CRYPTO_AUTH_OP_GENERATE,\n+\t\t\t\ttdata->auth_algo,\n+\t\t\t\ttdata->cipher_algo,\n+\t\t\t\ttdata->auth_key.data, tdata->auth_key.len,\n+\t\t\t\ttdata->auth_iv.len, tdata->digest_enc.len,\n+\t\t\t\ttdata->cipher_iv.len);\n+\tif (retval < 0)\n+\t\treturn retval;\n+\n+\tciphertext_len = ceil_byte_length(tdata->ciphertext.len_bits);\n+\tplaintext_len = ceil_byte_length(tdata->plaintext.len_bits);\n+\tciphertext_pad_len = RTE_ALIGN_CEIL(ciphertext_len, 16);\n+\tplaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16);\n+\n+\tut_params->ibuf = create_segmented_mbuf(ts_params->mbuf_pool,\n+\t\t\tciphertext_pad_len, 15, 0);\n+\tTEST_ASSERT_NOT_NULL(ut_params->ibuf,\n+\t\t\t\"Failed to allocate input buffer in mempool\");\n+\n+\tif (op_mode == OUT_OF_PLACE) {\n+\t\tut_params->obuf = create_segmented_mbuf(ts_params->mbuf_pool,\n+\t\t\t\tplaintext_pad_len, 15, 0);\n \t\tTEST_ASSERT_NOT_NULL(ut_params->obuf,\n \t\t\t\t\"Failed to allocate output buffer in mempool\");\n \t}\n@@ -5889,30 +6339,51 @@ test_zuc_auth_cipher_sgl(const struct wireless_test_data *tdata,\n \t}\n \tmemset(buffer, 0, sizeof(buffer));\n \n-\t/* Create ZUC operation */\n-\tretval = create_wireless_algo_auth_cipher_operation(\n-\t\ttdata->digest.len,\n-\t\ttdata->cipher_iv.data, tdata->cipher_iv.len,\n-\t\tNULL, 0,\n-\t\t(tdata->digest.offset_bytes == 0 ?\n-\t\t(verify ? ciphertext_pad_len : plaintext_pad_len)\n-\t\t\t: tdata->digest.offset_bytes),\n-\t\ttdata->validCipherLenInBits.len,\n-\t\ttdata->validCipherOffsetInBits.len,\n-\t\ttdata->validAuthLenInBits.len,\n-\t\t0,\n-\t\top_mode, 1);\n-\n+\t/* Create the operation */\n+\tif (verify)\n+\t\tretval = create_wireless_algo_cipher_hash_operation(\n+\t\t\t\ttdata->digest_enc.data, tdata->digest_enc.len,\n+\t\t\t\ttdata->auth_iv.data, tdata->auth_iv.len,\n+\t\t\t\tplaintext_len, RTE_CRYPTO_AUTH_OP_VERIFY,\n+\t\t\t\ttdata->cipher_iv.data, tdata->cipher_iv.len,\n+\t\t\t\ttdata->validCipherLen.len_bits,\n+\t\t\t\ttdata->cipher.offset_bits,\n+\t\t\t\ttdata->validAuthLen.len_bits,\n+\t\t\t\ttdata->auth.offset_bits);\n+\telse\n+\t\tretval = create_wireless_algo_auth_cipher_operation(\n+\t\t\t\ttdata->digest_enc.len,\n+\t\t\t\ttdata->cipher_iv.data, tdata->cipher_iv.len,\n+\t\t\t\ttdata->auth_iv.data, tdata->auth_iv.len,\n+\t\t\t\t(tdata->digest_enc.offset == 0 ?\n+\t\t\t\t\tplaintext_pad_len\n+\t\t\t\t\t: tdata->digest_enc.offset),\n+\t\t\t\ttdata->validCipherLen.len_bits,\n+\t\t\t\ttdata->cipher.offset_bits,\n+\t\t\t\ttdata->validAuthLen.len_bits,\n+\t\t\t\ttdata->auth.offset_bits,\n+\t\t\t\top_mode, 1);\n \tif (retval < 0)\n \t\treturn retval;\n \n-\tut_params->op = process_crypto_request(ts_params->valid_devs[0],\n+\top = process_crypto_request(ts_params->valid_devs[0],\n \t\t\tut_params->op);\n \n+\t/* Check if the op failed because the device doesn't */\n+\t/* support this particular combination of algorithms */\n+\tif (op == NULL && ut_params->op->status ==\n+\t\t\tRTE_CRYPTO_OP_STATUS_INVALID_SESSION) {\n+\t\tprintf(\"Device doesn't support this mixed combination. \"\n+\t\t\t\t\"Test Skipped.\\n\");\n+\t\treturn -ENOTSUP;\n+\t}\n+\n+\tut_params->op = op;\n+\n \tTEST_ASSERT_NOT_NULL(ut_params->op, \"failed to retrieve obuf\");\n \n \tut_params->obuf = (op_mode == IN_PLACE ?\n-\t\tut_params->op->sym->m_src : ut_params->op->sym->m_dst);\n+\t\t\tut_params->op->sym->m_src : ut_params->op->sym->m_dst);\n \n \tif (verify) {\n \t\tif (ut_params->obuf)\n@@ -5923,10 +6394,12 @@ test_zuc_auth_cipher_sgl(const struct wireless_test_data *tdata,\n \t\t\t\t\tplaintext_len, buffer);\n \n \t\tdebug_hexdump(stdout, \"plaintext:\", plaintext,\n-\t\t\t(tdata->plaintext.len >> 3) - tdata->digest.len);\n+\t\t\t\t(tdata->plaintext.len_bits >> 3) -\n+\t\t\t\ttdata->digest_enc.len);\n \t\tdebug_hexdump(stdout, \"plaintext expected:\",\n-\t\t\ttdata->plaintext.data,\n-\t\t\t(tdata->plaintext.len >> 3) - tdata->digest.len);\n+\t\t\t\ttdata->plaintext.data,\n+\t\t\t\t(tdata->plaintext.len_bits >> 3) -\n+\t\t\t\ttdata->digest_enc.len);\n \t} else {\n \t\tif (ut_params->obuf)\n \t\t\tciphertext = rte_pktmbuf_read(ut_params->obuf, 0,\n@@ -5938,1910 +6411,1808 @@ test_zuc_auth_cipher_sgl(const struct wireless_test_data *tdata,\n \t\tdebug_hexdump(stdout, \"ciphertext:\", ciphertext,\n \t\t\tciphertext_len);\n \t\tdebug_hexdump(stdout, \"ciphertext expected:\",\n-\t\t\ttdata->ciphertext.data, tdata->ciphertext.len >> 3);\n+\t\t\ttdata->ciphertext.data,\n+\t\t\ttdata->ciphertext.len_bits >> 3);\n \n \t\tif (ut_params->obuf)\n \t\t\tdigest = rte_pktmbuf_read(ut_params->obuf,\n-\t\t\t\t(tdata->digest.offset_bytes == 0 ?\n-\t\t\t\tplaintext_pad_len : tdata->digest.offset_bytes),\n-\t\t\t\ttdata->digest.len, digest_buffer);\n+\t\t\t\t\t(tdata->digest_enc.offset == 0 ?\n+\t\t\t\t\t\tplaintext_pad_len :\n+\t\t\t\t\t\ttdata->digest_enc.offset),\n+\t\t\t\t\ttdata->digest_enc.len, digest_buffer);\n \t\telse\n \t\t\tdigest = rte_pktmbuf_read(ut_params->ibuf,\n-\t\t\t\t(tdata->digest.offset_bytes == 0 ?\n-\t\t\t\tplaintext_pad_len : tdata->digest.offset_bytes),\n-\t\t\t\ttdata->digest.len, digest_buffer);\n+\t\t\t\t\t(tdata->digest_enc.offset == 0 ?\n+\t\t\t\t\t\tplaintext_pad_len :\n+\t\t\t\t\t\ttdata->digest_enc.offset),\n+\t\t\t\t\ttdata->digest_enc.len, digest_buffer);\n \n \t\tdebug_hexdump(stdout, \"digest:\", digest,\n-\t\t\ttdata->digest.len);\n+\t\t\t\ttdata->digest_enc.len);\n \t\tdebug_hexdump(stdout, \"digest expected:\",\n-\t\t\ttdata->digest.data, tdata->digest.len);\n+\t\t\t\ttdata->digest_enc.data, tdata->digest_enc.len);\n \t}\n \n \t/* Validate obuf */\n \tif (verify) {\n \t\tTEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(\n-\t\t\tplaintext,\n-\t\t\ttdata->plaintext.data,\n-\t\t\ttdata->plaintext.len >> 3,\n-\t\t\t\"ZUC Plaintext data not as expected\");\n+\t\t\t\tplaintext,\n+\t\t\t\ttdata->plaintext.data,\n+\t\t\t\ttdata->plaintext.len_bits >> 3,\n+\t\t\t\t\"Plaintext data not as expected\");\n \t} else {\n \t\tTEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(\n-\t\t\tciphertext,\n-\t\t\ttdata->ciphertext.data,\n-\t\t\ttdata->validDataLenInBits.len,\n-\t\t\t\"ZUC Ciphertext data not as expected\");\n-\n+\t\t\t\tciphertext,\n+\t\t\t\ttdata->ciphertext.data,\n+\t\t\t\ttdata->validDataLen.len_bits,\n+\t\t\t\t\"Ciphertext data not as expected\");\n \t\tTEST_ASSERT_BUFFERS_ARE_EQUAL(\n-\t\t\tdigest,\n-\t\t\ttdata->digest.data,\n-\t\t\tDIGEST_BYTE_LENGTH_KASUMI_F9,\n-\t\t\t\"ZUC Generated auth tag not as expected\");\n+\t\t\t\tdigest,\n+\t\t\t\ttdata->digest_enc.data,\n+\t\t\t\ttdata->digest_enc.len,\n+\t\t\t\t\"Generated auth tag not as expected\");\n \t}\n+\n+\tTEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,\n+\t\t\t\"crypto op processing failed\");\n+\n \treturn 0;\n }\n \n+/** AUTH AES CMAC + CIPHER AES CTR */\n+\n static int\n-test_kasumi_encryption_test_case_1(void)\n+test_aes_cmac_aes_ctr_digest_enc_test_case_1(void)\n {\n-\treturn test_kasumi_encryption(&kasumi_test_case_1);\n+\treturn test_mixed_auth_cipher(\n+\t\t&auth_aes_cmac_cipher_aes_ctr_test_case_1, IN_PLACE, 0);\n }\n \n static int\n-test_kasumi_encryption_test_case_1_sgl(void)\n+test_aes_cmac_aes_ctr_digest_enc_test_case_1_oop(void)\n {\n-\treturn test_kasumi_encryption_sgl(&kasumi_test_case_1);\n+\treturn test_mixed_auth_cipher(\n+\t\t&auth_aes_cmac_cipher_aes_ctr_test_case_1, OUT_OF_PLACE, 0);\n }\n \n static int\n-test_kasumi_encryption_test_case_1_oop(void)\n+test_aes_cmac_aes_ctr_digest_enc_test_case_1_sgl(void)\n {\n-\treturn test_kasumi_encryption_oop(&kasumi_test_case_1);\n+\treturn test_mixed_auth_cipher_sgl(\n+\t\t&auth_aes_cmac_cipher_aes_ctr_test_case_1, IN_PLACE, 0);\n }\n \n static int\n-test_kasumi_encryption_test_case_1_oop_sgl(void)\n+test_aes_cmac_aes_ctr_digest_enc_test_case_1_oop_sgl(void)\n {\n-\treturn test_kasumi_encryption_oop_sgl(&kasumi_test_case_1);\n+\treturn test_mixed_auth_cipher_sgl(\n+\t\t&auth_aes_cmac_cipher_aes_ctr_test_case_1, OUT_OF_PLACE, 0);\n }\n \n static int\n-test_kasumi_encryption_test_case_2(void)\n+test_verify_aes_cmac_aes_ctr_digest_enc_test_case_1(void)\n {\n-\treturn test_kasumi_encryption(&kasumi_test_case_2);\n+\treturn test_mixed_auth_cipher(\n+\t\t&auth_aes_cmac_cipher_aes_ctr_test_case_1, IN_PLACE, 1);\n }\n \n static int\n-test_kasumi_encryption_test_case_3(void)\n+test_verify_aes_cmac_aes_ctr_digest_enc_test_case_1_oop(void)\n {\n-\treturn test_kasumi_encryption(&kasumi_test_case_3);\n+\treturn test_mixed_auth_cipher(\n+\t\t&auth_aes_cmac_cipher_aes_ctr_test_case_1, OUT_OF_PLACE, 1);\n }\n \n static int\n-test_kasumi_encryption_test_case_4(void)\n+test_verify_aes_cmac_aes_ctr_digest_enc_test_case_1_sgl(void)\n {\n-\treturn test_kasumi_encryption(&kasumi_test_case_4);\n+\treturn test_mixed_auth_cipher_sgl(\n+\t\t&auth_aes_cmac_cipher_aes_ctr_test_case_1, IN_PLACE, 1);\n }\n \n static int\n-test_kasumi_encryption_test_case_5(void)\n+test_verify_aes_cmac_aes_ctr_digest_enc_test_case_1_oop_sgl(void)\n {\n-\treturn test_kasumi_encryption(&kasumi_test_case_5);\n+\treturn test_mixed_auth_cipher_sgl(\n+\t\t&auth_aes_cmac_cipher_aes_ctr_test_case_1, OUT_OF_PLACE, 1);\n }\n \n+/** MIXED AUTH + CIPHER */\n+\n static int\n-test_kasumi_decryption_test_case_1(void)\n+test_auth_zuc_cipher_snow_test_case_1(void)\n {\n-\treturn test_kasumi_decryption(&kasumi_test_case_1);\n+\treturn test_mixed_auth_cipher(\n+\t\t&auth_zuc_cipher_snow_test_case_1, OUT_OF_PLACE, 0);\n }\n \n static int\n-test_kasumi_decryption_test_case_1_oop(void)\n+test_verify_auth_zuc_cipher_snow_test_case_1(void)\n {\n-\treturn test_kasumi_decryption_oop(&kasumi_test_case_1);\n+\treturn test_mixed_auth_cipher(\n+\t\t&auth_zuc_cipher_snow_test_case_1, OUT_OF_PLACE, 1);\n }\n \n static int\n-test_kasumi_decryption_test_case_2(void)\n+test_auth_aes_cmac_cipher_snow_test_case_1(void)\n {\n-\treturn test_kasumi_decryption(&kasumi_test_case_2);\n+\treturn test_mixed_auth_cipher(\n+\t\t&auth_aes_cmac_cipher_snow_test_case_1, OUT_OF_PLACE, 0);\n }\n \n static int\n-test_kasumi_decryption_test_case_3(void)\n+test_verify_auth_aes_cmac_cipher_snow_test_case_1(void)\n {\n-\treturn test_kasumi_decryption(&kasumi_test_case_3);\n+\treturn test_mixed_auth_cipher(\n+\t\t&auth_aes_cmac_cipher_snow_test_case_1, OUT_OF_PLACE, 1);\n }\n \n static int\n-test_kasumi_decryption_test_case_4(void)\n+test_auth_zuc_cipher_aes_ctr_test_case_1(void)\n {\n-\treturn test_kasumi_decryption(&kasumi_test_case_4);\n+\treturn test_mixed_auth_cipher(\n+\t\t&auth_zuc_cipher_aes_ctr_test_case_1, OUT_OF_PLACE, 0);\n }\n \n static int\n-test_kasumi_decryption_test_case_5(void)\n+test_verify_auth_zuc_cipher_aes_ctr_test_case_1(void)\n {\n-\treturn test_kasumi_decryption(&kasumi_test_case_5);\n+\treturn test_mixed_auth_cipher(\n+\t\t&auth_zuc_cipher_aes_ctr_test_case_1, OUT_OF_PLACE, 1);\n }\n+\n static int\n-test_snow3g_encryption_test_case_1(void)\n+test_auth_snow_cipher_aes_ctr_test_case_1(void)\n {\n-\treturn test_snow3g_encryption(&snow3g_test_case_1);\n+\treturn test_mixed_auth_cipher(\n+\t\t&auth_snow_cipher_aes_ctr_test_case_1, OUT_OF_PLACE, 0);\n }\n \n static int\n-test_snow3g_encryption_test_case_1_oop(void)\n+test_verify_auth_snow_cipher_aes_ctr_test_case_1(void)\n {\n-\treturn test_snow3g_encryption_oop(&snow3g_test_case_1);\n+\treturn test_mixed_auth_cipher(\n+\t\t&auth_snow_cipher_aes_ctr_test_case_1, OUT_OF_PLACE, 1);\n }\n \n static int\n-test_snow3g_encryption_test_case_1_oop_sgl(void)\n+test_auth_snow_cipher_zuc_test_case_1(void)\n {\n-\treturn test_snow3g_encryption_oop_sgl(&snow3g_test_case_1);\n+\treturn test_mixed_auth_cipher(\n+\t\t&auth_snow_cipher_zuc_test_case_1, OUT_OF_PLACE, 0);\n }\n \n-\n static int\n-test_snow3g_encryption_test_case_1_offset_oop(void)\n+test_verify_auth_snow_cipher_zuc_test_case_1(void)\n {\n-\treturn test_snow3g_encryption_offset_oop(&snow3g_test_case_1);\n+\treturn test_mixed_auth_cipher(\n+\t\t&auth_snow_cipher_zuc_test_case_1, OUT_OF_PLACE, 1);\n }\n \n static int\n-test_snow3g_encryption_test_case_2(void)\n+test_auth_aes_cmac_cipher_zuc_test_case_1(void)\n {\n-\treturn test_snow3g_encryption(&snow3g_test_case_2);\n+\treturn test_mixed_auth_cipher(\n+\t\t&auth_aes_cmac_cipher_zuc_test_case_1, OUT_OF_PLACE, 0);\n }\n \n static int\n-test_snow3g_encryption_test_case_3(void)\n+test_verify_auth_aes_cmac_cipher_zuc_test_case_1(void)\n {\n-\treturn test_snow3g_encryption(&snow3g_test_case_3);\n+\treturn test_mixed_auth_cipher(\n+\t\t&auth_aes_cmac_cipher_zuc_test_case_1, OUT_OF_PLACE, 1);\n }\n \n static int\n-test_snow3g_encryption_test_case_4(void)\n+test_auth_null_cipher_snow_test_case_1(void)\n {\n-\treturn test_snow3g_encryption(&snow3g_test_case_4);\n+\treturn test_mixed_auth_cipher(\n+\t\t&auth_null_cipher_snow_test_case_1, OUT_OF_PLACE, 0);\n }\n \n static int\n-test_snow3g_encryption_test_case_5(void)\n+test_verify_auth_null_cipher_snow_test_case_1(void)\n {\n-\treturn test_snow3g_encryption(&snow3g_test_case_5);\n+\treturn test_mixed_auth_cipher(\n+\t\t&auth_null_cipher_snow_test_case_1, OUT_OF_PLACE, 1);\n }\n \n static int\n-test_snow3g_decryption_test_case_1(void)\n+test_auth_null_cipher_zuc_test_case_1(void)\n {\n-\treturn test_snow3g_decryption(&snow3g_test_case_1);\n+\treturn test_mixed_auth_cipher(\n+\t\t&auth_null_cipher_zuc_test_case_1, OUT_OF_PLACE, 0);\n }\n \n static int\n-test_snow3g_decryption_test_case_1_oop(void)\n+test_verify_auth_null_cipher_zuc_test_case_1(void)\n {\n-\treturn test_snow3g_decryption_oop(&snow3g_test_case_1);\n+\treturn test_mixed_auth_cipher(\n+\t\t&auth_null_cipher_zuc_test_case_1, OUT_OF_PLACE, 1);\n }\n \n static int\n-test_snow3g_decryption_test_case_2(void)\n+test_auth_snow_cipher_null_test_case_1(void)\n {\n-\treturn test_snow3g_decryption(&snow3g_test_case_2);\n+\treturn test_mixed_auth_cipher(\n+\t\t&auth_snow_cipher_null_test_case_1, OUT_OF_PLACE, 0);\n }\n \n static int\n-test_snow3g_decryption_test_case_3(void)\n+test_verify_auth_snow_cipher_null_test_case_1(void)\n {\n-\treturn test_snow3g_decryption(&snow3g_test_case_3);\n+\treturn test_mixed_auth_cipher(\n+\t\t&auth_snow_cipher_null_test_case_1, OUT_OF_PLACE, 1);\n }\n \n static int\n-test_snow3g_decryption_test_case_4(void)\n+test_auth_zuc_cipher_null_test_case_1(void)\n {\n-\treturn test_snow3g_decryption(&snow3g_test_case_4);\n+\treturn test_mixed_auth_cipher(\n+\t\t&auth_zuc_cipher_null_test_case_1, OUT_OF_PLACE, 0);\n }\n \n static int\n-test_snow3g_decryption_test_case_5(void)\n-{\n-\treturn test_snow3g_decryption(&snow3g_test_case_5);\n-}\n-\n-/*\n- * Function prepares snow3g_hash_test_data from snow3g_test_data.\n- * Pattern digest from snow3g_test_data must be allocated as\n- * 4 last bytes in plaintext.\n- */\n-static void\n-snow3g_hash_test_vector_setup(const struct snow3g_test_data *pattern,\n-\t\tstruct snow3g_hash_test_data *output)\n+test_verify_auth_zuc_cipher_null_test_case_1(void)\n {\n-\tif ((pattern != NULL) && (output != NULL)) {\n-\t\toutput->key.len = pattern->key.len;\n-\n-\t\tmemcpy(output->key.data,\n-\t\tpattern->key.data, pattern->key.len);\n-\n-\t\toutput->auth_iv.len = pattern->auth_iv.len;\n-\n-\t\tmemcpy(output->auth_iv.data,\n-\t\tpattern->auth_iv.data, pattern->auth_iv.len);\n-\n-\t\toutput->plaintext.len = pattern->plaintext.len;\n-\n-\t\tmemcpy(output->plaintext.data,\n-\t\tpattern->plaintext.data, pattern->plaintext.len >> 3);\n-\n-\t\toutput->digest.len = pattern->digest.len;\n-\n-\t\tmemcpy(output->digest.data,\n-\t\t&pattern->plaintext.data[pattern->digest.offset_bytes],\n-\t\tpattern->digest.len);\n-\n-\t\toutput->validAuthLenInBits.len =\n-\t\tpattern->validAuthLenInBits.len;\n-\t}\n+\treturn test_mixed_auth_cipher(\n+\t\t&auth_zuc_cipher_null_test_case_1, OUT_OF_PLACE, 1);\n }\n \n-/*\n- * Test case verify computed cipher and digest from snow3g_test_case_7 data.\n- */\n static int\n-test_snow3g_decryption_with_digest_test_case_1(void)\n+test_auth_null_cipher_aes_ctr_test_case_1(void)\n {\n-\tstruct snow3g_hash_test_data snow3g_hash_data;\n-\n-\t/*\n-\t * Function prepare data for hash veryfication test case.\n-\t * Digest is allocated in 4 last bytes in plaintext, pattern.\n-\t */\n-\tsnow3g_hash_test_vector_setup(&snow3g_test_case_7, &snow3g_hash_data);\n-\n-\treturn test_snow3g_decryption(&snow3g_test_case_7) &\n-\t\t\ttest_snow3g_authentication_verify(&snow3g_hash_data);\n+\treturn test_mixed_auth_cipher(\n+\t\t&auth_null_cipher_aes_ctr_test_case_1, OUT_OF_PLACE, 0);\n }\n \n static int\n-test_snow3g_cipher_auth_test_case_1(void)\n+test_verify_auth_null_cipher_aes_ctr_test_case_1(void)\n {\n-\treturn test_snow3g_cipher_auth(&snow3g_test_case_3);\n+\treturn test_mixed_auth_cipher(\n+\t\t&auth_null_cipher_aes_ctr_test_case_1, OUT_OF_PLACE, 1);\n }\n \n static int\n-test_snow3g_auth_cipher_test_case_1(void)\n+test_auth_aes_cmac_cipher_null_test_case_1(void)\n {\n-\treturn test_snow3g_auth_cipher(\n-\t\t&snow3g_auth_cipher_test_case_1, IN_PLACE, 0);\n+\treturn test_mixed_auth_cipher(\n+\t\t&auth_aes_cmac_cipher_null_test_case_1, OUT_OF_PLACE, 0);\n }\n \n static int\n-test_snow3g_auth_cipher_test_case_2(void)\n+test_verify_auth_aes_cmac_cipher_null_test_case_1(void)\n {\n-\treturn test_snow3g_auth_cipher(\n-\t\t&snow3g_auth_cipher_test_case_2, IN_PLACE, 0);\n+\treturn test_mixed_auth_cipher(\n+\t\t&auth_aes_cmac_cipher_null_test_case_1, OUT_OF_PLACE, 1);\n }\n \n-static int\n-test_snow3g_auth_cipher_test_case_2_oop(void)\n-{\n-\treturn test_snow3g_auth_cipher(\n-\t\t&snow3g_auth_cipher_test_case_2, OUT_OF_PLACE, 0);\n-}\n+/* ***** AEAD algorithm Tests ***** */\n \n static int\n-test_snow3g_auth_cipher_part_digest_enc(void)\n+create_aead_session(uint8_t dev_id, enum rte_crypto_aead_algorithm algo,\n+\t\tenum rte_crypto_aead_operation op,\n+\t\tconst uint8_t *key, const uint8_t key_len,\n+\t\tconst uint16_t aad_len, const uint8_t auth_len,\n+\t\tuint8_t iv_len)\n {\n-\treturn test_snow3g_auth_cipher(\n-\t\t&snow3g_auth_cipher_partial_digest_encryption,\n-\t\t\tIN_PLACE, 0);\n-}\n+\tuint8_t aead_key[key_len];\n \n-static int\n-test_snow3g_auth_cipher_part_digest_enc_oop(void)\n-{\n-\treturn test_snow3g_auth_cipher(\n-\t\t&snow3g_auth_cipher_partial_digest_encryption,\n-\t\t\tOUT_OF_PLACE, 0);\n-}\n+\tstruct crypto_testsuite_params *ts_params = &testsuite_params;\n+\tstruct crypto_unittest_params *ut_params = &unittest_params;\n \n-static int\n-test_snow3g_auth_cipher_test_case_3_sgl(void)\n-{\n-\treturn test_snow3g_auth_cipher_sgl(\n-\t\t&snow3g_auth_cipher_test_case_3, IN_PLACE, 0);\n-}\n+\tmemcpy(aead_key, key, key_len);\n \n-static int\n-test_snow3g_auth_cipher_test_case_3_oop_sgl(void)\n-{\n-\treturn test_snow3g_auth_cipher_sgl(\n-\t\t&snow3g_auth_cipher_test_case_3, OUT_OF_PLACE, 0);\n-}\n+\t/* Setup AEAD Parameters */\n+\tut_params->aead_xform.type = RTE_CRYPTO_SYM_XFORM_AEAD;\n+\tut_params->aead_xform.next = NULL;\n+\tut_params->aead_xform.aead.algo = algo;\n+\tut_params->aead_xform.aead.op = op;\n+\tut_params->aead_xform.aead.key.data = aead_key;\n+\tut_params->aead_xform.aead.key.length = key_len;\n+\tut_params->aead_xform.aead.iv.offset = IV_OFFSET;\n+\tut_params->aead_xform.aead.iv.length = iv_len;\n+\tut_params->aead_xform.aead.digest_length = auth_len;\n+\tut_params->aead_xform.aead.aad_length = aad_len;\n \n-static int\n-test_snow3g_auth_cipher_part_digest_enc_sgl(void)\n-{\n-\treturn test_snow3g_auth_cipher_sgl(\n-\t\t&snow3g_auth_cipher_partial_digest_encryption,\n-\t\t\tIN_PLACE, 0);\n-}\n+\tdebug_hexdump(stdout, \"key:\", key, key_len);\n \n-static int\n-test_snow3g_auth_cipher_part_digest_enc_oop_sgl(void)\n-{\n-\treturn test_snow3g_auth_cipher_sgl(\n-\t\t&snow3g_auth_cipher_partial_digest_encryption,\n-\t\t\tOUT_OF_PLACE, 0);\n-}\n+\t/* Create Crypto session*/\n+\tut_params->sess = rte_cryptodev_sym_session_create(\n+\t\t\tts_params->session_mpool);\n \n-static int\n-test_snow3g_auth_cipher_verify_test_case_1(void)\n-{\n-\treturn test_snow3g_auth_cipher(\n-\t\t&snow3g_auth_cipher_test_case_1, IN_PLACE, 1);\n-}\n+\trte_cryptodev_sym_session_init(dev_id, ut_params->sess,\n+\t\t\t&ut_params->aead_xform,\n+\t\t\tts_params->session_priv_mpool);\n \n-static int\n-test_snow3g_auth_cipher_verify_test_case_2(void)\n-{\n-\treturn test_snow3g_auth_cipher(\n-\t\t&snow3g_auth_cipher_test_case_2, IN_PLACE, 1);\n-}\n+\tTEST_ASSERT_NOT_NULL(ut_params->sess, \"Session creation failed\");\n \n-static int\n-test_snow3g_auth_cipher_verify_test_case_2_oop(void)\n-{\n-\treturn test_snow3g_auth_cipher(\n-\t\t&snow3g_auth_cipher_test_case_2, OUT_OF_PLACE, 1);\n+\treturn 0;\n }\n \n static int\n-test_snow3g_auth_cipher_verify_part_digest_enc(void)\n+create_aead_xform(struct rte_crypto_op *op,\n+\t\tenum rte_crypto_aead_algorithm algo,\n+\t\tenum rte_crypto_aead_operation aead_op,\n+\t\tuint8_t *key, const uint8_t key_len,\n+\t\tconst uint8_t aad_len, const uint8_t auth_len,\n+\t\tuint8_t iv_len)\n {\n-\treturn test_snow3g_auth_cipher(\n-\t\t&snow3g_auth_cipher_partial_digest_encryption,\n-\t\t\tIN_PLACE, 1);\n-}\n+\tTEST_ASSERT_NOT_NULL(rte_crypto_op_sym_xforms_alloc(op, 1),\n+\t\t\t\"failed to allocate space for crypto transform\");\n \n-static int\n-test_snow3g_auth_cipher_verify_part_digest_enc_oop(void)\n-{\n-\treturn test_snow3g_auth_cipher(\n-\t\t&snow3g_auth_cipher_partial_digest_encryption,\n-\t\t\tOUT_OF_PLACE, 1);\n-}\n+\tstruct rte_crypto_sym_op *sym_op = op->sym;\n \n-static int\n-test_snow3g_auth_cipher_verify_test_case_3_sgl(void)\n-{\n-\treturn test_snow3g_auth_cipher_sgl(\n-\t\t&snow3g_auth_cipher_test_case_3, IN_PLACE, 1);\n-}\n+\t/* Setup AEAD Parameters */\n+\tsym_op->xform->type = RTE_CRYPTO_SYM_XFORM_AEAD;\n+\tsym_op->xform->next = NULL;\n+\tsym_op->xform->aead.algo = algo;\n+\tsym_op->xform->aead.op = aead_op;\n+\tsym_op->xform->aead.key.data = key;\n+\tsym_op->xform->aead.key.length = key_len;\n+\tsym_op->xform->aead.iv.offset = IV_OFFSET;\n+\tsym_op->xform->aead.iv.length = iv_len;\n+\tsym_op->xform->aead.digest_length = auth_len;\n+\tsym_op->xform->aead.aad_length = aad_len;\n \n-static int\n-test_snow3g_auth_cipher_verify_test_case_3_oop_sgl(void)\n-{\n-\treturn test_snow3g_auth_cipher_sgl(\n-\t\t&snow3g_auth_cipher_test_case_3, OUT_OF_PLACE, 1);\n-}\n+\tdebug_hexdump(stdout, \"key:\", key, key_len);\n \n-static int\n-test_snow3g_auth_cipher_verify_part_digest_enc_sgl(void)\n-{\n-\treturn test_snow3g_auth_cipher_sgl(\n-\t\t&snow3g_auth_cipher_partial_digest_encryption,\n-\t\t\tIN_PLACE, 1);\n+\treturn 0;\n }\n \n static int\n-test_snow3g_auth_cipher_verify_part_digest_enc_oop_sgl(void)\n+create_aead_operation(enum rte_crypto_aead_operation op,\n+\t\tconst struct aead_test_data *tdata)\n {\n-\treturn test_snow3g_auth_cipher_sgl(\n-\t\t&snow3g_auth_cipher_partial_digest_encryption,\n-\t\t\tOUT_OF_PLACE, 1);\n-}\n+\tstruct crypto_testsuite_params *ts_params = &testsuite_params;\n+\tstruct crypto_unittest_params *ut_params = &unittest_params;\n \n-static int\n-test_snow3g_auth_cipher_with_digest_test_case_1(void)\n-{\n-\treturn test_snow3g_auth_cipher(\n-\t\t&snow3g_test_case_7, IN_PLACE, 0);\n-}\n+\tuint8_t *plaintext, *ciphertext;\n+\tunsigned int aad_pad_len, plaintext_pad_len;\n \n-static int\n-test_kasumi_auth_cipher_test_case_1(void)\n-{\n-\treturn test_kasumi_auth_cipher(\n-\t\t&kasumi_test_case_3, IN_PLACE, 0);\n-}\n+\t/* Generate Crypto op data structure */\n+\tut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,\n+\t\t\tRTE_CRYPTO_OP_TYPE_SYMMETRIC);\n+\tTEST_ASSERT_NOT_NULL(ut_params->op,\n+\t\t\t\"Failed to allocate symmetric crypto operation struct\");\n \n-static int\n-test_kasumi_auth_cipher_test_case_2(void)\n-{\n-\treturn test_kasumi_auth_cipher(\n-\t\t&kasumi_auth_cipher_test_case_2, IN_PLACE, 0);\n-}\n+\tstruct rte_crypto_sym_op *sym_op = ut_params->op->sym;\n \n-static int\n-test_kasumi_auth_cipher_test_case_2_oop(void)\n-{\n-\treturn test_kasumi_auth_cipher(\n-\t\t&kasumi_auth_cipher_test_case_2, OUT_OF_PLACE, 0);\n-}\n+\t/* Append aad data */\n+\tif (tdata->algo == RTE_CRYPTO_AEAD_AES_CCM) {\n+\t\taad_pad_len = RTE_ALIGN_CEIL(tdata->aad.len + 18, 16);\n+\t\tsym_op->aead.aad.data = (uint8_t *)rte_pktmbuf_append(\n+\t\t\t\tut_params->ibuf, aad_pad_len);\n+\t\tTEST_ASSERT_NOT_NULL(sym_op->aead.aad.data,\n+\t\t\t\t\"no room to append aad\");\n \n-static int\n-test_kasumi_auth_cipher_test_case_2_sgl(void)\n-{\n-\treturn test_kasumi_auth_cipher_sgl(\n-\t\t&kasumi_auth_cipher_test_case_2, IN_PLACE, 0);\n-}\n+\t\tsym_op->aead.aad.phys_addr =\n+\t\t\t\trte_pktmbuf_iova(ut_params->ibuf);\n+\t\t/* Copy AAD 18 bytes after the AAD ptr, according to the API */\n+\t\tmemcpy(sym_op->aead.aad.data + 18, tdata->aad.data,\n+\t\t\ttdata->aad.len);\n+\t\tdebug_hexdump(stdout, \"aad:\", sym_op->aead.aad.data,\n+\t\t\ttdata->aad.len);\n \n-static int\n-test_kasumi_auth_cipher_test_case_2_oop_sgl(void)\n-{\n-\treturn test_kasumi_auth_cipher_sgl(\n-\t\t&kasumi_auth_cipher_test_case_2, OUT_OF_PLACE, 0);\n-}\n+\t\t/* Append IV at the end of the crypto operation*/\n+\t\tuint8_t *iv_ptr = rte_crypto_op_ctod_offset(ut_params->op,\n+\t\t\t\tuint8_t *, IV_OFFSET);\n \n-static int\n-test_kasumi_auth_cipher_verify_test_case_1(void)\n-{\n-\treturn test_kasumi_auth_cipher(\n-\t\t&kasumi_test_case_3, IN_PLACE, 1);\n-}\n+\t\t/* Copy IV 1 byte after the IV pointer, according to the API */\n+\t\trte_memcpy(iv_ptr + 1, tdata->iv.data, tdata->iv.len);\n+\t\tdebug_hexdump(stdout, \"iv:\", iv_ptr,\n+\t\t\ttdata->iv.len);\n+\t} else {\n+\t\taad_pad_len = RTE_ALIGN_CEIL(tdata->aad.len, 16);\n+\t\tsym_op->aead.aad.data = (uint8_t *)rte_pktmbuf_append(\n+\t\t\t\tut_params->ibuf, aad_pad_len);\n+\t\tTEST_ASSERT_NOT_NULL(sym_op->aead.aad.data,\n+\t\t\t\t\"no room to append aad\");\n \n-static int\n-test_kasumi_auth_cipher_verify_test_case_2(void)\n-{\n-\treturn test_kasumi_auth_cipher(\n-\t\t&kasumi_auth_cipher_test_case_2, IN_PLACE, 1);\n-}\n+\t\tsym_op->aead.aad.phys_addr =\n+\t\t\t\trte_pktmbuf_iova(ut_params->ibuf);\n+\t\tmemcpy(sym_op->aead.aad.data, tdata->aad.data, tdata->aad.len);\n+\t\tdebug_hexdump(stdout, \"aad:\", sym_op->aead.aad.data,\n+\t\t\ttdata->aad.len);\n \n-static int\n-test_kasumi_auth_cipher_verify_test_case_2_oop(void)\n-{\n-\treturn test_kasumi_auth_cipher(\n-\t\t&kasumi_auth_cipher_test_case_2, OUT_OF_PLACE, 1);\n-}\n+\t\t/* Append IV at the end of the crypto operation*/\n+\t\tuint8_t *iv_ptr = rte_crypto_op_ctod_offset(ut_params->op,\n+\t\t\t\tuint8_t *, IV_OFFSET);\n \n-static int\n-test_kasumi_auth_cipher_verify_test_case_2_sgl(void)\n-{\n-\treturn test_kasumi_auth_cipher_sgl(\n-\t\t&kasumi_auth_cipher_test_case_2, IN_PLACE, 1);\n-}\n+\t\trte_memcpy(iv_ptr, tdata->iv.data, tdata->iv.len);\n+\t\tdebug_hexdump(stdout, \"iv:\", iv_ptr,\n+\t\t\ttdata->iv.len);\n+\t}\n \n-static int\n-test_kasumi_auth_cipher_verify_test_case_2_oop_sgl(void)\n-{\n-\treturn test_kasumi_auth_cipher_sgl(\n-\t\t&kasumi_auth_cipher_test_case_2, OUT_OF_PLACE, 1);\n-}\n+\t/* Append plaintext/ciphertext */\n+\tif (op == RTE_CRYPTO_AEAD_OP_ENCRYPT) {\n+\t\tplaintext_pad_len = RTE_ALIGN_CEIL(tdata->plaintext.len, 16);\n+\t\tplaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,\n+\t\t\t\tplaintext_pad_len);\n+\t\tTEST_ASSERT_NOT_NULL(plaintext, \"no room to append plaintext\");\n \n-static int\n-test_kasumi_cipher_auth_test_case_1(void)\n-{\n-\treturn test_kasumi_cipher_auth(&kasumi_test_case_6);\n-}\n+\t\tmemcpy(plaintext, tdata->plaintext.data, tdata->plaintext.len);\n+\t\tdebug_hexdump(stdout, \"plaintext:\", plaintext,\n+\t\t\t\ttdata->plaintext.len);\n \n-static int\n-test_zuc_encryption_test_case_1(void)\n-{\n-\treturn test_zuc_encryption(&zuc_test_case_cipher_193b);\n-}\n+\t\tif (ut_params->obuf) {\n+\t\t\tciphertext = (uint8_t *)rte_pktmbuf_append(\n+\t\t\t\t\tut_params->obuf,\n+\t\t\t\t\tplaintext_pad_len + aad_pad_len);\n+\t\t\tTEST_ASSERT_NOT_NULL(ciphertext,\n+\t\t\t\t\t\"no room to append ciphertext\");\n \n-static int\n-test_zuc_encryption_test_case_2(void)\n-{\n-\treturn test_zuc_encryption(&zuc_test_case_cipher_800b);\n-}\n+\t\t\tmemset(ciphertext + aad_pad_len, 0,\n+\t\t\t\t\ttdata->ciphertext.len);\n+\t\t}\n+\t} else {\n+\t\tplaintext_pad_len = RTE_ALIGN_CEIL(tdata->ciphertext.len, 16);\n+\t\tciphertext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,\n+\t\t\t\tplaintext_pad_len);\n+\t\tTEST_ASSERT_NOT_NULL(ciphertext,\n+\t\t\t\t\"no room to append ciphertext\");\n \n-static int\n-test_zuc_encryption_test_case_3(void)\n-{\n-\treturn test_zuc_encryption(&zuc_test_case_cipher_1570b);\n-}\n+\t\tmemcpy(ciphertext, tdata->ciphertext.data,\n+\t\t\t\ttdata->ciphertext.len);\n+\t\tdebug_hexdump(stdout, \"ciphertext:\", ciphertext,\n+\t\t\t\ttdata->ciphertext.len);\n \n-static int\n-test_zuc_encryption_test_case_4(void)\n-{\n-\treturn test_zuc_encryption(&zuc_test_case_cipher_2798b);\n-}\n+\t\tif (ut_params->obuf) {\n+\t\t\tplaintext = (uint8_t *)rte_pktmbuf_append(\n+\t\t\t\t\tut_params->obuf,\n+\t\t\t\t\tplaintext_pad_len + aad_pad_len);\n+\t\t\tTEST_ASSERT_NOT_NULL(plaintext,\n+\t\t\t\t\t\"no room to append plaintext\");\n \n-static int\n-test_zuc_encryption_test_case_5(void)\n-{\n-\treturn test_zuc_encryption(&zuc_test_case_cipher_4019b);\n-}\n+\t\t\tmemset(plaintext + aad_pad_len, 0,\n+\t\t\t\t\ttdata->plaintext.len);\n+\t\t}\n+\t}\n \n-static int\n-test_zuc_encryption_test_case_6_sgl(void)\n-{\n-\treturn test_zuc_encryption_sgl(&zuc_test_case_cipher_193b);\n-}\n+\t/* Append digest data */\n+\tif (op == RTE_CRYPTO_AEAD_OP_ENCRYPT) {\n+\t\tsym_op->aead.digest.data = (uint8_t *)rte_pktmbuf_append(\n+\t\t\t\tut_params->obuf ? ut_params->obuf :\n+\t\t\t\t\t\tut_params->ibuf,\n+\t\t\t\t\t\ttdata->auth_tag.len);\n+\t\tTEST_ASSERT_NOT_NULL(sym_op->aead.digest.data,\n+\t\t\t\t\"no room to append digest\");\n+\t\tmemset(sym_op->aead.digest.data, 0, tdata->auth_tag.len);\n+\t\tsym_op->aead.digest.phys_addr = rte_pktmbuf_iova_offset(\n+\t\t\t\tut_params->obuf ? ut_params->obuf :\n+\t\t\t\t\t\tut_params->ibuf,\n+\t\t\t\t\t\tplaintext_pad_len +\n+\t\t\t\t\t\taad_pad_len);\n+\t} else {\n+\t\tsym_op->aead.digest.data = (uint8_t *)rte_pktmbuf_append(\n+\t\t\t\tut_params->ibuf, tdata->auth_tag.len);\n+\t\tTEST_ASSERT_NOT_NULL(sym_op->aead.digest.data,\n+\t\t\t\t\"no room to append digest\");\n+\t\tsym_op->aead.digest.phys_addr = rte_pktmbuf_iova_offset(\n+\t\t\t\tut_params->ibuf,\n+\t\t\t\tplaintext_pad_len + aad_pad_len);\n \n-static int\n-test_zuc_hash_generate_test_case_1(void)\n-{\n-\treturn test_zuc_authentication(&zuc_test_case_auth_1b);\n-}\n+\t\trte_memcpy(sym_op->aead.digest.data, tdata->auth_tag.data,\n+\t\t\ttdata->auth_tag.len);\n+\t\tdebug_hexdump(stdout, \"digest:\",\n+\t\t\tsym_op->aead.digest.data,\n+\t\t\ttdata->auth_tag.len);\n+\t}\n \n-static int\n-test_zuc_hash_generate_test_case_2(void)\n-{\n-\treturn test_zuc_authentication(&zuc_test_case_auth_90b);\n-}\n+\tsym_op->aead.data.length = tdata->plaintext.len;\n+\tsym_op->aead.data.offset = aad_pad_len;\n \n-static int\n-test_zuc_hash_generate_test_case_3(void)\n-{\n-\treturn test_zuc_authentication(&zuc_test_case_auth_577b);\n+\treturn 0;\n }\n \n static int\n-test_zuc_hash_generate_test_case_4(void)\n+test_authenticated_encryption(const struct aead_test_data *tdata)\n {\n-\treturn test_zuc_authentication(&zuc_test_case_auth_2079b);\n-}\n+\tstruct crypto_testsuite_params *ts_params = &testsuite_params;\n+\tstruct crypto_unittest_params *ut_params = &unittest_params;\n \n-static int\n-test_zuc_hash_generate_test_case_5(void)\n-{\n-\treturn test_zuc_authentication(&zuc_test_auth_5670b);\n-}\n+\tint retval;\n+\tuint8_t *ciphertext, *auth_tag;\n+\tuint16_t plaintext_pad_len;\n+\tuint32_t i;\n \n-static int\n-test_zuc_hash_generate_test_case_6(void)\n-{\n-\treturn test_zuc_authentication(&zuc_test_case_auth_128b);\n-}\n+\t/* Verify the capabilities */\n+\tstruct rte_cryptodev_sym_capability_idx cap_idx;\n+\tconst struct rte_cryptodev_symmetric_capability *capability;\n+\tcap_idx.type = RTE_CRYPTO_SYM_XFORM_AEAD;\n+\tcap_idx.algo.aead = tdata->algo;\n+\tcapability = rte_cryptodev_sym_capability_get(\n+\t\t\tts_params->valid_devs[0], &cap_idx);\n+\tif (capability == NULL)\n+\t\treturn -ENOTSUP;\n+\tif (rte_cryptodev_sym_capability_check_aead(\n+\t\t\tcapability, tdata->key.len, tdata->auth_tag.len,\n+\t\t\ttdata->aad.len, tdata->iv.len))\n+\t\treturn -ENOTSUP;\n \n-static int\n-test_zuc_hash_generate_test_case_7(void)\n-{\n-\treturn test_zuc_authentication(&zuc_test_case_auth_2080b);\n-}\n-\n-static int\n-test_zuc_hash_generate_test_case_8(void)\n-{\n-\treturn test_zuc_authentication(&zuc_test_case_auth_584b);\n-}\n-\n-static int\n-test_zuc_cipher_auth_test_case_1(void)\n-{\n-\treturn test_zuc_cipher_auth(&zuc_test_case_cipher_200b_auth_200b);\n-}\n-\n-static int\n-test_zuc_cipher_auth_test_case_2(void)\n-{\n-\treturn test_zuc_cipher_auth(&zuc_test_case_cipher_800b_auth_120b);\n-}\n+\t/* Create AEAD session */\n+\tretval = create_aead_session(ts_params->valid_devs[0],\n+\t\t\ttdata->algo,\n+\t\t\tRTE_CRYPTO_AEAD_OP_ENCRYPT,\n+\t\t\ttdata->key.data, tdata->key.len,\n+\t\t\ttdata->aad.len, tdata->auth_tag.len,\n+\t\t\ttdata->iv.len);\n+\tif (retval < 0)\n+\t\treturn retval;\n \n-static int\n-test_zuc_auth_cipher_test_case_1(void)\n-{\n-\treturn test_zuc_auth_cipher(\n-\t\t&zuc_auth_cipher_test_case_1, IN_PLACE, 0);\n-}\n+\tif (tdata->aad.len > MBUF_SIZE) {\n+\t\tut_params->ibuf = rte_pktmbuf_alloc(ts_params->large_mbuf_pool);\n+\t\t/* Populate full size of add data */\n+\t\tfor (i = 32; i < MAX_AAD_LENGTH; i += 32)\n+\t\t\tmemcpy(&tdata->aad.data[i], &tdata->aad.data[0], 32);\n+\t} else\n+\t\tut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);\n \n-static int\n-test_zuc_auth_cipher_test_case_1_oop(void)\n-{\n-\treturn test_zuc_auth_cipher(\n-\t\t&zuc_auth_cipher_test_case_1, OUT_OF_PLACE, 0);\n-}\n+\t/* clear mbuf payload */\n+\tmemset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,\n+\t\t\trte_pktmbuf_tailroom(ut_params->ibuf));\n \n-static int\n-test_zuc_auth_cipher_test_case_1_sgl(void)\n-{\n-\treturn test_zuc_auth_cipher_sgl(\n-\t\t&zuc_auth_cipher_test_case_1, IN_PLACE, 0);\n-}\n+\t/* Create AEAD operation */\n+\tretval = create_aead_operation(RTE_CRYPTO_AEAD_OP_ENCRYPT, tdata);\n+\tif (retval < 0)\n+\t\treturn retval;\n \n-static int\n-test_zuc_auth_cipher_test_case_1_oop_sgl(void)\n-{\n-\treturn test_zuc_auth_cipher_sgl(\n-\t\t&zuc_auth_cipher_test_case_1, OUT_OF_PLACE, 0);\n-}\n+\trte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);\n \n-static int\n-test_zuc_auth_cipher_verify_test_case_1(void)\n-{\n-\treturn test_zuc_auth_cipher(\n-\t\t&zuc_auth_cipher_test_case_1, IN_PLACE, 1);\n-}\n+\tut_params->op->sym->m_src = ut_params->ibuf;\n \n-static int\n-test_zuc_auth_cipher_verify_test_case_1_oop(void)\n-{\n-\treturn test_zuc_auth_cipher(\n-\t\t&zuc_auth_cipher_test_case_1, OUT_OF_PLACE, 1);\n-}\n+\t/* Process crypto operation */\n+\tTEST_ASSERT_NOT_NULL(process_crypto_request(ts_params->valid_devs[0],\n+\t\t\tut_params->op), \"failed to process sym crypto op\");\n \n-static int\n-test_zuc_auth_cipher_verify_test_case_1_sgl(void)\n-{\n-\treturn test_zuc_auth_cipher_sgl(\n-\t\t&zuc_auth_cipher_test_case_1, IN_PLACE, 1);\n-}\n+\tTEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,\n+\t\t\t\"crypto op processing failed\");\n \n-static int\n-test_zuc_auth_cipher_verify_test_case_1_oop_sgl(void)\n-{\n-\treturn test_zuc_auth_cipher_sgl(\n-\t\t&zuc_auth_cipher_test_case_1, OUT_OF_PLACE, 1);\n-}\n+\tplaintext_pad_len = RTE_ALIGN_CEIL(tdata->plaintext.len, 16);\n \n-static int\n-test_mixed_check_if_unsupported(const struct mixed_cipher_auth_test_data *tdata)\n-{\n-\tuint8_t dev_id = testsuite_params.valid_devs[0];\n+\tif (ut_params->op->sym->m_dst) {\n+\t\tciphertext = rte_pktmbuf_mtod(ut_params->op->sym->m_dst,\n+\t\t\t\tuint8_t *);\n+\t\tauth_tag = rte_pktmbuf_mtod_offset(ut_params->op->sym->m_dst,\n+\t\t\t\tuint8_t *, plaintext_pad_len);\n+\t} else {\n+\t\tciphertext = rte_pktmbuf_mtod_offset(ut_params->op->sym->m_src,\n+\t\t\t\tuint8_t *,\n+\t\t\t\tut_params->op->sym->cipher.data.offset);\n+\t\tauth_tag = ciphertext + plaintext_pad_len;\n+\t}\n \n-\tstruct rte_cryptodev_sym_capability_idx cap_idx;\n+\tdebug_hexdump(stdout, \"ciphertext:\", ciphertext, tdata->ciphertext.len);\n+\tdebug_hexdump(stdout, \"auth tag:\", auth_tag, tdata->auth_tag.len);\n \n-\t/* Check if device supports particular cipher algorithm */\n-\tcap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;\n-\tcap_idx.algo.cipher = tdata->cipher_algo;\n-\tif (rte_cryptodev_sym_capability_get(dev_id, &cap_idx) == NULL)\n-\t\treturn -ENOTSUP;\n+\t/* Validate obuf */\n+\tTEST_ASSERT_BUFFERS_ARE_EQUAL(\n+\t\t\tciphertext,\n+\t\t\ttdata->ciphertext.data,\n+\t\t\ttdata->ciphertext.len,\n+\t\t\t\"Ciphertext data not as expected\");\n \n-\t/* Check if device supports particular hash algorithm */\n-\tcap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;\n-\tcap_idx.algo.auth = tdata->auth_algo;\n-\tif (rte_cryptodev_sym_capability_get(dev_id, &cap_idx) == NULL)\n-\t\treturn -ENOTSUP;\n+\tTEST_ASSERT_BUFFERS_ARE_EQUAL(\n+\t\t\tauth_tag,\n+\t\t\ttdata->auth_tag.data,\n+\t\t\ttdata->auth_tag.len,\n+\t\t\t\"Generated auth tag not as expected\");\n \n \treturn 0;\n+\n }\n \n+#ifdef RTE_LIBRTE_SECURITY\n+/* Basic algorithm run function for async inplace mode.\n+ * Creates a session from input parameters and runs one operation\n+ * on input_vec. Checks the output of the crypto operation against\n+ * output_vec.\n+ */\n static int\n-test_mixed_auth_cipher(const struct mixed_cipher_auth_test_data *tdata,\n-\tuint8_t op_mode, uint8_t verify)\n+test_pdcp_proto(int i, int oop,\n+\tenum rte_crypto_cipher_operation opc,\n+\tenum rte_crypto_auth_operation opa,\n+\tuint8_t *input_vec,\n+\tunsigned int input_vec_len,\n+\tuint8_t *output_vec,\n+\tunsigned int output_vec_len)\n {\n \tstruct crypto_testsuite_params *ts_params = &testsuite_params;\n \tstruct crypto_unittest_params *ut_params = &unittest_params;\n+\tuint8_t *plaintext;\n+\tint ret = TEST_SUCCESS;\n \n-\tint retval;\n-\n-\tuint8_t *plaintext = NULL, *ciphertext = NULL;\n-\tunsigned int plaintext_pad_len;\n-\tunsigned int plaintext_len;\n-\tunsigned int ciphertext_pad_len;\n-\tunsigned int ciphertext_len;\n-\n-\tstruct rte_cryptodev_info dev_info;\n-\tstruct rte_crypto_op *op;\n-\n-\t/* Check if device supports particular algorithms separately */\n-\tif (test_mixed_check_if_unsupported(tdata))\n-\t\treturn -ENOTSUP;\n-\n-\trte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);\n-\n-\tuint64_t feat_flags = dev_info.feature_flags;\n-\n-\tif (op_mode == OUT_OF_PLACE) {\n-\t\tif (!(feat_flags & RTE_CRYPTODEV_FF_DIGEST_ENCRYPTED)) {\n-\t\t\tprintf(\"Device doesn't support digest encrypted.\\n\");\n+\t/* Verify the capabilities */\n+\tstruct rte_cryptodev_sym_capability_idx cap_idx;\n+\tif (pdcp_test_params[i].auth_alg != 0) {\n+\t\tcap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;\n+\t\tcap_idx.algo.auth = pdcp_test_params[i].auth_alg;\n+\t\tif (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],\n+\t\t\t\t&cap_idx) == NULL)\n \t\t\treturn -ENOTSUP;\n-\t\t}\n \t}\n+\tcap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;\n+\tcap_idx.algo.cipher = pdcp_test_params[i].cipher_alg;\n+\tif (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],\n+\t\t\t&cap_idx) == NULL)\n+\t\treturn -ENOTSUP;\n \n-\t/* Create the session */\n-\tif (verify)\n-\t\tretval = create_wireless_algo_cipher_auth_session(\n-\t\t\t\tts_params->valid_devs[0],\n-\t\t\t\tRTE_CRYPTO_CIPHER_OP_DECRYPT,\n-\t\t\t\tRTE_CRYPTO_AUTH_OP_VERIFY,\n-\t\t\t\ttdata->auth_algo,\n-\t\t\t\ttdata->cipher_algo,\n-\t\t\t\ttdata->auth_key.data, tdata->auth_key.len,\n-\t\t\t\ttdata->auth_iv.len, tdata->digest_enc.len,\n-\t\t\t\ttdata->cipher_iv.len);\n-\telse\n-\t\tretval = create_wireless_algo_auth_cipher_session(\n-\t\t\t\tts_params->valid_devs[0],\n-\t\t\t\tRTE_CRYPTO_CIPHER_OP_ENCRYPT,\n-\t\t\t\tRTE_CRYPTO_AUTH_OP_GENERATE,\n-\t\t\t\ttdata->auth_algo,\n-\t\t\t\ttdata->cipher_algo,\n-\t\t\t\ttdata->auth_key.data, tdata->auth_key.len,\n-\t\t\t\ttdata->auth_iv.len, tdata->digest_enc.len,\n-\t\t\t\ttdata->cipher_iv.len);\n-\tif (retval < 0)\n-\t\treturn retval;\n-\n+\t/* Generate test mbuf data */\n \tut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);\n-\tif (op_mode == OUT_OF_PLACE)\n-\t\tut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);\n \n \t/* clear mbuf payload */\n \tmemset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,\n-\t\trte_pktmbuf_tailroom(ut_params->ibuf));\n-\tif (op_mode == OUT_OF_PLACE)\n-\t\tmemset(rte_pktmbuf_mtod(ut_params->obuf, uint8_t *), 0,\n-\t\t\t\trte_pktmbuf_tailroom(ut_params->obuf));\n+\t\t\trte_pktmbuf_tailroom(ut_params->ibuf));\n \n-\tciphertext_len = ceil_byte_length(tdata->ciphertext.len_bits);\n-\tplaintext_len = ceil_byte_length(tdata->plaintext.len_bits);\n-\tciphertext_pad_len = RTE_ALIGN_CEIL(ciphertext_len, 16);\n-\tplaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16);\n+\tplaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,\n+\t\t\t\t\t\t  input_vec_len);\n+\tmemcpy(plaintext, input_vec, input_vec_len);\n \n-\tif (verify) {\n-\t\tciphertext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,\n-\t\t\t\tciphertext_pad_len);\n-\t\tmemcpy(ciphertext, tdata->ciphertext.data, ciphertext_len);\n-\t\tif (op_mode == OUT_OF_PLACE)\n-\t\t\trte_pktmbuf_append(ut_params->obuf, ciphertext_pad_len);\n-\t\tdebug_hexdump(stdout, \"ciphertext:\", ciphertext,\n-\t\t\t\tciphertext_len);\n-\t} else {\n-\t\tplaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,\n-\t\t\t\tplaintext_pad_len);\n-\t\tmemcpy(plaintext, tdata->plaintext.data, plaintext_len);\n-\t\tif (op_mode == OUT_OF_PLACE)\n-\t\t\trte_pktmbuf_append(ut_params->obuf, plaintext_pad_len);\n-\t\tdebug_hexdump(stdout, \"plaintext:\", plaintext, plaintext_len);\n+\t/* Out of place support */\n+\tif (oop) {\n+\t\t/*\n+\t\t * For out-op-place we need to alloc another mbuf\n+\t\t */\n+\t\tut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);\n+\t\trte_pktmbuf_append(ut_params->obuf, output_vec_len);\n \t}\n \n-\t/* Create the operation */\n-\tif (verify)\n-\t\tretval = create_wireless_algo_cipher_hash_operation(\n-\t\t\t\ttdata->digest_enc.data, tdata->digest_enc.len,\n-\t\t\t\ttdata->auth_iv.data, tdata->auth_iv.len,\n-\t\t\t\tplaintext_len, RTE_CRYPTO_AUTH_OP_VERIFY,\n-\t\t\t\ttdata->cipher_iv.data, tdata->cipher_iv.len,\n-\t\t\t\ttdata->validCipherLen.len_bits,\n-\t\t\t\ttdata->cipher.offset_bits,\n-\t\t\t\ttdata->validAuthLen.len_bits,\n-\t\t\t\ttdata->auth.offset_bits);\n-\telse\n-\t\tretval = create_wireless_algo_auth_cipher_operation(\n-\t\t\t\ttdata->digest_enc.len,\n-\t\t\t\ttdata->cipher_iv.data, tdata->cipher_iv.len,\n-\t\t\t\ttdata->auth_iv.data, tdata->auth_iv.len,\n-\t\t\t\t(tdata->digest_enc.offset == 0 ?\n-\t\t\t\t\tplaintext_pad_len\n-\t\t\t\t\t: tdata->digest_enc.offset),\n-\t\t\t\ttdata->validCipherLen.len_bits,\n-\t\t\t\ttdata->cipher.offset_bits,\n-\t\t\t\ttdata->validAuthLen.len_bits,\n-\t\t\t\ttdata->auth.offset_bits,\n-\t\t\t\top_mode, 0);\n-\tif (retval < 0)\n-\t\treturn retval;\n+\t/* Set crypto type as IPSEC */\n+\tut_params->type = RTE_SECURITY_ACTION_TYPE_LOOKASIDE_PROTOCOL;\n \n-\top = process_crypto_request(ts_params->valid_devs[0],\n-\t\t\tut_params->op);\n+\t/* Setup Cipher Parameters */\n+\tut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER;\n+\tut_params->cipher_xform.cipher.algo = pdcp_test_params[i].cipher_alg;\n+\tut_params->cipher_xform.cipher.op = opc;\n+\tut_params->cipher_xform.cipher.key.data = pdcp_test_crypto_key[i];\n+\tut_params->cipher_xform.cipher.key.length =\n+\t\t\t\t\tpdcp_test_params[i].cipher_key_len;\n+\tut_params->cipher_xform.cipher.iv.length = 0;\n \n-\t/* Check if the op failed because the device doesn't */\n-\t/* support this particular combination of algorithms */\n-\tif (op == NULL && ut_params->op->status ==\n-\t\t\tRTE_CRYPTO_OP_STATUS_INVALID_SESSION) {\n-\t\tprintf(\"Device doesn't support this mixed combination. \"\n-\t\t\t\t\"Test Skipped.\\n\");\n-\t\treturn -ENOTSUP;\n+\t/* Setup HMAC Parameters if ICV header is required */\n+\tif (pdcp_test_params[i].auth_alg != 0) {\n+\t\tut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;\n+\t\tut_params->auth_xform.next = NULL;\n+\t\tut_params->auth_xform.auth.algo = pdcp_test_params[i].auth_alg;\n+\t\tut_params->auth_xform.auth.op = opa;\n+\t\tut_params->auth_xform.auth.key.data = pdcp_test_auth_key[i];\n+\t\tut_params->auth_xform.auth.key.length =\n+\t\t\t\t\tpdcp_test_params[i].auth_key_len;\n+\n+\t\tut_params->cipher_xform.next = &ut_params->auth_xform;\n+\t} else {\n+\t\tut_params->cipher_xform.next = NULL;\n \t}\n-\tut_params->op = op;\n \n-\tTEST_ASSERT_NOT_NULL(ut_params->op, \"failed to retrieve obuf\");\n+\tstruct rte_security_session_conf sess_conf = {\n+\t\t.action_type = RTE_SECURITY_ACTION_TYPE_LOOKASIDE_PROTOCOL,\n+\t\t.protocol = RTE_SECURITY_PROTOCOL_PDCP,\n+\t\t{.pdcp = {\n+\t\t\t.bearer = pdcp_test_bearer[i],\n+\t\t\t.domain = pdcp_test_params[i].domain,\n+\t\t\t.pkt_dir = pdcp_test_packet_direction[i],\n+\t\t\t.sn_size = pdcp_test_data_sn_size[i],\n+\t\t\t.hfn = pdcp_test_hfn[i],\n+\t\t\t.hfn_threshold = pdcp_test_hfn_threshold[i],\n+\t\t} },\n+\t\t.crypto_xform = &ut_params->cipher_xform\n+\t};\n \n-\tut_params->obuf = (op_mode == IN_PLACE ?\n-\t\t\tut_params->op->sym->m_src : ut_params->op->sym->m_dst);\n+\tstruct rte_security_ctx *ctx = (struct rte_security_ctx *)\n+\t\t\t\trte_cryptodev_get_sec_ctx(\n+\t\t\t\tts_params->valid_devs[0]);\n \n-\tif (verify) {\n-\t\tif (ut_params->obuf)\n-\t\t\tplaintext = rte_pktmbuf_mtod(ut_params->obuf,\n-\t\t\t\t\t\t\tuint8_t *);\n-\t\telse\n-\t\t\tplaintext = ciphertext +\n-\t\t\t\t\t(tdata->cipher.offset_bits >> 3);\n+\t/* Create security session */\n+\tut_params->sec_session = rte_security_session_create(ctx,\n+\t\t\t\t&sess_conf, ts_params->session_priv_mpool);\n \n-\t\tdebug_hexdump(stdout, \"plaintext:\", plaintext,\n-\t\t\t\ttdata->plaintext.len_bits >> 3);\n-\t\tdebug_hexdump(stdout, \"plaintext expected:\",\n-\t\t\t\ttdata->plaintext.data,\n-\t\t\t\ttdata->plaintext.len_bits >> 3);\n-\t} else {\n-\t\tif (ut_params->obuf)\n-\t\t\tciphertext = rte_pktmbuf_mtod(ut_params->obuf,\n-\t\t\t\t\tuint8_t *);\n-\t\telse\n-\t\t\tciphertext = plaintext;\n+\tif (!ut_params->sec_session) {\n+\t\tprintf(\"TestCase %s()-%d line %d failed %s: \",\n+\t\t\t__func__, i, __LINE__, \"Failed to allocate session\");\n+\t\tret = TEST_FAILED;\n+\t\tgoto on_err;\n+\t}\n \n-\t\tdebug_hexdump(stdout, \"ciphertext:\", ciphertext,\n-\t\t\t\tciphertext_len);\n-\t\tdebug_hexdump(stdout, \"ciphertext expected:\",\n-\t\t\t\ttdata->ciphertext.data,\n-\t\t\t\ttdata->ciphertext.len_bits >> 3);\n+\t/* Generate crypto op data structure */\n+\tut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,\n+\t\t\tRTE_CRYPTO_OP_TYPE_SYMMETRIC);\n+\tif (!ut_params->op) {\n+\t\tprintf(\"TestCase %s()-%d line %d failed %s: \",\n+\t\t\t__func__, i, __LINE__,\n+\t\t\t\"Failed to allocate symmetric crypto operation struct\");\n+\t\tret = TEST_FAILED;\n+\t\tgoto on_err;\n+\t}\n \n-\t\tut_params->digest = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *)\n-\t\t\t\t+ (tdata->digest_enc.offset == 0 ?\n-\t\tplaintext_pad_len : tdata->digest_enc.offset);\n+\trte_security_attach_session(ut_params->op, ut_params->sec_session);\n \n-\t\tdebug_hexdump(stdout, \"digest:\", ut_params->digest,\n-\t\t\t\ttdata->digest_enc.len);\n-\t\tdebug_hexdump(stdout, \"digest expected:\",\n-\t\t\t\ttdata->digest_enc.data,\n-\t\t\t\ttdata->digest_enc.len);\n+\t/* set crypto operation source mbuf */\n+\tut_params->op->sym->m_src = ut_params->ibuf;\n+\tif (oop)\n+\t\tut_params->op->sym->m_dst = ut_params->obuf;\n+\n+\t/* Process crypto operation */\n+\tif (process_crypto_request(ts_params->valid_devs[0], ut_params->op)\n+\t\t== NULL) {\n+\t\tprintf(\"TestCase %s()-%d line %d failed %s: \",\n+\t\t\t__func__, i, __LINE__,\n+\t\t\t\"failed to process sym crypto op\");\n+\t\tret = TEST_FAILED;\n+\t\tgoto on_err;\n+\t}\n+\n+\tif (ut_params->op->status != RTE_CRYPTO_OP_STATUS_SUCCESS) {\n+\t\tprintf(\"TestCase %s()-%d line %d failed %s: \",\n+\t\t\t__func__, i, __LINE__, \"crypto op processing failed\");\n+\t\tret = TEST_FAILED;\n+\t\tgoto on_err;\n \t}\n \n \t/* Validate obuf */\n-\tif (verify) {\n-\t\tTEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(\n-\t\t\t\tplaintext,\n-\t\t\t\ttdata->plaintext.data,\n-\t\t\t\ttdata->plaintext.len_bits >> 3,\n-\t\t\t\t\"Plaintext data not as expected\");\n-\t} else {\n-\t\tTEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(\n-\t\t\t\tciphertext,\n-\t\t\t\ttdata->ciphertext.data,\n-\t\t\t\ttdata->validDataLen.len_bits,\n-\t\t\t\t\"Ciphertext data not as expected\");\n+\tuint8_t *ciphertext = rte_pktmbuf_mtod(ut_params->op->sym->m_src,\n+\t\t\tuint8_t *);\n+\tif (oop) {\n+\t\tciphertext = rte_pktmbuf_mtod(ut_params->op->sym->m_dst,\n+\t\t\t\tuint8_t *);\n+\t}\n \n-\t\tTEST_ASSERT_BUFFERS_ARE_EQUAL(\n-\t\t\t\tut_params->digest,\n-\t\t\t\ttdata->digest_enc.data,\n-\t\t\t\tDIGEST_BYTE_LENGTH_SNOW3G_UIA2,\n-\t\t\t\t\"Generated auth tag not as expected\");\n+\tif (memcmp(ciphertext, output_vec, output_vec_len)) {\n+\t\tprintf(\"\\n=======PDCP TestCase #%d failed: Data Mismatch \", i);\n+\t\trte_hexdump(stdout, \"encrypted\", ciphertext, output_vec_len);\n+\t\trte_hexdump(stdout, \"reference\", output_vec, output_vec_len);\n+\t\tret = TEST_FAILED;\n+\t\tgoto on_err;\n \t}\n \n-\tTEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,\n-\t\t\t\"crypto op processing failed\");\n+on_err:\n+\trte_crypto_op_free(ut_params->op);\n+\tut_params->op = NULL;\n \n-\treturn 0;\n+\tif (ut_params->sec_session)\n+\t\trte_security_session_destroy(ctx, ut_params->sec_session);\n+\tut_params->sec_session = NULL;\n+\n+\trte_pktmbuf_free(ut_params->ibuf);\n+\tut_params->ibuf = NULL;\n+\tif (oop) {\n+\t\trte_pktmbuf_free(ut_params->obuf);\n+\t\tut_params->obuf = NULL;\n+\t}\n+\n+\treturn ret;\n }\n \n static int\n-test_mixed_auth_cipher_sgl(const struct mixed_cipher_auth_test_data *tdata,\n-\tuint8_t op_mode, uint8_t verify)\n+test_pdcp_proto_SGL(int i, int oop,\n+\tenum rte_crypto_cipher_operation opc,\n+\tenum rte_crypto_auth_operation opa,\n+\tuint8_t *input_vec,\n+\tunsigned int input_vec_len,\n+\tuint8_t *output_vec,\n+\tunsigned int output_vec_len,\n+\tuint32_t fragsz,\n+\tuint32_t fragsz_oop)\n {\n \tstruct crypto_testsuite_params *ts_params = &testsuite_params;\n \tstruct crypto_unittest_params *ut_params = &unittest_params;\n+\tuint8_t *plaintext;\n+\tstruct rte_mbuf *buf, *buf_oop = NULL;\n+\tint ret = TEST_SUCCESS;\n+\tint to_trn = 0;\n+\tint to_trn_tbl[16];\n+\tint segs = 1;\n+\tunsigned int trn_data = 0;\n \n-\tint retval;\n+\t/* Verify the capabilities */\n+\tstruct rte_cryptodev_sym_capability_idx cap_idx;\n+\tif (pdcp_test_params[i].auth_alg != 0) {\n+\t\tcap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;\n+\t\tcap_idx.algo.auth = pdcp_test_params[i].auth_alg;\n+\t\tif (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],\n+\t\t\t\t&cap_idx) == NULL)\n+\t\t\treturn -ENOTSUP;\n+\t}\n+\tcap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;\n+\tcap_idx.algo.cipher = pdcp_test_params[i].cipher_alg;\n+\tif (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],\n+\t\t\t&cap_idx) == NULL)\n+\t\treturn -ENOTSUP;\n \n-\tconst uint8_t *plaintext = NULL;\n-\tconst uint8_t *ciphertext = NULL;\n-\tconst uint8_t *digest = NULL;\n-\tunsigned int plaintext_pad_len;\n-\tunsigned int plaintext_len;\n-\tunsigned int ciphertext_pad_len;\n-\tunsigned int ciphertext_len;\n-\tuint8_t buffer[10000];\n-\tuint8_t digest_buffer[10000];\n+\tif (fragsz > input_vec_len)\n+\t\tfragsz = input_vec_len;\n \n-\tstruct rte_cryptodev_info dev_info;\n-\tstruct rte_crypto_op *op;\n+\tuint16_t plaintext_len = fragsz;\n+\tuint16_t frag_size_oop = fragsz_oop ? fragsz_oop : fragsz;\n \n-\t/* Check if device supports particular algorithms */\n-\tif (test_mixed_check_if_unsupported(tdata))\n-\t\treturn -ENOTSUP;\n+\tif (fragsz_oop > output_vec_len)\n+\t\tfrag_size_oop = output_vec_len;\n \n-\trte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);\n+\tint ecx = 0;\n+\tif (input_vec_len % fragsz != 0) {\n+\t\tif (input_vec_len / fragsz + 1 > 16)\n+\t\t\treturn 1;\n+\t} else if (input_vec_len / fragsz > 16)\n+\t\treturn 1;\n \n-\tuint64_t feat_flags = dev_info.feature_flags;\n+\t/* Out of place support */\n+\tif (oop) {\n+\t\t/*\n+\t\t * For out-op-place we need to alloc another mbuf\n+\t\t */\n+\t\tut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);\n+\t\trte_pktmbuf_append(ut_params->obuf, frag_size_oop);\n+\t\tbuf_oop = ut_params->obuf;\n+\t}\n \n-\tif (op_mode == IN_PLACE) {\n-\t\tif (!(feat_flags & RTE_CRYPTODEV_FF_IN_PLACE_SGL)) {\n-\t\t\tprintf(\"Device doesn't support in-place scatter-gather \"\n-\t\t\t\t\t\"in both input and output mbufs.\\n\");\n-\t\t\treturn -ENOTSUP;\n-\t\t}\n-\t} else {\n-\t\tif (!(feat_flags & RTE_CRYPTODEV_FF_OOP_SGL_IN_SGL_OUT)) {\n-\t\t\tprintf(\"Device doesn't support out-of-place scatter-gather \"\n-\t\t\t\t\t\"in both input and output mbufs.\\n\");\n-\t\t\treturn -ENOTSUP;\n-\t\t}\n-\t\tif (!(feat_flags & RTE_CRYPTODEV_FF_DIGEST_ENCRYPTED)) {\n-\t\t\tprintf(\"Device doesn't support digest encrypted.\\n\");\n-\t\t\treturn -ENOTSUP;\n-\t\t}\n-\t}\n+\t/* Generate test mbuf data */\n+\tut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);\n \n-\t/* Create the session */\n-\tif (verify)\n-\t\tretval = create_wireless_algo_cipher_auth_session(\n-\t\t\t\tts_params->valid_devs[0],\n-\t\t\t\tRTE_CRYPTO_CIPHER_OP_DECRYPT,\n-\t\t\t\tRTE_CRYPTO_AUTH_OP_VERIFY,\n-\t\t\t\ttdata->auth_algo,\n-\t\t\t\ttdata->cipher_algo,\n-\t\t\t\ttdata->auth_key.data, tdata->auth_key.len,\n-\t\t\t\ttdata->auth_iv.len, tdata->digest_enc.len,\n-\t\t\t\ttdata->cipher_iv.len);\n-\telse\n-\t\tretval = create_wireless_algo_auth_cipher_session(\n-\t\t\t\tts_params->valid_devs[0],\n-\t\t\t\tRTE_CRYPTO_CIPHER_OP_ENCRYPT,\n-\t\t\t\tRTE_CRYPTO_AUTH_OP_GENERATE,\n-\t\t\t\ttdata->auth_algo,\n-\t\t\t\ttdata->cipher_algo,\n-\t\t\t\ttdata->auth_key.data, tdata->auth_key.len,\n-\t\t\t\ttdata->auth_iv.len, tdata->digest_enc.len,\n-\t\t\t\ttdata->cipher_iv.len);\n-\tif (retval < 0)\n-\t\treturn retval;\n+\t/* clear mbuf payload */\n+\tmemset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,\n+\t\t\trte_pktmbuf_tailroom(ut_params->ibuf));\n \n-\tciphertext_len = ceil_byte_length(tdata->ciphertext.len_bits);\n-\tplaintext_len = ceil_byte_length(tdata->plaintext.len_bits);\n-\tciphertext_pad_len = RTE_ALIGN_CEIL(ciphertext_len, 16);\n-\tplaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16);\n+\tplaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,\n+\t\t\t\t\t\t  plaintext_len);\n+\tmemcpy(plaintext, input_vec, plaintext_len);\n+\ttrn_data += plaintext_len;\n \n-\tut_params->ibuf = create_segmented_mbuf(ts_params->mbuf_pool,\n-\t\t\tciphertext_pad_len, 15, 0);\n-\tTEST_ASSERT_NOT_NULL(ut_params->ibuf,\n-\t\t\t\"Failed to allocate input buffer in mempool\");\n+\tbuf = ut_params->ibuf;\n \n-\tif (op_mode == OUT_OF_PLACE) {\n-\t\tut_params->obuf = create_segmented_mbuf(ts_params->mbuf_pool,\n-\t\t\t\tplaintext_pad_len, 15, 0);\n-\t\tTEST_ASSERT_NOT_NULL(ut_params->obuf,\n-\t\t\t\t\"Failed to allocate output buffer in mempool\");\n-\t}\n+\t/*\n+\t * Loop until no more fragments\n+\t */\n \n-\tif (verify) {\n-\t\tpktmbuf_write(ut_params->ibuf, 0, ciphertext_len,\n-\t\t\ttdata->ciphertext.data);\n-\t\tciphertext = rte_pktmbuf_read(ut_params->ibuf, 0,\n-\t\t\t\t\tciphertext_len, buffer);\n-\t\tdebug_hexdump(stdout, \"ciphertext:\", ciphertext,\n-\t\t\tciphertext_len);\n-\t} else {\n-\t\tpktmbuf_write(ut_params->ibuf, 0, plaintext_len,\n-\t\t\ttdata->plaintext.data);\n-\t\tplaintext = rte_pktmbuf_read(ut_params->ibuf, 0,\n-\t\t\t\t\tplaintext_len, buffer);\n-\t\tdebug_hexdump(stdout, \"plaintext:\", plaintext,\n-\t\t\tplaintext_len);\n-\t}\n-\tmemset(buffer, 0, sizeof(buffer));\n+\twhile (trn_data < input_vec_len) {\n+\t\t++segs;\n+\t\tto_trn = (input_vec_len - trn_data < fragsz) ?\n+\t\t\t\t(input_vec_len - trn_data) : fragsz;\n \n-\t/* Create the operation */\n-\tif (verify)\n-\t\tretval = create_wireless_algo_cipher_hash_operation(\n-\t\t\t\ttdata->digest_enc.data, tdata->digest_enc.len,\n-\t\t\t\ttdata->auth_iv.data, tdata->auth_iv.len,\n-\t\t\t\tplaintext_len, RTE_CRYPTO_AUTH_OP_VERIFY,\n-\t\t\t\ttdata->cipher_iv.data, tdata->cipher_iv.len,\n-\t\t\t\ttdata->validCipherLen.len_bits,\n-\t\t\t\ttdata->cipher.offset_bits,\n-\t\t\t\ttdata->validAuthLen.len_bits,\n-\t\t\t\ttdata->auth.offset_bits);\n-\telse\n-\t\tretval = create_wireless_algo_auth_cipher_operation(\n-\t\t\t\ttdata->digest_enc.len,\n-\t\t\t\ttdata->cipher_iv.data, tdata->cipher_iv.len,\n-\t\t\t\ttdata->auth_iv.data, tdata->auth_iv.len,\n-\t\t\t\t(tdata->digest_enc.offset == 0 ?\n-\t\t\t\t\tplaintext_pad_len\n-\t\t\t\t\t: tdata->digest_enc.offset),\n-\t\t\t\ttdata->validCipherLen.len_bits,\n-\t\t\t\ttdata->cipher.offset_bits,\n-\t\t\t\ttdata->validAuthLen.len_bits,\n-\t\t\t\ttdata->auth.offset_bits,\n-\t\t\t\top_mode, 1);\n-\tif (retval < 0)\n-\t\treturn retval;\n+\t\tto_trn_tbl[ecx++] = to_trn;\n \n-\top = process_crypto_request(ts_params->valid_devs[0],\n-\t\t\tut_params->op);\n+\t\tbuf->next = rte_pktmbuf_alloc(ts_params->mbuf_pool);\n+\t\tbuf = buf->next;\n \n-\t/* Check if the op failed because the device doesn't */\n-\t/* support this particular combination of algorithms */\n-\tif (op == NULL && ut_params->op->status ==\n-\t\t\tRTE_CRYPTO_OP_STATUS_INVALID_SESSION) {\n-\t\tprintf(\"Device doesn't support this mixed combination. \"\n-\t\t\t\t\"Test Skipped.\\n\");\n-\t\treturn -ENOTSUP;\n-\t}\n+\t\tmemset(rte_pktmbuf_mtod(buf, uint8_t *), 0,\n+\t\t\t\trte_pktmbuf_tailroom(buf));\n \n-\tut_params->op = op;\n+\t\t/* OOP */\n+\t\tif (oop && !fragsz_oop) {\n+\t\t\tbuf_oop->next =\n+\t\t\t\t\trte_pktmbuf_alloc(ts_params->mbuf_pool);\n+\t\t\tbuf_oop = buf_oop->next;\n+\t\t\tmemset(rte_pktmbuf_mtod(buf_oop, uint8_t *),\n+\t\t\t\t\t0, rte_pktmbuf_tailroom(buf_oop));\n+\t\t\trte_pktmbuf_append(buf_oop, to_trn);\n+\t\t}\n \n-\tTEST_ASSERT_NOT_NULL(ut_params->op, \"failed to retrieve obuf\");\n+\t\tplaintext = (uint8_t *)rte_pktmbuf_append(buf,\n+\t\t\t\tto_trn);\n \n-\tut_params->obuf = (op_mode == IN_PLACE ?\n-\t\t\tut_params->op->sym->m_src : ut_params->op->sym->m_dst);\n+\t\tmemcpy(plaintext, input_vec + trn_data, to_trn);\n+\t\ttrn_data += to_trn;\n+\t}\n \n-\tif (verify) {\n-\t\tif (ut_params->obuf)\n-\t\t\tplaintext = rte_pktmbuf_read(ut_params->obuf, 0,\n-\t\t\t\t\tplaintext_len, buffer);\n-\t\telse\n-\t\t\tplaintext = rte_pktmbuf_read(ut_params->ibuf, 0,\n-\t\t\t\t\tplaintext_len, buffer);\n+\tut_params->ibuf->nb_segs = segs;\n \n-\t\tdebug_hexdump(stdout, \"plaintext:\", plaintext,\n-\t\t\t\t(tdata->plaintext.len_bits >> 3) -\n-\t\t\t\ttdata->digest_enc.len);\n-\t\tdebug_hexdump(stdout, \"plaintext expected:\",\n-\t\t\t\ttdata->plaintext.data,\n-\t\t\t\t(tdata->plaintext.len_bits >> 3) -\n-\t\t\t\ttdata->digest_enc.len);\n-\t} else {\n-\t\tif (ut_params->obuf)\n-\t\t\tciphertext = rte_pktmbuf_read(ut_params->obuf, 0,\n-\t\t\t\t\tciphertext_len, buffer);\n-\t\telse\n-\t\t\tciphertext = rte_pktmbuf_read(ut_params->ibuf, 0,\n-\t\t\t\t\tciphertext_len, buffer);\n+\tsegs = 1;\n+\tif (fragsz_oop && oop) {\n+\t\tto_trn = 0;\n+\t\tecx = 0;\n \n-\t\tdebug_hexdump(stdout, \"ciphertext:\", ciphertext,\n-\t\t\tciphertext_len);\n-\t\tdebug_hexdump(stdout, \"ciphertext expected:\",\n-\t\t\ttdata->ciphertext.data,\n-\t\t\ttdata->ciphertext.len_bits >> 3);\n+\t\ttrn_data = frag_size_oop;\n+\t\twhile (trn_data < output_vec_len) {\n+\t\t\t++segs;\n+\t\t\tto_trn =\n+\t\t\t\t(output_vec_len - trn_data <\n+\t\t\t\t\t\tfrag_size_oop) ?\n+\t\t\t\t(output_vec_len - trn_data) :\n+\t\t\t\t\t\tfrag_size_oop;\n \n-\t\tif (ut_params->obuf)\n-\t\t\tdigest = rte_pktmbuf_read(ut_params->obuf,\n-\t\t\t\t\t(tdata->digest_enc.offset == 0 ?\n-\t\t\t\t\t\tplaintext_pad_len :\n-\t\t\t\t\t\ttdata->digest_enc.offset),\n-\t\t\t\t\ttdata->digest_enc.len, digest_buffer);\n-\t\telse\n-\t\t\tdigest = rte_pktmbuf_read(ut_params->ibuf,\n-\t\t\t\t\t(tdata->digest_enc.offset == 0 ?\n-\t\t\t\t\t\tplaintext_pad_len :\n-\t\t\t\t\t\ttdata->digest_enc.offset),\n-\t\t\t\t\ttdata->digest_enc.len, digest_buffer);\n+\t\t\tto_trn_tbl[ecx++] = to_trn;\n \n-\t\tdebug_hexdump(stdout, \"digest:\", digest,\n-\t\t\t\ttdata->digest_enc.len);\n-\t\tdebug_hexdump(stdout, \"digest expected:\",\n-\t\t\t\ttdata->digest_enc.data, tdata->digest_enc.len);\n-\t}\n+\t\t\tbuf_oop->next =\n+\t\t\t\trte_pktmbuf_alloc(ts_params->mbuf_pool);\n+\t\t\tbuf_oop = buf_oop->next;\n+\t\t\tmemset(rte_pktmbuf_mtod(buf_oop, uint8_t *),\n+\t\t\t\t\t0, rte_pktmbuf_tailroom(buf_oop));\n+\t\t\trte_pktmbuf_append(buf_oop, to_trn);\n \n-\t/* Validate obuf */\n-\tif (verify) {\n-\t\tTEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(\n-\t\t\t\tplaintext,\n-\t\t\t\ttdata->plaintext.data,\n-\t\t\t\ttdata->plaintext.len_bits >> 3,\n-\t\t\t\t\"Plaintext data not as expected\");\n-\t} else {\n-\t\tTEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(\n-\t\t\t\tciphertext,\n-\t\t\t\ttdata->ciphertext.data,\n-\t\t\t\ttdata->validDataLen.len_bits,\n-\t\t\t\t\"Ciphertext data not as expected\");\n-\t\tTEST_ASSERT_BUFFERS_ARE_EQUAL(\n-\t\t\t\tdigest,\n-\t\t\t\ttdata->digest_enc.data,\n-\t\t\t\ttdata->digest_enc.len,\n-\t\t\t\t\"Generated auth tag not as expected\");\n+\t\t\ttrn_data += to_trn;\n+\t\t}\n+\t\tut_params->obuf->nb_segs = segs;\n \t}\n \n-\tTEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,\n-\t\t\t\"crypto op processing failed\");\n+\tut_params->type = RTE_SECURITY_ACTION_TYPE_LOOKASIDE_PROTOCOL;\n \n-\treturn 0;\n-}\n+\t/* Setup Cipher Parameters */\n+\tut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER;\n+\tut_params->cipher_xform.cipher.algo = pdcp_test_params[i].cipher_alg;\n+\tut_params->cipher_xform.cipher.op = opc;\n+\tut_params->cipher_xform.cipher.key.data = pdcp_test_crypto_key[i];\n+\tut_params->cipher_xform.cipher.key.length =\n+\t\t\t\t\tpdcp_test_params[i].cipher_key_len;\n+\tut_params->cipher_xform.cipher.iv.length = 0;\n \n-/** AUTH AES CMAC + CIPHER AES CTR */\n+\t/* Setup HMAC Parameters if ICV header is required */\n+\tif (pdcp_test_params[i].auth_alg != 0) {\n+\t\tut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;\n+\t\tut_params->auth_xform.next = NULL;\n+\t\tut_params->auth_xform.auth.algo = pdcp_test_params[i].auth_alg;\n+\t\tut_params->auth_xform.auth.op = opa;\n+\t\tut_params->auth_xform.auth.key.data = pdcp_test_auth_key[i];\n+\t\tut_params->auth_xform.auth.key.length =\n+\t\t\t\t\tpdcp_test_params[i].auth_key_len;\n \n-static int\n-test_aes_cmac_aes_ctr_digest_enc_test_case_1(void)\n-{\n-\treturn test_mixed_auth_cipher(\n-\t\t&auth_aes_cmac_cipher_aes_ctr_test_case_1, IN_PLACE, 0);\n-}\n+\t\tut_params->cipher_xform.next = &ut_params->auth_xform;\n+\t} else {\n+\t\tut_params->cipher_xform.next = NULL;\n+\t}\n \n-static int\n-test_aes_cmac_aes_ctr_digest_enc_test_case_1_oop(void)\n-{\n-\treturn test_mixed_auth_cipher(\n-\t\t&auth_aes_cmac_cipher_aes_ctr_test_case_1, OUT_OF_PLACE, 0);\n-}\n+\tstruct rte_security_session_conf sess_conf = {\n+\t\t.action_type = RTE_SECURITY_ACTION_TYPE_LOOKASIDE_PROTOCOL,\n+\t\t.protocol = RTE_SECURITY_PROTOCOL_PDCP,\n+\t\t{.pdcp = {\n+\t\t\t.bearer = pdcp_test_bearer[i],\n+\t\t\t.domain = pdcp_test_params[i].domain,\n+\t\t\t.pkt_dir = pdcp_test_packet_direction[i],\n+\t\t\t.sn_size = pdcp_test_data_sn_size[i],\n+\t\t\t.hfn = pdcp_test_hfn[i],\n+\t\t\t.hfn_threshold = pdcp_test_hfn_threshold[i],\n+\t\t} },\n+\t\t.crypto_xform = &ut_params->cipher_xform\n+\t};\n \n-static int\n-test_aes_cmac_aes_ctr_digest_enc_test_case_1_sgl(void)\n-{\n-\treturn test_mixed_auth_cipher_sgl(\n-\t\t&auth_aes_cmac_cipher_aes_ctr_test_case_1, IN_PLACE, 0);\n-}\n+\tstruct rte_security_ctx *ctx = (struct rte_security_ctx *)\n+\t\t\t\trte_cryptodev_get_sec_ctx(\n+\t\t\t\tts_params->valid_devs[0]);\n \n-static int\n-test_aes_cmac_aes_ctr_digest_enc_test_case_1_oop_sgl(void)\n-{\n-\treturn test_mixed_auth_cipher_sgl(\n-\t\t&auth_aes_cmac_cipher_aes_ctr_test_case_1, OUT_OF_PLACE, 0);\n-}\n+\t/* Create security session */\n+\tut_params->sec_session = rte_security_session_create(ctx,\n+\t\t\t\t&sess_conf, ts_params->session_priv_mpool);\n \n-static int\n-test_verify_aes_cmac_aes_ctr_digest_enc_test_case_1(void)\n-{\n-\treturn test_mixed_auth_cipher(\n-\t\t&auth_aes_cmac_cipher_aes_ctr_test_case_1, IN_PLACE, 1);\n-}\n+\tif (!ut_params->sec_session) {\n+\t\tprintf(\"TestCase %s()-%d line %d failed %s: \",\n+\t\t\t__func__, i, __LINE__, \"Failed to allocate session\");\n+\t\tret = TEST_FAILED;\n+\t\tgoto on_err;\n+\t}\n \n-static int\n-test_verify_aes_cmac_aes_ctr_digest_enc_test_case_1_oop(void)\n-{\n-\treturn test_mixed_auth_cipher(\n-\t\t&auth_aes_cmac_cipher_aes_ctr_test_case_1, OUT_OF_PLACE, 1);\n-}\n+\t/* Generate crypto op data structure */\n+\tut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,\n+\t\t\tRTE_CRYPTO_OP_TYPE_SYMMETRIC);\n+\tif (!ut_params->op) {\n+\t\tprintf(\"TestCase %s()-%d line %d failed %s: \",\n+\t\t\t__func__, i, __LINE__,\n+\t\t\t\"Failed to allocate symmetric crypto operation struct\");\n+\t\tret = TEST_FAILED;\n+\t\tgoto on_err;\n+\t}\n \n-static int\n-test_verify_aes_cmac_aes_ctr_digest_enc_test_case_1_sgl(void)\n-{\n-\treturn test_mixed_auth_cipher_sgl(\n-\t\t&auth_aes_cmac_cipher_aes_ctr_test_case_1, IN_PLACE, 1);\n-}\n+\trte_security_attach_session(ut_params->op, ut_params->sec_session);\n \n-static int\n-test_verify_aes_cmac_aes_ctr_digest_enc_test_case_1_oop_sgl(void)\n-{\n-\treturn test_mixed_auth_cipher_sgl(\n-\t\t&auth_aes_cmac_cipher_aes_ctr_test_case_1, OUT_OF_PLACE, 1);\n-}\n+\t/* set crypto operation source mbuf */\n+\tut_params->op->sym->m_src = ut_params->ibuf;\n+\tif (oop)\n+\t\tut_params->op->sym->m_dst = ut_params->obuf;\n \n-/** MIXED AUTH + CIPHER */\n+\t/* Process crypto operation */\n+\tif (process_crypto_request(ts_params->valid_devs[0], ut_params->op)\n+\t\t== NULL) {\n+\t\tprintf(\"TestCase %s()-%d line %d failed %s: \",\n+\t\t\t__func__, i, __LINE__,\n+\t\t\t\"failed to process sym crypto op\");\n+\t\tret = TEST_FAILED;\n+\t\tgoto on_err;\n+\t}\n \n-static int\n-test_auth_zuc_cipher_snow_test_case_1(void)\n-{\n-\treturn test_mixed_auth_cipher(\n-\t\t&auth_zuc_cipher_snow_test_case_1, OUT_OF_PLACE, 0);\n-}\n+\tif (ut_params->op->status != RTE_CRYPTO_OP_STATUS_SUCCESS) {\n+\t\tprintf(\"TestCase %s()-%d line %d failed %s: \",\n+\t\t\t__func__, i, __LINE__, \"crypto op processing failed\");\n+\t\tret = TEST_FAILED;\n+\t\tgoto on_err;\n+\t}\n \n-static int\n-test_verify_auth_zuc_cipher_snow_test_case_1(void)\n-{\n-\treturn test_mixed_auth_cipher(\n-\t\t&auth_zuc_cipher_snow_test_case_1, OUT_OF_PLACE, 1);\n-}\n+\t/* Validate obuf */\n+\tuint8_t *ciphertext = rte_pktmbuf_mtod(ut_params->op->sym->m_src,\n+\t\t\tuint8_t *);\n+\tif (oop) {\n+\t\tciphertext = rte_pktmbuf_mtod(ut_params->op->sym->m_dst,\n+\t\t\t\tuint8_t *);\n+\t}\n+\tif (fragsz_oop)\n+\t\tfragsz = frag_size_oop;\n+\tif (memcmp(ciphertext, output_vec, fragsz)) {\n+\t\tprintf(\"\\n=======PDCP TestCase #%d failed: Data Mismatch \", i);\n+\t\trte_hexdump(stdout, \"encrypted\", ciphertext, fragsz);\n+\t\trte_hexdump(stdout, \"reference\", output_vec, fragsz);\n+\t\tret = TEST_FAILED;\n+\t\tgoto on_err;\n+\t}\n \n-static int\n-test_auth_aes_cmac_cipher_snow_test_case_1(void)\n-{\n-\treturn test_mixed_auth_cipher(\n-\t\t&auth_aes_cmac_cipher_snow_test_case_1, OUT_OF_PLACE, 0);\n-}\n+\tbuf = ut_params->op->sym->m_src->next;\n+\tif (oop)\n+\t\tbuf = ut_params->op->sym->m_dst->next;\n \n-static int\n-test_verify_auth_aes_cmac_cipher_snow_test_case_1(void)\n-{\n-\treturn test_mixed_auth_cipher(\n-\t\t&auth_aes_cmac_cipher_snow_test_case_1, OUT_OF_PLACE, 1);\n+\tunsigned int off = fragsz;\n+\n+\tecx = 0;\n+\twhile (buf) {\n+\t\tciphertext = rte_pktmbuf_mtod(buf,\n+\t\t\t\tuint8_t *);\n+\t\tif (memcmp(ciphertext, output_vec + off, to_trn_tbl[ecx])) {\n+\t\t\tprintf(\"\\n=======PDCP TestCase #%d failed: Data Mismatch \",\n+\t\t\t\t\ti);\n+\t\t\trte_hexdump(stdout, \"encrypted\", ciphertext,\n+\t\t\t\t\tto_trn_tbl[ecx]);\n+\t\t\trte_hexdump(stdout, \"reference\", output_vec + off,\n+\t\t\t\t\tto_trn_tbl[ecx]);\n+\t\t\tret = TEST_FAILED;\n+\t\t\tgoto on_err;\n+\t\t}\n+\t\toff += to_trn_tbl[ecx++];\n+\t\tbuf = buf->next;\n+\t}\n+on_err:\n+\trte_crypto_op_free(ut_params->op);\n+\tut_params->op = NULL;\n+\n+\tif (ut_params->sec_session)\n+\t\trte_security_session_destroy(ctx, ut_params->sec_session);\n+\tut_params->sec_session = NULL;\n+\n+\trte_pktmbuf_free(ut_params->ibuf);\n+\tut_params->ibuf = NULL;\n+\tif (oop) {\n+\t\trte_pktmbuf_free(ut_params->obuf);\n+\t\tut_params->obuf = NULL;\n+\t}\n+\n+\treturn ret;\n }\n \n-static int\n-test_auth_zuc_cipher_aes_ctr_test_case_1(void)\n+int\n+test_pdcp_proto_cplane_encap(int i)\n {\n-\treturn test_mixed_auth_cipher(\n-\t\t&auth_zuc_cipher_aes_ctr_test_case_1, OUT_OF_PLACE, 0);\n+\treturn test_pdcp_proto(i, 0,\n+\t\tRTE_CRYPTO_CIPHER_OP_ENCRYPT,\n+\t\tRTE_CRYPTO_AUTH_OP_GENERATE,\n+\t\tpdcp_test_data_in[i],\n+\t\tpdcp_test_data_in_len[i],\n+\t\tpdcp_test_data_out[i],\n+\t\tpdcp_test_data_in_len[i]+4);\n }\n \n-static int\n-test_verify_auth_zuc_cipher_aes_ctr_test_case_1(void)\n+int\n+test_pdcp_proto_uplane_encap(int i)\n {\n-\treturn test_mixed_auth_cipher(\n-\t\t&auth_zuc_cipher_aes_ctr_test_case_1, OUT_OF_PLACE, 1);\n+\treturn test_pdcp_proto(i, 0,\n+\t\tRTE_CRYPTO_CIPHER_OP_ENCRYPT,\n+\t\tRTE_CRYPTO_AUTH_OP_GENERATE,\n+\t\tpdcp_test_data_in[i],\n+\t\tpdcp_test_data_in_len[i],\n+\t\tpdcp_test_data_out[i],\n+\t\tpdcp_test_data_in_len[i]);\n+\n }\n \n-static int\n-test_auth_snow_cipher_aes_ctr_test_case_1(void)\n+int\n+test_pdcp_proto_uplane_encap_with_int(int i)\n {\n-\treturn test_mixed_auth_cipher(\n-\t\t&auth_snow_cipher_aes_ctr_test_case_1, OUT_OF_PLACE, 0);\n+\treturn test_pdcp_proto(i, 0,\n+\t\tRTE_CRYPTO_CIPHER_OP_ENCRYPT,\n+\t\tRTE_CRYPTO_AUTH_OP_GENERATE,\n+\t\tpdcp_test_data_in[i],\n+\t\tpdcp_test_data_in_len[i],\n+\t\tpdcp_test_data_out[i],\n+\t\tpdcp_test_data_in_len[i] + 4);\n }\n \n-static int\n-test_verify_auth_snow_cipher_aes_ctr_test_case_1(void)\n+int\n+test_pdcp_proto_cplane_decap(int i)\n {\n-\treturn test_mixed_auth_cipher(\n-\t\t&auth_snow_cipher_aes_ctr_test_case_1, OUT_OF_PLACE, 1);\n+\treturn test_pdcp_proto(i, 0,\n+\t\tRTE_CRYPTO_CIPHER_OP_DECRYPT,\n+\t\tRTE_CRYPTO_AUTH_OP_VERIFY,\n+\t\tpdcp_test_data_out[i],\n+\t\tpdcp_test_data_in_len[i] + 4,\n+\t\tpdcp_test_data_in[i],\n+\t\tpdcp_test_data_in_len[i]);\n }\n \n-static int\n-test_auth_snow_cipher_zuc_test_case_1(void)\n+int\n+test_pdcp_proto_uplane_decap(int i)\n {\n-\treturn test_mixed_auth_cipher(\n-\t\t&auth_snow_cipher_zuc_test_case_1, OUT_OF_PLACE, 0);\n+\treturn test_pdcp_proto(i, 0,\n+\t\tRTE_CRYPTO_CIPHER_OP_DECRYPT,\n+\t\tRTE_CRYPTO_AUTH_OP_VERIFY,\n+\t\tpdcp_test_data_out[i],\n+\t\tpdcp_test_data_in_len[i],\n+\t\tpdcp_test_data_in[i],\n+\t\tpdcp_test_data_in_len[i]);\n }\n \n-static int\n-test_verify_auth_snow_cipher_zuc_test_case_1(void)\n+int\n+test_pdcp_proto_uplane_decap_with_int(int i)\n {\n-\treturn test_mixed_auth_cipher(\n-\t\t&auth_snow_cipher_zuc_test_case_1, OUT_OF_PLACE, 1);\n+\treturn test_pdcp_proto(i, 0,\n+\t\tRTE_CRYPTO_CIPHER_OP_DECRYPT,\n+\t\tRTE_CRYPTO_AUTH_OP_VERIFY,\n+\t\tpdcp_test_data_out[i],\n+\t\tpdcp_test_data_in_len[i] + 4,\n+\t\tpdcp_test_data_in[i],\n+\t\tpdcp_test_data_in_len[i]);\n }\n \n static int\n-test_auth_aes_cmac_cipher_zuc_test_case_1(void)\n+test_PDCP_PROTO_SGL_in_place_32B(void)\n {\n-\treturn test_mixed_auth_cipher(\n-\t\t&auth_aes_cmac_cipher_zuc_test_case_1, OUT_OF_PLACE, 0);\n+\t/* i can be used for running any PDCP case\n+\t * In this case it is uplane 12-bit AES-SNOW DL encap\n+\t */\n+\tint i = PDCP_UPLANE_12BIT_OFFSET + AES_ENC + SNOW_AUTH + DOWNLINK;\n+\treturn test_pdcp_proto_SGL(i, IN_PLACE,\n+\t\t\tRTE_CRYPTO_CIPHER_OP_ENCRYPT,\n+\t\t\tRTE_CRYPTO_AUTH_OP_GENERATE,\n+\t\t\tpdcp_test_data_in[i],\n+\t\t\tpdcp_test_data_in_len[i],\n+\t\t\tpdcp_test_data_out[i],\n+\t\t\tpdcp_test_data_in_len[i]+4,\n+\t\t\t32, 0);\n }\n-\n static int\n-test_verify_auth_aes_cmac_cipher_zuc_test_case_1(void)\n+test_PDCP_PROTO_SGL_oop_32B_128B(void)\n {\n-\treturn test_mixed_auth_cipher(\n-\t\t&auth_aes_cmac_cipher_zuc_test_case_1, OUT_OF_PLACE, 1);\n+\t/* i can be used for running any PDCP case\n+\t * In this case it is uplane 18-bit NULL-NULL DL encap\n+\t */\n+\tint i = PDCP_UPLANE_18BIT_OFFSET + NULL_ENC + NULL_AUTH + DOWNLINK;\n+\treturn test_pdcp_proto_SGL(i, OUT_OF_PLACE,\n+\t\t\tRTE_CRYPTO_CIPHER_OP_ENCRYPT,\n+\t\t\tRTE_CRYPTO_AUTH_OP_GENERATE,\n+\t\t\tpdcp_test_data_in[i],\n+\t\t\tpdcp_test_data_in_len[i],\n+\t\t\tpdcp_test_data_out[i],\n+\t\t\tpdcp_test_data_in_len[i]+4,\n+\t\t\t32, 128);\n }\n-\n static int\n-test_auth_null_cipher_snow_test_case_1(void)\n+test_PDCP_PROTO_SGL_oop_32B_40B(void)\n {\n-\treturn test_mixed_auth_cipher(\n-\t\t&auth_null_cipher_snow_test_case_1, OUT_OF_PLACE, 0);\n+\t/* i can be used for running any PDCP case\n+\t * In this case it is uplane 18-bit AES DL encap\n+\t */\n+\tint i = PDCP_UPLANE_OFFSET + AES_ENC + EIGHTEEN_BIT_SEQ_NUM_OFFSET\n+\t\t\t+ DOWNLINK;\n+\treturn test_pdcp_proto_SGL(i, OUT_OF_PLACE,\n+\t\t\tRTE_CRYPTO_CIPHER_OP_ENCRYPT,\n+\t\t\tRTE_CRYPTO_AUTH_OP_GENERATE,\n+\t\t\tpdcp_test_data_in[i],\n+\t\t\tpdcp_test_data_in_len[i],\n+\t\t\tpdcp_test_data_out[i],\n+\t\t\tpdcp_test_data_in_len[i],\n+\t\t\t32, 40);\n }\n-\n static int\n-test_verify_auth_null_cipher_snow_test_case_1(void)\n+test_PDCP_PROTO_SGL_oop_128B_32B(void)\n {\n-\treturn test_mixed_auth_cipher(\n-\t\t&auth_null_cipher_snow_test_case_1, OUT_OF_PLACE, 1);\n+\t/* i can be used for running any PDCP case\n+\t * In this case it is cplane 12-bit AES-ZUC DL encap\n+\t */\n+\tint i = PDCP_CPLANE_LONG_SN_OFFSET + AES_ENC + ZUC_AUTH + DOWNLINK;\n+\treturn test_pdcp_proto_SGL(i, OUT_OF_PLACE,\n+\t\t\tRTE_CRYPTO_CIPHER_OP_ENCRYPT,\n+\t\t\tRTE_CRYPTO_AUTH_OP_GENERATE,\n+\t\t\tpdcp_test_data_in[i],\n+\t\t\tpdcp_test_data_in_len[i],\n+\t\t\tpdcp_test_data_out[i],\n+\t\t\tpdcp_test_data_in_len[i]+4,\n+\t\t\t128, 32);\n }\n+#endif\n \n static int\n-test_auth_null_cipher_zuc_test_case_1(void)\n+test_AES_GCM_authenticated_encryption_test_case_1(void)\n {\n-\treturn test_mixed_auth_cipher(\n-\t\t&auth_null_cipher_zuc_test_case_1, OUT_OF_PLACE, 0);\n+\treturn test_authenticated_encryption(&gcm_test_case_1);\n }\n \n static int\n-test_verify_auth_null_cipher_zuc_test_case_1(void)\n+test_AES_GCM_authenticated_encryption_test_case_2(void)\n {\n-\treturn test_mixed_auth_cipher(\n-\t\t&auth_null_cipher_zuc_test_case_1, OUT_OF_PLACE, 1);\n+\treturn test_authenticated_encryption(&gcm_test_case_2);\n }\n \n static int\n-test_auth_snow_cipher_null_test_case_1(void)\n+test_AES_GCM_authenticated_encryption_test_case_3(void)\n {\n-\treturn test_mixed_auth_cipher(\n-\t\t&auth_snow_cipher_null_test_case_1, OUT_OF_PLACE, 0);\n+\treturn test_authenticated_encryption(&gcm_test_case_3);\n }\n \n static int\n-test_verify_auth_snow_cipher_null_test_case_1(void)\n+test_AES_GCM_authenticated_encryption_test_case_4(void)\n {\n-\treturn test_mixed_auth_cipher(\n-\t\t&auth_snow_cipher_null_test_case_1, OUT_OF_PLACE, 1);\n+\treturn test_authenticated_encryption(&gcm_test_case_4);\n }\n \n static int\n-test_auth_zuc_cipher_null_test_case_1(void)\n+test_AES_GCM_authenticated_encryption_test_case_5(void)\n {\n-\treturn test_mixed_auth_cipher(\n-\t\t&auth_zuc_cipher_null_test_case_1, OUT_OF_PLACE, 0);\n+\treturn test_authenticated_encryption(&gcm_test_case_5);\n }\n \n static int\n-test_verify_auth_zuc_cipher_null_test_case_1(void)\n+test_AES_GCM_authenticated_encryption_test_case_6(void)\n {\n-\treturn test_mixed_auth_cipher(\n-\t\t&auth_zuc_cipher_null_test_case_1, OUT_OF_PLACE, 1);\n+\treturn test_authenticated_encryption(&gcm_test_case_6);\n }\n \n static int\n-test_auth_null_cipher_aes_ctr_test_case_1(void)\n+test_AES_GCM_authenticated_encryption_test_case_7(void)\n {\n-\treturn test_mixed_auth_cipher(\n-\t\t&auth_null_cipher_aes_ctr_test_case_1, OUT_OF_PLACE, 0);\n+\treturn test_authenticated_encryption(&gcm_test_case_7);\n }\n \n static int\n-test_verify_auth_null_cipher_aes_ctr_test_case_1(void)\n+test_AES_GCM_authenticated_encryption_test_case_8(void)\n {\n-\treturn test_mixed_auth_cipher(\n-\t\t&auth_null_cipher_aes_ctr_test_case_1, OUT_OF_PLACE, 1);\n+\treturn test_authenticated_encryption(&gcm_test_case_8);\n }\n \n static int\n-test_auth_aes_cmac_cipher_null_test_case_1(void)\n+test_AES_GCM_auth_encryption_test_case_192_1(void)\n {\n-\treturn test_mixed_auth_cipher(\n-\t\t&auth_aes_cmac_cipher_null_test_case_1, OUT_OF_PLACE, 0);\n+\treturn test_authenticated_encryption(&gcm_test_case_192_1);\n }\n \n static int\n-test_verify_auth_aes_cmac_cipher_null_test_case_1(void)\n+test_AES_GCM_auth_encryption_test_case_192_2(void)\n {\n-\treturn test_mixed_auth_cipher(\n-\t\t&auth_aes_cmac_cipher_null_test_case_1, OUT_OF_PLACE, 1);\n+\treturn test_authenticated_encryption(&gcm_test_case_192_2);\n }\n \n static int\n-test_3DES_chain_qat_all(void)\n+test_AES_GCM_auth_encryption_test_case_192_3(void)\n {\n-\tstruct crypto_testsuite_params *ts_params = &testsuite_params;\n-\tint status;\n-\n-\tstatus = test_blockcipher_all_tests(ts_params->mbuf_pool,\n-\t\tts_params->op_mpool,\n-\t\tts_params->session_mpool, ts_params->session_priv_mpool,\n-\t\tts_params->valid_devs[0],\n-\t\trte_cryptodev_driver_id_get(\n-\t\tRTE_STR(CRYPTODEV_NAME_QAT_SYM_PMD)),\n-\t\tBLKCIPHER_3DES_CHAIN_TYPE);\n-\n-\tTEST_ASSERT_EQUAL(status, 0, \"Test failed\");\n-\n-\treturn TEST_SUCCESS;\n+\treturn test_authenticated_encryption(&gcm_test_case_192_3);\n }\n \n static int\n-test_DES_cipheronly_qat_all(void)\n+test_AES_GCM_auth_encryption_test_case_192_4(void)\n {\n-\tstruct crypto_testsuite_params *ts_params = &testsuite_params;\n-\tint status;\n-\n-\tstatus = test_blockcipher_all_tests(ts_params->mbuf_pool,\n-\t\tts_params->op_mpool,\n-\t\tts_params->session_mpool, ts_params->session_priv_mpool,\n-\t\tts_params->valid_devs[0],\n-\t\trte_cryptodev_driver_id_get(\n-\t\tRTE_STR(CRYPTODEV_NAME_QAT_SYM_PMD)),\n-\t\tBLKCIPHER_DES_CIPHERONLY_TYPE);\n-\n-\tTEST_ASSERT_EQUAL(status, 0, \"Test failed\");\n-\n-\treturn TEST_SUCCESS;\n+\treturn test_authenticated_encryption(&gcm_test_case_192_4);\n }\n \n static int\n-test_DES_cipheronly_openssl_all(void)\n+test_AES_GCM_auth_encryption_test_case_192_5(void)\n {\n-\tstruct crypto_testsuite_params *ts_params = &testsuite_params;\n-\tint status;\n-\n-\tstatus = test_blockcipher_all_tests(ts_params->mbuf_pool,\n-\t\tts_params->op_mpool,\n-\t\tts_params->session_mpool, ts_params->session_priv_mpool,\n-\t\tts_params->valid_devs[0],\n-\t\trte_cryptodev_driver_id_get(\n-\t\tRTE_STR(CRYPTODEV_NAME_OPENSSL_PMD)),\n-\t\tBLKCIPHER_DES_CIPHERONLY_TYPE);\n-\n-\tTEST_ASSERT_EQUAL(status, 0, \"Test failed\");\n-\n-\treturn TEST_SUCCESS;\n+\treturn test_authenticated_encryption(&gcm_test_case_192_5);\n }\n \n static int\n-test_DES_docsis_openssl_all(void)\n+test_AES_GCM_auth_encryption_test_case_192_6(void)\n {\n-\tstruct crypto_testsuite_params *ts_params = &testsuite_params;\n-\tint status;\n-\n-\tstatus = test_blockcipher_all_tests(ts_params->mbuf_pool,\n-\t\tts_params->op_mpool,\n-\t\tts_params->session_mpool, ts_params->session_priv_mpool,\n-\t\tts_params->valid_devs[0],\n-\t\trte_cryptodev_driver_id_get(\n-\t\tRTE_STR(CRYPTODEV_NAME_OPENSSL_PMD)),\n-\t\tBLKCIPHER_DES_DOCSIS_TYPE);\n-\n-\tTEST_ASSERT_EQUAL(status, 0, \"Test failed\");\n-\n-\treturn TEST_SUCCESS;\n+\treturn test_authenticated_encryption(&gcm_test_case_192_6);\n }\n \n static int\n-test_DES_cipheronly_mb_all(void)\n+test_AES_GCM_auth_encryption_test_case_192_7(void)\n {\n-\tstruct crypto_testsuite_params *ts_params = &testsuite_params;\n-\tint status;\n-\n-\tstatus = test_blockcipher_all_tests(ts_params->mbuf_pool,\n-\t\tts_params->op_mpool,\n-\t\tts_params->session_mpool, ts_params->session_priv_mpool,\n-\t\tts_params->valid_devs[0],\n-\t\trte_cryptodev_driver_id_get(\n-\t\tRTE_STR(CRYPTODEV_NAME_AESNI_MB_PMD)),\n-\t\tBLKCIPHER_DES_CIPHERONLY_TYPE);\n-\n-\tTEST_ASSERT_EQUAL(status, 0, \"Test failed\");\n-\n-\treturn TEST_SUCCESS;\n+\treturn test_authenticated_encryption(&gcm_test_case_192_7);\n }\n+\n static int\n-test_3DES_cipheronly_mb_all(void)\n+test_AES_GCM_auth_encryption_test_case_256_1(void)\n {\n-\tstruct crypto_testsuite_params *ts_params = &testsuite_params;\n-\tint status;\n-\n-\tstatus = test_blockcipher_all_tests(ts_params->mbuf_pool,\n-\t\tts_params->op_mpool,\n-\t\tts_params->session_mpool, ts_params->session_priv_mpool,\n-\t\tts_params->valid_devs[0],\n-\t\trte_cryptodev_driver_id_get(\n-\t\tRTE_STR(CRYPTODEV_NAME_AESNI_MB_PMD)),\n-\t\tBLKCIPHER_3DES_CIPHERONLY_TYPE);\n-\n-\tTEST_ASSERT_EQUAL(status, 0, \"Test failed\");\n-\n-\treturn TEST_SUCCESS;\n+\treturn test_authenticated_encryption(&gcm_test_case_256_1);\n }\n \n static int\n-test_DES_docsis_mb_all(void)\n+test_AES_GCM_auth_encryption_test_case_256_2(void)\n {\n-\tstruct crypto_testsuite_params *ts_params = &testsuite_params;\n-\tint status;\n-\n-\tstatus = test_blockcipher_all_tests(ts_params->mbuf_pool,\n-\t\tts_params->op_mpool,\n-\t\tts_params->session_mpool, ts_params->session_priv_mpool,\n-\t\tts_params->valid_devs[0],\n-\t\trte_cryptodev_driver_id_get(\n-\t\tRTE_STR(CRYPTODEV_NAME_AESNI_MB_PMD)),\n-\t\tBLKCIPHER_DES_DOCSIS_TYPE);\n-\n-\tTEST_ASSERT_EQUAL(status, 0, \"Test failed\");\n-\n-\treturn TEST_SUCCESS;\n+\treturn test_authenticated_encryption(&gcm_test_case_256_2);\n }\n \n static int\n-test_3DES_chain_caam_jr_all(void)\n+test_AES_GCM_auth_encryption_test_case_256_3(void)\n {\n-\tstruct crypto_testsuite_params *ts_params = &testsuite_params;\n-\tint status;\n-\n-\tstatus = test_blockcipher_all_tests(ts_params->mbuf_pool,\n-\t\tts_params->op_mpool,\n-\t\tts_params->session_mpool, ts_params->session_priv_mpool,\n-\t\tts_params->valid_devs[0],\n-\t\trte_cryptodev_driver_id_get(\n-\t\tRTE_STR(CRYPTODEV_NAME_CAAM_JR_PMD)),\n-\t\tBLKCIPHER_3DES_CHAIN_TYPE);\n-\n-\tTEST_ASSERT_EQUAL(status, 0, \"Test failed\");\n-\n-\treturn TEST_SUCCESS;\n+\treturn test_authenticated_encryption(&gcm_test_case_256_3);\n }\n \n static int\n-test_3DES_cipheronly_caam_jr_all(void)\n+test_AES_GCM_auth_encryption_test_case_256_4(void)\n {\n-\tstruct crypto_testsuite_params *ts_params = &testsuite_params;\n-\tint status;\n-\n-\tstatus = test_blockcipher_all_tests(ts_params->mbuf_pool,\n-\t\tts_params->op_mpool,\n-\t\tts_params->session_mpool, ts_params->session_priv_mpool,\n-\t\tts_params->valid_devs[0],\n-\t\trte_cryptodev_driver_id_get(\n-\t\tRTE_STR(CRYPTODEV_NAME_CAAM_JR_PMD)),\n-\t\tBLKCIPHER_3DES_CIPHERONLY_TYPE);\n-\n-\tTEST_ASSERT_EQUAL(status, 0, \"Test failed\");\n-\n-\treturn TEST_SUCCESS;\n+\treturn test_authenticated_encryption(&gcm_test_case_256_4);\n }\n \n static int\n-test_3DES_chain_dpaa_sec_all(void)\n+test_AES_GCM_auth_encryption_test_case_256_5(void)\n {\n-\tstruct crypto_testsuite_params *ts_params = &testsuite_params;\n-\tint status;\n-\n-\tstatus = test_blockcipher_all_tests(ts_params->mbuf_pool,\n-\t\tts_params->op_mpool,\n-\t\tts_params->session_mpool, ts_params->session_priv_mpool,\n-\t\tts_params->valid_devs[0],\n-\t\trte_cryptodev_driver_id_get(\n-\t\tRTE_STR(CRYPTODEV_NAME_DPAA_SEC_PMD)),\n-\t\tBLKCIPHER_3DES_CHAIN_TYPE);\n-\n-\tTEST_ASSERT_EQUAL(status, 0, \"Test failed\");\n+\treturn test_authenticated_encryption(&gcm_test_case_256_5);\n+}\n \n-\treturn TEST_SUCCESS;\n+static int\n+test_AES_GCM_auth_encryption_test_case_256_6(void)\n+{\n+\treturn test_authenticated_encryption(&gcm_test_case_256_6);\n }\n \n static int\n-test_3DES_cipheronly_dpaa_sec_all(void)\n+test_AES_GCM_auth_encryption_test_case_256_7(void)\n {\n-\tstruct crypto_testsuite_params *ts_params = &testsuite_params;\n-\tint status;\n+\treturn test_authenticated_encryption(&gcm_test_case_256_7);\n+}\n \n-\tstatus = test_blockcipher_all_tests(ts_params->mbuf_pool,\n-\t\tts_params->op_mpool,\n-\t\tts_params->session_mpool, ts_params->session_priv_mpool,\n-\t\tts_params->valid_devs[0],\n-\t\trte_cryptodev_driver_id_get(\n-\t\tRTE_STR(CRYPTODEV_NAME_DPAA_SEC_PMD)),\n-\t\tBLKCIPHER_3DES_CIPHERONLY_TYPE);\n-\n-\tTEST_ASSERT_EQUAL(status, 0, \"Test failed\");\n-\n-\treturn TEST_SUCCESS;\n+static int\n+test_AES_GCM_auth_encryption_test_case_aad_1(void)\n+{\n+\treturn test_authenticated_encryption(&gcm_test_case_aad_1);\n }\n \n static int\n-test_3DES_chain_dpaa2_sec_all(void)\n+test_AES_GCM_auth_encryption_test_case_aad_2(void)\n {\n-\tstruct crypto_testsuite_params *ts_params = &testsuite_params;\n-\tint status;\n-\n-\tstatus = test_blockcipher_all_tests(ts_params->mbuf_pool,\n-\t\tts_params->op_mpool,\n-\t\tts_params->session_mpool, ts_params->session_priv_mpool,\n-\t\tts_params->valid_devs[0],\n-\t\trte_cryptodev_driver_id_get(\n-\t\tRTE_STR(CRYPTODEV_NAME_DPAA2_SEC_PMD)),\n-\t\tBLKCIPHER_3DES_CHAIN_TYPE);\n+\treturn test_authenticated_encryption(&gcm_test_case_aad_2);\n+}\n \n-\tTEST_ASSERT_EQUAL(status, 0, \"Test failed\");\n+static int\n+test_AES_GCM_auth_encryption_fail_iv_corrupt(void)\n+{\n+\tstruct aead_test_data tdata;\n+\tint res;\n \n+\tRTE_LOG(INFO, USER1, \"This is a negative test, errors are expected\\n\");\n+\tmemcpy(&tdata, &gcm_test_case_7, sizeof(struct aead_test_data));\n+\ttdata.iv.data[0] += 1;\n+\tres = test_authenticated_encryption(&tdata);\n+\tif (res == -ENOTSUP)\n+\t\treturn res;\n+\tTEST_ASSERT_EQUAL(res, TEST_FAILED, \"encryption not failed\");\n \treturn TEST_SUCCESS;\n }\n \n static int\n-test_3DES_cipheronly_dpaa2_sec_all(void)\n+test_AES_GCM_auth_encryption_fail_in_data_corrupt(void)\n {\n-\tstruct crypto_testsuite_params *ts_params = &testsuite_params;\n-\tint status;\n-\n-\tstatus = test_blockcipher_all_tests(ts_params->mbuf_pool,\n-\t\tts_params->op_mpool,\n-\t\tts_params->session_mpool, ts_params->session_priv_mpool,\n-\t\tts_params->valid_devs[0],\n-\t\trte_cryptodev_driver_id_get(\n-\t\tRTE_STR(CRYPTODEV_NAME_DPAA2_SEC_PMD)),\n-\t\tBLKCIPHER_3DES_CIPHERONLY_TYPE);\n-\n-\tTEST_ASSERT_EQUAL(status, 0, \"Test failed\");\n+\tstruct aead_test_data tdata;\n+\tint res;\n \n+\tRTE_LOG(INFO, USER1, \"This is a negative test, errors are expected\\n\");\n+\tmemcpy(&tdata, &gcm_test_case_7, sizeof(struct aead_test_data));\n+\ttdata.plaintext.data[0] += 1;\n+\tres = test_authenticated_encryption(&tdata);\n+\tif (res == -ENOTSUP)\n+\t\treturn res;\n+\tTEST_ASSERT_EQUAL(res, TEST_FAILED, \"encryption not failed\");\n \treturn TEST_SUCCESS;\n }\n \n static int\n-test_3DES_chain_ccp_all(void)\n+test_AES_GCM_auth_encryption_fail_out_data_corrupt(void)\n {\n-\tstruct crypto_testsuite_params *ts_params = &testsuite_params;\n-\tint status;\n-\n-\tstatus = test_blockcipher_all_tests(ts_params->mbuf_pool,\n-\t\tts_params->op_mpool,\n-\t\tts_params->session_mpool, ts_params->session_priv_mpool,\n-\t\tts_params->valid_devs[0],\n-\t\trte_cryptodev_driver_id_get(\n-\t\tRTE_STR(CRYPTODEV_NAME_CCP_PMD)),\n-\t\tBLKCIPHER_3DES_CHAIN_TYPE);\n-\n-\tTEST_ASSERT_EQUAL(status, 0, \"Test failed\");\n+\tstruct aead_test_data tdata;\n+\tint res;\n \n+\tRTE_LOG(INFO, USER1, \"This is a negative test, errors are expected\\n\");\n+\tmemcpy(&tdata, &gcm_test_case_7, sizeof(struct aead_test_data));\n+\ttdata.ciphertext.data[0] += 1;\n+\tres = test_authenticated_encryption(&tdata);\n+\tif (res == -ENOTSUP)\n+\t\treturn res;\n+\tTEST_ASSERT_EQUAL(res, TEST_FAILED, \"encryption not failed\");\n \treturn TEST_SUCCESS;\n }\n \n static int\n-test_3DES_cipheronly_ccp_all(void)\n+test_AES_GCM_auth_encryption_fail_aad_len_corrupt(void)\n {\n-\tstruct crypto_testsuite_params *ts_params = &testsuite_params;\n-\tint status;\n-\n-\tstatus = test_blockcipher_all_tests(ts_params->mbuf_pool,\n-\t\tts_params->op_mpool,\n-\t\tts_params->session_mpool, ts_params->session_priv_mpool,\n-\t\tts_params->valid_devs[0],\n-\t\trte_cryptodev_driver_id_get(\n-\t\tRTE_STR(CRYPTODEV_NAME_CCP_PMD)),\n-\t\tBLKCIPHER_3DES_CIPHERONLY_TYPE);\n-\n-\tTEST_ASSERT_EQUAL(status, 0, \"Test failed\");\n+\tstruct aead_test_data tdata;\n+\tint res;\n \n+\tRTE_LOG(INFO, USER1, \"This is a negative test, errors are expected\\n\");\n+\tmemcpy(&tdata, &gcm_test_case_7, sizeof(struct aead_test_data));\n+\ttdata.aad.len += 1;\n+\tres = test_authenticated_encryption(&tdata);\n+\tif (res == -ENOTSUP)\n+\t\treturn res;\n+\tTEST_ASSERT_EQUAL(res, TEST_FAILED, \"encryption not failed\");\n \treturn TEST_SUCCESS;\n }\n \n static int\n-test_3DES_cipheronly_qat_all(void)\n+test_AES_GCM_auth_encryption_fail_aad_corrupt(void)\n {\n-\tstruct crypto_testsuite_params *ts_params = &testsuite_params;\n-\tint status;\n-\n-\tstatus = test_blockcipher_all_tests(ts_params->mbuf_pool,\n-\t\tts_params->op_mpool,\n-\t\tts_params->session_mpool, ts_params->session_priv_mpool,\n-\t\tts_params->valid_devs[0],\n-\t\trte_cryptodev_driver_id_get(\n-\t\tRTE_STR(CRYPTODEV_NAME_QAT_SYM_PMD)),\n-\t\tBLKCIPHER_3DES_CIPHERONLY_TYPE);\n-\n-\tTEST_ASSERT_EQUAL(status, 0, \"Test failed\");\n+\tstruct aead_test_data tdata;\n+\tuint8_t aad[gcm_test_case_7.aad.len];\n+\tint res;\n \n+\tRTE_LOG(INFO, USER1, \"This is a negative test, errors are expected\\n\");\n+\tmemcpy(&tdata, &gcm_test_case_7, sizeof(struct aead_test_data));\n+\tmemcpy(aad, gcm_test_case_7.aad.data, gcm_test_case_7.aad.len);\n+\taad[0] += 1;\n+\ttdata.aad.data = aad;\n+\tres = test_authenticated_encryption(&tdata);\n+\tif (res == -ENOTSUP)\n+\t\treturn res;\n+\tTEST_ASSERT_EQUAL(res, TEST_FAILED, \"encryption not failed\");\n \treturn TEST_SUCCESS;\n }\n \n static int\n-test_3DES_chain_openssl_all(void)\n+test_AES_GCM_auth_encryption_fail_tag_corrupt(void)\n {\n-\tstruct crypto_testsuite_params *ts_params = &testsuite_params;\n-\tint status;\n-\n-\tstatus = test_blockcipher_all_tests(ts_params->mbuf_pool,\n-\t\tts_params->op_mpool,\n-\t\tts_params->session_mpool, ts_params->session_priv_mpool,\n-\t\tts_params->valid_devs[0],\n-\t\trte_cryptodev_driver_id_get(\n-\t\tRTE_STR(CRYPTODEV_NAME_OPENSSL_PMD)),\n-\t\tBLKCIPHER_3DES_CHAIN_TYPE);\n-\n-\tTEST_ASSERT_EQUAL(status, 0, \"Test failed\");\n+\tstruct aead_test_data tdata;\n+\tint res;\n \n+\tRTE_LOG(INFO, USER1, \"This is a negative test, errors are expected\\n\");\n+\tmemcpy(&tdata, &gcm_test_case_7, sizeof(struct aead_test_data));\n+\ttdata.auth_tag.data[0] += 1;\n+\tres = test_authenticated_encryption(&tdata);\n+\tif (res == -ENOTSUP)\n+\t\treturn res;\n+\tTEST_ASSERT_EQUAL(res, TEST_FAILED, \"encryption not failed\");\n \treturn TEST_SUCCESS;\n }\n \n static int\n-test_3DES_cipheronly_openssl_all(void)\n+test_authenticated_decryption(const struct aead_test_data *tdata)\n {\n \tstruct crypto_testsuite_params *ts_params = &testsuite_params;\n-\tint status;\n+\tstruct crypto_unittest_params *ut_params = &unittest_params;\n \n-\tstatus = test_blockcipher_all_tests(ts_params->mbuf_pool,\n-\t\tts_params->op_mpool,\n-\t\tts_params->session_mpool, ts_params->session_priv_mpool,\n-\t\tts_params->valid_devs[0],\n-\t\trte_cryptodev_driver_id_get(\n-\t\tRTE_STR(CRYPTODEV_NAME_OPENSSL_PMD)),\n-\t\tBLKCIPHER_3DES_CIPHERONLY_TYPE);\n+\tint retval;\n+\tuint8_t *plaintext;\n+\tuint32_t i;\n \n-\tTEST_ASSERT_EQUAL(status, 0, \"Test failed\");\n+\t/* Verify the capabilities */\n+\tstruct rte_cryptodev_sym_capability_idx cap_idx;\n+\tconst struct rte_cryptodev_symmetric_capability *capability;\n+\tcap_idx.type = RTE_CRYPTO_SYM_XFORM_AEAD;\n+\tcap_idx.algo.aead = tdata->algo;\n+\tcapability = rte_cryptodev_sym_capability_get(\n+\t\t\tts_params->valid_devs[0], &cap_idx);\n+\tif (capability == NULL)\n+\t\treturn -ENOTSUP;\n+\tif (rte_cryptodev_sym_capability_check_aead(\n+\t\t\tcapability, tdata->key.len, tdata->auth_tag.len,\n+\t\t\ttdata->aad.len, tdata->iv.len))\n+\t\treturn -ENOTSUP;\n \n-\treturn TEST_SUCCESS;\n-}\n+\t/* Create AEAD session */\n+\tretval = create_aead_session(ts_params->valid_devs[0],\n+\t\t\ttdata->algo,\n+\t\t\tRTE_CRYPTO_AEAD_OP_DECRYPT,\n+\t\t\ttdata->key.data, tdata->key.len,\n+\t\t\ttdata->aad.len, tdata->auth_tag.len,\n+\t\t\ttdata->iv.len);\n+\tif (retval < 0)\n+\t\treturn retval;\n \n-/* ***** AEAD algorithm Tests ***** */\n+\t/* alloc mbuf and set payload */\n+\tif (tdata->aad.len > MBUF_SIZE) {\n+\t\tut_params->ibuf = rte_pktmbuf_alloc(ts_params->large_mbuf_pool);\n+\t\t/* Populate full size of add data */\n+\t\tfor (i = 32; i < MAX_AAD_LENGTH; i += 32)\n+\t\t\tmemcpy(&tdata->aad.data[i], &tdata->aad.data[0], 32);\n+\t} else\n+\t\tut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);\n \n-static int\n-create_aead_session(uint8_t dev_id, enum rte_crypto_aead_algorithm algo,\n-\t\tenum rte_crypto_aead_operation op,\n-\t\tconst uint8_t *key, const uint8_t key_len,\n-\t\tconst uint16_t aad_len, const uint8_t auth_len,\n-\t\tuint8_t iv_len)\n-{\n-\tuint8_t aead_key[key_len];\n+\tmemset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,\n+\t\t\trte_pktmbuf_tailroom(ut_params->ibuf));\n \n-\tstruct crypto_testsuite_params *ts_params = &testsuite_params;\n-\tstruct crypto_unittest_params *ut_params = &unittest_params;\n+\t/* Create AEAD operation */\n+\tretval = create_aead_operation(RTE_CRYPTO_AEAD_OP_DECRYPT, tdata);\n+\tif (retval < 0)\n+\t\treturn retval;\n \n-\tmemcpy(aead_key, key, key_len);\n+\trte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);\n \n-\t/* Setup AEAD Parameters */\n-\tut_params->aead_xform.type = RTE_CRYPTO_SYM_XFORM_AEAD;\n-\tut_params->aead_xform.next = NULL;\n-\tut_params->aead_xform.aead.algo = algo;\n-\tut_params->aead_xform.aead.op = op;\n-\tut_params->aead_xform.aead.key.data = aead_key;\n-\tut_params->aead_xform.aead.key.length = key_len;\n-\tut_params->aead_xform.aead.iv.offset = IV_OFFSET;\n-\tut_params->aead_xform.aead.iv.length = iv_len;\n-\tut_params->aead_xform.aead.digest_length = auth_len;\n-\tut_params->aead_xform.aead.aad_length = aad_len;\n+\tut_params->op->sym->m_src = ut_params->ibuf;\n \n-\tdebug_hexdump(stdout, \"key:\", key, key_len);\n+\t/* Process crypto operation */\n+\tTEST_ASSERT_NOT_NULL(process_crypto_request(ts_params->valid_devs[0],\n+\t\t\tut_params->op), \"failed to process sym crypto op\");\n \n-\t/* Create Crypto session*/\n-\tut_params->sess = rte_cryptodev_sym_session_create(\n-\t\t\tts_params->session_mpool);\n+\tTEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,\n+\t\t\t\"crypto op processing failed\");\n \n-\trte_cryptodev_sym_session_init(dev_id, ut_params->sess,\n-\t\t\t&ut_params->aead_xform,\n-\t\t\tts_params->session_priv_mpool);\n+\tif (ut_params->op->sym->m_dst)\n+\t\tplaintext = rte_pktmbuf_mtod(ut_params->op->sym->m_dst,\n+\t\t\t\tuint8_t *);\n+\telse\n+\t\tplaintext = rte_pktmbuf_mtod_offset(ut_params->op->sym->m_src,\n+\t\t\t\tuint8_t *,\n+\t\t\t\tut_params->op->sym->cipher.data.offset);\n \n-\tTEST_ASSERT_NOT_NULL(ut_params->sess, \"Session creation failed\");\n+\tdebug_hexdump(stdout, \"plaintext:\", plaintext, tdata->ciphertext.len);\n+\n+\t/* Validate obuf */\n+\tTEST_ASSERT_BUFFERS_ARE_EQUAL(\n+\t\t\tplaintext,\n+\t\t\ttdata->plaintext.data,\n+\t\t\ttdata->plaintext.len,\n+\t\t\t\"Plaintext data not as expected\");\n+\n+\tTEST_ASSERT_EQUAL(ut_params->op->status,\n+\t\t\tRTE_CRYPTO_OP_STATUS_SUCCESS,\n+\t\t\t\"Authentication failed\");\n \n \treturn 0;\n }\n \n static int\n-create_aead_xform(struct rte_crypto_op *op,\n-\t\tenum rte_crypto_aead_algorithm algo,\n-\t\tenum rte_crypto_aead_operation aead_op,\n-\t\tuint8_t *key, const uint8_t key_len,\n-\t\tconst uint8_t aad_len, const uint8_t auth_len,\n-\t\tuint8_t iv_len)\n+test_AES_GCM_authenticated_decryption_test_case_1(void)\n {\n-\tTEST_ASSERT_NOT_NULL(rte_crypto_op_sym_xforms_alloc(op, 1),\n-\t\t\t\"failed to allocate space for crypto transform\");\n-\n-\tstruct rte_crypto_sym_op *sym_op = op->sym;\n-\n-\t/* Setup AEAD Parameters */\n-\tsym_op->xform->type = RTE_CRYPTO_SYM_XFORM_AEAD;\n-\tsym_op->xform->next = NULL;\n-\tsym_op->xform->aead.algo = algo;\n-\tsym_op->xform->aead.op = aead_op;\n-\tsym_op->xform->aead.key.data = key;\n-\tsym_op->xform->aead.key.length = key_len;\n-\tsym_op->xform->aead.iv.offset = IV_OFFSET;\n-\tsym_op->xform->aead.iv.length = iv_len;\n-\tsym_op->xform->aead.digest_length = auth_len;\n-\tsym_op->xform->aead.aad_length = aad_len;\n-\n-\tdebug_hexdump(stdout, \"key:\", key, key_len);\n+\treturn test_authenticated_decryption(&gcm_test_case_1);\n+}\n \n-\treturn 0;\n+static int\n+test_AES_GCM_authenticated_decryption_test_case_2(void)\n+{\n+\treturn test_authenticated_decryption(&gcm_test_case_2);\n }\n \n static int\n-create_aead_operation(enum rte_crypto_aead_operation op,\n-\t\tconst struct aead_test_data *tdata)\n+test_AES_GCM_authenticated_decryption_test_case_3(void)\n {\n-\tstruct crypto_testsuite_params *ts_params = &testsuite_params;\n-\tstruct crypto_unittest_params *ut_params = &unittest_params;\n+\treturn test_authenticated_decryption(&gcm_test_case_3);\n+}\n \n-\tuint8_t *plaintext, *ciphertext;\n-\tunsigned int aad_pad_len, plaintext_pad_len;\n+static int\n+test_AES_GCM_authenticated_decryption_test_case_4(void)\n+{\n+\treturn test_authenticated_decryption(&gcm_test_case_4);\n+}\n \n-\t/* Generate Crypto op data structure */\n-\tut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,\n-\t\t\tRTE_CRYPTO_OP_TYPE_SYMMETRIC);\n-\tTEST_ASSERT_NOT_NULL(ut_params->op,\n-\t\t\t\"Failed to allocate symmetric crypto operation struct\");\n+static int\n+test_AES_GCM_authenticated_decryption_test_case_5(void)\n+{\n+\treturn test_authenticated_decryption(&gcm_test_case_5);\n+}\n \n-\tstruct rte_crypto_sym_op *sym_op = ut_params->op->sym;\n+static int\n+test_AES_GCM_authenticated_decryption_test_case_6(void)\n+{\n+\treturn test_authenticated_decryption(&gcm_test_case_6);\n+}\n \n-\t/* Append aad data */\n-\tif (tdata->algo == RTE_CRYPTO_AEAD_AES_CCM) {\n-\t\taad_pad_len = RTE_ALIGN_CEIL(tdata->aad.len + 18, 16);\n-\t\tsym_op->aead.aad.data = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,\n-\t\t\t\taad_pad_len);\n-\t\tTEST_ASSERT_NOT_NULL(sym_op->aead.aad.data,\n-\t\t\t\t\"no room to append aad\");\n+static int\n+test_AES_GCM_authenticated_decryption_test_case_7(void)\n+{\n+\treturn test_authenticated_decryption(&gcm_test_case_7);\n+}\n \n-\t\tsym_op->aead.aad.phys_addr =\n-\t\t\t\trte_pktmbuf_iova(ut_params->ibuf);\n-\t\t/* Copy AAD 18 bytes after the AAD pointer, according to the API */\n-\t\tmemcpy(sym_op->aead.aad.data + 18, tdata->aad.data, tdata->aad.len);\n-\t\tdebug_hexdump(stdout, \"aad:\", sym_op->aead.aad.data,\n-\t\t\ttdata->aad.len);\n+static int\n+test_AES_GCM_authenticated_decryption_test_case_8(void)\n+{\n+\treturn test_authenticated_decryption(&gcm_test_case_8);\n+}\n \n-\t\t/* Append IV at the end of the crypto operation*/\n-\t\tuint8_t *iv_ptr = rte_crypto_op_ctod_offset(ut_params->op,\n-\t\t\t\tuint8_t *, IV_OFFSET);\n+static int\n+test_AES_GCM_auth_decryption_test_case_192_1(void)\n+{\n+\treturn test_authenticated_decryption(&gcm_test_case_192_1);\n+}\n \n-\t\t/* Copy IV 1 byte after the IV pointer, according to the API */\n-\t\trte_memcpy(iv_ptr + 1, tdata->iv.data, tdata->iv.len);\n-\t\tdebug_hexdump(stdout, \"iv:\", iv_ptr,\n-\t\t\ttdata->iv.len);\n-\t} else {\n-\t\taad_pad_len = RTE_ALIGN_CEIL(tdata->aad.len, 16);\n-\t\tsym_op->aead.aad.data = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,\n-\t\t\t\taad_pad_len);\n-\t\tTEST_ASSERT_NOT_NULL(sym_op->aead.aad.data,\n-\t\t\t\t\"no room to append aad\");\n+static int\n+test_AES_GCM_auth_decryption_test_case_192_2(void)\n+{\n+\treturn test_authenticated_decryption(&gcm_test_case_192_2);\n+}\n \n-\t\tsym_op->aead.aad.phys_addr =\n-\t\t\t\trte_pktmbuf_iova(ut_params->ibuf);\n-\t\tmemcpy(sym_op->aead.aad.data, tdata->aad.data, tdata->aad.len);\n-\t\tdebug_hexdump(stdout, \"aad:\", sym_op->aead.aad.data,\n-\t\t\ttdata->aad.len);\n+static int\n+test_AES_GCM_auth_decryption_test_case_192_3(void)\n+{\n+\treturn test_authenticated_decryption(&gcm_test_case_192_3);\n+}\n \n-\t\t/* Append IV at the end of the crypto operation*/\n-\t\tuint8_t *iv_ptr = rte_crypto_op_ctod_offset(ut_params->op,\n-\t\t\t\tuint8_t *, IV_OFFSET);\n+static int\n+test_AES_GCM_auth_decryption_test_case_192_4(void)\n+{\n+\treturn test_authenticated_decryption(&gcm_test_case_192_4);\n+}\n \n-\t\trte_memcpy(iv_ptr, tdata->iv.data, tdata->iv.len);\n-\t\tdebug_hexdump(stdout, \"iv:\", iv_ptr,\n-\t\t\ttdata->iv.len);\n-\t}\n+static int\n+test_AES_GCM_auth_decryption_test_case_192_5(void)\n+{\n+\treturn test_authenticated_decryption(&gcm_test_case_192_5);\n+}\n \n-\t/* Append plaintext/ciphertext */\n-\tif (op == RTE_CRYPTO_AEAD_OP_ENCRYPT) {\n-\t\tplaintext_pad_len = RTE_ALIGN_CEIL(tdata->plaintext.len, 16);\n-\t\tplaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,\n-\t\t\t\tplaintext_pad_len);\n-\t\tTEST_ASSERT_NOT_NULL(plaintext, \"no room to append plaintext\");\n+static int\n+test_AES_GCM_auth_decryption_test_case_192_6(void)\n+{\n+\treturn test_authenticated_decryption(&gcm_test_case_192_6);\n+}\n \n-\t\tmemcpy(plaintext, tdata->plaintext.data, tdata->plaintext.len);\n-\t\tdebug_hexdump(stdout, \"plaintext:\", plaintext,\n-\t\t\t\ttdata->plaintext.len);\n+static int\n+test_AES_GCM_auth_decryption_test_case_192_7(void)\n+{\n+\treturn test_authenticated_decryption(&gcm_test_case_192_7);\n+}\n \n-\t\tif (ut_params->obuf) {\n-\t\t\tciphertext = (uint8_t *)rte_pktmbuf_append(\n-\t\t\t\t\tut_params->obuf,\n-\t\t\t\t\tplaintext_pad_len + aad_pad_len);\n-\t\t\tTEST_ASSERT_NOT_NULL(ciphertext,\n-\t\t\t\t\t\"no room to append ciphertext\");\n+static int\n+test_AES_GCM_auth_decryption_test_case_256_1(void)\n+{\n+\treturn test_authenticated_decryption(&gcm_test_case_256_1);\n+}\n \n-\t\t\tmemset(ciphertext + aad_pad_len, 0,\n-\t\t\t\t\ttdata->ciphertext.len);\n-\t\t}\n-\t} else {\n-\t\tplaintext_pad_len = RTE_ALIGN_CEIL(tdata->ciphertext.len, 16);\n-\t\tciphertext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,\n-\t\t\t\tplaintext_pad_len);\n-\t\tTEST_ASSERT_NOT_NULL(ciphertext,\n-\t\t\t\t\"no room to append ciphertext\");\n+static int\n+test_AES_GCM_auth_decryption_test_case_256_2(void)\n+{\n+\treturn test_authenticated_decryption(&gcm_test_case_256_2);\n+}\n \n-\t\tmemcpy(ciphertext, tdata->ciphertext.data,\n-\t\t\t\ttdata->ciphertext.len);\n-\t\tdebug_hexdump(stdout, \"ciphertext:\", ciphertext,\n-\t\t\t\ttdata->ciphertext.len);\n+static int\n+test_AES_GCM_auth_decryption_test_case_256_3(void)\n+{\n+\treturn test_authenticated_decryption(&gcm_test_case_256_3);\n+}\n \n-\t\tif (ut_params->obuf) {\n-\t\t\tplaintext = (uint8_t *)rte_pktmbuf_append(\n-\t\t\t\t\tut_params->obuf,\n-\t\t\t\t\tplaintext_pad_len + aad_pad_len);\n-\t\t\tTEST_ASSERT_NOT_NULL(plaintext,\n-\t\t\t\t\t\"no room to append plaintext\");\n+static int\n+test_AES_GCM_auth_decryption_test_case_256_4(void)\n+{\n+\treturn test_authenticated_decryption(&gcm_test_case_256_4);\n+}\n \n-\t\t\tmemset(plaintext + aad_pad_len, 0,\n-\t\t\t\t\ttdata->plaintext.len);\n-\t\t}\n-\t}\n+static int\n+test_AES_GCM_auth_decryption_test_case_256_5(void)\n+{\n+\treturn test_authenticated_decryption(&gcm_test_case_256_5);\n+}\n \n-\t/* Append digest data */\n-\tif (op == RTE_CRYPTO_AEAD_OP_ENCRYPT) {\n-\t\tsym_op->aead.digest.data = (uint8_t *)rte_pktmbuf_append(\n-\t\t\t\tut_params->obuf ? ut_params->obuf :\n-\t\t\t\t\t\tut_params->ibuf,\n-\t\t\t\t\t\ttdata->auth_tag.len);\n-\t\tTEST_ASSERT_NOT_NULL(sym_op->aead.digest.data,\n-\t\t\t\t\"no room to append digest\");\n-\t\tmemset(sym_op->aead.digest.data, 0, tdata->auth_tag.len);\n-\t\tsym_op->aead.digest.phys_addr = rte_pktmbuf_iova_offset(\n-\t\t\t\tut_params->obuf ? ut_params->obuf :\n-\t\t\t\t\t\tut_params->ibuf,\n-\t\t\t\t\t\tplaintext_pad_len +\n-\t\t\t\t\t\taad_pad_len);\n-\t} else {\n-\t\tsym_op->aead.digest.data = (uint8_t *)rte_pktmbuf_append(\n-\t\t\t\tut_params->ibuf, tdata->auth_tag.len);\n-\t\tTEST_ASSERT_NOT_NULL(sym_op->aead.digest.data,\n-\t\t\t\t\"no room to append digest\");\n-\t\tsym_op->aead.digest.phys_addr = rte_pktmbuf_iova_offset(\n-\t\t\t\tut_params->ibuf,\n-\t\t\t\tplaintext_pad_len + aad_pad_len);\n+static int\n+test_AES_GCM_auth_decryption_test_case_256_6(void)\n+{\n+\treturn test_authenticated_decryption(&gcm_test_case_256_6);\n+}\n \n-\t\trte_memcpy(sym_op->aead.digest.data, tdata->auth_tag.data,\n-\t\t\ttdata->auth_tag.len);\n-\t\tdebug_hexdump(stdout, \"digest:\",\n-\t\t\tsym_op->aead.digest.data,\n-\t\t\ttdata->auth_tag.len);\n-\t}\n+static int\n+test_AES_GCM_auth_decryption_test_case_256_7(void)\n+{\n+\treturn test_authenticated_decryption(&gcm_test_case_256_7);\n+}\n \n-\tsym_op->aead.data.length = tdata->plaintext.len;\n-\tsym_op->aead.data.offset = aad_pad_len;\n+static int\n+test_AES_GCM_auth_decryption_test_case_aad_1(void)\n+{\n+\treturn test_authenticated_decryption(&gcm_test_case_aad_1);\n+}\n \n-\treturn 0;\n+static int\n+test_AES_GCM_auth_decryption_test_case_aad_2(void)\n+{\n+\treturn test_authenticated_decryption(&gcm_test_case_aad_2);\n }\n \n static int\n-test_authenticated_encryption(const struct aead_test_data *tdata)\n+test_AES_GCM_auth_decryption_fail_iv_corrupt(void)\n {\n-\tstruct crypto_testsuite_params *ts_params = &testsuite_params;\n-\tstruct crypto_unittest_params *ut_params = &unittest_params;\n+\tstruct aead_test_data tdata;\n+\tint res;\n \n-\tint retval;\n-\tuint8_t *ciphertext, *auth_tag;\n-\tuint16_t plaintext_pad_len;\n-\tuint32_t i;\n+\tmemcpy(&tdata, &gcm_test_case_7, sizeof(struct aead_test_data));\n+\ttdata.iv.data[0] += 1;\n+\tres = test_authenticated_decryption(&tdata);\n+\tif (res == -ENOTSUP)\n+\t\treturn res;\n+\tTEST_ASSERT_EQUAL(res, TEST_FAILED, \"decryption not failed\");\n+\treturn TEST_SUCCESS;\n+}\n \n-\t/* Create AEAD session */\n-\tretval = create_aead_session(ts_params->valid_devs[0],\n-\t\t\ttdata->algo,\n-\t\t\tRTE_CRYPTO_AEAD_OP_ENCRYPT,\n-\t\t\ttdata->key.data, tdata->key.len,\n-\t\t\ttdata->aad.len, tdata->auth_tag.len,\n-\t\t\ttdata->iv.len);\n-\tif (retval < 0)\n-\t\treturn retval;\n+static int\n+test_AES_GCM_auth_decryption_fail_in_data_corrupt(void)\n+{\n+\tstruct aead_test_data tdata;\n+\tint res;\n \n-\tif (tdata->aad.len > MBUF_SIZE) {\n-\t\tut_params->ibuf = rte_pktmbuf_alloc(ts_params->large_mbuf_pool);\n-\t\t/* Populate full size of add data */\n-\t\tfor (i = 32; i < MAX_AAD_LENGTH; i += 32)\n-\t\t\tmemcpy(&tdata->aad.data[i], &tdata->aad.data[0], 32);\n-\t} else\n-\t\tut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);\n+\tRTE_LOG(INFO, USER1, \"This is a negative test, errors are expected\\n\");\n+\tmemcpy(&tdata, &gcm_test_case_7, sizeof(struct aead_test_data));\n+\ttdata.plaintext.data[0] += 1;\n+\tres = test_authenticated_decryption(&tdata);\n+\tif (res == -ENOTSUP)\n+\t\treturn res;\n+\tTEST_ASSERT_EQUAL(res, TEST_FAILED, \"decryption not failed\");\n+\treturn TEST_SUCCESS;\n+}\n+\n+static int\n+test_AES_GCM_auth_decryption_fail_out_data_corrupt(void)\n+{\n+\tstruct aead_test_data tdata;\n+\tint res;\n+\n+\tmemcpy(&tdata, &gcm_test_case_7, sizeof(struct aead_test_data));\n+\ttdata.ciphertext.data[0] += 1;\n+\tres = test_authenticated_decryption(&tdata);\n+\tif (res == -ENOTSUP)\n+\t\treturn res;\n+\tTEST_ASSERT_EQUAL(res, TEST_FAILED, \"decryption not failed\");\n+\treturn TEST_SUCCESS;\n+}\n+\n+static int\n+test_AES_GCM_auth_decryption_fail_aad_len_corrupt(void)\n+{\n+\tstruct aead_test_data tdata;\n+\tint res;\n+\n+\tmemcpy(&tdata, &gcm_test_case_7, sizeof(struct aead_test_data));\n+\ttdata.aad.len += 1;\n+\tres = test_authenticated_decryption(&tdata);\n+\tif (res == -ENOTSUP)\n+\t\treturn res;\n+\tTEST_ASSERT_EQUAL(res, TEST_FAILED, \"decryption not failed\");\n+\treturn TEST_SUCCESS;\n+}\n+\n+static int\n+test_AES_GCM_auth_decryption_fail_aad_corrupt(void)\n+{\n+\tstruct aead_test_data tdata;\n+\tuint8_t aad[gcm_test_case_7.aad.len];\n+\tint res;\n+\n+\tmemcpy(&tdata, &gcm_test_case_7, sizeof(struct aead_test_data));\n+\tmemcpy(aad, gcm_test_case_7.aad.data, gcm_test_case_7.aad.len);\n+\taad[0] += 1;\n+\ttdata.aad.data = aad;\n+\tres = test_authenticated_decryption(&tdata);\n+\tif (res == -ENOTSUP)\n+\t\treturn res;\n+\tTEST_ASSERT_EQUAL(res, TEST_FAILED, \"decryption not failed\");\n+\treturn TEST_SUCCESS;\n+}\n+\n+static int\n+test_AES_GCM_auth_decryption_fail_tag_corrupt(void)\n+{\n+\tstruct aead_test_data tdata;\n+\tint res;\n+\n+\tmemcpy(&tdata, &gcm_test_case_7, sizeof(struct aead_test_data));\n+\ttdata.auth_tag.data[0] += 1;\n+\tres = test_authenticated_decryption(&tdata);\n+\tif (res == -ENOTSUP)\n+\t\treturn res;\n+\tTEST_ASSERT_EQUAL(res, TEST_FAILED, \"authentication not failed\");\n+\treturn TEST_SUCCESS;\n+}\n+\n+static int\n+test_authenticated_encryption_oop(const struct aead_test_data *tdata)\n+{\n+\tstruct crypto_testsuite_params *ts_params = &testsuite_params;\n+\tstruct crypto_unittest_params *ut_params = &unittest_params;\n+\n+\tint retval;\n+\tuint8_t *ciphertext, *auth_tag;\n+\tuint16_t plaintext_pad_len;\n+\n+\t/* Verify the capabilities */\n+\tstruct rte_cryptodev_sym_capability_idx cap_idx;\n+\tcap_idx.type = RTE_CRYPTO_SYM_XFORM_AEAD;\n+\tcap_idx.algo.aead = tdata->algo;\n+\tif (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],\n+\t\t\t&cap_idx) == NULL)\n+\t\treturn -ENOTSUP;\n+\n+\t/* Create AEAD session */\n+\tretval = create_aead_session(ts_params->valid_devs[0],\n+\t\t\ttdata->algo,\n+\t\t\tRTE_CRYPTO_AEAD_OP_ENCRYPT,\n+\t\t\ttdata->key.data, tdata->key.len,\n+\t\t\ttdata->aad.len, tdata->auth_tag.len,\n+\t\t\ttdata->iv.len);\n+\tif (retval < 0)\n+\t\treturn retval;\n+\n+\tut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);\n+\tut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);\n \n \t/* clear mbuf payload */\n \tmemset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,\n \t\t\trte_pktmbuf_tailroom(ut_params->ibuf));\n+\tmemset(rte_pktmbuf_mtod(ut_params->obuf, uint8_t *), 0,\n+\t\t\trte_pktmbuf_tailroom(ut_params->obuf));\n \n \t/* Create AEAD operation */\n \tretval = create_aead_operation(RTE_CRYPTO_AEAD_OP_ENCRYPT, tdata);\n@@ -7851,6 +8222,7 @@ test_authenticated_encryption(const struct aead_test_data *tdata)\n \trte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);\n \n \tut_params->op->sym->m_src = ut_params->ibuf;\n+\tut_params->op->sym->m_dst = ut_params->obuf;\n \n \t/* Process crypto operation */\n \tTEST_ASSERT_NOT_NULL(process_crypto_request(ts_params->valid_devs[0],\n@@ -7861,17 +8233,9 @@ test_authenticated_encryption(const struct aead_test_data *tdata)\n \n \tplaintext_pad_len = RTE_ALIGN_CEIL(tdata->plaintext.len, 16);\n \n-\tif (ut_params->op->sym->m_dst) {\n-\t\tciphertext = rte_pktmbuf_mtod(ut_params->op->sym->m_dst,\n-\t\t\t\tuint8_t *);\n-\t\tauth_tag = rte_pktmbuf_mtod_offset(ut_params->op->sym->m_dst,\n-\t\t\t\tuint8_t *, plaintext_pad_len);\n-\t} else {\n-\t\tciphertext = rte_pktmbuf_mtod_offset(ut_params->op->sym->m_src,\n-\t\t\t\tuint8_t *,\n-\t\t\t\tut_params->op->sym->cipher.data.offset);\n-\t\tauth_tag = ciphertext + plaintext_pad_len;\n-\t}\n+\tciphertext = rte_pktmbuf_mtod_offset(ut_params->obuf, uint8_t *,\n+\t\t\tut_params->op->sym->cipher.data.offset);\n+\tauth_tag = ciphertext + plaintext_pad_len;\n \n \tdebug_hexdump(stdout, \"ciphertext:\", ciphertext, tdata->ciphertext.len);\n \tdebug_hexdump(stdout, \"auth tag:\", auth_tag, tdata->auth_tag.len);\n@@ -7893,1713 +8257,1390 @@ test_authenticated_encryption(const struct aead_test_data *tdata)\n \n }\n \n-#ifdef RTE_LIBRTE_SECURITY\n-/* Basic algorithm run function for async inplace mode.\n- * Creates a session from input parameters and runs one operation\n- * on input_vec. Checks the output of the crypto operation against\n- * output_vec.\n- */\n static int\n-test_pdcp_proto(int i, int oop,\n-\tenum rte_crypto_cipher_operation opc,\n-\tenum rte_crypto_auth_operation opa,\n-\tuint8_t *input_vec,\n-\tunsigned int input_vec_len,\n-\tuint8_t *output_vec,\n-\tunsigned int output_vec_len)\n+test_AES_GCM_authenticated_encryption_oop_test_case_1(void)\n+{\n+\treturn test_authenticated_encryption_oop(&gcm_test_case_5);\n+}\n+\n+static int\n+test_authenticated_decryption_oop(const struct aead_test_data *tdata)\n {\n \tstruct crypto_testsuite_params *ts_params = &testsuite_params;\n \tstruct crypto_unittest_params *ut_params = &unittest_params;\n+\n+\tint retval;\n \tuint8_t *plaintext;\n-\tint ret = TEST_SUCCESS;\n \n-\t/* Generate test mbuf data */\n+\t/* Verify the capabilities */\n+\tstruct rte_cryptodev_sym_capability_idx cap_idx;\n+\tcap_idx.type = RTE_CRYPTO_SYM_XFORM_AEAD;\n+\tcap_idx.algo.aead = tdata->algo;\n+\tif (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],\n+\t\t\t&cap_idx) == NULL)\n+\t\treturn -ENOTSUP;\n+\n+\t/* Create AEAD session */\n+\tretval = create_aead_session(ts_params->valid_devs[0],\n+\t\t\ttdata->algo,\n+\t\t\tRTE_CRYPTO_AEAD_OP_DECRYPT,\n+\t\t\ttdata->key.data, tdata->key.len,\n+\t\t\ttdata->aad.len, tdata->auth_tag.len,\n+\t\t\ttdata->iv.len);\n+\tif (retval < 0)\n+\t\treturn retval;\n+\n+\t/* alloc mbuf and set payload */\n \tut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);\n+\tut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);\n \n-\t/* clear mbuf payload */\n \tmemset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,\n \t\t\trte_pktmbuf_tailroom(ut_params->ibuf));\n+\tmemset(rte_pktmbuf_mtod(ut_params->obuf, uint8_t *), 0,\n+\t\t\trte_pktmbuf_tailroom(ut_params->obuf));\n \n-\tplaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,\n-\t\t\t\t\t\t  input_vec_len);\n-\tmemcpy(plaintext, input_vec, input_vec_len);\n+\t/* Create AEAD operation */\n+\tretval = create_aead_operation(RTE_CRYPTO_AEAD_OP_DECRYPT, tdata);\n+\tif (retval < 0)\n+\t\treturn retval;\n \n-\t/* Out of place support */\n-\tif (oop) {\n-\t\t/*\n-\t\t * For out-op-place we need to alloc another mbuf\n-\t\t */\n-\t\tut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);\n-\t\trte_pktmbuf_append(ut_params->obuf, output_vec_len);\n-\t}\n+\trte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);\n \n-\t/* Set crypto type as IPSEC */\n-\tut_params->type = RTE_SECURITY_ACTION_TYPE_LOOKASIDE_PROTOCOL;\n+\tut_params->op->sym->m_src = ut_params->ibuf;\n+\tut_params->op->sym->m_dst = ut_params->obuf;\n \n-\t/* Setup Cipher Parameters */\n-\tut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER;\n-\tut_params->cipher_xform.cipher.algo = pdcp_test_params[i].cipher_alg;\n-\tut_params->cipher_xform.cipher.op = opc;\n-\tut_params->cipher_xform.cipher.key.data = pdcp_test_crypto_key[i];\n-\tut_params->cipher_xform.cipher.key.length =\n-\t\t\t\t\tpdcp_test_params[i].cipher_key_len;\n-\tut_params->cipher_xform.cipher.iv.length = 0;\n+\t/* Process crypto operation */\n+\tTEST_ASSERT_NOT_NULL(process_crypto_request(ts_params->valid_devs[0],\n+\t\t\tut_params->op), \"failed to process sym crypto op\");\n \n-\t/* Setup HMAC Parameters if ICV header is required */\n-\tif (pdcp_test_params[i].auth_alg != 0) {\n-\t\tut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;\n-\t\tut_params->auth_xform.next = NULL;\n-\t\tut_params->auth_xform.auth.algo = pdcp_test_params[i].auth_alg;\n-\t\tut_params->auth_xform.auth.op = opa;\n-\t\tut_params->auth_xform.auth.key.data = pdcp_test_auth_key[i];\n-\t\tut_params->auth_xform.auth.key.length =\n-\t\t\t\t\tpdcp_test_params[i].auth_key_len;\n+\tTEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,\n+\t\t\t\"crypto op processing failed\");\n \n-\t\tut_params->cipher_xform.next = &ut_params->auth_xform;\n-\t} else {\n-\t\tut_params->cipher_xform.next = NULL;\n-\t}\n+\tplaintext = rte_pktmbuf_mtod_offset(ut_params->obuf, uint8_t *,\n+\t\t\tut_params->op->sym->cipher.data.offset);\n \n-\tstruct rte_security_session_conf sess_conf = {\n-\t\t.action_type = RTE_SECURITY_ACTION_TYPE_LOOKASIDE_PROTOCOL,\n-\t\t.protocol = RTE_SECURITY_PROTOCOL_PDCP,\n-\t\t{.pdcp = {\n-\t\t\t.bearer = pdcp_test_bearer[i],\n-\t\t\t.domain = pdcp_test_params[i].domain,\n-\t\t\t.pkt_dir = pdcp_test_packet_direction[i],\n-\t\t\t.sn_size = pdcp_test_data_sn_size[i],\n-\t\t\t.hfn = pdcp_test_hfn[i],\n-\t\t\t.hfn_threshold = pdcp_test_hfn_threshold[i],\n-\t\t} },\n-\t\t.crypto_xform = &ut_params->cipher_xform\n-\t};\n+\tdebug_hexdump(stdout, \"plaintext:\", plaintext, tdata->ciphertext.len);\n \n-\tstruct rte_security_ctx *ctx = (struct rte_security_ctx *)\n-\t\t\t\trte_cryptodev_get_sec_ctx(\n-\t\t\t\tts_params->valid_devs[0]);\n+\t/* Validate obuf */\n+\tTEST_ASSERT_BUFFERS_ARE_EQUAL(\n+\t\t\tplaintext,\n+\t\t\ttdata->plaintext.data,\n+\t\t\ttdata->plaintext.len,\n+\t\t\t\"Plaintext data not as expected\");\n \n-\t/* Create security session */\n-\tut_params->sec_session = rte_security_session_create(ctx,\n-\t\t\t\t&sess_conf, ts_params->session_priv_mpool);\n+\tTEST_ASSERT_EQUAL(ut_params->op->status,\n+\t\t\tRTE_CRYPTO_OP_STATUS_SUCCESS,\n+\t\t\t\"Authentication failed\");\n+\treturn 0;\n+}\n \n-\tif (!ut_params->sec_session) {\n-\t\tprintf(\"TestCase %s()-%d line %d failed %s: \",\n-\t\t\t__func__, i, __LINE__, \"Failed to allocate session\");\n-\t\tret = TEST_FAILED;\n-\t\tgoto on_err;\n-\t}\n+static int\n+test_AES_GCM_authenticated_decryption_oop_test_case_1(void)\n+{\n+\treturn test_authenticated_decryption_oop(&gcm_test_case_5);\n+}\n \n-\t/* Generate crypto op data structure */\n-\tut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,\n-\t\t\tRTE_CRYPTO_OP_TYPE_SYMMETRIC);\n-\tif (!ut_params->op) {\n-\t\tprintf(\"TestCase %s()-%d line %d failed %s: \",\n-\t\t\t__func__, i, __LINE__,\n-\t\t\t\"Failed to allocate symmetric crypto operation struct\");\n-\t\tret = TEST_FAILED;\n-\t\tgoto on_err;\n-\t}\n+static int\n+test_authenticated_encryption_sessionless(\n+\t\tconst struct aead_test_data *tdata)\n+{\n+\tstruct crypto_testsuite_params *ts_params = &testsuite_params;\n+\tstruct crypto_unittest_params *ut_params = &unittest_params;\n \n-\trte_security_attach_session(ut_params->op, ut_params->sec_session);\n+\tint retval;\n+\tuint8_t *ciphertext, *auth_tag;\n+\tuint16_t plaintext_pad_len;\n+\tuint8_t key[tdata->key.len + 1];\n+\n+\t/* This test is for AESNI MB and AESNI GCM PMDs only */\n+\tif ((gbl_driver_id != rte_cryptodev_driver_id_get(\n+\t\t\tRTE_STR(CRYPTODEV_NAME_AESNI_MB_PMD))) &&\n+\t\t\t(gbl_driver_id != rte_cryptodev_driver_id_get(\n+\t\t\t\tRTE_STR(CRYPTODEV_NAME_AESNI_GCM_PMD))))\n+\t\treturn -ENOTSUP;\n+\n+\t/* Verify the capabilities */\n+\tstruct rte_cryptodev_sym_capability_idx cap_idx;\n+\tcap_idx.type = RTE_CRYPTO_SYM_XFORM_AEAD;\n+\tcap_idx.algo.aead = tdata->algo;\n+\tif (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],\n+\t\t\t&cap_idx) == NULL)\n+\t\treturn -ENOTSUP;\n+\n+\tut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);\n+\n+\t/* clear mbuf payload */\n+\tmemset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,\n+\t\t\trte_pktmbuf_tailroom(ut_params->ibuf));\n+\n+\t/* Create AEAD operation */\n+\tretval = create_aead_operation(RTE_CRYPTO_AEAD_OP_ENCRYPT, tdata);\n+\tif (retval < 0)\n+\t\treturn retval;\n+\n+\t/* Create GCM xform */\n+\tmemcpy(key, tdata->key.data, tdata->key.len);\n+\tretval = create_aead_xform(ut_params->op,\n+\t\t\ttdata->algo,\n+\t\t\tRTE_CRYPTO_AEAD_OP_ENCRYPT,\n+\t\t\tkey, tdata->key.len,\n+\t\t\ttdata->aad.len, tdata->auth_tag.len,\n+\t\t\ttdata->iv.len);\n+\tif (retval < 0)\n+\t\treturn retval;\n \n-\t/* set crypto operation source mbuf */\n \tut_params->op->sym->m_src = ut_params->ibuf;\n-\tif (oop)\n-\t\tut_params->op->sym->m_dst = ut_params->obuf;\n+\n+\tTEST_ASSERT_EQUAL(ut_params->op->sess_type,\n+\t\t\tRTE_CRYPTO_OP_SESSIONLESS,\n+\t\t\t\"crypto op session type not sessionless\");\n \n \t/* Process crypto operation */\n-\tif (process_crypto_request(ts_params->valid_devs[0], ut_params->op)\n-\t\t== NULL) {\n-\t\tprintf(\"TestCase %s()-%d line %d failed %s: \",\n-\t\t\t__func__, i, __LINE__,\n-\t\t\t\"failed to process sym crypto op\");\n-\t\tret = TEST_FAILED;\n-\t\tgoto on_err;\n-\t}\n+\tTEST_ASSERT_NOT_NULL(process_crypto_request(ts_params->valid_devs[0],\n+\t\t\tut_params->op), \"failed to process sym crypto op\");\n \n-\tif (ut_params->op->status != RTE_CRYPTO_OP_STATUS_SUCCESS) {\n-\t\tprintf(\"TestCase %s()-%d line %d failed %s: \",\n-\t\t\t__func__, i, __LINE__, \"crypto op processing failed\");\n-\t\tret = TEST_FAILED;\n-\t\tgoto on_err;\n-\t}\n+\tTEST_ASSERT_NOT_NULL(ut_params->op, \"failed crypto process\");\n \n-\t/* Validate obuf */\n-\tuint8_t *ciphertext = rte_pktmbuf_mtod(ut_params->op->sym->m_src,\n-\t\t\tuint8_t *);\n-\tif (oop) {\n-\t\tciphertext = rte_pktmbuf_mtod(ut_params->op->sym->m_dst,\n-\t\t\t\tuint8_t *);\n-\t}\n+\tTEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,\n+\t\t\t\"crypto op status not success\");\n \n-\tif (memcmp(ciphertext, output_vec, output_vec_len)) {\n-\t\tprintf(\"\\n=======PDCP TestCase #%d failed: Data Mismatch \", i);\n-\t\trte_hexdump(stdout, \"encrypted\", ciphertext, output_vec_len);\n-\t\trte_hexdump(stdout, \"reference\", output_vec, output_vec_len);\n-\t\tret = TEST_FAILED;\n-\t\tgoto on_err;\n-\t}\n+\tplaintext_pad_len = RTE_ALIGN_CEIL(tdata->plaintext.len, 16);\n \n-on_err:\n-\trte_crypto_op_free(ut_params->op);\n-\tut_params->op = NULL;\n+\tciphertext = rte_pktmbuf_mtod_offset(ut_params->ibuf, uint8_t *,\n+\t\t\tut_params->op->sym->cipher.data.offset);\n+\tauth_tag = ciphertext + plaintext_pad_len;\n \n-\tif (ut_params->sec_session)\n-\t\trte_security_session_destroy(ctx, ut_params->sec_session);\n-\tut_params->sec_session = NULL;\n+\tdebug_hexdump(stdout, \"ciphertext:\", ciphertext, tdata->ciphertext.len);\n+\tdebug_hexdump(stdout, \"auth tag:\", auth_tag, tdata->auth_tag.len);\n \n-\trte_pktmbuf_free(ut_params->ibuf);\n-\tut_params->ibuf = NULL;\n-\tif (oop) {\n-\t\trte_pktmbuf_free(ut_params->obuf);\n-\t\tut_params->obuf = NULL;\n-\t}\n+\t/* Validate obuf */\n+\tTEST_ASSERT_BUFFERS_ARE_EQUAL(\n+\t\t\tciphertext,\n+\t\t\ttdata->ciphertext.data,\n+\t\t\ttdata->ciphertext.len,\n+\t\t\t\"Ciphertext data not as expected\");\n+\n+\tTEST_ASSERT_BUFFERS_ARE_EQUAL(\n+\t\t\tauth_tag,\n+\t\t\ttdata->auth_tag.data,\n+\t\t\ttdata->auth_tag.len,\n+\t\t\t\"Generated auth tag not as expected\");\n+\n+\treturn 0;\n \n-\treturn ret;\n }\n \n static int\n-test_pdcp_proto_SGL(int i, int oop,\n-\tenum rte_crypto_cipher_operation opc,\n-\tenum rte_crypto_auth_operation opa,\n-\tuint8_t *input_vec,\n-\tunsigned int input_vec_len,\n-\tuint8_t *output_vec,\n-\tunsigned int output_vec_len,\n-\tuint32_t fragsz,\n-\tuint32_t fragsz_oop)\n+test_AES_GCM_auth_encryption_sessionless_test_case_1(void)\n+{\n+\treturn test_authenticated_encryption_sessionless(\n+\t\t\t&gcm_test_case_5);\n+}\n+\n+static int\n+test_authenticated_decryption_sessionless(\n+\t\tconst struct aead_test_data *tdata)\n {\n \tstruct crypto_testsuite_params *ts_params = &testsuite_params;\n \tstruct crypto_unittest_params *ut_params = &unittest_params;\n-\tuint8_t *plaintext;\n-\tstruct rte_mbuf *buf, *buf_oop = NULL;\n-\tint ret = TEST_SUCCESS;\n-\tint to_trn = 0;\n-\tint to_trn_tbl[16];\n-\tint segs = 1;\n-\tunsigned int trn_data = 0;\n-\n-\tif (fragsz > input_vec_len)\n-\t\tfragsz = input_vec_len;\n \n-\tuint16_t plaintext_len = fragsz;\n-\tuint16_t frag_size_oop = fragsz_oop ? fragsz_oop : fragsz;\n-\n-\tif (fragsz_oop > output_vec_len)\n-\t\tfrag_size_oop = output_vec_len;\n+\tint retval;\n+\tuint8_t *plaintext;\n+\tuint8_t key[tdata->key.len + 1];\n \n-\tint ecx = 0;\n-\tif (input_vec_len % fragsz != 0) {\n-\t\tif (input_vec_len / fragsz + 1 > 16)\n-\t\t\treturn 1;\n-\t} else if (input_vec_len / fragsz > 16)\n-\t\treturn 1;\n+\t/* This test is for AESNI MB and AESNI GCM PMDs only */\n+\tif ((gbl_driver_id != rte_cryptodev_driver_id_get(\n+\t\t\tRTE_STR(CRYPTODEV_NAME_AESNI_MB_PMD))) &&\n+\t\t\t(gbl_driver_id != rte_cryptodev_driver_id_get(\n+\t\t\t\tRTE_STR(CRYPTODEV_NAME_AESNI_GCM_PMD))))\n+\t\treturn -ENOTSUP;\n \n-\t/* Out of place support */\n-\tif (oop) {\n-\t\t/*\n-\t\t * For out-op-place we need to alloc another mbuf\n-\t\t */\n-\t\tut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);\n-\t\trte_pktmbuf_append(ut_params->obuf, frag_size_oop);\n-\t\tbuf_oop = ut_params->obuf;\n-\t}\n+\t/* Verify the capabilities */\n+\tstruct rte_cryptodev_sym_capability_idx cap_idx;\n+\tcap_idx.type = RTE_CRYPTO_SYM_XFORM_AEAD;\n+\tcap_idx.algo.aead = tdata->algo;\n+\tif (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],\n+\t\t\t&cap_idx) == NULL)\n+\t\treturn -ENOTSUP;\n \n-\t/* Generate test mbuf data */\n+\t/* alloc mbuf and set payload */\n \tut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);\n \n-\t/* clear mbuf payload */\n \tmemset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,\n \t\t\trte_pktmbuf_tailroom(ut_params->ibuf));\n \n-\tplaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,\n-\t\t\t\t\t\t  plaintext_len);\n-\tmemcpy(plaintext, input_vec, plaintext_len);\n-\ttrn_data += plaintext_len;\n-\n-\tbuf = ut_params->ibuf;\n+\t/* Create AEAD operation */\n+\tretval = create_aead_operation(RTE_CRYPTO_AEAD_OP_DECRYPT, tdata);\n+\tif (retval < 0)\n+\t\treturn retval;\n \n-\t/*\n-\t * Loop until no more fragments\n-\t */\n+\t/* Create AEAD xform */\n+\tmemcpy(key, tdata->key.data, tdata->key.len);\n+\tretval = create_aead_xform(ut_params->op,\n+\t\t\ttdata->algo,\n+\t\t\tRTE_CRYPTO_AEAD_OP_DECRYPT,\n+\t\t\tkey, tdata->key.len,\n+\t\t\ttdata->aad.len, tdata->auth_tag.len,\n+\t\t\ttdata->iv.len);\n+\tif (retval < 0)\n+\t\treturn retval;\n \n-\twhile (trn_data < input_vec_len) {\n-\t\t++segs;\n-\t\tto_trn = (input_vec_len - trn_data < fragsz) ?\n-\t\t\t\t(input_vec_len - trn_data) : fragsz;\n+\tut_params->op->sym->m_src = ut_params->ibuf;\n \n-\t\tto_trn_tbl[ecx++] = to_trn;\n+\tTEST_ASSERT_EQUAL(ut_params->op->sess_type,\n+\t\t\tRTE_CRYPTO_OP_SESSIONLESS,\n+\t\t\t\"crypto op session type not sessionless\");\n \n-\t\tbuf->next = rte_pktmbuf_alloc(ts_params->mbuf_pool);\n-\t\tbuf = buf->next;\n+\t/* Process crypto operation */\n+\tTEST_ASSERT_NOT_NULL(process_crypto_request(ts_params->valid_devs[0],\n+\t\t\tut_params->op), \"failed to process sym crypto op\");\n \n-\t\tmemset(rte_pktmbuf_mtod(buf, uint8_t *), 0,\n-\t\t\t\trte_pktmbuf_tailroom(buf));\n+\tTEST_ASSERT_NOT_NULL(ut_params->op, \"failed crypto process\");\n \n-\t\t/* OOP */\n-\t\tif (oop && !fragsz_oop) {\n-\t\t\tbuf_oop->next =\n-\t\t\t\t\trte_pktmbuf_alloc(ts_params->mbuf_pool);\n-\t\t\tbuf_oop = buf_oop->next;\n-\t\t\tmemset(rte_pktmbuf_mtod(buf_oop, uint8_t *),\n-\t\t\t\t\t0, rte_pktmbuf_tailroom(buf_oop));\n-\t\t\trte_pktmbuf_append(buf_oop, to_trn);\n-\t\t}\n+\tTEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,\n+\t\t\t\"crypto op status not success\");\n \n-\t\tplaintext = (uint8_t *)rte_pktmbuf_append(buf,\n-\t\t\t\tto_trn);\n+\tplaintext = rte_pktmbuf_mtod_offset(ut_params->ibuf, uint8_t *,\n+\t\t\tut_params->op->sym->cipher.data.offset);\n \n-\t\tmemcpy(plaintext, input_vec + trn_data, to_trn);\n-\t\ttrn_data += to_trn;\n-\t}\n+\tdebug_hexdump(stdout, \"plaintext:\", plaintext, tdata->ciphertext.len);\n \n-\tut_params->ibuf->nb_segs = segs;\n+\t/* Validate obuf */\n+\tTEST_ASSERT_BUFFERS_ARE_EQUAL(\n+\t\t\tplaintext,\n+\t\t\ttdata->plaintext.data,\n+\t\t\ttdata->plaintext.len,\n+\t\t\t\"Plaintext data not as expected\");\n \n-\tsegs = 1;\n-\tif (fragsz_oop && oop) {\n-\t\tto_trn = 0;\n-\t\tecx = 0;\n+\tTEST_ASSERT_EQUAL(ut_params->op->status,\n+\t\t\tRTE_CRYPTO_OP_STATUS_SUCCESS,\n+\t\t\t\"Authentication failed\");\n+\treturn 0;\n+}\n \n-\t\ttrn_data = frag_size_oop;\n-\t\twhile (trn_data < output_vec_len) {\n-\t\t\t++segs;\n-\t\t\tto_trn =\n-\t\t\t\t(output_vec_len - trn_data <\n-\t\t\t\t\t\tfrag_size_oop) ?\n-\t\t\t\t(output_vec_len - trn_data) :\n-\t\t\t\t\t\tfrag_size_oop;\n+static int\n+test_AES_GCM_auth_decryption_sessionless_test_case_1(void)\n+{\n+\treturn test_authenticated_decryption_sessionless(\n+\t\t\t&gcm_test_case_5);\n+}\n \n-\t\t\tto_trn_tbl[ecx++] = to_trn;\n+static int\n+test_AES_CCM_authenticated_encryption_test_case_128_1(void)\n+{\n+\treturn test_authenticated_encryption(&ccm_test_case_128_1);\n+}\n \n-\t\t\tbuf_oop->next =\n-\t\t\t\trte_pktmbuf_alloc(ts_params->mbuf_pool);\n-\t\t\tbuf_oop = buf_oop->next;\n-\t\t\tmemset(rte_pktmbuf_mtod(buf_oop, uint8_t *),\n-\t\t\t\t\t0, rte_pktmbuf_tailroom(buf_oop));\n-\t\t\trte_pktmbuf_append(buf_oop, to_trn);\n-\n-\t\t\ttrn_data += to_trn;\n-\t\t}\n-\t\tut_params->obuf->nb_segs = segs;\n-\t}\n-\n-\tut_params->type = RTE_SECURITY_ACTION_TYPE_LOOKASIDE_PROTOCOL;\n-\n-\t/* Setup Cipher Parameters */\n-\tut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER;\n-\tut_params->cipher_xform.cipher.algo = pdcp_test_params[i].cipher_alg;\n-\tut_params->cipher_xform.cipher.op = opc;\n-\tut_params->cipher_xform.cipher.key.data = pdcp_test_crypto_key[i];\n-\tut_params->cipher_xform.cipher.key.length =\n-\t\t\t\t\tpdcp_test_params[i].cipher_key_len;\n-\tut_params->cipher_xform.cipher.iv.length = 0;\n-\n-\t/* Setup HMAC Parameters if ICV header is required */\n-\tif (pdcp_test_params[i].auth_alg != 0) {\n-\t\tut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;\n-\t\tut_params->auth_xform.next = NULL;\n-\t\tut_params->auth_xform.auth.algo = pdcp_test_params[i].auth_alg;\n-\t\tut_params->auth_xform.auth.op = opa;\n-\t\tut_params->auth_xform.auth.key.data = pdcp_test_auth_key[i];\n-\t\tut_params->auth_xform.auth.key.length =\n-\t\t\t\t\tpdcp_test_params[i].auth_key_len;\n-\n-\t\tut_params->cipher_xform.next = &ut_params->auth_xform;\n-\t} else {\n-\t\tut_params->cipher_xform.next = NULL;\n-\t}\n-\n-\tstruct rte_security_session_conf sess_conf = {\n-\t\t.action_type = RTE_SECURITY_ACTION_TYPE_LOOKASIDE_PROTOCOL,\n-\t\t.protocol = RTE_SECURITY_PROTOCOL_PDCP,\n-\t\t{.pdcp = {\n-\t\t\t.bearer = pdcp_test_bearer[i],\n-\t\t\t.domain = pdcp_test_params[i].domain,\n-\t\t\t.pkt_dir = pdcp_test_packet_direction[i],\n-\t\t\t.sn_size = pdcp_test_data_sn_size[i],\n-\t\t\t.hfn = pdcp_test_hfn[i],\n-\t\t\t.hfn_threshold = pdcp_test_hfn_threshold[i],\n-\t\t} },\n-\t\t.crypto_xform = &ut_params->cipher_xform\n-\t};\n-\n-\tstruct rte_security_ctx *ctx = (struct rte_security_ctx *)\n-\t\t\t\trte_cryptodev_get_sec_ctx(\n-\t\t\t\tts_params->valid_devs[0]);\n-\n-\t/* Create security session */\n-\tut_params->sec_session = rte_security_session_create(ctx,\n-\t\t\t\t&sess_conf, ts_params->session_priv_mpool);\n-\n-\tif (!ut_params->sec_session) {\n-\t\tprintf(\"TestCase %s()-%d line %d failed %s: \",\n-\t\t\t__func__, i, __LINE__, \"Failed to allocate session\");\n-\t\tret = TEST_FAILED;\n-\t\tgoto on_err;\n-\t}\n-\n-\t/* Generate crypto op data structure */\n-\tut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,\n-\t\t\tRTE_CRYPTO_OP_TYPE_SYMMETRIC);\n-\tif (!ut_params->op) {\n-\t\tprintf(\"TestCase %s()-%d line %d failed %s: \",\n-\t\t\t__func__, i, __LINE__,\n-\t\t\t\"Failed to allocate symmetric crypto operation struct\");\n-\t\tret = TEST_FAILED;\n-\t\tgoto on_err;\n-\t}\n-\n-\trte_security_attach_session(ut_params->op, ut_params->sec_session);\n-\n-\t/* set crypto operation source mbuf */\n-\tut_params->op->sym->m_src = ut_params->ibuf;\n-\tif (oop)\n-\t\tut_params->op->sym->m_dst = ut_params->obuf;\n-\n-\t/* Process crypto operation */\n-\tif (process_crypto_request(ts_params->valid_devs[0], ut_params->op)\n-\t\t== NULL) {\n-\t\tprintf(\"TestCase %s()-%d line %d failed %s: \",\n-\t\t\t__func__, i, __LINE__,\n-\t\t\t\"failed to process sym crypto op\");\n-\t\tret = TEST_FAILED;\n-\t\tgoto on_err;\n-\t}\n-\n-\tif (ut_params->op->status != RTE_CRYPTO_OP_STATUS_SUCCESS) {\n-\t\tprintf(\"TestCase %s()-%d line %d failed %s: \",\n-\t\t\t__func__, i, __LINE__, \"crypto op processing failed\");\n-\t\tret = TEST_FAILED;\n-\t\tgoto on_err;\n-\t}\n-\n-\t/* Validate obuf */\n-\tuint8_t *ciphertext = rte_pktmbuf_mtod(ut_params->op->sym->m_src,\n-\t\t\tuint8_t *);\n-\tif (oop) {\n-\t\tciphertext = rte_pktmbuf_mtod(ut_params->op->sym->m_dst,\n-\t\t\t\tuint8_t *);\n-\t}\n-\tif (fragsz_oop)\n-\t\tfragsz = frag_size_oop;\n-\tif (memcmp(ciphertext, output_vec, fragsz)) {\n-\t\tprintf(\"\\n=======PDCP TestCase #%d failed: Data Mismatch \", i);\n-\t\trte_hexdump(stdout, \"encrypted\", ciphertext, fragsz);\n-\t\trte_hexdump(stdout, \"reference\", output_vec, fragsz);\n-\t\tret = TEST_FAILED;\n-\t\tgoto on_err;\n-\t}\n-\n-\tbuf = ut_params->op->sym->m_src->next;\n-\tif (oop)\n-\t\tbuf = ut_params->op->sym->m_dst->next;\n+static int\n+test_AES_CCM_authenticated_encryption_test_case_128_2(void)\n+{\n+\treturn test_authenticated_encryption(&ccm_test_case_128_2);\n+}\n \n-\tunsigned int off = fragsz;\n+static int\n+test_AES_CCM_authenticated_encryption_test_case_128_3(void)\n+{\n+\treturn test_authenticated_encryption(&ccm_test_case_128_3);\n+}\n \n-\tecx = 0;\n-\twhile (buf) {\n-\t\tciphertext = rte_pktmbuf_mtod(buf,\n-\t\t\t\tuint8_t *);\n-\t\tif (memcmp(ciphertext, output_vec + off, to_trn_tbl[ecx])) {\n-\t\t\tprintf(\"\\n=======PDCP TestCase #%d failed: Data Mismatch \", i);\n-\t\t\trte_hexdump(stdout, \"encrypted\", ciphertext, to_trn_tbl[ecx]);\n-\t\t\trte_hexdump(stdout, \"reference\", output_vec + off,\n-\t\t\t\t\tto_trn_tbl[ecx]);\n-\t\t\tret = TEST_FAILED;\n-\t\t\tgoto on_err;\n-\t\t}\n-\t\toff += to_trn_tbl[ecx++];\n-\t\tbuf = buf->next;\n-\t}\n-on_err:\n-\trte_crypto_op_free(ut_params->op);\n-\tut_params->op = NULL;\n+static int\n+test_AES_CCM_authenticated_decryption_test_case_128_1(void)\n+{\n+\treturn test_authenticated_decryption(&ccm_test_case_128_1);\n+}\n \n-\tif (ut_params->sec_session)\n-\t\trte_security_session_destroy(ctx, ut_params->sec_session);\n-\tut_params->sec_session = NULL;\n+static int\n+test_AES_CCM_authenticated_decryption_test_case_128_2(void)\n+{\n+\treturn test_authenticated_decryption(&ccm_test_case_128_2);\n+}\n \n-\trte_pktmbuf_free(ut_params->ibuf);\n-\tut_params->ibuf = NULL;\n-\tif (oop) {\n-\t\trte_pktmbuf_free(ut_params->obuf);\n-\t\tut_params->obuf = NULL;\n-\t}\n+static int\n+test_AES_CCM_authenticated_decryption_test_case_128_3(void)\n+{\n+\treturn test_authenticated_decryption(&ccm_test_case_128_3);\n+}\n \n-\treturn ret;\n+static int\n+test_AES_CCM_authenticated_encryption_test_case_192_1(void)\n+{\n+\treturn test_authenticated_encryption(&ccm_test_case_192_1);\n }\n \n-int\n-test_pdcp_proto_cplane_encap(int i)\n+static int\n+test_AES_CCM_authenticated_encryption_test_case_192_2(void)\n {\n-\treturn test_pdcp_proto(i, 0,\n-\t\tRTE_CRYPTO_CIPHER_OP_ENCRYPT,\n-\t\tRTE_CRYPTO_AUTH_OP_GENERATE,\n-\t\tpdcp_test_data_in[i],\n-\t\tpdcp_test_data_in_len[i],\n-\t\tpdcp_test_data_out[i],\n-\t\tpdcp_test_data_in_len[i]+4);\n+\treturn test_authenticated_encryption(&ccm_test_case_192_2);\n }\n \n-int\n-test_pdcp_proto_uplane_encap(int i)\n+static int\n+test_AES_CCM_authenticated_encryption_test_case_192_3(void)\n {\n-\treturn test_pdcp_proto(i, 0,\n-\t\tRTE_CRYPTO_CIPHER_OP_ENCRYPT,\n-\t\tRTE_CRYPTO_AUTH_OP_GENERATE,\n-\t\tpdcp_test_data_in[i],\n-\t\tpdcp_test_data_in_len[i],\n-\t\tpdcp_test_data_out[i],\n-\t\tpdcp_test_data_in_len[i]);\n+\treturn test_authenticated_encryption(&ccm_test_case_192_3);\n+}\n \n+static int\n+test_AES_CCM_authenticated_decryption_test_case_192_1(void)\n+{\n+\treturn test_authenticated_decryption(&ccm_test_case_192_1);\n }\n \n-int\n-test_pdcp_proto_uplane_encap_with_int(int i)\n+static int\n+test_AES_CCM_authenticated_decryption_test_case_192_2(void)\n {\n-\treturn test_pdcp_proto(i, 0,\n-\t\tRTE_CRYPTO_CIPHER_OP_ENCRYPT,\n-\t\tRTE_CRYPTO_AUTH_OP_GENERATE,\n-\t\tpdcp_test_data_in[i],\n-\t\tpdcp_test_data_in_len[i],\n-\t\tpdcp_test_data_out[i],\n-\t\tpdcp_test_data_in_len[i] + 4);\n+\treturn test_authenticated_decryption(&ccm_test_case_192_2);\n }\n \n-int\n-test_pdcp_proto_cplane_decap(int i)\n+static int\n+test_AES_CCM_authenticated_decryption_test_case_192_3(void)\n {\n-\treturn test_pdcp_proto(i, 0,\n-\t\tRTE_CRYPTO_CIPHER_OP_DECRYPT,\n-\t\tRTE_CRYPTO_AUTH_OP_VERIFY,\n-\t\tpdcp_test_data_out[i],\n-\t\tpdcp_test_data_in_len[i] + 4,\n-\t\tpdcp_test_data_in[i],\n-\t\tpdcp_test_data_in_len[i]);\n+\treturn test_authenticated_decryption(&ccm_test_case_192_3);\n }\n \n-int\n-test_pdcp_proto_uplane_decap(int i)\n+static int\n+test_AES_CCM_authenticated_encryption_test_case_256_1(void)\n {\n-\treturn test_pdcp_proto(i, 0,\n-\t\tRTE_CRYPTO_CIPHER_OP_DECRYPT,\n-\t\tRTE_CRYPTO_AUTH_OP_VERIFY,\n-\t\tpdcp_test_data_out[i],\n-\t\tpdcp_test_data_in_len[i],\n-\t\tpdcp_test_data_in[i],\n-\t\tpdcp_test_data_in_len[i]);\n+\treturn test_authenticated_encryption(&ccm_test_case_256_1);\n }\n \n-int\n-test_pdcp_proto_uplane_decap_with_int(int i)\n+static int\n+test_AES_CCM_authenticated_encryption_test_case_256_2(void)\n {\n-\treturn test_pdcp_proto(i, 0,\n-\t\tRTE_CRYPTO_CIPHER_OP_DECRYPT,\n-\t\tRTE_CRYPTO_AUTH_OP_VERIFY,\n-\t\tpdcp_test_data_out[i],\n-\t\tpdcp_test_data_in_len[i] + 4,\n-\t\tpdcp_test_data_in[i],\n-\t\tpdcp_test_data_in_len[i]);\n+\treturn test_authenticated_encryption(&ccm_test_case_256_2);\n }\n \n static int\n-test_PDCP_PROTO_SGL_in_place_32B(void)\n+test_AES_CCM_authenticated_encryption_test_case_256_3(void)\n {\n-\t/* i can be used for running any PDCP case\n-\t * In this case it is uplane 12-bit AES-SNOW DL encap\n-\t */\n-\tint i = PDCP_UPLANE_12BIT_OFFSET + AES_ENC + SNOW_AUTH + DOWNLINK;\n-\treturn test_pdcp_proto_SGL(i, IN_PLACE,\n-\t\t\tRTE_CRYPTO_CIPHER_OP_ENCRYPT,\n-\t\t\tRTE_CRYPTO_AUTH_OP_GENERATE,\n-\t\t\tpdcp_test_data_in[i],\n-\t\t\tpdcp_test_data_in_len[i],\n-\t\t\tpdcp_test_data_out[i],\n-\t\t\tpdcp_test_data_in_len[i]+4,\n-\t\t\t32, 0);\n-}\n-static int\n-test_PDCP_PROTO_SGL_oop_32B_128B(void)\n-{\n-\t/* i can be used for running any PDCP case\n-\t * In this case it is uplane 18-bit NULL-NULL DL encap\n-\t */\n-\tint i = PDCP_UPLANE_18BIT_OFFSET + NULL_ENC + NULL_AUTH + DOWNLINK;\n-\treturn test_pdcp_proto_SGL(i, OUT_OF_PLACE,\n-\t\t\tRTE_CRYPTO_CIPHER_OP_ENCRYPT,\n-\t\t\tRTE_CRYPTO_AUTH_OP_GENERATE,\n-\t\t\tpdcp_test_data_in[i],\n-\t\t\tpdcp_test_data_in_len[i],\n-\t\t\tpdcp_test_data_out[i],\n-\t\t\tpdcp_test_data_in_len[i]+4,\n-\t\t\t32, 128);\n-}\n-static int\n-test_PDCP_PROTO_SGL_oop_32B_40B(void)\n-{\n-\t/* i can be used for running any PDCP case\n-\t * In this case it is uplane 18-bit AES DL encap\n-\t */\n-\tint i = PDCP_UPLANE_OFFSET + AES_ENC + EIGHTEEN_BIT_SEQ_NUM_OFFSET\n-\t\t\t+ DOWNLINK;\n-\treturn test_pdcp_proto_SGL(i, OUT_OF_PLACE,\n-\t\t\tRTE_CRYPTO_CIPHER_OP_ENCRYPT,\n-\t\t\tRTE_CRYPTO_AUTH_OP_GENERATE,\n-\t\t\tpdcp_test_data_in[i],\n-\t\t\tpdcp_test_data_in_len[i],\n-\t\t\tpdcp_test_data_out[i],\n-\t\t\tpdcp_test_data_in_len[i],\n-\t\t\t32, 40);\n-}\n-static int\n-test_PDCP_PROTO_SGL_oop_128B_32B(void)\n-{\n-\t/* i can be used for running any PDCP case\n-\t * In this case it is cplane 12-bit AES-ZUC DL encap\n-\t */\n-\tint i = PDCP_CPLANE_LONG_SN_OFFSET + AES_ENC + ZUC_AUTH + DOWNLINK;\n-\treturn test_pdcp_proto_SGL(i, OUT_OF_PLACE,\n-\t\t\tRTE_CRYPTO_CIPHER_OP_ENCRYPT,\n-\t\t\tRTE_CRYPTO_AUTH_OP_GENERATE,\n-\t\t\tpdcp_test_data_in[i],\n-\t\t\tpdcp_test_data_in_len[i],\n-\t\t\tpdcp_test_data_out[i],\n-\t\t\tpdcp_test_data_in_len[i]+4,\n-\t\t\t128, 32);\n+\treturn test_authenticated_encryption(&ccm_test_case_256_3);\n }\n-#endif\n \n static int\n-test_AES_GCM_authenticated_encryption_test_case_1(void)\n+test_AES_CCM_authenticated_decryption_test_case_256_1(void)\n {\n-\treturn test_authenticated_encryption(&gcm_test_case_1);\n+\treturn test_authenticated_decryption(&ccm_test_case_256_1);\n }\n \n static int\n-test_AES_GCM_authenticated_encryption_test_case_2(void)\n+test_AES_CCM_authenticated_decryption_test_case_256_2(void)\n {\n-\treturn test_authenticated_encryption(&gcm_test_case_2);\n+\treturn test_authenticated_decryption(&ccm_test_case_256_2);\n }\n \n static int\n-test_AES_GCM_authenticated_encryption_test_case_3(void)\n+test_AES_CCM_authenticated_decryption_test_case_256_3(void)\n {\n-\treturn test_authenticated_encryption(&gcm_test_case_3);\n+\treturn test_authenticated_decryption(&ccm_test_case_256_3);\n }\n \n static int\n-test_AES_GCM_authenticated_encryption_test_case_4(void)\n+test_stats(void)\n {\n-\treturn test_authenticated_encryption(&gcm_test_case_4);\n-}\n+\tstruct crypto_testsuite_params *ts_params = &testsuite_params;\n+\tstruct rte_cryptodev_stats stats;\n+\tstruct rte_cryptodev *dev;\n+\tcryptodev_stats_get_t temp_pfn;\n \n-static int\n-test_AES_GCM_authenticated_encryption_test_case_5(void)\n-{\n-\treturn test_authenticated_encryption(&gcm_test_case_5);\n-}\n+\t/* Verify the capabilities */\n+\tstruct rte_cryptodev_sym_capability_idx cap_idx;\n+\tcap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;\n+\tcap_idx.algo.auth = RTE_CRYPTO_AUTH_SHA1_HMAC;\n+\tif (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],\n+\t\t\t&cap_idx) == NULL)\n+\t\treturn -ENOTSUP;\n+\tcap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;\n+\tcap_idx.algo.cipher = RTE_CRYPTO_CIPHER_AES_CBC;\n+\tif (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],\n+\t\t\t&cap_idx) == NULL)\n+\t\treturn -ENOTSUP;\n \n-static int\n-test_AES_GCM_authenticated_encryption_test_case_6(void)\n-{\n-\treturn test_authenticated_encryption(&gcm_test_case_6);\n-}\n+\trte_cryptodev_stats_reset(ts_params->valid_devs[0]);\n \n-static int\n-test_AES_GCM_authenticated_encryption_test_case_7(void)\n-{\n-\treturn test_authenticated_encryption(&gcm_test_case_7);\n-}\n+\tTEST_ASSERT((rte_cryptodev_stats_get(ts_params->valid_devs[0] + 600,\n+\t\t\t&stats) == -ENODEV),\n+\t\t\"rte_cryptodev_stats_get invalid dev failed\");\n+\tTEST_ASSERT((rte_cryptodev_stats_get(ts_params->valid_devs[0], 0) != 0),\n+\t\t\"rte_cryptodev_stats_get invalid Param failed\");\n+\tdev = &rte_cryptodevs[ts_params->valid_devs[0]];\n+\ttemp_pfn = dev->dev_ops->stats_get;\n+\tdev->dev_ops->stats_get = (cryptodev_stats_get_t)0;\n+\tTEST_ASSERT((rte_cryptodev_stats_get(ts_params->valid_devs[0], &stats)\n+\t\t\t== -ENOTSUP),\n+\t\t\"rte_cryptodev_stats_get invalid Param failed\");\n+\tdev->dev_ops->stats_get = temp_pfn;\n \n-static int\n-test_AES_GCM_authenticated_encryption_test_case_8(void)\n-{\n-\treturn test_authenticated_encryption(&gcm_test_case_8);\n-}\n+\t/* Test expected values */\n+\tut_setup();\n+\ttest_AES_CBC_HMAC_SHA1_encrypt_digest();\n+\tut_teardown();\n \n-static int\n-test_AES_GCM_auth_encryption_test_case_192_1(void)\n-{\n-\treturn test_authenticated_encryption(&gcm_test_case_192_1);\n-}\n+\tTEST_ASSERT_SUCCESS(rte_cryptodev_stats_get(ts_params->valid_devs[0],\n+\t\t\t&stats),\n+\t\t\"rte_cryptodev_stats_get failed\");\n \n-static int\n-test_AES_GCM_auth_encryption_test_case_192_2(void)\n-{\n-\treturn test_authenticated_encryption(&gcm_test_case_192_2);\n-}\n+\tTEST_ASSERT((stats.enqueued_count == 1),\n+\t\t\"rte_cryptodev_stats_get returned unexpected enqueued stat\");\n+\tTEST_ASSERT((stats.dequeued_count == 1),\n+\t\t\"rte_cryptodev_stats_get returned unexpected enqueued stat\");\n+\tTEST_ASSERT((stats.enqueue_err_count == 0),\n+\t\t\"rte_cryptodev_stats_get returned unexpected enqueued stat\");\n+\tTEST_ASSERT((stats.dequeue_err_count == 0),\n+\t\t\"rte_cryptodev_stats_get returned unexpected enqueued stat\");\n \n-static int\n-test_AES_GCM_auth_encryption_test_case_192_3(void)\n-{\n-\treturn test_authenticated_encryption(&gcm_test_case_192_3);\n-}\n+\t/* invalid device but should ignore and not reset device stats*/\n+\trte_cryptodev_stats_reset(ts_params->valid_devs[0] + 300);\n+\tTEST_ASSERT_SUCCESS(rte_cryptodev_stats_get(ts_params->valid_devs[0],\n+\t\t\t&stats),\n+\t\t\"rte_cryptodev_stats_get failed\");\n \n-static int\n-test_AES_GCM_auth_encryption_test_case_192_4(void)\n-{\n-\treturn test_authenticated_encryption(&gcm_test_case_192_4);\n-}\n+\tTEST_ASSERT((stats.enqueued_count == 1),\n+\t\t\"rte_cryptodev_stats_get returned unexpected enqueued stat\");\n \n-static int\n-test_AES_GCM_auth_encryption_test_case_192_5(void)\n-{\n-\treturn test_authenticated_encryption(&gcm_test_case_192_5);\n-}\n+\t/* check that a valid reset clears stats */\n+\trte_cryptodev_stats_reset(ts_params->valid_devs[0]);\n+\tTEST_ASSERT_SUCCESS(rte_cryptodev_stats_get(ts_params->valid_devs[0],\n+\t\t\t&stats),\n+\t\t\t\t\t  \"rte_cryptodev_stats_get failed\");\n \n-static int\n-test_AES_GCM_auth_encryption_test_case_192_6(void)\n-{\n-\treturn test_authenticated_encryption(&gcm_test_case_192_6);\n-}\n+\tTEST_ASSERT((stats.enqueued_count == 0),\n+\t\t\"rte_cryptodev_stats_get returned unexpected enqueued stat\");\n+\tTEST_ASSERT((stats.dequeued_count == 0),\n+\t\t\"rte_cryptodev_stats_get returned unexpected enqueued stat\");\n \n-static int\n-test_AES_GCM_auth_encryption_test_case_192_7(void)\n-{\n-\treturn test_authenticated_encryption(&gcm_test_case_192_7);\n+\treturn TEST_SUCCESS;\n }\n \n-static int\n-test_AES_GCM_auth_encryption_test_case_256_1(void)\n+static int MD5_HMAC_create_session(struct crypto_testsuite_params *ts_params,\n+\t\t\t\t   struct crypto_unittest_params *ut_params,\n+\t\t\t\t   enum rte_crypto_auth_operation op,\n+\t\t\t\t   const struct HMAC_MD5_vector *test_case)\n {\n-\treturn test_authenticated_encryption(&gcm_test_case_256_1);\n-}\n+\tuint8_t key[64];\n \n-static int\n-test_AES_GCM_auth_encryption_test_case_256_2(void)\n-{\n-\treturn test_authenticated_encryption(&gcm_test_case_256_2);\n-}\n+\tmemcpy(key, test_case->key.data, test_case->key.len);\n \n-static int\n-test_AES_GCM_auth_encryption_test_case_256_3(void)\n-{\n-\treturn test_authenticated_encryption(&gcm_test_case_256_3);\n-}\n+\tut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;\n+\tut_params->auth_xform.next = NULL;\n+\tut_params->auth_xform.auth.op = op;\n \n-static int\n-test_AES_GCM_auth_encryption_test_case_256_4(void)\n-{\n-\treturn test_authenticated_encryption(&gcm_test_case_256_4);\n-}\n+\tut_params->auth_xform.auth.algo = RTE_CRYPTO_AUTH_MD5_HMAC;\n \n-static int\n-test_AES_GCM_auth_encryption_test_case_256_5(void)\n-{\n-\treturn test_authenticated_encryption(&gcm_test_case_256_5);\n-}\n+\tut_params->auth_xform.auth.digest_length = MD5_DIGEST_LEN;\n+\tut_params->auth_xform.auth.key.length = test_case->key.len;\n+\tut_params->auth_xform.auth.key.data = key;\n \n-static int\n-test_AES_GCM_auth_encryption_test_case_256_6(void)\n-{\n-\treturn test_authenticated_encryption(&gcm_test_case_256_6);\n-}\n+\tut_params->sess = rte_cryptodev_sym_session_create(\n+\t\t\tts_params->session_mpool);\n \n-static int\n-test_AES_GCM_auth_encryption_test_case_256_7(void)\n-{\n-\treturn test_authenticated_encryption(&gcm_test_case_256_7);\n-}\n+\trte_cryptodev_sym_session_init(ts_params->valid_devs[0],\n+\t\t\tut_params->sess, &ut_params->auth_xform,\n+\t\t\tts_params->session_priv_mpool);\n \n-static int\n-test_AES_GCM_auth_encryption_test_case_aad_1(void)\n-{\n-\treturn test_authenticated_encryption(&gcm_test_case_aad_1);\n-}\n+\tif (ut_params->sess == NULL)\n+\t\treturn TEST_FAILED;\n \n-static int\n-test_AES_GCM_auth_encryption_test_case_aad_2(void)\n-{\n-\treturn test_authenticated_encryption(&gcm_test_case_aad_2);\n-}\n+\tut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);\n \n-static int\n-test_AES_GCM_auth_encryption_fail_iv_corrupt(void)\n-{\n-\tstruct aead_test_data tdata;\n-\tint res;\n+\tmemset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,\n+\t\t\trte_pktmbuf_tailroom(ut_params->ibuf));\n \n-\tRTE_LOG(INFO, USER1, \"This is a negative test, errors are expected\\n\");\n-\tmemcpy(&tdata, &gcm_test_case_7, sizeof(struct aead_test_data));\n-\ttdata.iv.data[0] += 1;\n-\tres = test_authenticated_encryption(&tdata);\n-\tTEST_ASSERT_EQUAL(res, TEST_FAILED, \"encryption not failed\");\n-\treturn TEST_SUCCESS;\n+\treturn 0;\n }\n \n-static int\n-test_AES_GCM_auth_encryption_fail_in_data_corrupt(void)\n+static int MD5_HMAC_create_op(struct crypto_unittest_params *ut_params,\n+\t\t\t      const struct HMAC_MD5_vector *test_case,\n+\t\t\t      uint8_t **plaintext)\n {\n-\tstruct aead_test_data tdata;\n-\tint res;\n-\n-\tRTE_LOG(INFO, USER1, \"This is a negative test, errors are expected\\n\");\n-\tmemcpy(&tdata, &gcm_test_case_7, sizeof(struct aead_test_data));\n-\ttdata.plaintext.data[0] += 1;\n-\tres = test_authenticated_encryption(&tdata);\n-\tTEST_ASSERT_EQUAL(res, TEST_FAILED, \"encryption not failed\");\n-\treturn TEST_SUCCESS;\n-}\n+\tuint16_t plaintext_pad_len;\n \n-static int\n-test_AES_GCM_auth_encryption_fail_out_data_corrupt(void)\n-{\n-\tstruct aead_test_data tdata;\n-\tint res;\n+\tstruct rte_crypto_sym_op *sym_op = ut_params->op->sym;\n \n-\tRTE_LOG(INFO, USER1, \"This is a negative test, errors are expected\\n\");\n-\tmemcpy(&tdata, &gcm_test_case_7, sizeof(struct aead_test_data));\n-\ttdata.ciphertext.data[0] += 1;\n-\tres = test_authenticated_encryption(&tdata);\n-\tTEST_ASSERT_EQUAL(res, TEST_FAILED, \"encryption not failed\");\n-\treturn TEST_SUCCESS;\n-}\n+\tplaintext_pad_len = RTE_ALIGN_CEIL(test_case->plaintext.len,\n+\t\t\t\t16);\n \n-static int\n-test_AES_GCM_auth_encryption_fail_aad_len_corrupt(void)\n-{\n-\tstruct aead_test_data tdata;\n-\tint res;\n+\t*plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,\n+\t\t\tplaintext_pad_len);\n+\tmemcpy(*plaintext, test_case->plaintext.data,\n+\t\t\ttest_case->plaintext.len);\n \n-\tRTE_LOG(INFO, USER1, \"This is a negative test, errors are expected\\n\");\n-\tmemcpy(&tdata, &gcm_test_case_7, sizeof(struct aead_test_data));\n-\ttdata.aad.len += 1;\n-\tres = test_authenticated_encryption(&tdata);\n-\tTEST_ASSERT_EQUAL(res, TEST_FAILED, \"encryption not failed\");\n-\treturn TEST_SUCCESS;\n-}\n+\tsym_op->auth.digest.data = (uint8_t *)rte_pktmbuf_append(\n+\t\t\tut_params->ibuf, MD5_DIGEST_LEN);\n+\tTEST_ASSERT_NOT_NULL(sym_op->auth.digest.data,\n+\t\t\t\"no room to append digest\");\n+\tsym_op->auth.digest.phys_addr = rte_pktmbuf_iova_offset(\n+\t\t\tut_params->ibuf, plaintext_pad_len);\n \n-static int\n-test_AES_GCM_auth_encryption_fail_aad_corrupt(void)\n-{\n-\tstruct aead_test_data tdata;\n-\tuint8_t aad[gcm_test_case_7.aad.len];\n-\tint res;\n+\tif (ut_params->auth_xform.auth.op == RTE_CRYPTO_AUTH_OP_VERIFY) {\n+\t\trte_memcpy(sym_op->auth.digest.data, test_case->auth_tag.data,\n+\t\t\t   test_case->auth_tag.len);\n+\t}\n \n-\tRTE_LOG(INFO, USER1, \"This is a negative test, errors are expected\\n\");\n-\tmemcpy(&tdata, &gcm_test_case_7, sizeof(struct aead_test_data));\n-\tmemcpy(aad, gcm_test_case_7.aad.data, gcm_test_case_7.aad.len);\n-\taad[0] += 1;\n-\ttdata.aad.data = aad;\n-\tres = test_authenticated_encryption(&tdata);\n-\tTEST_ASSERT_EQUAL(res, TEST_FAILED, \"encryption not failed\");\n-\treturn TEST_SUCCESS;\n-}\n+\tsym_op->auth.data.offset = 0;\n+\tsym_op->auth.data.length = test_case->plaintext.len;\n \n-static int\n-test_AES_GCM_auth_encryption_fail_tag_corrupt(void)\n-{\n-\tstruct aead_test_data tdata;\n-\tint res;\n+\trte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);\n+\tut_params->op->sym->m_src = ut_params->ibuf;\n \n-\tRTE_LOG(INFO, USER1, \"This is a negative test, errors are expected\\n\");\n-\tmemcpy(&tdata, &gcm_test_case_7, sizeof(struct aead_test_data));\n-\ttdata.auth_tag.data[0] += 1;\n-\tres = test_authenticated_encryption(&tdata);\n-\tTEST_ASSERT_EQUAL(res, TEST_FAILED, \"encryption not failed\");\n-\treturn TEST_SUCCESS;\n+\treturn 0;\n }\n \n static int\n-test_authenticated_decryption(const struct aead_test_data *tdata)\n+test_MD5_HMAC_generate(const struct HMAC_MD5_vector *test_case)\n {\n+\tuint16_t plaintext_pad_len;\n+\tuint8_t *plaintext, *auth_tag;\n+\n \tstruct crypto_testsuite_params *ts_params = &testsuite_params;\n \tstruct crypto_unittest_params *ut_params = &unittest_params;\n \n-\tint retval;\n-\tuint8_t *plaintext;\n-\tuint32_t i;\n-\n-\t/* Create AEAD session */\n-\tretval = create_aead_session(ts_params->valid_devs[0],\n-\t\t\ttdata->algo,\n-\t\t\tRTE_CRYPTO_AEAD_OP_DECRYPT,\n-\t\t\ttdata->key.data, tdata->key.len,\n-\t\t\ttdata->aad.len, tdata->auth_tag.len,\n-\t\t\ttdata->iv.len);\n-\tif (retval < 0)\n-\t\treturn retval;\n-\n-\t/* alloc mbuf and set payload */\n-\tif (tdata->aad.len > MBUF_SIZE) {\n-\t\tut_params->ibuf = rte_pktmbuf_alloc(ts_params->large_mbuf_pool);\n-\t\t/* Populate full size of add data */\n-\t\tfor (i = 32; i < MAX_AAD_LENGTH; i += 32)\n-\t\t\tmemcpy(&tdata->aad.data[i], &tdata->aad.data[0], 32);\n-\t} else\n-\t\tut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);\n+\t/* Verify the capabilities */\n+\tstruct rte_cryptodev_sym_capability_idx cap_idx;\n+\tcap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;\n+\tcap_idx.algo.auth = RTE_CRYPTO_AUTH_MD5_HMAC;\n+\tif (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],\n+\t\t\t&cap_idx) == NULL)\n+\t\treturn -ENOTSUP;\n \n-\tmemset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,\n-\t\t\trte_pktmbuf_tailroom(ut_params->ibuf));\n+\tif (MD5_HMAC_create_session(ts_params, ut_params,\n+\t\t\tRTE_CRYPTO_AUTH_OP_GENERATE, test_case))\n+\t\treturn TEST_FAILED;\n \n-\t/* Create AEAD operation */\n-\tretval = create_aead_operation(RTE_CRYPTO_AEAD_OP_DECRYPT, tdata);\n-\tif (retval < 0)\n-\t\treturn retval;\n+\t/* Generate Crypto op data structure */\n+\tut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,\n+\t\t\tRTE_CRYPTO_OP_TYPE_SYMMETRIC);\n+\tTEST_ASSERT_NOT_NULL(ut_params->op,\n+\t\t\t\"Failed to allocate symmetric crypto operation struct\");\n \n-\trte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);\n+\tplaintext_pad_len = RTE_ALIGN_CEIL(test_case->plaintext.len,\n+\t\t\t\t16);\n \n-\tut_params->op->sym->m_src = ut_params->ibuf;\n+\tif (MD5_HMAC_create_op(ut_params, test_case, &plaintext))\n+\t\treturn TEST_FAILED;\n \n-\t/* Process crypto operation */\n \tTEST_ASSERT_NOT_NULL(process_crypto_request(ts_params->valid_devs[0],\n \t\t\tut_params->op), \"failed to process sym crypto op\");\n \n \tTEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,\n \t\t\t\"crypto op processing failed\");\n \n-\tif (ut_params->op->sym->m_dst)\n-\t\tplaintext = rte_pktmbuf_mtod(ut_params->op->sym->m_dst,\n-\t\t\t\tuint8_t *);\n-\telse\n-\t\tplaintext = rte_pktmbuf_mtod_offset(ut_params->op->sym->m_src,\n-\t\t\t\tuint8_t *,\n-\t\t\t\tut_params->op->sym->cipher.data.offset);\n-\n-\tdebug_hexdump(stdout, \"plaintext:\", plaintext, tdata->ciphertext.len);\n+\tif (ut_params->op->sym->m_dst) {\n+\t\tauth_tag = rte_pktmbuf_mtod_offset(ut_params->op->sym->m_dst,\n+\t\t\t\tuint8_t *, plaintext_pad_len);\n+\t} else {\n+\t\tauth_tag = plaintext + plaintext_pad_len;\n+\t}\n \n-\t/* Validate obuf */\n \tTEST_ASSERT_BUFFERS_ARE_EQUAL(\n-\t\t\tplaintext,\n-\t\t\ttdata->plaintext.data,\n-\t\t\ttdata->plaintext.len,\n-\t\t\t\"Plaintext data not as expected\");\n-\n-\tTEST_ASSERT_EQUAL(ut_params->op->status,\n-\t\t\tRTE_CRYPTO_OP_STATUS_SUCCESS,\n-\t\t\t\"Authentication failed\");\n+\t\t\tauth_tag,\n+\t\t\ttest_case->auth_tag.data,\n+\t\t\ttest_case->auth_tag.len,\n+\t\t\t\"HMAC_MD5 generated tag not as expected\");\n \n-\treturn 0;\n+\treturn TEST_SUCCESS;\n }\n \n static int\n-test_AES_GCM_authenticated_decryption_test_case_1(void)\n+test_MD5_HMAC_verify(const struct HMAC_MD5_vector *test_case)\n {\n-\treturn test_authenticated_decryption(&gcm_test_case_1);\n-}\n+\tuint8_t *plaintext;\n \n-static int\n-test_AES_GCM_authenticated_decryption_test_case_2(void)\n-{\n-\treturn test_authenticated_decryption(&gcm_test_case_2);\n-}\n+\tstruct crypto_testsuite_params *ts_params = &testsuite_params;\n+\tstruct crypto_unittest_params *ut_params = &unittest_params;\n \n-static int\n-test_AES_GCM_authenticated_decryption_test_case_3(void)\n-{\n-\treturn test_authenticated_decryption(&gcm_test_case_3);\n-}\n+\t/* Verify the capabilities */\n+\tstruct rte_cryptodev_sym_capability_idx cap_idx;\n+\tcap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;\n+\tcap_idx.algo.auth = RTE_CRYPTO_AUTH_MD5_HMAC;\n+\tif (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],\n+\t\t\t&cap_idx) == NULL)\n+\t\treturn -ENOTSUP;\n \n-static int\n-test_AES_GCM_authenticated_decryption_test_case_4(void)\n-{\n-\treturn test_authenticated_decryption(&gcm_test_case_4);\n-}\n+\tif (MD5_HMAC_create_session(ts_params, ut_params,\n+\t\t\tRTE_CRYPTO_AUTH_OP_VERIFY, test_case)) {\n+\t\treturn TEST_FAILED;\n+\t}\n \n-static int\n-test_AES_GCM_authenticated_decryption_test_case_5(void)\n-{\n-\treturn test_authenticated_decryption(&gcm_test_case_5);\n-}\n+\t/* Generate Crypto op data structure */\n+\tut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,\n+\t\t\tRTE_CRYPTO_OP_TYPE_SYMMETRIC);\n+\tTEST_ASSERT_NOT_NULL(ut_params->op,\n+\t\t\t\"Failed to allocate symmetric crypto operation struct\");\n \n-static int\n-test_AES_GCM_authenticated_decryption_test_case_6(void)\n-{\n-\treturn test_authenticated_decryption(&gcm_test_case_6);\n+\tif (MD5_HMAC_create_op(ut_params, test_case, &plaintext))\n+\t\treturn TEST_FAILED;\n+\n+\tTEST_ASSERT_NOT_NULL(process_crypto_request(ts_params->valid_devs[0],\n+\t\t\tut_params->op), \"failed to process sym crypto op\");\n+\n+\tTEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,\n+\t\t\t\"HMAC_MD5 crypto op processing failed\");\n+\n+\treturn TEST_SUCCESS;\n }\n \n static int\n-test_AES_GCM_authenticated_decryption_test_case_7(void)\n+test_MD5_HMAC_generate_case_1(void)\n {\n-\treturn test_authenticated_decryption(&gcm_test_case_7);\n+\treturn test_MD5_HMAC_generate(&HMAC_MD5_test_case_1);\n }\n \n static int\n-test_AES_GCM_authenticated_decryption_test_case_8(void)\n+test_MD5_HMAC_verify_case_1(void)\n {\n-\treturn test_authenticated_decryption(&gcm_test_case_8);\n+\treturn test_MD5_HMAC_verify(&HMAC_MD5_test_case_1);\n }\n \n static int\n-test_AES_GCM_auth_decryption_test_case_192_1(void)\n+test_MD5_HMAC_generate_case_2(void)\n {\n-\treturn test_authenticated_decryption(&gcm_test_case_192_1);\n+\treturn test_MD5_HMAC_generate(&HMAC_MD5_test_case_2);\n }\n \n static int\n-test_AES_GCM_auth_decryption_test_case_192_2(void)\n+test_MD5_HMAC_verify_case_2(void)\n {\n-\treturn test_authenticated_decryption(&gcm_test_case_192_2);\n+\treturn test_MD5_HMAC_verify(&HMAC_MD5_test_case_2);\n }\n \n static int\n-test_AES_GCM_auth_decryption_test_case_192_3(void)\n+test_multi_session(void)\n {\n-\treturn test_authenticated_decryption(&gcm_test_case_192_3);\n-}\n-\n-static int\n-test_AES_GCM_auth_decryption_test_case_192_4(void)\n-{\n-\treturn test_authenticated_decryption(&gcm_test_case_192_4);\n-}\n+\tstruct crypto_testsuite_params *ts_params = &testsuite_params;\n+\tstruct crypto_unittest_params *ut_params = &unittest_params;\n \n-static int\n-test_AES_GCM_auth_decryption_test_case_192_5(void)\n-{\n-\treturn test_authenticated_decryption(&gcm_test_case_192_5);\n-}\n+\tstruct rte_cryptodev_info dev_info;\n+\tstruct rte_cryptodev_sym_session **sessions;\n \n-static int\n-test_AES_GCM_auth_decryption_test_case_192_6(void)\n-{\n-\treturn test_authenticated_decryption(&gcm_test_case_192_6);\n-}\n+\tuint16_t i;\n \n-static int\n-test_AES_GCM_auth_decryption_test_case_192_7(void)\n-{\n-\treturn test_authenticated_decryption(&gcm_test_case_192_7);\n-}\n+\t/* Verify the capabilities */\n+\tstruct rte_cryptodev_sym_capability_idx cap_idx;\n+\tcap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;\n+\tcap_idx.algo.auth = RTE_CRYPTO_AUTH_SHA512_HMAC;\n+\tif (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],\n+\t\t\t&cap_idx) == NULL)\n+\t\treturn -ENOTSUP;\n+\tcap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;\n+\tcap_idx.algo.cipher = RTE_CRYPTO_CIPHER_AES_CBC;\n+\tif (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],\n+\t\t\t&cap_idx) == NULL)\n+\t\treturn -ENOTSUP;\n \n-static int\n-test_AES_GCM_auth_decryption_test_case_256_1(void)\n-{\n-\treturn test_authenticated_decryption(&gcm_test_case_256_1);\n-}\n+\ttest_AES_CBC_HMAC_SHA512_decrypt_create_session_params(ut_params,\n+\t\t\taes_cbc_key, hmac_sha512_key);\n \n-static int\n-test_AES_GCM_auth_decryption_test_case_256_2(void)\n-{\n-\treturn test_authenticated_decryption(&gcm_test_case_256_2);\n-}\n \n-static int\n-test_AES_GCM_auth_decryption_test_case_256_3(void)\n-{\n-\treturn test_authenticated_decryption(&gcm_test_case_256_3);\n-}\n+\trte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);\n \n-static int\n-test_AES_GCM_auth_decryption_test_case_256_4(void)\n-{\n-\treturn test_authenticated_decryption(&gcm_test_case_256_4);\n-}\n+\tsessions = rte_malloc(NULL,\n+\t\t\t(sizeof(struct rte_cryptodev_sym_session *) *\n+\t\t\tMAX_NB_SESSIONS) + 1, 0);\n \n-static int\n-test_AES_GCM_auth_decryption_test_case_256_5(void)\n-{\n-\treturn test_authenticated_decryption(&gcm_test_case_256_5);\n-}\n+\t/* Create multiple crypto sessions*/\n+\tfor (i = 0; i < MAX_NB_SESSIONS; i++) {\n \n-static int\n-test_AES_GCM_auth_decryption_test_case_256_6(void)\n-{\n-\treturn test_authenticated_decryption(&gcm_test_case_256_6);\n-}\n+\t\tsessions[i] = rte_cryptodev_sym_session_create(\n+\t\t\t\tts_params->session_mpool);\n \n-static int\n-test_AES_GCM_auth_decryption_test_case_256_7(void)\n-{\n-\treturn test_authenticated_decryption(&gcm_test_case_256_7);\n-}\n+\t\trte_cryptodev_sym_session_init(ts_params->valid_devs[0],\n+\t\t\t\tsessions[i], &ut_params->auth_xform,\n+\t\t\t\tts_params->session_priv_mpool);\n+\t\tTEST_ASSERT_NOT_NULL(sessions[i],\n+\t\t\t\t\"Session creation failed at session number %u\",\n+\t\t\t\ti);\n \n-static int\n-test_AES_GCM_auth_decryption_test_case_aad_1(void)\n-{\n-\treturn test_authenticated_decryption(&gcm_test_case_aad_1);\n-}\n+\t\t/* Attempt to send a request on each session */\n+\t\tTEST_ASSERT_SUCCESS( test_AES_CBC_HMAC_SHA512_decrypt_perform(\n+\t\t\tsessions[i],\n+\t\t\tut_params,\n+\t\t\tts_params,\n+\t\t\tcatch_22_quote_2_512_bytes_AES_CBC_ciphertext,\n+\t\t\tcatch_22_quote_2_512_bytes_AES_CBC_HMAC_SHA512_digest,\n+\t\t\taes_cbc_iv),\n+\t\t\t\"Failed to perform decrypt on request number %u.\", i);\n+\t\t/* free crypto operation structure */\n+\t\tif (ut_params->op)\n+\t\t\trte_crypto_op_free(ut_params->op);\n \n-static int\n-test_AES_GCM_auth_decryption_test_case_aad_2(void)\n-{\n-\treturn test_authenticated_decryption(&gcm_test_case_aad_2);\n-}\n+\t\t/*\n+\t\t * free mbuf - both obuf and ibuf are usually the same,\n+\t\t * so check if they point at the same address is necessary,\n+\t\t * to avoid freeing the mbuf twice.\n+\t\t */\n+\t\tif (ut_params->obuf) {\n+\t\t\trte_pktmbuf_free(ut_params->obuf);\n+\t\t\tif (ut_params->ibuf == ut_params->obuf)\n+\t\t\t\tut_params->ibuf = 0;\n+\t\t\tut_params->obuf = 0;\n+\t\t}\n+\t\tif (ut_params->ibuf) {\n+\t\t\trte_pktmbuf_free(ut_params->ibuf);\n+\t\t\tut_params->ibuf = 0;\n+\t\t}\n+\t}\n \n-static int\n-test_AES_GCM_auth_decryption_fail_iv_corrupt(void)\n-{\n-\tstruct aead_test_data tdata;\n-\tint res;\n+\t/* Next session create should fail */\n+\trte_cryptodev_sym_session_init(ts_params->valid_devs[0],\n+\t\t\tsessions[i], &ut_params->auth_xform,\n+\t\t\tts_params->session_priv_mpool);\n+\tTEST_ASSERT_NULL(sessions[i],\n+\t\t\t\"Session creation succeeded unexpectedly!\");\n \n-\tmemcpy(&tdata, &gcm_test_case_7, sizeof(struct aead_test_data));\n-\ttdata.iv.data[0] += 1;\n-\tres = test_authenticated_decryption(&tdata);\n-\tTEST_ASSERT_EQUAL(res, TEST_FAILED, \"decryption not failed\");\n-\treturn TEST_SUCCESS;\n-}\n+\tfor (i = 0; i < MAX_NB_SESSIONS; i++) {\n+\t\trte_cryptodev_sym_session_clear(ts_params->valid_devs[0],\n+\t\t\t\tsessions[i]);\n+\t\trte_cryptodev_sym_session_free(sessions[i]);\n+\t}\n \n-static int\n-test_AES_GCM_auth_decryption_fail_in_data_corrupt(void)\n-{\n-\tstruct aead_test_data tdata;\n-\tint res;\n+\trte_free(sessions);\n \n-\tRTE_LOG(INFO, USER1, \"This is a negative test, errors are expected\\n\");\n-\tmemcpy(&tdata, &gcm_test_case_7, sizeof(struct aead_test_data));\n-\ttdata.plaintext.data[0] += 1;\n-\tres = test_authenticated_decryption(&tdata);\n-\tTEST_ASSERT_EQUAL(res, TEST_FAILED, \"decryption not failed\");\n \treturn TEST_SUCCESS;\n }\n \n-static int\n-test_AES_GCM_auth_decryption_fail_out_data_corrupt(void)\n-{\n-\tstruct aead_test_data tdata;\n-\tint res;\n+struct multi_session_params {\n+\tstruct crypto_unittest_params ut_params;\n+\tuint8_t *cipher_key;\n+\tuint8_t *hmac_key;\n+\tconst uint8_t *cipher;\n+\tconst uint8_t *digest;\n+\tuint8_t *iv;\n+};\n \n-\tmemcpy(&tdata, &gcm_test_case_7, sizeof(struct aead_test_data));\n-\ttdata.ciphertext.data[0] += 1;\n-\tres = test_authenticated_decryption(&tdata);\n-\tTEST_ASSERT_EQUAL(res, TEST_FAILED, \"decryption not failed\");\n-\treturn TEST_SUCCESS;\n-}\n+#define MB_SESSION_NUMBER 3\n \n static int\n-test_AES_GCM_auth_decryption_fail_aad_len_corrupt(void)\n+test_multi_session_random_usage(void)\n {\n-\tstruct aead_test_data tdata;\n-\tint res;\n+\tstruct crypto_testsuite_params *ts_params = &testsuite_params;\n+\tstruct rte_cryptodev_info dev_info;\n+\tstruct rte_cryptodev_sym_session **sessions;\n+\tuint32_t i, j;\n+\tstruct multi_session_params ut_paramz[] = {\n \n-\tmemcpy(&tdata, &gcm_test_case_7, sizeof(struct aead_test_data));\n-\ttdata.aad.len += 1;\n-\tres = test_authenticated_decryption(&tdata);\n-\tTEST_ASSERT_EQUAL(res, TEST_FAILED, \"decryption not failed\");\n-\treturn TEST_SUCCESS;\n-}\n+\t\t{\n+\t\t\t.cipher_key = ms_aes_cbc_key0,\n+\t\t\t.hmac_key = ms_hmac_key0,\n+\t\t\t.cipher = ms_aes_cbc_cipher0,\n+\t\t\t.digest = ms_hmac_digest0,\n+\t\t\t.iv = ms_aes_cbc_iv0\n+\t\t},\n+\t\t{\n+\t\t\t.cipher_key = ms_aes_cbc_key1,\n+\t\t\t.hmac_key = ms_hmac_key1,\n+\t\t\t.cipher = ms_aes_cbc_cipher1,\n+\t\t\t.digest = ms_hmac_digest1,\n+\t\t\t.iv = ms_aes_cbc_iv1\n+\t\t},\n+\t\t{\n+\t\t\t.cipher_key = ms_aes_cbc_key2,\n+\t\t\t.hmac_key = ms_hmac_key2,\n+\t\t\t.cipher = ms_aes_cbc_cipher2,\n+\t\t\t.digest = ms_hmac_digest2,\n+\t\t\t.iv = ms_aes_cbc_iv2\n+\t\t},\n \n-static int\n-test_AES_GCM_auth_decryption_fail_aad_corrupt(void)\n-{\n-\tstruct aead_test_data tdata;\n-\tuint8_t aad[gcm_test_case_7.aad.len];\n-\tint res;\n+\t};\n \n-\tmemcpy(&tdata, &gcm_test_case_7, sizeof(struct aead_test_data));\n-\tmemcpy(aad, gcm_test_case_7.aad.data, gcm_test_case_7.aad.len);\n-\taad[0] += 1;\n-\ttdata.aad.data = aad;\n-\tres = test_authenticated_decryption(&tdata);\n-\tTEST_ASSERT_EQUAL(res, TEST_FAILED, \"decryption not failed\");\n-\treturn TEST_SUCCESS;\n-}\n+\t/* Verify the capabilities */\n+\tstruct rte_cryptodev_sym_capability_idx cap_idx;\n+\tcap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;\n+\tcap_idx.algo.auth = RTE_CRYPTO_AUTH_SHA512_HMAC;\n+\tif (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],\n+\t\t\t&cap_idx) == NULL)\n+\t\treturn -ENOTSUP;\n+\tcap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;\n+\tcap_idx.algo.cipher = RTE_CRYPTO_CIPHER_AES_CBC;\n+\tif (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],\n+\t\t\t&cap_idx) == NULL)\n+\t\treturn -ENOTSUP;\n \n-static int\n-test_AES_GCM_auth_decryption_fail_tag_corrupt(void)\n-{\n-\tstruct aead_test_data tdata;\n-\tint res;\n+\trte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);\n \n-\tmemcpy(&tdata, &gcm_test_case_7, sizeof(struct aead_test_data));\n-\ttdata.auth_tag.data[0] += 1;\n-\tres = test_authenticated_decryption(&tdata);\n-\tTEST_ASSERT_EQUAL(res, TEST_FAILED, \"authentication not failed\");\n-\treturn TEST_SUCCESS;\n-}\n+\tsessions = rte_malloc(NULL,\n+\t\t\t(sizeof(struct rte_cryptodev_sym_session *)\n+\t\t\t\t\t* MAX_NB_SESSIONS) + 1, 0);\n \n-static int\n-test_authenticated_encryption_oop(const struct aead_test_data *tdata)\n-{\n-\tstruct crypto_testsuite_params *ts_params = &testsuite_params;\n-\tstruct crypto_unittest_params *ut_params = &unittest_params;\n-\n-\tint retval;\n-\tuint8_t *ciphertext, *auth_tag;\n-\tuint16_t plaintext_pad_len;\n-\n-\t/* Create AEAD session */\n-\tretval = create_aead_session(ts_params->valid_devs[0],\n-\t\t\ttdata->algo,\n-\t\t\tRTE_CRYPTO_AEAD_OP_ENCRYPT,\n-\t\t\ttdata->key.data, tdata->key.len,\n-\t\t\ttdata->aad.len, tdata->auth_tag.len,\n-\t\t\ttdata->iv.len);\n-\tif (retval < 0)\n-\t\treturn retval;\n-\n-\tut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);\n-\tut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);\n-\n-\t/* clear mbuf payload */\n-\tmemset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,\n-\t\t\trte_pktmbuf_tailroom(ut_params->ibuf));\n-\tmemset(rte_pktmbuf_mtod(ut_params->obuf, uint8_t *), 0,\n-\t\t\trte_pktmbuf_tailroom(ut_params->obuf));\n+\tfor (i = 0; i < MB_SESSION_NUMBER; i++) {\n+\t\tsessions[i] = rte_cryptodev_sym_session_create(\n+\t\t\t\tts_params->session_mpool);\n \n-\t/* Create AEAD operation */\n-\tretval = create_aead_operation(RTE_CRYPTO_AEAD_OP_ENCRYPT, tdata);\n-\tif (retval < 0)\n-\t\treturn retval;\n+\t\trte_memcpy(&ut_paramz[i].ut_params, &unittest_params,\n+\t\t\t\tsizeof(struct crypto_unittest_params));\n \n-\trte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);\n+\t\ttest_AES_CBC_HMAC_SHA512_decrypt_create_session_params(\n+\t\t\t\t&ut_paramz[i].ut_params,\n+\t\t\t\tut_paramz[i].cipher_key, ut_paramz[i].hmac_key);\n \n-\tut_params->op->sym->m_src = ut_params->ibuf;\n-\tut_params->op->sym->m_dst = ut_params->obuf;\n+\t\t/* Create multiple crypto sessions*/\n+\t\trte_cryptodev_sym_session_init(\n+\t\t\t\tts_params->valid_devs[0],\n+\t\t\t\tsessions[i],\n+\t\t\t\t&ut_paramz[i].ut_params.auth_xform,\n+\t\t\t\tts_params->session_priv_mpool);\n \n-\t/* Process crypto operation */\n-\tTEST_ASSERT_NOT_NULL(process_crypto_request(ts_params->valid_devs[0],\n-\t\t\tut_params->op), \"failed to process sym crypto op\");\n+\t\tTEST_ASSERT_NOT_NULL(sessions[i],\n+\t\t\t\t\"Session creation failed at session number %u\",\n+\t\t\t\ti);\n \n-\tTEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,\n-\t\t\t\"crypto op processing failed\");\n+\t}\n \n-\tplaintext_pad_len = RTE_ALIGN_CEIL(tdata->plaintext.len, 16);\n+\tsrand(time(NULL));\n+\tfor (i = 0; i < 40000; i++) {\n \n-\tciphertext = rte_pktmbuf_mtod_offset(ut_params->obuf, uint8_t *,\n-\t\t\tut_params->op->sym->cipher.data.offset);\n-\tauth_tag = ciphertext + plaintext_pad_len;\n+\t\tj = rand() % MB_SESSION_NUMBER;\n \n-\tdebug_hexdump(stdout, \"ciphertext:\", ciphertext, tdata->ciphertext.len);\n-\tdebug_hexdump(stdout, \"auth tag:\", auth_tag, tdata->auth_tag.len);\n+\t\tTEST_ASSERT_SUCCESS(\n+\t\t\ttest_AES_CBC_HMAC_SHA512_decrypt_perform(\n+\t\t\t\t\tsessions[j],\n+\t\t\t\t\t&ut_paramz[j].ut_params,\n+\t\t\t\t\tts_params, ut_paramz[j].cipher,\n+\t\t\t\t\tut_paramz[j].digest,\n+\t\t\t\t\tut_paramz[j].iv),\n+\t\t\t\"Failed to perform decrypt on request number %u.\", i);\n \n-\t/* Validate obuf */\n-\tTEST_ASSERT_BUFFERS_ARE_EQUAL(\n-\t\t\tciphertext,\n-\t\t\ttdata->ciphertext.data,\n-\t\t\ttdata->ciphertext.len,\n-\t\t\t\"Ciphertext data not as expected\");\n+\t\tif (ut_paramz[j].ut_params.op)\n+\t\t\trte_crypto_op_free(ut_paramz[j].ut_params.op);\n \n-\tTEST_ASSERT_BUFFERS_ARE_EQUAL(\n-\t\t\tauth_tag,\n-\t\t\ttdata->auth_tag.data,\n-\t\t\ttdata->auth_tag.len,\n-\t\t\t\"Generated auth tag not as expected\");\n+\t\t/*\n+\t\t * free mbuf - both obuf and ibuf are usually the same,\n+\t\t * so check if they point at the same address is necessary,\n+\t\t * to avoid freeing the mbuf twice.\n+\t\t */\n+\t\tif (ut_paramz[j].ut_params.obuf) {\n+\t\t\trte_pktmbuf_free(ut_paramz[j].ut_params.obuf);\n+\t\t\tif (ut_paramz[j].ut_params.ibuf\n+\t\t\t\t\t== ut_paramz[j].ut_params.obuf)\n+\t\t\t\tut_paramz[j].ut_params.ibuf = 0;\n+\t\t\tut_paramz[j].ut_params.obuf = 0;\n+\t\t}\n+\t\tif (ut_paramz[j].ut_params.ibuf) {\n+\t\t\trte_pktmbuf_free(ut_paramz[j].ut_params.ibuf);\n+\t\t\tut_paramz[j].ut_params.ibuf = 0;\n+\t\t}\n+\t}\n \n-\treturn 0;\n+\tfor (i = 0; i < MB_SESSION_NUMBER; i++) {\n+\t\trte_cryptodev_sym_session_clear(ts_params->valid_devs[0],\n+\t\t\t\tsessions[i]);\n+\t\trte_cryptodev_sym_session_free(sessions[i]);\n+\t}\n \n-}\n+\trte_free(sessions);\n \n-static int\n-test_AES_GCM_authenticated_encryption_oop_test_case_1(void)\n-{\n-\treturn test_authenticated_encryption_oop(&gcm_test_case_5);\n+\treturn TEST_SUCCESS;\n }\n \n static int\n-test_authenticated_decryption_oop(const struct aead_test_data *tdata)\n+test_null_cipher_only_operation(void)\n {\n \tstruct crypto_testsuite_params *ts_params = &testsuite_params;\n \tstruct crypto_unittest_params *ut_params = &unittest_params;\n \n-\tint retval;\n-\tuint8_t *plaintext;\n+\t/* Verify the capabilities */\n+\tstruct rte_cryptodev_sym_capability_idx cap_idx;\n+\tcap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;\n+\tcap_idx.algo.cipher = RTE_CRYPTO_CIPHER_NULL;\n+\tif (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],\n+\t\t\t&cap_idx) == NULL)\n+\t\treturn -ENOTSUP;\n \n-\t/* Create AEAD session */\n-\tretval = create_aead_session(ts_params->valid_devs[0],\n-\t\t\ttdata->algo,\n-\t\t\tRTE_CRYPTO_AEAD_OP_DECRYPT,\n-\t\t\ttdata->key.data, tdata->key.len,\n-\t\t\ttdata->aad.len, tdata->auth_tag.len,\n-\t\t\ttdata->iv.len);\n-\tif (retval < 0)\n-\t\treturn retval;\n+\t/* Generate test mbuf data and space for digest */\n+\tut_params->ibuf = setup_test_string(ts_params->mbuf_pool,\n+\t\t\tcatch_22_quote, QUOTE_512_BYTES, 0);\n \n-\t/* alloc mbuf and set payload */\n-\tut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);\n-\tut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);\n+\t/* Setup Cipher Parameters */\n+\tut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER;\n+\tut_params->cipher_xform.next = NULL;\n \n-\tmemset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,\n-\t\t\trte_pktmbuf_tailroom(ut_params->ibuf));\n-\tmemset(rte_pktmbuf_mtod(ut_params->obuf, uint8_t *), 0,\n-\t\t\trte_pktmbuf_tailroom(ut_params->obuf));\n+\tut_params->cipher_xform.cipher.algo = RTE_CRYPTO_CIPHER_NULL;\n+\tut_params->cipher_xform.cipher.op = RTE_CRYPTO_CIPHER_OP_ENCRYPT;\n \n-\t/* Create AEAD operation */\n-\tretval = create_aead_operation(RTE_CRYPTO_AEAD_OP_DECRYPT, tdata);\n-\tif (retval < 0)\n-\t\treturn retval;\n+\tut_params->sess = rte_cryptodev_sym_session_create(\n+\t\t\tts_params->session_mpool);\n+\n+\t/* Create Crypto session*/\n+\trte_cryptodev_sym_session_init(ts_params->valid_devs[0],\n+\t\t\t\tut_params->sess,\n+\t\t\t\t&ut_params->cipher_xform,\n+\t\t\t\tts_params->session_priv_mpool);\n+\tTEST_ASSERT_NOT_NULL(ut_params->sess, \"Session creation failed\");\n+\n+\t/* Generate Crypto op data structure */\n+\tut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,\n+\t\t\tRTE_CRYPTO_OP_TYPE_SYMMETRIC);\n+\tTEST_ASSERT_NOT_NULL(ut_params->op,\n+\t\t\t\"Failed to allocate symmetric crypto operation struct\");\n \n+\t/* Set crypto operation data parameters */\n \trte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);\n \n-\tut_params->op->sym->m_src = ut_params->ibuf;\n-\tut_params->op->sym->m_dst = ut_params->obuf;\n+\tstruct rte_crypto_sym_op *sym_op = ut_params->op->sym;\n \n-\t/* Process crypto operation */\n-\tTEST_ASSERT_NOT_NULL(process_crypto_request(ts_params->valid_devs[0],\n-\t\t\tut_params->op), \"failed to process sym crypto op\");\n+\t/* set crypto operation source mbuf */\n+\tsym_op->m_src = ut_params->ibuf;\n \n-\tTEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,\n-\t\t\t\"crypto op processing failed\");\n+\tsym_op->cipher.data.offset = 0;\n+\tsym_op->cipher.data.length = QUOTE_512_BYTES;\n \n-\tplaintext = rte_pktmbuf_mtod_offset(ut_params->obuf, uint8_t *,\n-\t\t\tut_params->op->sym->cipher.data.offset);\n+\t/* Process crypto operation */\n+\tut_params->op = process_crypto_request(ts_params->valid_devs[0],\n+\t\t\tut_params->op);\n+\tTEST_ASSERT_NOT_NULL(ut_params->op, \"no crypto operation returned\");\n \n-\tdebug_hexdump(stdout, \"plaintext:\", plaintext, tdata->ciphertext.len);\n+\tTEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,\n+\t\t\t\"crypto operation processing failed\");\n \n \t/* Validate obuf */\n \tTEST_ASSERT_BUFFERS_ARE_EQUAL(\n-\t\t\tplaintext,\n-\t\t\ttdata->plaintext.data,\n-\t\t\ttdata->plaintext.len,\n-\t\t\t\"Plaintext data not as expected\");\n-\n-\tTEST_ASSERT_EQUAL(ut_params->op->status,\n-\t\t\tRTE_CRYPTO_OP_STATUS_SUCCESS,\n-\t\t\t\"Authentication failed\");\n-\treturn 0;\n-}\n+\t\t\trte_pktmbuf_mtod(ut_params->op->sym->m_src, uint8_t *),\n+\t\t\tcatch_22_quote,\n+\t\t\tQUOTE_512_BYTES,\n+\t\t\t\"Ciphertext data not as expected\");\n \n-static int\n-test_AES_GCM_authenticated_decryption_oop_test_case_1(void)\n-{\n-\treturn test_authenticated_decryption_oop(&gcm_test_case_5);\n+\treturn TEST_SUCCESS;\n }\n-\n+uint8_t orig_data[] = {0xab, 0xab, 0xab, 0xab,\n+\t\t\t0xab, 0xab, 0xab, 0xab,\n+\t\t\t0xab, 0xab, 0xab, 0xab,\n+\t\t\t0xab, 0xab, 0xab, 0xab};\n static int\n-test_authenticated_encryption_sessionless(\n-\t\tconst struct aead_test_data *tdata)\n+test_null_auth_only_operation(void)\n {\n \tstruct crypto_testsuite_params *ts_params = &testsuite_params;\n \tstruct crypto_unittest_params *ut_params = &unittest_params;\n+\tuint8_t *digest;\n \n-\tint retval;\n-\tuint8_t *ciphertext, *auth_tag;\n-\tuint16_t plaintext_pad_len;\n-\tuint8_t key[tdata->key.len + 1];\n+\t/* Verify the capabilities */\n+\tstruct rte_cryptodev_sym_capability_idx cap_idx;\n+\tcap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;\n+\tcap_idx.algo.auth = RTE_CRYPTO_AUTH_NULL;\n+\tif (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],\n+\t\t\t&cap_idx) == NULL)\n+\t\treturn -ENOTSUP;\n \n-\tut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);\n+\t/* Generate test mbuf data and space for digest */\n+\tut_params->ibuf = setup_test_string(ts_params->mbuf_pool,\n+\t\t\tcatch_22_quote, QUOTE_512_BYTES, 0);\n \n-\t/* clear mbuf payload */\n-\tmemset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,\n-\t\t\trte_pktmbuf_tailroom(ut_params->ibuf));\n+\t/* create a pointer for digest, but don't expect anything to be written\n+\t * here in a NULL auth algo so no mbuf append done.\n+\t */\n+\tdigest = rte_pktmbuf_mtod_offset(ut_params->ibuf, uint8_t *,\n+\t\t\tQUOTE_512_BYTES);\n+\t/* prefill the memory pointed to by digest */\n+\tmemcpy(digest, orig_data, sizeof(orig_data));\n \n-\t/* Create AEAD operation */\n-\tretval = create_aead_operation(RTE_CRYPTO_AEAD_OP_ENCRYPT, tdata);\n-\tif (retval < 0)\n-\t\treturn retval;\n+\t/* Setup HMAC Parameters */\n+\tut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;\n+\tut_params->auth_xform.next = NULL;\n \n-\t/* Create GCM xform */\n-\tmemcpy(key, tdata->key.data, tdata->key.len);\n-\tretval = create_aead_xform(ut_params->op,\n-\t\t\ttdata->algo,\n-\t\t\tRTE_CRYPTO_AEAD_OP_ENCRYPT,\n-\t\t\tkey, tdata->key.len,\n-\t\t\ttdata->aad.len, tdata->auth_tag.len,\n-\t\t\ttdata->iv.len);\n-\tif (retval < 0)\n-\t\treturn retval;\n-\n-\tut_params->op->sym->m_src = ut_params->ibuf;\n+\tut_params->auth_xform.auth.algo = RTE_CRYPTO_AUTH_NULL;\n+\tut_params->auth_xform.auth.op = RTE_CRYPTO_AUTH_OP_GENERATE;\n \n-\tTEST_ASSERT_EQUAL(ut_params->op->sess_type,\n-\t\t\tRTE_CRYPTO_OP_SESSIONLESS,\n-\t\t\t\"crypto op session type not sessionless\");\n+\tut_params->sess = rte_cryptodev_sym_session_create(\n+\t\t\tts_params->session_mpool);\n \n-\t/* Process crypto operation */\n-\tTEST_ASSERT_NOT_NULL(process_crypto_request(ts_params->valid_devs[0],\n-\t\t\tut_params->op), \"failed to process sym crypto op\");\n+\t/* Create Crypto session*/\n+\trte_cryptodev_sym_session_init(ts_params->valid_devs[0],\n+\t\t\tut_params->sess, &ut_params->auth_xform,\n+\t\t\tts_params->session_priv_mpool);\n+\tTEST_ASSERT_NOT_NULL(ut_params->sess, \"Session creation failed\");\n \n-\tTEST_ASSERT_NOT_NULL(ut_params->op, \"failed crypto process\");\n+\t/* Generate Crypto op data structure */\n+\tut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,\n+\t\t\tRTE_CRYPTO_OP_TYPE_SYMMETRIC);\n+\tTEST_ASSERT_NOT_NULL(ut_params->op,\n+\t\t\t\"Failed to allocate symmetric crypto operation struct\");\n \n-\tTEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,\n-\t\t\t\"crypto op status not success\");\n+\t/* Set crypto operation data parameters */\n+\trte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);\n \n-\tplaintext_pad_len = RTE_ALIGN_CEIL(tdata->plaintext.len, 16);\n+\tstruct rte_crypto_sym_op *sym_op = ut_params->op->sym;\n \n-\tciphertext = rte_pktmbuf_mtod_offset(ut_params->ibuf, uint8_t *,\n-\t\t\tut_params->op->sym->cipher.data.offset);\n-\tauth_tag = ciphertext + plaintext_pad_len;\n+\tsym_op->m_src = ut_params->ibuf;\n \n-\tdebug_hexdump(stdout, \"ciphertext:\", ciphertext, tdata->ciphertext.len);\n-\tdebug_hexdump(stdout, \"auth tag:\", auth_tag, tdata->auth_tag.len);\n+\tsym_op->auth.data.offset = 0;\n+\tsym_op->auth.data.length = QUOTE_512_BYTES;\n+\tsym_op->auth.digest.data = digest;\n+\tsym_op->auth.digest.phys_addr = rte_pktmbuf_iova_offset(ut_params->ibuf,\n+\t\t\tQUOTE_512_BYTES);\n \n-\t/* Validate obuf */\n-\tTEST_ASSERT_BUFFERS_ARE_EQUAL(\n-\t\t\tciphertext,\n-\t\t\ttdata->ciphertext.data,\n-\t\t\ttdata->ciphertext.len,\n-\t\t\t\"Ciphertext data not as expected\");\n+\t/* Process crypto operation */\n+\tut_params->op = process_crypto_request(ts_params->valid_devs[0],\n+\t\t\tut_params->op);\n+\tTEST_ASSERT_NOT_NULL(ut_params->op, \"no crypto operation returned\");\n \n+\tTEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,\n+\t\t\t\"crypto operation processing failed\");\n+\t/* Make sure memory pointed to by digest hasn't been overwritten */\n \tTEST_ASSERT_BUFFERS_ARE_EQUAL(\n-\t\t\tauth_tag,\n-\t\t\ttdata->auth_tag.data,\n-\t\t\ttdata->auth_tag.len,\n-\t\t\t\"Generated auth tag not as expected\");\n-\n-\treturn 0;\n+\t\t\torig_data,\n+\t\t\tdigest,\n+\t\t\tsizeof(orig_data),\n+\t\t\t\"Memory at digest ptr overwritten unexpectedly\");\n \n+\treturn TEST_SUCCESS;\n }\n \n-static int\n-test_AES_GCM_authenticated_encryption_sessionless_test_case_1(void)\n-{\n-\treturn test_authenticated_encryption_sessionless(\n-\t\t\t&gcm_test_case_5);\n-}\n \n static int\n-test_authenticated_decryption_sessionless(\n-\t\tconst struct aead_test_data *tdata)\n+test_null_cipher_auth_operation(void)\n {\n \tstruct crypto_testsuite_params *ts_params = &testsuite_params;\n \tstruct crypto_unittest_params *ut_params = &unittest_params;\n+\tuint8_t *digest;\n \n-\tint retval;\n-\tuint8_t *plaintext;\n-\tuint8_t key[tdata->key.len + 1];\n+\t/* Verify the capabilities */\n+\tstruct rte_cryptodev_sym_capability_idx cap_idx;\n+\tcap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;\n+\tcap_idx.algo.auth = RTE_CRYPTO_AUTH_NULL;\n+\tif (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],\n+\t\t\t&cap_idx) == NULL)\n+\t\treturn -ENOTSUP;\n+\tcap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;\n+\tcap_idx.algo.cipher = RTE_CRYPTO_CIPHER_NULL;\n+\tif (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],\n+\t\t\t&cap_idx) == NULL)\n+\t\treturn -ENOTSUP;\n \n-\t/* alloc mbuf and set payload */\n-\tut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);\n+\t/* Generate test mbuf data and space for digest */\n+\tut_params->ibuf = setup_test_string(ts_params->mbuf_pool,\n+\t\t\tcatch_22_quote, QUOTE_512_BYTES, 0);\n \n-\tmemset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,\n-\t\t\trte_pktmbuf_tailroom(ut_params->ibuf));\n+\t/* create a pointer for digest, but don't expect anything to be written\n+\t * here in a NULL auth algo so no mbuf append done.\n+\t */\n+\tdigest = rte_pktmbuf_mtod_offset(ut_params->ibuf, uint8_t *,\n+\t\t\tQUOTE_512_BYTES);\n+\t/* prefill the memory pointed to by digest */\n+\tmemcpy(digest, orig_data, sizeof(orig_data));\n \n-\t/* Create AEAD operation */\n-\tretval = create_aead_operation(RTE_CRYPTO_AEAD_OP_DECRYPT, tdata);\n-\tif (retval < 0)\n-\t\treturn retval;\n+\t/* Setup Cipher Parameters */\n+\tut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER;\n+\tut_params->cipher_xform.next = &ut_params->auth_xform;\n \n-\t/* Create AEAD xform */\n-\tmemcpy(key, tdata->key.data, tdata->key.len);\n-\tretval = create_aead_xform(ut_params->op,\n-\t\t\ttdata->algo,\n-\t\t\tRTE_CRYPTO_AEAD_OP_DECRYPT,\n-\t\t\tkey, tdata->key.len,\n-\t\t\ttdata->aad.len, tdata->auth_tag.len,\n-\t\t\ttdata->iv.len);\n-\tif (retval < 0)\n-\t\treturn retval;\n+\tut_params->cipher_xform.cipher.algo = RTE_CRYPTO_CIPHER_NULL;\n+\tut_params->cipher_xform.cipher.op = RTE_CRYPTO_CIPHER_OP_ENCRYPT;\n \n-\tut_params->op->sym->m_src = ut_params->ibuf;\n+\t/* Setup HMAC Parameters */\n+\tut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;\n+\tut_params->auth_xform.next = NULL;\n \n-\tTEST_ASSERT_EQUAL(ut_params->op->sess_type,\n-\t\t\tRTE_CRYPTO_OP_SESSIONLESS,\n-\t\t\t\"crypto op session type not sessionless\");\n+\tut_params->auth_xform.auth.algo = RTE_CRYPTO_AUTH_NULL;\n+\tut_params->auth_xform.auth.op = RTE_CRYPTO_AUTH_OP_GENERATE;\n \n-\t/* Process crypto operation */\n-\tTEST_ASSERT_NOT_NULL(process_crypto_request(ts_params->valid_devs[0],\n-\t\t\tut_params->op), \"failed to process sym crypto op\");\n+\tut_params->sess = rte_cryptodev_sym_session_create(\n+\t\t\tts_params->session_mpool);\n \n-\tTEST_ASSERT_NOT_NULL(ut_params->op, \"failed crypto process\");\n+\t/* Create Crypto session*/\n+\trte_cryptodev_sym_session_init(ts_params->valid_devs[0],\n+\t\t\tut_params->sess, &ut_params->cipher_xform,\n+\t\t\tts_params->session_priv_mpool);\n+\tTEST_ASSERT_NOT_NULL(ut_params->sess, \"Session creation failed\");\n \n-\tTEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,\n-\t\t\t\"crypto op status not success\");\n+\t/* Generate Crypto op data structure */\n+\tut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,\n+\t\t\tRTE_CRYPTO_OP_TYPE_SYMMETRIC);\n+\tTEST_ASSERT_NOT_NULL(ut_params->op,\n+\t\t\t\"Failed to allocate symmetric crypto operation struct\");\n \n-\tplaintext = rte_pktmbuf_mtod_offset(ut_params->ibuf, uint8_t *,\n-\t\t\tut_params->op->sym->cipher.data.offset);\n+\t/* Set crypto operation data parameters */\n+\trte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);\n \n-\tdebug_hexdump(stdout, \"plaintext:\", plaintext, tdata->ciphertext.len);\n+\tstruct rte_crypto_sym_op *sym_op = ut_params->op->sym;\n \n-\t/* Validate obuf */\n-\tTEST_ASSERT_BUFFERS_ARE_EQUAL(\n-\t\t\tplaintext,\n-\t\t\ttdata->plaintext.data,\n-\t\t\ttdata->plaintext.len,\n-\t\t\t\"Plaintext data not as expected\");\n+\tsym_op->m_src = ut_params->ibuf;\n \n-\tTEST_ASSERT_EQUAL(ut_params->op->status,\n-\t\t\tRTE_CRYPTO_OP_STATUS_SUCCESS,\n-\t\t\t\"Authentication failed\");\n-\treturn 0;\n-}\n+\tsym_op->cipher.data.offset = 0;\n+\tsym_op->cipher.data.length = QUOTE_512_BYTES;\n \n-static int\n-test_AES_GCM_authenticated_decryption_sessionless_test_case_1(void)\n-{\n-\treturn test_authenticated_decryption_sessionless(\n-\t\t\t&gcm_test_case_5);\n-}\n+\tsym_op->auth.data.offset = 0;\n+\tsym_op->auth.data.length = QUOTE_512_BYTES;\n+\tsym_op->auth.digest.data = digest;\n+\tsym_op->auth.digest.phys_addr = rte_pktmbuf_iova_offset(ut_params->ibuf,\n+\t\t\tQUOTE_512_BYTES);\n \n-static int\n-test_AES_CCM_authenticated_encryption_test_case_128_1(void)\n-{\n-\treturn test_authenticated_encryption(&ccm_test_case_128_1);\n-}\n+\t/* Process crypto operation */\n+\tut_params->op = process_crypto_request(ts_params->valid_devs[0],\n+\t\t\tut_params->op);\n+\tTEST_ASSERT_NOT_NULL(ut_params->op, \"no crypto operation returned\");\n \n-static int\n-test_AES_CCM_authenticated_encryption_test_case_128_2(void)\n-{\n-\treturn test_authenticated_encryption(&ccm_test_case_128_2);\n-}\n+\tTEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,\n+\t\t\t\"crypto operation processing failed\");\n \n-static int\n-test_AES_CCM_authenticated_encryption_test_case_128_3(void)\n-{\n-\treturn test_authenticated_encryption(&ccm_test_case_128_3);\n-}\n+\t/* Validate obuf */\n+\tTEST_ASSERT_BUFFERS_ARE_EQUAL(\n+\t\t\trte_pktmbuf_mtod(ut_params->op->sym->m_src, uint8_t *),\n+\t\t\tcatch_22_quote,\n+\t\t\tQUOTE_512_BYTES,\n+\t\t\t\"Ciphertext data not as expected\");\n+\t/* Make sure memory pointed to by digest hasn't been overwritten */\n+\tTEST_ASSERT_BUFFERS_ARE_EQUAL(\n+\t\t\torig_data,\n+\t\t\tdigest,\n+\t\t\tsizeof(orig_data),\n+\t\t\t\"Memory at digest ptr overwritten unexpectedly\");\n \n-static int\n-test_AES_CCM_authenticated_decryption_test_case_128_1(void)\n-{\n-\treturn test_authenticated_decryption(&ccm_test_case_128_1);\n+\treturn TEST_SUCCESS;\n }\n \n static int\n-test_AES_CCM_authenticated_decryption_test_case_128_2(void)\n+test_null_auth_cipher_operation(void)\n {\n-\treturn test_authenticated_decryption(&ccm_test_case_128_2);\n-}\n+\tstruct crypto_testsuite_params *ts_params = &testsuite_params;\n+\tstruct crypto_unittest_params *ut_params = &unittest_params;\n+\tuint8_t *digest;\n \n-static int\n-test_AES_CCM_authenticated_decryption_test_case_128_3(void)\n-{\n-\treturn test_authenticated_decryption(&ccm_test_case_128_3);\n-}\n+\t/* Verify the capabilities */\n+\tstruct rte_cryptodev_sym_capability_idx cap_idx;\n+\tcap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;\n+\tcap_idx.algo.auth = RTE_CRYPTO_AUTH_NULL;\n+\tif (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],\n+\t\t\t&cap_idx) == NULL)\n+\t\treturn -ENOTSUP;\n+\tcap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;\n+\tcap_idx.algo.cipher = RTE_CRYPTO_CIPHER_NULL;\n+\tif (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],\n+\t\t\t&cap_idx) == NULL)\n+\t\treturn -ENOTSUP;\n \n-static int\n-test_AES_CCM_authenticated_encryption_test_case_192_1(void)\n-{\n-\treturn test_authenticated_encryption(&ccm_test_case_192_1);\n-}\n+\t/* Generate test mbuf data */\n+\tut_params->ibuf = setup_test_string(ts_params->mbuf_pool,\n+\t\t\tcatch_22_quote, QUOTE_512_BYTES, 0);\n \n-static int\n-test_AES_CCM_authenticated_encryption_test_case_192_2(void)\n-{\n-\treturn test_authenticated_encryption(&ccm_test_case_192_2);\n-}\n+\t/* create a pointer for digest, but don't expect anything to be written\n+\t * here in a NULL auth algo so no mbuf append done.\n+\t */\n+\tdigest = rte_pktmbuf_mtod_offset(ut_params->ibuf, uint8_t *,\n+\t\t\t\tQUOTE_512_BYTES);\n+\t/* prefill the memory pointed to by digest */\n+\tmemcpy(digest, orig_data, sizeof(orig_data));\n \n-static int\n-test_AES_CCM_authenticated_encryption_test_case_192_3(void)\n-{\n-\treturn test_authenticated_encryption(&ccm_test_case_192_3);\n-}\n+\t/* Setup Cipher Parameters */\n+\tut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER;\n+\tut_params->cipher_xform.next = NULL;\n \n-static int\n-test_AES_CCM_authenticated_decryption_test_case_192_1(void)\n-{\n-\treturn test_authenticated_decryption(&ccm_test_case_192_1);\n-}\n+\tut_params->cipher_xform.cipher.algo = RTE_CRYPTO_CIPHER_NULL;\n+\tut_params->cipher_xform.cipher.op = RTE_CRYPTO_CIPHER_OP_ENCRYPT;\n \n-static int\n-test_AES_CCM_authenticated_decryption_test_case_192_2(void)\n-{\n-\treturn test_authenticated_decryption(&ccm_test_case_192_2);\n-}\n+\t/* Setup HMAC Parameters */\n+\tut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;\n+\tut_params->auth_xform.next = &ut_params->cipher_xform;\n \n-static int\n-test_AES_CCM_authenticated_decryption_test_case_192_3(void)\n-{\n-\treturn test_authenticated_decryption(&ccm_test_case_192_3);\n-}\n+\tut_params->auth_xform.auth.algo = RTE_CRYPTO_AUTH_NULL;\n+\tut_params->auth_xform.auth.op = RTE_CRYPTO_AUTH_OP_GENERATE;\n \n-static int\n-test_AES_CCM_authenticated_encryption_test_case_256_1(void)\n-{\n-\treturn test_authenticated_encryption(&ccm_test_case_256_1);\n-}\n+\tut_params->sess = rte_cryptodev_sym_session_create(\n+\t\t\tts_params->session_mpool);\n \n-static int\n-test_AES_CCM_authenticated_encryption_test_case_256_2(void)\n-{\n-\treturn test_authenticated_encryption(&ccm_test_case_256_2);\n-}\n+\t/* Create Crypto session*/\n+\trte_cryptodev_sym_session_init(ts_params->valid_devs[0],\n+\t\t\tut_params->sess, &ut_params->cipher_xform,\n+\t\t\tts_params->session_priv_mpool);\n+\tTEST_ASSERT_NOT_NULL(ut_params->sess, \"Session creation failed\");\n \n-static int\n-test_AES_CCM_authenticated_encryption_test_case_256_3(void)\n-{\n-\treturn test_authenticated_encryption(&ccm_test_case_256_3);\n-}\n+\t/* Generate Crypto op data structure */\n+\tut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,\n+\t\t\tRTE_CRYPTO_OP_TYPE_SYMMETRIC);\n+\tTEST_ASSERT_NOT_NULL(ut_params->op,\n+\t\t\t\"Failed to allocate symmetric crypto operation struct\");\n \n-static int\n-test_AES_CCM_authenticated_decryption_test_case_256_1(void)\n-{\n-\treturn test_authenticated_decryption(&ccm_test_case_256_1);\n-}\n+\t/* Set crypto operation data parameters */\n+\trte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);\n \n-static int\n-test_AES_CCM_authenticated_decryption_test_case_256_2(void)\n-{\n-\treturn test_authenticated_decryption(&ccm_test_case_256_2);\n-}\n+\tstruct rte_crypto_sym_op *sym_op = ut_params->op->sym;\n \n-static int\n-test_AES_CCM_authenticated_decryption_test_case_256_3(void)\n-{\n-\treturn test_authenticated_decryption(&ccm_test_case_256_3);\n-}\n+\tsym_op->m_src = ut_params->ibuf;\n \n-static int\n-test_stats(void)\n-{\n-\tstruct crypto_testsuite_params *ts_params = &testsuite_params;\n-\tstruct rte_cryptodev_stats stats;\n-\tstruct rte_cryptodev *dev;\n-\tcryptodev_stats_get_t temp_pfn;\n+\tsym_op->cipher.data.offset = 0;\n+\tsym_op->cipher.data.length = QUOTE_512_BYTES;\n \n-\trte_cryptodev_stats_reset(ts_params->valid_devs[0]);\n-\tTEST_ASSERT((rte_cryptodev_stats_get(ts_params->valid_devs[0] + 600,\n-\t\t\t&stats) == -ENODEV),\n-\t\t\"rte_cryptodev_stats_get invalid dev failed\");\n-\tTEST_ASSERT((rte_cryptodev_stats_get(ts_params->valid_devs[0], 0) != 0),\n-\t\t\"rte_cryptodev_stats_get invalid Param failed\");\n-\tdev = &rte_cryptodevs[ts_params->valid_devs[0]];\n-\ttemp_pfn = dev->dev_ops->stats_get;\n-\tdev->dev_ops->stats_get = (cryptodev_stats_get_t)0;\n-\tTEST_ASSERT((rte_cryptodev_stats_get(ts_params->valid_devs[0], &stats)\n-\t\t\t== -ENOTSUP),\n-\t\t\"rte_cryptodev_stats_get invalid Param failed\");\n-\tdev->dev_ops->stats_get = temp_pfn;\n+\tsym_op->auth.data.offset = 0;\n+\tsym_op->auth.data.length = QUOTE_512_BYTES;\n+\tsym_op->auth.digest.data = digest;\n+\tsym_op->auth.digest.phys_addr = rte_pktmbuf_iova_offset(ut_params->ibuf,\n+\t\t\t\t\tQUOTE_512_BYTES);\n \n-\t/* Test expected values */\n-\tut_setup();\n-\ttest_AES_CBC_HMAC_SHA1_encrypt_digest();\n-\tut_teardown();\n-\tTEST_ASSERT_SUCCESS(rte_cryptodev_stats_get(ts_params->valid_devs[0],\n-\t\t\t&stats),\n-\t\t\"rte_cryptodev_stats_get failed\");\n-\tTEST_ASSERT((stats.enqueued_count == 1),\n-\t\t\"rte_cryptodev_stats_get returned unexpected enqueued stat\");\n-\tTEST_ASSERT((stats.dequeued_count == 1),\n-\t\t\"rte_cryptodev_stats_get returned unexpected enqueued stat\");\n-\tTEST_ASSERT((stats.enqueue_err_count == 0),\n-\t\t\"rte_cryptodev_stats_get returned unexpected enqueued stat\");\n-\tTEST_ASSERT((stats.dequeue_err_count == 0),\n-\t\t\"rte_cryptodev_stats_get returned unexpected enqueued stat\");\n+\t/* Process crypto operation */\n+\tut_params->op = process_crypto_request(ts_params->valid_devs[0],\n+\t\t\tut_params->op);\n+\tTEST_ASSERT_NOT_NULL(ut_params->op, \"no crypto operation returned\");\n \n-\t/* invalid device but should ignore and not reset device stats*/\n-\trte_cryptodev_stats_reset(ts_params->valid_devs[0] + 300);\n-\tTEST_ASSERT_SUCCESS(rte_cryptodev_stats_get(ts_params->valid_devs[0],\n-\t\t\t&stats),\n-\t\t\"rte_cryptodev_stats_get failed\");\n-\tTEST_ASSERT((stats.enqueued_count == 1),\n-\t\t\"rte_cryptodev_stats_get returned unexpected enqueued stat\");\n+\tTEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,\n+\t\t\t\"crypto operation processing failed\");\n \n-\t/* check that a valid reset clears stats */\n-\trte_cryptodev_stats_reset(ts_params->valid_devs[0]);\n-\tTEST_ASSERT_SUCCESS(rte_cryptodev_stats_get(ts_params->valid_devs[0],\n-\t\t\t&stats),\n-\t\t\t\t\t  \"rte_cryptodev_stats_get failed\");\n-\tTEST_ASSERT((stats.enqueued_count == 0),\n-\t\t\"rte_cryptodev_stats_get returned unexpected enqueued stat\");\n-\tTEST_ASSERT((stats.dequeued_count == 0),\n-\t\t\"rte_cryptodev_stats_get returned unexpected enqueued stat\");\n+\t/* Validate obuf */\n+\tTEST_ASSERT_BUFFERS_ARE_EQUAL(\n+\t\t\trte_pktmbuf_mtod(ut_params->op->sym->m_src, uint8_t *),\n+\t\t\tcatch_22_quote,\n+\t\t\tQUOTE_512_BYTES,\n+\t\t\t\"Ciphertext data not as expected\");\n+\t/* Make sure memory pointed to by digest hasn't been overwritten */\n+\tTEST_ASSERT_BUFFERS_ARE_EQUAL(\n+\t\t\torig_data,\n+\t\t\tdigest,\n+\t\t\tsizeof(orig_data),\n+\t\t\t\"Memory at digest ptr overwritten unexpectedly\");\n \n \treturn TEST_SUCCESS;\n }\n \n-static int MD5_HMAC_create_session(struct crypto_testsuite_params *ts_params,\n-\t\t\t\t   struct crypto_unittest_params *ut_params,\n-\t\t\t\t   enum rte_crypto_auth_operation op,\n-\t\t\t\t   const struct HMAC_MD5_vector *test_case)\n+\n+static int\n+test_null_invalid_operation(void)\n {\n-\tuint8_t key[64];\n+\tstruct crypto_testsuite_params *ts_params = &testsuite_params;\n+\tstruct crypto_unittest_params *ut_params = &unittest_params;\n+\tint ret;\n \n-\tmemcpy(key, test_case->key.data, test_case->key.len);\n+\t/* This test is for NULL PMD only */\n+\tif (gbl_driver_id != rte_cryptodev_driver_id_get(\n+\t\t\tRTE_STR(CRYPTODEV_NAME_NULL_PMD)))\n+\t\treturn -ENOTSUP;\n+\n+\t/* Setup Cipher Parameters */\n+\tut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER;\n+\tut_params->cipher_xform.next = NULL;\n+\n+\tut_params->cipher_xform.cipher.algo = RTE_CRYPTO_CIPHER_AES_CBC;\n+\tut_params->cipher_xform.cipher.op = RTE_CRYPTO_CIPHER_OP_ENCRYPT;\n+\n+\tut_params->sess = rte_cryptodev_sym_session_create(\n+\t\t\tts_params->session_mpool);\n+\n+\t/* Create Crypto session*/\n+\tret = rte_cryptodev_sym_session_init(ts_params->valid_devs[0],\n+\t\t\tut_params->sess, &ut_params->cipher_xform,\n+\t\t\tts_params->session_priv_mpool);\n+\tTEST_ASSERT(ret < 0,\n+\t\t\t\"Session creation succeeded unexpectedly\");\n \n+\n+\t/* Setup HMAC Parameters */\n \tut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;\n \tut_params->auth_xform.next = NULL;\n-\tut_params->auth_xform.auth.op = op;\n-\n-\tut_params->auth_xform.auth.algo = RTE_CRYPTO_AUTH_MD5_HMAC;\n \n-\tut_params->auth_xform.auth.digest_length = MD5_DIGEST_LEN;\n-\tut_params->auth_xform.auth.key.length = test_case->key.len;\n-\tut_params->auth_xform.auth.key.data = key;\n+\tut_params->auth_xform.auth.algo = RTE_CRYPTO_AUTH_SHA1_HMAC;\n+\tut_params->auth_xform.auth.op = RTE_CRYPTO_AUTH_OP_GENERATE;\n \n \tut_params->sess = rte_cryptodev_sym_session_create(\n \t\t\tts_params->session_mpool);\n \n-\trte_cryptodev_sym_session_init(ts_params->valid_devs[0],\n+\t/* Create Crypto session*/\n+\tret = rte_cryptodev_sym_session_init(ts_params->valid_devs[0],\n \t\t\tut_params->sess, &ut_params->auth_xform,\n \t\t\tts_params->session_priv_mpool);\n+\tTEST_ASSERT(ret < 0,\n+\t\t\t\"Session creation succeeded unexpectedly\");\n \n-\tif (ut_params->sess == NULL)\n-\t\treturn TEST_FAILED;\n-\n-\tut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);\n+\treturn TEST_SUCCESS;\n+}\n \n-\tmemset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,\n-\t\t\trte_pktmbuf_tailroom(ut_params->ibuf));\n \n-\treturn 0;\n-}\n+#define NULL_BURST_LENGTH (32)\n \n-static int MD5_HMAC_create_op(struct crypto_unittest_params *ut_params,\n-\t\t\t      const struct HMAC_MD5_vector *test_case,\n-\t\t\t      uint8_t **plaintext)\n+static int\n+test_null_burst_operation(void)\n {\n-\tuint16_t plaintext_pad_len;\n+\tstruct crypto_testsuite_params *ts_params = &testsuite_params;\n+\tstruct crypto_unittest_params *ut_params = &unittest_params;\n \n-\tstruct rte_crypto_sym_op *sym_op = ut_params->op->sym;\n+\tunsigned i, burst_len = NULL_BURST_LENGTH;\n \n-\tplaintext_pad_len = RTE_ALIGN_CEIL(test_case->plaintext.len,\n-\t\t\t\t16);\n+\tstruct rte_crypto_op *burst[NULL_BURST_LENGTH] = { NULL };\n+\tstruct rte_crypto_op *burst_dequeued[NULL_BURST_LENGTH] = { NULL };\n \n-\t*plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,\n-\t\t\tplaintext_pad_len);\n-\tmemcpy(*plaintext, test_case->plaintext.data,\n-\t\t\ttest_case->plaintext.len);\n+\t/* This test is for NULL PMD only */\n+\tif (gbl_driver_id != rte_cryptodev_driver_id_get(\n+\t\t\tRTE_STR(CRYPTODEV_NAME_NULL_PMD)))\n+\t\treturn -ENOTSUP;\n \n-\tsym_op->auth.digest.data = (uint8_t *)rte_pktmbuf_append(\n-\t\t\tut_params->ibuf, MD5_DIGEST_LEN);\n-\tTEST_ASSERT_NOT_NULL(sym_op->auth.digest.data,\n-\t\t\t\"no room to append digest\");\n-\tsym_op->auth.digest.phys_addr = rte_pktmbuf_iova_offset(\n-\t\t\tut_params->ibuf, plaintext_pad_len);\n+\t/* Setup Cipher Parameters */\n+\tut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER;\n+\tut_params->cipher_xform.next = &ut_params->auth_xform;\n \n-\tif (ut_params->auth_xform.auth.op == RTE_CRYPTO_AUTH_OP_VERIFY) {\n-\t\trte_memcpy(sym_op->auth.digest.data, test_case->auth_tag.data,\n-\t\t\t   test_case->auth_tag.len);\n-\t}\n+\tut_params->cipher_xform.cipher.algo = RTE_CRYPTO_CIPHER_NULL;\n+\tut_params->cipher_xform.cipher.op = RTE_CRYPTO_CIPHER_OP_ENCRYPT;\n \n-\tsym_op->auth.data.offset = 0;\n-\tsym_op->auth.data.length = test_case->plaintext.len;\n+\t/* Setup HMAC Parameters */\n+\tut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;\n+\tut_params->auth_xform.next = NULL;\n \n-\trte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);\n-\tut_params->op->sym->m_src = ut_params->ibuf;\n+\tut_params->auth_xform.auth.algo = RTE_CRYPTO_AUTH_NULL;\n+\tut_params->auth_xform.auth.op = RTE_CRYPTO_AUTH_OP_GENERATE;\n \n-\treturn 0;\n-}\n+\tut_params->sess = rte_cryptodev_sym_session_create(\n+\t\t\tts_params->session_mpool);\n \n-static int\n-test_MD5_HMAC_generate(const struct HMAC_MD5_vector *test_case)\n-{\n-\tuint16_t plaintext_pad_len;\n-\tuint8_t *plaintext, *auth_tag;\n+\t/* Create Crypto session*/\n+\trte_cryptodev_sym_session_init(ts_params->valid_devs[0],\n+\t\t\tut_params->sess, &ut_params->cipher_xform,\n+\t\t\tts_params->session_priv_mpool);\n+\tTEST_ASSERT_NOT_NULL(ut_params->sess, \"Session creation failed\");\n \n-\tstruct crypto_testsuite_params *ts_params = &testsuite_params;\n-\tstruct crypto_unittest_params *ut_params = &unittest_params;\n+\tTEST_ASSERT_EQUAL(rte_crypto_op_bulk_alloc(ts_params->op_mpool,\n+\t\t\tRTE_CRYPTO_OP_TYPE_SYMMETRIC, burst, burst_len),\n+\t\t\tburst_len, \"failed to generate burst of crypto ops\");\n \n-\tif (MD5_HMAC_create_session(ts_params, ut_params,\n-\t\t\tRTE_CRYPTO_AUTH_OP_GENERATE, test_case))\n-\t\treturn TEST_FAILED;\n+\t/* Generate an operation for each mbuf in burst */\n+\tfor (i = 0; i < burst_len; i++) {\n+\t\tstruct rte_mbuf *m = rte_pktmbuf_alloc(ts_params->mbuf_pool);\n \n-\t/* Generate Crypto op data structure */\n-\tut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,\n-\t\t\tRTE_CRYPTO_OP_TYPE_SYMMETRIC);\n-\tTEST_ASSERT_NOT_NULL(ut_params->op,\n-\t\t\t\"Failed to allocate symmetric crypto operation struct\");\n+\t\tTEST_ASSERT_NOT_NULL(m, \"Failed to allocate mbuf\");\n \n-\tplaintext_pad_len = RTE_ALIGN_CEIL(test_case->plaintext.len,\n-\t\t\t\t16);\n+\t\tunsigned *data = (unsigned *)rte_pktmbuf_append(m,\n+\t\t\t\tsizeof(unsigned));\n+\t\t*data = i;\n \n-\tif (MD5_HMAC_create_op(ut_params, test_case, &plaintext))\n-\t\treturn TEST_FAILED;\n+\t\trte_crypto_op_attach_sym_session(burst[i], ut_params->sess);\n \n-\tTEST_ASSERT_NOT_NULL(process_crypto_request(ts_params->valid_devs[0],\n-\t\t\tut_params->op), \"failed to process sym crypto op\");\n+\t\tburst[i]->sym->m_src = m;\n+\t}\n \n-\tTEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,\n-\t\t\t\"crypto op processing failed\");\n+\t/* Process crypto operation */\n+\tTEST_ASSERT_EQUAL(rte_cryptodev_enqueue_burst(ts_params->valid_devs[0],\n+\t\t\t0, burst, burst_len),\n+\t\t\tburst_len,\n+\t\t\t\"Error enqueuing burst\");\n \n-\tif (ut_params->op->sym->m_dst) {\n-\t\tauth_tag = rte_pktmbuf_mtod_offset(ut_params->op->sym->m_dst,\n-\t\t\t\tuint8_t *, plaintext_pad_len);\n-\t} else {\n-\t\tauth_tag = plaintext + plaintext_pad_len;\n-\t}\n+\tTEST_ASSERT_EQUAL(rte_cryptodev_dequeue_burst(ts_params->valid_devs[0],\n+\t\t\t0, burst_dequeued, burst_len),\n+\t\t\tburst_len,\n+\t\t\t\"Error dequeuing burst\");\n \n-\tTEST_ASSERT_BUFFERS_ARE_EQUAL(\n-\t\t\tauth_tag,\n-\t\t\ttest_case->auth_tag.data,\n-\t\t\ttest_case->auth_tag.len,\n-\t\t\t\"HMAC_MD5 generated tag not as expected\");\n+\n+\tfor (i = 0; i < burst_len; i++) {\n+\t\tTEST_ASSERT_EQUAL(\n+\t\t\t*rte_pktmbuf_mtod(burst[i]->sym->m_src, uint32_t *),\n+\t\t\t*rte_pktmbuf_mtod(burst_dequeued[i]->sym->m_src,\n+\t\t\t\t\tuint32_t *),\n+\t\t\t\"data not as expected\");\n+\n+\t\trte_pktmbuf_free(burst[i]->sym->m_src);\n+\t\trte_crypto_op_free(burst[i]);\n+\t}\n \n \treturn TEST_SUCCESS;\n }\n \n-static int\n-test_MD5_HMAC_verify(const struct HMAC_MD5_vector *test_case)\n+static void\n+generate_gmac_large_plaintext(uint8_t *data)\n {\n-\tuint8_t *plaintext;\n+\tuint16_t i;\n+\n+\tfor (i = 32; i < GMAC_LARGE_PLAINTEXT_LENGTH; i += 32)\n+\t\tmemcpy(&data[i], &data[0], 32);\n+}\n \n+static int\n+create_gmac_operation(enum rte_crypto_auth_operation op,\n+\t\tconst struct gmac_test_data *tdata)\n+{\n \tstruct crypto_testsuite_params *ts_params = &testsuite_params;\n \tstruct crypto_unittest_params *ut_params = &unittest_params;\n+\tstruct rte_crypto_sym_op *sym_op;\n \n-\tif (MD5_HMAC_create_session(ts_params, ut_params,\n-\t\t\tRTE_CRYPTO_AUTH_OP_VERIFY, test_case)) {\n-\t\treturn TEST_FAILED;\n-\t}\n+\tuint32_t plaintext_pad_len = RTE_ALIGN_CEIL(tdata->plaintext.len, 16);\n \n \t/* Generate Crypto op data structure */\n \tut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,\n@@ -9607,3337 +9648,1966 @@ test_MD5_HMAC_verify(const struct HMAC_MD5_vector *test_case)\n \tTEST_ASSERT_NOT_NULL(ut_params->op,\n \t\t\t\"Failed to allocate symmetric crypto operation struct\");\n \n-\tif (MD5_HMAC_create_op(ut_params, test_case, &plaintext))\n-\t\treturn TEST_FAILED;\n+\tsym_op = ut_params->op->sym;\n \n-\tTEST_ASSERT_NOT_NULL(process_crypto_request(ts_params->valid_devs[0],\n-\t\t\tut_params->op), \"failed to process sym crypto op\");\n+\tsym_op->auth.digest.data = (uint8_t *)rte_pktmbuf_append(\n+\t\t\tut_params->ibuf, tdata->gmac_tag.len);\n+\tTEST_ASSERT_NOT_NULL(sym_op->auth.digest.data,\n+\t\t\t\"no room to append digest\");\n \n-\tTEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,\n-\t\t\t\"HMAC_MD5 crypto op processing failed\");\n+\tsym_op->auth.digest.phys_addr = rte_pktmbuf_iova_offset(\n+\t\t\tut_params->ibuf, plaintext_pad_len);\n \n-\treturn TEST_SUCCESS;\n-}\n+\tif (op == RTE_CRYPTO_AUTH_OP_VERIFY) {\n+\t\trte_memcpy(sym_op->auth.digest.data, tdata->gmac_tag.data,\n+\t\t\t\ttdata->gmac_tag.len);\n+\t\tdebug_hexdump(stdout, \"digest:\",\n+\t\t\t\tsym_op->auth.digest.data,\n+\t\t\t\ttdata->gmac_tag.len);\n+\t}\n \n-static int\n-test_MD5_HMAC_generate_case_1(void)\n-{\n-\treturn test_MD5_HMAC_generate(&HMAC_MD5_test_case_1);\n-}\n+\tuint8_t *iv_ptr = rte_crypto_op_ctod_offset(ut_params->op,\n+\t\t\tuint8_t *, IV_OFFSET);\n \n-static int\n-test_MD5_HMAC_verify_case_1(void)\n-{\n-\treturn test_MD5_HMAC_verify(&HMAC_MD5_test_case_1);\n-}\n+\trte_memcpy(iv_ptr, tdata->iv.data, tdata->iv.len);\n \n-static int\n-test_MD5_HMAC_generate_case_2(void)\n-{\n-\treturn test_MD5_HMAC_generate(&HMAC_MD5_test_case_2);\n-}\n+\tdebug_hexdump(stdout, \"iv:\", iv_ptr, tdata->iv.len);\n \n-static int\n-test_MD5_HMAC_verify_case_2(void)\n-{\n-\treturn test_MD5_HMAC_verify(&HMAC_MD5_test_case_2);\n+\tsym_op->cipher.data.length = 0;\n+\tsym_op->cipher.data.offset = 0;\n+\n+\tsym_op->auth.data.offset = 0;\n+\tsym_op->auth.data.length = tdata->plaintext.len;\n+\n+\treturn 0;\n }\n \n-static int\n-test_multi_session(void)\n+static int create_gmac_session(uint8_t dev_id,\n+\t\tconst struct gmac_test_data *tdata,\n+\t\tenum rte_crypto_auth_operation auth_op)\n {\n+\tuint8_t auth_key[tdata->key.len];\n+\n \tstruct crypto_testsuite_params *ts_params = &testsuite_params;\n \tstruct crypto_unittest_params *ut_params = &unittest_params;\n \n-\tstruct rte_cryptodev_info dev_info;\n-\tstruct rte_cryptodev_sym_session **sessions;\n+\tmemcpy(auth_key, tdata->key.data, tdata->key.len);\n \n-\tuint16_t i;\n+\tut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;\n+\tut_params->auth_xform.next = NULL;\n \n-\ttest_AES_CBC_HMAC_SHA512_decrypt_create_session_params(ut_params,\n-\t\t\taes_cbc_key, hmac_sha512_key);\n+\tut_params->auth_xform.auth.algo = RTE_CRYPTO_AUTH_AES_GMAC;\n+\tut_params->auth_xform.auth.op = auth_op;\n+\tut_params->auth_xform.auth.digest_length = tdata->gmac_tag.len;\n+\tut_params->auth_xform.auth.key.length = tdata->key.len;\n+\tut_params->auth_xform.auth.key.data = auth_key;\n+\tut_params->auth_xform.auth.iv.offset = IV_OFFSET;\n+\tut_params->auth_xform.auth.iv.length = tdata->iv.len;\n \n \n-\trte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);\n+\tut_params->sess = rte_cryptodev_sym_session_create(\n+\t\t\tts_params->session_mpool);\n \n-\tsessions = rte_malloc(NULL,\n-\t\t\t(sizeof(struct rte_cryptodev_sym_session *) *\n-\t\t\tMAX_NB_SESSIONS) + 1, 0);\n+\trte_cryptodev_sym_session_init(dev_id, ut_params->sess,\n+\t\t\t&ut_params->auth_xform,\n+\t\t\tts_params->session_priv_mpool);\n \n-\t/* Create multiple crypto sessions*/\n-\tfor (i = 0; i < MAX_NB_SESSIONS; i++) {\n+\tTEST_ASSERT_NOT_NULL(ut_params->sess, \"Session creation failed\");\n \n-\t\tsessions[i] = rte_cryptodev_sym_session_create(\n-\t\t\t\tts_params->session_mpool);\n+\treturn 0;\n+}\n \n-\t\trte_cryptodev_sym_session_init(ts_params->valid_devs[0],\n-\t\t\t\tsessions[i], &ut_params->auth_xform,\n-\t\t\t\tts_params->session_priv_mpool);\n-\t\tTEST_ASSERT_NOT_NULL(sessions[i],\n-\t\t\t\t\"Session creation failed at session number %u\",\n-\t\t\t\ti);\n+static int\n+test_AES_GMAC_authentication(const struct gmac_test_data *tdata)\n+{\n+\tstruct crypto_testsuite_params *ts_params = &testsuite_params;\n+\tstruct crypto_unittest_params *ut_params = &unittest_params;\n \n-\t\t/* Attempt to send a request on each session */\n-\t\tTEST_ASSERT_SUCCESS( test_AES_CBC_HMAC_SHA512_decrypt_perform(\n-\t\t\tsessions[i],\n-\t\t\tut_params,\n-\t\t\tts_params,\n-\t\t\tcatch_22_quote_2_512_bytes_AES_CBC_ciphertext,\n-\t\t\tcatch_22_quote_2_512_bytes_AES_CBC_HMAC_SHA512_digest,\n-\t\t\taes_cbc_iv),\n-\t\t\t\"Failed to perform decrypt on request number %u.\", i);\n-\t\t/* free crypto operation structure */\n-\t\tif (ut_params->op)\n-\t\t\trte_crypto_op_free(ut_params->op);\n+\tint retval;\n \n-\t\t/*\n-\t\t * free mbuf - both obuf and ibuf are usually the same,\n-\t\t * so check if they point at the same address is necessary,\n-\t\t * to avoid freeing the mbuf twice.\n-\t\t */\n-\t\tif (ut_params->obuf) {\n-\t\t\trte_pktmbuf_free(ut_params->obuf);\n-\t\t\tif (ut_params->ibuf == ut_params->obuf)\n-\t\t\t\tut_params->ibuf = 0;\n-\t\t\tut_params->obuf = 0;\n-\t\t}\n-\t\tif (ut_params->ibuf) {\n-\t\t\trte_pktmbuf_free(ut_params->ibuf);\n-\t\t\tut_params->ibuf = 0;\n-\t\t}\n-\t}\n+\tuint8_t *auth_tag, *plaintext;\n+\tuint16_t plaintext_pad_len;\n \n-\t/* Next session create should fail */\n-\trte_cryptodev_sym_session_init(ts_params->valid_devs[0],\n-\t\t\tsessions[i], &ut_params->auth_xform,\n-\t\t\tts_params->session_priv_mpool);\n-\tTEST_ASSERT_NULL(sessions[i],\n-\t\t\t\"Session creation succeeded unexpectedly!\");\n+\tTEST_ASSERT_NOT_EQUAL(tdata->gmac_tag.len, 0,\n+\t\t\t      \"No GMAC length in the source data\");\n \n-\tfor (i = 0; i < MAX_NB_SESSIONS; i++) {\n-\t\trte_cryptodev_sym_session_clear(ts_params->valid_devs[0],\n-\t\t\t\tsessions[i]);\n-\t\trte_cryptodev_sym_session_free(sessions[i]);\n-\t}\n+\t/* Verify the capabilities */\n+\tstruct rte_cryptodev_sym_capability_idx cap_idx;\n+\tcap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;\n+\tcap_idx.algo.auth = RTE_CRYPTO_AUTH_AES_GMAC;\n+\tif (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],\n+\t\t\t&cap_idx) == NULL)\n+\t\treturn -ENOTSUP;\n \n-\trte_free(sessions);\n+\tretval = create_gmac_session(ts_params->valid_devs[0],\n+\t\t\ttdata, RTE_CRYPTO_AUTH_OP_GENERATE);\n \n-\treturn TEST_SUCCESS;\n-}\n+\tif (retval < 0)\n+\t\treturn retval;\n \n-struct multi_session_params {\n-\tstruct crypto_unittest_params ut_params;\n-\tuint8_t *cipher_key;\n-\tuint8_t *hmac_key;\n-\tconst uint8_t *cipher;\n-\tconst uint8_t *digest;\n-\tuint8_t *iv;\n-};\n-\n-#define MB_SESSION_NUMBER 3\n+\tif (tdata->plaintext.len > MBUF_SIZE)\n+\t\tut_params->ibuf = rte_pktmbuf_alloc(ts_params->large_mbuf_pool);\n+\telse\n+\t\tut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);\n+\tTEST_ASSERT_NOT_NULL(ut_params->ibuf,\n+\t\t\t\"Failed to allocate input buffer in mempool\");\n \n-static int\n-test_multi_session_random_usage(void)\n-{\n-\tstruct crypto_testsuite_params *ts_params = &testsuite_params;\n-\tstruct rte_cryptodev_info dev_info;\n-\tstruct rte_cryptodev_sym_session **sessions;\n-\tuint32_t i, j;\n-\tstruct multi_session_params ut_paramz[] = {\n+\tmemset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,\n+\t\t\trte_pktmbuf_tailroom(ut_params->ibuf));\n \n-\t\t{\n-\t\t\t.cipher_key = ms_aes_cbc_key0,\n-\t\t\t.hmac_key = ms_hmac_key0,\n-\t\t\t.cipher = ms_aes_cbc_cipher0,\n-\t\t\t.digest = ms_hmac_digest0,\n-\t\t\t.iv = ms_aes_cbc_iv0\n-\t\t},\n-\t\t{\n-\t\t\t.cipher_key = ms_aes_cbc_key1,\n-\t\t\t.hmac_key = ms_hmac_key1,\n-\t\t\t.cipher = ms_aes_cbc_cipher1,\n-\t\t\t.digest = ms_hmac_digest1,\n-\t\t\t.iv = ms_aes_cbc_iv1\n-\t\t},\n-\t\t{\n-\t\t\t.cipher_key = ms_aes_cbc_key2,\n-\t\t\t.hmac_key = ms_hmac_key2,\n-\t\t\t.cipher = ms_aes_cbc_cipher2,\n-\t\t\t.digest = ms_hmac_digest2,\n-\t\t\t.iv = ms_aes_cbc_iv2\n-\t\t},\n+\tplaintext_pad_len = RTE_ALIGN_CEIL(tdata->plaintext.len, 16);\n+\t/*\n+\t * Runtime generate the large plain text instead of use hard code\n+\t * plain text vector. It is done to avoid create huge source file\n+\t * with the test vector.\n+\t */\n+\tif (tdata->plaintext.len == GMAC_LARGE_PLAINTEXT_LENGTH)\n+\t\tgenerate_gmac_large_plaintext(tdata->plaintext.data);\n \n-\t};\n+\tplaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,\n+\t\t\t\tplaintext_pad_len);\n+\tTEST_ASSERT_NOT_NULL(plaintext, \"no room to append plaintext\");\n \n-\trte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);\n+\tmemcpy(plaintext, tdata->plaintext.data, tdata->plaintext.len);\n+\tdebug_hexdump(stdout, \"plaintext:\", plaintext,\n+\t\t\ttdata->plaintext.len);\n \n-\tsessions = rte_malloc(NULL,\n-\t\t\t(sizeof(struct rte_cryptodev_sym_session *)\n-\t\t\t\t\t* MAX_NB_SESSIONS) + 1, 0);\n+\tretval = create_gmac_operation(RTE_CRYPTO_AUTH_OP_GENERATE,\n+\t\t\ttdata);\n \n-\tfor (i = 0; i < MB_SESSION_NUMBER; i++) {\n-\t\tsessions[i] = rte_cryptodev_sym_session_create(\n-\t\t\t\tts_params->session_mpool);\n+\tif (retval < 0)\n+\t\treturn retval;\n \n-\t\trte_memcpy(&ut_paramz[i].ut_params, &unittest_params,\n-\t\t\t\tsizeof(struct crypto_unittest_params));\n+\trte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);\n \n-\t\ttest_AES_CBC_HMAC_SHA512_decrypt_create_session_params(\n-\t\t\t\t&ut_paramz[i].ut_params,\n-\t\t\t\tut_paramz[i].cipher_key, ut_paramz[i].hmac_key);\n+\tut_params->op->sym->m_src = ut_params->ibuf;\n \n-\t\t/* Create multiple crypto sessions*/\n-\t\trte_cryptodev_sym_session_init(\n-\t\t\t\tts_params->valid_devs[0],\n-\t\t\t\tsessions[i],\n-\t\t\t\t&ut_paramz[i].ut_params.auth_xform,\n-\t\t\t\tts_params->session_priv_mpool);\n+\tTEST_ASSERT_NOT_NULL(process_crypto_request(ts_params->valid_devs[0],\n+\t\t\tut_params->op), \"failed to process sym crypto op\");\n \n-\t\tTEST_ASSERT_NOT_NULL(sessions[i],\n-\t\t\t\t\"Session creation failed at session number %u\",\n-\t\t\t\ti);\n+\tTEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,\n+\t\t\t\"crypto op processing failed\");\n \n+\tif (ut_params->op->sym->m_dst) {\n+\t\tauth_tag = rte_pktmbuf_mtod_offset(ut_params->op->sym->m_dst,\n+\t\t\t\tuint8_t *, plaintext_pad_len);\n+\t} else {\n+\t\tauth_tag = plaintext + plaintext_pad_len;\n \t}\n \n-\tsrand(time(NULL));\n-\tfor (i = 0; i < 40000; i++) {\n-\n-\t\tj = rand() % MB_SESSION_NUMBER;\n+\tdebug_hexdump(stdout, \"auth tag:\", auth_tag, tdata->gmac_tag.len);\n \n-\t\tTEST_ASSERT_SUCCESS(\n-\t\t\ttest_AES_CBC_HMAC_SHA512_decrypt_perform(\n-\t\t\t\t\tsessions[j],\n-\t\t\t\t\t&ut_paramz[j].ut_params,\n-\t\t\t\t\tts_params, ut_paramz[j].cipher,\n-\t\t\t\t\tut_paramz[j].digest,\n-\t\t\t\t\tut_paramz[j].iv),\n-\t\t\t\"Failed to perform decrypt on request number %u.\", i);\n+\tTEST_ASSERT_BUFFERS_ARE_EQUAL(\n+\t\t\tauth_tag,\n+\t\t\ttdata->gmac_tag.data,\n+\t\t\ttdata->gmac_tag.len,\n+\t\t\t\"GMAC Generated auth tag not as expected\");\n \n-\t\tif (ut_paramz[j].ut_params.op)\n-\t\t\trte_crypto_op_free(ut_paramz[j].ut_params.op);\n+\treturn 0;\n+}\n \n-\t\t/*\n-\t\t * free mbuf - both obuf and ibuf are usually the same,\n-\t\t * so check if they point at the same address is necessary,\n-\t\t * to avoid freeing the mbuf twice.\n-\t\t */\n-\t\tif (ut_paramz[j].ut_params.obuf) {\n-\t\t\trte_pktmbuf_free(ut_paramz[j].ut_params.obuf);\n-\t\t\tif (ut_paramz[j].ut_params.ibuf\n-\t\t\t\t\t== ut_paramz[j].ut_params.obuf)\n-\t\t\t\tut_paramz[j].ut_params.ibuf = 0;\n-\t\t\tut_paramz[j].ut_params.obuf = 0;\n-\t\t}\n-\t\tif (ut_paramz[j].ut_params.ibuf) {\n-\t\t\trte_pktmbuf_free(ut_paramz[j].ut_params.ibuf);\n-\t\t\tut_paramz[j].ut_params.ibuf = 0;\n-\t\t}\n-\t}\n+static int\n+test_AES_GMAC_authentication_test_case_1(void)\n+{\n+\treturn test_AES_GMAC_authentication(&gmac_test_case_1);\n+}\n \n-\tfor (i = 0; i < MB_SESSION_NUMBER; i++) {\n-\t\trte_cryptodev_sym_session_clear(ts_params->valid_devs[0],\n-\t\t\t\tsessions[i]);\n-\t\trte_cryptodev_sym_session_free(sessions[i]);\n-\t}\n+static int\n+test_AES_GMAC_authentication_test_case_2(void)\n+{\n+\treturn test_AES_GMAC_authentication(&gmac_test_case_2);\n+}\n \n-\trte_free(sessions);\n+static int\n+test_AES_GMAC_authentication_test_case_3(void)\n+{\n+\treturn test_AES_GMAC_authentication(&gmac_test_case_3);\n+}\n \n-\treturn TEST_SUCCESS;\n+static int\n+test_AES_GMAC_authentication_test_case_4(void)\n+{\n+\treturn test_AES_GMAC_authentication(&gmac_test_case_4);\n }\n \n static int\n-test_null_cipher_only_operation(void)\n+test_AES_GMAC_authentication_verify(const struct gmac_test_data *tdata)\n {\n \tstruct crypto_testsuite_params *ts_params = &testsuite_params;\n \tstruct crypto_unittest_params *ut_params = &unittest_params;\n+\tint retval;\n+\tuint32_t plaintext_pad_len;\n+\tuint8_t *plaintext;\n \n-\t/* Generate test mbuf data and space for digest */\n-\tut_params->ibuf = setup_test_string(ts_params->mbuf_pool,\n-\t\t\tcatch_22_quote, QUOTE_512_BYTES, 0);\n+\tTEST_ASSERT_NOT_EQUAL(tdata->gmac_tag.len, 0,\n+\t\t\t      \"No GMAC length in the source data\");\n \n-\t/* Setup Cipher Parameters */\n-\tut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER;\n-\tut_params->cipher_xform.next = NULL;\n+\t/* Verify the capabilities */\n+\tstruct rte_cryptodev_sym_capability_idx cap_idx;\n+\tcap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;\n+\tcap_idx.algo.auth = RTE_CRYPTO_AUTH_AES_GMAC;\n+\tif (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],\n+\t\t\t&cap_idx) == NULL)\n+\t\treturn -ENOTSUP;\n \n-\tut_params->cipher_xform.cipher.algo = RTE_CRYPTO_CIPHER_NULL;\n-\tut_params->cipher_xform.cipher.op = RTE_CRYPTO_CIPHER_OP_ENCRYPT;\n+\tretval = create_gmac_session(ts_params->valid_devs[0],\n+\t\t\ttdata, RTE_CRYPTO_AUTH_OP_VERIFY);\n \n-\tut_params->sess = rte_cryptodev_sym_session_create(\n-\t\t\tts_params->session_mpool);\n+\tif (retval < 0)\n+\t\treturn retval;\n \n-\t/* Create Crypto session*/\n-\trte_cryptodev_sym_session_init(ts_params->valid_devs[0],\n-\t\t\t\tut_params->sess,\n-\t\t\t\t&ut_params->cipher_xform,\n-\t\t\t\tts_params->session_priv_mpool);\n-\tTEST_ASSERT_NOT_NULL(ut_params->sess, \"Session creation failed\");\n+\tif (tdata->plaintext.len > MBUF_SIZE)\n+\t\tut_params->ibuf = rte_pktmbuf_alloc(ts_params->large_mbuf_pool);\n+\telse\n+\t\tut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);\n+\tTEST_ASSERT_NOT_NULL(ut_params->ibuf,\n+\t\t\t\"Failed to allocate input buffer in mempool\");\n \n-\t/* Generate Crypto op data structure */\n-\tut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,\n-\t\t\tRTE_CRYPTO_OP_TYPE_SYMMETRIC);\n-\tTEST_ASSERT_NOT_NULL(ut_params->op,\n-\t\t\t\"Failed to allocate symmetric crypto operation struct\");\n+\tmemset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,\n+\t\t\trte_pktmbuf_tailroom(ut_params->ibuf));\n \n-\t/* Set crypto operation data parameters */\n-\trte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);\n+\tplaintext_pad_len = RTE_ALIGN_CEIL(tdata->plaintext.len, 16);\n \n-\tstruct rte_crypto_sym_op *sym_op = ut_params->op->sym;\n+\t/*\n+\t * Runtime generate the large plain text instead of use hard code\n+\t * plain text vector. It is done to avoid create huge source file\n+\t * with the test vector.\n+\t */\n+\tif (tdata->plaintext.len == GMAC_LARGE_PLAINTEXT_LENGTH)\n+\t\tgenerate_gmac_large_plaintext(tdata->plaintext.data);\n \n-\t/* set crypto operation source mbuf */\n-\tsym_op->m_src = ut_params->ibuf;\n+\tplaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,\n+\t\t\t\tplaintext_pad_len);\n+\tTEST_ASSERT_NOT_NULL(plaintext, \"no room to append plaintext\");\n \n-\tsym_op->cipher.data.offset = 0;\n-\tsym_op->cipher.data.length = QUOTE_512_BYTES;\n+\tmemcpy(plaintext, tdata->plaintext.data, tdata->plaintext.len);\n+\tdebug_hexdump(stdout, \"plaintext:\", plaintext,\n+\t\t\ttdata->plaintext.len);\n \n-\t/* Process crypto operation */\n-\tut_params->op = process_crypto_request(ts_params->valid_devs[0],\n-\t\t\tut_params->op);\n-\tTEST_ASSERT_NOT_NULL(ut_params->op, \"no crypto operation returned\");\n+\tretval = create_gmac_operation(RTE_CRYPTO_AUTH_OP_VERIFY,\n+\t\t\ttdata);\n+\n+\tif (retval < 0)\n+\t\treturn retval;\n+\n+\trte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);\n+\n+\tut_params->op->sym->m_src = ut_params->ibuf;\n+\n+\tTEST_ASSERT_NOT_NULL(process_crypto_request(ts_params->valid_devs[0],\n+\t\t\tut_params->op), \"failed to process sym crypto op\");\n \n \tTEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,\n-\t\t\t\"crypto operation processing failed\");\n+\t\t\t\"crypto op processing failed\");\n \n-\t/* Validate obuf */\n-\tTEST_ASSERT_BUFFERS_ARE_EQUAL(\n-\t\t\trte_pktmbuf_mtod(ut_params->op->sym->m_src, uint8_t *),\n-\t\t\tcatch_22_quote,\n-\t\t\tQUOTE_512_BYTES,\n-\t\t\t\"Ciphertext data not as expected\");\n+\treturn 0;\n \n-\treturn TEST_SUCCESS;\n }\n-uint8_t orig_data[] = {0xab, 0xab, 0xab, 0xab,\n-\t\t\t0xab, 0xab, 0xab, 0xab,\n-\t\t\t0xab, 0xab, 0xab, 0xab,\n-\t\t\t0xab, 0xab, 0xab, 0xab};\n+\n static int\n-test_null_auth_only_operation(void)\n+test_AES_GMAC_authentication_verify_test_case_1(void)\n {\n-\tstruct crypto_testsuite_params *ts_params = &testsuite_params;\n-\tstruct crypto_unittest_params *ut_params = &unittest_params;\n-\tuint8_t *digest;\n-\n-\t/* Generate test mbuf data and space for digest */\n-\tut_params->ibuf = setup_test_string(ts_params->mbuf_pool,\n-\t\t\tcatch_22_quote, QUOTE_512_BYTES, 0);\n-\n-\t/* create a pointer for digest, but don't expect anything to be written\n-\t * here in a NULL auth algo so no mbuf append done.\n-\t */\n-\tdigest = rte_pktmbuf_mtod_offset(ut_params->ibuf, uint8_t *,\n-\t\t\tQUOTE_512_BYTES);\n-\t/* prefill the memory pointed to by digest */\n-\tmemcpy(digest, orig_data, sizeof(orig_data));\n-\n-\t/* Setup HMAC Parameters */\n-\tut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;\n-\tut_params->auth_xform.next = NULL;\n-\n-\tut_params->auth_xform.auth.algo = RTE_CRYPTO_AUTH_NULL;\n-\tut_params->auth_xform.auth.op = RTE_CRYPTO_AUTH_OP_GENERATE;\n-\n-\tut_params->sess = rte_cryptodev_sym_session_create(\n-\t\t\tts_params->session_mpool);\n-\n-\t/* Create Crypto session*/\n-\trte_cryptodev_sym_session_init(ts_params->valid_devs[0],\n-\t\t\tut_params->sess, &ut_params->auth_xform,\n-\t\t\tts_params->session_priv_mpool);\n-\tTEST_ASSERT_NOT_NULL(ut_params->sess, \"Session creation failed\");\n-\n-\t/* Generate Crypto op data structure */\n-\tut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,\n-\t\t\tRTE_CRYPTO_OP_TYPE_SYMMETRIC);\n-\tTEST_ASSERT_NOT_NULL(ut_params->op,\n-\t\t\t\"Failed to allocate symmetric crypto operation struct\");\n-\n-\t/* Set crypto operation data parameters */\n-\trte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);\n-\n-\tstruct rte_crypto_sym_op *sym_op = ut_params->op->sym;\n-\n-\tsym_op->m_src = ut_params->ibuf;\n-\n-\tsym_op->auth.data.offset = 0;\n-\tsym_op->auth.data.length = QUOTE_512_BYTES;\n-\tsym_op->auth.digest.data = digest;\n-\tsym_op->auth.digest.phys_addr = rte_pktmbuf_iova_offset(ut_params->ibuf,\n-\t\t\tQUOTE_512_BYTES);\n-\n-\t/* Process crypto operation */\n-\tut_params->op = process_crypto_request(ts_params->valid_devs[0],\n-\t\t\tut_params->op);\n-\tTEST_ASSERT_NOT_NULL(ut_params->op, \"no crypto operation returned\");\n-\n-\tTEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,\n-\t\t\t\"crypto operation processing failed\");\n-\t/* Make sure memory pointed to by digest hasn't been overwritten */\n-\tTEST_ASSERT_BUFFERS_ARE_EQUAL(\n-\t\t\torig_data,\n-\t\t\tdigest,\n-\t\t\tsizeof(orig_data),\n-\t\t\t\"Memory at digest ptr overwritten unexpectedly\");\n-\n-\treturn TEST_SUCCESS;\n+\treturn test_AES_GMAC_authentication_verify(&gmac_test_case_1);\n }\n \n-\n static int\n-test_null_cipher_auth_operation(void)\n+test_AES_GMAC_authentication_verify_test_case_2(void)\n {\n-\tstruct crypto_testsuite_params *ts_params = &testsuite_params;\n-\tstruct crypto_unittest_params *ut_params = &unittest_params;\n-\tuint8_t *digest;\n-\n-\t/* Generate test mbuf data and space for digest */\n-\tut_params->ibuf = setup_test_string(ts_params->mbuf_pool,\n-\t\t\tcatch_22_quote, QUOTE_512_BYTES, 0);\n-\n-\t/* create a pointer for digest, but don't expect anything to be written\n-\t * here in a NULL auth algo so no mbuf append done.\n-\t */\n-\tdigest = rte_pktmbuf_mtod_offset(ut_params->ibuf, uint8_t *,\n-\t\t\tQUOTE_512_BYTES);\n-\t/* prefill the memory pointed to by digest */\n-\tmemcpy(digest, orig_data, sizeof(orig_data));\n-\n-\t/* Setup Cipher Parameters */\n-\tut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER;\n-\tut_params->cipher_xform.next = &ut_params->auth_xform;\n-\n-\tut_params->cipher_xform.cipher.algo = RTE_CRYPTO_CIPHER_NULL;\n-\tut_params->cipher_xform.cipher.op = RTE_CRYPTO_CIPHER_OP_ENCRYPT;\n-\n-\t/* Setup HMAC Parameters */\n-\tut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;\n-\tut_params->auth_xform.next = NULL;\n-\n-\tut_params->auth_xform.auth.algo = RTE_CRYPTO_AUTH_NULL;\n-\tut_params->auth_xform.auth.op = RTE_CRYPTO_AUTH_OP_GENERATE;\n-\n-\tut_params->sess = rte_cryptodev_sym_session_create(\n-\t\t\tts_params->session_mpool);\n-\n-\t/* Create Crypto session*/\n-\trte_cryptodev_sym_session_init(ts_params->valid_devs[0],\n-\t\t\tut_params->sess, &ut_params->cipher_xform,\n-\t\t\tts_params->session_priv_mpool);\n-\tTEST_ASSERT_NOT_NULL(ut_params->sess, \"Session creation failed\");\n-\n-\t/* Generate Crypto op data structure */\n-\tut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,\n-\t\t\tRTE_CRYPTO_OP_TYPE_SYMMETRIC);\n-\tTEST_ASSERT_NOT_NULL(ut_params->op,\n-\t\t\t\"Failed to allocate symmetric crypto operation struct\");\n-\n-\t/* Set crypto operation data parameters */\n-\trte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);\n-\n-\tstruct rte_crypto_sym_op *sym_op = ut_params->op->sym;\n-\n-\tsym_op->m_src = ut_params->ibuf;\n-\n-\tsym_op->cipher.data.offset = 0;\n-\tsym_op->cipher.data.length = QUOTE_512_BYTES;\n-\n-\tsym_op->auth.data.offset = 0;\n-\tsym_op->auth.data.length = QUOTE_512_BYTES;\n-\tsym_op->auth.digest.data = digest;\n-\tsym_op->auth.digest.phys_addr = rte_pktmbuf_iova_offset(ut_params->ibuf,\n-\t\t\tQUOTE_512_BYTES);\n-\n-\t/* Process crypto operation */\n-\tut_params->op = process_crypto_request(ts_params->valid_devs[0],\n-\t\t\tut_params->op);\n-\tTEST_ASSERT_NOT_NULL(ut_params->op, \"no crypto operation returned\");\n-\n-\tTEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,\n-\t\t\t\"crypto operation processing failed\");\n-\n-\t/* Validate obuf */\n-\tTEST_ASSERT_BUFFERS_ARE_EQUAL(\n-\t\t\trte_pktmbuf_mtod(ut_params->op->sym->m_src, uint8_t *),\n-\t\t\tcatch_22_quote,\n-\t\t\tQUOTE_512_BYTES,\n-\t\t\t\"Ciphertext data not as expected\");\n-\t/* Make sure memory pointed to by digest hasn't been overwritten */\n-\tTEST_ASSERT_BUFFERS_ARE_EQUAL(\n-\t\t\torig_data,\n-\t\t\tdigest,\n-\t\t\tsizeof(orig_data),\n-\t\t\t\"Memory at digest ptr overwritten unexpectedly\");\n+\treturn test_AES_GMAC_authentication_verify(&gmac_test_case_2);\n+}\n \n-\treturn TEST_SUCCESS;\n+static int\n+test_AES_GMAC_authentication_verify_test_case_3(void)\n+{\n+\treturn test_AES_GMAC_authentication_verify(&gmac_test_case_3);\n }\n \n static int\n-test_null_auth_cipher_operation(void)\n+test_AES_GMAC_authentication_verify_test_case_4(void)\n {\n-\tstruct crypto_testsuite_params *ts_params = &testsuite_params;\n-\tstruct crypto_unittest_params *ut_params = &unittest_params;\n-\tuint8_t *digest;\n+\treturn test_AES_GMAC_authentication_verify(&gmac_test_case_4);\n+}\n \n-\t/* Generate test mbuf data */\n-\tut_params->ibuf = setup_test_string(ts_params->mbuf_pool,\n-\t\t\tcatch_22_quote, QUOTE_512_BYTES, 0);\n+struct test_crypto_vector {\n+\tenum rte_crypto_cipher_algorithm crypto_algo;\n+\tunsigned int cipher_offset;\n+\tunsigned int cipher_len;\n \n-\t/* create a pointer for digest, but don't expect anything to be written\n-\t * here in a NULL auth algo so no mbuf append done.\n-\t */\n-\tdigest = rte_pktmbuf_mtod_offset(ut_params->ibuf, uint8_t *,\n-\t\t\t\tQUOTE_512_BYTES);\n-\t/* prefill the memory pointed to by digest */\n-\tmemcpy(digest, orig_data, sizeof(orig_data));\n+\tstruct {\n+\t\tuint8_t data[64];\n+\t\tunsigned int len;\n+\t} cipher_key;\n \n-\t/* Setup Cipher Parameters */\n-\tut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER;\n-\tut_params->cipher_xform.next = NULL;\n+\tstruct {\n+\t\tuint8_t data[64];\n+\t\tunsigned int len;\n+\t} iv;\n \n-\tut_params->cipher_xform.cipher.algo = RTE_CRYPTO_CIPHER_NULL;\n-\tut_params->cipher_xform.cipher.op = RTE_CRYPTO_CIPHER_OP_ENCRYPT;\n+\tstruct {\n+\t\tconst uint8_t *data;\n+\t\tunsigned int len;\n+\t} plaintext;\n \n-\t/* Setup HMAC Parameters */\n-\tut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;\n-\tut_params->auth_xform.next = &ut_params->cipher_xform;\n+\tstruct {\n+\t\tconst uint8_t *data;\n+\t\tunsigned int len;\n+\t} ciphertext;\n \n-\tut_params->auth_xform.auth.algo = RTE_CRYPTO_AUTH_NULL;\n-\tut_params->auth_xform.auth.op = RTE_CRYPTO_AUTH_OP_GENERATE;\n+\tenum rte_crypto_auth_algorithm auth_algo;\n+\tunsigned int auth_offset;\n \n-\tut_params->sess = rte_cryptodev_sym_session_create(\n-\t\t\tts_params->session_mpool);\n+\tstruct {\n+\t\tuint8_t data[128];\n+\t\tunsigned int len;\n+\t} auth_key;\n \n-\t/* Create Crypto session*/\n-\trte_cryptodev_sym_session_init(ts_params->valid_devs[0],\n-\t\t\tut_params->sess, &ut_params->cipher_xform,\n-\t\t\tts_params->session_priv_mpool);\n-\tTEST_ASSERT_NOT_NULL(ut_params->sess, \"Session creation failed\");\n+\tstruct {\n+\t\tconst uint8_t *data;\n+\t\tunsigned int len;\n+\t} aad;\n \n-\t/* Generate Crypto op data structure */\n-\tut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,\n-\t\t\tRTE_CRYPTO_OP_TYPE_SYMMETRIC);\n-\tTEST_ASSERT_NOT_NULL(ut_params->op,\n-\t\t\t\"Failed to allocate symmetric crypto operation struct\");\n+\tstruct {\n+\t\tuint8_t data[128];\n+\t\tunsigned int len;\n+\t} digest;\n+};\n \n-\t/* Set crypto operation data parameters */\n-\trte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);\n+static const struct test_crypto_vector\n+hmac_sha1_test_crypto_vector = {\n+\t.auth_algo = RTE_CRYPTO_AUTH_SHA1_HMAC,\n+\t.plaintext = {\n+\t\t.data = plaintext_hash,\n+\t\t.len = 512\n+\t},\n+\t.auth_key = {\n+\t\t.data = {\n+\t\t\t0xF8, 0x2A, 0xC7, 0x54, 0xDB, 0x96, 0x18, 0xAA,\n+\t\t\t0xC3, 0xA1, 0x53, 0xF6, 0x1F, 0x17, 0x60, 0xBD,\n+\t\t\t0xDE, 0xF4, 0xDE, 0xAD\n+\t\t},\n+\t\t.len = 20\n+\t},\n+\t.digest = {\n+\t\t.data = {\n+\t\t\t0xC4, 0xB7, 0x0E, 0x6B, 0xDE, 0xD1, 0xE7, 0x77,\n+\t\t\t0x7E, 0x2E, 0x8F, 0xFC, 0x48, 0x39, 0x46, 0x17,\n+\t\t\t0x3F, 0x91, 0x64, 0x59\n+\t\t},\n+\t\t.len = 20\n+\t}\n+};\n \n-\tstruct rte_crypto_sym_op *sym_op = ut_params->op->sym;\n-\n-\tsym_op->m_src = ut_params->ibuf;\n-\n-\tsym_op->cipher.data.offset = 0;\n-\tsym_op->cipher.data.length = QUOTE_512_BYTES;\n-\n-\tsym_op->auth.data.offset = 0;\n-\tsym_op->auth.data.length = QUOTE_512_BYTES;\n-\tsym_op->auth.digest.data = digest;\n-\tsym_op->auth.digest.phys_addr = rte_pktmbuf_iova_offset(ut_params->ibuf,\n-\t\t\t\t\tQUOTE_512_BYTES);\n-\n-\t/* Process crypto operation */\n-\tut_params->op = process_crypto_request(ts_params->valid_devs[0],\n-\t\t\tut_params->op);\n-\tTEST_ASSERT_NOT_NULL(ut_params->op, \"no crypto operation returned\");\n+static const struct test_crypto_vector\n+aes128_gmac_test_vector = {\n+\t.auth_algo = RTE_CRYPTO_AUTH_AES_GMAC,\n+\t.plaintext = {\n+\t\t.data = plaintext_hash,\n+\t\t.len = 512\n+\t},\n+\t.iv = {\n+\t\t.data = {\n+\t\t\t0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,\n+\t\t\t0x08, 0x09, 0x0A, 0x0B\n+\t\t},\n+\t\t.len = 12\n+\t},\n+\t.auth_key = {\n+\t\t.data = {\n+\t\t\t0x42, 0x1A, 0x7D, 0x3D, 0xF5, 0x82, 0x80, 0xF1,\n+\t\t\t0xF1, 0x35, 0x5C, 0x3B, 0xDD, 0x9A, 0x65, 0xBA\n+\t\t},\n+\t\t.len = 16\n+\t},\n+\t.digest = {\n+\t\t.data = {\n+\t\t\t0xCA, 0x00, 0x99, 0x8B, 0x30, 0x7E, 0x74, 0x56,\n+\t\t\t0x32, 0xA7, 0x87, 0xB5, 0xE9, 0xB2, 0x34, 0x5A\n+\t\t},\n+\t\t.len = 16\n+\t}\n+};\n \n-\tTEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,\n-\t\t\t\"crypto operation processing failed\");\n+static const struct test_crypto_vector\n+aes128cbc_hmac_sha1_test_vector = {\n+\t.crypto_algo = RTE_CRYPTO_CIPHER_AES_CBC,\n+\t.cipher_offset = 0,\n+\t.cipher_len = 512,\n+\t.cipher_key = {\n+\t\t.data = {\n+\t\t\t0xE4, 0x23, 0x33, 0x8A, 0x35, 0x64, 0x61, 0xE2,\n+\t\t\t0x49, 0x03, 0xDD, 0xC6, 0xB8, 0xCA, 0x55, 0x7A\n+\t\t},\n+\t\t.len = 16\n+\t},\n+\t.iv = {\n+\t\t.data = {\n+\t\t\t0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,\n+\t\t\t0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F\n+\t\t},\n+\t\t.len = 16\n+\t},\n+\t.plaintext = {\n+\t\t.data = plaintext_hash,\n+\t\t.len = 512\n+\t},\n+\t.ciphertext = {\n+\t\t.data = ciphertext512_aes128cbc,\n+\t\t.len = 512\n+\t},\n+\t.auth_algo = RTE_CRYPTO_AUTH_SHA1_HMAC,\n+\t.auth_offset = 0,\n+\t.auth_key = {\n+\t\t.data = {\n+\t\t\t0xF8, 0x2A, 0xC7, 0x54, 0xDB, 0x96, 0x18, 0xAA,\n+\t\t\t0xC3, 0xA1, 0x53, 0xF6, 0x1F, 0x17, 0x60, 0xBD,\n+\t\t\t0xDE, 0xF4, 0xDE, 0xAD\n+\t\t},\n+\t\t.len = 20\n+\t},\n+\t.digest = {\n+\t\t.data = {\n+\t\t\t0x9A, 0x4F, 0x88, 0x1B, 0xB6, 0x8F, 0xD8, 0x60,\n+\t\t\t0x42, 0x1A, 0x7D, 0x3D, 0xF5, 0x82, 0x80, 0xF1,\n+\t\t\t0x18, 0x8C, 0x1D, 0x32\n+\t\t},\n+\t\t.len = 20\n+\t}\n+};\n \n-\t/* Validate obuf */\n-\tTEST_ASSERT_BUFFERS_ARE_EQUAL(\n-\t\t\trte_pktmbuf_mtod(ut_params->op->sym->m_src, uint8_t *),\n-\t\t\tcatch_22_quote,\n-\t\t\tQUOTE_512_BYTES,\n-\t\t\t\"Ciphertext data not as expected\");\n-\t/* Make sure memory pointed to by digest hasn't been overwritten */\n-\tTEST_ASSERT_BUFFERS_ARE_EQUAL(\n-\t\t\torig_data,\n-\t\t\tdigest,\n-\t\t\tsizeof(orig_data),\n-\t\t\t\"Memory at digest ptr overwritten unexpectedly\");\n+static const struct test_crypto_vector\n+aes128cbc_hmac_sha1_aad_test_vector = {\n+\t.crypto_algo = RTE_CRYPTO_CIPHER_AES_CBC,\n+\t.cipher_offset = 12,\n+\t.cipher_len = 496,\n+\t.cipher_key = {\n+\t\t.data = {\n+\t\t\t0xE4, 0x23, 0x33, 0x8A, 0x35, 0x64, 0x61, 0xE2,\n+\t\t\t0x49, 0x03, 0xDD, 0xC6, 0xB8, 0xCA, 0x55, 0x7A\n+\t\t},\n+\t\t.len = 16\n+\t},\n+\t.iv = {\n+\t\t.data = {\n+\t\t\t0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,\n+\t\t\t0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F\n+\t\t},\n+\t\t.len = 16\n+\t},\n+\t.plaintext = {\n+\t\t.data = plaintext_hash,\n+\t\t.len = 512\n+\t},\n+\t.ciphertext = {\n+\t\t.data = ciphertext512_aes128cbc_aad,\n+\t\t.len = 512\n+\t},\n+\t.auth_algo = RTE_CRYPTO_AUTH_SHA1_HMAC,\n+\t.auth_offset = 0,\n+\t.auth_key = {\n+\t\t.data = {\n+\t\t\t0xF8, 0x2A, 0xC7, 0x54, 0xDB, 0x96, 0x18, 0xAA,\n+\t\t\t0xC3, 0xA1, 0x53, 0xF6, 0x1F, 0x17, 0x60, 0xBD,\n+\t\t\t0xDE, 0xF4, 0xDE, 0xAD\n+\t\t},\n+\t\t.len = 20\n+\t},\n+\t.digest = {\n+\t\t.data = {\n+\t\t\t0x1F, 0x6A, 0xD2, 0x8B, 0x4B, 0xB3, 0xC0, 0x9E,\n+\t\t\t0x86, 0x9B, 0x3A, 0xF2, 0x00, 0x5B, 0x4F, 0x08,\n+\t\t\t0x62, 0x8D, 0x62, 0x65\n+\t\t},\n+\t\t.len = 20\n+\t}\n+};\n \n-\treturn TEST_SUCCESS;\n+static void\n+data_corruption(uint8_t *data)\n+{\n+\tdata[0] += 1;\n }\n \n+static void\n+tag_corruption(uint8_t *data, unsigned int tag_offset)\n+{\n+\tdata[tag_offset] += 1;\n+}\n \n static int\n-test_null_invalid_operation(void)\n+create_auth_session(struct crypto_unittest_params *ut_params,\n+\t\tuint8_t dev_id,\n+\t\tconst struct test_crypto_vector *reference,\n+\t\tenum rte_crypto_auth_operation auth_op)\n {\n \tstruct crypto_testsuite_params *ts_params = &testsuite_params;\n-\tstruct crypto_unittest_params *ut_params = &unittest_params;\n-\tint ret;\n-\n-\t/* Setup Cipher Parameters */\n-\tut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER;\n-\tut_params->cipher_xform.next = NULL;\n-\n-\tut_params->cipher_xform.cipher.algo = RTE_CRYPTO_CIPHER_AES_CBC;\n-\tut_params->cipher_xform.cipher.op = RTE_CRYPTO_CIPHER_OP_ENCRYPT;\n-\n-\tut_params->sess = rte_cryptodev_sym_session_create(\n-\t\t\tts_params->session_mpool);\n-\n-\t/* Create Crypto session*/\n-\tret = rte_cryptodev_sym_session_init(ts_params->valid_devs[0],\n-\t\t\tut_params->sess, &ut_params->cipher_xform,\n-\t\t\tts_params->session_priv_mpool);\n-\tTEST_ASSERT(ret < 0,\n-\t\t\t\"Session creation succeeded unexpectedly\");\n+\tuint8_t auth_key[reference->auth_key.len + 1];\n \n+\tmemcpy(auth_key, reference->auth_key.data, reference->auth_key.len);\n \n-\t/* Setup HMAC Parameters */\n+\t/* Setup Authentication Parameters */\n \tut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;\n+\tut_params->auth_xform.auth.op = auth_op;\n \tut_params->auth_xform.next = NULL;\n+\tut_params->auth_xform.auth.algo = reference->auth_algo;\n+\tut_params->auth_xform.auth.key.length = reference->auth_key.len;\n+\tut_params->auth_xform.auth.key.data = auth_key;\n+\tut_params->auth_xform.auth.digest_length = reference->digest.len;\n \n-\tut_params->auth_xform.auth.algo = RTE_CRYPTO_AUTH_SHA1_HMAC;\n-\tut_params->auth_xform.auth.op = RTE_CRYPTO_AUTH_OP_GENERATE;\n-\n+\t/* Create Crypto session*/\n \tut_params->sess = rte_cryptodev_sym_session_create(\n \t\t\tts_params->session_mpool);\n \n-\t/* Create Crypto session*/\n-\tret = rte_cryptodev_sym_session_init(ts_params->valid_devs[0],\n-\t\t\tut_params->sess, &ut_params->auth_xform,\n-\t\t\tts_params->session_priv_mpool);\n-\tTEST_ASSERT(ret < 0,\n-\t\t\t\"Session creation succeeded unexpectedly\");\n-\n-\treturn TEST_SUCCESS;\n-}\n+\trte_cryptodev_sym_session_init(dev_id, ut_params->sess,\n+\t\t\t\t&ut_params->auth_xform,\n+\t\t\t\tts_params->session_priv_mpool);\n \n+\tTEST_ASSERT_NOT_NULL(ut_params->sess, \"Session creation failed\");\n \n-#define NULL_BURST_LENGTH (32)\n+\treturn 0;\n+}\n \n static int\n-test_null_burst_operation(void)\n+create_auth_cipher_session(struct crypto_unittest_params *ut_params,\n+\t\tuint8_t dev_id,\n+\t\tconst struct test_crypto_vector *reference,\n+\t\tenum rte_crypto_auth_operation auth_op,\n+\t\tenum rte_crypto_cipher_operation cipher_op)\n {\n \tstruct crypto_testsuite_params *ts_params = &testsuite_params;\n-\tstruct crypto_unittest_params *ut_params = &unittest_params;\n-\n-\tunsigned i, burst_len = NULL_BURST_LENGTH;\n-\n-\tstruct rte_crypto_op *burst[NULL_BURST_LENGTH] = { NULL };\n-\tstruct rte_crypto_op *burst_dequeued[NULL_BURST_LENGTH] = { NULL };\n-\n-\t/* Setup Cipher Parameters */\n-\tut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER;\n-\tut_params->cipher_xform.next = &ut_params->auth_xform;\n+\tuint8_t cipher_key[reference->cipher_key.len + 1];\n+\tuint8_t auth_key[reference->auth_key.len + 1];\n \n-\tut_params->cipher_xform.cipher.algo = RTE_CRYPTO_CIPHER_NULL;\n-\tut_params->cipher_xform.cipher.op = RTE_CRYPTO_CIPHER_OP_ENCRYPT;\n+\tmemcpy(cipher_key, reference->cipher_key.data,\n+\t\t\treference->cipher_key.len);\n+\tmemcpy(auth_key, reference->auth_key.data, reference->auth_key.len);\n \n-\t/* Setup HMAC Parameters */\n+\t/* Setup Authentication Parameters */\n \tut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;\n-\tut_params->auth_xform.next = NULL;\n-\n-\tut_params->auth_xform.auth.algo = RTE_CRYPTO_AUTH_NULL;\n-\tut_params->auth_xform.auth.op = RTE_CRYPTO_AUTH_OP_GENERATE;\n+\tut_params->auth_xform.auth.op = auth_op;\n+\tut_params->auth_xform.auth.algo = reference->auth_algo;\n+\tut_params->auth_xform.auth.key.length = reference->auth_key.len;\n+\tut_params->auth_xform.auth.key.data = auth_key;\n+\tut_params->auth_xform.auth.digest_length = reference->digest.len;\n \n-\tut_params->sess = rte_cryptodev_sym_session_create(\n-\t\t\tts_params->session_mpool);\n+\tif (reference->auth_algo == RTE_CRYPTO_AUTH_AES_GMAC) {\n+\t\tut_params->auth_xform.auth.iv.offset = IV_OFFSET;\n+\t\tut_params->auth_xform.auth.iv.length = reference->iv.len;\n+\t} else {\n+\t\tut_params->auth_xform.next = &ut_params->cipher_xform;\n+\n+\t\t/* Setup Cipher Parameters */\n+\t\tut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER;\n+\t\tut_params->cipher_xform.next = NULL;\n+\t\tut_params->cipher_xform.cipher.algo = reference->crypto_algo;\n+\t\tut_params->cipher_xform.cipher.op = cipher_op;\n+\t\tut_params->cipher_xform.cipher.key.data = cipher_key;\n+\t\tut_params->cipher_xform.cipher.key.length =\n+\t\t\t\treference->cipher_key.len;\n+\t\tut_params->cipher_xform.cipher.iv.offset = IV_OFFSET;\n+\t\tut_params->cipher_xform.cipher.iv.length = reference->iv.len;\n+\t}\n \n \t/* Create Crypto session*/\n-\trte_cryptodev_sym_session_init(ts_params->valid_devs[0],\n-\t\t\tut_params->sess, &ut_params->cipher_xform,\n-\t\t\tts_params->session_priv_mpool);\n-\tTEST_ASSERT_NOT_NULL(ut_params->sess, \"Session creation failed\");\n+\tut_params->sess = rte_cryptodev_sym_session_create(\n+\t\t\tts_params->session_mpool);\n \n-\tTEST_ASSERT_EQUAL(rte_crypto_op_bulk_alloc(ts_params->op_mpool,\n-\t\t\tRTE_CRYPTO_OP_TYPE_SYMMETRIC, burst, burst_len),\n-\t\t\tburst_len, \"failed to generate burst of crypto ops\");\n+\trte_cryptodev_sym_session_init(dev_id, ut_params->sess,\n+\t\t\t\t&ut_params->auth_xform,\n+\t\t\t\tts_params->session_priv_mpool);\n \n-\t/* Generate an operation for each mbuf in burst */\n-\tfor (i = 0; i < burst_len; i++) {\n-\t\tstruct rte_mbuf *m = rte_pktmbuf_alloc(ts_params->mbuf_pool);\n+\tTEST_ASSERT_NOT_NULL(ut_params->sess, \"Session creation failed\");\n \n-\t\tTEST_ASSERT_NOT_NULL(m, \"Failed to allocate mbuf\");\n+\treturn 0;\n+}\n \n-\t\tunsigned *data = (unsigned *)rte_pktmbuf_append(m,\n-\t\t\t\tsizeof(unsigned));\n-\t\t*data = i;\n+static int\n+create_auth_operation(struct crypto_testsuite_params *ts_params,\n+\t\tstruct crypto_unittest_params *ut_params,\n+\t\tconst struct test_crypto_vector *reference,\n+\t\tunsigned int auth_generate)\n+{\n+\t/* Generate Crypto op data structure */\n+\tut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,\n+\t\t\tRTE_CRYPTO_OP_TYPE_SYMMETRIC);\n+\tTEST_ASSERT_NOT_NULL(ut_params->op,\n+\t\t\t\"Failed to allocate pktmbuf offload\");\n \n-\t\trte_crypto_op_attach_sym_session(burst[i], ut_params->sess);\n+\t/* Set crypto operation data parameters */\n+\trte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);\n \n-\t\tburst[i]->sym->m_src = m;\n-\t}\n+\tstruct rte_crypto_sym_op *sym_op = ut_params->op->sym;\n \n-\t/* Process crypto operation */\n-\tTEST_ASSERT_EQUAL(rte_cryptodev_enqueue_burst(ts_params->valid_devs[0],\n-\t\t\t0, burst, burst_len),\n-\t\t\tburst_len,\n-\t\t\t\"Error enqueuing burst\");\n+\t/* set crypto operation source mbuf */\n+\tsym_op->m_src = ut_params->ibuf;\n \n-\tTEST_ASSERT_EQUAL(rte_cryptodev_dequeue_burst(ts_params->valid_devs[0],\n-\t\t\t0, burst_dequeued, burst_len),\n-\t\t\tburst_len,\n-\t\t\t\"Error dequeuing burst\");\n+\t/* digest */\n+\tsym_op->auth.digest.data = (uint8_t *)rte_pktmbuf_append(\n+\t\t\tut_params->ibuf, reference->digest.len);\n \n+\tTEST_ASSERT_NOT_NULL(sym_op->auth.digest.data,\n+\t\t\t\"no room to append auth tag\");\n \n-\tfor (i = 0; i < burst_len; i++) {\n-\t\tTEST_ASSERT_EQUAL(\n-\t\t\t*rte_pktmbuf_mtod(burst[i]->sym->m_src, uint32_t *),\n-\t\t\t*rte_pktmbuf_mtod(burst_dequeued[i]->sym->m_src,\n-\t\t\t\t\tuint32_t *),\n-\t\t\t\"data not as expected\");\n+\tsym_op->auth.digest.phys_addr = rte_pktmbuf_iova_offset(\n+\t\t\tut_params->ibuf, reference->plaintext.len);\n \n-\t\trte_pktmbuf_free(burst[i]->sym->m_src);\n-\t\trte_crypto_op_free(burst[i]);\n-\t}\n+\tif (auth_generate)\n+\t\tmemset(sym_op->auth.digest.data, 0, reference->digest.len);\n+\telse\n+\t\tmemcpy(sym_op->auth.digest.data,\n+\t\t\t\treference->digest.data,\n+\t\t\t\treference->digest.len);\n \n-\treturn TEST_SUCCESS;\n-}\n+\tdebug_hexdump(stdout, \"digest:\",\n+\t\t\tsym_op->auth.digest.data,\n+\t\t\treference->digest.len);\n \n-static void\n-generate_gmac_large_plaintext(uint8_t *data)\n-{\n-\tuint16_t i;\n+\tsym_op->auth.data.length = reference->plaintext.len;\n+\tsym_op->auth.data.offset = 0;\n \n-\tfor (i = 32; i < GMAC_LARGE_PLAINTEXT_LENGTH; i += 32)\n-\t\tmemcpy(&data[i], &data[0], 32);\n+\treturn 0;\n }\n \n static int\n-create_gmac_operation(enum rte_crypto_auth_operation op,\n-\t\tconst struct gmac_test_data *tdata)\n+create_auth_GMAC_operation(struct crypto_testsuite_params *ts_params,\n+\t\tstruct crypto_unittest_params *ut_params,\n+\t\tconst struct test_crypto_vector *reference,\n+\t\tunsigned int auth_generate)\n {\n-\tstruct crypto_testsuite_params *ts_params = &testsuite_params;\n-\tstruct crypto_unittest_params *ut_params = &unittest_params;\n-\tstruct rte_crypto_sym_op *sym_op;\n-\n-\tuint32_t plaintext_pad_len = RTE_ALIGN_CEIL(tdata->plaintext.len, 16);\n-\n \t/* Generate Crypto op data structure */\n \tut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,\n \t\t\tRTE_CRYPTO_OP_TYPE_SYMMETRIC);\n \tTEST_ASSERT_NOT_NULL(ut_params->op,\n-\t\t\t\"Failed to allocate symmetric crypto operation struct\");\n+\t\t\t\"Failed to allocate pktmbuf offload\");\n \n-\tsym_op = ut_params->op->sym;\n+\t/* Set crypto operation data parameters */\n+\trte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);\n+\n+\tstruct rte_crypto_sym_op *sym_op = ut_params->op->sym;\n+\n+\t/* set crypto operation source mbuf */\n+\tsym_op->m_src = ut_params->ibuf;\n \n+\t/* digest */\n \tsym_op->auth.digest.data = (uint8_t *)rte_pktmbuf_append(\n-\t\t\tut_params->ibuf, tdata->gmac_tag.len);\n+\t\t\tut_params->ibuf, reference->digest.len);\n+\n \tTEST_ASSERT_NOT_NULL(sym_op->auth.digest.data,\n-\t\t\t\"no room to append digest\");\n+\t\t\t\"no room to append auth tag\");\n \n \tsym_op->auth.digest.phys_addr = rte_pktmbuf_iova_offset(\n-\t\t\tut_params->ibuf, plaintext_pad_len);\n-\n-\tif (op == RTE_CRYPTO_AUTH_OP_VERIFY) {\n-\t\trte_memcpy(sym_op->auth.digest.data, tdata->gmac_tag.data,\n-\t\t\t\ttdata->gmac_tag.len);\n-\t\tdebug_hexdump(stdout, \"digest:\",\n-\t\t\t\tsym_op->auth.digest.data,\n-\t\t\t\ttdata->gmac_tag.len);\n-\t}\n+\t\t\tut_params->ibuf, reference->ciphertext.len);\n \n-\tuint8_t *iv_ptr = rte_crypto_op_ctod_offset(ut_params->op,\n-\t\t\tuint8_t *, IV_OFFSET);\n+\tif (auth_generate)\n+\t\tmemset(sym_op->auth.digest.data, 0, reference->digest.len);\n+\telse\n+\t\tmemcpy(sym_op->auth.digest.data,\n+\t\t\t\treference->digest.data,\n+\t\t\t\treference->digest.len);\n \n-\trte_memcpy(iv_ptr, tdata->iv.data, tdata->iv.len);\n+\tdebug_hexdump(stdout, \"digest:\",\n+\t\t\tsym_op->auth.digest.data,\n+\t\t\treference->digest.len);\n \n-\tdebug_hexdump(stdout, \"iv:\", iv_ptr, tdata->iv.len);\n+\trte_memcpy(rte_crypto_op_ctod_offset(ut_params->op, uint8_t *,\n+\t\t\tIV_OFFSET), reference->iv.data, reference->iv.len);\n \n \tsym_op->cipher.data.length = 0;\n \tsym_op->cipher.data.offset = 0;\n \n+\tsym_op->auth.data.length = reference->plaintext.len;\n \tsym_op->auth.data.offset = 0;\n-\tsym_op->auth.data.length = tdata->plaintext.len;\n \n \treturn 0;\n }\n \n-static int create_gmac_session(uint8_t dev_id,\n-\t\tconst struct gmac_test_data *tdata,\n-\t\tenum rte_crypto_auth_operation auth_op)\n+static int\n+create_cipher_auth_operation(struct crypto_testsuite_params *ts_params,\n+\t\tstruct crypto_unittest_params *ut_params,\n+\t\tconst struct test_crypto_vector *reference,\n+\t\tunsigned int auth_generate)\n {\n-\tuint8_t auth_key[tdata->key.len];\n+\t/* Generate Crypto op data structure */\n+\tut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,\n+\t\t\tRTE_CRYPTO_OP_TYPE_SYMMETRIC);\n+\tTEST_ASSERT_NOT_NULL(ut_params->op,\n+\t\t\t\"Failed to allocate pktmbuf offload\");\n \n-\tstruct crypto_testsuite_params *ts_params = &testsuite_params;\n-\tstruct crypto_unittest_params *ut_params = &unittest_params;\n+\t/* Set crypto operation data parameters */\n+\trte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);\n \n-\tmemcpy(auth_key, tdata->key.data, tdata->key.len);\n+\tstruct rte_crypto_sym_op *sym_op = ut_params->op->sym;\n \n-\tut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;\n-\tut_params->auth_xform.next = NULL;\n+\t/* set crypto operation source mbuf */\n+\tsym_op->m_src = ut_params->ibuf;\n \n-\tut_params->auth_xform.auth.algo = RTE_CRYPTO_AUTH_AES_GMAC;\n-\tut_params->auth_xform.auth.op = auth_op;\n-\tut_params->auth_xform.auth.digest_length = tdata->gmac_tag.len;\n-\tut_params->auth_xform.auth.key.length = tdata->key.len;\n-\tut_params->auth_xform.auth.key.data = auth_key;\n-\tut_params->auth_xform.auth.iv.offset = IV_OFFSET;\n-\tut_params->auth_xform.auth.iv.length = tdata->iv.len;\n+\t/* digest */\n+\tsym_op->auth.digest.data = (uint8_t *)rte_pktmbuf_append(\n+\t\t\tut_params->ibuf, reference->digest.len);\n \n+\tTEST_ASSERT_NOT_NULL(sym_op->auth.digest.data,\n+\t\t\t\"no room to append auth tag\");\n \n-\tut_params->sess = rte_cryptodev_sym_session_create(\n-\t\t\tts_params->session_mpool);\n+\tsym_op->auth.digest.phys_addr = rte_pktmbuf_iova_offset(\n+\t\t\tut_params->ibuf, reference->ciphertext.len);\n \n-\trte_cryptodev_sym_session_init(dev_id, ut_params->sess,\n-\t\t\t&ut_params->auth_xform,\n-\t\t\tts_params->session_priv_mpool);\n+\tif (auth_generate)\n+\t\tmemset(sym_op->auth.digest.data, 0, reference->digest.len);\n+\telse\n+\t\tmemcpy(sym_op->auth.digest.data,\n+\t\t\t\treference->digest.data,\n+\t\t\t\treference->digest.len);\n \n-\tTEST_ASSERT_NOT_NULL(ut_params->sess, \"Session creation failed\");\n+\tdebug_hexdump(stdout, \"digest:\",\n+\t\t\tsym_op->auth.digest.data,\n+\t\t\treference->digest.len);\n+\n+\trte_memcpy(rte_crypto_op_ctod_offset(ut_params->op, uint8_t *,\n+\t\t\tIV_OFFSET), reference->iv.data, reference->iv.len);\n+\n+\tsym_op->cipher.data.length = reference->cipher_len;\n+\tsym_op->cipher.data.offset = reference->cipher_offset;\n+\n+\tsym_op->auth.data.length = reference->plaintext.len;\n+\tsym_op->auth.data.offset = reference->auth_offset;\n \n \treturn 0;\n }\n \n static int\n-test_AES_GMAC_authentication(const struct gmac_test_data *tdata)\n+create_auth_verify_operation(struct crypto_testsuite_params *ts_params,\n+\t\tstruct crypto_unittest_params *ut_params,\n+\t\tconst struct test_crypto_vector *reference)\n {\n-\tstruct crypto_testsuite_params *ts_params = &testsuite_params;\n-\tstruct crypto_unittest_params *ut_params = &unittest_params;\n+\treturn create_auth_operation(ts_params, ut_params, reference, 0);\n+}\n \n-\tint retval;\n+static int\n+create_auth_verify_GMAC_operation(\n+\t\tstruct crypto_testsuite_params *ts_params,\n+\t\tstruct crypto_unittest_params *ut_params,\n+\t\tconst struct test_crypto_vector *reference)\n+{\n+\treturn create_auth_GMAC_operation(ts_params, ut_params, reference, 0);\n+}\n \n-\tuint8_t *auth_tag, *plaintext;\n-\tuint16_t plaintext_pad_len;\n+static int\n+create_cipher_auth_verify_operation(struct crypto_testsuite_params *ts_params,\n+\t\tstruct crypto_unittest_params *ut_params,\n+\t\tconst struct test_crypto_vector *reference)\n+{\n+\treturn create_cipher_auth_operation(ts_params, ut_params, reference, 0);\n+}\n \n-\tTEST_ASSERT_NOT_EQUAL(tdata->gmac_tag.len, 0,\n-\t\t\t      \"No GMAC length in the source data\");\n+static int\n+test_authentication_verify_fail_when_data_corruption(\n+\t\tstruct crypto_testsuite_params *ts_params,\n+\t\tstruct crypto_unittest_params *ut_params,\n+\t\tconst struct test_crypto_vector *reference,\n+\t\tunsigned int data_corrupted)\n+{\n+\tint retval;\n \n-\tretval = create_gmac_session(ts_params->valid_devs[0],\n-\t\t\ttdata, RTE_CRYPTO_AUTH_OP_GENERATE);\n+\tuint8_t *plaintext;\n \n-\tif (retval < 0)\n-\t\treturn retval;\n+\t/* Verify the capabilities */\n+\tstruct rte_cryptodev_sym_capability_idx cap_idx;\n+\tcap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;\n+\tcap_idx.algo.auth = reference->auth_algo;\n+\tif (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],\n+\t\t\t&cap_idx) == NULL)\n+\t\treturn -ENOTSUP;\n \n-\tif (tdata->plaintext.len > MBUF_SIZE)\n-\t\tut_params->ibuf = rte_pktmbuf_alloc(ts_params->large_mbuf_pool);\n-\telse\n-\t\tut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);\n+\t/* Create session */\n+\tretval = create_auth_session(ut_params,\n+\t\t\tts_params->valid_devs[0],\n+\t\t\treference,\n+\t\t\tRTE_CRYPTO_AUTH_OP_VERIFY);\n+\tif (retval < 0)\n+\t\treturn retval;\n+\n+\tut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);\n \tTEST_ASSERT_NOT_NULL(ut_params->ibuf,\n \t\t\t\"Failed to allocate input buffer in mempool\");\n \n+\t/* clear mbuf payload */\n \tmemset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,\n \t\t\trte_pktmbuf_tailroom(ut_params->ibuf));\n \n-\tplaintext_pad_len = RTE_ALIGN_CEIL(tdata->plaintext.len, 16);\n-\t/*\n-\t * Runtime generate the large plain text instead of use hard code\n-\t * plain text vector. It is done to avoid create huge source file\n-\t * with the test vector.\n-\t */\n-\tif (tdata->plaintext.len == GMAC_LARGE_PLAINTEXT_LENGTH)\n-\t\tgenerate_gmac_large_plaintext(tdata->plaintext.data);\n-\n \tplaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,\n-\t\t\t\tplaintext_pad_len);\n+\t\t\treference->plaintext.len);\n \tTEST_ASSERT_NOT_NULL(plaintext, \"no room to append plaintext\");\n+\tmemcpy(plaintext, reference->plaintext.data, reference->plaintext.len);\n \n-\tmemcpy(plaintext, tdata->plaintext.data, tdata->plaintext.len);\n \tdebug_hexdump(stdout, \"plaintext:\", plaintext,\n-\t\t\ttdata->plaintext.len);\n+\t\treference->plaintext.len);\n \n-\tretval = create_gmac_operation(RTE_CRYPTO_AUTH_OP_GENERATE,\n-\t\t\ttdata);\n+\t/* Create operation */\n+\tretval = create_auth_verify_operation(ts_params, ut_params, reference);\n \n \tif (retval < 0)\n \t\treturn retval;\n \n-\trte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);\n-\n-\tut_params->op->sym->m_src = ut_params->ibuf;\n-\n-\tTEST_ASSERT_NOT_NULL(process_crypto_request(ts_params->valid_devs[0],\n-\t\t\tut_params->op), \"failed to process sym crypto op\");\n-\n-\tTEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,\n-\t\t\t\"crypto op processing failed\");\n-\n-\tif (ut_params->op->sym->m_dst) {\n-\t\tauth_tag = rte_pktmbuf_mtod_offset(ut_params->op->sym->m_dst,\n-\t\t\t\tuint8_t *, plaintext_pad_len);\n-\t} else {\n-\t\tauth_tag = plaintext + plaintext_pad_len;\n-\t}\n+\tif (data_corrupted)\n+\t\tdata_corruption(plaintext);\n+\telse\n+\t\ttag_corruption(plaintext, reference->plaintext.len);\n \n-\tdebug_hexdump(stdout, \"auth tag:\", auth_tag, tdata->gmac_tag.len);\n+\tut_params->op = process_crypto_request(ts_params->valid_devs[0],\n+\t\t\tut_params->op);\n+\tTEST_ASSERT_NOT_NULL(ut_params->op, \"failed crypto process\");\n+\tTEST_ASSERT_NOT_EQUAL(ut_params->op->status,\n+\t\t\tRTE_CRYPTO_OP_STATUS_SUCCESS,\n+\t\t\t\"authentication not failed\");\n \n-\tTEST_ASSERT_BUFFERS_ARE_EQUAL(\n-\t\t\tauth_tag,\n-\t\t\ttdata->gmac_tag.data,\n-\t\t\ttdata->gmac_tag.len,\n-\t\t\t\"GMAC Generated auth tag not as expected\");\n+\tut_params->obuf = ut_params->op->sym->m_src;\n+\tTEST_ASSERT_NOT_NULL(ut_params->obuf, \"failed to retrieve obuf\");\n \n \treturn 0;\n }\n \n static int\n-test_AES_GMAC_authentication_test_case_1(void)\n-{\n-\treturn test_AES_GMAC_authentication(&gmac_test_case_1);\n-}\n-\n-static int\n-test_AES_GMAC_authentication_test_case_2(void)\n-{\n-\treturn test_AES_GMAC_authentication(&gmac_test_case_2);\n-}\n-\n-static int\n-test_AES_GMAC_authentication_test_case_3(void)\n-{\n-\treturn test_AES_GMAC_authentication(&gmac_test_case_3);\n-}\n-\n-static int\n-test_AES_GMAC_authentication_test_case_4(void)\n-{\n-\treturn test_AES_GMAC_authentication(&gmac_test_case_4);\n-}\n-\n-static int\n-test_AES_GMAC_authentication_verify(const struct gmac_test_data *tdata)\n+test_authentication_verify_GMAC_fail_when_corruption(\n+\t\tstruct crypto_testsuite_params *ts_params,\n+\t\tstruct crypto_unittest_params *ut_params,\n+\t\tconst struct test_crypto_vector *reference,\n+\t\tunsigned int data_corrupted)\n {\n-\tstruct crypto_testsuite_params *ts_params = &testsuite_params;\n-\tstruct crypto_unittest_params *ut_params = &unittest_params;\n \tint retval;\n-\tuint32_t plaintext_pad_len;\n \tuint8_t *plaintext;\n \n-\tTEST_ASSERT_NOT_EQUAL(tdata->gmac_tag.len, 0,\n-\t\t\t      \"No GMAC length in the source data\");\n-\n-\tretval = create_gmac_session(ts_params->valid_devs[0],\n-\t\t\ttdata, RTE_CRYPTO_AUTH_OP_VERIFY);\n+\t/* Verify the capabilities */\n+\tstruct rte_cryptodev_sym_capability_idx cap_idx;\n+\tcap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;\n+\tcap_idx.algo.auth = reference->auth_algo;\n+\tif (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],\n+\t\t\t&cap_idx) == NULL)\n+\t\treturn -ENOTSUP;\n \n+\t/* Create session */\n+\tretval = create_auth_cipher_session(ut_params,\n+\t\t\tts_params->valid_devs[0],\n+\t\t\treference,\n+\t\t\tRTE_CRYPTO_AUTH_OP_VERIFY,\n+\t\t\tRTE_CRYPTO_CIPHER_OP_DECRYPT);\n \tif (retval < 0)\n \t\treturn retval;\n \n-\tif (tdata->plaintext.len > MBUF_SIZE)\n-\t\tut_params->ibuf = rte_pktmbuf_alloc(ts_params->large_mbuf_pool);\n-\telse\n-\t\tut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);\n+\tut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);\n \tTEST_ASSERT_NOT_NULL(ut_params->ibuf,\n \t\t\t\"Failed to allocate input buffer in mempool\");\n \n+\t/* clear mbuf payload */\n \tmemset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,\n \t\t\trte_pktmbuf_tailroom(ut_params->ibuf));\n \n-\tplaintext_pad_len = RTE_ALIGN_CEIL(tdata->plaintext.len, 16);\n-\n-\t/*\n-\t * Runtime generate the large plain text instead of use hard code\n-\t * plain text vector. It is done to avoid create huge source file\n-\t * with the test vector.\n-\t */\n-\tif (tdata->plaintext.len == GMAC_LARGE_PLAINTEXT_LENGTH)\n-\t\tgenerate_gmac_large_plaintext(tdata->plaintext.data);\n-\n \tplaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,\n-\t\t\t\tplaintext_pad_len);\n+\t\t\treference->plaintext.len);\n \tTEST_ASSERT_NOT_NULL(plaintext, \"no room to append plaintext\");\n+\tmemcpy(plaintext, reference->plaintext.data, reference->plaintext.len);\n \n-\tmemcpy(plaintext, tdata->plaintext.data, tdata->plaintext.len);\n \tdebug_hexdump(stdout, \"plaintext:\", plaintext,\n-\t\t\ttdata->plaintext.len);\n+\t\treference->plaintext.len);\n \n-\tretval = create_gmac_operation(RTE_CRYPTO_AUTH_OP_VERIFY,\n-\t\t\ttdata);\n+\t/* Create operation */\n+\tretval = create_auth_verify_GMAC_operation(ts_params,\n+\t\t\tut_params,\n+\t\t\treference);\n \n \tif (retval < 0)\n \t\treturn retval;\n \n-\trte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);\n-\n-\tut_params->op->sym->m_src = ut_params->ibuf;\n+\tif (data_corrupted)\n+\t\tdata_corruption(plaintext);\n+\telse\n+\t\ttag_corruption(plaintext, reference->aad.len);\n \n-\tTEST_ASSERT_NOT_NULL(process_crypto_request(ts_params->valid_devs[0],\n-\t\t\tut_params->op), \"failed to process sym crypto op\");\n+\tut_params->op = process_crypto_request(ts_params->valid_devs[0],\n+\t\t\tut_params->op);\n+\tTEST_ASSERT_NOT_NULL(ut_params->op, \"failed crypto process\");\n+\tTEST_ASSERT_NOT_EQUAL(ut_params->op->status,\n+\t\t\tRTE_CRYPTO_OP_STATUS_SUCCESS,\n+\t\t\t\"authentication not failed\");\n \n-\tTEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,\n-\t\t\t\"crypto op processing failed\");\n+\tut_params->obuf = ut_params->op->sym->m_src;\n+\tTEST_ASSERT_NOT_NULL(ut_params->obuf, \"failed to retrieve obuf\");\n \n \treturn 0;\n-\n }\n \n static int\n-test_AES_GMAC_authentication_verify_test_case_1(void)\n+test_authenticated_decryption_fail_when_corruption(\n+\t\tstruct crypto_testsuite_params *ts_params,\n+\t\tstruct crypto_unittest_params *ut_params,\n+\t\tconst struct test_crypto_vector *reference,\n+\t\tunsigned int data_corrupted)\n {\n-\treturn test_AES_GMAC_authentication_verify(&gmac_test_case_1);\n-}\n+\tint retval;\n \n-static int\n-test_AES_GMAC_authentication_verify_test_case_2(void)\n-{\n-\treturn test_AES_GMAC_authentication_verify(&gmac_test_case_2);\n-}\n+\tuint8_t *ciphertext;\n \n-static int\n-test_AES_GMAC_authentication_verify_test_case_3(void)\n-{\n-\treturn test_AES_GMAC_authentication_verify(&gmac_test_case_3);\n-}\n+\t/* Verify the capabilities */\n+\tstruct rte_cryptodev_sym_capability_idx cap_idx;\n+\tcap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;\n+\tcap_idx.algo.auth = reference->auth_algo;\n+\tif (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],\n+\t\t\t&cap_idx) == NULL)\n+\t\treturn -ENOTSUP;\n+\tcap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;\n+\tcap_idx.algo.cipher = reference->crypto_algo;\n+\tif (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],\n+\t\t\t&cap_idx) == NULL)\n+\t\treturn -ENOTSUP;\n \n-static int\n-test_AES_GMAC_authentication_verify_test_case_4(void)\n-{\n-\treturn test_AES_GMAC_authentication_verify(&gmac_test_case_4);\n-}\n+\t/* Create session */\n+\tretval = create_auth_cipher_session(ut_params,\n+\t\t\tts_params->valid_devs[0],\n+\t\t\treference,\n+\t\t\tRTE_CRYPTO_AUTH_OP_VERIFY,\n+\t\t\tRTE_CRYPTO_CIPHER_OP_DECRYPT);\n+\tif (retval < 0)\n+\t\treturn retval;\n \n-struct test_crypto_vector {\n-\tenum rte_crypto_cipher_algorithm crypto_algo;\n-\tunsigned int cipher_offset;\n-\tunsigned int cipher_len;\n+\tut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);\n+\tTEST_ASSERT_NOT_NULL(ut_params->ibuf,\n+\t\t\t\"Failed to allocate input buffer in mempool\");\n \n-\tstruct {\n-\t\tuint8_t data[64];\n-\t\tunsigned int len;\n-\t} cipher_key;\n+\t/* clear mbuf payload */\n+\tmemset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,\n+\t\t\trte_pktmbuf_tailroom(ut_params->ibuf));\n \n-\tstruct {\n-\t\tuint8_t data[64];\n-\t\tunsigned int len;\n-\t} iv;\n+\tciphertext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,\n+\t\t\treference->ciphertext.len);\n+\tTEST_ASSERT_NOT_NULL(ciphertext, \"no room to append ciphertext\");\n+\tmemcpy(ciphertext, reference->ciphertext.data,\n+\t\t\treference->ciphertext.len);\n \n-\tstruct {\n-\t\tconst uint8_t *data;\n-\t\tunsigned int len;\n-\t} plaintext;\n+\t/* Create operation */\n+\tretval = create_cipher_auth_verify_operation(ts_params,\n+\t\t\tut_params,\n+\t\t\treference);\n \n-\tstruct {\n-\t\tconst uint8_t *data;\n-\t\tunsigned int len;\n-\t} ciphertext;\n+\tif (retval < 0)\n+\t\treturn retval;\n \n-\tenum rte_crypto_auth_algorithm auth_algo;\n-\tunsigned int auth_offset;\n+\tif (data_corrupted)\n+\t\tdata_corruption(ciphertext);\n+\telse\n+\t\ttag_corruption(ciphertext, reference->ciphertext.len);\n \n-\tstruct {\n-\t\tuint8_t data[128];\n-\t\tunsigned int len;\n-\t} auth_key;\n+\tut_params->op = process_crypto_request(ts_params->valid_devs[0],\n+\t\t\tut_params->op);\n \n-\tstruct {\n-\t\tconst uint8_t *data;\n-\t\tunsigned int len;\n-\t} aad;\n-\n-\tstruct {\n-\t\tuint8_t data[128];\n-\t\tunsigned int len;\n-\t} digest;\n-};\n-\n-static const struct test_crypto_vector\n-hmac_sha1_test_crypto_vector = {\n-\t.auth_algo = RTE_CRYPTO_AUTH_SHA1_HMAC,\n-\t.plaintext = {\n-\t\t.data = plaintext_hash,\n-\t\t.len = 512\n-\t},\n-\t.auth_key = {\n-\t\t.data = {\n-\t\t\t0xF8, 0x2A, 0xC7, 0x54, 0xDB, 0x96, 0x18, 0xAA,\n-\t\t\t0xC3, 0xA1, 0x53, 0xF6, 0x1F, 0x17, 0x60, 0xBD,\n-\t\t\t0xDE, 0xF4, 0xDE, 0xAD\n-\t\t},\n-\t\t.len = 20\n-\t},\n-\t.digest = {\n-\t\t.data = {\n-\t\t\t0xC4, 0xB7, 0x0E, 0x6B, 0xDE, 0xD1, 0xE7, 0x77,\n-\t\t\t0x7E, 0x2E, 0x8F, 0xFC, 0x48, 0x39, 0x46, 0x17,\n-\t\t\t0x3F, 0x91, 0x64, 0x59\n-\t\t},\n-\t\t.len = 20\n-\t}\n-};\n-\n-static const struct test_crypto_vector\n-aes128_gmac_test_vector = {\n-\t.auth_algo = RTE_CRYPTO_AUTH_AES_GMAC,\n-\t.plaintext = {\n-\t\t.data = plaintext_hash,\n-\t\t.len = 512\n-\t},\n-\t.iv = {\n-\t\t.data = {\n-\t\t\t0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,\n-\t\t\t0x08, 0x09, 0x0A, 0x0B\n-\t\t},\n-\t\t.len = 12\n-\t},\n-\t.auth_key = {\n-\t\t.data = {\n-\t\t\t0x42, 0x1A, 0x7D, 0x3D, 0xF5, 0x82, 0x80, 0xF1,\n-\t\t\t0xF1, 0x35, 0x5C, 0x3B, 0xDD, 0x9A, 0x65, 0xBA\n-\t\t},\n-\t\t.len = 16\n-\t},\n-\t.digest = {\n-\t\t.data = {\n-\t\t\t0xCA, 0x00, 0x99, 0x8B, 0x30, 0x7E, 0x74, 0x56,\n-\t\t\t0x32, 0xA7, 0x87, 0xB5, 0xE9, 0xB2, 0x34, 0x5A\n-\t\t},\n-\t\t.len = 16\n-\t}\n-};\n-\n-static const struct test_crypto_vector\n-aes128cbc_hmac_sha1_test_vector = {\n-\t.crypto_algo = RTE_CRYPTO_CIPHER_AES_CBC,\n-\t.cipher_offset = 0,\n-\t.cipher_len = 512,\n-\t.cipher_key = {\n-\t\t.data = {\n-\t\t\t0xE4, 0x23, 0x33, 0x8A, 0x35, 0x64, 0x61, 0xE2,\n-\t\t\t0x49, 0x03, 0xDD, 0xC6, 0xB8, 0xCA, 0x55, 0x7A\n-\t\t},\n-\t\t.len = 16\n-\t},\n-\t.iv = {\n-\t\t.data = {\n-\t\t\t0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,\n-\t\t\t0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F\n-\t\t},\n-\t\t.len = 16\n-\t},\n-\t.plaintext = {\n-\t\t.data = plaintext_hash,\n-\t\t.len = 512\n-\t},\n-\t.ciphertext = {\n-\t\t.data = ciphertext512_aes128cbc,\n-\t\t.len = 512\n-\t},\n-\t.auth_algo = RTE_CRYPTO_AUTH_SHA1_HMAC,\n-\t.auth_offset = 0,\n-\t.auth_key = {\n-\t\t.data = {\n-\t\t\t0xF8, 0x2A, 0xC7, 0x54, 0xDB, 0x96, 0x18, 0xAA,\n-\t\t\t0xC3, 0xA1, 0x53, 0xF6, 0x1F, 0x17, 0x60, 0xBD,\n-\t\t\t0xDE, 0xF4, 0xDE, 0xAD\n-\t\t},\n-\t\t.len = 20\n-\t},\n-\t.digest = {\n-\t\t.data = {\n-\t\t\t0x9A, 0x4F, 0x88, 0x1B, 0xB6, 0x8F, 0xD8, 0x60,\n-\t\t\t0x42, 0x1A, 0x7D, 0x3D, 0xF5, 0x82, 0x80, 0xF1,\n-\t\t\t0x18, 0x8C, 0x1D, 0x32\n-\t\t},\n-\t\t.len = 20\n-\t}\n-};\n-\n-static const struct test_crypto_vector\n-aes128cbc_hmac_sha1_aad_test_vector = {\n-\t.crypto_algo = RTE_CRYPTO_CIPHER_AES_CBC,\n-\t.cipher_offset = 12,\n-\t.cipher_len = 496,\n-\t.cipher_key = {\n-\t\t.data = {\n-\t\t\t0xE4, 0x23, 0x33, 0x8A, 0x35, 0x64, 0x61, 0xE2,\n-\t\t\t0x49, 0x03, 0xDD, 0xC6, 0xB8, 0xCA, 0x55, 0x7A\n-\t\t},\n-\t\t.len = 16\n-\t},\n-\t.iv = {\n-\t\t.data = {\n-\t\t\t0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,\n-\t\t\t0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F\n-\t\t},\n-\t\t.len = 16\n-\t},\n-\t.plaintext = {\n-\t\t.data = plaintext_hash,\n-\t\t.len = 512\n-\t},\n-\t.ciphertext = {\n-\t\t.data = ciphertext512_aes128cbc_aad,\n-\t\t.len = 512\n-\t},\n-\t.auth_algo = RTE_CRYPTO_AUTH_SHA1_HMAC,\n-\t.auth_offset = 0,\n-\t.auth_key = {\n-\t\t.data = {\n-\t\t\t0xF8, 0x2A, 0xC7, 0x54, 0xDB, 0x96, 0x18, 0xAA,\n-\t\t\t0xC3, 0xA1, 0x53, 0xF6, 0x1F, 0x17, 0x60, 0xBD,\n-\t\t\t0xDE, 0xF4, 0xDE, 0xAD\n-\t\t},\n-\t\t.len = 20\n-\t},\n-\t.digest = {\n-\t\t.data = {\n-\t\t\t0x1F, 0x6A, 0xD2, 0x8B, 0x4B, 0xB3, 0xC0, 0x9E,\n-\t\t\t0x86, 0x9B, 0x3A, 0xF2, 0x00, 0x5B, 0x4F, 0x08,\n-\t\t\t0x62, 0x8D, 0x62, 0x65\n-\t\t},\n-\t\t.len = 20\n-\t}\n-};\n+\tTEST_ASSERT_NOT_NULL(ut_params->op, \"failed crypto process\");\n+\tTEST_ASSERT_NOT_EQUAL(ut_params->op->status,\n+\t\t\tRTE_CRYPTO_OP_STATUS_SUCCESS,\n+\t\t\t\"authentication not failed\");\n \n-static void\n-data_corruption(uint8_t *data)\n-{\n-\tdata[0] += 1;\n-}\n+\tut_params->obuf = ut_params->op->sym->m_src;\n+\tTEST_ASSERT_NOT_NULL(ut_params->obuf, \"failed to retrieve obuf\");\n \n-static void\n-tag_corruption(uint8_t *data, unsigned int tag_offset)\n-{\n-\tdata[tag_offset] += 1;\n+\treturn 0;\n }\n \n static int\n-create_auth_session(struct crypto_unittest_params *ut_params,\n-\t\tuint8_t dev_id,\n-\t\tconst struct test_crypto_vector *reference,\n-\t\tenum rte_crypto_auth_operation auth_op)\n+test_authenticated_encryt_with_esn(\n+\t\tstruct crypto_testsuite_params *ts_params,\n+\t\tstruct crypto_unittest_params *ut_params,\n+\t\tconst struct test_crypto_vector *reference)\n {\n-\tstruct crypto_testsuite_params *ts_params = &testsuite_params;\n+\tint retval;\n+\n+\tuint8_t *authciphertext, *plaintext, *auth_tag;\n+\tuint16_t plaintext_pad_len;\n+\tuint8_t cipher_key[reference->cipher_key.len + 1];\n \tuint8_t auth_key[reference->auth_key.len + 1];\n \n+\t/* Verify the capabilities */\n+\tstruct rte_cryptodev_sym_capability_idx cap_idx;\n+\tcap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;\n+\tcap_idx.algo.auth = reference->auth_algo;\n+\tif (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],\n+\t\t\t&cap_idx) == NULL)\n+\t\treturn -ENOTSUP;\n+\tcap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;\n+\tcap_idx.algo.cipher = reference->crypto_algo;\n+\tif (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],\n+\t\t\t&cap_idx) == NULL)\n+\t\treturn -ENOTSUP;\n+\n+\t/* Create session */\n+\tmemcpy(cipher_key, reference->cipher_key.data,\n+\t\t\treference->cipher_key.len);\n \tmemcpy(auth_key, reference->auth_key.data, reference->auth_key.len);\n \n+\t/* Setup Cipher Parameters */\n+\tut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER;\n+\tut_params->cipher_xform.cipher.algo = reference->crypto_algo;\n+\tut_params->cipher_xform.cipher.op = RTE_CRYPTO_CIPHER_OP_ENCRYPT;\n+\tut_params->cipher_xform.cipher.key.data = cipher_key;\n+\tut_params->cipher_xform.cipher.key.length = reference->cipher_key.len;\n+\tut_params->cipher_xform.cipher.iv.offset = IV_OFFSET;\n+\tut_params->cipher_xform.cipher.iv.length = reference->iv.len;\n+\n+\tut_params->cipher_xform.next = &ut_params->auth_xform;\n+\n \t/* Setup Authentication Parameters */\n \tut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;\n-\tut_params->auth_xform.auth.op = auth_op;\n-\tut_params->auth_xform.next = NULL;\n+\tut_params->auth_xform.auth.op = RTE_CRYPTO_AUTH_OP_GENERATE;\n \tut_params->auth_xform.auth.algo = reference->auth_algo;\n \tut_params->auth_xform.auth.key.length = reference->auth_key.len;\n \tut_params->auth_xform.auth.key.data = auth_key;\n \tut_params->auth_xform.auth.digest_length = reference->digest.len;\n+\tut_params->auth_xform.next = NULL;\n \n \t/* Create Crypto session*/\n \tut_params->sess = rte_cryptodev_sym_session_create(\n \t\t\tts_params->session_mpool);\n \n-\trte_cryptodev_sym_session_init(dev_id, ut_params->sess,\n-\t\t\t\t&ut_params->auth_xform,\n+\trte_cryptodev_sym_session_init(ts_params->valid_devs[0],\n+\t\t\t\tut_params->sess,\n+\t\t\t\t&ut_params->cipher_xform,\n \t\t\t\tts_params->session_priv_mpool);\n \n \tTEST_ASSERT_NOT_NULL(ut_params->sess, \"Session creation failed\");\n \n-\treturn 0;\n-}\n+\tut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);\n+\tTEST_ASSERT_NOT_NULL(ut_params->ibuf,\n+\t\t\t\"Failed to allocate input buffer in mempool\");\n \n-static int\n-create_auth_cipher_session(struct crypto_unittest_params *ut_params,\n-\t\tuint8_t dev_id,\n-\t\tconst struct test_crypto_vector *reference,\n-\t\tenum rte_crypto_auth_operation auth_op,\n-\t\tenum rte_crypto_cipher_operation cipher_op)\n-{\n-\tstruct crypto_testsuite_params *ts_params = &testsuite_params;\n-\tuint8_t cipher_key[reference->cipher_key.len + 1];\n-\tuint8_t auth_key[reference->auth_key.len + 1];\n+\t/* clear mbuf payload */\n+\tmemset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,\n+\t\t\trte_pktmbuf_tailroom(ut_params->ibuf));\n \n-\tmemcpy(cipher_key, reference->cipher_key.data,\n-\t\t\treference->cipher_key.len);\n-\tmemcpy(auth_key, reference->auth_key.data, reference->auth_key.len);\n+\tplaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,\n+\t\t\treference->plaintext.len);\n+\tTEST_ASSERT_NOT_NULL(plaintext, \"no room to append plaintext\");\n+\tmemcpy(plaintext, reference->plaintext.data, reference->plaintext.len);\n \n-\t/* Setup Authentication Parameters */\n-\tut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;\n-\tut_params->auth_xform.auth.op = auth_op;\n-\tut_params->auth_xform.auth.algo = reference->auth_algo;\n-\tut_params->auth_xform.auth.key.length = reference->auth_key.len;\n-\tut_params->auth_xform.auth.key.data = auth_key;\n-\tut_params->auth_xform.auth.digest_length = reference->digest.len;\n+\t/* Create operation */\n+\tretval = create_cipher_auth_operation(ts_params,\n+\t\t\tut_params,\n+\t\t\treference, 0);\n \n-\tif (reference->auth_algo == RTE_CRYPTO_AUTH_AES_GMAC) {\n-\t\tut_params->auth_xform.auth.iv.offset = IV_OFFSET;\n-\t\tut_params->auth_xform.auth.iv.length = reference->iv.len;\n-\t} else {\n-\t\tut_params->auth_xform.next = &ut_params->cipher_xform;\n-\n-\t\t/* Setup Cipher Parameters */\n-\t\tut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER;\n-\t\tut_params->cipher_xform.next = NULL;\n-\t\tut_params->cipher_xform.cipher.algo = reference->crypto_algo;\n-\t\tut_params->cipher_xform.cipher.op = cipher_op;\n-\t\tut_params->cipher_xform.cipher.key.data = cipher_key;\n-\t\tut_params->cipher_xform.cipher.key.length = reference->cipher_key.len;\n-\t\tut_params->cipher_xform.cipher.iv.offset = IV_OFFSET;\n-\t\tut_params->cipher_xform.cipher.iv.length = reference->iv.len;\n-\t}\n-\n-\t/* Create Crypto session*/\n-\tut_params->sess = rte_cryptodev_sym_session_create(\n-\t\t\tts_params->session_mpool);\n+\tif (retval < 0)\n+\t\treturn retval;\n \n-\trte_cryptodev_sym_session_init(dev_id, ut_params->sess,\n-\t\t\t\t&ut_params->auth_xform,\n-\t\t\t\tts_params->session_priv_mpool);\n+\tut_params->op = process_crypto_request(ts_params->valid_devs[0],\n+\t\t\tut_params->op);\n \n-\tTEST_ASSERT_NOT_NULL(ut_params->sess, \"Session creation failed\");\n+\tTEST_ASSERT_NOT_NULL(ut_params->op, \"no crypto operation returned\");\n \n-\treturn 0;\n-}\n+\tTEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,\n+\t\t\t\"crypto op processing failed\");\n \n-static int\n-create_auth_operation(struct crypto_testsuite_params *ts_params,\n-\t\tstruct crypto_unittest_params *ut_params,\n-\t\tconst struct test_crypto_vector *reference,\n-\t\tunsigned int auth_generate)\n-{\n-\t/* Generate Crypto op data structure */\n-\tut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,\n-\t\t\tRTE_CRYPTO_OP_TYPE_SYMMETRIC);\n-\tTEST_ASSERT_NOT_NULL(ut_params->op,\n-\t\t\t\"Failed to allocate pktmbuf offload\");\n+\tplaintext_pad_len = RTE_ALIGN_CEIL(reference->plaintext.len, 16);\n \n-\t/* Set crypto operation data parameters */\n-\trte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);\n+\tauthciphertext = rte_pktmbuf_mtod_offset(ut_params->ibuf, uint8_t *,\n+\t\t\tut_params->op->sym->auth.data.offset);\n+\tauth_tag = authciphertext + plaintext_pad_len;\n+\tdebug_hexdump(stdout, \"ciphertext:\", authciphertext,\n+\t\t\treference->ciphertext.len);\n+\tdebug_hexdump(stdout, \"auth tag:\", auth_tag, reference->digest.len);\n \n-\tstruct rte_crypto_sym_op *sym_op = ut_params->op->sym;\n+\t/* Validate obuf */\n+\tTEST_ASSERT_BUFFERS_ARE_EQUAL(\n+\t\t\tauthciphertext,\n+\t\t\treference->ciphertext.data,\n+\t\t\treference->ciphertext.len,\n+\t\t\t\"Ciphertext data not as expected\");\n \n-\t/* set crypto operation source mbuf */\n-\tsym_op->m_src = ut_params->ibuf;\n+\tTEST_ASSERT_BUFFERS_ARE_EQUAL(\n+\t\t\tauth_tag,\n+\t\t\treference->digest.data,\n+\t\t\treference->digest.len,\n+\t\t\t\"Generated digest not as expected\");\n \n-\t/* digest */\n-\tsym_op->auth.digest.data = (uint8_t *)rte_pktmbuf_append(\n-\t\t\tut_params->ibuf, reference->digest.len);\n+\treturn TEST_SUCCESS;\n \n-\tTEST_ASSERT_NOT_NULL(sym_op->auth.digest.data,\n-\t\t\t\"no room to append auth tag\");\n+}\n \n-\tsym_op->auth.digest.phys_addr = rte_pktmbuf_iova_offset(\n-\t\t\tut_params->ibuf, reference->plaintext.len);\n+static int\n+test_authenticated_decrypt_with_esn(\n+\t\tstruct crypto_testsuite_params *ts_params,\n+\t\tstruct crypto_unittest_params *ut_params,\n+\t\tconst struct test_crypto_vector *reference)\n+{\n+\tint retval;\n \n-\tif (auth_generate)\n-\t\tmemset(sym_op->auth.digest.data, 0, reference->digest.len);\n-\telse\n-\t\tmemcpy(sym_op->auth.digest.data,\n-\t\t\t\treference->digest.data,\n-\t\t\t\treference->digest.len);\n+\tuint8_t *ciphertext;\n+\tuint8_t cipher_key[reference->cipher_key.len + 1];\n+\tuint8_t auth_key[reference->auth_key.len + 1];\n \n-\tdebug_hexdump(stdout, \"digest:\",\n-\t\t\tsym_op->auth.digest.data,\n-\t\t\treference->digest.len);\n+\t/* Verify the capabilities */\n+\tstruct rte_cryptodev_sym_capability_idx cap_idx;\n+\tcap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;\n+\tcap_idx.algo.auth = reference->auth_algo;\n+\tif (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],\n+\t\t\t&cap_idx) == NULL)\n+\t\treturn -ENOTSUP;\n+\tcap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;\n+\tcap_idx.algo.cipher = reference->crypto_algo;\n+\tif (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],\n+\t\t\t&cap_idx) == NULL)\n+\t\treturn -ENOTSUP;\n \n-\tsym_op->auth.data.length = reference->plaintext.len;\n-\tsym_op->auth.data.offset = 0;\n+\t/* Create session */\n+\tmemcpy(cipher_key, reference->cipher_key.data,\n+\t\t\treference->cipher_key.len);\n+\tmemcpy(auth_key, reference->auth_key.data, reference->auth_key.len);\n \n-\treturn 0;\n-}\n+\t/* Setup Authentication Parameters */\n+\tut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;\n+\tut_params->auth_xform.auth.op = RTE_CRYPTO_AUTH_OP_VERIFY;\n+\tut_params->auth_xform.auth.algo = reference->auth_algo;\n+\tut_params->auth_xform.auth.key.length = reference->auth_key.len;\n+\tut_params->auth_xform.auth.key.data = auth_key;\n+\tut_params->auth_xform.auth.digest_length = reference->digest.len;\n+\tut_params->auth_xform.next = &ut_params->cipher_xform;\n \n-static int\n-create_auth_GMAC_operation(struct crypto_testsuite_params *ts_params,\n-\t\tstruct crypto_unittest_params *ut_params,\n-\t\tconst struct test_crypto_vector *reference,\n-\t\tunsigned int auth_generate)\n-{\n-\t/* Generate Crypto op data structure */\n-\tut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,\n-\t\t\tRTE_CRYPTO_OP_TYPE_SYMMETRIC);\n-\tTEST_ASSERT_NOT_NULL(ut_params->op,\n-\t\t\t\"Failed to allocate pktmbuf offload\");\n+\t/* Setup Cipher Parameters */\n+\tut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER;\n+\tut_params->cipher_xform.next = NULL;\n+\tut_params->cipher_xform.cipher.algo = reference->crypto_algo;\n+\tut_params->cipher_xform.cipher.op = RTE_CRYPTO_CIPHER_OP_DECRYPT;\n+\tut_params->cipher_xform.cipher.key.data = cipher_key;\n+\tut_params->cipher_xform.cipher.key.length = reference->cipher_key.len;\n+\tut_params->cipher_xform.cipher.iv.offset = IV_OFFSET;\n+\tut_params->cipher_xform.cipher.iv.length = reference->iv.len;\n \n-\t/* Set crypto operation data parameters */\n-\trte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);\n+\t/* Create Crypto session*/\n+\tut_params->sess = rte_cryptodev_sym_session_create(\n+\t\t\tts_params->session_mpool);\n \n-\tstruct rte_crypto_sym_op *sym_op = ut_params->op->sym;\n+\trte_cryptodev_sym_session_init(ts_params->valid_devs[0],\n+\t\t\t\tut_params->sess,\n+\t\t\t\t&ut_params->auth_xform,\n+\t\t\t\tts_params->session_priv_mpool);\n \n-\t/* set crypto operation source mbuf */\n-\tsym_op->m_src = ut_params->ibuf;\n+\tTEST_ASSERT_NOT_NULL(ut_params->sess, \"Session creation failed\");\n \n-\t/* digest */\n-\tsym_op->auth.digest.data = (uint8_t *)rte_pktmbuf_append(\n-\t\t\tut_params->ibuf, reference->digest.len);\n+\tut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);\n+\tTEST_ASSERT_NOT_NULL(ut_params->ibuf,\n+\t\t\t\"Failed to allocate input buffer in mempool\");\n \n-\tTEST_ASSERT_NOT_NULL(sym_op->auth.digest.data,\n-\t\t\t\"no room to append auth tag\");\n+\t/* clear mbuf payload */\n+\tmemset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,\n+\t\t\trte_pktmbuf_tailroom(ut_params->ibuf));\n \n-\tsym_op->auth.digest.phys_addr = rte_pktmbuf_iova_offset(\n-\t\t\tut_params->ibuf, reference->ciphertext.len);\n+\tciphertext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,\n+\t\t\treference->ciphertext.len);\n+\tTEST_ASSERT_NOT_NULL(ciphertext, \"no room to append ciphertext\");\n+\tmemcpy(ciphertext, reference->ciphertext.data,\n+\t\t\treference->ciphertext.len);\n \n-\tif (auth_generate)\n-\t\tmemset(sym_op->auth.digest.data, 0, reference->digest.len);\n-\telse\n-\t\tmemcpy(sym_op->auth.digest.data,\n-\t\t\t\treference->digest.data,\n-\t\t\t\treference->digest.len);\n+\t/* Create operation */\n+\tretval = create_cipher_auth_verify_operation(ts_params,\n+\t\t\tut_params,\n+\t\t\treference);\n \n-\tdebug_hexdump(stdout, \"digest:\",\n-\t\t\tsym_op->auth.digest.data,\n-\t\t\treference->digest.len);\n+\tif (retval < 0)\n+\t\treturn retval;\n \n-\trte_memcpy(rte_crypto_op_ctod_offset(ut_params->op, uint8_t *, IV_OFFSET),\n-\t\t\treference->iv.data, reference->iv.len);\n+\tut_params->op = process_crypto_request(ts_params->valid_devs[0],\n+\t\t\tut_params->op);\n \n-\tsym_op->cipher.data.length = 0;\n-\tsym_op->cipher.data.offset = 0;\n+\tTEST_ASSERT_NOT_NULL(ut_params->op, \"failed crypto process\");\n+\tTEST_ASSERT_EQUAL(ut_params->op->status,\n+\t\t\tRTE_CRYPTO_OP_STATUS_SUCCESS,\n+\t\t\t\"crypto op processing passed\");\n \n-\tsym_op->auth.data.length = reference->plaintext.len;\n-\tsym_op->auth.data.offset = 0;\n+\tut_params->obuf = ut_params->op->sym->m_src;\n+\tTEST_ASSERT_NOT_NULL(ut_params->obuf, \"failed to retrieve obuf\");\n \n \treturn 0;\n }\n \n static int\n-create_cipher_auth_operation(struct crypto_testsuite_params *ts_params,\n-\t\tstruct crypto_unittest_params *ut_params,\n-\t\tconst struct test_crypto_vector *reference,\n-\t\tunsigned int auth_generate)\n+create_aead_operation_SGL(enum rte_crypto_aead_operation op,\n+\t\tconst struct aead_test_data *tdata,\n+\t\tvoid *digest_mem, uint64_t digest_phys)\n {\n+\tstruct crypto_testsuite_params *ts_params = &testsuite_params;\n+\tstruct crypto_unittest_params *ut_params = &unittest_params;\n+\n+\tconst unsigned int auth_tag_len = tdata->auth_tag.len;\n+\tconst unsigned int iv_len = tdata->iv.len;\n+\tunsigned int aad_len = tdata->aad.len;\n+\n \t/* Generate Crypto op data structure */\n \tut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,\n \t\t\tRTE_CRYPTO_OP_TYPE_SYMMETRIC);\n \tTEST_ASSERT_NOT_NULL(ut_params->op,\n-\t\t\t\"Failed to allocate pktmbuf offload\");\n-\n-\t/* Set crypto operation data parameters */\n-\trte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);\n+\t\t\"Failed to allocate symmetric crypto operation struct\");\n \n \tstruct rte_crypto_sym_op *sym_op = ut_params->op->sym;\n \n-\t/* set crypto operation source mbuf */\n-\tsym_op->m_src = ut_params->ibuf;\n+\tsym_op->aead.digest.data = digest_mem;\n \n-\t/* digest */\n-\tsym_op->auth.digest.data = (uint8_t *)rte_pktmbuf_append(\n-\t\t\tut_params->ibuf, reference->digest.len);\n+\tTEST_ASSERT_NOT_NULL(sym_op->aead.digest.data,\n+\t\t\t\"no room to append digest\");\n \n-\tTEST_ASSERT_NOT_NULL(sym_op->auth.digest.data,\n-\t\t\t\"no room to append auth tag\");\n+\tsym_op->aead.digest.phys_addr = digest_phys;\n \n-\tsym_op->auth.digest.phys_addr = rte_pktmbuf_iova_offset(\n-\t\t\tut_params->ibuf, reference->ciphertext.len);\n+\tif (op == RTE_CRYPTO_AEAD_OP_DECRYPT) {\n+\t\trte_memcpy(sym_op->aead.digest.data, tdata->auth_tag.data,\n+\t\t\t\tauth_tag_len);\n+\t\tdebug_hexdump(stdout, \"digest:\",\n+\t\t\t\tsym_op->aead.digest.data,\n+\t\t\t\tauth_tag_len);\n+\t}\n \n-\tif (auth_generate)\n-\t\tmemset(sym_op->auth.digest.data, 0, reference->digest.len);\n-\telse\n-\t\tmemcpy(sym_op->auth.digest.data,\n-\t\t\t\treference->digest.data,\n-\t\t\t\treference->digest.len);\n+\t/* Append aad data */\n+\tif (tdata->algo == RTE_CRYPTO_AEAD_AES_CCM) {\n+\t\tuint8_t *iv_ptr = rte_crypto_op_ctod_offset(ut_params->op,\n+\t\t\t\tuint8_t *, IV_OFFSET);\n \n-\tdebug_hexdump(stdout, \"digest:\",\n-\t\t\tsym_op->auth.digest.data,\n-\t\t\treference->digest.len);\n+\t\t/* Copy IV 1 byte after the IV pointer, according to the API */\n+\t\trte_memcpy(iv_ptr + 1, tdata->iv.data, iv_len);\n \n-\trte_memcpy(rte_crypto_op_ctod_offset(ut_params->op, uint8_t *, IV_OFFSET),\n-\t\t\treference->iv.data, reference->iv.len);\n+\t\taad_len = RTE_ALIGN_CEIL(aad_len + 18, 16);\n \n-\tsym_op->cipher.data.length = reference->cipher_len;\n-\tsym_op->cipher.data.offset = reference->cipher_offset;\n+\t\tsym_op->aead.aad.data = (uint8_t *)rte_pktmbuf_prepend(\n+\t\t\t\tut_params->ibuf, aad_len);\n+\t\tTEST_ASSERT_NOT_NULL(sym_op->aead.aad.data,\n+\t\t\t\t\"no room to prepend aad\");\n+\t\tsym_op->aead.aad.phys_addr = rte_pktmbuf_iova(\n+\t\t\t\tut_params->ibuf);\n \n-\tsym_op->auth.data.length = reference->plaintext.len;\n-\tsym_op->auth.data.offset = reference->auth_offset;\n+\t\tmemset(sym_op->aead.aad.data, 0, aad_len);\n+\t\t/* Copy AAD 18 bytes after the AAD ptr, according to the API */\n+\t\trte_memcpy(sym_op->aead.aad.data, tdata->aad.data, aad_len);\n \n-\treturn 0;\n-}\n+\t\tdebug_hexdump(stdout, \"iv:\", iv_ptr, iv_len);\n+\t\tdebug_hexdump(stdout, \"aad:\",\n+\t\t\t\tsym_op->aead.aad.data, aad_len);\n+\t} else {\n+\t\tuint8_t *iv_ptr = rte_crypto_op_ctod_offset(ut_params->op,\n+\t\t\t\tuint8_t *, IV_OFFSET);\n \n-static int\n-create_auth_verify_operation(struct crypto_testsuite_params *ts_params,\n-\t\tstruct crypto_unittest_params *ut_params,\n-\t\tconst struct test_crypto_vector *reference)\n-{\n-\treturn create_auth_operation(ts_params, ut_params, reference, 0);\n-}\n+\t\trte_memcpy(iv_ptr, tdata->iv.data, iv_len);\n \n-static int\n-create_auth_verify_GMAC_operation(\n-\t\tstruct crypto_testsuite_params *ts_params,\n-\t\tstruct crypto_unittest_params *ut_params,\n-\t\tconst struct test_crypto_vector *reference)\n-{\n-\treturn create_auth_GMAC_operation(ts_params, ut_params, reference, 0);\n-}\n+\t\tsym_op->aead.aad.data = (uint8_t *)rte_pktmbuf_prepend(\n+\t\t\t\tut_params->ibuf, aad_len);\n+\t\tTEST_ASSERT_NOT_NULL(sym_op->aead.aad.data,\n+\t\t\t\t\"no room to prepend aad\");\n+\t\tsym_op->aead.aad.phys_addr = rte_pktmbuf_iova(\n+\t\t\t\tut_params->ibuf);\n \n-static int\n-create_cipher_auth_verify_operation(struct crypto_testsuite_params *ts_params,\n-\t\tstruct crypto_unittest_params *ut_params,\n-\t\tconst struct test_crypto_vector *reference)\n-{\n-\treturn create_cipher_auth_operation(ts_params, ut_params, reference, 0);\n-}\n+\t\tmemset(sym_op->aead.aad.data, 0, aad_len);\n+\t\trte_memcpy(sym_op->aead.aad.data, tdata->aad.data, aad_len);\n \n-static int\n-test_authentication_verify_fail_when_data_corruption(\n-\t\tstruct crypto_testsuite_params *ts_params,\n-\t\tstruct crypto_unittest_params *ut_params,\n-\t\tconst struct test_crypto_vector *reference,\n-\t\tunsigned int data_corrupted)\n-{\n-\tint retval;\n+\t\tdebug_hexdump(stdout, \"iv:\", iv_ptr, iv_len);\n+\t\tdebug_hexdump(stdout, \"aad:\",\n+\t\t\t\tsym_op->aead.aad.data, aad_len);\n+\t}\n \n-\tuint8_t *plaintext;\n+\tsym_op->aead.data.length = tdata->plaintext.len;\n+\tsym_op->aead.data.offset = aad_len;\n \n-\t/* Create session */\n-\tretval = create_auth_session(ut_params,\n-\t\t\tts_params->valid_devs[0],\n-\t\t\treference,\n-\t\t\tRTE_CRYPTO_AUTH_OP_VERIFY);\n-\tif (retval < 0)\n-\t\treturn retval;\n+\treturn 0;\n+}\n \n-\tut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);\n-\tTEST_ASSERT_NOT_NULL(ut_params->ibuf,\n-\t\t\t\"Failed to allocate input buffer in mempool\");\n+#define SGL_MAX_NO\t16\n \n-\t/* clear mbuf payload */\n-\tmemset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,\n-\t\t\trte_pktmbuf_tailroom(ut_params->ibuf));\n+static int\n+test_authenticated_encryption_SGL(const struct aead_test_data *tdata,\n+\t\tconst int oop, uint32_t fragsz, uint32_t fragsz_oop)\n+{\n+\tstruct crypto_testsuite_params *ts_params = &testsuite_params;\n+\tstruct crypto_unittest_params *ut_params = &unittest_params;\n+\tstruct rte_mbuf *buf, *buf_oop = NULL, *buf_last_oop = NULL;\n+\tint retval;\n+\tint to_trn = 0;\n+\tint to_trn_tbl[SGL_MAX_NO];\n+\tint segs = 1;\n+\tunsigned int trn_data = 0;\n+\tuint8_t *plaintext, *ciphertext, *auth_tag;\n+\tstruct rte_cryptodev_info dev_info;\n \n-\tplaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,\n-\t\t\treference->plaintext.len);\n-\tTEST_ASSERT_NOT_NULL(plaintext, \"no room to append plaintext\");\n-\tmemcpy(plaintext, reference->plaintext.data, reference->plaintext.len);\n+\t/* Verify the capabilities */\n+\tstruct rte_cryptodev_sym_capability_idx cap_idx;\n+\tcap_idx.type = RTE_CRYPTO_SYM_XFORM_AEAD;\n+\tcap_idx.algo.aead = tdata->algo;\n+\tif (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],\n+\t\t\t&cap_idx) == NULL)\n+\t\treturn -ENOTSUP;\n \n-\tdebug_hexdump(stdout, \"plaintext:\", plaintext,\n-\t\treference->plaintext.len);\n+\t/* Detailed check for the particular SGL support flag */\n+\trte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);\n+\tif (!oop) {\n+\t\tunsigned int sgl_in = fragsz < tdata->plaintext.len;\n+\t\tif (sgl_in && (!(dev_info.feature_flags &\n+\t\t\t\tRTE_CRYPTODEV_FF_IN_PLACE_SGL)))\n+\t\t\treturn -ENOTSUP;\n+\t} else {\n+\t\tunsigned int sgl_in = fragsz < tdata->plaintext.len;\n+\t\tunsigned int sgl_out = (fragsz_oop ? fragsz_oop : fragsz) <\n+\t\t\t\ttdata->plaintext.len;\n+\t\tif (sgl_in && !sgl_out) {\n+\t\t\tif (!(dev_info.feature_flags &\n+\t\t\t\t\tRTE_CRYPTODEV_FF_OOP_SGL_IN_LB_OUT))\n+\t\t\t\treturn -ENOTSUP;\n+\t\t} else if (!sgl_in && sgl_out) {\n+\t\t\tif (!(dev_info.feature_flags &\n+\t\t\t\t\tRTE_CRYPTODEV_FF_OOP_LB_IN_SGL_OUT))\n+\t\t\t\treturn -ENOTSUP;\n+\t\t} else if (sgl_in && sgl_out) {\n+\t\t\tif (!(dev_info.feature_flags &\n+\t\t\t\t\tRTE_CRYPTODEV_FF_OOP_SGL_IN_SGL_OUT))\n+\t\t\t\treturn -ENOTSUP;\n+\t\t}\n+\t}\n \n-\t/* Create operation */\n-\tretval = create_auth_verify_operation(ts_params, ut_params, reference);\n+\tif (fragsz > tdata->plaintext.len)\n+\t\tfragsz = tdata->plaintext.len;\n \n-\tif (retval < 0)\n-\t\treturn retval;\n+\tuint16_t plaintext_len = fragsz;\n+\tuint16_t frag_size_oop = fragsz_oop ? fragsz_oop : fragsz;\n \n-\tif (data_corrupted)\n-\t\tdata_corruption(plaintext);\n-\telse\n-\t\ttag_corruption(plaintext, reference->plaintext.len);\n+\tif (fragsz_oop > tdata->plaintext.len)\n+\t\tfrag_size_oop = tdata->plaintext.len;\n \n-\tut_params->op = process_crypto_request(ts_params->valid_devs[0],\n-\t\t\tut_params->op);\n-\tTEST_ASSERT_NOT_NULL(ut_params->op, \"failed crypto process\");\n-\tTEST_ASSERT_NOT_EQUAL(ut_params->op->status,\n-\t\t\tRTE_CRYPTO_OP_STATUS_SUCCESS,\n-\t\t\t\"authentication not failed\");\n+\tint ecx = 0;\n+\tvoid *digest_mem = NULL;\n \n-\tut_params->obuf = ut_params->op->sym->m_src;\n-\tTEST_ASSERT_NOT_NULL(ut_params->obuf, \"failed to retrieve obuf\");\n+\tuint32_t prepend_len = tdata->aad.len;\n \n-\treturn 0;\n-}\n+\tif (tdata->plaintext.len % fragsz != 0) {\n+\t\tif (tdata->plaintext.len / fragsz + 1 > SGL_MAX_NO)\n+\t\t\treturn 1;\n+\t}\telse {\n+\t\tif (tdata->plaintext.len / fragsz > SGL_MAX_NO)\n+\t\t\treturn 1;\n+\t}\n \n-static int\n-test_authentication_verify_GMAC_fail_when_corruption(\n-\t\tstruct crypto_testsuite_params *ts_params,\n-\t\tstruct crypto_unittest_params *ut_params,\n-\t\tconst struct test_crypto_vector *reference,\n-\t\tunsigned int data_corrupted)\n-{\n-\tint retval;\n-\tuint8_t *plaintext;\n+\t/*\n+\t * For out-op-place we need to alloc another mbuf\n+\t */\n+\tif (oop) {\n+\t\tut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);\n+\t\trte_pktmbuf_append(ut_params->obuf,\n+\t\t\t\tfrag_size_oop + prepend_len);\n+\t\tbuf_oop = ut_params->obuf;\n+\t}\n \n-\t/* Create session */\n-\tretval = create_auth_cipher_session(ut_params,\n-\t\t\tts_params->valid_devs[0],\n-\t\t\treference,\n-\t\t\tRTE_CRYPTO_AUTH_OP_VERIFY,\n-\t\t\tRTE_CRYPTO_CIPHER_OP_DECRYPT);\n+\t/* Create AEAD session */\n+\tretval = create_aead_session(ts_params->valid_devs[0],\n+\t\t\ttdata->algo,\n+\t\t\tRTE_CRYPTO_AEAD_OP_ENCRYPT,\n+\t\t\ttdata->key.data, tdata->key.len,\n+\t\t\ttdata->aad.len, tdata->auth_tag.len,\n+\t\t\ttdata->iv.len);\n \tif (retval < 0)\n \t\treturn retval;\n \n \tut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);\n-\tTEST_ASSERT_NOT_NULL(ut_params->ibuf,\n-\t\t\t\"Failed to allocate input buffer in mempool\");\n \n \t/* clear mbuf payload */\n \tmemset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,\n \t\t\trte_pktmbuf_tailroom(ut_params->ibuf));\n \n \tplaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,\n-\t\t\treference->plaintext.len);\n-\tTEST_ASSERT_NOT_NULL(plaintext, \"no room to append plaintext\");\n-\tmemcpy(plaintext, reference->plaintext.data, reference->plaintext.len);\n-\n-\tdebug_hexdump(stdout, \"plaintext:\", plaintext,\n-\t\treference->plaintext.len);\n-\n-\t/* Create operation */\n-\tretval = create_auth_verify_GMAC_operation(ts_params,\n-\t\t\tut_params,\n-\t\t\treference);\n+\t\t\tplaintext_len);\n \n-\tif (retval < 0)\n-\t\treturn retval;\n+\tmemcpy(plaintext, tdata->plaintext.data, plaintext_len);\n \n-\tif (data_corrupted)\n-\t\tdata_corruption(plaintext);\n-\telse\n-\t\ttag_corruption(plaintext, reference->aad.len);\n+\ttrn_data += plaintext_len;\n \n-\tut_params->op = process_crypto_request(ts_params->valid_devs[0],\n-\t\t\tut_params->op);\n-\tTEST_ASSERT_NOT_NULL(ut_params->op, \"failed crypto process\");\n-\tTEST_ASSERT_NOT_EQUAL(ut_params->op->status,\n-\t\t\tRTE_CRYPTO_OP_STATUS_SUCCESS,\n-\t\t\t\"authentication not failed\");\n+\tbuf = ut_params->ibuf;\n \n-\tut_params->obuf = ut_params->op->sym->m_src;\n-\tTEST_ASSERT_NOT_NULL(ut_params->obuf, \"failed to retrieve obuf\");\n+\t/*\n+\t * Loop until no more fragments\n+\t */\n \n-\treturn 0;\n-}\n+\twhile (trn_data < tdata->plaintext.len) {\n+\t\t++segs;\n+\t\tto_trn = (tdata->plaintext.len - trn_data < fragsz) ?\n+\t\t\t\t(tdata->plaintext.len - trn_data) : fragsz;\n \n-static int\n-test_authenticated_decryption_fail_when_corruption(\n-\t\tstruct crypto_testsuite_params *ts_params,\n-\t\tstruct crypto_unittest_params *ut_params,\n-\t\tconst struct test_crypto_vector *reference,\n-\t\tunsigned int data_corrupted)\n-{\n-\tint retval;\n+\t\tto_trn_tbl[ecx++] = to_trn;\n \n-\tuint8_t *ciphertext;\n+\t\tbuf->next = rte_pktmbuf_alloc(ts_params->mbuf_pool);\n+\t\tbuf = buf->next;\n \n-\t/* Create session */\n-\tretval = create_auth_cipher_session(ut_params,\n-\t\t\tts_params->valid_devs[0],\n-\t\t\treference,\n-\t\t\tRTE_CRYPTO_AUTH_OP_VERIFY,\n-\t\t\tRTE_CRYPTO_CIPHER_OP_DECRYPT);\n-\tif (retval < 0)\n-\t\treturn retval;\n+\t\tmemset(rte_pktmbuf_mtod(buf, uint8_t *), 0,\n+\t\t\t\trte_pktmbuf_tailroom(buf));\n \n-\tut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);\n-\tTEST_ASSERT_NOT_NULL(ut_params->ibuf,\n-\t\t\t\"Failed to allocate input buffer in mempool\");\n+\t\t/* OOP */\n+\t\tif (oop && !fragsz_oop) {\n+\t\t\tbuf_last_oop = buf_oop->next =\n+\t\t\t\t\trte_pktmbuf_alloc(ts_params->mbuf_pool);\n+\t\t\tbuf_oop = buf_oop->next;\n+\t\t\tmemset(rte_pktmbuf_mtod(buf_oop, uint8_t *),\n+\t\t\t\t\t0, rte_pktmbuf_tailroom(buf_oop));\n+\t\t\trte_pktmbuf_append(buf_oop, to_trn);\n+\t\t}\n \n-\t/* clear mbuf payload */\n-\tmemset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,\n-\t\t\trte_pktmbuf_tailroom(ut_params->ibuf));\n+\t\tplaintext = (uint8_t *)rte_pktmbuf_append(buf,\n+\t\t\t\tto_trn);\n \n-\tciphertext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,\n-\t\t\treference->ciphertext.len);\n-\tTEST_ASSERT_NOT_NULL(ciphertext, \"no room to append ciphertext\");\n-\tmemcpy(ciphertext, reference->ciphertext.data,\n-\t\t\treference->ciphertext.len);\n-\n-\t/* Create operation */\n-\tretval = create_cipher_auth_verify_operation(ts_params,\n-\t\t\tut_params,\n-\t\t\treference);\n-\n-\tif (retval < 0)\n-\t\treturn retval;\n-\n-\tif (data_corrupted)\n-\t\tdata_corruption(ciphertext);\n-\telse\n-\t\ttag_corruption(ciphertext, reference->ciphertext.len);\n-\n-\tut_params->op = process_crypto_request(ts_params->valid_devs[0],\n-\t\t\tut_params->op);\n-\n-\tTEST_ASSERT_NOT_NULL(ut_params->op, \"failed crypto process\");\n-\tTEST_ASSERT_NOT_EQUAL(ut_params->op->status,\n-\t\t\tRTE_CRYPTO_OP_STATUS_SUCCESS,\n-\t\t\t\"authentication not failed\");\n-\n-\tut_params->obuf = ut_params->op->sym->m_src;\n-\tTEST_ASSERT_NOT_NULL(ut_params->obuf, \"failed to retrieve obuf\");\n+\t\tmemcpy(plaintext, tdata->plaintext.data + trn_data,\n+\t\t\t\tto_trn);\n+\t\ttrn_data += to_trn;\n+\t\tif (trn_data  == tdata->plaintext.len) {\n+\t\t\tif (oop) {\n+\t\t\t\tif (!fragsz_oop)\n+\t\t\t\t\tdigest_mem = rte_pktmbuf_append(buf_oop,\n+\t\t\t\t\t\ttdata->auth_tag.len);\n+\t\t\t} else\n+\t\t\t\tdigest_mem = (uint8_t *)rte_pktmbuf_append(buf,\n+\t\t\t\t\ttdata->auth_tag.len);\n+\t\t}\n+\t}\n \n-\treturn 0;\n-}\n+\tuint64_t digest_phys = 0;\n \n-static int\n-test_authenticated_encryt_with_esn(\n-\t\tstruct crypto_testsuite_params *ts_params,\n-\t\tstruct crypto_unittest_params *ut_params,\n-\t\tconst struct test_crypto_vector *reference)\n-{\n-\tint retval;\n+\tut_params->ibuf->nb_segs = segs;\n \n-\tuint8_t *authciphertext, *plaintext, *auth_tag;\n-\tuint16_t plaintext_pad_len;\n-\tuint8_t cipher_key[reference->cipher_key.len + 1];\n-\tuint8_t auth_key[reference->auth_key.len + 1];\n+\tsegs = 1;\n+\tif (fragsz_oop && oop) {\n+\t\tto_trn = 0;\n+\t\tecx = 0;\n \n-\t/* Create session */\n-\tmemcpy(cipher_key, reference->cipher_key.data,\n-\t\t\treference->cipher_key.len);\n-\tmemcpy(auth_key, reference->auth_key.data, reference->auth_key.len);\n+\t\tif (frag_size_oop == tdata->plaintext.len) {\n+\t\t\tdigest_mem = rte_pktmbuf_append(ut_params->obuf,\n+\t\t\t\ttdata->auth_tag.len);\n \n-\t/* Setup Cipher Parameters */\n-\tut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER;\n-\tut_params->cipher_xform.cipher.algo = reference->crypto_algo;\n-\tut_params->cipher_xform.cipher.op = RTE_CRYPTO_CIPHER_OP_ENCRYPT;\n-\tut_params->cipher_xform.cipher.key.data = cipher_key;\n-\tut_params->cipher_xform.cipher.key.length = reference->cipher_key.len;\n-\tut_params->cipher_xform.cipher.iv.offset = IV_OFFSET;\n-\tut_params->cipher_xform.cipher.iv.length = reference->iv.len;\n+\t\t\tdigest_phys = rte_pktmbuf_iova_offset(\n+\t\t\t\t\tut_params->obuf,\n+\t\t\t\t\ttdata->plaintext.len + prepend_len);\n+\t\t}\n \n-\tut_params->cipher_xform.next = &ut_params->auth_xform;\n+\t\ttrn_data = frag_size_oop;\n+\t\twhile (trn_data < tdata->plaintext.len) {\n+\t\t\t++segs;\n+\t\t\tto_trn =\n+\t\t\t\t(tdata->plaintext.len - trn_data <\n+\t\t\t\t\t\tfrag_size_oop) ?\n+\t\t\t\t(tdata->plaintext.len - trn_data) :\n+\t\t\t\t\t\tfrag_size_oop;\n \n-\t/* Setup Authentication Parameters */\n-\tut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;\n-\tut_params->auth_xform.auth.op = RTE_CRYPTO_AUTH_OP_GENERATE;\n-\tut_params->auth_xform.auth.algo = reference->auth_algo;\n-\tut_params->auth_xform.auth.key.length = reference->auth_key.len;\n-\tut_params->auth_xform.auth.key.data = auth_key;\n-\tut_params->auth_xform.auth.digest_length = reference->digest.len;\n-\tut_params->auth_xform.next = NULL;\n+\t\t\tto_trn_tbl[ecx++] = to_trn;\n \n-\t/* Create Crypto session*/\n-\tut_params->sess = rte_cryptodev_sym_session_create(\n-\t\t\tts_params->session_mpool);\n+\t\t\tbuf_last_oop = buf_oop->next =\n+\t\t\t\t\trte_pktmbuf_alloc(ts_params->mbuf_pool);\n+\t\t\tbuf_oop = buf_oop->next;\n+\t\t\tmemset(rte_pktmbuf_mtod(buf_oop, uint8_t *),\n+\t\t\t\t\t0, rte_pktmbuf_tailroom(buf_oop));\n+\t\t\trte_pktmbuf_append(buf_oop, to_trn);\n \n-\trte_cryptodev_sym_session_init(ts_params->valid_devs[0],\n-\t\t\t\tut_params->sess,\n-\t\t\t\t&ut_params->cipher_xform,\n-\t\t\t\tts_params->session_priv_mpool);\n+\t\t\ttrn_data += to_trn;\n \n-\tTEST_ASSERT_NOT_NULL(ut_params->sess, \"Session creation failed\");\n+\t\t\tif (trn_data  == tdata->plaintext.len) {\n+\t\t\t\tdigest_mem = rte_pktmbuf_append(buf_oop,\n+\t\t\t\t\ttdata->auth_tag.len);\n+\t\t\t}\n+\t\t}\n \n-\tut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);\n-\tTEST_ASSERT_NOT_NULL(ut_params->ibuf,\n-\t\t\t\"Failed to allocate input buffer in mempool\");\n+\t\tut_params->obuf->nb_segs = segs;\n+\t}\n \n-\t/* clear mbuf payload */\n-\tmemset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,\n-\t\t\trte_pktmbuf_tailroom(ut_params->ibuf));\n+\t/*\n+\t * Place digest at the end of the last buffer\n+\t */\n+\tif (!digest_phys)\n+\t\tdigest_phys = rte_pktmbuf_iova(buf) + to_trn;\n+\tif (oop && buf_last_oop)\n+\t\tdigest_phys = rte_pktmbuf_iova(buf_last_oop) + to_trn;\n \n-\tplaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,\n-\t\t\treference->plaintext.len);\n-\tTEST_ASSERT_NOT_NULL(plaintext, \"no room to append plaintext\");\n-\tmemcpy(plaintext, reference->plaintext.data, reference->plaintext.len);\n+\tif (!digest_mem && !oop) {\n+\t\tdigest_mem = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,\n+\t\t\t\t+ tdata->auth_tag.len);\n+\t\tdigest_phys = rte_pktmbuf_iova_offset(ut_params->ibuf,\n+\t\t\t\ttdata->plaintext.len);\n+\t}\n \n-\t/* Create operation */\n-\tretval = create_cipher_auth_operation(ts_params,\n-\t\t\tut_params,\n-\t\t\treference, 0);\n+\t/* Create AEAD operation */\n+\tretval = create_aead_operation_SGL(RTE_CRYPTO_AEAD_OP_ENCRYPT,\n+\t\t\ttdata, digest_mem, digest_phys);\n \n \tif (retval < 0)\n \t\treturn retval;\n \n-\tut_params->op = process_crypto_request(ts_params->valid_devs[0],\n-\t\t\tut_params->op);\n+\trte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);\n \n-\tTEST_ASSERT_NOT_NULL(ut_params->op, \"no crypto operation returned\");\n+\tut_params->op->sym->m_src = ut_params->ibuf;\n+\tif (oop)\n+\t\tut_params->op->sym->m_dst = ut_params->obuf;\n+\n+\t/* Process crypto operation */\n+\tTEST_ASSERT_NOT_NULL(process_crypto_request(ts_params->valid_devs[0],\n+\t\t\tut_params->op), \"failed to process sym crypto op\");\n \n \tTEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,\n \t\t\t\"crypto op processing failed\");\n \n-\tplaintext_pad_len = RTE_ALIGN_CEIL(reference->plaintext.len, 16);\n \n-\tauthciphertext = rte_pktmbuf_mtod_offset(ut_params->ibuf, uint8_t *,\n-\t\t\tut_params->op->sym->auth.data.offset);\n-\tauth_tag = authciphertext + plaintext_pad_len;\n-\tdebug_hexdump(stdout, \"ciphertext:\", authciphertext,\n-\t\t\treference->ciphertext.len);\n-\tdebug_hexdump(stdout, \"auth tag:\", auth_tag, reference->digest.len);\n+\tciphertext = rte_pktmbuf_mtod_offset(ut_params->op->sym->m_src,\n+\t\t\tuint8_t *, prepend_len);\n+\tif (oop) {\n+\t\tciphertext = rte_pktmbuf_mtod_offset(ut_params->op->sym->m_dst,\n+\t\t\t\tuint8_t *, prepend_len);\n+\t}\n+\n+\tif (fragsz_oop)\n+\t\tfragsz = fragsz_oop;\n \n-\t/* Validate obuf */\n \tTEST_ASSERT_BUFFERS_ARE_EQUAL(\n-\t\t\tauthciphertext,\n-\t\t\treference->ciphertext.data,\n-\t\t\treference->ciphertext.len,\n+\t\t\tciphertext,\n+\t\t\ttdata->ciphertext.data,\n+\t\t\tfragsz,\n \t\t\t\"Ciphertext data not as expected\");\n \n+\tbuf = ut_params->op->sym->m_src->next;\n+\tif (oop)\n+\t\tbuf = ut_params->op->sym->m_dst->next;\n+\n+\tunsigned int off = fragsz;\n+\n+\tecx = 0;\n+\twhile (buf) {\n+\t\tciphertext = rte_pktmbuf_mtod(buf,\n+\t\t\t\tuint8_t *);\n+\n+\t\tTEST_ASSERT_BUFFERS_ARE_EQUAL(\n+\t\t\t\tciphertext,\n+\t\t\t\ttdata->ciphertext.data + off,\n+\t\t\t\tto_trn_tbl[ecx],\n+\t\t\t\t\"Ciphertext data not as expected\");\n+\n+\t\toff += to_trn_tbl[ecx++];\n+\t\tbuf = buf->next;\n+\t}\n+\n+\tauth_tag = digest_mem;\n \tTEST_ASSERT_BUFFERS_ARE_EQUAL(\n \t\t\tauth_tag,\n-\t\t\treference->digest.data,\n-\t\t\treference->digest.len,\n-\t\t\t\"Generated digest not as expected\");\n+\t\t\ttdata->auth_tag.data,\n+\t\t\ttdata->auth_tag.len,\n+\t\t\t\"Generated auth tag not as expected\");\n \n-\treturn TEST_SUCCESS;\n+\treturn 0;\n+}\n \n+static int\n+test_AES_GCM_auth_encrypt_SGL_out_of_place_400B_400B(void)\n+{\n+\treturn test_authenticated_encryption_SGL(\n+\t\t\t&gcm_test_case_SGL_1, OUT_OF_PLACE, 400, 400);\n }\n \n static int\n-test_authenticated_decrypt_with_esn(\n-\t\tstruct crypto_testsuite_params *ts_params,\n-\t\tstruct crypto_unittest_params *ut_params,\n-\t\tconst struct test_crypto_vector *reference)\n+test_AES_GCM_auth_encrypt_SGL_out_of_place_1500B_2000B(void)\n {\n-\tint retval;\n+\treturn test_authenticated_encryption_SGL(\n+\t\t\t&gcm_test_case_SGL_1, OUT_OF_PLACE, 1500, 2000);\n+}\n \n-\tuint8_t *ciphertext;\n-\tuint8_t cipher_key[reference->cipher_key.len + 1];\n-\tuint8_t auth_key[reference->auth_key.len + 1];\n+static int\n+test_AES_GCM_auth_encrypt_SGL_out_of_place_400B_1seg(void)\n+{\n+\t/* This test is not for QAT PMD */\n+\tif (gbl_driver_id == rte_cryptodev_driver_id_get(\n+\t\t\tRTE_STR(CRYPTODEV_NAME_QAT_SYM_PMD)))\n+\t\treturn -ENOTSUP;\n \n-\t/* Create session */\n-\tmemcpy(cipher_key, reference->cipher_key.data,\n-\t\t\treference->cipher_key.len);\n-\tmemcpy(auth_key, reference->auth_key.data, reference->auth_key.len);\n+\treturn test_authenticated_encryption_SGL(\n+\t\t\t&gcm_test_case_8, OUT_OF_PLACE, 400,\n+\t\t\tgcm_test_case_8.plaintext.len);\n+}\n \n-\t/* Setup Authentication Parameters */\n-\tut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;\n-\tut_params->auth_xform.auth.op = RTE_CRYPTO_AUTH_OP_VERIFY;\n-\tut_params->auth_xform.auth.algo = reference->auth_algo;\n-\tut_params->auth_xform.auth.key.length = reference->auth_key.len;\n-\tut_params->auth_xform.auth.key.data = auth_key;\n-\tut_params->auth_xform.auth.digest_length = reference->digest.len;\n-\tut_params->auth_xform.next = &ut_params->cipher_xform;\n+static int\n+test_AES_GCM_auth_encrypt_SGL_in_place_1500B(void)\n+{\n+\t/* This test fails on OPENSSL PMD although it returns it supports SGL */\n+\tif (gbl_driver_id == rte_cryptodev_driver_id_get(\n+\t\t\tRTE_STR(CRYPTODEV_NAME_OPENSSL_PMD)))\n+\t\treturn -ENOTSUP;\n \n-\t/* Setup Cipher Parameters */\n-\tut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER;\n-\tut_params->cipher_xform.next = NULL;\n-\tut_params->cipher_xform.cipher.algo = reference->crypto_algo;\n-\tut_params->cipher_xform.cipher.op = RTE_CRYPTO_CIPHER_OP_DECRYPT;\n-\tut_params->cipher_xform.cipher.key.data = cipher_key;\n-\tut_params->cipher_xform.cipher.key.length = reference->cipher_key.len;\n-\tut_params->cipher_xform.cipher.iv.offset = IV_OFFSET;\n-\tut_params->cipher_xform.cipher.iv.length = reference->iv.len;\n-\n-\t/* Create Crypto session*/\n-\tut_params->sess = rte_cryptodev_sym_session_create(\n-\t\t\tts_params->session_mpool);\n+\treturn test_authenticated_encryption_SGL(\n+\t\t\t&gcm_test_case_SGL_1, IN_PLACE, 1500, 0);\n+}\n \n-\trte_cryptodev_sym_session_init(ts_params->valid_devs[0],\n-\t\t\t\tut_params->sess,\n-\t\t\t\t&ut_params->auth_xform,\n-\t\t\t\tts_params->session_priv_mpool);\n+static int\n+test_authentication_verify_fail_when_data_corrupted(\n+\t\tstruct crypto_testsuite_params *ts_params,\n+\t\tstruct crypto_unittest_params *ut_params,\n+\t\tconst struct test_crypto_vector *reference)\n+{\n+\treturn test_authentication_verify_fail_when_data_corruption(\n+\t\t\tts_params, ut_params, reference, 1);\n+}\n \n-\tTEST_ASSERT_NOT_NULL(ut_params->sess, \"Session creation failed\");\n+static int\n+test_authentication_verify_fail_when_tag_corrupted(\n+\t\tstruct crypto_testsuite_params *ts_params,\n+\t\tstruct crypto_unittest_params *ut_params,\n+\t\tconst struct test_crypto_vector *reference)\n+{\n+\treturn test_authentication_verify_fail_when_data_corruption(\n+\t\t\tts_params, ut_params, reference, 0);\n+}\n \n-\tut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);\n-\tTEST_ASSERT_NOT_NULL(ut_params->ibuf,\n-\t\t\t\"Failed to allocate input buffer in mempool\");\n+static int\n+test_authentication_verify_GMAC_fail_when_data_corrupted(\n+\t\tstruct crypto_testsuite_params *ts_params,\n+\t\tstruct crypto_unittest_params *ut_params,\n+\t\tconst struct test_crypto_vector *reference)\n+{\n+\treturn test_authentication_verify_GMAC_fail_when_corruption(\n+\t\t\tts_params, ut_params, reference, 1);\n+}\n \n-\t/* clear mbuf payload */\n-\tmemset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,\n-\t\t\trte_pktmbuf_tailroom(ut_params->ibuf));\n+static int\n+test_authentication_verify_GMAC_fail_when_tag_corrupted(\n+\t\tstruct crypto_testsuite_params *ts_params,\n+\t\tstruct crypto_unittest_params *ut_params,\n+\t\tconst struct test_crypto_vector *reference)\n+{\n+\treturn test_authentication_verify_GMAC_fail_when_corruption(\n+\t\t\tts_params, ut_params, reference, 0);\n+}\n \n-\tciphertext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,\n-\t\t\treference->ciphertext.len);\n-\tTEST_ASSERT_NOT_NULL(ciphertext, \"no room to append ciphertext\");\n-\tmemcpy(ciphertext, reference->ciphertext.data,\n-\t\t\treference->ciphertext.len);\n+static int\n+test_authenticated_decryption_fail_when_data_corrupted(\n+\t\tstruct crypto_testsuite_params *ts_params,\n+\t\tstruct crypto_unittest_params *ut_params,\n+\t\tconst struct test_crypto_vector *reference)\n+{\n+\treturn test_authenticated_decryption_fail_when_corruption(\n+\t\t\tts_params, ut_params, reference, 1);\n+}\n \n-\t/* Create operation */\n-\tretval = create_cipher_auth_verify_operation(ts_params,\n-\t\t\tut_params,\n-\t\t\treference);\n+static int\n+test_authenticated_decryption_fail_when_tag_corrupted(\n+\t\tstruct crypto_testsuite_params *ts_params,\n+\t\tstruct crypto_unittest_params *ut_params,\n+\t\tconst struct test_crypto_vector *reference)\n+{\n+\treturn test_authenticated_decryption_fail_when_corruption(\n+\t\t\tts_params, ut_params, reference, 0);\n+}\n \n-\tif (retval < 0)\n-\t\treturn retval;\n+static int\n+authentication_verify_HMAC_SHA1_fail_data_corrupt(void)\n+{\n+\treturn test_authentication_verify_fail_when_data_corrupted(\n+\t\t\t&testsuite_params, &unittest_params,\n+\t\t\t&hmac_sha1_test_crypto_vector);\n+}\n \n-\tut_params->op = process_crypto_request(ts_params->valid_devs[0],\n-\t\t\tut_params->op);\n+static int\n+authentication_verify_HMAC_SHA1_fail_tag_corrupt(void)\n+{\n+\treturn test_authentication_verify_fail_when_tag_corrupted(\n+\t\t\t&testsuite_params, &unittest_params,\n+\t\t\t&hmac_sha1_test_crypto_vector);\n+}\n \n-\tTEST_ASSERT_NOT_NULL(ut_params->op, \"failed crypto process\");\n-\tTEST_ASSERT_EQUAL(ut_params->op->status,\n-\t\t\tRTE_CRYPTO_OP_STATUS_SUCCESS,\n-\t\t\t\"crypto op processing passed\");\n+static int\n+authentication_verify_AES128_GMAC_fail_data_corrupt(void)\n+{\n+\treturn test_authentication_verify_GMAC_fail_when_data_corrupted(\n+\t\t\t&testsuite_params, &unittest_params,\n+\t\t\t&aes128_gmac_test_vector);\n+}\n \n-\tut_params->obuf = ut_params->op->sym->m_src;\n-\tTEST_ASSERT_NOT_NULL(ut_params->obuf, \"failed to retrieve obuf\");\n+static int\n+authentication_verify_AES128_GMAC_fail_tag_corrupt(void)\n+{\n+\treturn test_authentication_verify_GMAC_fail_when_tag_corrupted(\n+\t\t\t&testsuite_params, &unittest_params,\n+\t\t\t&aes128_gmac_test_vector);\n+}\n \n-\treturn 0;\n+static int\n+auth_decryption_AES128CBC_HMAC_SHA1_fail_data_corrupt(void)\n+{\n+\treturn test_authenticated_decryption_fail_when_data_corrupted(\n+\t\t\t&testsuite_params,\n+\t\t\t&unittest_params,\n+\t\t\t&aes128cbc_hmac_sha1_test_vector);\n }\n \n static int\n-create_aead_operation_SGL(enum rte_crypto_aead_operation op,\n-\t\tconst struct aead_test_data *tdata,\n-\t\tvoid *digest_mem, uint64_t digest_phys)\n+auth_decryption_AES128CBC_HMAC_SHA1_fail_tag_corrupt(void)\n {\n-\tstruct crypto_testsuite_params *ts_params = &testsuite_params;\n-\tstruct crypto_unittest_params *ut_params = &unittest_params;\n+\treturn test_authenticated_decryption_fail_when_tag_corrupted(\n+\t\t\t&testsuite_params,\n+\t\t\t&unittest_params,\n+\t\t\t&aes128cbc_hmac_sha1_test_vector);\n+}\n \n-\tconst unsigned int auth_tag_len = tdata->auth_tag.len;\n-\tconst unsigned int iv_len = tdata->iv.len;\n-\tunsigned int aad_len = tdata->aad.len;\n+static int\n+auth_encrypt_AES128CBC_HMAC_SHA1_esn_check(void)\n+{\n+\treturn test_authenticated_encryt_with_esn(\n+\t\t\t&testsuite_params,\n+\t\t\t&unittest_params,\n+\t\t\t&aes128cbc_hmac_sha1_aad_test_vector);\n+}\n \n-\t/* Generate Crypto op data structure */\n-\tut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,\n-\t\t\tRTE_CRYPTO_OP_TYPE_SYMMETRIC);\n-\tTEST_ASSERT_NOT_NULL(ut_params->op,\n-\t\t\"Failed to allocate symmetric crypto operation struct\");\n+static int\n+auth_decrypt_AES128CBC_HMAC_SHA1_esn_check(void)\n+{\n+\treturn test_authenticated_decrypt_with_esn(\n+\t\t\t&testsuite_params,\n+\t\t\t&unittest_params,\n+\t\t\t&aes128cbc_hmac_sha1_aad_test_vector);\n+}\n \n-\tstruct rte_crypto_sym_op *sym_op = ut_params->op->sym;\n+#ifdef RTE_LIBRTE_PMD_CRYPTO_SCHEDULER\n \n-\tsym_op->aead.digest.data = digest_mem;\n+/* global AESNI slave IDs for the scheduler test */\n+uint8_t aesni_ids[2];\n \n-\tTEST_ASSERT_NOT_NULL(sym_op->aead.digest.data,\n-\t\t\t\"no room to append digest\");\n+static int\n+test_scheduler_attach_slave_op(void)\n+{\n+\tstruct crypto_testsuite_params *ts_params = &testsuite_params;\n+\tuint8_t sched_id = ts_params->valid_devs[0];\n+\tuint32_t nb_devs, i, nb_devs_attached = 0;\n+\tint ret;\n+\tchar vdev_name[32];\n \n-\tsym_op->aead.digest.phys_addr = digest_phys;\n+\t/* create 2 AESNI_MB if necessary */\n+\tnb_devs = rte_cryptodev_device_count_by_driver(\n+\t\t\trte_cryptodev_driver_id_get(\n+\t\t\tRTE_STR(CRYPTODEV_NAME_AESNI_MB_PMD)));\n+\tif (nb_devs < 2) {\n+\t\tfor (i = nb_devs; i < 2; i++) {\n+\t\t\tsnprintf(vdev_name, sizeof(vdev_name), \"%s_%u\",\n+\t\t\t\t\tRTE_STR(CRYPTODEV_NAME_AESNI_MB_PMD),\n+\t\t\t\t\ti);\n+\t\t\tret = rte_vdev_init(vdev_name, NULL);\n \n-\tif (op == RTE_CRYPTO_AEAD_OP_DECRYPT) {\n-\t\trte_memcpy(sym_op->aead.digest.data, tdata->auth_tag.data,\n-\t\t\t\tauth_tag_len);\n-\t\tdebug_hexdump(stdout, \"digest:\",\n-\t\t\t\tsym_op->aead.digest.data,\n-\t\t\t\tauth_tag_len);\n+\t\t\tTEST_ASSERT(ret == 0,\n+\t\t\t\t\"Failed to create instance %u of\"\n+\t\t\t\t\" pmd : %s\",\n+\t\t\t\ti, RTE_STR(CRYPTODEV_NAME_AESNI_MB_PMD));\n+\t\t}\n \t}\n \n-\t/* Append aad data */\n-\tif (tdata->algo == RTE_CRYPTO_AEAD_AES_CCM) {\n-\t\tuint8_t *iv_ptr = rte_crypto_op_ctod_offset(ut_params->op,\n-\t\t\t\tuint8_t *, IV_OFFSET);\n-\n-\t\t/* Copy IV 1 byte after the IV pointer, according to the API */\n-\t\trte_memcpy(iv_ptr + 1, tdata->iv.data, iv_len);\n-\n-\t\taad_len = RTE_ALIGN_CEIL(aad_len + 18, 16);\n-\n-\t\tsym_op->aead.aad.data = (uint8_t *)rte_pktmbuf_prepend(\n-\t\t\t\tut_params->ibuf, aad_len);\n-\t\tTEST_ASSERT_NOT_NULL(sym_op->aead.aad.data,\n-\t\t\t\t\"no room to prepend aad\");\n-\t\tsym_op->aead.aad.phys_addr = rte_pktmbuf_iova(\n-\t\t\t\tut_params->ibuf);\n-\n-\t\tmemset(sym_op->aead.aad.data, 0, aad_len);\n-\t\t/* Copy AAD 18 bytes after the AAD pointer, according to the API */\n-\t\trte_memcpy(sym_op->aead.aad.data, tdata->aad.data, aad_len);\n+\t/* attach 2 AESNI_MB cdevs */\n+\tfor (i = 0; i < rte_cryptodev_count() && nb_devs_attached < 2;\n+\t\t\ti++) {\n+\t\tstruct rte_cryptodev_info info;\n+\t\tunsigned int session_size;\n \n-\t\tdebug_hexdump(stdout, \"iv:\", iv_ptr, iv_len);\n-\t\tdebug_hexdump(stdout, \"aad:\",\n-\t\t\t\tsym_op->aead.aad.data, aad_len);\n-\t} else {\n-\t\tuint8_t *iv_ptr = rte_crypto_op_ctod_offset(ut_params->op,\n-\t\t\t\tuint8_t *, IV_OFFSET);\n+\t\trte_cryptodev_info_get(i, &info);\n+\t\tif (info.driver_id != rte_cryptodev_driver_id_get(\n+\t\t\t\tRTE_STR(CRYPTODEV_NAME_AESNI_MB_PMD)))\n+\t\t\tcontinue;\n \n-\t\trte_memcpy(iv_ptr, tdata->iv.data, iv_len);\n+\t\tsession_size = rte_cryptodev_sym_get_private_session_size(i);\n+\t\t/*\n+\t\t * Create the session mempool again, since now there are new\n+\t\t * devices to use the mempool.\n+\t\t */\n+\t\tif (ts_params->session_mpool) {\n+\t\t\trte_mempool_free(ts_params->session_mpool);\n+\t\t\tts_params->session_mpool = NULL;\n+\t\t}\n+\t\tif (ts_params->session_priv_mpool) {\n+\t\t\trte_mempool_free(ts_params->session_priv_mpool);\n+\t\t\tts_params->session_priv_mpool = NULL;\n+\t\t}\n \n-\t\tsym_op->aead.aad.data = (uint8_t *)rte_pktmbuf_prepend(\n-\t\t\t\tut_params->ibuf, aad_len);\n-\t\tTEST_ASSERT_NOT_NULL(sym_op->aead.aad.data,\n-\t\t\t\t\"no room to prepend aad\");\n-\t\tsym_op->aead.aad.phys_addr = rte_pktmbuf_iova(\n-\t\t\t\tut_params->ibuf);\n+\t\tif (info.sym.max_nb_sessions != 0 &&\n+\t\t\t\tinfo.sym.max_nb_sessions < MAX_NB_SESSIONS) {\n+\t\t\tRTE_LOG(ERR, USER1,\n+\t\t\t\t\t\"Device does not support \"\n+\t\t\t\t\t\"at least %u sessions\\n\",\n+\t\t\t\t\tMAX_NB_SESSIONS);\n+\t\t\treturn TEST_FAILED;\n+\t\t}\n+\t\t/*\n+\t\t * Create mempool with maximum number of sessions,\n+\t\t * to include the session headers\n+\t\t */\n+\t\tif (ts_params->session_mpool == NULL) {\n+\t\t\tts_params->session_mpool =\n+\t\t\t\trte_cryptodev_sym_session_pool_create(\n+\t\t\t\t\t\t\"test_sess_mp\",\n+\t\t\t\t\t\tMAX_NB_SESSIONS, 0, 0, 0,\n+\t\t\t\t\t\tSOCKET_ID_ANY);\n+\t\t\tTEST_ASSERT_NOT_NULL(ts_params->session_mpool,\n+\t\t\t\t\t\"session mempool allocation failed\");\n+\t\t}\n \n-\t\tmemset(sym_op->aead.aad.data, 0, aad_len);\n-\t\trte_memcpy(sym_op->aead.aad.data, tdata->aad.data, aad_len);\n+\t\t/*\n+\t\t * Create mempool with maximum number of sessions,\n+\t\t * to include device specific session private data\n+\t\t */\n+\t\tif (ts_params->session_priv_mpool == NULL) {\n+\t\t\tts_params->session_priv_mpool = rte_mempool_create(\n+\t\t\t\t\t\"test_sess_mp_priv\",\n+\t\t\t\t\tMAX_NB_SESSIONS,\n+\t\t\t\t\tsession_size,\n+\t\t\t\t\t0, 0, NULL, NULL, NULL,\n+\t\t\t\t\tNULL, SOCKET_ID_ANY,\n+\t\t\t\t\t0);\n \n-\t\tdebug_hexdump(stdout, \"iv:\", iv_ptr, iv_len);\n-\t\tdebug_hexdump(stdout, \"aad:\",\n-\t\t\t\tsym_op->aead.aad.data, aad_len);\n-\t}\n+\t\t\tTEST_ASSERT_NOT_NULL(ts_params->session_priv_mpool,\n+\t\t\t\t\t\"session mempool allocation failed\");\n+\t\t}\n \n-\tsym_op->aead.data.length = tdata->plaintext.len;\n-\tsym_op->aead.data.offset = aad_len;\n+\t\tts_params->qp_conf.mp_session = ts_params->session_mpool;\n+\t\tts_params->qp_conf.mp_session_private =\n+\t\t\t\tts_params->session_priv_mpool;\n+\n+\t\tret = rte_cryptodev_scheduler_slave_attach(sched_id,\n+\t\t\t\t(uint8_t)i);\n+\n+\t\tTEST_ASSERT(ret == 0,\n+\t\t\t\"Failed to attach device %u of pmd : %s\", i,\n+\t\t\tRTE_STR(CRYPTODEV_NAME_AESNI_MB_PMD));\n+\n+\t\taesni_ids[nb_devs_attached] = (uint8_t)i;\n+\n+\t\tnb_devs_attached++;\n+\t}\n \n \treturn 0;\n }\n \n-#define SGL_MAX_NO\t16\n-\n static int\n-test_authenticated_encryption_SGL(const struct aead_test_data *tdata,\n-\t\tconst int oop, uint32_t fragsz, uint32_t fragsz_oop)\n+test_scheduler_detach_slave_op(void)\n {\n \tstruct crypto_testsuite_params *ts_params = &testsuite_params;\n-\tstruct crypto_unittest_params *ut_params = &unittest_params;\n-\tstruct rte_mbuf *buf, *buf_oop = NULL, *buf_last_oop = NULL;\n-\tint retval;\n-\tint to_trn = 0;\n-\tint to_trn_tbl[SGL_MAX_NO];\n-\tint segs = 1;\n-\tunsigned int trn_data = 0;\n-\tuint8_t *plaintext, *ciphertext, *auth_tag;\n-\n-\tif (fragsz > tdata->plaintext.len)\n-\t\tfragsz = tdata->plaintext.len;\n-\n-\tuint16_t plaintext_len = fragsz;\n-\tuint16_t frag_size_oop = fragsz_oop ? fragsz_oop : fragsz;\n-\n-\tif (fragsz_oop > tdata->plaintext.len)\n-\t\tfrag_size_oop = tdata->plaintext.len;\n-\n-\tint ecx = 0;\n-\tvoid *digest_mem = NULL;\n-\n-\tuint32_t prepend_len = tdata->aad.len;\n-\n-\tif (tdata->plaintext.len % fragsz != 0) {\n-\t\tif (tdata->plaintext.len / fragsz + 1 > SGL_MAX_NO)\n-\t\t\treturn 1;\n-\t}\telse {\n-\t\tif (tdata->plaintext.len / fragsz > SGL_MAX_NO)\n-\t\t\treturn 1;\n-\t}\n+\tuint8_t sched_id = ts_params->valid_devs[0];\n+\tuint32_t i;\n+\tint ret;\n \n-\t/*\n-\t * For out-op-place we need to alloc another mbuf\n-\t */\n-\tif (oop) {\n-\t\tut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);\n-\t\trte_pktmbuf_append(ut_params->obuf,\n-\t\t\t\tfrag_size_oop + prepend_len);\n-\t\tbuf_oop = ut_params->obuf;\n+\tfor (i = 0; i < 2; i++) {\n+\t\tret = rte_cryptodev_scheduler_slave_detach(sched_id,\n+\t\t\t\taesni_ids[i]);\n+\t\tTEST_ASSERT(ret == 0,\n+\t\t\t\"Failed to detach device %u\", aesni_ids[i]);\n \t}\n \n-\t/* Create AEAD session */\n-\tretval = create_aead_session(ts_params->valid_devs[0],\n-\t\t\ttdata->algo,\n-\t\t\tRTE_CRYPTO_AEAD_OP_ENCRYPT,\n-\t\t\ttdata->key.data, tdata->key.len,\n-\t\t\ttdata->aad.len, tdata->auth_tag.len,\n-\t\t\ttdata->iv.len);\n-\tif (retval < 0)\n-\t\treturn retval;\n+\treturn 0;\n+}\n \n-\tut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);\n+static int\n+test_scheduler_mode_op(enum rte_cryptodev_scheduler_mode scheduler_mode)\n+{\n+\tstruct crypto_testsuite_params *ts_params = &testsuite_params;\n+\tuint8_t sched_id = ts_params->valid_devs[0];\n \n-\t/* clear mbuf payload */\n-\tmemset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,\n-\t\t\trte_pktmbuf_tailroom(ut_params->ibuf));\n+\t/* set mode */\n+\treturn rte_cryptodev_scheduler_mode_set(sched_id,\n+\t\tscheduler_mode);\n+}\n \n-\tplaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,\n-\t\t\tplaintext_len);\n+static int\n+test_scheduler_mode_roundrobin_op(void)\n+{\n+\tTEST_ASSERT(test_scheduler_mode_op(CDEV_SCHED_MODE_ROUNDROBIN) ==\n+\t\t\t0, \"Failed to set roundrobin mode\");\n+\treturn 0;\n+}\n \n-\tmemcpy(plaintext, tdata->plaintext.data, plaintext_len);\n+static int\n+test_scheduler_mode_multicore_op(void)\n+{\n+\tTEST_ASSERT(test_scheduler_mode_op(CDEV_SCHED_MODE_MULTICORE) ==\n+\t\t\t0, \"Failed to set multicore mode\");\n \n-\ttrn_data += plaintext_len;\n+\treturn 0;\n+}\n \n-\tbuf = ut_params->ibuf;\n+static int\n+test_scheduler_mode_failover_op(void)\n+{\n+\tTEST_ASSERT(test_scheduler_mode_op(CDEV_SCHED_MODE_FAILOVER) ==\n+\t\t\t0, \"Failed to set failover mode\");\n \n-\t/*\n-\t * Loop until no more fragments\n-\t */\n+\treturn 0;\n+}\n \n-\twhile (trn_data < tdata->plaintext.len) {\n-\t\t++segs;\n-\t\tto_trn = (tdata->plaintext.len - trn_data < fragsz) ?\n-\t\t\t\t(tdata->plaintext.len - trn_data) : fragsz;\n+static int\n+test_scheduler_mode_pkt_size_distr_op(void)\n+{\n+\tTEST_ASSERT(test_scheduler_mode_op(CDEV_SCHED_MODE_PKT_SIZE_DISTR) ==\n+\t\t\t0, \"Failed to set pktsize mode\");\n \n-\t\tto_trn_tbl[ecx++] = to_trn;\n+\treturn 0;\n+}\n \n-\t\tbuf->next = rte_pktmbuf_alloc(ts_params->mbuf_pool);\n-\t\tbuf = buf->next;\n+static struct unit_test_suite cryptodev_scheduler_testsuite  = {\n+\t.suite_name = \"Crypto Device Scheduler Unit Test Suite\",\n+\t.setup = testsuite_setup,\n+\t.teardown = testsuite_teardown,\n+\t.unit_test_cases = {\n+\t\t/* Multi Core */\n+\t\tTEST_CASE_ST(NULL, NULL, test_scheduler_attach_slave_op),\n+\t\tTEST_CASE_ST(NULL, NULL, test_scheduler_mode_multicore_op),\n+\t\tTEST_CASE_ST(ut_setup, ut_teardown, test_AES_chain_all),\n+\t\tTEST_CASE_ST(ut_setup, ut_teardown, test_AES_cipheronly_all),\n+\t\tTEST_CASE_ST(ut_setup, ut_teardown, test_authonly_all),\n+\t\tTEST_CASE_ST(NULL, NULL, test_scheduler_detach_slave_op),\n \n-\t\tmemset(rte_pktmbuf_mtod(buf, uint8_t *), 0,\n-\t\t\t\trte_pktmbuf_tailroom(buf));\n+\t\t/* Round Robin */\n+\t\tTEST_CASE_ST(NULL, NULL, test_scheduler_attach_slave_op),\n+\t\tTEST_CASE_ST(NULL, NULL, test_scheduler_mode_roundrobin_op),\n+\t\tTEST_CASE_ST(ut_setup, ut_teardown, test_AES_chain_all),\n+\t\tTEST_CASE_ST(ut_setup, ut_teardown, test_AES_cipheronly_all),\n+\t\tTEST_CASE_ST(ut_setup, ut_teardown, test_authonly_all),\n+\t\tTEST_CASE_ST(NULL, NULL, test_scheduler_detach_slave_op),\n \n-\t\t/* OOP */\n-\t\tif (oop && !fragsz_oop) {\n-\t\t\tbuf_last_oop = buf_oop->next =\n-\t\t\t\t\trte_pktmbuf_alloc(ts_params->mbuf_pool);\n-\t\t\tbuf_oop = buf_oop->next;\n-\t\t\tmemset(rte_pktmbuf_mtod(buf_oop, uint8_t *),\n-\t\t\t\t\t0, rte_pktmbuf_tailroom(buf_oop));\n-\t\t\trte_pktmbuf_append(buf_oop, to_trn);\n-\t\t}\n+\t\t/* Fail over */\n+\t\tTEST_CASE_ST(NULL, NULL, test_scheduler_attach_slave_op),\n+\t\tTEST_CASE_ST(NULL, NULL, test_scheduler_mode_failover_op),\n+\t\tTEST_CASE_ST(ut_setup, ut_teardown, test_AES_chain_all),\n+\t\tTEST_CASE_ST(ut_setup, ut_teardown, test_AES_cipheronly_all),\n+\t\tTEST_CASE_ST(ut_setup, ut_teardown, test_authonly_all),\n+\t\tTEST_CASE_ST(NULL, NULL, test_scheduler_detach_slave_op),\n \n-\t\tplaintext = (uint8_t *)rte_pktmbuf_append(buf,\n-\t\t\t\tto_trn);\n+\t\t/* PKT SIZE */\n+\t\tTEST_CASE_ST(NULL, NULL, test_scheduler_attach_slave_op),\n+\t\tTEST_CASE_ST(NULL, NULL, test_scheduler_mode_pkt_size_distr_op),\n+\t\tTEST_CASE_ST(ut_setup, ut_teardown, test_AES_chain_all),\n+\t\tTEST_CASE_ST(ut_setup, ut_teardown, test_AES_cipheronly_all),\n+\t\tTEST_CASE_ST(ut_setup, ut_teardown, test_authonly_all),\n+\t\tTEST_CASE_ST(NULL, NULL, test_scheduler_detach_slave_op),\n \n-\t\tmemcpy(plaintext, tdata->plaintext.data + trn_data,\n-\t\t\t\tto_trn);\n-\t\ttrn_data += to_trn;\n-\t\tif (trn_data  == tdata->plaintext.len) {\n-\t\t\tif (oop) {\n-\t\t\t\tif (!fragsz_oop)\n-\t\t\t\t\tdigest_mem = rte_pktmbuf_append(buf_oop,\n-\t\t\t\t\t\ttdata->auth_tag.len);\n-\t\t\t} else\n-\t\t\t\tdigest_mem = (uint8_t *)rte_pktmbuf_append(buf,\n-\t\t\t\t\ttdata->auth_tag.len);\n-\t\t}\n+\t\tTEST_CASES_END() /**< NULL terminate unit test array */\n \t}\n+};\n \n-\tuint64_t digest_phys = 0;\n-\n-\tut_params->ibuf->nb_segs = segs;\n-\n-\tsegs = 1;\n-\tif (fragsz_oop && oop) {\n-\t\tto_trn = 0;\n-\t\tecx = 0;\n-\n-\t\tif (frag_size_oop == tdata->plaintext.len) {\n-\t\t\tdigest_mem = rte_pktmbuf_append(ut_params->obuf,\n-\t\t\t\ttdata->auth_tag.len);\n-\n-\t\t\tdigest_phys = rte_pktmbuf_iova_offset(\n-\t\t\t\t\tut_params->obuf,\n-\t\t\t\t\ttdata->plaintext.len + prepend_len);\n-\t\t}\n-\n-\t\ttrn_data = frag_size_oop;\n-\t\twhile (trn_data < tdata->plaintext.len) {\n-\t\t\t++segs;\n-\t\t\tto_trn =\n-\t\t\t\t(tdata->plaintext.len - trn_data <\n-\t\t\t\t\t\tfrag_size_oop) ?\n-\t\t\t\t(tdata->plaintext.len - trn_data) :\n-\t\t\t\t\t\tfrag_size_oop;\n+#endif /* RTE_LIBRTE_PMD_CRYPTO_SCHEDULER */\n \n-\t\t\tto_trn_tbl[ecx++] = to_trn;\n-\n-\t\t\tbuf_last_oop = buf_oop->next =\n-\t\t\t\t\trte_pktmbuf_alloc(ts_params->mbuf_pool);\n-\t\t\tbuf_oop = buf_oop->next;\n-\t\t\tmemset(rte_pktmbuf_mtod(buf_oop, uint8_t *),\n-\t\t\t\t\t0, rte_pktmbuf_tailroom(buf_oop));\n-\t\t\trte_pktmbuf_append(buf_oop, to_trn);\n-\n-\t\t\ttrn_data += to_trn;\n-\n-\t\t\tif (trn_data  == tdata->plaintext.len) {\n-\t\t\t\tdigest_mem = rte_pktmbuf_append(buf_oop,\n-\t\t\t\t\ttdata->auth_tag.len);\n-\t\t\t}\n-\t\t}\n-\n-\t\tut_params->obuf->nb_segs = segs;\n-\t}\n-\n-\t/*\n-\t * Place digest at the end of the last buffer\n-\t */\n-\tif (!digest_phys)\n-\t\tdigest_phys = rte_pktmbuf_iova(buf) + to_trn;\n-\tif (oop && buf_last_oop)\n-\t\tdigest_phys = rte_pktmbuf_iova(buf_last_oop) + to_trn;\n-\n-\tif (!digest_mem && !oop) {\n-\t\tdigest_mem = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,\n-\t\t\t\t+ tdata->auth_tag.len);\n-\t\tdigest_phys = rte_pktmbuf_iova_offset(ut_params->ibuf,\n-\t\t\t\ttdata->plaintext.len);\n-\t}\n-\n-\t/* Create AEAD operation */\n-\tretval = create_aead_operation_SGL(RTE_CRYPTO_AEAD_OP_ENCRYPT,\n-\t\t\ttdata, digest_mem, digest_phys);\n-\n-\tif (retval < 0)\n-\t\treturn retval;\n-\n-\trte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);\n-\n-\tut_params->op->sym->m_src = ut_params->ibuf;\n-\tif (oop)\n-\t\tut_params->op->sym->m_dst = ut_params->obuf;\n-\n-\t/* Process crypto operation */\n-\tTEST_ASSERT_NOT_NULL(process_crypto_request(ts_params->valid_devs[0],\n-\t\t\tut_params->op), \"failed to process sym crypto op\");\n-\n-\tTEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,\n-\t\t\t\"crypto op processing failed\");\n-\n-\n-\tciphertext = rte_pktmbuf_mtod_offset(ut_params->op->sym->m_src,\n-\t\t\tuint8_t *, prepend_len);\n-\tif (oop) {\n-\t\tciphertext = rte_pktmbuf_mtod_offset(ut_params->op->sym->m_dst,\n-\t\t\t\tuint8_t *, prepend_len);\n-\t}\n-\n-\tif (fragsz_oop)\n-\t\tfragsz = fragsz_oop;\n-\n-\tTEST_ASSERT_BUFFERS_ARE_EQUAL(\n-\t\t\tciphertext,\n-\t\t\ttdata->ciphertext.data,\n-\t\t\tfragsz,\n-\t\t\t\"Ciphertext data not as expected\");\n-\n-\tbuf = ut_params->op->sym->m_src->next;\n-\tif (oop)\n-\t\tbuf = ut_params->op->sym->m_dst->next;\n-\n-\tunsigned int off = fragsz;\n-\n-\tecx = 0;\n-\twhile (buf) {\n-\t\tciphertext = rte_pktmbuf_mtod(buf,\n-\t\t\t\tuint8_t *);\n-\n-\t\tTEST_ASSERT_BUFFERS_ARE_EQUAL(\n-\t\t\t\tciphertext,\n-\t\t\t\ttdata->ciphertext.data + off,\n-\t\t\t\tto_trn_tbl[ecx],\n-\t\t\t\t\"Ciphertext data not as expected\");\n-\n-\t\toff += to_trn_tbl[ecx++];\n-\t\tbuf = buf->next;\n-\t}\n-\n-\tauth_tag = digest_mem;\n-\tTEST_ASSERT_BUFFERS_ARE_EQUAL(\n-\t\t\tauth_tag,\n-\t\t\ttdata->auth_tag.data,\n-\t\t\ttdata->auth_tag.len,\n-\t\t\t\"Generated auth tag not as expected\");\n-\n-\treturn 0;\n-}\n-\n-static int\n-test_AES_GCM_auth_encrypt_SGL_out_of_place_400B_400B(void)\n-{\n-\treturn test_authenticated_encryption_SGL(\n-\t\t\t&gcm_test_case_SGL_1, OUT_OF_PLACE, 400, 400);\n-}\n-\n-static int\n-test_AES_GCM_auth_encrypt_SGL_out_of_place_1500B_2000B(void)\n-{\n-\treturn test_authenticated_encryption_SGL(\n-\t\t\t&gcm_test_case_SGL_1, OUT_OF_PLACE, 1500, 2000);\n-}\n-\n-static int\n-test_AES_GCM_auth_encrypt_SGL_out_of_place_400B_1seg(void)\n-{\n-\treturn test_authenticated_encryption_SGL(\n-\t\t\t&gcm_test_case_8, OUT_OF_PLACE, 400,\n-\t\t\tgcm_test_case_8.plaintext.len);\n-}\n-\n-static int\n-test_AES_GCM_auth_encrypt_SGL_in_place_1500B(void)\n-{\n-\n-\treturn test_authenticated_encryption_SGL(\n-\t\t\t&gcm_test_case_SGL_1, IN_PLACE, 1500, 0);\n-}\n-\n-static int\n-test_authentication_verify_fail_when_data_corrupted(\n-\t\tstruct crypto_testsuite_params *ts_params,\n-\t\tstruct crypto_unittest_params *ut_params,\n-\t\tconst struct test_crypto_vector *reference)\n-{\n-\treturn test_authentication_verify_fail_when_data_corruption(\n-\t\t\tts_params, ut_params, reference, 1);\n-}\n-\n-static int\n-test_authentication_verify_fail_when_tag_corrupted(\n-\t\tstruct crypto_testsuite_params *ts_params,\n-\t\tstruct crypto_unittest_params *ut_params,\n-\t\tconst struct test_crypto_vector *reference)\n-{\n-\treturn test_authentication_verify_fail_when_data_corruption(\n-\t\t\tts_params, ut_params, reference, 0);\n-}\n-\n-static int\n-test_authentication_verify_GMAC_fail_when_data_corrupted(\n-\t\tstruct crypto_testsuite_params *ts_params,\n-\t\tstruct crypto_unittest_params *ut_params,\n-\t\tconst struct test_crypto_vector *reference)\n-{\n-\treturn test_authentication_verify_GMAC_fail_when_corruption(\n-\t\t\tts_params, ut_params, reference, 1);\n-}\n-\n-static int\n-test_authentication_verify_GMAC_fail_when_tag_corrupted(\n-\t\tstruct crypto_testsuite_params *ts_params,\n-\t\tstruct crypto_unittest_params *ut_params,\n-\t\tconst struct test_crypto_vector *reference)\n-{\n-\treturn test_authentication_verify_GMAC_fail_when_corruption(\n-\t\t\tts_params, ut_params, reference, 0);\n-}\n-\n-static int\n-test_authenticated_decryption_fail_when_data_corrupted(\n-\t\tstruct crypto_testsuite_params *ts_params,\n-\t\tstruct crypto_unittest_params *ut_params,\n-\t\tconst struct test_crypto_vector *reference)\n-{\n-\treturn test_authenticated_decryption_fail_when_corruption(\n-\t\t\tts_params, ut_params, reference, 1);\n-}\n-\n-static int\n-test_authenticated_decryption_fail_when_tag_corrupted(\n-\t\tstruct crypto_testsuite_params *ts_params,\n-\t\tstruct crypto_unittest_params *ut_params,\n-\t\tconst struct test_crypto_vector *reference)\n-{\n-\treturn test_authenticated_decryption_fail_when_corruption(\n-\t\t\tts_params, ut_params, reference, 0);\n-}\n-\n-static int\n-authentication_verify_HMAC_SHA1_fail_data_corrupt(void)\n-{\n-\treturn test_authentication_verify_fail_when_data_corrupted(\n-\t\t\t&testsuite_params, &unittest_params,\n-\t\t\t&hmac_sha1_test_crypto_vector);\n-}\n-\n-static int\n-authentication_verify_HMAC_SHA1_fail_tag_corrupt(void)\n-{\n-\treturn test_authentication_verify_fail_when_tag_corrupted(\n-\t\t\t&testsuite_params, &unittest_params,\n-\t\t\t&hmac_sha1_test_crypto_vector);\n-}\n-\n-static int\n-authentication_verify_AES128_GMAC_fail_data_corrupt(void)\n-{\n-\treturn test_authentication_verify_GMAC_fail_when_data_corrupted(\n-\t\t\t&testsuite_params, &unittest_params,\n-\t\t\t&aes128_gmac_test_vector);\n-}\n-\n-static int\n-authentication_verify_AES128_GMAC_fail_tag_corrupt(void)\n-{\n-\treturn test_authentication_verify_GMAC_fail_when_tag_corrupted(\n-\t\t\t&testsuite_params, &unittest_params,\n-\t\t\t&aes128_gmac_test_vector);\n-}\n-\n-static int\n-auth_decryption_AES128CBC_HMAC_SHA1_fail_data_corrupt(void)\n-{\n-\treturn test_authenticated_decryption_fail_when_data_corrupted(\n-\t\t\t&testsuite_params,\n-\t\t\t&unittest_params,\n-\t\t\t&aes128cbc_hmac_sha1_test_vector);\n-}\n-\n-static int\n-auth_decryption_AES128CBC_HMAC_SHA1_fail_tag_corrupt(void)\n-{\n-\treturn test_authenticated_decryption_fail_when_tag_corrupted(\n-\t\t\t&testsuite_params,\n-\t\t\t&unittest_params,\n-\t\t\t&aes128cbc_hmac_sha1_test_vector);\n-}\n-\n-static int\n-auth_encrypt_AES128CBC_HMAC_SHA1_esn_check(void)\n-{\n-\treturn test_authenticated_encryt_with_esn(\n-\t\t\t&testsuite_params,\n-\t\t\t&unittest_params,\n-\t\t\t&aes128cbc_hmac_sha1_aad_test_vector);\n-}\n-\n-static int\n-auth_decrypt_AES128CBC_HMAC_SHA1_esn_check(void)\n-{\n-\treturn test_authenticated_decrypt_with_esn(\n-\t\t\t&testsuite_params,\n-\t\t\t&unittest_params,\n-\t\t\t&aes128cbc_hmac_sha1_aad_test_vector);\n-}\n-\n-#ifdef RTE_LIBRTE_PMD_CRYPTO_SCHEDULER\n-\n-/* global AESNI slave IDs for the scheduler test */\n-uint8_t aesni_ids[2];\n-\n-static int\n-test_scheduler_attach_slave_op(void)\n-{\n-\tstruct crypto_testsuite_params *ts_params = &testsuite_params;\n-\tuint8_t sched_id = ts_params->valid_devs[0];\n-\tuint32_t nb_devs, i, nb_devs_attached = 0;\n-\tint ret;\n-\tchar vdev_name[32];\n-\n-\t/* create 2 AESNI_MB if necessary */\n-\tnb_devs = rte_cryptodev_device_count_by_driver(\n-\t\t\trte_cryptodev_driver_id_get(\n-\t\t\tRTE_STR(CRYPTODEV_NAME_AESNI_MB_PMD)));\n-\tif (nb_devs < 2) {\n-\t\tfor (i = nb_devs; i < 2; i++) {\n-\t\t\tsnprintf(vdev_name, sizeof(vdev_name), \"%s_%u\",\n-\t\t\t\t\tRTE_STR(CRYPTODEV_NAME_AESNI_MB_PMD),\n-\t\t\t\t\ti);\n-\t\t\tret = rte_vdev_init(vdev_name, NULL);\n-\n-\t\t\tTEST_ASSERT(ret == 0,\n-\t\t\t\t\"Failed to create instance %u of\"\n-\t\t\t\t\" pmd : %s\",\n-\t\t\t\ti, RTE_STR(CRYPTODEV_NAME_AESNI_MB_PMD));\n-\t\t}\n-\t}\n-\n-\t/* attach 2 AESNI_MB cdevs */\n-\tfor (i = 0; i < rte_cryptodev_count() && nb_devs_attached < 2;\n-\t\t\ti++) {\n-\t\tstruct rte_cryptodev_info info;\n-\t\tunsigned int session_size;\n-\n-\t\trte_cryptodev_info_get(i, &info);\n-\t\tif (info.driver_id != rte_cryptodev_driver_id_get(\n-\t\t\t\tRTE_STR(CRYPTODEV_NAME_AESNI_MB_PMD)))\n-\t\t\tcontinue;\n-\n-\t\tsession_size = rte_cryptodev_sym_get_private_session_size(i);\n-\t\t/*\n-\t\t * Create the session mempool again, since now there are new devices\n-\t\t * to use the mempool.\n-\t\t */\n-\t\tif (ts_params->session_mpool) {\n-\t\t\trte_mempool_free(ts_params->session_mpool);\n-\t\t\tts_params->session_mpool = NULL;\n-\t\t}\n-\t\tif (ts_params->session_priv_mpool) {\n-\t\t\trte_mempool_free(ts_params->session_priv_mpool);\n-\t\t\tts_params->session_priv_mpool = NULL;\n-\t\t}\n-\n-\t\tif (info.sym.max_nb_sessions != 0 &&\n-\t\t\t\tinfo.sym.max_nb_sessions < MAX_NB_SESSIONS) {\n-\t\t\tRTE_LOG(ERR, USER1,\n-\t\t\t\t\t\"Device does not support \"\n-\t\t\t\t\t\"at least %u sessions\\n\",\n-\t\t\t\t\tMAX_NB_SESSIONS);\n-\t\t\treturn TEST_FAILED;\n-\t\t}\n-\t\t/*\n-\t\t * Create mempool with maximum number of sessions,\n-\t\t * to include the session headers\n-\t\t */\n-\t\tif (ts_params->session_mpool == NULL) {\n-\t\t\tts_params->session_mpool =\n-\t\t\t\trte_cryptodev_sym_session_pool_create(\n-\t\t\t\t\t\t\"test_sess_mp\",\n-\t\t\t\t\t\tMAX_NB_SESSIONS, 0, 0, 0,\n-\t\t\t\t\t\tSOCKET_ID_ANY);\n-\t\t\tTEST_ASSERT_NOT_NULL(ts_params->session_mpool,\n-\t\t\t\t\t\"session mempool allocation failed\");\n-\t\t}\n-\n-\t\t/*\n-\t\t * Create mempool with maximum number of sessions,\n-\t\t * to include device specific session private data\n-\t\t */\n-\t\tif (ts_params->session_priv_mpool == NULL) {\n-\t\t\tts_params->session_priv_mpool = rte_mempool_create(\n-\t\t\t\t\t\"test_sess_mp_priv\",\n-\t\t\t\t\tMAX_NB_SESSIONS,\n-\t\t\t\t\tsession_size,\n-\t\t\t\t\t0, 0, NULL, NULL, NULL,\n-\t\t\t\t\tNULL, SOCKET_ID_ANY,\n-\t\t\t\t\t0);\n-\n-\t\t\tTEST_ASSERT_NOT_NULL(ts_params->session_priv_mpool,\n-\t\t\t\t\t\"session mempool allocation failed\");\n-\t\t}\n-\n-\t\tts_params->qp_conf.mp_session = ts_params->session_mpool;\n-\t\tts_params->qp_conf.mp_session_private =\n-\t\t\t\tts_params->session_priv_mpool;\n-\n-\t\tret = rte_cryptodev_scheduler_slave_attach(sched_id,\n-\t\t\t\t(uint8_t)i);\n-\n-\t\tTEST_ASSERT(ret == 0,\n-\t\t\t\"Failed to attach device %u of pmd : %s\", i,\n-\t\t\tRTE_STR(CRYPTODEV_NAME_AESNI_MB_PMD));\n-\n-\t\taesni_ids[nb_devs_attached] = (uint8_t)i;\n-\n-\t\tnb_devs_attached++;\n-\t}\n-\n-\treturn 0;\n-}\n-\n-static int\n-test_scheduler_detach_slave_op(void)\n-{\n-\tstruct crypto_testsuite_params *ts_params = &testsuite_params;\n-\tuint8_t sched_id = ts_params->valid_devs[0];\n-\tuint32_t i;\n-\tint ret;\n-\n-\tfor (i = 0; i < 2; i++) {\n-\t\tret = rte_cryptodev_scheduler_slave_detach(sched_id,\n-\t\t\t\taesni_ids[i]);\n-\t\tTEST_ASSERT(ret == 0,\n-\t\t\t\"Failed to detach device %u\", aesni_ids[i]);\n-\t}\n-\n-\treturn 0;\n-}\n-\n-static int\n-test_scheduler_mode_op(enum rte_cryptodev_scheduler_mode scheduler_mode)\n-{\n-\tstruct crypto_testsuite_params *ts_params = &testsuite_params;\n-\tuint8_t sched_id = ts_params->valid_devs[0];\n-\t/* set mode */\n-\treturn rte_cryptodev_scheduler_mode_set(sched_id,\n-\t\tscheduler_mode);\n-}\n-\n-static int\n-test_scheduler_mode_roundrobin_op(void)\n-{\n-\tTEST_ASSERT(test_scheduler_mode_op(CDEV_SCHED_MODE_ROUNDROBIN) ==\n-\t\t\t0, \"Failed to set roundrobin mode\");\n-\treturn 0;\n-\n-}\n-\n-static int\n-test_scheduler_mode_multicore_op(void)\n-{\n-\tTEST_ASSERT(test_scheduler_mode_op(CDEV_SCHED_MODE_MULTICORE) ==\n-\t\t\t0, \"Failed to set multicore mode\");\n-\n-\treturn 0;\n-}\n-\n-static int\n-test_scheduler_mode_failover_op(void)\n-{\n-\tTEST_ASSERT(test_scheduler_mode_op(CDEV_SCHED_MODE_FAILOVER) ==\n-\t\t\t0, \"Failed to set failover mode\");\n-\n-\treturn 0;\n-}\n-\n-static int\n-test_scheduler_mode_pkt_size_distr_op(void)\n-{\n-\tTEST_ASSERT(test_scheduler_mode_op(CDEV_SCHED_MODE_PKT_SIZE_DISTR) ==\n-\t\t\t0, \"Failed to set pktsize mode\");\n-\n-\treturn 0;\n-}\n-\n-static struct unit_test_suite cryptodev_scheduler_testsuite  = {\n-\t.suite_name = \"Crypto Device Scheduler Unit Test Suite\",\n-\t.setup = testsuite_setup,\n-\t.teardown = testsuite_teardown,\n-\t.unit_test_cases = {\n-\t\t/* Multi Core */\n-\t\tTEST_CASE_ST(NULL, NULL, test_scheduler_attach_slave_op),\n-\t\tTEST_CASE_ST(NULL, NULL, test_scheduler_mode_multicore_op),\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\t\t\ttest_AES_chain_scheduler_all),\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\t\t\ttest_AES_cipheronly_scheduler_all),\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\t\t\ttest_authonly_scheduler_all),\n-\t\tTEST_CASE_ST(NULL, NULL, test_scheduler_detach_slave_op),\n-\n-\t\t/* Round Robin */\n-\t\tTEST_CASE_ST(NULL, NULL, test_scheduler_attach_slave_op),\n-\t\tTEST_CASE_ST(NULL, NULL, test_scheduler_mode_roundrobin_op),\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\t\ttest_AES_chain_scheduler_all),\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\t\ttest_AES_cipheronly_scheduler_all),\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\t\ttest_authonly_scheduler_all),\n-\t\tTEST_CASE_ST(NULL, NULL, test_scheduler_detach_slave_op),\n-\n-\t\t/* Fail over */\n-\t\tTEST_CASE_ST(NULL, NULL, test_scheduler_attach_slave_op),\n-\t\tTEST_CASE_ST(NULL, NULL, test_scheduler_mode_failover_op),\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\t\t\ttest_AES_chain_scheduler_all),\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\t\t\ttest_AES_cipheronly_scheduler_all),\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\t\t\ttest_authonly_scheduler_all),\n-\t\tTEST_CASE_ST(NULL, NULL, test_scheduler_detach_slave_op),\n-\n-\t\t/* PKT SIZE */\n-\t\tTEST_CASE_ST(NULL, NULL, test_scheduler_attach_slave_op),\n-\t\tTEST_CASE_ST(NULL, NULL, test_scheduler_mode_pkt_size_distr_op),\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\t\t\ttest_AES_chain_scheduler_all),\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\t\t\ttest_AES_cipheronly_scheduler_all),\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\t\t\ttest_authonly_scheduler_all),\n-\t\tTEST_CASE_ST(NULL, NULL, test_scheduler_detach_slave_op),\n-\n-\t\tTEST_CASES_END() /**< NULL terminate unit test array */\n-\t}\n-};\n-\n-#endif /* RTE_LIBRTE_PMD_CRYPTO_SCHEDULER */\n-\n-static struct unit_test_suite cryptodev_qat_testsuite  = {\n-\t.suite_name = \"Crypto QAT Unit Test Suite\",\n-\t.setup = testsuite_setup,\n-\t.teardown = testsuite_teardown,\n-\t.unit_test_cases = {\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\t\ttest_device_configure_invalid_dev_id),\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\t\ttest_device_configure_invalid_queue_pair_ids),\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\t\ttest_queue_pair_descriptor_setup),\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\t\ttest_multi_session),\n-\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown, test_AES_chain_qat_all),\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\t\t\t\ttest_AES_cipheronly_qat_all),\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown, test_3DES_chain_qat_all),\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\t\t\t\ttest_3DES_cipheronly_qat_all),\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\t\t\t\ttest_DES_cipheronly_qat_all),\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\t\t\t\ttest_AES_docsis_qat_all),\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\t\t\t\ttest_DES_docsis_qat_all),\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown, test_authonly_qat_all),\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown, test_stats),\n-\n-\t\t/** AES CCM Authenticated Encryption 128 bits key */\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\ttest_AES_CCM_authenticated_encryption_test_case_128_1),\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\ttest_AES_CCM_authenticated_encryption_test_case_128_2),\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\ttest_AES_CCM_authenticated_encryption_test_case_128_3),\n-\n-\t\t/** AES CCM Authenticated Decryption 128 bits key*/\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\ttest_AES_CCM_authenticated_decryption_test_case_128_1),\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\ttest_AES_CCM_authenticated_decryption_test_case_128_2),\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\ttest_AES_CCM_authenticated_decryption_test_case_128_3),\n-\n-\t\t/** AES GCM Authenticated Encryption */\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\ttest_AES_GCM_auth_encrypt_SGL_in_place_1500B),\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\ttest_AES_GCM_auth_encrypt_SGL_out_of_place_400B_400B),\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\ttest_AES_GCM_auth_encrypt_SGL_out_of_place_1500B_2000B),\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\ttest_AES_GCM_authenticated_encryption_test_case_1),\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\ttest_AES_GCM_authenticated_encryption_test_case_2),\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\ttest_AES_GCM_authenticated_encryption_test_case_3),\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\ttest_AES_GCM_authenticated_encryption_test_case_4),\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\ttest_AES_GCM_authenticated_encryption_test_case_5),\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\ttest_AES_GCM_authenticated_encryption_test_case_6),\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\ttest_AES_GCM_authenticated_encryption_test_case_7),\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\ttest_AES_GCM_authenticated_encryption_test_case_8),\n-\n-\t\t/** AES GCM Authenticated Decryption */\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\ttest_AES_GCM_authenticated_decryption_test_case_1),\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\ttest_AES_GCM_authenticated_decryption_test_case_2),\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\ttest_AES_GCM_authenticated_decryption_test_case_3),\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\ttest_AES_GCM_authenticated_decryption_test_case_4),\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\ttest_AES_GCM_authenticated_decryption_test_case_5),\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\ttest_AES_GCM_authenticated_decryption_test_case_6),\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\ttest_AES_GCM_authenticated_decryption_test_case_7),\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\ttest_AES_GCM_authenticated_decryption_test_case_8),\n-\n-\t\t/** AES GCM Authenticated Encryption 192 bits key */\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\ttest_AES_GCM_auth_encryption_test_case_192_1),\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\ttest_AES_GCM_auth_encryption_test_case_192_2),\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\ttest_AES_GCM_auth_encryption_test_case_192_3),\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\ttest_AES_GCM_auth_encryption_test_case_192_4),\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\ttest_AES_GCM_auth_encryption_test_case_192_5),\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\ttest_AES_GCM_auth_encryption_test_case_192_6),\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\ttest_AES_GCM_auth_encryption_test_case_192_7),\n-\n-\t\t/** AES GCM Authenticated Decryption 192 bits key */\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\ttest_AES_GCM_auth_decryption_test_case_192_1),\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\ttest_AES_GCM_auth_decryption_test_case_192_2),\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\ttest_AES_GCM_auth_decryption_test_case_192_3),\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\ttest_AES_GCM_auth_decryption_test_case_192_4),\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\ttest_AES_GCM_auth_decryption_test_case_192_5),\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\ttest_AES_GCM_auth_decryption_test_case_192_6),\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\ttest_AES_GCM_auth_decryption_test_case_192_7),\n-\n-\t\t/** AES GCM Authenticated Encryption 256 bits key */\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\ttest_AES_GCM_auth_encryption_test_case_256_1),\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\ttest_AES_GCM_auth_encryption_test_case_256_2),\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\ttest_AES_GCM_auth_encryption_test_case_256_3),\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\ttest_AES_GCM_auth_encryption_test_case_256_4),\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\ttest_AES_GCM_auth_encryption_test_case_256_5),\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\ttest_AES_GCM_auth_encryption_test_case_256_6),\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\ttest_AES_GCM_auth_encryption_test_case_256_7),\n-\n-\t\t/** AES GCM Authenticated Decryption 256 bits key */\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\ttest_AES_GCM_auth_decryption_test_case_256_1),\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\ttest_AES_GCM_auth_decryption_test_case_256_2),\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\ttest_AES_GCM_auth_decryption_test_case_256_3),\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\ttest_AES_GCM_auth_decryption_test_case_256_4),\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\ttest_AES_GCM_auth_decryption_test_case_256_5),\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\ttest_AES_GCM_auth_decryption_test_case_256_6),\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\ttest_AES_GCM_auth_decryption_test_case_256_7),\n-\n-\t\t/** AES GMAC Authentication */\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\ttest_AES_GMAC_authentication_test_case_1),\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\ttest_AES_GMAC_authentication_verify_test_case_1),\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\ttest_AES_GMAC_authentication_test_case_2),\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\ttest_AES_GMAC_authentication_verify_test_case_2),\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\ttest_AES_GMAC_authentication_test_case_3),\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\ttest_AES_GMAC_authentication_verify_test_case_3),\n-\n-\t\t/** SNOW 3G encrypt only (UEA2) */\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\ttest_snow3g_encryption_test_case_1),\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\ttest_snow3g_encryption_test_case_2),\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\ttest_snow3g_encryption_test_case_3),\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\ttest_snow3g_encryption_test_case_4),\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\ttest_snow3g_encryption_test_case_5),\n-\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\ttest_snow3g_encryption_test_case_1_oop),\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\ttest_snow3g_decryption_test_case_1_oop),\n-\n-\t\t/** SNOW 3G generate auth, then encrypt (UEA2) */\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\ttest_snow3g_auth_cipher_test_case_1),\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\ttest_snow3g_auth_cipher_test_case_2),\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\ttest_snow3g_auth_cipher_test_case_2_oop),\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\ttest_snow3g_auth_cipher_part_digest_enc),\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\ttest_snow3g_auth_cipher_part_digest_enc_oop),\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\ttest_snow3g_auth_cipher_test_case_3_sgl),\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\ttest_snow3g_auth_cipher_test_case_3_oop_sgl),\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\ttest_snow3g_auth_cipher_part_digest_enc_sgl),\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\ttest_snow3g_auth_cipher_part_digest_enc_oop_sgl),\n-\n-\t\t/** SNOW 3G decrypt (UEA2), then verify auth */\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\ttest_snow3g_auth_cipher_verify_test_case_1),\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\ttest_snow3g_auth_cipher_verify_test_case_2),\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\ttest_snow3g_auth_cipher_verify_test_case_2_oop),\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\ttest_snow3g_auth_cipher_verify_part_digest_enc),\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\ttest_snow3g_auth_cipher_verify_part_digest_enc_oop),\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\ttest_snow3g_auth_cipher_verify_test_case_3_sgl),\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\ttest_snow3g_auth_cipher_verify_test_case_3_oop_sgl),\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\ttest_snow3g_auth_cipher_verify_part_digest_enc_sgl),\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\ttest_snow3g_auth_cipher_verify_part_digest_enc_oop_sgl),\n-\n-\t\t/** SNOW 3G decrypt only (UEA2) */\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\ttest_snow3g_decryption_test_case_1),\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\ttest_snow3g_decryption_test_case_2),\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\ttest_snow3g_decryption_test_case_3),\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\ttest_snow3g_decryption_test_case_4),\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\ttest_snow3g_decryption_test_case_5),\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\ttest_snow3g_decryption_with_digest_test_case_1),\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\ttest_snow3g_hash_generate_test_case_1),\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\ttest_snow3g_hash_generate_test_case_2),\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\ttest_snow3g_hash_generate_test_case_3),\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\ttest_snow3g_hash_verify_test_case_1),\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\ttest_snow3g_hash_verify_test_case_2),\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\ttest_snow3g_hash_verify_test_case_3),\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\ttest_snow3g_cipher_auth_test_case_1),\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\ttest_snow3g_auth_cipher_with_digest_test_case_1),\n-\n-\t\t/** ZUC encrypt only (EEA3) */\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\ttest_zuc_encryption_test_case_1),\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\ttest_zuc_encryption_test_case_2),\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\ttest_zuc_encryption_test_case_3),\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\ttest_zuc_encryption_test_case_4),\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\ttest_zuc_encryption_test_case_5),\n-\n-\t\t/** ZUC authenticate (EIA3) */\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\ttest_zuc_hash_generate_test_case_6),\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\ttest_zuc_hash_generate_test_case_7),\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\ttest_zuc_hash_generate_test_case_8),\n-\n-\t\t/** ZUC alg-chain (EEA3/EIA3) */\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\ttest_zuc_cipher_auth_test_case_1),\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\ttest_zuc_cipher_auth_test_case_2),\n-\n-\t\t/** ZUC generate auth, then encrypt (EEA3) */\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\ttest_zuc_auth_cipher_test_case_1),\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\ttest_zuc_auth_cipher_test_case_1_oop),\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\ttest_zuc_auth_cipher_test_case_1_sgl),\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\ttest_zuc_auth_cipher_test_case_1_oop_sgl),\n-\n-\t\t/** ZUC decrypt (EEA3), then verify auth */\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\ttest_zuc_auth_cipher_verify_test_case_1),\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\ttest_zuc_auth_cipher_verify_test_case_1_oop),\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\ttest_zuc_auth_cipher_verify_test_case_1_sgl),\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\ttest_zuc_auth_cipher_verify_test_case_1_oop_sgl),\n-\n-\t\t/** HMAC_MD5 Authentication */\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\ttest_MD5_HMAC_generate_case_1),\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\ttest_MD5_HMAC_verify_case_1),\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\ttest_MD5_HMAC_generate_case_2),\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\ttest_MD5_HMAC_verify_case_2),\n-\n-\t\t/** NULL algo tests done in chain_all,\n-\t\t * cipheronly and authonly suites\n-\t\t */\n-\n-\t\t/** KASUMI tests */\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\ttest_kasumi_hash_generate_test_case_1),\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\ttest_kasumi_hash_generate_test_case_2),\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\ttest_kasumi_hash_generate_test_case_3),\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\ttest_kasumi_hash_generate_test_case_4),\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\ttest_kasumi_hash_generate_test_case_5),\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\ttest_kasumi_hash_generate_test_case_6),\n-\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\ttest_kasumi_hash_verify_test_case_1),\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\ttest_kasumi_hash_verify_test_case_2),\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\ttest_kasumi_hash_verify_test_case_3),\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\ttest_kasumi_hash_verify_test_case_4),\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\ttest_kasumi_hash_verify_test_case_5),\n-\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\ttest_kasumi_encryption_test_case_1),\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\ttest_kasumi_encryption_test_case_3),\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\ttest_kasumi_cipher_auth_test_case_1),\n-\n-\t\t/** KASUMI generate auth, then encrypt (F8) */\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\ttest_kasumi_auth_cipher_test_case_1),\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\ttest_kasumi_auth_cipher_test_case_2),\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\ttest_kasumi_auth_cipher_test_case_2_oop),\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\ttest_kasumi_auth_cipher_test_case_2_sgl),\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\ttest_kasumi_auth_cipher_test_case_2_oop_sgl),\n-\n-\t\t/** KASUMI decrypt (F8), then verify auth */\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\ttest_kasumi_auth_cipher_verify_test_case_1),\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\ttest_kasumi_auth_cipher_verify_test_case_2),\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\ttest_kasumi_auth_cipher_verify_test_case_2_oop),\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\ttest_kasumi_auth_cipher_verify_test_case_2_sgl),\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\ttest_kasumi_auth_cipher_verify_test_case_2_oop_sgl),\n-\n-\t\t/** Negative tests */\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\tauthentication_verify_HMAC_SHA1_fail_data_corrupt),\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\tauthentication_verify_HMAC_SHA1_fail_tag_corrupt),\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\ttest_AES_GCM_auth_encryption_fail_iv_corrupt),\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\ttest_AES_GCM_auth_encryption_fail_in_data_corrupt),\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\ttest_AES_GCM_auth_encryption_fail_out_data_corrupt),\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\ttest_AES_GCM_auth_encryption_fail_aad_len_corrupt),\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\ttest_AES_GCM_auth_encryption_fail_aad_corrupt),\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\ttest_AES_GCM_auth_encryption_fail_tag_corrupt),\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\ttest_AES_GCM_auth_decryption_fail_iv_corrupt),\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\ttest_AES_GCM_auth_decryption_fail_in_data_corrupt),\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\ttest_AES_GCM_auth_decryption_fail_out_data_corrupt),\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\ttest_AES_GCM_auth_decryption_fail_aad_len_corrupt),\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\ttest_AES_GCM_auth_decryption_fail_aad_corrupt),\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\ttest_AES_GCM_auth_decryption_fail_tag_corrupt),\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\tauthentication_verify_AES128_GMAC_fail_data_corrupt),\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\tauthentication_verify_AES128_GMAC_fail_tag_corrupt),\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\tauth_decryption_AES128CBC_HMAC_SHA1_fail_data_corrupt),\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\tauth_decryption_AES128CBC_HMAC_SHA1_fail_tag_corrupt),\n-\n-\t\t/** Mixed CIPHER + HASH algorithms */\n-\t\t/** AUTH AES CMAC + CIPHER AES CTR */\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\ttest_aes_cmac_aes_ctr_digest_enc_test_case_1),\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\ttest_aes_cmac_aes_ctr_digest_enc_test_case_1_oop),\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\ttest_aes_cmac_aes_ctr_digest_enc_test_case_1_sgl),\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\ttest_aes_cmac_aes_ctr_digest_enc_test_case_1_oop_sgl),\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\ttest_verify_aes_cmac_aes_ctr_digest_enc_test_case_1),\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t       test_verify_aes_cmac_aes_ctr_digest_enc_test_case_1_oop),\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t       test_verify_aes_cmac_aes_ctr_digest_enc_test_case_1_sgl),\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t   test_verify_aes_cmac_aes_ctr_digest_enc_test_case_1_oop_sgl),\n-\n-\t\t/** AUTH ZUC + CIPHER SNOW3G */\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\ttest_auth_zuc_cipher_snow_test_case_1),\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\ttest_verify_auth_zuc_cipher_snow_test_case_1),\n-\t\t/** AUTH AES CMAC + CIPHER SNOW3G */\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\ttest_auth_aes_cmac_cipher_snow_test_case_1),\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\ttest_verify_auth_aes_cmac_cipher_snow_test_case_1),\n-\t\t/** AUTH ZUC + CIPHER AES CTR */\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\ttest_auth_zuc_cipher_aes_ctr_test_case_1),\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\ttest_verify_auth_zuc_cipher_aes_ctr_test_case_1),\n-\t\t/** AUTH SNOW3G + CIPHER AES CTR */\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\ttest_auth_snow_cipher_aes_ctr_test_case_1),\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\ttest_verify_auth_snow_cipher_aes_ctr_test_case_1),\n-\t\t/** AUTH SNOW3G + CIPHER ZUC */\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\ttest_auth_snow_cipher_zuc_test_case_1),\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\ttest_verify_auth_snow_cipher_zuc_test_case_1),\n-\t\t/** AUTH AES CMAC + CIPHER ZUC */\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\ttest_auth_aes_cmac_cipher_zuc_test_case_1),\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\ttest_verify_auth_aes_cmac_cipher_zuc_test_case_1),\n-\n-\t\t/** AUTH NULL + CIPHER SNOW3G */\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\ttest_auth_null_cipher_snow_test_case_1),\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\ttest_verify_auth_null_cipher_snow_test_case_1),\n-\t\t/** AUTH NULL + CIPHER ZUC */\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\ttest_auth_null_cipher_zuc_test_case_1),\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\ttest_verify_auth_null_cipher_zuc_test_case_1),\n-\t\t/** AUTH SNOW3G + CIPHER NULL */\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\ttest_auth_snow_cipher_null_test_case_1),\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\ttest_verify_auth_snow_cipher_null_test_case_1),\n-\t\t/** AUTH ZUC + CIPHER NULL */\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\ttest_auth_zuc_cipher_null_test_case_1),\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\ttest_verify_auth_zuc_cipher_null_test_case_1),\n-\t\t/** AUTH NULL + CIPHER AES CTR */\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\ttest_auth_null_cipher_aes_ctr_test_case_1),\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\ttest_verify_auth_null_cipher_aes_ctr_test_case_1),\n-\t\t/** AUTH AES CMAC + CIPHER NULL */\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\ttest_auth_aes_cmac_cipher_null_test_case_1),\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\ttest_verify_auth_aes_cmac_cipher_null_test_case_1),\n-\n-\t\tTEST_CASES_END() /**< NULL terminate unit test array */\n-\t}\n-};\n-\n-static struct unit_test_suite cryptodev_virtio_testsuite = {\n-\t.suite_name = \"Crypto VIRTIO Unit Test Suite\",\n-\t.setup = testsuite_setup,\n-\t.teardown = testsuite_teardown,\n-\t.unit_test_cases = {\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\t\ttest_AES_cipheronly_virtio_all),\n-\n-\t\tTEST_CASES_END() /**< NULL terminate unit test array */\n-\t}\n-};\n-\n-static struct unit_test_suite cryptodev_aesni_mb_testsuite  = {\n-\t.suite_name = \"Crypto Device AESNI MB Unit Test Suite\",\n-\t.setup = testsuite_setup,\n-\t.teardown = testsuite_teardown,\n-\t.unit_test_cases = {\n-#if IMB_VERSION_NUM >= IMB_VERSION(0, 51, 0)\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\ttest_AES_GCM_authenticated_encryption_test_case_1),\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\ttest_AES_GCM_authenticated_encryption_test_case_2),\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\ttest_AES_GCM_authenticated_encryption_test_case_3),\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\ttest_AES_GCM_authenticated_encryption_test_case_4),\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\ttest_AES_GCM_authenticated_encryption_test_case_5),\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\ttest_AES_GCM_authenticated_encryption_test_case_6),\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\ttest_AES_GCM_authenticated_encryption_test_case_7),\n-\n-\t\t/** AES GCM Authenticated Decryption */\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\ttest_AES_GCM_authenticated_decryption_test_case_1),\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\ttest_AES_GCM_authenticated_decryption_test_case_2),\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\ttest_AES_GCM_authenticated_decryption_test_case_3),\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\ttest_AES_GCM_authenticated_decryption_test_case_4),\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\ttest_AES_GCM_authenticated_decryption_test_case_5),\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\ttest_AES_GCM_authenticated_decryption_test_case_6),\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\ttest_AES_GCM_authenticated_decryption_test_case_7),\n-\n-\t\t/** AES GCM Authenticated Encryption 192 bits key */\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\ttest_AES_GCM_auth_encryption_test_case_192_1),\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\ttest_AES_GCM_auth_encryption_test_case_192_2),\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\ttest_AES_GCM_auth_encryption_test_case_192_3),\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\ttest_AES_GCM_auth_encryption_test_case_192_4),\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\ttest_AES_GCM_auth_encryption_test_case_192_5),\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\ttest_AES_GCM_auth_encryption_test_case_192_6),\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\ttest_AES_GCM_auth_encryption_test_case_192_7),\n-\n-\t\t/** AES GCM Authenticated Decryption 192 bits key */\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\ttest_AES_GCM_auth_decryption_test_case_192_1),\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\ttest_AES_GCM_auth_decryption_test_case_192_2),\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\ttest_AES_GCM_auth_decryption_test_case_192_3),\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\ttest_AES_GCM_auth_decryption_test_case_192_4),\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\ttest_AES_GCM_auth_decryption_test_case_192_5),\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\ttest_AES_GCM_auth_decryption_test_case_192_6),\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\ttest_AES_GCM_auth_decryption_test_case_192_7),\n-\n-\t\t/** AES GCM Authenticated Encryption 256 bits key */\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\ttest_AES_GCM_auth_encryption_test_case_256_1),\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\ttest_AES_GCM_auth_encryption_test_case_256_2),\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\ttest_AES_GCM_auth_encryption_test_case_256_3),\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\ttest_AES_GCM_auth_encryption_test_case_256_4),\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\ttest_AES_GCM_auth_encryption_test_case_256_5),\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\ttest_AES_GCM_auth_encryption_test_case_256_6),\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\ttest_AES_GCM_auth_encryption_test_case_256_7),\n-\n-\t\t/** AES GCM Authenticated Decryption 256 bits key */\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\ttest_AES_GCM_auth_decryption_test_case_256_1),\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\ttest_AES_GCM_auth_decryption_test_case_256_2),\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\ttest_AES_GCM_auth_decryption_test_case_256_3),\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\ttest_AES_GCM_auth_decryption_test_case_256_4),\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\ttest_AES_GCM_auth_decryption_test_case_256_5),\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\ttest_AES_GCM_auth_decryption_test_case_256_6),\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\ttest_AES_GCM_auth_decryption_test_case_256_7),\n-\n-\t\t/** AES GCM Authenticated Encryption big aad size */\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\ttest_AES_GCM_auth_encryption_test_case_aad_1),\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\ttest_AES_GCM_auth_encryption_test_case_aad_2),\n-\n-\t\t/** AES GCM Authenticated Decryption big aad size */\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\ttest_AES_GCM_auth_decryption_test_case_aad_1),\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\ttest_AES_GCM_auth_decryption_test_case_aad_2),\n-\n-\t\t/** Session-less tests */\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\ttest_AES_GCM_authenticated_encryption_sessionless_test_case_1),\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\ttest_AES_GCM_authenticated_decryption_sessionless_test_case_1),\n-\n-\t\t/** AES GMAC Authentication */\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\ttest_AES_GMAC_authentication_test_case_1),\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\ttest_AES_GMAC_authentication_verify_test_case_1),\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\ttest_AES_GMAC_authentication_test_case_2),\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\ttest_AES_GMAC_authentication_verify_test_case_2),\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\ttest_AES_GMAC_authentication_test_case_3),\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\ttest_AES_GMAC_authentication_verify_test_case_3),\n-#endif /* IMB_VERSION_NUM >= IMB_VERSION(0, 51, 0) */\n-\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown, test_AES_chain_mb_all),\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown, test_AES_cipheronly_mb_all),\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown, test_AES_docsis_mb_all),\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown, test_authonly_mb_all),\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\t\t\t\ttest_DES_cipheronly_mb_all),\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\t\t\t\ttest_DES_docsis_mb_all),\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\t\t\t\ttest_3DES_cipheronly_mb_all),\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\ttest_AES_CCM_authenticated_encryption_test_case_128_1),\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\ttest_AES_CCM_authenticated_decryption_test_case_128_1),\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\ttest_AES_CCM_authenticated_encryption_test_case_128_2),\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\ttest_AES_CCM_authenticated_decryption_test_case_128_2),\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\ttest_AES_CCM_authenticated_encryption_test_case_128_3),\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\ttest_AES_CCM_authenticated_decryption_test_case_128_3),\n-\n-\t\tTEST_CASES_END() /**< NULL terminate unit test array */\n-\t}\n-};\n-\n-static struct unit_test_suite cryptodev_openssl_testsuite  = {\n-\t.suite_name = \"Crypto Device OPENSSL Unit Test Suite\",\n+static struct unit_test_suite cryptodev_testsuite  = {\n+\t.suite_name = \"Crypto Unit Test Suite\",\n \t.setup = testsuite_setup,\n \t.teardown = testsuite_teardown,\n \t.unit_test_cases = {\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown, test_multi_session),\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\t\ttest_multi_session_random_usage),\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\t\ttest_AES_chain_openssl_all),\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\t\ttest_AES_cipheronly_openssl_all),\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\t\ttest_3DES_chain_openssl_all),\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\t\ttest_3DES_cipheronly_openssl_all),\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\t\ttest_DES_cipheronly_openssl_all),\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\t\ttest_DES_docsis_openssl_all),\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\t\ttest_authonly_openssl_all),\n-\n-\t\t/** AES GCM Authenticated Encryption */\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\ttest_AES_GCM_authenticated_encryption_test_case_1),\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\ttest_AES_GCM_authenticated_encryption_test_case_2),\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\ttest_AES_GCM_authenticated_encryption_test_case_3),\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\ttest_AES_GCM_authenticated_encryption_test_case_4),\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\ttest_AES_GCM_authenticated_encryption_test_case_5),\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\ttest_AES_GCM_authenticated_encryption_test_case_6),\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\ttest_AES_GCM_authenticated_encryption_test_case_7),\n-\n-\t\t/** AES GCM Authenticated Decryption */\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\ttest_AES_GCM_authenticated_decryption_test_case_1),\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\ttest_AES_GCM_authenticated_decryption_test_case_2),\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\ttest_AES_GCM_authenticated_decryption_test_case_3),\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\ttest_AES_GCM_authenticated_decryption_test_case_4),\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\ttest_AES_GCM_authenticated_decryption_test_case_5),\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\ttest_AES_GCM_authenticated_decryption_test_case_6),\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\ttest_AES_GCM_authenticated_decryption_test_case_7),\n-\n-\n-\t\t/** AES GCM Authenticated Encryption 192 bits key */\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\ttest_AES_GCM_auth_encryption_test_case_192_1),\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\ttest_AES_GCM_auth_encryption_test_case_192_2),\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\ttest_AES_GCM_auth_encryption_test_case_192_3),\n \t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\ttest_AES_GCM_auth_encryption_test_case_192_4),\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\ttest_AES_GCM_auth_encryption_test_case_192_5),\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\ttest_AES_GCM_auth_encryption_test_case_192_6),\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\ttest_AES_GCM_auth_encryption_test_case_192_7),\n-\n-\t\t/** AES GCM Authenticated Decryption 192 bits key */\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\ttest_AES_GCM_auth_decryption_test_case_192_1),\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\ttest_AES_GCM_auth_decryption_test_case_192_2),\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\ttest_AES_GCM_auth_decryption_test_case_192_3),\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\ttest_AES_GCM_auth_decryption_test_case_192_4),\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\ttest_AES_GCM_auth_decryption_test_case_192_5),\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\ttest_AES_GCM_auth_decryption_test_case_192_6),\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\ttest_AES_GCM_auth_decryption_test_case_192_7),\n-\n-\t\t/** AES GCM Authenticated Encryption 256 bits key */\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\ttest_AES_GCM_auth_encryption_test_case_256_1),\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\ttest_AES_GCM_auth_encryption_test_case_256_2),\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\ttest_AES_GCM_auth_encryption_test_case_256_3),\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\ttest_AES_GCM_auth_encryption_test_case_256_4),\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\ttest_AES_GCM_auth_encryption_test_case_256_5),\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\ttest_AES_GCM_auth_encryption_test_case_256_6),\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\ttest_AES_GCM_auth_encryption_test_case_256_7),\n-\n-\t\t/** AES GCM Authenticated Decryption 256 bits key */\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\ttest_AES_GCM_auth_decryption_test_case_256_1),\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\ttest_AES_GCM_auth_decryption_test_case_256_2),\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\ttest_AES_GCM_auth_decryption_test_case_256_3),\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\ttest_AES_GCM_auth_decryption_test_case_256_4),\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\ttest_AES_GCM_auth_decryption_test_case_256_5),\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\ttest_AES_GCM_auth_decryption_test_case_256_6),\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\ttest_AES_GCM_auth_decryption_test_case_256_7),\n-\n-\t\t/** AES GMAC Authentication */\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\ttest_AES_GMAC_authentication_test_case_1),\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\ttest_AES_GMAC_authentication_verify_test_case_1),\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\ttest_AES_GMAC_authentication_test_case_2),\n+\t\t\t\ttest_device_configure_invalid_dev_id),\n \t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\ttest_AES_GMAC_authentication_verify_test_case_2),\n+\t\t\t\ttest_device_configure_invalid_queue_pair_ids),\n \t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\ttest_AES_GMAC_authentication_test_case_3),\n+\t\t\t\ttest_queue_pair_descriptor_setup),\n+\n \t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\ttest_AES_GMAC_authentication_verify_test_case_3),\n+\t\t\t\ttest_multi_session),\n \t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\ttest_AES_GMAC_authentication_test_case_4),\n+\t\t\t\ttest_multi_session_random_usage),\n+\n \t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\ttest_AES_GMAC_authentication_verify_test_case_4),\n+\t\t\ttest_null_invalid_operation),\n+\t\tTEST_CASE_ST(ut_setup, ut_teardown, test_null_burst_operation),\n+\n+\t\tTEST_CASE_ST(ut_setup, ut_teardown, test_AES_chain_all),\n+\t\tTEST_CASE_ST(ut_setup, ut_teardown, test_AES_cipheronly_all),\n+\t\tTEST_CASE_ST(ut_setup, ut_teardown, test_3DES_chain_all),\n+\t\tTEST_CASE_ST(ut_setup, ut_teardown, test_3DES_cipheronly_all),\n+\t\tTEST_CASE_ST(ut_setup, ut_teardown, test_DES_cipheronly_all),\n+\t\tTEST_CASE_ST(ut_setup, ut_teardown, test_AES_docsis_all),\n+\t\tTEST_CASE_ST(ut_setup, ut_teardown, test_DES_docsis_all),\n+\t\tTEST_CASE_ST(ut_setup, ut_teardown, test_authonly_all),\n+\t\tTEST_CASE_ST(ut_setup, ut_teardown, test_stats),\n \n \t\t/** AES CCM Authenticated Encryption 128 bits key */\n \t\tTEST_CASE_ST(ut_setup, ut_teardown,\n@@ -12987,41 +11657,15 @@ static struct unit_test_suite cryptodev_openssl_testsuite  = {\n \t\tTEST_CASE_ST(ut_setup, ut_teardown,\n \t\t\ttest_AES_CCM_authenticated_decryption_test_case_256_3),\n \n-\t\t/** Scatter-Gather */\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\ttest_AES_GCM_auth_encrypt_SGL_out_of_place_400B_1seg),\n-\n-\t\t/** Negative tests */\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\tauthentication_verify_HMAC_SHA1_fail_data_corrupt),\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\tauthentication_verify_HMAC_SHA1_fail_tag_corrupt),\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\tauthentication_verify_AES128_GMAC_fail_data_corrupt),\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\tauthentication_verify_AES128_GMAC_fail_tag_corrupt),\n+\t\t/** AES GCM Authenticated Encryption */\n \t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\tauth_decryption_AES128CBC_HMAC_SHA1_fail_data_corrupt),\n+\t\t\ttest_AES_GCM_auth_encrypt_SGL_in_place_1500B),\n \t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\tauth_decryption_AES128CBC_HMAC_SHA1_fail_tag_corrupt),\n-\n-\t\t/* ESN Testcase */\n+\t\t\ttest_AES_GCM_auth_encrypt_SGL_out_of_place_400B_1seg),\n \t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\tauth_encrypt_AES128CBC_HMAC_SHA1_esn_check),\n-\n+\t\t\ttest_AES_GCM_auth_encrypt_SGL_out_of_place_400B_400B),\n \t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\tauth_decrypt_AES128CBC_HMAC_SHA1_esn_check),\n-\n-\t\tTEST_CASES_END() /**< NULL terminate unit test array */\n-\t}\n-};\n-\n-static struct unit_test_suite cryptodev_aesni_gcm_testsuite  = {\n-\t.suite_name = \"Crypto Device AESNI GCM Unit Test Suite\",\n-\t.setup = testsuite_setup,\n-\t.teardown = testsuite_teardown,\n-\t.unit_test_cases = {\n-\t\t/** AES GCM Authenticated Encryption */\n+\t\t\ttest_AES_GCM_auth_encrypt_SGL_out_of_place_1500B_2000B),\n \t\tTEST_CASE_ST(ut_setup, ut_teardown,\n \t\t\ttest_AES_GCM_authenticated_encryption_test_case_1),\n \t\tTEST_CASE_ST(ut_setup, ut_teardown,\n@@ -13036,6 +11680,8 @@ static struct unit_test_suite cryptodev_aesni_gcm_testsuite  = {\n \t\t\ttest_AES_GCM_authenticated_encryption_test_case_6),\n \t\tTEST_CASE_ST(ut_setup, ut_teardown,\n \t\t\ttest_AES_GCM_authenticated_encryption_test_case_7),\n+\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n+\t\t\ttest_AES_GCM_authenticated_encryption_test_case_8),\n \n \t\t/** AES GCM Authenticated Decryption */\n \t\tTEST_CASE_ST(ut_setup, ut_teardown,\n@@ -13052,6 +11698,8 @@ static struct unit_test_suite cryptodev_aesni_gcm_testsuite  = {\n \t\t\ttest_AES_GCM_authenticated_decryption_test_case_6),\n \t\tTEST_CASE_ST(ut_setup, ut_teardown,\n \t\t\ttest_AES_GCM_authenticated_decryption_test_case_7),\n+\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n+\t\t\ttest_AES_GCM_authenticated_decryption_test_case_8),\n \n \t\t/** AES GCM Authenticated Encryption 192 bits key */\n \t\tTEST_CASE_ST(ut_setup, ut_teardown,\n@@ -13129,11 +11777,27 @@ static struct unit_test_suite cryptodev_aesni_gcm_testsuite  = {\n \t\tTEST_CASE_ST(ut_setup, ut_teardown,\n \t\t\ttest_AES_GCM_auth_decryption_test_case_aad_2),\n \n+\t\t/** Out of place tests */\n+\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n+\t\t\ttest_AES_GCM_authenticated_encryption_oop_test_case_1),\n+\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n+\t\t\ttest_AES_GCM_authenticated_decryption_oop_test_case_1),\n+\n+\t\t/** Session-less tests */\n+\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n+\t\t\ttest_AES_GCM_auth_encryption_sessionless_test_case_1),\n+\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n+\t\t\ttest_AES_GCM_auth_decryption_sessionless_test_case_1),\n+\n \t\t/** AES GMAC Authentication */\n \t\tTEST_CASE_ST(ut_setup, ut_teardown,\n \t\t\ttest_AES_GMAC_authentication_test_case_1),\n \t\tTEST_CASE_ST(ut_setup, ut_teardown,\n \t\t\ttest_AES_GMAC_authentication_verify_test_case_1),\n+\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n+\t\t\ttest_AES_GMAC_authentication_test_case_2),\n+\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n+\t\t\ttest_AES_GMAC_authentication_verify_test_case_2),\n \t\tTEST_CASE_ST(ut_setup, ut_teardown,\n \t\t\ttest_AES_GMAC_authentication_test_case_3),\n \t\tTEST_CASE_ST(ut_setup, ut_teardown,\n@@ -13143,44 +11807,213 @@ static struct unit_test_suite cryptodev_aesni_gcm_testsuite  = {\n \t\tTEST_CASE_ST(ut_setup, ut_teardown,\n \t\t\ttest_AES_GMAC_authentication_verify_test_case_4),\n \n-\t\t/** Negative tests */\n+\t\t/** SNOW 3G encrypt only (UEA2) */\n \t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\tauthentication_verify_AES128_GMAC_fail_data_corrupt),\n+\t\t\ttest_snow3g_encryption_test_case_1),\n \t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\tauthentication_verify_AES128_GMAC_fail_tag_corrupt),\n+\t\t\ttest_snow3g_encryption_test_case_2),\n+\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n+\t\t\ttest_snow3g_encryption_test_case_3),\n+\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n+\t\t\ttest_snow3g_encryption_test_case_4),\n+\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n+\t\t\ttest_snow3g_encryption_test_case_5),\n \n-\t\t/** Out of place tests */\n \t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\ttest_AES_GCM_authenticated_encryption_oop_test_case_1),\n+\t\t\ttest_snow3g_encryption_test_case_1_oop),\n \t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\ttest_AES_GCM_authenticated_decryption_oop_test_case_1),\n+\t\t\ttest_snow3g_encryption_test_case_1_oop_sgl),\n+\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n+\t\t\ttest_snow3g_encryption_test_case_1_offset_oop),\n+\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n+\t\t\ttest_snow3g_decryption_test_case_1_oop),\n \n-\t\t/** Session-less tests */\n+\t\t/** SNOW 3G generate auth, then encrypt (UEA2) */\n+\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n+\t\t\ttest_snow3g_auth_cipher_test_case_1),\n+\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n+\t\t\ttest_snow3g_auth_cipher_test_case_2),\n+\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n+\t\t\ttest_snow3g_auth_cipher_test_case_2_oop),\n+\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n+\t\t\ttest_snow3g_auth_cipher_part_digest_enc),\n+\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n+\t\t\ttest_snow3g_auth_cipher_part_digest_enc_oop),\n+\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n+\t\t\ttest_snow3g_auth_cipher_test_case_3_sgl),\n+\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n+\t\t\ttest_snow3g_auth_cipher_test_case_3_oop_sgl),\n \t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\ttest_AES_GCM_authenticated_encryption_sessionless_test_case_1),\n+\t\t\ttest_snow3g_auth_cipher_part_digest_enc_sgl),\n \t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\ttest_AES_GCM_authenticated_decryption_sessionless_test_case_1),\n+\t\t\ttest_snow3g_auth_cipher_part_digest_enc_oop_sgl),\n \n-\t\t/** Scatter-Gather */\n+\t\t/** SNOW 3G decrypt (UEA2), then verify auth */\n \t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\ttest_AES_GCM_auth_encrypt_SGL_in_place_1500B),\n+\t\t\ttest_snow3g_auth_cipher_verify_test_case_1),\n \t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\ttest_AES_GCM_auth_encrypt_SGL_out_of_place_400B_1seg),\n+\t\t\ttest_snow3g_auth_cipher_verify_test_case_2),\n+\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n+\t\t\ttest_snow3g_auth_cipher_verify_test_case_2_oop),\n+\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n+\t\t\ttest_snow3g_auth_cipher_verify_part_digest_enc),\n+\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n+\t\t\ttest_snow3g_auth_cipher_verify_part_digest_enc_oop),\n+\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n+\t\t\ttest_snow3g_auth_cipher_verify_test_case_3_sgl),\n+\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n+\t\t\ttest_snow3g_auth_cipher_verify_test_case_3_oop_sgl),\n+\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n+\t\t\ttest_snow3g_auth_cipher_verify_part_digest_enc_sgl),\n+\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n+\t\t\ttest_snow3g_auth_cipher_verify_part_digest_enc_oop_sgl),\n \n-\t\tTEST_CASES_END() /**< NULL terminate unit test array */\n-\t}\n-};\n+\t\t/** SNOW 3G decrypt only (UEA2) */\n+\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n+\t\t\ttest_snow3g_decryption_test_case_1),\n+\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n+\t\t\ttest_snow3g_decryption_test_case_2),\n+\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n+\t\t\ttest_snow3g_decryption_test_case_3),\n+\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n+\t\t\ttest_snow3g_decryption_test_case_4),\n+\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n+\t\t\ttest_snow3g_decryption_test_case_5),\n+\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n+\t\t\ttest_snow3g_decryption_with_digest_test_case_1),\n+\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n+\t\t\ttest_snow3g_hash_generate_test_case_1),\n+\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n+\t\t\ttest_snow3g_hash_generate_test_case_2),\n+\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n+\t\t\ttest_snow3g_hash_generate_test_case_3),\n+\t\t/* Tests with buffers which length is not byte-aligned */\n+\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n+\t\t\ttest_snow3g_hash_generate_test_case_4),\n+\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n+\t\t\ttest_snow3g_hash_generate_test_case_5),\n+\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n+\t\t\ttest_snow3g_hash_generate_test_case_6),\n+\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n+\t\t\ttest_snow3g_hash_verify_test_case_1),\n+\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n+\t\t\ttest_snow3g_hash_verify_test_case_2),\n+\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n+\t\t\ttest_snow3g_hash_verify_test_case_3),\n+\t\t/* Tests with buffers which length is not byte-aligned */\n+\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n+\t\t\ttest_snow3g_hash_verify_test_case_4),\n+\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n+\t\t\ttest_snow3g_hash_verify_test_case_5),\n+\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n+\t\t\ttest_snow3g_hash_verify_test_case_6),\n+\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n+\t\t\ttest_snow3g_cipher_auth_test_case_1),\n+\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n+\t\t\ttest_snow3g_auth_cipher_with_digest_test_case_1),\n+\n+\t\t/** ZUC encrypt only (EEA3) */\n+\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n+\t\t\ttest_zuc_encryption_test_case_1),\n+\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n+\t\t\ttest_zuc_encryption_test_case_2),\n+\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n+\t\t\ttest_zuc_encryption_test_case_3),\n+\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n+\t\t\ttest_zuc_encryption_test_case_4),\n+\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n+\t\t\ttest_zuc_encryption_test_case_5),\n+\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n+\t\t\ttest_zuc_encryption_test_case_6_sgl),\n+\n+\t\t/** ZUC authenticate (EIA3) */\n+\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n+\t\t\ttest_zuc_hash_generate_test_case_1),\n+\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n+\t\t\ttest_zuc_hash_generate_test_case_2),\n+\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n+\t\t\ttest_zuc_hash_generate_test_case_3),\n+\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n+\t\t\ttest_zuc_hash_generate_test_case_4),\n+\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n+\t\t\ttest_zuc_hash_generate_test_case_5),\n+\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n+\t\t\ttest_zuc_hash_generate_test_case_6),\n+\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n+\t\t\ttest_zuc_hash_generate_test_case_7),\n+\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n+\t\t\ttest_zuc_hash_generate_test_case_8),\n+\n+\t\t/** ZUC alg-chain (EEA3/EIA3) */\n+\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n+\t\t\ttest_zuc_cipher_auth_test_case_1),\n+\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n+\t\t\ttest_zuc_cipher_auth_test_case_2),\n+\n+\t\t/** ZUC generate auth, then encrypt (EEA3) */\n+\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n+\t\t\ttest_zuc_auth_cipher_test_case_1),\n+\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n+\t\t\ttest_zuc_auth_cipher_test_case_1_oop),\n+\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n+\t\t\ttest_zuc_auth_cipher_test_case_1_sgl),\n+\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n+\t\t\ttest_zuc_auth_cipher_test_case_1_oop_sgl),\n+\n+\t\t/** ZUC decrypt (EEA3), then verify auth */\n+\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n+\t\t\ttest_zuc_auth_cipher_verify_test_case_1),\n+\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n+\t\t\ttest_zuc_auth_cipher_verify_test_case_1_oop),\n+\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n+\t\t\ttest_zuc_auth_cipher_verify_test_case_1_sgl),\n+\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n+\t\t\ttest_zuc_auth_cipher_verify_test_case_1_oop_sgl),\n+\n+\t\t/** HMAC_MD5 Authentication */\n+\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n+\t\t\ttest_MD5_HMAC_generate_case_1),\n+\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n+\t\t\ttest_MD5_HMAC_verify_case_1),\n+\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n+\t\t\ttest_MD5_HMAC_generate_case_2),\n+\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n+\t\t\ttest_MD5_HMAC_verify_case_2),\n+\n+\t\t/** KASUMI hash only (UIA1) */\n+\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n+\t\t\ttest_kasumi_hash_generate_test_case_1),\n+\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n+\t\t\ttest_kasumi_hash_generate_test_case_2),\n+\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n+\t\t\ttest_kasumi_hash_generate_test_case_3),\n+\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n+\t\t\ttest_kasumi_hash_generate_test_case_4),\n+\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n+\t\t\ttest_kasumi_hash_generate_test_case_5),\n+\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n+\t\t\ttest_kasumi_hash_generate_test_case_6),\n+\n+\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n+\t\t\ttest_kasumi_hash_verify_test_case_1),\n+\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n+\t\t\ttest_kasumi_hash_verify_test_case_2),\n+\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n+\t\t\ttest_kasumi_hash_verify_test_case_3),\n+\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n+\t\t\ttest_kasumi_hash_verify_test_case_4),\n+\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n+\t\t\ttest_kasumi_hash_verify_test_case_5),\n \n-static struct unit_test_suite cryptodev_sw_kasumi_testsuite  = {\n-\t.suite_name = \"Crypto Device SW KASUMI Unit Test Suite\",\n-\t.setup = testsuite_setup,\n-\t.teardown = testsuite_teardown,\n-\t.unit_test_cases = {\n \t\t/** KASUMI encrypt only (UEA1) */\n \t\tTEST_CASE_ST(ut_setup, ut_teardown,\n \t\t\ttest_kasumi_encryption_test_case_1),\n \t\tTEST_CASE_ST(ut_setup, ut_teardown,\n \t\t\ttest_kasumi_encryption_test_case_1_sgl),\n+\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n+\t\t\ttest_kasumi_encryption_test_case_1_oop),\n+\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n+\t\t\ttest_kasumi_encryption_test_case_1_oop_sgl),\n \t\tTEST_CASE_ST(ut_setup, ut_teardown,\n \t\t\ttest_kasumi_encryption_test_case_2),\n \t\tTEST_CASE_ST(ut_setup, ut_teardown,\n@@ -13189,6 +12022,7 @@ static struct unit_test_suite cryptodev_sw_kasumi_testsuite  = {\n \t\t\ttest_kasumi_encryption_test_case_4),\n \t\tTEST_CASE_ST(ut_setup, ut_teardown,\n \t\t\ttest_kasumi_encryption_test_case_5),\n+\n \t\t/** KASUMI decrypt only (UEA1) */\n \t\tTEST_CASE_ST(ut_setup, ut_teardown,\n \t\t\ttest_kasumi_decryption_test_case_1),\n@@ -13200,39 +12034,9 @@ static struct unit_test_suite cryptodev_sw_kasumi_testsuite  = {\n \t\t\ttest_kasumi_decryption_test_case_4),\n \t\tTEST_CASE_ST(ut_setup, ut_teardown,\n \t\t\ttest_kasumi_decryption_test_case_5),\n-\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\ttest_kasumi_encryption_test_case_1_oop),\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\ttest_kasumi_encryption_test_case_1_oop_sgl),\n-\n-\n \t\tTEST_CASE_ST(ut_setup, ut_teardown,\n \t\t\ttest_kasumi_decryption_test_case_1_oop),\n \n-\t\t/** KASUMI hash only (UIA1) */\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\ttest_kasumi_hash_generate_test_case_1),\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\ttest_kasumi_hash_generate_test_case_2),\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\ttest_kasumi_hash_generate_test_case_3),\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\ttest_kasumi_hash_generate_test_case_4),\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\ttest_kasumi_hash_generate_test_case_5),\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\ttest_kasumi_hash_generate_test_case_6),\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\ttest_kasumi_hash_verify_test_case_1),\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\ttest_kasumi_hash_verify_test_case_2),\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\ttest_kasumi_hash_verify_test_case_3),\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\ttest_kasumi_hash_verify_test_case_4),\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\ttest_kasumi_hash_verify_test_case_5),\n \t\tTEST_CASE_ST(ut_setup, ut_teardown,\n \t\t\ttest_kasumi_cipher_auth_test_case_1),\n \n@@ -13259,152 +12063,144 @@ static struct unit_test_suite cryptodev_sw_kasumi_testsuite  = {\n \t\t\ttest_kasumi_auth_cipher_verify_test_case_2_sgl),\n \t\tTEST_CASE_ST(ut_setup, ut_teardown,\n \t\t\ttest_kasumi_auth_cipher_verify_test_case_2_oop_sgl),\n-\t\tTEST_CASES_END() /**< NULL terminate unit test array */\n-\t}\n-};\n-static struct unit_test_suite cryptodev_sw_snow3g_testsuite  = {\n-\t.suite_name = \"Crypto Device SW SNOW 3G Unit Test Suite\",\n-\t.setup = testsuite_setup,\n-\t.teardown = testsuite_teardown,\n-\t.unit_test_cases = {\n-\t\t/** SNOW 3G encrypt only (UEA2) */\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\ttest_snow3g_encryption_test_case_1),\n+\n+\t\t/** ESN Testcase */\n \t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\ttest_snow3g_encryption_test_case_2),\n+\t\t\tauth_encrypt_AES128CBC_HMAC_SHA1_esn_check),\n \t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\ttest_snow3g_encryption_test_case_3),\n+\t\t\tauth_decrypt_AES128CBC_HMAC_SHA1_esn_check),\n+\n+\t\t/** Negative tests */\n \t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\ttest_snow3g_encryption_test_case_4),\n+\t\t\tauthentication_verify_HMAC_SHA1_fail_data_corrupt),\n \t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\ttest_snow3g_encryption_test_case_5),\n+\t\t\tauthentication_verify_HMAC_SHA1_fail_tag_corrupt),\n \t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\ttest_snow3g_auth_cipher_with_digest_test_case_1),\n-\n+\t\t\ttest_AES_GCM_auth_encryption_fail_iv_corrupt),\n \t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\ttest_snow3g_encryption_test_case_1_oop),\n+\t\t\ttest_AES_GCM_auth_encryption_fail_in_data_corrupt),\n \t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\t\ttest_snow3g_encryption_test_case_1_oop_sgl),\n+\t\t\ttest_AES_GCM_auth_encryption_fail_out_data_corrupt),\n \t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\ttest_snow3g_decryption_test_case_1_oop),\n-\n+\t\t\ttest_AES_GCM_auth_encryption_fail_aad_len_corrupt),\n \t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\ttest_snow3g_encryption_test_case_1_offset_oop),\n-\n-\t\t/** SNOW 3G decrypt only (UEA2) */\n+\t\t\ttest_AES_GCM_auth_encryption_fail_aad_corrupt),\n \t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\ttest_snow3g_decryption_test_case_1),\n+\t\t\ttest_AES_GCM_auth_encryption_fail_tag_corrupt),\n \t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\ttest_snow3g_decryption_test_case_2),\n+\t\t\ttest_AES_GCM_auth_decryption_fail_iv_corrupt),\n \t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\ttest_snow3g_decryption_test_case_3),\n+\t\t\ttest_AES_GCM_auth_decryption_fail_in_data_corrupt),\n \t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\ttest_snow3g_decryption_test_case_4),\n+\t\t\ttest_AES_GCM_auth_decryption_fail_out_data_corrupt),\n \t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\ttest_snow3g_decryption_test_case_5),\n+\t\t\ttest_AES_GCM_auth_decryption_fail_aad_len_corrupt),\n \t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\ttest_snow3g_decryption_with_digest_test_case_1),\n+\t\t\ttest_AES_GCM_auth_decryption_fail_aad_corrupt),\n \t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\ttest_snow3g_hash_generate_test_case_1),\n+\t\t\ttest_AES_GCM_auth_decryption_fail_tag_corrupt),\n \t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\ttest_snow3g_hash_generate_test_case_2),\n+\t\t\tauthentication_verify_AES128_GMAC_fail_data_corrupt),\n \t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\ttest_snow3g_hash_generate_test_case_3),\n-\t\t/* Tests with buffers which length is not byte-aligned */\n+\t\t\tauthentication_verify_AES128_GMAC_fail_tag_corrupt),\n \t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\ttest_snow3g_hash_generate_test_case_4),\n+\t\t\tauth_decryption_AES128CBC_HMAC_SHA1_fail_data_corrupt),\n \t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\ttest_snow3g_hash_generate_test_case_5),\n+\t\t\tauth_decryption_AES128CBC_HMAC_SHA1_fail_tag_corrupt),\n+\n+\t\t/** Mixed CIPHER + HASH algorithms */\n+\t\t/** AUTH AES CMAC + CIPHER AES CTR */\n \t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\ttest_snow3g_hash_generate_test_case_6),\n+\t\t\ttest_aes_cmac_aes_ctr_digest_enc_test_case_1),\n \t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\ttest_snow3g_hash_verify_test_case_1),\n+\t\t\ttest_aes_cmac_aes_ctr_digest_enc_test_case_1_oop),\n \t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\ttest_snow3g_hash_verify_test_case_2),\n+\t\t\ttest_aes_cmac_aes_ctr_digest_enc_test_case_1_sgl),\n \t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\ttest_snow3g_hash_verify_test_case_3),\n-\t\t/* Tests with buffers which length is not byte-aligned */\n+\t\t\ttest_aes_cmac_aes_ctr_digest_enc_test_case_1_oop_sgl),\n \t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\ttest_snow3g_hash_verify_test_case_4),\n+\t\t\ttest_verify_aes_cmac_aes_ctr_digest_enc_test_case_1),\n \t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\ttest_snow3g_hash_verify_test_case_5),\n+\t\t       test_verify_aes_cmac_aes_ctr_digest_enc_test_case_1_oop),\n \t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\ttest_snow3g_hash_verify_test_case_6),\n+\t\t       test_verify_aes_cmac_aes_ctr_digest_enc_test_case_1_sgl),\n \t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\ttest_snow3g_cipher_auth_test_case_1),\n+\t\t   test_verify_aes_cmac_aes_ctr_digest_enc_test_case_1_oop_sgl),\n \n-\t\t/** SNOW 3G generate auth, then encrypt (UEA2) */\n+\t\t/** AUTH ZUC + CIPHER SNOW3G */\n \t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\ttest_snow3g_auth_cipher_test_case_1),\n+\t\t\ttest_auth_zuc_cipher_snow_test_case_1),\n \t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\ttest_snow3g_auth_cipher_test_case_2),\n+\t\t\ttest_verify_auth_zuc_cipher_snow_test_case_1),\n+\t\t/** AUTH AES CMAC + CIPHER SNOW3G */\n \t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\ttest_snow3g_auth_cipher_test_case_2_oop),\n+\t\t\ttest_auth_aes_cmac_cipher_snow_test_case_1),\n \t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\ttest_snow3g_auth_cipher_part_digest_enc),\n+\t\t\ttest_verify_auth_aes_cmac_cipher_snow_test_case_1),\n+\t\t/** AUTH ZUC + CIPHER AES CTR */\n \t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\ttest_snow3g_auth_cipher_part_digest_enc_oop),\n+\t\t\ttest_auth_zuc_cipher_aes_ctr_test_case_1),\n \t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\ttest_snow3g_auth_cipher_test_case_3_sgl),\n+\t\t\ttest_verify_auth_zuc_cipher_aes_ctr_test_case_1),\n+\t\t/** AUTH SNOW3G + CIPHER AES CTR */\n \t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\ttest_snow3g_auth_cipher_test_case_3_oop_sgl),\n+\t\t\ttest_auth_snow_cipher_aes_ctr_test_case_1),\n \t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\ttest_snow3g_auth_cipher_part_digest_enc_sgl),\n+\t\t\ttest_verify_auth_snow_cipher_aes_ctr_test_case_1),\n+\t\t/** AUTH SNOW3G + CIPHER ZUC */\n \t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\ttest_snow3g_auth_cipher_part_digest_enc_oop_sgl),\n+\t\t\ttest_auth_snow_cipher_zuc_test_case_1),\n+\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n+\t\t\ttest_verify_auth_snow_cipher_zuc_test_case_1),\n+\t\t/** AUTH AES CMAC + CIPHER ZUC */\n+\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n+\t\t\ttest_auth_aes_cmac_cipher_zuc_test_case_1),\n+\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n+\t\t\ttest_verify_auth_aes_cmac_cipher_zuc_test_case_1),\n \n-\t\t/** SNOW 3G decrypt (UEA2), then verify auth */\n+\t\t/** AUTH NULL + CIPHER SNOW3G */\n \t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\ttest_snow3g_auth_cipher_verify_test_case_1),\n+\t\t\ttest_auth_null_cipher_snow_test_case_1),\n \t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\ttest_snow3g_auth_cipher_verify_test_case_2),\n+\t\t\ttest_verify_auth_null_cipher_snow_test_case_1),\n+\t\t/** AUTH NULL + CIPHER ZUC */\n \t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\ttest_snow3g_auth_cipher_verify_test_case_2_oop),\n+\t\t\ttest_auth_null_cipher_zuc_test_case_1),\n \t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\ttest_snow3g_auth_cipher_verify_part_digest_enc),\n+\t\t\ttest_verify_auth_null_cipher_zuc_test_case_1),\n+\t\t/** AUTH SNOW3G + CIPHER NULL */\n \t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\ttest_snow3g_auth_cipher_verify_part_digest_enc_oop),\n+\t\t\ttest_auth_snow_cipher_null_test_case_1),\n \t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\ttest_snow3g_auth_cipher_verify_test_case_3_sgl),\n+\t\t\ttest_verify_auth_snow_cipher_null_test_case_1),\n+\t\t/** AUTH ZUC + CIPHER NULL */\n \t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\ttest_snow3g_auth_cipher_verify_test_case_3_oop_sgl),\n+\t\t\ttest_auth_zuc_cipher_null_test_case_1),\n \t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\ttest_snow3g_auth_cipher_verify_part_digest_enc_sgl),\n+\t\t\ttest_verify_auth_zuc_cipher_null_test_case_1),\n+\t\t/** AUTH NULL + CIPHER AES CTR */\n \t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\ttest_snow3g_auth_cipher_verify_part_digest_enc_oop_sgl),\n+\t\t\ttest_auth_null_cipher_aes_ctr_test_case_1),\n+\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n+\t\t\ttest_verify_auth_null_cipher_aes_ctr_test_case_1),\n+\t\t/** AUTH AES CMAC + CIPHER NULL */\n+\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n+\t\t\ttest_auth_aes_cmac_cipher_null_test_case_1),\n+\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n+\t\t\ttest_verify_auth_aes_cmac_cipher_null_test_case_1),\n \n \t\tTEST_CASES_END() /**< NULL terminate unit test array */\n \t}\n };\n \n-static struct unit_test_suite cryptodev_sw_zuc_testsuite  = {\n-\t.suite_name = \"Crypto Device SW ZUC Unit Test Suite\",\n+static struct unit_test_suite cryptodev_virtio_testsuite = {\n+\t.suite_name = \"Crypto VIRTIO Unit Test Suite\",\n \t.setup = testsuite_setup,\n \t.teardown = testsuite_teardown,\n \t.unit_test_cases = {\n-\t\t/** ZUC encrypt only (EEA3) */\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\ttest_zuc_encryption_test_case_1),\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\ttest_zuc_encryption_test_case_2),\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\ttest_zuc_encryption_test_case_3),\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\ttest_zuc_encryption_test_case_4),\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\ttest_zuc_encryption_test_case_5),\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\ttest_zuc_hash_generate_test_case_1),\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\ttest_zuc_hash_generate_test_case_2),\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\ttest_zuc_hash_generate_test_case_3),\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\ttest_zuc_hash_generate_test_case_4),\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\ttest_zuc_hash_generate_test_case_5),\n \t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\ttest_zuc_encryption_test_case_6_sgl),\n+\t\t\t\ttest_AES_cipheronly_all),\n+\n \t\tTEST_CASES_END() /**< NULL terminate unit test array */\n \t}\n };\n@@ -13419,16 +12215,11 @@ static struct unit_test_suite cryptodev_caam_jr_testsuite  = {\n \t\tTEST_CASE_ST(ut_setup, ut_teardown,\n \t\t\t     test_multi_session),\n \n-\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\t     test_AES_chain_caam_jr_all),\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\t     test_3DES_chain_caam_jr_all),\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\t     test_AES_cipheronly_caam_jr_all),\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\t     test_3DES_cipheronly_caam_jr_all),\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\t     test_authonly_caam_jr_all),\n+\t\tTEST_CASE_ST(ut_setup, ut_teardown, test_AES_chain_all),\n+\t\tTEST_CASE_ST(ut_setup, ut_teardown, test_3DES_chain_all),\n+\t\tTEST_CASE_ST(ut_setup, ut_teardown, test_AES_cipheronly_all),\n+\t\tTEST_CASE_ST(ut_setup, ut_teardown, test_3DES_cipheronly_all),\n+\t\tTEST_CASE_ST(ut_setup, ut_teardown, test_authonly_all),\n \n \t\tTEST_CASES_END() /**< NULL terminate unit test array */\n \t}\n@@ -13444,16 +12235,11 @@ static struct unit_test_suite cryptodev_dpaa_sec_testsuite  = {\n \t\tTEST_CASE_ST(ut_setup, ut_teardown,\n \t\t\t     test_multi_session),\n \n-\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\t     test_AES_chain_dpaa_sec_all),\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\t     test_3DES_chain_dpaa_sec_all),\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\t     test_AES_cipheronly_dpaa_sec_all),\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\t     test_3DES_cipheronly_dpaa_sec_all),\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\t     test_authonly_dpaa_sec_all),\n+\t\tTEST_CASE_ST(ut_setup, ut_teardown, test_AES_chain_all),\n+\t\tTEST_CASE_ST(ut_setup, ut_teardown, test_3DES_chain_all),\n+\t\tTEST_CASE_ST(ut_setup, ut_teardown, test_AES_cipheronly_all),\n+\t\tTEST_CASE_ST(ut_setup, ut_teardown, test_3DES_cipheronly_all),\n+\t\tTEST_CASE_ST(ut_setup, ut_teardown, test_authonly_all),\n \n #ifdef RTE_LIBRTE_SECURITY\n \t\tTEST_CASE_ST(ut_setup, ut_teardown,\n@@ -13708,16 +12494,11 @@ static struct unit_test_suite cryptodev_dpaa2_sec_testsuite  = {\n \t\t\ttest_device_configure_invalid_dev_id),\n \t\tTEST_CASE_ST(ut_setup, ut_teardown,\n \t\t\ttest_multi_session),\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\ttest_AES_chain_dpaa2_sec_all),\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\ttest_3DES_chain_dpaa2_sec_all),\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\ttest_AES_cipheronly_dpaa2_sec_all),\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\ttest_3DES_cipheronly_dpaa2_sec_all),\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\ttest_authonly_dpaa2_sec_all),\n+\t\tTEST_CASE_ST(ut_setup, ut_teardown, test_AES_chain_all),\n+\t\tTEST_CASE_ST(ut_setup, ut_teardown, test_3DES_chain_all),\n+\t\tTEST_CASE_ST(ut_setup, ut_teardown, test_AES_cipheronly_all),\n+\t\tTEST_CASE_ST(ut_setup, ut_teardown, test_3DES_cipheronly_all),\n+\t\tTEST_CASE_ST(ut_setup, ut_teardown, test_authonly_all),\n \n #ifdef RTE_LIBRTE_SECURITY\n \t\tTEST_CASE_ST(ut_setup, ut_teardown,\n@@ -13974,32 +12755,12 @@ static struct unit_test_suite cryptodev_dpaa2_sec_testsuite  = {\n \t}\n };\n \n-static struct unit_test_suite cryptodev_null_testsuite  = {\n-\t.suite_name = \"Crypto Device NULL Unit Test Suite\",\n-\t.setup = testsuite_setup,\n-\t.teardown = testsuite_teardown,\n-\t.unit_test_cases = {\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\ttest_null_invalid_operation),\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\ttest_null_burst_operation),\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\ttest_AES_chain_null_all),\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\ttest_AES_cipheronly_null_all),\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\t\ttest_authonly_null_all),\n-\n-\t\tTEST_CASES_END() /**< NULL terminate unit test array */\n-\t}\n-};\n-\n static struct unit_test_suite cryptodev_armv8_testsuite  = {\n \t.suite_name = \"Crypto Device ARMv8 Unit Test Suite\",\n \t.setup = testsuite_setup,\n \t.teardown = testsuite_teardown,\n \t.unit_test_cases = {\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown, test_AES_chain_armv8_all),\n+\t\tTEST_CASE_ST(ut_setup, ut_teardown, test_AES_chain_all),\n \n \t\t/** Negative tests */\n \t\tTEST_CASE_ST(ut_setup, ut_teardown,\n@@ -14019,16 +12780,11 @@ static struct unit_test_suite cryptodev_mrvl_testsuite  = {\n \t\tTEST_CASE_ST(ut_setup, ut_teardown, test_multi_session),\n \t\tTEST_CASE_ST(ut_setup, ut_teardown,\n \t\t\t\ttest_multi_session_random_usage),\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\t\ttest_AES_chain_mrvl_all),\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\t\ttest_AES_cipheronly_mrvl_all),\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\t\ttest_authonly_mrvl_all),\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\t\ttest_3DES_chain_mrvl_all),\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\t\ttest_3DES_cipheronly_mrvl_all),\n+\t\tTEST_CASE_ST(ut_setup, ut_teardown, test_AES_chain_all),\n+\t\tTEST_CASE_ST(ut_setup, ut_teardown, test_AES_cipheronly_all),\n+\t\tTEST_CASE_ST(ut_setup, ut_teardown, test_authonly_all),\n+\t\tTEST_CASE_ST(ut_setup, ut_teardown, test_3DES_chain_all),\n+\t\tTEST_CASE_ST(ut_setup, ut_teardown, test_3DES_cipheronly_all),\n \n \t\t/** Negative tests */\n \t\tTEST_CASE_ST(ut_setup, ut_teardown,\n@@ -14052,16 +12808,11 @@ static struct unit_test_suite cryptodev_ccp_testsuite  = {\n \t\tTEST_CASE_ST(ut_setup, ut_teardown, test_multi_session),\n \t\tTEST_CASE_ST(ut_setup, ut_teardown,\n \t\t\t\ttest_multi_session_random_usage),\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\t\ttest_AES_chain_ccp_all),\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\t\ttest_AES_cipheronly_ccp_all),\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\t\ttest_3DES_chain_ccp_all),\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\t\ttest_3DES_cipheronly_ccp_all),\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\t\ttest_authonly_ccp_all),\n+\t\tTEST_CASE_ST(ut_setup, ut_teardown, test_AES_chain_all),\n+\t\tTEST_CASE_ST(ut_setup, ut_teardown, test_AES_cipheronly_all),\n+\t\tTEST_CASE_ST(ut_setup, ut_teardown, test_3DES_chain_all),\n+\t\tTEST_CASE_ST(ut_setup, ut_teardown, test_3DES_cipheronly_all),\n+\t\tTEST_CASE_ST(ut_setup, ut_teardown, test_authonly_all),\n \n \t\t/** Negative tests */\n \t\tTEST_CASE_ST(ut_setup, ut_teardown,\n@@ -14082,16 +12833,11 @@ static struct unit_test_suite cryptodev_octeontx_testsuite  = {\n \t.setup = testsuite_setup,\n \t.teardown = testsuite_teardown,\n \t.unit_test_cases = {\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\ttest_AES_chain_octeontx_all),\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\ttest_AES_cipheronly_octeontx_all),\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\ttest_3DES_chain_octeontx_all),\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\ttest_3DES_cipheronly_octeontx_all),\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\ttest_authonly_octeontx_all),\n+\t\tTEST_CASE_ST(ut_setup, ut_teardown, test_AES_chain_all),\n+\t\tTEST_CASE_ST(ut_setup, ut_teardown, test_AES_cipheronly_all),\n+\t\tTEST_CASE_ST(ut_setup, ut_teardown, test_3DES_chain_all),\n+\t\tTEST_CASE_ST(ut_setup, ut_teardown, test_3DES_cipheronly_all),\n+\t\tTEST_CASE_ST(ut_setup, ut_teardown, test_authonly_all),\n \n \t\t/** AES GCM Authenticated Encryption */\n \t\tTEST_CASE_ST(ut_setup, ut_teardown,\n@@ -14299,7 +13045,7 @@ static struct unit_test_suite cryptodev_nitrox_testsuite  = {\n \t\tTEST_CASE_ST(ut_setup, ut_teardown,\n \t\t\t\ttest_device_configure_invalid_queue_pair_ids),\n \t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\t     test_AES_chain_nitrox_all),\n+\t\t\t     test_AES_chain_all),\n \n \t\tTEST_CASES_END() /**< NULL terminate unit test array */\n \t}\n@@ -14310,16 +13056,11 @@ static struct unit_test_suite cryptodev_octeontx2_testsuite  = {\n \t.setup = testsuite_setup,\n \t.teardown = testsuite_teardown,\n \t.unit_test_cases = {\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\ttest_AES_chain_octeontx2_all),\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\ttest_AES_cipheronly_octeontx2_all),\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\ttest_3DES_chain_octeontx2_all),\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\ttest_3DES_cipheronly_octeontx2_all),\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\ttest_authonly_octeontx2_all),\n+\t\tTEST_CASE_ST(ut_setup, ut_teardown, test_AES_chain_all),\n+\t\tTEST_CASE_ST(ut_setup, ut_teardown, test_AES_cipheronly_all),\n+\t\tTEST_CASE_ST(ut_setup, ut_teardown, test_3DES_chain_all),\n+\t\tTEST_CASE_ST(ut_setup, ut_teardown, test_3DES_cipheronly_all),\n+\t\tTEST_CASE_ST(ut_setup, ut_teardown, test_authonly_all),\n \n \t\t/** AES GCM Authenticated Encryption */\n \t\tTEST_CASE_ST(ut_setup, ut_teardown,\n@@ -14530,7 +13271,7 @@ test_cryptodev_qat(void /*argv __rte_unused, int argc __rte_unused*/)\n \t\treturn TEST_SKIPPED;\n \t}\n \n-\treturn unit_test_suite_runner(&cryptodev_qat_testsuite);\n+\treturn unit_test_suite_runner(&cryptodev_testsuite);\n }\n \n static int\n@@ -14562,7 +13303,7 @@ test_cryptodev_aesni_mb(void /*argv __rte_unused, int argc __rte_unused*/)\n \t\treturn TEST_SKIPPED;\n \t}\n \n-\treturn unit_test_suite_runner(&cryptodev_aesni_mb_testsuite);\n+\treturn unit_test_suite_runner(&cryptodev_testsuite);\n }\n \n static int\n@@ -14578,7 +13319,7 @@ test_cryptodev_openssl(void)\n \t\treturn TEST_SKIPPED;\n \t}\n \n-\treturn unit_test_suite_runner(&cryptodev_openssl_testsuite);\n+\treturn unit_test_suite_runner(&cryptodev_testsuite);\n }\n \n static int\n@@ -14594,7 +13335,7 @@ test_cryptodev_aesni_gcm(void)\n \t\treturn TEST_SKIPPED;\n \t}\n \n-\treturn unit_test_suite_runner(&cryptodev_aesni_gcm_testsuite);\n+\treturn unit_test_suite_runner(&cryptodev_testsuite);\n }\n \n static int\n@@ -14610,7 +13351,7 @@ test_cryptodev_null(void)\n \t\treturn TEST_SKIPPED;\n \t}\n \n-\treturn unit_test_suite_runner(&cryptodev_null_testsuite);\n+\treturn unit_test_suite_runner(&cryptodev_testsuite);\n }\n \n static int\n@@ -14626,7 +13367,7 @@ test_cryptodev_sw_snow3g(void /*argv __rte_unused, int argc __rte_unused*/)\n \t\treturn TEST_SKIPPED;\n \t}\n \n-\treturn unit_test_suite_runner(&cryptodev_sw_snow3g_testsuite);\n+\treturn unit_test_suite_runner(&cryptodev_testsuite);\n }\n \n static int\n@@ -14642,7 +13383,7 @@ test_cryptodev_sw_kasumi(void /*argv __rte_unused, int argc __rte_unused*/)\n \t\treturn TEST_SKIPPED;\n \t}\n \n-\treturn unit_test_suite_runner(&cryptodev_sw_kasumi_testsuite);\n+\treturn unit_test_suite_runner(&cryptodev_testsuite);\n }\n \n static int\n@@ -14658,7 +13399,7 @@ test_cryptodev_sw_zuc(void /*argv __rte_unused, int argc __rte_unused*/)\n \t\treturn TEST_SKIPPED;\n \t}\n \n-\treturn unit_test_suite_runner(&cryptodev_sw_zuc_testsuite);\n+\treturn unit_test_suite_runner(&cryptodev_testsuite);\n }\n \n static int\ndiff --git a/app/test/test_cryptodev_blockcipher.c b/app/test/test_cryptodev_blockcipher.c\nindex 5bfe2d009..2ff7fc91b 100644\n--- a/app/test/test_cryptodev_blockcipher.c\n+++ b/app/test/test_cryptodev_blockcipher.c\n@@ -804,7 +804,7 @@ test_blockcipher_all_tests(struct rte_mempool *mbuf_pool,\n \telse if (driver_id == nitrox_pmd)\n \t\ttarget_pmd_mask = BLOCKCIPHER_TEST_TARGET_PMD_NITROX;\n \telse\n-\t\tTEST_ASSERT(0, \"Unrecognized cryptodev type\");\n+\t\treturn -ENOTSUP; /* Unrecognized cryptodev type */\n \n \tfor (i = 0; i < n_test_cases; i++) {\n \t\tconst struct blockcipher_test_case *tc = &tcs[i];\ndiff --git a/app/test/test_cryptodev_des_test_vectors.h b/app/test/test_cryptodev_des_test_vectors.h\nindex 9d2d0e77f..0a362d980 100644\n--- a/app/test/test_cryptodev_des_test_vectors.h\n+++ b/app/test/test_cryptodev_des_test_vectors.h\n@@ -1208,8 +1208,7 @@ static const struct blockcipher_test_case triple_des_chain_test_cases[] = {\n \t\t\tBLOCKCIPHER_TEST_TARGET_PMD_QAT |\n \t\t\tBLOCKCIPHER_TEST_TARGET_PMD_DPAA2_SEC |\n \t\t\tBLOCKCIPHER_TEST_TARGET_PMD_DPAA_SEC |\n-\t\t\tBLOCKCIPHER_TEST_TARGET_PMD_CAAM_JR |\n-\t\t\tBLOCKCIPHER_TEST_TARGET_PMD_MB\n+\t\t\tBLOCKCIPHER_TEST_TARGET_PMD_CAAM_JR\n \t},\n \t{\n \t\t.test_descr = \"3DES-128-CBC HMAC-SHA1 Decryption Digest\"\n@@ -1221,8 +1220,7 @@ static const struct blockcipher_test_case triple_des_chain_test_cases[] = {\n \t\t\tBLOCKCIPHER_TEST_TARGET_PMD_QAT |\n \t\t\tBLOCKCIPHER_TEST_TARGET_PMD_DPAA2_SEC |\n \t\t\tBLOCKCIPHER_TEST_TARGET_PMD_DPAA_SEC |\n-\t\t\tBLOCKCIPHER_TEST_TARGET_PMD_CAAM_JR |\n-\t\t\tBLOCKCIPHER_TEST_TARGET_PMD_MB\n+\t\t\tBLOCKCIPHER_TEST_TARGET_PMD_CAAM_JR\n \t},\n \t{\n \t\t.test_descr = \"3DES-128-CBC HMAC-SHA1 Encryption Digest\"\n",
    "prefixes": [
        "1/1"
    ]
}