From mboxrd@z Thu Jan  1 00:00:00 1970
Return-Path: <dev-bounces@dpdk.org>
Received: from mails.dpdk.org (mails.dpdk.org [217.70.189.124])
	by inbox.dpdk.org (Postfix) with ESMTP id 06100A0542;
	Mon, 30 May 2022 17:53:09 +0200 (CEST)
Received: from [217.70.189.124] (localhost [127.0.0.1])
	by mails.dpdk.org (Postfix) with ESMTP id D7AEC427F3;
	Mon, 30 May 2022 17:53:02 +0200 (CEST)
Received: from mx0b-0016f401.pphosted.com (mx0b-0016f401.pphosted.com
 [67.231.156.173])
 by mails.dpdk.org (Postfix) with ESMTP id 670EF400D6
 for <dev@dpdk.org>; Mon, 30 May 2022 17:53:01 +0200 (CEST)
Received: from pps.filterd (m0045851.ppops.net [127.0.0.1])
 by mx0b-0016f401.pphosted.com (8.17.1.5/8.17.1.5) with ESMTP id 24UB3Ylx023451;
 Mon, 30 May 2022 08:53:00 -0700
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=uPDn55iHcSv8D5Bu+EuFWWxm/ZX+vZZ3vBzkSU/dNtE=;
 b=it14Y7+zfx4sPYqGL5AAm/43Y+iO644q+U5GDDSgo6waCLQ2v56YvsX2BBkn0eP9VB5R
 G1Ywvg6pTa2xOcWCrwkObW8uAvjgr6tXTcl7U7gndfQQYHE61C9L7kAsfZaZs+HcTDNA
 +xTAPLSg+zWpiGyA3L+nejDTZUvtEMIVpe05FR5ZmMscDU+S/d8tvmKbHgdeNRzdU/4D
 PcYfBedBMg0K71ybfzF768k7Xstcakr8RbDEU5C+IzePxw886SlAEGM2Sai76EHUcPRq
 Rcq7OTXKsfxtCNMAR9u7LfpiVe+ayARcUCfBY2OGYgQlHhGZzJoYq8yb2VHFnRZm2jf/ Ng== 
Received: from dc5-exch01.marvell.com ([199.233.59.181])
 by mx0b-0016f401.pphosted.com (PPS) with ESMTPS id 3gbk8n61pd-2
 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-SHA384 bits=256 verify=NOT);
 Mon, 30 May 2022 08:53:00 -0700
Received: from DC5-EXCH01.marvell.com (10.69.176.38) by DC5-EXCH01.marvell.com
 (10.69.176.38) with Microsoft SMTP Server (TLS) id 15.0.1497.2;
 Mon, 30 May 2022 08:52:58 -0700
Received: from maili.marvell.com (10.69.176.80) by DC5-EXCH01.marvell.com
 (10.69.176.38) with Microsoft SMTP Server id 15.0.1497.2 via Frontend
 Transport; Mon, 30 May 2022 08:52:58 -0700
Received: from localhost.localdomain (unknown [10.28.34.38])
 by maili.marvell.com (Postfix) with ESMTP id 253C03F7081;
 Mon, 30 May 2022 08:52:55 -0700 (PDT)
From: Gowrishankar Muthukrishnan <gmuthukrishn@marvell.com>
To: <dev@dpdk.org>
CC: Fan Zhang <roy.fan.zhang@intel.com>, Brian Dooley
 <brian.dooley@intel.com>, <lylavoie@iol.unh.edu>, Anoob Joseph
 <anoobj@marvell.com>, Archana Muniganti <marchana@marvell.com>, Jerin Jacob
 <jerinj@marvell.com>, Brandon Lo <blo@iol.unh.edu>, "Gowrishankar
 Muthukrishnan" <gmuthukrishn@marvell.com>
Subject: [v9, 03/10] examples/fips_validation: add json parsing
Date: Mon, 30 May 2022 21:22:37 +0530
Message-ID: <c81bc42a1dafefddfba17883eac2a45132ffac0a.1653925803.git.gmuthukrishn@marvell.com>
X-Mailer: git-send-email 2.25.1
In-Reply-To: <cover.1653925803.git.gmuthukrishn@marvell.com>
References: <cover.1653925803.git.gmuthukrishn@marvell.com>
MIME-Version: 1.0
Content-Transfer-Encoding: 8bit
Content-Type: text/plain
X-Proofpoint-ORIG-GUID: Fv4njgLlnR2FySyk2MQnBxmZvwkcuhIc
X-Proofpoint-GUID: Fv4njgLlnR2FySyk2MQnBxmZvwkcuhIc
X-Proofpoint-Virus-Version: vendor=baseguard
 engine=ICAP:2.0.205,Aquarius:18.0.874,Hydra:6.0.486,FMLib:17.11.64.514
 definitions=2022-05-30_07,2022-05-30_01,2022-02-23_01
X-BeenThere: dev@dpdk.org
X-Mailman-Version: 2.1.29
Precedence: list
List-Id: DPDK patches and discussions <dev.dpdk.org>
List-Unsubscribe: <https://mails.dpdk.org/options/dev>,
 <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>,
 <mailto:dev-request@dpdk.org?subject=subscribe>
Errors-To: dev-bounces@dpdk.org

From: Brandon Lo <blo@iol.unh.edu>

Added functions to parse the required information from a vector set
given in the new json format.

Signed-off-by: Brandon Lo <blo@iol.unh.edu>
Signed-off-by: Gowrishankar Muthukrishnan <gmuthukrishn@marvell.com>
---
v7:
* pulled json_info define from next patch.

v3:
* fix checkpatch warnings

v2:
* fix for loop initialization
---
 examples/fips_validation/fips_validation.c | 92 ++++++++++++++++++++++
 examples/fips_validation/main.c            |  4 +
 2 files changed, 96 insertions(+)

diff --git a/examples/fips_validation/fips_validation.c b/examples/fips_validation/fips_validation.c
index 38c99b291c..6594a15579 100644
--- a/examples/fips_validation/fips_validation.c
+++ b/examples/fips_validation/fips_validation.c
@@ -276,6 +276,8 @@ parse_file_type(const char *path)
 		info.file_type = FIPS_TYPE_RSP;
 	else if (strstr(path, FAX_FILE_PREFIX))
 		info.file_type = FIPS_TYPE_FAX;
+	else if (strstr(path, JSON_FILE_PREFIX))
+		info.file_type = FIPS_TYPE_JSON;
 	else
 		return -EINVAL;
 
@@ -311,6 +313,21 @@ fips_test_init(const char *req_file_path, const char *rsp_file_path,
 		return -EINVAL;
 	}
 
+	if (info.file_type == FIPS_TYPE_JSON) {
+#ifdef RTE_HAS_JANSSON
+		json_error_t error;
+		json_info.json_root = json_loadf(info.fp_rd, 0, &error);
+		if (!json_info.json_root) {
+			RTE_LOG(ERR, USER1, "Cannot parse json file %s (line %d, column %d)\n",
+				req_file_path, error.line, error.column);
+			return -EINVAL;
+		}
+#else /* RTE_HAS_JANSSON */
+		RTE_LOG(ERR, USER1, "No json library configured.\n");
+		return -EINVAL;
+#endif /* RTE_HAS_JANSSON */
+	}
+
 	info.fp_wr = fopen(rsp_file_path, "w");
 	if (!info.fp_wr) {
 		RTE_LOG(ERR, USER1, "Cannot open file %s\n", rsp_file_path);
@@ -329,6 +346,9 @@ fips_test_init(const char *req_file_path, const char *rsp_file_path,
 		return -EINVAL;
 	}
 
+	if (info.file_type == FIPS_TYPE_JSON)
+		return 0;
+
 	if (fips_test_parse_header() < 0) {
 		RTE_LOG(ERR, USER1, "Failed parsing header\n");
 		return -1;
@@ -428,6 +448,78 @@ fips_test_write_one_case(void)
 		fprintf(info.fp_wr, "%s\n", info.vec[i]);
 }
 
+#ifdef RTE_HAS_JANSSON
+int
+fips_test_parse_one_json_vector_set(void)
+{
+	json_t *algo_obj = json_object_get(json_info.json_vector_set, "algorithm");
+	const char *algo_str = json_string_value(algo_obj);
+
+	/* 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
+		return -EINVAL;
+
+	return 0;
+}
+
+int
+fips_test_parse_one_json_group(void)
+{
+	int ret, i;
+	json_int_t val;
+	json_t *param;
+
+	if (info.interim_callbacks) {
+		char json_value[256];
+		for (i = 0; info.interim_callbacks[i].key != NULL; i++) {
+			param = json_object_get(json_info.json_test_group,
+					info.interim_callbacks[i].key);
+			val = json_integer_value(param);
+			snprintf(json_value, 255, "%"JSON_INTEGER_FORMAT, val);
+			/* First argument is blank because the key
+			 * is not included in the string being parsed.
+			 */
+			ret = info.interim_callbacks[i].cb(
+				"", json_value,
+				info.interim_callbacks[i].val
+			);
+			if (ret < 0)
+				return ret;
+		}
+	}
+
+	return 0;
+}
+
+int
+fips_test_parse_one_json_case(void)
+{
+	uint32_t i;
+	int ret = 0;
+	json_t *param;
+
+	for (i = 0; info.callbacks[i].key != NULL; i++) {
+		param = json_object_get(json_info.json_test_case, info.callbacks[i].key);
+		if (param) {
+			strcpy(info.one_line_text, json_string_value(param));
+			/* First argument is blank because the key
+			 * is not included in the string being parsed.
+			 */
+			ret = info.callbacks[i].cb(
+				"", info.one_line_text,
+				info.callbacks[i].val
+			);
+			if (ret < 0)
+				return ret;
+		}
+	}
+
+	return 0;
+}
+#endif /* RTE_HAS_JANSSON */
+
 static int
 parser_read_uint64_hex(uint64_t *value, const char *p)
 {
diff --git a/examples/fips_validation/main.c b/examples/fips_validation/main.c
index 554d74cda0..11db983ab0 100644
--- a/examples/fips_validation/main.c
+++ b/examples/fips_validation/main.c
@@ -39,6 +39,10 @@ enum {
 struct fips_test_vector vec;
 struct fips_test_interim_info info;
 
+#ifdef RTE_HAS_JANSSON
+struct fips_test_json_info json_info;
+#endif /* RTE_HAS_JANSSON */
+
 struct cryptodev_fips_validate_env {
 	const char *req_path;
 	const char *rsp_path;
-- 
2.25.1