get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

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

{
    "id": 49158,
    "url": "http://patches.dpdk.org/api/patches/49158/?format=api",
    "web_url": "http://patches.dpdk.org/project/dpdk/patch/20181219233904.14794-1-roy.fan.zhang@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": "<20181219233904.14794-1-roy.fan.zhang@intel.com>",
    "list_archive_url": "https://inbox.dpdk.org/dev/20181219233904.14794-1-roy.fan.zhang@intel.com",
    "date": "2018-12-19T23:39:04",
    "name": "[v2] examples/fips_validate: add power on self test",
    "commit_ref": null,
    "pull_url": null,
    "state": "accepted",
    "archived": true,
    "hash": "f5f3868a87d973ccc0081f0ec4b4cf3e1bdc465e",
    "submitter": {
        "id": 304,
        "url": "http://patches.dpdk.org/api/people/304/?format=api",
        "name": "Fan Zhang",
        "email": "roy.fan.zhang@intel.com"
    },
    "delegate": {
        "id": 6690,
        "url": "http://patches.dpdk.org/api/users/6690/?format=api",
        "username": "akhil",
        "first_name": "akhil",
        "last_name": "goyal",
        "email": "gakhil@marvell.com"
    },
    "mbox": "http://patches.dpdk.org/project/dpdk/patch/20181219233904.14794-1-roy.fan.zhang@intel.com/mbox/",
    "series": [
        {
            "id": 2885,
            "url": "http://patches.dpdk.org/api/series/2885/?format=api",
            "web_url": "http://patches.dpdk.org/project/dpdk/list/?series=2885",
            "date": "2018-12-19T23:39:04",
            "name": "[v2] examples/fips_validate: add power on self test",
            "version": 2,
            "mbox": "http://patches.dpdk.org/series/2885/mbox/"
        }
    ],
    "comments": "http://patches.dpdk.org/api/patches/49158/comments/",
    "check": "warning",
    "checks": "http://patches.dpdk.org/api/patches/49158/checks/",
    "tags": {},
    "related": [],
    "headers": {
        "Return-Path": "<dev-bounces@dpdk.org>",
        "X-Original-To": "patchwork@dpdk.org",
        "Delivered-To": "patchwork@dpdk.org",
        "Received": [
            "from [92.243.14.124] (localhost [127.0.0.1])\n\tby dpdk.org (Postfix) with ESMTP id 5E1411B911;\n\tThu, 20 Dec 2018 00:39:10 +0100 (CET)",
            "from mga18.intel.com (mga18.intel.com [134.134.136.126])\n\tby dpdk.org (Postfix) with ESMTP id 226FB1B911\n\tfor <dev@dpdk.org>; Thu, 20 Dec 2018 00:39:07 +0100 (CET)",
            "from orsmga005.jf.intel.com ([10.7.209.41])\n\tby orsmga106.jf.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384;\n\t19 Dec 2018 15:39:07 -0800",
            "from silpixa00398673.ir.intel.com (HELO\n\tsilpixa00398673.ger.corp.intel.com) ([10.237.223.54])\n\tby orsmga005.jf.intel.com with ESMTP; 19 Dec 2018 15:39:05 -0800"
        ],
        "X-Amp-Result": "SKIPPED(no attachment in message)",
        "X-Amp-File-Uploaded": "False",
        "X-ExtLoop1": "1",
        "X-IronPort-AV": "E=Sophos;i=\"5.56,374,1539673200\"; d=\"scan'208\";a=\"285132625\"",
        "From": "Fan Zhang <roy.fan.zhang@intel.com>",
        "To": "dev@dpdk.org",
        "Cc": "akhil.goyal@nxp.com",
        "Date": "Wed, 19 Dec 2018 23:39:04 +0000",
        "Message-Id": "<20181219233904.14794-1-roy.fan.zhang@intel.com>",
        "X-Mailer": "git-send-email 2.13.6",
        "In-Reply-To": "<20181115172403.67493-1-roy.fan.zhang@intel.com>",
        "References": "<20181115172403.67493-1-roy.fan.zhang@intel.com>",
        "Subject": "[dpdk-dev] [PATCH v2] examples/fips_validate: add power on self test",
        "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\t<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\t<mailto:dev-request@dpdk.org?subject=subscribe>",
        "Errors-To": "dev-bounces@dpdk.org",
        "Sender": "\"dev\" <dev-bounces@dpdk.org>"
    },
    "content": "This patch adds a sample power on self-test to fips_validate\nsample application.\n\nSigned-off-by: Fan Zhang <roy.fan.zhang@intel.com>\nAcked-by: Damian Nowak <damianx.nowak@intel.com>\n---\nv2:\n- fixed clang build error.\n\n examples/fips_validation/Makefile             |    1 +\n examples/fips_validation/fips_dev_self_test.c | 1680 +++++++++++++++++++++++++\n examples/fips_validation/fips_dev_self_test.h |   25 +\n examples/fips_validation/main.c               |   82 +-\n examples/fips_validation/meson.build          |    1 +\n 5 files changed, 1787 insertions(+), 2 deletions(-)\n create mode 100644 examples/fips_validation/fips_dev_self_test.c\n create mode 100644 examples/fips_validation/fips_dev_self_test.h",
    "diff": "diff --git a/examples/fips_validation/Makefile b/examples/fips_validation/Makefile\nindex 7b1fe34a6..a7170d809 100644\n--- a/examples/fips_validation/Makefile\n+++ b/examples/fips_validation/Makefile\n@@ -12,6 +12,7 @@ SRCS-y += fips_validation_tdes.c\n SRCS-y += fips_validation_gcm.c\n SRCS-y += fips_validation_cmac.c\n SRCS-y += fips_validation_ccm.c\n+SRCS-y += fips_dev_self_test.c\n SRCS-y += main.c\n \n # Build using pkg-config variables if possible\ndiff --git a/examples/fips_validation/fips_dev_self_test.c b/examples/fips_validation/fips_dev_self_test.c\nnew file mode 100644\nindex 000000000..bc7fc5561\n--- /dev/null\n+++ b/examples/fips_validation/fips_dev_self_test.c\n@@ -0,0 +1,1680 @@\n+/* SPDX-License-Identifier: BSD-3-Clause\n+ * Copyright(c) 2018 Intel Corporation\n+ */\n+\n+#include <rte_cryptodev.h>\n+#include <rte_cryptodev_pmd.h>\n+\n+#include \"fips_dev_self_test.h\"\n+\n+#define IV_OFF (sizeof(struct rte_crypto_op) + sizeof(struct rte_crypto_sym_op))\n+\n+#define FIPS_DEV_TEST_DATA_MAX_SIZE\t8096\n+\n+struct fips_dev_self_test_vector {\n+\tconst char *name;\n+\tenum rte_crypto_sym_xform_type operation_type;\n+\n+\tstruct {\n+\t\tuint8_t data[64];\n+\t\tuint16_t len;\n+\t} digest;\n+\n+\tstruct {\n+\t\tuint8_t data[256];\n+\t\tuint16_t len;\n+\t} key;\n+\n+\tstruct {\n+\t\tuint8_t data[16];\n+\t\tuint8_t len;\n+\t} iv;\n+\n+\tunion {\n+\t\tstruct {\n+\t\t\tenum rte_crypto_cipher_algorithm algo;\n+\t\t} cipher;\n+\n+\t\tstruct {\n+\t\t\tenum rte_crypto_aead_algorithm algo;\n+\t\t\tstruct {\n+\t\t\t\tuint8_t data[FIPS_DEV_TEST_DATA_MAX_SIZE];\n+\t\t\t\tuint16_t len;\n+\t\t\t} aad;\n+\t\t} aead;\n+\n+\t\tstruct {\n+\t\t\tenum rte_crypto_auth_algorithm algo;\n+\t\t} auth;\n+\t};\n+\n+\tstruct {\n+\t\tconst uint8_t data[FIPS_DEV_TEST_DATA_MAX_SIZE];\n+\t\tuint16_t len;\n+\t} input;\n+\n+\tstruct {\n+\t\tuint8_t data[FIPS_DEV_TEST_DATA_MAX_SIZE];\n+\t\tuint16_t len;\n+\t} output;\n+};\n+\n+#define GET_MBUF_DATA(data, len, m)\t\t\t\\\n+do {\t\t\t\t\t\t\t\\\n+\tlen = rte_pktmbuf_pkt_len(m);\t\t\t\\\n+\tdata = rte_pktmbuf_mtod(m, uint8_t *);\t\t\\\n+} while (0)\n+\n+\n+/* <-- SHA-x HMAC --> */\n+static struct fips_dev_self_test_vector\n+SELF_TEST_SHA1_HMAC_test_vector = {\n+\t\t.name = \"SELF_TEST_SHA1_HMAC_test_vector\",\n+\t\t.operation_type = RTE_CRYPTO_SYM_XFORM_AUTH,\n+\n+\t\t.auth = {\n+\t\t\t.algo = RTE_CRYPTO_AUTH_SHA1_HMAC,\n+\t\t},\n+\t\t.input = {\n+\t\t\t.data = {\n+\t\t\t\t0xed, 0xb2, 0xba, 0x09, 0x99, 0x61, 0xd3, 0x8f,\n+\t\t\t\t0xd0, 0xa0, 0xa6, 0xa2, 0x35, 0xd6, 0x12, 0x71,\n+\t\t\t\t0xcb, 0x4d, 0x49, 0x3b, 0x64, 0xd9, 0xde, 0x13,\n+\t\t\t\t0x5c, 0xbb, 0x1f, 0xe0, 0x86, 0xc4, 0xa4, 0xa7,\n+\t\t\t\t0x67, 0xbe, 0x28, 0x0d, 0xa2, 0x07, 0x98, 0x17,\n+\t\t\t\t0xb4, 0x7f, 0x6a, 0x35, 0xe1, 0xa4, 0x30, 0x7f,\n+\t\t\t\t0x6e, 0xfc, 0x6d, 0x3e, 0x11, 0xb4, 0xa7, 0xae,\n+\t\t\t\t0xa6, 0x86, 0xbd, 0x02, 0x23, 0xe0, 0x7b, 0xa9,\n+\t\t\t\t0xce, 0x42, 0x6c, 0xd0, 0xae, 0xe7, 0xef, 0x28,\n+\t\t\t\t0x3f, 0xa9, 0x8d, 0xe9, 0x6a, 0x1f, 0x8a, 0x17,\n+\t\t\t\t0xb3, 0x08, 0xba, 0x04, 0xb5, 0xec, 0x96, 0x16,\n+\t\t\t\t0xcb, 0x00, 0x8f, 0xca, 0x11, 0x4b, 0xa3, 0xf9,\n+\t\t\t\t0x8b, 0x07, 0x2d, 0x5a, 0xa3, 0x4a, 0x01, 0x49,\n+\t\t\t\t0xd9, 0xe5, 0xb8, 0xc6, 0xb6, 0x8c, 0x49, 0xc1,\n+\t\t\t\t0x01, 0x38, 0xda, 0x95, 0x36, 0xca, 0xd5, 0xd2,\n+\t\t\t\t0x34, 0xf1, 0x3d, 0x3f, 0x36, 0x4d, 0x43, 0x1f\n+\t\t\t},\n+\t\t\t.len = 128,\n+\t\t},\n+\t\t.key = {\n+\t\t\t.data = {\n+\t\t\t\t0x8d, 0x8d, 0x15, 0xd8, 0xa9, 0x57, 0x9a, 0xdb,\n+\t\t\t\t0x2d, 0x62\n+\t\t\t},\n+\t\t\t.len = 10,\n+\t\t},\n+\t\t.digest = {\n+\t\t\t.data = {\n+\t\t\t\t0x0c, 0x66, 0x2e, 0x47, 0x93, 0x93, 0x8c, 0xc3,\n+\t\t\t\t0x7f, 0x3d, 0x51, 0xd2, 0xb4, 0x05, 0x48, 0xec,\n+\t\t\t\t0x55, 0x91, 0x4f, 0x0d\n+\t\t\t},\n+\t\t\t.len = 20,\n+\t\t},\n+};\n+\n+static struct fips_dev_self_test_vector\n+SELF_TEST_SHA224_HMAC_test_vector = {\n+\t\t.name = \"SELF_TEST_SHA224_HMAC_test_vector\",\n+\t\t.operation_type = RTE_CRYPTO_SYM_XFORM_AUTH,\n+\t\t.auth = {\n+\t\t\t.algo = RTE_CRYPTO_AUTH_SHA224_HMAC,\n+\t\t},\n+\t\t.input = {\n+\t\t\t.data = {\n+\t\t\t\t0x41, 0x18, 0x43, 0xa2, 0x13, 0x87, 0x84, 0x6f,\n+\t\t\t\t0x3b, 0x9e, 0xd5, 0xfc, 0x54, 0x5a, 0xca, 0xdf,\n+\t\t\t\t0xa5, 0xb7, 0x03, 0x86, 0xf6, 0x2d, 0xa4, 0xd9,\n+\t\t\t\t0xa2, 0x7b, 0x04, 0x1b, 0xee, 0xa3, 0xaa, 0x11,\n+\t\t\t\t0x99, 0x36, 0x75, 0x67, 0xb4, 0xd1, 0x1a, 0x4f,\n+\t\t\t\t0xb4, 0xe8, 0xd4, 0x6b, 0xc6, 0xc2, 0x56, 0xed,\n+\t\t\t\t0x62, 0xc5, 0x05, 0xfd, 0x23, 0xf4, 0x64, 0x5b,\n+\t\t\t\t0xd6, 0xb6, 0xcf, 0x45, 0xd1, 0xd9, 0x6d, 0x9b,\n+\t\t\t\t0x86, 0xd6, 0x60, 0x41, 0x57, 0x57, 0x3e, 0xc5,\n+\t\t\t\t0xac, 0xf6, 0xc5, 0x41, 0x43, 0x48, 0xca, 0x83,\n+\t\t\t\t0xc8, 0x1a, 0x73, 0x6c, 0xa6, 0xfa, 0xa6, 0x96,\n+\t\t\t\t0x1c, 0xfa, 0xc1, 0x39, 0x93, 0xb0, 0x8c, 0x50,\n+\t\t\t\t0x2f, 0x81, 0x6c, 0xf7, 0xa4, 0x20, 0xd9, 0x18,\n+\t\t\t\t0x4b, 0x51, 0x11, 0x46, 0x75, 0xf3, 0x0e, 0xe9,\n+\t\t\t\t0xff, 0x3d, 0xb6, 0x9c, 0x26, 0x48, 0x53, 0xd3,\n+\t\t\t\t0x9d, 0xcd, 0x42, 0xc1, 0xdd, 0x31, 0xef, 0x79\n+\n+\t\t\t},\n+\t\t\t.len = 128,\n+\t\t},\n+\t\t.key = {\n+\t\t\t.data = {\n+\t\t\t\t0x37, 0x14, 0x70, 0x78, 0x39, 0xda, 0xf7, 0x91,\n+\t\t\t\t0x22, 0xc7, 0x82, 0x41, 0x63, 0x51, 0x38, 0x5e,\n+\t\t\t\t0x88, 0xa8, 0x1d, 0x31, 0xc9, 0xf6, 0x41, 0xd8,\n+\t\t\t\t0xdc, 0xe5, 0x38, 0xe9, 0x0e, 0x63, 0xc9, 0x58,\n+\t\t\t\t0x92, 0xa2, 0xea, 0x9b, 0x19, 0x62, 0xed, 0x0b,\n+\t\t\t\t0xa3, 0x72, 0xf4, 0x8e, 0x94, 0x74, 0xaa, 0x73,\n+\t\t\t\t0x0a, 0xe2\n+\t\t\t},\n+\t\t\t.len = 50,\n+\t\t},\n+\t\t.digest = {\n+\t\t\t.data = {\n+\t\t\t\t0x33, 0xf1, 0x7a, 0xc8, 0xa5, 0xc6, 0xb5, 0x25,\n+\t\t\t\t0xdb, 0x8b, 0x86, 0x44, 0xb6, 0xab\n+\n+\t\t\t},\n+\t\t\t.len = 14,\n+\t\t},\n+};\n+\n+\n+static struct fips_dev_self_test_vector\n+SELF_TEST_SHA256_HMAC_test_vector = {\n+\t\t.name = \"SELF_TEST_SHA256_HMAC_test_vector\",\n+\t\t.operation_type = RTE_CRYPTO_SYM_XFORM_AUTH,\n+\t\t.auth = {\n+\t\t\t.algo = RTE_CRYPTO_AUTH_SHA256_HMAC,\n+\t\t},\n+\t\t.input = {\n+\t\t\t.data = {\n+\t\t\t\t0x1c, 0x43, 0x96, 0xf7, 0xb7, 0xf9, 0x22, 0x8e,\n+\t\t\t\t0x83, 0x2a, 0x13, 0x69, 0x20, 0x02, 0xba, 0x2a,\n+\t\t\t\t0xff, 0x43, 0x9d, 0xcb, 0x7f, 0xdd, 0xbf, 0xd4,\n+\t\t\t\t0x56, 0xc0, 0x22, 0xd1, 0x33, 0xee, 0x89, 0x03,\n+\t\t\t\t0xa2, 0xd4, 0x82, 0x56, 0x2f, 0xda, 0xa4, 0x93,\n+\t\t\t\t0xce, 0x39, 0x16, 0xd7, 0x7a, 0x0c, 0x51, 0x44,\n+\t\t\t\t0x1d, 0xab, 0x26, 0xf6, 0xb0, 0x34, 0x02, 0x38,\n+\t\t\t\t0xa3, 0x6a, 0x71, 0xf8, 0x7f, 0xc3, 0xe1, 0x79,\n+\t\t\t\t0xca, 0xbc, 0xa9, 0x48, 0x2b, 0x70, 0x49, 0x71,\n+\t\t\t\t0xce, 0x69, 0xf3, 0xf2, 0x0a, 0xb6, 0x4b, 0x70,\n+\t\t\t\t0x41, 0x3d, 0x6c, 0x29, 0x08, 0x53, 0x2b, 0x2a,\n+\t\t\t\t0x88, 0x8a, 0x9f, 0xc2, 0x24, 0xca, 0xe1, 0x36,\n+\t\t\t\t0x5d, 0xa4, 0x10, 0xb6, 0xf2, 0xe2, 0x98, 0x90,\n+\t\t\t\t0x4b, 0x63, 0xb4, 0xa4, 0x17, 0x26, 0x32, 0x18,\n+\t\t\t\t0x35, 0xa4, 0x77, 0x4d, 0xd0, 0x63, 0xc2, 0x11,\n+\t\t\t\t0xcf, 0xc8, 0xb5, 0x16, 0x6c, 0x2d, 0x11, 0xa2\n+\t\t\t},\n+\t\t\t.len = 128,\n+\t\t},\n+\t\t.key = {\n+\t\t\t.data = {\n+\t\t\t\t0x54, 0x48, 0x99, 0x8f, 0x9d, 0x8f, 0x98, 0x53,\n+\t\t\t\t0x4a, 0xdd, 0xf0, 0xc8, 0xba, 0x63, 0x1c, 0x49,\n+\t\t\t\t0x6b, 0xf8, 0xa8, 0x00, 0x6c, 0xbb, 0x46, 0xad,\n+\t\t\t\t0x15, 0xfa, 0x1f, 0xa2, 0xf5, 0x53, 0x67, 0x12,\n+\t\t\t\t0x0c, 0x19, 0x34, 0x8c, 0x3a, 0xfa, 0x90, 0xc3\n+\t\t\t},\n+\t\t\t.len = 40,\n+\t\t},\n+\t\t.digest = {\n+\t\t\t.data = {\n+\t\t\t\t0x7e, 0x8c, 0xba, 0x9d, 0xd9, 0xf0, 0x6e, 0xbd,\n+\t\t\t\t0xd7, 0xf9, 0x2e, 0x0f, 0x1a, 0x67, 0xc7, 0xf4,\n+\t\t\t\t0xdf, 0x52, 0x69, 0x3c, 0x21, 0x2b, 0xdd, 0x84,\n+\t\t\t\t0xf6, 0x73, 0x70, 0xb3, 0x51, 0x53, 0x3c, 0x6c\n+\t\t\t},\n+\t\t\t.len = 32,\n+\t\t},\n+};\n+\n+/* HMAC count=34 L=48 SHA384 GENERATE*/\n+static struct fips_dev_self_test_vector\n+SELF_TEST_SHA384_HMAC_test_vector = {\n+\t\t.name = \"SELF_TEST_SHA384_HMAC_test_vector\",\n+\t\t.operation_type = RTE_CRYPTO_SYM_XFORM_AUTH,\n+\t\t.auth = {\n+\t\t\t.algo = RTE_CRYPTO_AUTH_SHA384_HMAC,\n+\t\t},\n+\t\t.input = {\n+\t\t\t.data = {\n+\t\t\t\t0xf5, 0x10, 0x86, 0xfe, 0x78, 0x15, 0x0f, 0xe4,\n+\t\t\t\t0x8b, 0xd1, 0x41, 0x5a, 0x47, 0x85, 0xac, 0xc0,\n+\t\t\t\t0x5a, 0xb8, 0x0e, 0xf0, 0x0b, 0x29, 0x75, 0xce,\n+\t\t\t\t0x78, 0x07, 0xa4, 0x21, 0x22, 0x64, 0xb8, 0xa1,\n+\t\t\t\t0xac, 0xe8, 0x0b, 0x50, 0xe0, 0xc2, 0x59, 0x0e,\n+\t\t\t\t0xf3, 0xe4, 0x21, 0x68, 0x0a, 0x70, 0x4e, 0xb2,\n+\t\t\t\t0xfc, 0x6d, 0x17, 0x55, 0x5a, 0xbf, 0x24, 0x69,\n+\t\t\t\t0xad, 0x56, 0xf2, 0x87, 0xfe, 0xa5, 0x78, 0xd8,\n+\t\t\t\t0x9c, 0x56, 0x0b, 0x72, 0x19, 0x3c, 0x7f, 0xe5,\n+\t\t\t\t0x96, 0x89, 0x8f, 0x10, 0x40, 0x41, 0x7e, 0x3a,\n+\t\t\t\t0x1b, 0xee, 0xff, 0x5e, 0xff, 0x96, 0x53, 0xc5,\n+\t\t\t\t0xe0, 0xea, 0xb1, 0xda, 0x52, 0xc0, 0xea, 0x3b,\n+\t\t\t\t0x4b, 0xc3, 0x4d, 0x0c, 0x2b, 0x69, 0xc8, 0x90,\n+\t\t\t\t0xfb, 0x26, 0x51, 0xfa, 0xf2, 0xe0, 0x84, 0x80,\n+\t\t\t\t0x3e, 0xa2, 0x8e, 0xb2, 0x01, 0x94, 0x49, 0x0a,\n+\t\t\t\t0x99, 0x2b, 0xa8, 0xc4, 0x24, 0x9d, 0x56, 0xef\n+\t\t\t},\n+\t\t\t.len = 128,\n+\t\t},\n+\t\t.key = {\n+\t\t\t.data = {\n+\t\t\t\t0x91, 0x7a, 0x69, 0x8c, 0x82, 0xf4, 0x4f, 0x19,\n+\t\t\t\t0x57, 0x3b, 0x64, 0x5c, 0x48, 0x79, 0xb8, 0x73,\n+\t\t\t\t0x0b, 0x58, 0xdf, 0xf4, 0xed, 0xc6, 0xa0, 0xd3,\n+\t\t\t\t0x21, 0xf5, 0xf1, 0x86, 0x58, 0xa5, 0x24, 0x66,\n+\t\t\t\t0x92, 0xa5, 0x5b, 0x59, 0x33, 0x97, 0x41, 0xae,\n+\t\t\t\t0x59, 0xf5, 0xfc, 0x48, 0x6d, 0x51, 0x5d, 0xff,\n+\t\t\t\t0xf8, 0xe1\n+\t\t\t},\n+\t\t\t.len = 50,\n+\t\t},\n+\t\t.digest = {\n+\t\t\t.data = {\n+\t\t\t\t0x77, 0xbf, 0x56, 0x15, 0xec, 0x52, 0xf7, 0x06,\n+\t\t\t\t0xca, 0x74, 0x64, 0x01, 0xe9, 0xfd, 0xe4, 0x3f,\n+\t\t\t\t0x15, 0x60, 0x52, 0x37, 0xe5, 0x50, 0xb9, 0x3a,\n+\t\t\t\t0x84, 0x72, 0xfd, 0x14, 0x4f, 0xc3, 0x9e, 0x5e,\n+\t\t\t\t0xca, 0x0f, 0xe8, 0x90, 0x83, 0x88, 0x28, 0xa0\n+\t\t\t},\n+\t\t\t.len = 40,\n+\t\t},\n+};\n+\n+/* HMAC count=28 L=64 SHA512 GENERATE*/\n+static struct fips_dev_self_test_vector\n+SELF_TEST_SHA512_HMAC_test_vector = {\n+\t\t.name = \"SELF_TEST_SHA512_HMAC_test_vector\",\n+\t\t.operation_type = RTE_CRYPTO_SYM_XFORM_AUTH,\n+\t\t.auth = {\n+\t\t\t.algo = RTE_CRYPTO_AUTH_SHA512_HMAC,\n+\t\t},\n+\t\t.input = {\n+\t\t\t.data = {\n+\t\t\t\t0x0a, 0x33, 0x1c, 0xe2, 0x00, 0x89, 0xb2, 0x9e,\n+\t\t\t\t0x94, 0xb2, 0xc5, 0xf5, 0x18, 0xc8, 0xdb, 0xea,\n+\t\t\t\t0xd4, 0x04, 0x17, 0xa2, 0xa8, 0xd5, 0x00, 0x18,\n+\t\t\t\t0xf3, 0x2f, 0x85, 0x12, 0xb3, 0x26, 0x3d, 0x54,\n+\t\t\t\t0xed, 0xbb, 0xf3, 0x13, 0x4f, 0xf6, 0x61, 0xac,\n+\t\t\t\t0x14, 0x35, 0x3c, 0x96, 0x28, 0xc3, 0x71, 0x95,\n+\t\t\t\t0x8c, 0xac, 0xaf, 0x31, 0xfd, 0xd0, 0x25, 0x67,\n+\t\t\t\t0xd0, 0x37, 0x8d, 0x9e, 0x21, 0xa4, 0x69, 0xdd,\n+\t\t\t\t0x2c, 0x6d, 0x8c, 0x3a, 0xfb, 0x89, 0xdd, 0x96,\n+\t\t\t\t0x42, 0xeb, 0x58, 0x87, 0x87, 0x0e, 0x55, 0x96,\n+\t\t\t\t0x85, 0xd2, 0x0d, 0xab, 0xd3, 0x86, 0x5a, 0xc5,\n+\t\t\t\t0xc1, 0x46, 0xbe, 0xee, 0x83, 0x87, 0xa7, 0x6f,\n+\t\t\t\t0x91, 0xf0, 0xf1, 0x40, 0x4d, 0x6c, 0xad, 0xc2,\n+\t\t\t\t0xe6, 0x7d, 0x21, 0xb0, 0x7d, 0xd3, 0x0f, 0x53,\n+\t\t\t\t0x87, 0x1d, 0x3b, 0xf6, 0x73, 0x1f, 0x27, 0x9a,\n+\t\t\t\t0x8c, 0x04, 0x21, 0xeb, 0x20, 0xf6, 0x7f, 0x72\n+\t\t\t},\n+\t\t\t.len = 128,\n+\t\t},\n+\t\t.key = {\n+\t\t\t.data = {\n+\t\t\t\t0x39, 0xb8, 0x77, 0xb8, 0xe8, 0x2e, 0xcb, 0xd9,\n+\t\t\t\t0x74, 0x03, 0x25, 0x82, 0x8f, 0xaf, 0x67, 0x21,\n+\t\t\t\t0xc1, 0x29, 0x04, 0x6e, 0xb0, 0x13, 0x61, 0x44,\n+\t\t\t\t0xa0, 0x31, 0x82, 0xb1, 0x36, 0x20, 0xe2, 0x49,\n+\t\t\t\t0x81, 0x45, 0xa2, 0xbf, 0x3b, 0x03, 0xe6, 0xb6,\n+\t\t\t\t0x4b, 0x31, 0x7d, 0xd4, 0x8f, 0xcb, 0xc0, 0x18,\n+\t\t\t\t0xd9, 0xe7, 0xbc, 0x6e, 0x37, 0xeb, 0x93, 0x81,\n+\t\t\t\t0x78, 0xfe, 0x1f, 0xd1, 0xeb, 0xbc, 0xd9, 0x05,\n+\t\t\t\t0x6a, 0x2e, 0xf9, 0x82, 0x97, 0xf9, 0xdf, 0x3c,\n+\t\t\t\t0x66, 0xd5, 0xb2, 0xcc, 0xdc, 0x41, 0x47, 0xc4,\n+\t\t\t\t0x16, 0x76, 0x44, 0x3f, 0x8c, 0x99, 0x85, 0xbc,\n+\t\t\t\t0x97, 0x34, 0xbe, 0x2c, 0x31, 0xe7, 0x62, 0x49,\n+\t\t\t\t0xfc, 0x5b, 0xc4, 0x2a\n+\t\t\t},\n+\t\t\t.len = 100,\n+\t\t},\n+\t\t.digest = {\n+\t\t\t.data = {\n+\t\t\t\t0x97, 0x16, 0x8f, 0x55, 0x13, 0xc2, 0xe9, 0xbc,\n+\t\t\t\t0x4b, 0xc5, 0x25, 0xce, 0x27, 0x03, 0x74, 0x0b,\n+\t\t\t\t0xce, 0x1a, 0x06, 0xec, 0xfe, 0x99, 0xa5, 0x70,\n+\t\t\t\t0xac, 0x66, 0xc8, 0x3e, 0xde, 0x96, 0x67, 0xcc,\n+\t\t\t\t0x07, 0xed, 0xf6, 0x64, 0x61, 0x7c, 0xe5, 0x3c\n+\t\t\t},\n+\t\t\t.len = 40,\n+\t\t},\n+};\n+\n+/* <-- AES CMAC --> */\n+static struct fips_dev_self_test_vector\n+SELF_TEST_AES_CMAC_test_vector = {\n+\t\t.name = \"SELF_TEST_AES_CMAC_test_vector\",\n+\t\t.operation_type = RTE_CRYPTO_SYM_XFORM_AUTH,\n+\t\t.auth = {\n+\t\t\t.algo = RTE_CRYPTO_AUTH_AES_CMAC,\n+\t\t},\n+\t\t.input = {\n+\t\t\t.data = {\n+\t\t\t\t0x57, 0x88, 0xf6, 0x1e, 0x02, 0x30, 0x47, 0x91,\n+\t\t\t\t0xb5, 0x2f, 0x40, 0x05, 0x7a, 0xbb, 0x4e, 0x04,\n+\t\t\t\t0x46, 0x40, 0x3e, 0xf3, 0x74, 0x02, 0x53, 0xdf,\n+\t\t\t\t0x72, 0x05, 0x96, 0x79, 0xbb, 0x2a, 0x6e, 0x5e,\n+\t\t\t\t0x05, 0x9a, 0x70, 0x9c, 0xbb\n+\t\t\t},\n+\t\t\t.len = 37,\n+\t\t},\n+\t\t.key = {\n+\t\t\t.data = {\n+\t\t\t\t0x18, 0x42, 0x15, 0x14, 0x5d, 0xa4, 0x9d, 0xb4,\n+\t\t\t\t0x17, 0xe8, 0xbd, 0xd5, 0x73, 0xd6, 0x28, 0x2d\n+\t\t\t},\n+\t\t\t.len = 16,\n+\t\t},\n+\t\t.digest = {\n+\t\t\t.data = {\n+\t\t\t\t0x8d, 0xa8, 0xcc, 0xa9, 0xb3, 0x6f, 0x68, 0x57,\n+\t\t\t\t0x1c, 0x6c, 0x0e, 0x40, 0xa3, 0xf4, 0x10\n+\t\t\t},\n+\t\t\t.len = 15,\n+\t\t},\n+};\n+\n+/* <-- AES CCM --> */\n+static struct fips_dev_self_test_vector\n+SELF_TEST_AES128_CCM_test_vector = {\n+\t\t.name = \"SELF_TEST_AES128_CCM_test_vector\",\n+\t\t.operation_type = RTE_CRYPTO_SYM_XFORM_AEAD,\n+\t\t.iv = {\n+\t\t\t.data = {\n+\t\t\t\t0x00, 0x50, 0x30, 0xF1, 0x84, 0x44, 0x08, 0xB5,\n+\t\t\t\t0x03, 0x97, 0x76, 0xE7, 0x0C\n+\t\t\t},\n+\t\t\t.len = 13,\n+\t\t},\n+\t\t.aead = {\n+\t\t\t.algo = RTE_CRYPTO_AEAD_AES_CCM,\n+\t\t\t.aad = {\n+\t\t\t\t.data = {\n+\t\t\t\t\t/* 18 bytes padding for AAD */\n+\t\t\t\t\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n+\t\t\t\t\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n+\t\t\t\t\t0x00, 0x00,\n+\t\t\t\t\t0x08, 0x40, 0x0F, 0xD2, 0xE1, 0x28, 0xA5, 0x7C,\n+\t\t\t\t\t0x50, 0x30, 0xF1, 0x84, 0x44, 0x08, 0xAB, 0xAE,\n+\t\t\t\t\t0xA5, 0xB8, 0xFC, 0xBA, 0x00, 0x00\n+\t\t\t\t},\n+\t\t\t\t.len = 22,\n+\t\t\t},\n+\t\t},\n+\t\t.input = {\n+\t\t\t.data = {\n+\t\t\t\t0xF8, 0xBA, 0x1A, 0x55, 0xD0, 0x2F, 0x85, 0xAE,\n+\t\t\t\t0x96, 0x7B, 0xB6, 0x2F, 0xB6, 0xCD, 0xA8, 0xEB,\n+\t\t\t\t0x7E, 0x78, 0xA0, 0x50\n+\t\t\t},\n+\t\t\t.len = 20,\n+\t\t},\n+\t\t.key = {\n+\t\t\t.data = {\n+\t\t\t\t0xC9, 0x7C, 0x1F, 0x67, 0xCE, 0x37, 0x11, 0x85,\n+\t\t\t\t0x51, 0x4A, 0x8A, 0x19, 0xF2, 0xBD, 0xD5, 0x2F\n+\t\t\t},\n+\t\t\t.len = 16,\n+\t\t},\n+\t\t.output = {\n+\t\t\t.data = {\n+\t\t\t\t0xF3, 0xD0, 0xA2, 0xFE, 0x9A, 0x3D, 0xBF, 0x23,\n+\t\t\t\t0x42, 0xA6, 0x43, 0xE4, 0x32, 0x46, 0xE8, 0x0C,\n+\t\t\t\t0x3C, 0x04, 0xD0, 0x19\n+\t\t\t},\n+\t\t\t.len = 20,\n+\t\t},\n+\t\t.digest = {\n+\t\t\t.data = {\n+\t\t\t\t0x78, 0x45, 0xCE, 0x0B, 0x16, 0xF9, 0x76, 0x23\n+\t\t\t},\n+\t\t\t.len = 8,\n+\t\t},\n+};\n+\n+/* <-- AES CBC --> */\n+static struct fips_dev_self_test_vector\n+SELF_TEST_AES128_CBC_test_vector = {\n+\t\t.name = \"SELF_TEST_AES128_CBC_test_vector\",\n+\t\t.operation_type = RTE_CRYPTO_SYM_XFORM_CIPHER,\n+\n+\t\t.iv = {\n+\t\t\t.data = {\n+\t\t\t\t0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,\n+\t\t\t\t0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F\n+\t\t\t},\n+\t\t\t.len = 16,\n+\t\t},\n+\t\t.cipher = {\n+\t\t\t.algo = RTE_CRYPTO_CIPHER_AES_CBC,\n+\t\t},\n+\t\t.input = {\n+\t\t\t.data = {\n+\t\t\t\t0x57, 0x68, 0x61, 0x74, 0x20, 0x61, 0x20, 0x6C,\n+\t\t\t\t0x6F, 0x75, 0x73, 0x79, 0x20, 0x65, 0x61, 0x72,\n+\t\t\t\t0x74, 0x68, 0x21, 0x20, 0x48, 0x65, 0x20, 0x77,\n+\t\t\t\t0x6F, 0x6E, 0x64, 0x65, 0x72, 0x65, 0x64, 0x20,\n+\t\t\t},\n+\t\t\t.len = 32,\n+\t\t},\n+\t\t.key = {\n+\t\t\t.data = {\n+\t\t\t\t0xE4, 0x23, 0x33, 0x8A, 0x35, 0x64, 0x61, 0xE2,\n+\t\t\t\t0x49, 0x03, 0xDD, 0xC6, 0xB8, 0xCA, 0x55, 0x7A\n+\t\t\t},\n+\t\t\t.len = 16,\n+\t\t},\n+\t\t.output = {\n+\t\t\t.data = {\n+\t\t\t\t0x8B, 0x4D, 0xDA, 0x1B, 0xCF, 0x04, 0xA0, 0x31,\n+\t\t\t\t0xB4, 0xBF, 0xBD, 0x68, 0x43, 0x20, 0x7E, 0x76,\n+\t\t\t\t0xB1, 0x96, 0x8B, 0xA2, 0x7C, 0xA2, 0x83, 0x9E,\n+\t\t\t\t0x39, 0x5A, 0x2F, 0x7E, 0x92, 0xB4, 0x48, 0x1A,\n+\t\t\t},\n+\t\t\t.len = 32,\n+\t\t},\n+};\n+\n+static struct fips_dev_self_test_vector\n+SELF_TEST_AES192_CBC_test_vector = {\n+\t\t.name = \"SELF_TEST_AES192_CBC_test_vector\",\n+\t\t.operation_type = RTE_CRYPTO_SYM_XFORM_CIPHER,\n+\n+\t\t.iv = {\n+\t\t\t.data = {\n+\t\t\t\t0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,\n+\t\t\t\t0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F\n+\t\t\t},\n+\t\t\t.len = 16,\n+\t\t},\n+\t\t.cipher = {\n+\t\t\t.algo = RTE_CRYPTO_CIPHER_AES_CBC,\n+\t\t},\n+\t\t.input = {\n+\t\t\t.data = {\n+\t\t\t\t0x57, 0x68, 0x61, 0x74, 0x20, 0x61, 0x20, 0x6C,\n+\t\t\t\t0x6F, 0x75, 0x73, 0x79, 0x20, 0x65, 0x61, 0x72,\n+\t\t\t\t0x74, 0x68, 0x21, 0x20, 0x48, 0x65, 0x20, 0x77,\n+\t\t\t\t0x6F, 0x6E, 0x64, 0x65, 0x72, 0x65, 0x64, 0x20,\n+\t\t\t},\n+\t\t\t.len = 32,\n+\t\t},\n+\t\t.key = {\n+\t\t\t.data = {\n+\t\t\t\t0xE4, 0x23, 0x33, 0x8A, 0x35, 0x64, 0x61, 0xE2,\n+\t\t\t\t0x49, 0x03, 0xDD, 0xC6, 0xB8, 0xCA, 0x55, 0x7A,\n+\t\t\t\t0xD4, 0xC3, 0xA3, 0xAA, 0x33, 0x62, 0x61, 0xE0\n+\t\t\t},\n+\t\t\t.len = 24,\n+\t\t},\n+\t\t.output = {\n+\t\t\t.data = {\n+\t\t\t\t0x45, 0xEE, 0x9A, 0xEA, 0x3C, 0x03, 0xFC, 0x4C,\n+\t\t\t\t0x84, 0x36, 0xB0, 0xDA, 0xB0, 0xDC, 0xF3, 0x5B,\n+\t\t\t\t0x75, 0xA7, 0xBE, 0x0E, 0xC0, 0x8D, 0x6C, 0xF8,\n+\t\t\t\t0xC1, 0x0F, 0xD0, 0x35, 0x1D, 0x82, 0xAE, 0x7C,\n+\t\t\t},\n+\t\t\t.len = 32,\n+\t\t},\n+};\n+\n+/* AES-256 CBC ENCRYPT*/\n+static struct fips_dev_self_test_vector\n+SELF_TEST_AES256_CBC_test_vector = {\n+\t\t.name = \"SELF_TEST_AES256_CBC_test_vector\",\n+\t\t.operation_type = RTE_CRYPTO_SYM_XFORM_CIPHER,\n+\n+\t\t.iv = {\n+\t\t\t.data = {\n+\t\t\t\t0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,\n+\t\t\t\t0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F\n+\t\t\t},\n+\t\t\t.len = 16,\n+\t\t},\n+\t\t.cipher = {\n+\t\t\t.algo = RTE_CRYPTO_CIPHER_AES_CBC,\n+\t\t},\n+\t\t.input = {\n+\t\t\t.data = {\n+\t\t\t\t0x57, 0x68, 0x61, 0x74, 0x20, 0x61, 0x20, 0x6C,\n+\t\t\t\t0x6F, 0x75, 0x73, 0x79, 0x20, 0x65, 0x61, 0x72,\n+\t\t\t\t0x74, 0x68, 0x21, 0x20, 0x48, 0x65, 0x20, 0x77,\n+\t\t\t\t0x6F, 0x6E, 0x64, 0x65, 0x72, 0x65, 0x64, 0x20,\n+\t\t\t},\n+\t\t\t.len = 32,\n+\t\t},\n+\t\t.key = {\n+\t\t\t.data = {\n+\t\t\t\t0xE4, 0x23, 0x33, 0x8A, 0x35, 0x64, 0x61, 0xE2,\n+\t\t\t\t0x49, 0x03, 0xDD, 0xC6, 0xB8, 0xCA, 0x55, 0x7A,\n+\t\t\t\t0xD4, 0xC3, 0xA3, 0xAA, 0x33, 0x62, 0x61, 0xE0,\n+\t\t\t\t0x37, 0x07, 0xB8, 0x23, 0xA2, 0xA3, 0xB5, 0x8D\n+\t\t\t},\n+\t\t\t.len = 32,\n+\t\t},\n+\t\t.output = {\n+\t\t\t.data = {\n+\t\t\t\t0xF3, 0xDD, 0xF0, 0x0B, 0xFF, 0xA2, 0x6A, 0x04,\n+\t\t\t\t0xBE, 0xDA, 0x52, 0xA6, 0xFE, 0x6B, 0xA6, 0xA7,\n+\t\t\t\t0x48, 0x1D, 0x7D, 0x98, 0x65, 0xDB, 0xEF, 0x06,\n+\t\t\t\t0x26, 0xB5, 0x8E, 0xEB, 0x05, 0x0E, 0x77, 0x98,\n+\t\t\t},\n+\t\t\t.len = 32,\n+\t\t},\n+};\n+\n+/* DES-128 CBC ENCRYPT*/\n+static struct fips_dev_self_test_vector\n+SELF_TEST_3DES_2KEY_CBC_test_vector = {\n+\t\t.name = \"SELF_TEST_3DES_2KEY_CBC_test_vector\",\n+\t\t.operation_type = RTE_CRYPTO_SYM_XFORM_CIPHER,\n+\t\t.iv = {\n+\t\t\t.data = {\n+\t\t\t\t0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07\n+\t\t\t},\n+\t\t\t.len = 8,\n+\t\t},\n+\t\t.cipher = {\n+\t\t\t.algo = RTE_CRYPTO_CIPHER_3DES_CBC,\n+\t\t},\n+\t\t.input = {\n+\t\t\t.data = {\n+\t\t\t\t0x57, 0x68, 0x61, 0x74, 0x20, 0x61, 0x20, 0x6C,\n+\t\t\t\t0x6F, 0x75, 0x73, 0x79, 0x20, 0x65, 0x61, 0x72,\n+\t\t\t\t0x74, 0x68, 0x21, 0x20, 0x48, 0x65, 0x20, 0x77,\n+\t\t\t\t0x6F, 0x6E, 0x64, 0x65, 0x72, 0x65, 0x64, 0x20,\n+\t\t\t},\n+\t\t\t.len = 32,\n+\t\t},\n+\t\t.key = {\n+\t\t\t.data = {\n+\t\t\t\t0xE4, 0x23, 0x33, 0x8A, 0x35, 0x64, 0x61, 0xE2,\n+\t\t\t\t0x49, 0x03, 0xDD, 0xC6, 0xB8, 0xCA, 0x55, 0x7A,\n+\t\t\t\t0xE4, 0x23, 0x33, 0x8A, 0x35, 0x64, 0x61, 0xE2\n+\t\t\t},\n+\t\t\t.len = 24,\n+\t\t},\n+\t\t.output = {\n+\t\t\t.data = {\n+\t\t\t\t0x28, 0x2a, 0xff, 0x15, 0x5c, 0xdf, 0xd9, 0x6b,\n+\t\t\t\t0x54, 0xbc, 0x7b, 0xfb, 0xc5, 0x64, 0x4d, 0xdd,\n+\t\t\t\t0x3e, 0xf2, 0x9e, 0xb7, 0x53, 0x65, 0x37, 0x05,\n+\t\t\t\t0xe0, 0xdf, 0xae, 0xf7, 0xc9, 0x27, 0xe4, 0xec,\n+\t\t\t},\n+\t\t\t.len = 32,\n+\t\t},\n+};\n+\n+static struct fips_dev_self_test_vector\n+SELF_TEST_3DES_3KEY_CBC_test_vector = {\n+\t\t.name = \"SELF_TEST_3DES_3KEY_CBC_test_vector\",\n+\t\t.operation_type = RTE_CRYPTO_SYM_XFORM_CIPHER,\n+\n+\t\t.iv = {\n+\t\t\t.data = {\n+\t\t\t\t0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07\n+\t\t\t},\n+\t\t\t.len = 8,\n+\t\t},\n+\t\t.cipher = {\n+\t\t\t.algo = RTE_CRYPTO_CIPHER_3DES_CBC,\n+\t\t},\n+\t\t.input = {\n+\t\t\t.data = {\n+\t\t\t\t0x57, 0x68, 0x61, 0x74, 0x20, 0x61, 0x20, 0x6C,\n+\t\t\t\t0x6F, 0x75, 0x73, 0x79, 0x20, 0x65, 0x61, 0x72,\n+\t\t\t\t0x74, 0x68, 0x21, 0x20, 0x48, 0x65, 0x20, 0x77,\n+\t\t\t\t0x6F, 0x6E, 0x64, 0x65, 0x72, 0x65, 0x64, 0x20,\n+\t\t\t},\n+\t\t\t.len = 32,\n+\t\t},\n+\t\t.key = {\n+\t\t\t.data = {\n+\t\t\t\t0xE4, 0x23, 0x33, 0x8A, 0x35, 0x64, 0x61, 0xE2,\n+\t\t\t\t0x49, 0x03, 0xDD, 0xC6, 0xB8, 0xCA, 0x55, 0x7A,\n+\t\t\t\t0xD4, 0xC3, 0xA3, 0xAA, 0x33, 0x62, 0x61, 0xE0\n+\t\t\t},\n+\t\t\t.len = 24,\n+\t\t},\n+\t\t.output = {\n+\t\t\t.data = {\n+\t\t\t\t0xd0, 0xc9, 0xdc, 0x51, 0x29, 0x97, 0x03, 0x64,\n+\t\t\t\t0xcd, 0x22, 0xba, 0x3d, 0x2b, 0xbc, 0x21, 0x37,\n+\t\t\t\t0x7b, 0x1e, 0x29, 0x23, 0xeb, 0x51, 0x6e, 0xac,\n+\t\t\t\t0xbe, 0x5b, 0xd3, 0x67, 0xe0, 0x3f, 0xc3, 0xb5,\n+\t\t\t},\n+\t\t\t.len = 32,\n+\t\t},\n+};\n+\n+/* <-- AES GCM --> */\n+static struct fips_dev_self_test_vector\n+SELF_TEST_AES128_GCM_encrypt_test_vector = {\n+\t\t.name = \"SELF_TEST_AES128_GCM_encrypt_test_vector\",\n+\t\t.operation_type = RTE_CRYPTO_SYM_XFORM_AEAD,\n+\n+\t\t.iv = {\n+\t\t\t.data = {\n+\t\t\t\t0x5a, 0xdb, 0x96, 0x09, 0xdb, 0xae, 0xb5, 0x8c,\n+\t\t\t\t0xbd, 0x6e, 0x72, 0x75\n+\t\t\t},\n+\t\t\t.len = 12,\n+\t\t},\n+\t\t.aead = {\n+\t\t\t.algo = RTE_CRYPTO_AEAD_AES_GCM,\n+\t\t\t.aad = {\n+\t\t\t\t.data = {\n+\t\t\t\t\t0x88, 0x31, 0x9d, 0x6e, 0x1d, 0x3f, 0xfa, 0x5f,\n+\t\t\t\t\t0x98, 0x71, 0x99, 0x16, 0x6c, 0x8a, 0x9b, 0x56,\n+\t\t\t\t\t0xc2, 0xae, 0xba, 0x5a\n+\t\t\t\t},\n+\t\t\t\t.len = 20,\n+\t\t\t},\n+\t\t},\n+\t\t.input = {\n+\t\t\t.data = {\n+\t\t\t\t0x7c, 0x0e, 0x88, 0xc8, 0x88, 0x99, 0xa7, 0x79,\n+\t\t\t\t0x22, 0x84, 0x65, 0x07, 0x47, 0x97, 0xcd, 0x4c,\n+\t\t\t\t0x2e, 0x14, 0x98, 0xd2, 0x59, 0xb5, 0x43, 0x90,\n+\t\t\t\t0xb8, 0x5e, 0x3e, 0xef, 0x1c, 0x02, 0xdf, 0x60,\n+\t\t\t\t0xe7, 0x43, 0xf1, 0xb8, 0x40, 0x38, 0x2c, 0x4b,\n+\t\t\t\t0xcc, 0xaf, 0x3b, 0xaf, 0xb4, 0xca, 0x84, 0x29,\n+\t\t\t\t0xbe, 0xa0, 0x63\n+\t\t\t},\n+\t\t\t.len = 51,\n+\t\t},\n+\t\t.key = {\n+\t\t\t.data = {\n+\t\t\t\t0xfe, 0x47, 0xfc, 0xce, 0x5f, 0xc3, 0x26, 0x65,\n+\t\t\t\t0xd2, 0xae, 0x39, 0x9e, 0x4e, 0xec, 0x72, 0xba\n+\t\t\t},\n+\t\t\t.len = 16,\n+\t\t},\n+\t\t.output = {\n+\t\t\t.data = {\n+\t\t\t\t0x98, 0xf4, 0x82, 0x6f, 0x05, 0xa2, 0x65, 0xe6,\n+\t\t\t\t0xdd, 0x2b, 0xe8, 0x2d, 0xb2, 0x41, 0xc0, 0xfb,\n+\t\t\t\t0xbb, 0xf9, 0xff, 0xb1, 0xc1, 0x73, 0xaa, 0x83,\n+\t\t\t\t0x96, 0x4b, 0x7c, 0xf5, 0x39, 0x30, 0x43, 0x73,\n+\t\t\t\t0x63, 0x65, 0x25, 0x3d, 0xdb, 0xc5, 0xdb, 0x87,\n+\t\t\t\t0x78, 0x37, 0x14, 0x95, 0xda, 0x76, 0xd2, 0x69,\n+\t\t\t\t0xe5, 0xdb, 0x3e\n+\t\t\t},\n+\t\t\t.len = 51,\n+\t\t},\n+\t\t.digest = {\n+\t\t\t.data = {\n+\t\t\t\t0x29, 0x1e, 0xf1, 0x98, 0x2e, 0x4d, 0xef, 0xed,\n+\t\t\t\t0xaa, 0x22, 0x49, 0xf8, 0x98, 0x55, 0x6b, 0x47\n+\t\t\t},\n+\t\t\t.len = 16,\n+\t\t},\n+};\n+\n+static struct fips_dev_self_test_vector\n+SELF_TEST_AES192_GCM_encrypt_test_vector = {\n+\t\t.operation_type = RTE_CRYPTO_SYM_XFORM_AEAD,\n+\t\t.name = \"SELF_TEST_AES192_GCM_encrypt_test_vector\",\n+\t\t.iv = {\n+\t\t\t.data = {\n+\t\t\t\t0x0b, 0xd4, 0x4f, 0xf4, 0xd2, 0x0c, 0x15, 0xd0,\n+\t\t\t\t0x4f, 0xc6, 0x1e, 0xe7\n+\t\t\t},\n+\t\t\t.len = 12,\n+\t\t},\n+\t\t.aead = {\n+\t\t\t.algo = RTE_CRYPTO_AEAD_AES_GCM,\n+\t\t\t.aad = {\n+\t\t\t\t.data = {\n+\t\t\t\t\t0x9e, 0xa4, 0x2c, 0x50, 0xa7, 0xfd, 0xb8, 0x5e,\n+\t\t\t\t\t0x14, 0x1a, 0xa0, 0x84, 0xb4, 0x6b, 0xde, 0x12\n+\t\t\t\t},\n+\t\t\t\t.len = 16,\n+\t\t\t},\n+\t\t},\n+\t\t.input = {\n+\t\t\t.data = {\n+\t\t\t\t0x56, 0x7c, 0xcb, 0x3f, 0xa0, 0xdb, 0x89, 0x70,\n+\t\t\t\t0x8a, 0xf3, 0xff, 0x2b, 0xb0, 0x29, 0xdd, 0xec,\n+\t\t\t\t0x52, 0xc6, 0x69, 0x47, 0x58, 0x5d, 0x29, 0x1a,\n+\t\t\t\t0x28, 0x56, 0x4b, 0xf5, 0x6d, 0xb7, 0x06, 0xf7\n+\t\t\t},\n+\t\t\t.len = 32,\n+\t\t},\n+\t\t.key = {\n+\t\t\t.data = {\n+\t\t\t\t0x0d, 0x4a, 0x90, 0x0d, 0x1b, 0x0b, 0xb5, 0xb7,\n+\t\t\t\t0xbe, 0x24, 0x38, 0xc2, 0xba, 0x48, 0xfc, 0x45,\n+\t\t\t\t0x13, 0x4c, 0xc1, 0x98, 0x10, 0x8c, 0xf8, 0x85\n+\t\t\t},\n+\t\t\t.len = 24,\n+\t\t},\n+\t\t.output = {\n+\t\t\t.data = {\n+\t\t\t\t0x2f, 0x8a, 0x42, 0xcd, 0x18, 0x3b, 0x03, 0x14,\n+\t\t\t\t0xfd, 0x20, 0xa3, 0xd9, 0x7d, 0x9e, 0x0c, 0x52,\n+\t\t\t\t0x17, 0xb0, 0xf0, 0x88, 0xd2, 0xca, 0x87, 0xa8,\n+\t\t\t\t0x29, 0x0d, 0x4b, 0xae, 0x69, 0xad, 0x83, 0xf5\n+\t\t\t},\n+\t\t\t.len = 32,\n+\t\t},\n+\t\t.digest = {\n+\t\t\t.data = {\n+\t\t\t\t0xde, 0x41, 0x45, 0x92, 0xd7, 0x7f, 0x2f, 0x0b,\n+\t\t\t\t0x50, 0xdf, 0x4a, 0xec, 0x71, 0x4f, 0xad, 0x43\n+\t\t\t},\n+\t\t\t.len = 16,\n+\t\t},\n+};\n+\n+static struct fips_dev_self_test_vector\n+SELF_TEST_AES256_GCM_encrypt_test_vector = {\n+\t\t.operation_type = RTE_CRYPTO_SYM_XFORM_AEAD,\n+\t\t.name = \"SELF_TEST_AES256_GCM_encrypt_test_vector\",\n+\t\t.iv = {\n+\t\t\t.data = {\n+\t\t\t\t0x5c, 0x1b, 0x21, 0xc8, 0x99, 0x8e, 0xd6, 0x29,\n+\t\t\t\t0x90, 0x06, 0xd3, 0xf9\n+\t\t\t},\n+\t\t\t.len = 12,\n+\t\t},\n+\t\t.aead = {\n+\t\t\t.algo = RTE_CRYPTO_AEAD_AES_GCM,\n+\t\t\t.aad = {\n+\t\t\t\t.data = {\n+\t\t\t\t\t0x22, 0xed, 0x23, 0x59, 0x46, 0x23, 0x5a, 0x85,\n+\t\t\t\t\t0xa4, 0x5b, 0xc5, 0xfa, 0xd7, 0x14, 0x0b, 0xfa\n+\t\t\t\t},\n+\t\t\t\t.len = 16,\n+\t\t\t},\n+\t\t},\n+\t\t.input = {\n+\t\t\t.data = {\n+\t\t\t\t0xad, 0x42, 0x60, 0xe3, 0xcd, 0xc7, 0x6b, 0xcc,\n+\t\t\t\t0x10, 0xc7, 0xb2, 0xc0, 0x6b, 0x80, 0xb3, 0xbe,\n+\t\t\t\t0x94, 0x82, 0x58, 0xe5, 0xef, 0x20, 0xc5, 0x08,\n+\t\t\t\t0xa8, 0x1f, 0x51, 0xe9, 0x6a, 0x51, 0x83, 0x88\n+\t\t\t},\n+\t\t\t.len = 32,\n+\t\t},\n+\t\t.key = {\n+\t\t\t.data = {\n+\t\t\t\t0x37, 0xcc, 0xdb, 0xa1, 0xd9, 0x29, 0xd6, 0x43,\n+\t\t\t\t0x6c, 0x16, 0xbb, 0xa5, 0xb5, 0xff, 0x34, 0xde,\n+\t\t\t\t0xec, 0x88, 0xed, 0x7d, 0xf3, 0xd1, 0x5d, 0x0f,\n+\t\t\t\t0x4d, 0xdf, 0x80, 0xc0, 0xc7, 0x31, 0xee, 0x1f\n+\t\t\t},\n+\t\t\t.len = 32,\n+\t\t},\n+\t\t.output = {\n+\t\t\t.data = {\n+\t\t\t\t0x3b, 0x33, 0x5f, 0x8b, 0x08, 0xd3, 0x3c, 0xcd,\n+\t\t\t\t0xca, 0xd2, 0x28, 0xa7, 0x47, 0x00, 0xf1, 0x00,\n+\t\t\t\t0x75, 0x42, 0xa4, 0xd1, 0xe7, 0xfc, 0x1e, 0xbe,\n+\t\t\t\t0x3f, 0x44, 0x7f, 0xe7, 0x1a, 0xf2, 0x98, 0x16\n+\t\t\t},\n+\t\t\t.len = 32,\n+\t\t},\n+\t\t.digest = {\n+\t\t\t.data = {\n+\t\t\t\t0x1f, 0xbf, 0x49, 0xcc, 0x46, 0xf4, 0x58, 0xbf,\n+\t\t\t\t0x6e, 0x88, 0xf6, 0x37, 0x09, 0x75, 0xe6, 0xd4\n+\t\t\t},\n+\t\t\t.len = 16,\n+\t\t},\n+};\n+\n+\n+/* <-- AES CTR --> */\n+static struct fips_dev_self_test_vector\n+SELF_TEST_AES128_CTR_test_vector = {\n+\t\t.name = \"SELF_TEST_AES128_CTR_test_vector\",\n+\t\t.operation_type = RTE_CRYPTO_SYM_XFORM_CIPHER,\n+\n+\t\t.iv = {\n+\t\t\t.data = {\n+\t\t\t\t0xF0, 0xF1, 0xF2, 0xF3, 0xF4, 0xF5, 0xF6, 0xF7,\n+\t\t\t\t0xF8, 0xF9, 0xFA, 0xFB, 0xFC, 0xFD, 0xFE, 0xFF\n+\t\t\t},\n+\t\t\t.len = 16,\n+\t\t},\n+\t\t.cipher = {\n+\t\t\t.algo = RTE_CRYPTO_CIPHER_AES_CTR,\n+\t\t},\n+\t\t.input = {\n+\t\t\t.data = {\n+\t\t\t\t0x6B, 0xC1, 0xBE, 0xE2, 0x2E, 0x40, 0x9F, 0x96,\n+\t\t\t\t0xE9, 0x3D, 0x7E, 0x11, 0x73, 0x93, 0x17, 0x2A,\n+\t\t\t\t0xAE, 0x2D, 0x8A, 0x57, 0x1E, 0x03, 0xAC, 0x9C,\n+\t\t\t\t0x9E, 0xB7, 0x6F, 0xAC, 0x45, 0xAF, 0x8E, 0x51,\n+\t\t\t},\n+\t\t\t.len = 32,\n+\t\t},\n+\t\t.key = {\n+\t\t\t.data = {\n+\t\t\t\t0x2B, 0x7E, 0x15, 0x16, 0x28, 0xAE, 0xD2, 0xA6,\n+\t\t\t\t0xAB, 0xF7, 0x15, 0x88, 0x09, 0xCF, 0x4F, 0x3C\n+\t\t\t},\n+\t\t\t.len = 16,\n+\t\t},\n+\t\t.output = {\n+\t\t\t.data = {\n+\t\t\t\t0x87, 0x4D, 0x61, 0x91, 0xB6, 0x20, 0xE3, 0x26,\n+\t\t\t\t0x1B, 0xEF, 0x68, 0x64, 0x99, 0x0D, 0xB6, 0xCE,\n+\t\t\t\t0x98, 0x06, 0xF6, 0x6B, 0x79, 0x70, 0xFD, 0xFF,\n+\t\t\t\t0x86, 0x17, 0x18, 0x7B, 0xB9, 0xFF, 0xFD, 0xFF,\n+\t\t\t},\n+\t\t\t.len = 32,\n+\t\t},\n+};\n+\n+static struct fips_dev_self_test_vector\n+SELF_TEST_AES192_CTR_test_vector = {\n+\t\t.name = \"SELF_TEST_AES192_CTR_test_vector\",\n+\t\t.operation_type = RTE_CRYPTO_SYM_XFORM_CIPHER,\n+\n+\t\t.iv = {\n+\t\t\t.data = {\n+\t\t\t\t0x3F, 0x69, 0xA8, 0xCD, 0xE8, 0xF0, 0xEF, 0x40,\n+\t\t\t\t0xB8, 0x7A, 0x4B, 0xED, 0x2B, 0xAF, 0xBF, 0x57\n+\t\t\t},\n+\t\t\t.len = 16,\n+\t\t},\n+\t\t.cipher = {\n+\t\t\t.algo = RTE_CRYPTO_CIPHER_AES_CTR,\n+\t\t},\n+\t\t.input = {\n+\t\t\t.data = {\n+\t\t\t\t0x01, 0x0F, 0x10, 0x1F, 0x20, 0x1C, 0x0E, 0xB8,\n+\t\t\t\t0xFB, 0x5C, 0xCD, 0xCC, 0x1F, 0xF9, 0xAF, 0x0B,\n+\t\t\t\t0x95, 0x03, 0x74, 0x99, 0x49, 0xE7, 0x62, 0x55,\n+\t\t\t\t0xDA, 0xEA, 0x13, 0x20, 0x1D, 0xC6, 0xCC, 0xCC,\n+\t\t\t},\n+\t\t\t.len = 32,\n+\t\t},\n+\t\t.key = {\n+\t\t\t.data = {\n+\t\t\t\t0xCB, 0xC5, 0xED, 0x5B, 0xE7, 0x7C, 0xBD, 0x8C,\n+\t\t\t\t0x50, 0xD9, 0x30, 0xF2, 0xB5, 0x6A, 0x0E, 0x5F,\n+\t\t\t\t0xAA, 0xAE, 0xAD, 0xA2, 0x1F, 0x49, 0x52, 0xD4\n+\t\t\t},\n+\t\t\t.len = 24,\n+\t\t},\n+\t\t.output = {\n+\t\t\t.data = {\n+\t\t\t\t0x4A, 0x6C, 0xC8, 0xCC, 0x96, 0x2A, 0x13, 0x84,\n+\t\t\t\t0x1C, 0x36, 0x88, 0xE9, 0xE5, 0x94, 0x70, 0xB2,\n+\t\t\t\t0x14, 0x5B, 0x13, 0x80, 0xEA, 0xD8, 0x8D, 0x37,\n+\t\t\t\t0xFD, 0x70, 0xA8, 0x83, 0xE8, 0x2B, 0x88, 0x1E,\n+\t\t\t},\n+\t\t\t.len = 32,\n+\t\t},\n+};\n+\n+static struct fips_dev_self_test_vector\n+SELF_TEST_AES256_CTR_test_vector = {\n+\t\t.name = \"SELF_TEST_AES256_CTR_test_vector\",\n+\t\t.operation_type = RTE_CRYPTO_SYM_XFORM_CIPHER,\n+\n+\t\t.iv = {\n+\t\t\t.data = {\n+\t\t\t\t0xF0, 0xF1, 0xF2, 0xF3, 0xF4, 0xF5, 0xF6, 0xF7,\n+\t\t\t\t0xF8, 0xF9, 0xFA, 0xFB, 0xFC, 0xFD, 0xFE, 0xFF\n+\t\t\t},\n+\t\t\t.len = 16,\n+\t\t},\n+\t\t.cipher = {\n+\t\t\t.algo = RTE_CRYPTO_CIPHER_AES_CTR,\n+\t\t},\n+\t\t.input = {\n+\t\t\t.data = {\n+\t\t\t\t0x6B, 0xC1, 0xBE, 0xE2, 0x2E, 0x40, 0x9F, 0x96,\n+\t\t\t\t0xE9, 0x3D, 0x7E, 0x11, 0x73, 0x93, 0x17, 0x2A,\n+\t\t\t\t0xAE, 0x2D, 0x8A, 0x57, 0x1E, 0x03, 0xAC, 0x9C,\n+\t\t\t\t0x9E, 0xB7, 0x6F, 0xAC, 0x45, 0xAF, 0x8E, 0x51,\n+\t\t\t},\n+\t\t\t.len = 32,\n+\t\t},\n+\t\t.key = {\n+\t\t\t.data = {\n+\t\t\t\t0x60, 0x3D, 0xEB, 0x10, 0x15, 0xCA, 0x71, 0xBE,\n+\t\t\t\t0x2B, 0x73, 0xAE, 0xF0, 0x85, 0x7D, 0x77, 0x81,\n+\t\t\t\t0x1F, 0x35, 0x2C, 0x07, 0x3B, 0x61, 0x08, 0xD7,\n+\t\t\t\t0x2D, 0x98, 0x10, 0xA3, 0x09, 0x14, 0xDF, 0xF4\n+\t\t\t},\n+\t\t\t.len = 32,\n+\t\t},\n+\t\t.output = {\n+\t\t\t.data = {\n+\t\t\t\t0x60, 0x1E, 0xC3, 0x13, 0x77, 0x57, 0x89, 0xA5,\n+\t\t\t\t0xB7, 0xA7, 0xF5, 0x04, 0xBB, 0xF3, 0xD2, 0x28,\n+\t\t\t\t0xF4, 0x43, 0xE3, 0xCA, 0x4D, 0x62, 0xB5, 0x9A,\n+\t\t\t\t0xCA, 0x84, 0xE9, 0x90, 0xCA, 0xCA, 0xF5, 0xC5,\n+\t\t\t},\n+\t\t\t.len = 32,\n+\t\t},\n+};\n+\n+\n+struct fips_dev_self_test_vector\n+*self_test_vectors[] = {\n+\t\t&SELF_TEST_AES128_CBC_test_vector,\n+\t\t&SELF_TEST_AES192_CBC_test_vector,\n+\t\t&SELF_TEST_AES256_CBC_test_vector,\n+\t\t&SELF_TEST_3DES_2KEY_CBC_test_vector,\n+\t\t&SELF_TEST_3DES_3KEY_CBC_test_vector,\n+\t\t&SELF_TEST_AES128_CCM_test_vector,\n+\t\t&SELF_TEST_SHA1_HMAC_test_vector,\n+\t\t&SELF_TEST_SHA224_HMAC_test_vector,\n+\t\t&SELF_TEST_SHA256_HMAC_test_vector,\n+\t\t&SELF_TEST_SHA384_HMAC_test_vector,\n+\t\t&SELF_TEST_SHA512_HMAC_test_vector,\n+\t\t&SELF_TEST_AES_CMAC_test_vector,\n+\t\t&SELF_TEST_AES128_GCM_encrypt_test_vector,\n+\t\t&SELF_TEST_AES192_GCM_encrypt_test_vector,\n+\t\t&SELF_TEST_AES256_GCM_encrypt_test_vector,\n+\t\t&SELF_TEST_AES128_CTR_test_vector,\n+\t\t&SELF_TEST_AES192_CTR_test_vector,\n+\t\t&SELF_TEST_AES256_CTR_test_vector,\n+};\n+\n+struct fips_dev_auto_test_env {\n+\tstruct rte_mempool *mpool;\n+\tstruct rte_mempool *op_pool;\n+\tstruct rte_mempool *sess_pool;\n+\tstruct rte_mbuf *mbuf;\n+\tstruct rte_crypto_op *op;\n+};\n+\n+typedef int (*fips_dev_self_test_prepare_xform_t)(uint8_t,\n+\t\tstruct rte_crypto_sym_xform *,\n+\t\tstruct fips_dev_self_test_vector *,\n+\t\tuint32_t, uint8_t *,\n+\t\tuint32_t);\n+\n+typedef int (*fips_dev_self_test_prepare_op_t)(struct rte_crypto_op *,\n+\t\tstruct rte_mbuf *, struct rte_cryptodev_sym_session *,\n+\t\tuint32_t, struct fips_dev_self_test_vector *);\n+\n+typedef int (*fips_dev_self_test_check_result_t)(struct rte_crypto_op *,\n+\t\tstruct fips_dev_self_test_vector *, uint32_t);\n+\n+struct fips_dev_self_test_ops {\n+\tenum rte_crypto_sym_xform_type last_operation_type;\n+\tfips_dev_self_test_prepare_xform_t prepare_xform;\n+\tfips_dev_self_test_prepare_op_t prepare_op;\n+\tfips_dev_self_test_check_result_t check_result;\n+};\n+\n+static int\n+prepare_cipher_xform(uint8_t dev_id,\n+\t\tstruct rte_crypto_sym_xform *xform,\n+\t\tstruct fips_dev_self_test_vector *vec,\n+\t\tuint32_t dir,\n+\t\tuint8_t *key,\n+\t\tuint32_t neg_test)\n+{\n+\tconst struct rte_cryptodev_symmetric_capability *cap;\n+\tstruct rte_cryptodev_sym_capability_idx cap_idx;\n+\tstruct rte_crypto_cipher_xform *cipher_xform = &xform->cipher;\n+\n+\tmemset(xform, 0, sizeof(*xform));\n+\n+\t/** negative test, key is xored */\n+\tif (neg_test) {\n+\t\tuint32_t i;\n+\n+\t\tfor (i = 0; i < vec->key.len; i++)\n+\t\t\tkey[i] ^= vec->key.data[i];\n+\t} else\n+\t\tmemcpy(key, vec->key.data, vec->key.len);\n+\n+\txform->type = RTE_CRYPTO_SYM_XFORM_CIPHER;\n+\n+\tcipher_xform->algo = vec->cipher.algo;\n+\tcipher_xform->op = (dir == self_test_dir_enc_auth_gen) ?\n+\t\t\tRTE_CRYPTO_CIPHER_OP_ENCRYPT :\n+\t\t\tRTE_CRYPTO_CIPHER_OP_DECRYPT;\n+\tcipher_xform->key.data = key;\n+\tcipher_xform->key.length = vec->key.len;\n+\tcipher_xform->iv.length = vec->iv.len;\n+\tcipher_xform->iv.offset = IV_OFF;\n+\n+\tcap_idx.algo.cipher = cipher_xform->algo;\n+\tcap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;\n+\n+\tcap = rte_cryptodev_sym_capability_get(dev_id, &cap_idx);\n+\tif (!cap) {\n+\t\tRTE_LOG(ERR, PMD, \"Failed to get capability for cdev %u\\n\",\n+\t\t\t\tdev_id);\n+\t\treturn -EACCES;\n+\t}\n+\n+\tif (rte_cryptodev_sym_capability_check_cipher(cap,\n+\t\t\tcipher_xform->key.length,\n+\t\t\tcipher_xform->iv.length) != 0) {\n+\t\tRTE_LOG(ERR, PMD, \"PMD %s key length %u IV length %u\\n\",\n+\t\t\t\trte_cryptodev_name_get(dev_id),\n+\t\t\t\tcipher_xform->key.length,\n+\t\t\t\tcipher_xform->iv.length);\n+\t\treturn -EACCES;\n+\t}\n+\n+\treturn 0;\n+}\n+\n+static int\n+prepare_auth_xform(uint8_t dev_id,\n+\t\tstruct rte_crypto_sym_xform *xform,\n+\t\tstruct fips_dev_self_test_vector *vec,\n+\t\tuint32_t dir,\n+\t\tuint8_t *key,\n+\t\tuint32_t neg_test)\n+{\n+\tconst struct rte_cryptodev_symmetric_capability *cap;\n+\tstruct rte_cryptodev_sym_capability_idx cap_idx;\n+\tstruct rte_crypto_auth_xform *auth_xform = &xform->auth;\n+\n+\tmemset(xform, 0, sizeof(*xform));\n+\n+\t/** negative test, key is xored */\n+\tif (neg_test) {\n+\t\tuint32_t i;\n+\n+\t\tfor (i = 0; i < vec->key.len; i++)\n+\t\t\tkey[i] ^= vec->key.data[i];\n+\t} else\n+\t\tmemcpy(key, vec->key.data, vec->key.len);\n+\n+\txform->type = RTE_CRYPTO_SYM_XFORM_AUTH;\n+\n+\tauth_xform->algo = vec->auth.algo;\n+\tauth_xform->op = (dir == self_test_dir_enc_auth_gen) ?\n+\t\t\tRTE_CRYPTO_AUTH_OP_GENERATE :\n+\t\t\tRTE_CRYPTO_AUTH_OP_VERIFY;\n+\tauth_xform->digest_length = vec->digest.len;\n+\tauth_xform->key.data = key;\n+\tauth_xform->key.length = vec->key.len;\n+\n+\tcap_idx.algo.auth = auth_xform->algo;\n+\tcap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;\n+\n+\tcap = rte_cryptodev_sym_capability_get(dev_id, &cap_idx);\n+\tif (!cap) {\n+\t\tRTE_LOG(ERR, PMD, \"Failed to get capability for cdev %u\\n\",\n+\t\t\t\tdev_id);\n+\t\treturn -EACCES;\n+\t}\n+\n+\tif (rte_cryptodev_sym_capability_check_auth(cap,\n+\t\t\tauth_xform->key.length,\n+\t\t\tauth_xform->digest_length, 0) != 0) {\n+\t\tRTE_LOG(ERR, PMD, \"PMD %s key length %u Digest length %u\\n\",\n+\t\t\t\trte_cryptodev_name_get(dev_id),\n+\t\t\t\tauth_xform->key.length,\n+\t\t\t\tauth_xform->digest_length);\n+\t\treturn -EACCES;\n+\t}\n+\n+\treturn 0;\n+}\n+\n+static int\n+prepare_aead_xform(uint8_t dev_id,\n+\t\tstruct rte_crypto_sym_xform *xform,\n+\t\tstruct fips_dev_self_test_vector *vec,\n+\t\tuint32_t dir,\n+\t\tuint8_t *key,\n+\t\tuint32_t neg_test)\n+{\n+\tconst struct rte_cryptodev_symmetric_capability *cap;\n+\tstruct rte_cryptodev_sym_capability_idx cap_idx;\n+\tstruct rte_crypto_aead_xform *aead_xform = &xform->aead;\n+\n+\tmemset(xform, 0, sizeof(*xform));\n+\n+\t/** negative test, key is xored */\n+\tif (neg_test) {\n+\t\tuint32_t i;\n+\n+\t\tfor (i = 0; i < vec->key.len; i++)\n+\t\t\tkey[i] ^= vec->key.data[i];\n+\t} else\n+\t\tmemcpy(key, vec->key.data, vec->key.len);\n+\n+\txform->type = RTE_CRYPTO_SYM_XFORM_AEAD;\n+\n+\taead_xform->algo = vec->aead.algo;\n+\taead_xform->op = (dir == self_test_dir_enc_auth_gen) ?\n+\t\t\tRTE_CRYPTO_AEAD_OP_ENCRYPT :\n+\t\t\tRTE_CRYPTO_AEAD_OP_DECRYPT;\n+\taead_xform->aad_length = vec->aead.aad.len;\n+\taead_xform->digest_length = vec->digest.len;\n+\taead_xform->iv.offset = IV_OFF;\n+\taead_xform->iv.length = vec->iv.len;\n+\taead_xform->key.data = key;\n+\taead_xform->key.length = vec->key.len;\n+\n+\tcap_idx.algo.aead = aead_xform->algo;\n+\tcap_idx.type = RTE_CRYPTO_SYM_XFORM_AEAD;\n+\n+\tcap = rte_cryptodev_sym_capability_get(dev_id, &cap_idx);\n+\tif (!cap) {\n+\t\tRTE_LOG(ERR, PMD, \"Failed to get capability for cdev %u\\n\",\n+\t\t\t\tdev_id);\n+\t\treturn -EACCES;\n+\t}\n+\n+\tif (rte_cryptodev_sym_capability_check_aead(cap,\n+\t\t\taead_xform->key.length,\n+\t\t\taead_xform->digest_length, aead_xform->aad_length,\n+\t\t\taead_xform->iv.length) != 0) {\n+\t\tRTE_LOG(ERR, PMD,\n+\t\t\t\"PMD %s key_len %u tag_len %u aad_len %u iv_len %u\\n\",\n+\t\t\t\trte_cryptodev_name_get(dev_id),\n+\t\t\t\taead_xform->key.length,\n+\t\t\t\taead_xform->digest_length,\n+\t\t\t\taead_xform->aad_length,\n+\t\t\t\taead_xform->iv.length);\n+\t\treturn -EACCES;\n+\t}\n+\n+\treturn 0;\n+}\n+\n+static int\n+prepare_cipher_op(struct rte_crypto_op *op,\n+\t\tstruct rte_mbuf *mbuf,\n+\t\tstruct rte_cryptodev_sym_session *session,\n+\t\tuint32_t dir,\n+\t\tstruct fips_dev_self_test_vector *vec)\n+{\n+\tstruct rte_crypto_sym_op *sym = op->sym;\n+\tuint8_t *iv = rte_crypto_op_ctod_offset(op, uint8_t *, IV_OFF);\n+\tuint8_t *dst;\n+\tconst uint8_t *src;\n+\tuint32_t len;\n+\n+\tif (dir == self_test_dir_enc_auth_gen) {\n+\t\tsrc = vec->input.data;\n+\t\tlen = vec->input.len;\n+\t} else {\n+\t\tsrc = vec->output.data;\n+\t\tlen = vec->output.len;\n+\t}\n+\n+\tsym->cipher.data.offset = 0;\n+\tmemcpy(iv, vec->iv.data, vec->iv.len);\n+\n+\tdst = (uint8_t *)rte_pktmbuf_append(mbuf, len);\n+\tif (!dst) {\n+\t\tRTE_LOG(ERR, PMD, \"Error %i: MBUF too small\\n\", -ENOMEM);\n+\t\treturn -ENOMEM;\n+\t}\n+\n+\tmemcpy(dst, src, len);\n+\n+\tsym->cipher.data.length = len;\n+\n+\trte_crypto_op_attach_sym_session(op, session);\n+\n+\treturn 0;\n+}\n+\n+static int\n+prepare_auth_op(struct rte_crypto_op *op,\n+\t\tstruct rte_mbuf *mbuf,\n+\t\tstruct rte_cryptodev_sym_session *session,\n+\t\tuint32_t dir,\n+\t\tstruct fips_dev_self_test_vector *vec)\n+{\n+\tstruct rte_crypto_sym_op *sym = op->sym;\n+\tuint8_t *dst;\n+\n+\tif (vec->input.len + vec->digest.len > RTE_MBUF_MAX_NB_SEGS) {\n+\t\tRTE_LOG(ERR, PMD, \"Error %i: Test data too long (%u).\\n\",\n+\t\t\t\t-ENOMEM, vec->input.len + vec->digest.len);\n+\t\treturn -ENOMEM;\n+\t}\n+\n+\tsym->auth.data.offset = 0;\n+\n+\tdst = (uint8_t *)rte_pktmbuf_append(mbuf, vec->input.len +\n+\t\t\tvec->digest.len);\n+\tif (!dst) {\n+\t\tRTE_LOG(ERR, PMD, \"Error %i: MBUF too small\\n\", -ENOMEM);\n+\t\treturn -ENOMEM;\n+\t}\n+\n+\tmemcpy(dst, vec->input.data, vec->input.len);\n+\tsym->auth.data.length = vec->input.len;\n+\tsym->auth.digest.data = dst + vec->input.len;\n+\n+\tif (dir == self_test_dir_dec_auth_verify)\n+\t\tmemcpy(dst + vec->input.len, vec->digest.data, vec->digest.len);\n+\n+\trte_crypto_op_attach_sym_session(op, session);\n+\n+\treturn 0;\n+}\n+\n+static int\n+prepare_aead_op(struct rte_crypto_op *op,\n+\t\tstruct rte_mbuf *mbuf,\n+\t\tstruct rte_cryptodev_sym_session *session,\n+\t\tuint32_t dir,\n+\t\tstruct fips_dev_self_test_vector *vec)\n+{\n+\tstruct rte_crypto_sym_op *sym = op->sym;\n+\tuint8_t *iv = rte_crypto_op_ctod_offset(op, uint8_t *, IV_OFF);\n+\tuint8_t *dst;\n+\tconst uint8_t *src;\n+\tuint32_t len;\n+\n+\tif (dir == self_test_dir_enc_auth_gen) {\n+\t\tlen = vec->input.len;\n+\t\tsrc = vec->input.data;\n+\t} else {\n+\t\tlen = vec->output.len;\n+\t\tsrc = vec->output.data;\n+\t}\n+\n+\tif (vec->aead.algo == RTE_CRYPTO_AEAD_AES_CCM)\n+\t\tmemcpy(iv + 1, vec->iv.data, vec->iv.len);\n+\telse\n+\t\tmemcpy(iv, vec->iv.data, vec->iv.len);\n+\n+\tif (len + vec->digest.len > RTE_MBUF_MAX_NB_SEGS) {\n+\t\tRTE_LOG(ERR, PMD, \"Error %i: Test data too long (%u).\\n\",\n+\t\t\t\t-ENOMEM, len + vec->digest.len);\n+\t\treturn -ENOMEM;\n+\t}\n+\n+\tdst = (uint8_t *)rte_pktmbuf_append(mbuf, len + vec->digest.len);\n+\tif (!dst) {\n+\t\tRTE_LOG(ERR, PMD, \"Error %i: MBUF too small\\n\", -ENOMEM);\n+\t\treturn -ENOMEM;\n+\t}\n+\n+\tsym->m_src = mbuf;\n+\tsym->aead.data.length = len;\n+\tsym->aead.data.offset = 0;\n+\tsym->aead.aad.data = vec->aead.aad.data;\n+\tsym->aead.digest.data = dst + vec->input.len;\n+\tmemcpy(dst, src, len);\n+\n+\tif (dir == self_test_dir_dec_auth_verify)\n+\t\tmemcpy(sym->aead.digest.data, vec->digest.data, vec->digest.len);\n+\n+\trte_crypto_op_attach_sym_session(op, session);\n+\n+\treturn 0;\n+}\n+\n+static int\n+check_cipher_result(struct rte_crypto_op *op,\n+\t\tstruct fips_dev_self_test_vector *vec,\n+\t\tuint32_t dir)\n+{\n+\tstruct rte_mbuf *mbuf = op->sym->m_src;\n+\tuint8_t *data;\n+\tconst uint8_t *src;\n+\tuint32_t len, src_len;\n+\tint ret;\n+\n+\tif (dir == self_test_dir_enc_auth_gen) {\n+\t\tsrc = vec->output.data;\n+\t\tsrc_len = vec->output.len;\n+\t} else {\n+\t\tsrc = vec->input.data;\n+\t\tsrc_len = vec->input.len;\n+\t}\n+\n+\tGET_MBUF_DATA(data, len, mbuf);\n+\tif (len != src_len)\n+\t\treturn -1;\n+\n+\tret = memcmp(data, src, src_len);\n+\tif (ret != 0)\n+\t\treturn -1;\n+\n+\treturn 0;\n+}\n+\n+static int\n+check_auth_result(struct rte_crypto_op *op,\n+\t\tstruct fips_dev_self_test_vector *vec,\n+\t\tuint32_t dir)\n+{\n+\tstruct rte_mbuf *mbuf = op->sym->m_src;\n+\tuint8_t *data;\n+\tuint32_t len;\n+\tint ret;\n+\n+\tGET_MBUF_DATA(data, len, mbuf);\n+\tif (len != vec->input.len + vec->digest.len)\n+\t\treturn -1;\n+\n+\tif (dir == self_test_dir_enc_auth_gen) {\n+\t\tdata += vec->input.len;\n+\t\tret = memcmp(data, vec->digest.data, vec->digest.len);\n+\t\tif (ret != 0)\n+\t\t\treturn -1;\n+\t}\n+\n+\treturn 0;\n+}\n+\n+static int\n+check_aead_result(struct rte_crypto_op *op,\n+\t\tstruct fips_dev_self_test_vector *vec,\n+\t\tuint32_t dir)\n+{\n+\tstruct rte_mbuf *mbuf = op->sym->m_src;\n+\tuint8_t *data;\n+\tconst uint8_t *src;\n+\tuint32_t len, src_len;\n+\tint ret;\n+\n+\tif (dir == self_test_dir_enc_auth_gen) {\n+\t\tsrc = vec->output.data;\n+\t\tsrc_len = vec->output.len;\n+\t} else {\n+\t\tsrc = vec->input.data;\n+\t\tsrc_len = vec->input.len;\n+\t}\n+\n+\tGET_MBUF_DATA(data, len, mbuf);\n+\tif (len != src_len + vec->digest.len)\n+\t\treturn -1;\n+\n+\tret = memcmp(data, src, src_len);\n+\tif (ret != 0)\n+\t\treturn -1;\n+\n+\tif (dir == self_test_dir_enc_auth_gen) {\n+\t\tdata += src_len;\n+\t\tret = memcmp(data, vec->digest.data, vec->digest.len);\n+\t\tif (ret != 0)\n+\t\t\treturn -1;\n+\t}\n+\n+\treturn 0;\n+}\n+\n+static void\n+init_test_op(struct fips_dev_self_test_ops *test_ops,\n+\t\tstruct fips_dev_self_test_vector *vec)\n+{\n+\tif (test_ops->last_operation_type == vec->operation_type)\n+\t\treturn;\n+\n+\tswitch (vec->operation_type) {\n+\tcase RTE_CRYPTO_SYM_XFORM_CIPHER:\n+\t\ttest_ops->prepare_xform = prepare_cipher_xform;\n+\t\ttest_ops->prepare_op = prepare_cipher_op;\n+\t\ttest_ops->check_result = check_cipher_result;\n+\t\tbreak;\n+\tcase RTE_CRYPTO_SYM_XFORM_AUTH:\n+\t\ttest_ops->prepare_xform = prepare_auth_xform;\n+\t\ttest_ops->prepare_op = prepare_auth_op;\n+\t\ttest_ops->check_result = check_auth_result;\n+\t\tbreak;\n+\tcase RTE_CRYPTO_SYM_XFORM_AEAD:\n+\t\ttest_ops->prepare_xform = prepare_aead_xform;\n+\t\ttest_ops->prepare_op = prepare_aead_op;\n+\t\ttest_ops->check_result = check_aead_result;\n+\t\tbreak;\n+\tdefault:\n+\t\tbreak;\n+\t}\n+\n+\ttest_ops->last_operation_type = vec->operation_type;\n+}\n+\n+static int\n+run_single_test(uint8_t dev_id,\n+\t\tstruct fips_dev_self_test_vector *vec,\n+\t\tconst struct fips_dev_self_test_ops *test_ops,\n+\t\tstruct fips_dev_auto_test_env *env,\n+\t\tuint32_t dir,\n+\t\tuint32_t negative_test)\n+{\n+\tstruct rte_crypto_sym_xform xform;\n+\tstruct rte_cryptodev_sym_session *sess;\n+\tuint16_t n_deqd;\n+\tuint8_t key[256];\n+\tint ret;\n+\n+\t__rte_crypto_op_reset(env->op, RTE_CRYPTO_OP_TYPE_SYMMETRIC);\n+\trte_pktmbuf_reset(env->mbuf);\n+\tenv->op->sym->m_src = env->mbuf;\n+\n+\tret = test_ops->prepare_xform(dev_id, &xform, vec, dir, key,\n+\t\t\tnegative_test);\n+\tif (ret < 0) {\n+\t\tRTE_LOG(ERR, PMD, \"Error %i: Prepare Xform\\n\", ret);\n+\t\treturn ret;\n+\t}\n+\n+\tsess = rte_cryptodev_sym_session_create(env->sess_pool);\n+\tif (!sess)\n+\t\treturn -ENOMEM;\n+\n+\tret = rte_cryptodev_sym_session_init(dev_id,\n+\t\t\tsess, &xform, env->sess_pool);\n+\tif (ret < 0) {\n+\t\tRTE_LOG(ERR, PMD, \"Error %i: Init session\\n\", ret);\n+\t\treturn ret;\n+\t}\n+\n+\tret = test_ops->prepare_op(env->op, env->mbuf, sess, dir, vec);\n+\tif (ret < 0) {\n+\t\tRTE_LOG(ERR, PMD, \"Error %i: Prepare op\\n\", ret);\n+\t\treturn ret;\n+\t}\n+\n+\tif (rte_cryptodev_enqueue_burst(dev_id, 0, &env->op, 1) < 1) {\n+\t\tRTE_LOG(ERR, PMD, \"Error: Failed enqueue\\n\");\n+\t\treturn ret;\n+\t}\n+\n+\tdo {\n+\t\tstruct rte_crypto_op *deqd_op;\n+\n+\t\tn_deqd = rte_cryptodev_dequeue_burst(dev_id, 0, &deqd_op,\n+\t\t\t\t1);\n+\t} while (n_deqd == 0);\n+\n+\trte_cryptodev_sym_session_clear(dev_id, sess);\n+\trte_cryptodev_sym_session_free(sess);\n+\n+\tif (env->op->status != RTE_CRYPTO_OP_STATUS_SUCCESS)\n+\t\treturn -1;\n+\n+\treturn test_ops->check_result(env->op, vec, dir);\n+}\n+\n+\n+static void\n+fips_dev_auto_test_uninit(uint8_t dev_id,\n+\t\tstruct fips_dev_auto_test_env *env)\n+{\n+\tstruct rte_cryptodev *dev = rte_cryptodev_pmd_get_dev(dev_id);\n+\tuint32_t i;\n+\n+\tif (!dev)\n+\t\treturn;\n+\n+\tif (env->mbuf)\n+\t\trte_pktmbuf_free(env->mbuf);\n+\tif (env->op)\n+\t\trte_crypto_op_free(env->op);\n+\tif (env->mpool)\n+\t\trte_mempool_free(env->mpool);\n+\tif (env->op_pool)\n+\t\trte_mempool_free(env->op_pool);\n+\tif (env->sess_pool)\n+\t\trte_mempool_free(env->sess_pool);\n+\n+\tif (dev->data->dev_started)\n+\t\trte_cryptodev_stop(dev_id);\n+\n+\tif (dev->data->nb_queue_pairs) {\n+\t\tfor (i = 0; i < dev->data->nb_queue_pairs; i++)\n+\t\t\t(*dev->dev_ops->queue_pair_release)(dev, i);\n+\t\tdev->data->nb_queue_pairs = 0;\n+\t\trte_free(dev->data->queue_pairs);\n+\t\tdev->data->queue_pairs = NULL;\n+\t}\n+}\n+\n+static int\n+fips_dev_auto_test_init(uint8_t dev_id, struct fips_dev_auto_test_env *env)\n+{\n+\tstruct rte_cryptodev_config conf = {rte_cryptodev_socket_id(dev_id), 1};\n+\tstruct rte_cryptodev_qp_conf qp_conf = {128};\n+\tchar name[128];\n+\tint ret;\n+\n+\tret = rte_cryptodev_configure(dev_id, &conf);\n+\tif (ret < 0)\n+\t\treturn ret;\n+\n+\tmemset(name, 0, 128);\n+\tsnprintf(name, 128, \"%s%u\", \"SELF_TEST_MEMPOOL\", dev_id);\n+\n+\tmemset(env, 0, sizeof(*env));\n+\n+\tenv->mpool = rte_pktmbuf_pool_create(name, 128, 0, 0,\n+\t\t\tUINT16_MAX, rte_cryptodev_socket_id(dev_id));\n+\tif (!env->mpool) {\n+\t\tret = -ENOMEM;\n+\t\tgoto error_exit;\n+\t}\n+\n+\tmemset(name, 0, 128);\n+\tsnprintf(name, 128, \"%s%u\", \"SELF_TEST_OP_POOL\", dev_id);\n+\n+\tenv->op_pool = rte_crypto_op_pool_create(\n+\t\t\tname,\n+\t\t\tRTE_CRYPTO_OP_TYPE_SYMMETRIC,\n+\t\t\t16, 0,\n+\t\t\t16,\n+\t\t\trte_socket_id());\n+\tif (!env->op_pool) {\n+\t\tret = -ENOMEM;\n+\t\tgoto error_exit;\n+\t}\n+\n+\tmemset(name, 0, 128);\n+\tsnprintf(name, 128, \"%s%u\", \"SELF_TEST_SESS_POOL\", dev_id);\n+\n+\tenv->sess_pool = rte_mempool_create(name,\n+\t\t\t128,\n+\t\t\trte_cryptodev_sym_get_private_session_size(dev_id),\n+\t\t\t0,\n+\t\t\t0,\n+\t\t\tNULL, NULL, NULL, NULL,\n+\t\t\trte_cryptodev_socket_id(dev_id),\n+\t\t\t0);\n+\tif (!env->sess_pool) {\n+\t\tret = -ENOMEM;\n+\t\tgoto error_exit;\n+\t}\n+\n+\tret = rte_cryptodev_queue_pair_setup(dev_id, 0, &qp_conf,\n+\t\t\trte_cryptodev_socket_id(dev_id), env->sess_pool);\n+\tif (ret < 0)\n+\t\tgoto error_exit;\n+\n+\tenv->mbuf = rte_pktmbuf_alloc(env->mpool);\n+\tif (!env->mbuf) {\n+\t\tret = -ENOMEM;\n+\t\tgoto error_exit;\n+\t}\n+\n+\tenv->op = rte_crypto_op_alloc(env->op_pool,\n+\t\t\tRTE_CRYPTO_OP_TYPE_SYMMETRIC);\n+\tif (!env->op) {\n+\t\tret = -ENOMEM;\n+\t\tgoto error_exit;\n+\t}\n+\n+\tret = rte_cryptodev_start(dev_id);\n+\tif (ret < 0)\n+\t\tgoto error_exit;\n+\n+\n+\treturn 0;\n+\n+error_exit:\n+\n+\tfips_dev_auto_test_uninit(dev_id, env);\n+\n+\treturn ret;\n+}\n+\n+int\n+fips_dev_self_test(uint8_t dev_id,\n+\t\tstruct fips_dev_broken_test_config *config)\n+{\n+\tstruct fips_dev_self_test_ops test_ops = {0};\n+\tstruct fips_dev_auto_test_env env;\n+\tuint32_t i, j, negative_test;\n+\tint ret;\n+\n+\tret = fips_dev_auto_test_init(dev_id, &env);\n+\tif (ret < 0) {\n+\t\tRTE_LOG(ERR, PMD, \"Failed to init self-test for PMD %u\\n\",\n+\t\t\t\tdev_id);\n+\t\treturn ret;\n+\t}\n+\n+\tfor (i = 0; i < RTE_DIM(self_test_vectors); i++) {\n+\t\tstruct fips_dev_self_test_vector *vec =\n+\t\t\t\tself_test_vectors[i];\n+\n+\t\tinit_test_op(&test_ops, vec);\n+\n+\t\tfor (j = 0; j < self_test_dir_max; j++) {\n+\t\t\tif (!config)\n+\t\t\t\tnegative_test = 0;\n+\t\t\telse {\n+\t\t\t\tif ((config->expect_fail_test_idx == i) &&\n+\t\t\t\t\t\t(config->expect_fail_dir == j))\n+\t\t\t\t\tnegative_test = 1;\n+\t\t\t\telse\n+\t\t\t\t\tnegative_test = 0;\n+\t\t\t}\n+\n+\t\t\tRTE_LOG(INFO, PMD, \"Testing (ID %u) %s %s%s...\\n\",\n+\t\t\t\t\ti,\n+\t\t\t\t\tvec->name,\n+\t\t\t\t\tj == self_test_dir_enc_auth_gen ?\n+\t\t\t\t\t\t\t\"Encrypt\" : \"Decrypt\",\n+\t\t\t\t\tnegative_test ? \" (Expect Fail)\" : \"\");\n+\n+\t\t\tret = run_single_test(dev_id, vec, &test_ops,\n+\t\t\t\t\t\t&env, j, negative_test);\n+\t\t\tswitch (ret) {\n+\t\t\tcase 0:\n+\t\t\t\tif (!negative_test)\n+\t\t\t\t\tbreak;\n+\t\t\t\tret = -1;\n+\t\t\t\tRTE_LOG(ERR, PMD, \"PMD %u Failed test %s %s\\n\",\n+\t\t\t\t\tdev_id, vec->name,\n+\t\t\t\t\tj == self_test_dir_enc_auth_gen ?\n+\t\t\t\t\t\"Encrypt\" : \"Decrypt\");\n+\t\t\t\tgoto error_exit;\n+\t\t\tcase -EACCES:\n+\t\t\t\tRTE_LOG(ERR, PMD, \"Not supported by %s. Skip\\n\",\n+\t\t\t\t\trte_cryptodev_name_get(dev_id));\n+\t\t\t\tret = 0;\n+\t\t\t\tbreak;\n+\t\t\tdefault:\n+\t\t\t\tRTE_LOG(ERR, PMD, \"PMD %u Failed test %s %s\\n\",\n+\t\t\t\t\tdev_id, vec->name,\n+\t\t\t\t\tj == self_test_dir_enc_auth_gen ?\n+\t\t\t\t\t\"Encrypt\" : \"Decrypt\");\n+\t\t\t\tgoto error_exit;\n+\t\t\t}\n+\t\t}\n+\t}\n+\n+error_exit:\n+\tfips_dev_auto_test_uninit(dev_id, &env);\n+\n+\tif (ret == 0) {\n+\t\tRTE_LOG(INFO, PMD, \"PMD %u finished self-test successfully\\n\",\n+\t\t\t\tdev_id);\n+\t}\n+\n+\treturn ret;\n+}\ndiff --git a/examples/fips_validation/fips_dev_self_test.h b/examples/fips_validation/fips_dev_self_test.h\nnew file mode 100644\nindex 000000000..dce97ce3d\n--- /dev/null\n+++ b/examples/fips_validation/fips_dev_self_test.h\n@@ -0,0 +1,25 @@\n+/* SPDX-License-Identifier: BSD-3-Clause\n+ * Copyright(c) 2018 Intel Corporation\n+ */\n+\n+#ifndef _CRYPTO_PMD_SELF_TEST_H_\n+#define _CRYPTO_PMD_SELF_TEST_H_\n+\n+#include <rte_crypto_sym.h>\n+\n+enum fips_dev_self_test_dir {\n+\tself_test_dir_enc_auth_gen = 0,\n+\tself_test_dir_dec_auth_verify,\n+\tself_test_dir_max\n+};\n+\n+struct fips_dev_broken_test_config {\n+\tuint32_t expect_fail_test_idx;\n+\tenum fips_dev_self_test_dir expect_fail_dir;\n+};\n+\n+int\n+fips_dev_self_test(uint8_t dev_id,\n+\t\tstruct fips_dev_broken_test_config *config);\n+\n+#endif /* _CRYPTO_PMD_SELF_TEST_H_ */\ndiff --git a/examples/fips_validation/main.c b/examples/fips_validation/main.c\nindex e7559c633..eafcb4ffe 100644\n--- a/examples/fips_validation/main.c\n+++ b/examples/fips_validation/main.c\n@@ -13,12 +13,18 @@\n #include <rte_string_fns.h>\n \n #include \"fips_validation.h\"\n+#include \"fips_dev_self_test.h\"\n \n #define REQ_FILE_PATH_KEYWORD\t\"req-file\"\n #define RSP_FILE_PATH_KEYWORD\t\"rsp-file\"\n #define FOLDER_KEYWORD\t\t\"path-is-folder\"\n #define CRYPTODEV_KEYWORD\t\"cryptodev\"\n #define CRYPTODEV_ID_KEYWORD\t\"cryptodev-id\"\n+#define CRYPTODEV_ST_KEYWORD\t\"self-test\"\n+#define CRYPTODEV_BK_ID_KEYWORD\t\"broken-test-id\"\n+#define CRYPTODEV_BK_DIR_KEY\t\"broken-test-dir\"\n+#define CRYPTODEV_ENC_KEYWORD\t\"enc\"\n+#define CRYPTODEV_DEC_KEYWORD\t\"dec\"\n \n struct fips_test_vector vec;\n struct fips_test_interim_info info;\n@@ -33,6 +39,8 @@ struct cryptodev_fips_validate_env {\n \tstruct rte_mbuf *mbuf;\n \tstruct rte_crypto_op *op;\n \tstruct rte_cryptodev_sym_session *sess;\n+\tuint32_t self_test;\n+\tstruct fips_dev_broken_test_config *broken_test_config;\n } env;\n \n static int\n@@ -42,6 +50,18 @@ cryptodev_fips_validate_app_int(void)\n \tstruct rte_cryptodev_qp_conf qp_conf = {128};\n \tint ret;\n \n+\tif (env.self_test) {\n+\t\tret = fips_dev_self_test(env.dev_id, env.broken_test_config);\n+\t\tif (ret < 0) {\n+\t\t\tstruct rte_cryptodev *cryptodev =\n+\t\t\t\t\trte_cryptodev_pmd_get_dev(env.dev_id);\n+\n+\t\t\trte_cryptodev_pmd_destroy(cryptodev);\n+\n+\t\t\treturn ret;\n+\t\t}\n+\t}\n+\n \tret = rte_cryptodev_configure(env.dev_id, &conf);\n \tif (ret < 0)\n \t\treturn ret;\n@@ -146,9 +166,14 @@ cryptodev_fips_validate_usage(const char *prgname)\n \t\t\"  --%s: RESPONSE-FILE-PATH\\n\"\n \t\t\"  --%s: indicating both paths are folders\\n\"\n \t\t\"  --%s: CRYPTODEV-NAME\\n\"\n-\t\t\"  --%s: CRYPTODEV-ID-NAME\\n\",\n+\t\t\"  --%s: CRYPTODEV-ID-NAME\\n\"\n+\t\t\"  --%s: self test indicator\\n\"\n+\t\t\"  --%s: self broken test ID\\n\"\n+\t\t\"  --%s: self broken test direction\\n\",\n \t\tprgname, REQ_FILE_PATH_KEYWORD, RSP_FILE_PATH_KEYWORD,\n-\t\tFOLDER_KEYWORD, CRYPTODEV_KEYWORD, CRYPTODEV_ID_KEYWORD);\n+\t\tFOLDER_KEYWORD, CRYPTODEV_KEYWORD, CRYPTODEV_ID_KEYWORD,\n+\t\tCRYPTODEV_ST_KEYWORD, CRYPTODEV_BK_ID_KEYWORD,\n+\t\tCRYPTODEV_BK_DIR_KEY);\n }\n \n static int\n@@ -164,6 +189,9 @@ cryptodev_fips_validate_parse_args(int argc, char **argv)\n \t\t\t{FOLDER_KEYWORD, no_argument, 0, 0},\n \t\t\t{CRYPTODEV_KEYWORD, required_argument, 0, 0},\n \t\t\t{CRYPTODEV_ID_KEYWORD, required_argument, 0, 0},\n+\t\t\t{CRYPTODEV_ST_KEYWORD, no_argument, 0, 0},\n+\t\t\t{CRYPTODEV_BK_ID_KEYWORD, required_argument, 0, 0},\n+\t\t\t{CRYPTODEV_BK_DIR_KEY, required_argument, 0, 0},\n \t\t\t{NULL, 0, 0, 0}\n \t};\n \n@@ -197,6 +225,56 @@ cryptodev_fips_validate_parse_args(int argc, char **argv)\n \t\t\t\t\tcryptodev_fips_validate_usage(prgname);\n \t\t\t\t\treturn -EINVAL;\n \t\t\t\t}\n+\t\t\t} else if (strcmp(lgopts[option_index].name,\n+\t\t\t\t\tCRYPTODEV_ST_KEYWORD) == 0) {\n+\t\t\t\tenv.self_test = 1;\n+\t\t\t} else if (strcmp(lgopts[option_index].name,\n+\t\t\t\t\tCRYPTODEV_BK_ID_KEYWORD) == 0) {\n+\t\t\t\tif (!env.broken_test_config) {\n+\t\t\t\t\tenv.broken_test_config = rte_malloc(\n+\t\t\t\t\t\tNULL,\n+\t\t\t\t\t\tsizeof(*env.broken_test_config),\n+\t\t\t\t\t\t0);\n+\t\t\t\t\tif (!env.broken_test_config)\n+\t\t\t\t\t\treturn -ENOMEM;\n+\n+\t\t\t\t\tenv.broken_test_config->expect_fail_dir =\n+\t\t\t\t\t\tself_test_dir_enc_auth_gen;\n+\t\t\t\t}\n+\n+\t\t\t\tif (parser_read_uint32(\n+\t\t\t\t\t&env.broken_test_config->expect_fail_test_idx,\n+\t\t\t\t\t\toptarg) < 0) {\n+\t\t\t\t\trte_free(env.broken_test_config);\n+\t\t\t\t\tcryptodev_fips_validate_usage(prgname);\n+\t\t\t\t\treturn -EINVAL;\n+\t\t\t\t}\n+\t\t\t} else if (strcmp(lgopts[option_index].name,\n+\t\t\t\t\tCRYPTODEV_BK_DIR_KEY) == 0) {\n+\t\t\t\tif (!env.broken_test_config) {\n+\t\t\t\t\tenv.broken_test_config = rte_malloc(\n+\t\t\t\t\t\tNULL,\n+\t\t\t\t\t\tsizeof(*env.broken_test_config),\n+\t\t\t\t\t\t0);\n+\t\t\t\t\tif (!env.broken_test_config)\n+\t\t\t\t\t\treturn -ENOMEM;\n+\n+\t\t\t\t\tenv.broken_test_config->\n+\t\t\t\t\t\texpect_fail_test_idx = 0;\n+\t\t\t\t}\n+\n+\t\t\t\tif (strcmp(optarg, CRYPTODEV_ENC_KEYWORD) == 0)\n+\t\t\t\t\tenv.broken_test_config->expect_fail_dir =\n+\t\t\t\t\t\tself_test_dir_enc_auth_gen;\n+\t\t\t\telse if (strcmp(optarg, CRYPTODEV_DEC_KEYWORD)\n+\t\t\t\t\t\t== 0)\n+\t\t\t\t\tenv.broken_test_config->expect_fail_dir =\n+\t\t\t\t\t\tself_test_dir_dec_auth_verify;\n+\t\t\t\telse {\n+\t\t\t\t\trte_free(env.broken_test_config);\n+\t\t\t\t\tcryptodev_fips_validate_usage(prgname);\n+\t\t\t\t\treturn -EINVAL;\n+\t\t\t\t}\n \t\t\t} else {\n \t\t\t\tcryptodev_fips_validate_usage(prgname);\n \t\t\t\treturn -EINVAL;\ndiff --git a/examples/fips_validation/meson.build b/examples/fips_validation/meson.build\nindex 498c9ba95..20f33f495 100644\n--- a/examples/fips_validation/meson.build\n+++ b/examples/fips_validation/meson.build\n@@ -16,5 +16,6 @@ sources = files(\n \t'fips_validation_gcm.c',\n \t'fips_validation_cmac.c',\n \t'fips_validation_ccm.c',\n+\t'fips_dev_self_test.c',\n \t'main.c'\n )\n",
    "prefixes": [
        "v2"
    ]
}