From patchwork Tue Feb 28 17:28:51 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Gowrishankar Muthukrishnan X-Patchwork-Id: 124585 X-Patchwork-Delegate: gakhil@marvell.com Return-Path: X-Original-To: patchwork@inbox.dpdk.org Delivered-To: patchwork@inbox.dpdk.org Received: from mails.dpdk.org (mails.dpdk.org [217.70.189.124]) by inbox.dpdk.org (Postfix) with ESMTP id DC01241D9F; Tue, 28 Feb 2023 18:29:39 +0100 (CET) Received: from mails.dpdk.org (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id 6693B42D2C; Tue, 28 Feb 2023 18:29:24 +0100 (CET) Received: from mx0b-0016f401.pphosted.com (mx0b-0016f401.pphosted.com [67.231.156.173]) by mails.dpdk.org (Postfix) with ESMTP id 85F6342BD9 for ; Tue, 28 Feb 2023 18:29:16 +0100 (CET) Received: from pps.filterd (m0045851.ppops.net [127.0.0.1]) by mx0b-0016f401.pphosted.com (8.17.1.19/8.17.1.19) with ESMTP id 31SGtYTf022217; Tue, 28 Feb 2023 09:29:16 -0800 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=marvell.com; h=from : to : cc : subject : date : message-id : in-reply-to : references : mime-version : content-transfer-encoding : content-type; s=pfpt0220; bh=HdMH2lMrXaiiawDKcG33iyXE0H9pKHVEARCzlH0DBfA=; b=WX5HlRGHwSbciDpxzvRHxkAt+42hNB5i0ivgrAYFY9joONFYf9loiSFunsRtyZBKrBB5 ZijmtzLxVquqks/XD/Kur+sWA3enRhllp0Lu32d/WcfH1St/A74HpQRjh+/FciGEy4lz 5RY5qnR8k8dfYVrLYTxUGMrcYULqMIQ4ZH2eYj/Pb4JP6fvNgWHr90aWo27y78yBZbpt I1A3wE9YugAH4qSV6rbO052x3Nkt2SqgO13mYPz4i/n/9nJlz7+KKznYMzlBWOv3FP7u VvfSzy7d7XOHXw2rdemgICYzYc7AKRhBUMndJE3OJVszU1ncS2zy8ovIDmBpuBSbmgTn nQ== Received: from dc5-exch01.marvell.com ([199.233.59.181]) by mx0b-0016f401.pphosted.com (PPS) with ESMTPS id 3nyjqty0pa-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-SHA384 bits=256 verify=NOT); Tue, 28 Feb 2023 09:29:15 -0800 Received: from DC5-EXCH02.marvell.com (10.69.176.39) by DC5-EXCH01.marvell.com (10.69.176.38) with Microsoft SMTP Server (TLS) id 15.0.1497.42; Tue, 28 Feb 2023 09:29:13 -0800 Received: from maili.marvell.com (10.69.176.80) by DC5-EXCH02.marvell.com (10.69.176.39) with Microsoft SMTP Server id 15.0.1497.42 via Frontend Transport; Tue, 28 Feb 2023 09:29:13 -0800 Received: from localhost.localdomain (unknown [10.28.34.38]) by maili.marvell.com (Postfix) with ESMTP id C41825B6940; Tue, 28 Feb 2023 09:29:11 -0800 (PST) From: Gowrishankar Muthukrishnan To: CC: Anoob Joseph , , Akhil Goyal , Brian Dooley , "Gowrishankar Muthukrishnan" Subject: [v2, 05/10] examples/fips_validation: add CCM JSON validation Date: Tue, 28 Feb 2023 22:58:51 +0530 Message-ID: X-Mailer: git-send-email 2.25.1 In-Reply-To: References: MIME-Version: 1.0 X-Proofpoint-ORIG-GUID: 4Tifj9F6jpULMxDsn4wbOLxjwocCfDks X-Proofpoint-GUID: 4Tifj9F6jpULMxDsn4wbOLxjwocCfDks X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.219,Aquarius:18.0.942,Hydra:6.0.573,FMLib:17.11.170.22 definitions=2023-02-28_15,2023-02-28_03,2023-02-09_01 X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org Add support in fips_validation to parse CCM JSON vectors. Signed-off-by: Gowrishankar Muthukrishnan --- doc/guides/sample_app_ug/fips_validation.rst | 1 + examples/fips_validation/fips_validation.c | 2 + examples/fips_validation/fips_validation.h | 3 + .../fips_validation/fips_validation_ccm.c | 132 ++++++++++++++++++ examples/fips_validation/main.c | 3 + 5 files changed, 141 insertions(+) diff --git a/doc/guides/sample_app_ug/fips_validation.rst b/doc/guides/sample_app_ug/fips_validation.rst index 4fc8297b34..613c5afd19 100644 --- a/doc/guides/sample_app_ug/fips_validation.rst +++ b/doc/guides/sample_app_ug/fips_validation.rst @@ -60,6 +60,7 @@ ACVP * Supported test vectors * AES-CBC (128,192,256) - AFT, MCT * AES-GCM (128,192,256) - AFT + * AES-CCM (128,192,256) - AFT * AES-CMAC (128,192,256) - AFT * AES-CTR (128,192,256) - AFT, CTR * AES-GMAC (128,192,256) - AFT diff --git a/examples/fips_validation/fips_validation.c b/examples/fips_validation/fips_validation.c index d3b6099d73..f840804009 100644 --- a/examples/fips_validation/fips_validation.c +++ b/examples/fips_validation/fips_validation.c @@ -460,6 +460,8 @@ fips_test_parse_one_json_vector_set(void) /* Vector sets contain the algorithm type, and nothing else we need. */ if (strstr(algo_str, "AES-GCM")) info.algo = FIPS_TEST_ALGO_AES_GCM; + else if (strstr(algo_str, "AES-CCM")) + info.algo = FIPS_TEST_ALGO_AES_CCM; else if (strstr(algo_str, "AES-GMAC")) info.algo = FIPS_TEST_ALGO_AES_GMAC; else if (strstr(algo_str, "HMAC")) diff --git a/examples/fips_validation/fips_validation.h b/examples/fips_validation/fips_validation.h index 8fcb5c8500..c4988053c1 100644 --- a/examples/fips_validation/fips_validation.h +++ b/examples/fips_validation/fips_validation.h @@ -338,6 +338,9 @@ fips_test_parse_one_json_case(void); int parse_test_gcm_json_init(void); +int +parse_test_ccm_json_init(void); + int parse_test_hmac_json_init(void); diff --git a/examples/fips_validation/fips_validation_ccm.c b/examples/fips_validation/fips_validation_ccm.c index 632999c1e4..0e3ee0d247 100644 --- a/examples/fips_validation/fips_validation_ccm.c +++ b/examples/fips_validation/fips_validation_ccm.c @@ -34,6 +34,18 @@ #define POS_KEYWORD "Pass" #define NEG_KEYWORD "Fail" +#define DIR_JSON_STR "direction" +#define IVLEN_JSON_STR "ivLen" +#define PTLEN_JSON_STR "payloadLen" +#define AADLEN_JSON_STR "aadLen" +#define TAGLEN_JSON_STR "tagLen" +#define KEYLEN_JSON_STR "keyLen" +#define PT_JSON_STR "pt" +#define CT_JSON_STR "ct" +#define KEY_JSON_STR "key" +#define IV_JSON_STR "iv" +#define AAD_JSON_STR "aad" + static int parser_dvpt_interim(const char *key, char *src, struct fips_val *val) { @@ -206,6 +218,126 @@ struct ccm_test_types { FIPS_TEST_ENC_AUTH_GEN}, }; +#ifdef USE_JANSSON +static int +parser_read_ccm_direction_str(__rte_unused const char *key, char *src, + __rte_unused struct fips_val *val) +{ + if (strcmp(src, "encrypt") == 0) + info.op = FIPS_TEST_ENC_AUTH_GEN; + else if (strcmp(src, "decrypt") == 0) + info.op = FIPS_TEST_DEC_AUTH_VERIF; + + return 0; +} + +static int +parser_read_ccm_aad_str(const char *key, char *src, struct fips_val *val) +{ + struct fips_val tmp_val = {0}; + uint32_t len = val->len; + + /* CCM aad requires 18 bytes padding before the real content */ + val->val = rte_zmalloc(NULL, len + 18, 0); + if (!val->val) + return -1; + + if (parse_uint8_hex_str(key, src, &tmp_val) < 0) + return -1; + + memcpy(val->val + 18, tmp_val.val, val->len); + rte_free(tmp_val.val); + + return 0; +} + +static int +parse_read_ccm_ct_str(const char *key, char *src, struct fips_val *val) +{ + int ret; + + val->len = vec.pt.len; + + ret = parse_uint8_known_len_hex_str(key, src, val); + if (ret < 0) + return ret; + + src += val->len * 2; + + ret = parse_uint8_known_len_hex_str("", src, &vec.aead.digest); + if (ret < 0) { + rte_free(val->val); + memset(val, 0, sizeof(*val)); + return ret; + } + + return 0; +} + +struct fips_test_callback ccm_tests_interim_json_vectors[] = { + {DIR_JSON_STR, parser_read_ccm_direction_str, NULL}, + {IVLEN_JSON_STR, parser_read_uint32_bit_val, &vec.iv}, + {PTLEN_JSON_STR, parser_read_uint32_bit_val, &vec.pt}, + {AADLEN_JSON_STR, parser_read_uint32_bit_val, &vec.aead.aad}, + {TAGLEN_JSON_STR, parser_read_uint32_bit_val, &vec.aead.digest}, + {KEYLEN_JSON_STR, parser_read_uint32_bit_val, &vec.aead.key}, + {NULL, NULL, NULL} /**< end pointer */ +}; + +struct fips_test_callback ccm_tests_json_vectors[] = { + {PT_JSON_STR, parse_uint8_known_len_hex_str, &vec.pt}, + {CT_JSON_STR, parse_read_ccm_ct_str, &vec.ct}, + {KEY_JSON_STR, parse_uint8_known_len_hex_str, &vec.aead.key}, + {IV_JSON_STR, parse_uint8_known_len_hex_str, &vec.iv}, + {AAD_JSON_STR, parser_read_ccm_aad_str, &vec.aead.aad}, + {NULL, NULL, NULL} /**< end pointer */ +}; + +static int +parse_test_ccm_json_writeback(struct fips_val *val) +{ + struct fips_val tmp_val; + json_t *tcId; + + tcId = json_object_get(json_info.json_test_case, "tcId"); + json_info.json_write_case = json_object(); + json_object_set(json_info.json_write_case, "tcId", tcId); + + if (info.op == FIPS_TEST_ENC_AUTH_GEN) { + json_t *ct; + + info.one_line_text[0] = '\0'; + writeback_hex_str("", info.one_line_text, val); + ct = json_string(info.one_line_text); + json_object_set_new(json_info.json_write_case, CT_JSON_STR, ct); + } else { + if (vec.status == RTE_CRYPTO_OP_STATUS_SUCCESS) { + tmp_val.val = val->val; + tmp_val.len = vec.pt.len; + + info.one_line_text[0] = '\0'; + writeback_hex_str("", info.one_line_text, &tmp_val); + json_object_set_new(json_info.json_write_case, PT_JSON_STR, + json_string(info.one_line_text)); + } else { + json_object_set_new(json_info.json_write_case, "testPassed", + json_false()); + } + } + + return 0; +} + +int +parse_test_ccm_json_init(void) +{ + info.interim_callbacks = ccm_tests_interim_json_vectors; + info.parse_writeback = parse_test_ccm_json_writeback; + info.callbacks = ccm_tests_json_vectors; + return 0; +} +#endif /* USE_JANSSON */ + static int parse_test_ccm_writeback(struct fips_val *val) { diff --git a/examples/fips_validation/main.c b/examples/fips_validation/main.c index d9e8c0eb02..5c6c12982d 100644 --- a/examples/fips_validation/main.c +++ b/examples/fips_validation/main.c @@ -2679,6 +2679,9 @@ fips_test_one_test_group(void) case FIPS_TEST_ALGO_AES_GCM: ret = parse_test_gcm_json_init(); break; + case FIPS_TEST_ALGO_AES_CCM: + ret = parse_test_ccm_json_init(); + break; case FIPS_TEST_ALGO_HMAC: ret = parse_test_hmac_json_init(); break;