xref: /dpdk/examples/fips_validation/fips_validation_gcm.c (revision 02913adaed71fa8437fca727220303b4a0df0896)
14aaad299SMarko Kovacevic /* SPDX-License-Identifier: BSD-3-Clause
24aaad299SMarko Kovacevic  * Copyright(c) 2018 Intel Corporation
34aaad299SMarko Kovacevic  */
44aaad299SMarko Kovacevic 
54aaad299SMarko Kovacevic #include <string.h>
64aaad299SMarko Kovacevic #include <time.h>
74aaad299SMarko Kovacevic #include <stdio.h>
872b452c5SDmitry Kozlyuk #include <stdlib.h>
94aaad299SMarko Kovacevic 
108d70a194SDavid Marchand #ifdef USE_JANSSON
11b09aac2dSBrandon Lo #include <jansson.h>
128d70a194SDavid Marchand #endif /* USE_JANSSON */
13b09aac2dSBrandon Lo 
144aaad299SMarko Kovacevic #include <rte_cryptodev.h>
15d09abf2dSFan Zhang #include <rte_malloc.h>
164aaad299SMarko Kovacevic 
174aaad299SMarko Kovacevic #include "fips_validation.h"
184aaad299SMarko Kovacevic 
194aaad299SMarko Kovacevic #define NEW_LINE_STR	"#"
204aaad299SMarko Kovacevic #define OP_STR		"GCM "
214aaad299SMarko Kovacevic 
224aaad299SMarko Kovacevic #define PARAM_PREFIX	"["
234aaad299SMarko Kovacevic #define KEYLEN_STR	"Keylen = "
244aaad299SMarko Kovacevic #define IVLEN_STR	"IVlen = "
254aaad299SMarko Kovacevic #define PTLEN_STR	"PTlen = "
264aaad299SMarko Kovacevic #define AADLEN_STR	"AADlen = "
274aaad299SMarko Kovacevic #define TAGLEN_STR	"Taglen = "
284aaad299SMarko Kovacevic 
294aaad299SMarko Kovacevic #define COUNT_STR	"Count = "
304aaad299SMarko Kovacevic #define KEY_STR		"Key = "
314aaad299SMarko Kovacevic #define IV_STR		"IV = "
324aaad299SMarko Kovacevic #define PT_STR		"PT = "
334aaad299SMarko Kovacevic #define CT_STR		"CT = "
344aaad299SMarko Kovacevic #define TAG_STR		"Tag = "
354aaad299SMarko Kovacevic #define AAD_STR		"AAD = "
364aaad299SMarko Kovacevic 
374aaad299SMarko Kovacevic #define OP_ENC_STR	"Encrypt"
384aaad299SMarko Kovacevic #define OP_DEC_STR	"Decrypt"
39d09abf2dSFan Zhang /* External/Internal IV generation, specified in file name, following NIST
40d09abf2dSFan Zhang  * GCMVS Section 6.1
41d09abf2dSFan Zhang  */
42d09abf2dSFan Zhang #define OP_ENC_EXT_STR	"ExtIV"
43d09abf2dSFan Zhang #define OP_ENC_INT_STR	"IntIV"
444aaad299SMarko Kovacevic 
45b09aac2dSBrandon Lo #define KEYLEN_JSON_STR		"keyLen"
46b09aac2dSBrandon Lo #define IVLEN_JSON_STR		"ivLen"
47b09aac2dSBrandon Lo #define PAYLOADLEN_JSON_STR	"payloadLen"
48b09aac2dSBrandon Lo #define AADLEN_JSON_STR		"aadLen"
49b09aac2dSBrandon Lo #define TAGLEN_JSON_STR		"tagLen"
50b09aac2dSBrandon Lo 
51b09aac2dSBrandon Lo #define KEY_JSON_STR	"key"
52b09aac2dSBrandon Lo #define IV_JSON_STR		"iv"
53b09aac2dSBrandon Lo #define PT_JSON_STR		"pt"
54b09aac2dSBrandon Lo #define CT_JSON_STR		"ct"
55b09aac2dSBrandon Lo #define AAD_JSON_STR	"aad"
56b09aac2dSBrandon Lo #define TAG_JSON_STR	"tag"
57b09aac2dSBrandon Lo #define DIR_JSON_STR	"direction"
58b09aac2dSBrandon Lo 
59b09aac2dSBrandon Lo #define OP_ENC_JSON_STR	"encrypt"
60b09aac2dSBrandon Lo #define OP_DEC_JSON_STR	"decrypt"
61b09aac2dSBrandon Lo 
62b09aac2dSBrandon Lo #define IVGEN_JSON_STR	"ivGen"
63b09aac2dSBrandon Lo #define OP_ENC_EXT_JSON_STR	"external"
64b09aac2dSBrandon Lo #define OP_ENC_INT_JSON_STR	"internal"
65b09aac2dSBrandon Lo 
664aaad299SMarko Kovacevic #define NEG_TEST_STR	"FAIL"
674aaad299SMarko Kovacevic 
68d09abf2dSFan Zhang /**
69d09abf2dSFan Zhang  * GMAC is essentially zero length plaintext and uses AAD as input data.
70d09abf2dSFan Zhang  * NIST does not have GMAC specific test vector but using zero length "PTlen"
71d09abf2dSFan Zhang  * and uses AAD as input.
72d09abf2dSFan Zhang  **/
73d09abf2dSFan Zhang static int
parser_read_gcm_pt_len(const char * key,char * src,__rte_unused struct fips_val * val)74d09abf2dSFan Zhang parser_read_gcm_pt_len(const char *key, char *src,
75d09abf2dSFan Zhang 		__rte_unused struct fips_val *val)
76d09abf2dSFan Zhang {
77d09abf2dSFan Zhang 	int ret = parser_read_uint32_bit_val(key, src, &vec.pt);
78d09abf2dSFan Zhang 
79d09abf2dSFan Zhang 	if (ret < 0)
80d09abf2dSFan Zhang 		return ret;
81d09abf2dSFan Zhang 
82*02913adaSGowrishankar Muthukrishnan 	if (info.algo == FIPS_TEST_ALGO_AES_GMAC && vec.pt.len == 0) {
83d09abf2dSFan Zhang 		info.interim_info.gcm_data.is_gmac = 1;
8436128a67SGowrishankar Muthukrishnan 		test_ops.prepare_sym_op = prepare_auth_op;
8536128a67SGowrishankar Muthukrishnan 		test_ops.prepare_sym_xform = prepare_gmac_xform;
86d09abf2dSFan Zhang 	} else {
87d09abf2dSFan Zhang 		info.interim_info.gcm_data.is_gmac = 0;
8836128a67SGowrishankar Muthukrishnan 		test_ops.prepare_sym_op = prepare_aead_op;
8936128a67SGowrishankar Muthukrishnan 		test_ops.prepare_sym_xform = prepare_gcm_xform;
90d09abf2dSFan Zhang 	}
91d09abf2dSFan Zhang 
92d09abf2dSFan Zhang 	return ret;
93d09abf2dSFan Zhang }
94d09abf2dSFan Zhang 
95d09abf2dSFan Zhang static int
parse_gcm_aad_str(const char * key,char * src,__rte_unused struct fips_val * val)96d09abf2dSFan Zhang parse_gcm_aad_str(const char *key, char *src,
97d09abf2dSFan Zhang 		__rte_unused struct fips_val *val)
98d09abf2dSFan Zhang {
99d09abf2dSFan Zhang 	/* For GMAC test vector, AAD is treated as input */
100d09abf2dSFan Zhang 	if (info.interim_info.gcm_data.is_gmac) {
101d09abf2dSFan Zhang 		vec.pt.len = vec.aead.aad.len;
102d09abf2dSFan Zhang 		return parse_uint8_known_len_hex_str(key, src, &vec.pt);
103d09abf2dSFan Zhang 	} else /* gcm */
104d09abf2dSFan Zhang 		return parse_uint8_known_len_hex_str(key, src, &vec.aead.aad);
105d09abf2dSFan Zhang }
106d09abf2dSFan Zhang 
107d09abf2dSFan Zhang static int
parse_gcm_pt_ct_str(const char * key,char * src,struct fips_val * val)108d09abf2dSFan Zhang parse_gcm_pt_ct_str(const char *key, char *src, struct fips_val *val)
109d09abf2dSFan Zhang {
110d09abf2dSFan Zhang 	/* According to NIST GCMVS section 6.1, IUT should generate IV data */
111d09abf2dSFan Zhang 	if (info.interim_info.gcm_data.gen_iv && vec.iv.len) {
112d09abf2dSFan Zhang 		uint32_t i;
113d09abf2dSFan Zhang 
114d09abf2dSFan Zhang 		if (!vec.iv.val) {
115d09abf2dSFan Zhang 			vec.iv.val = rte_malloc(0, vec.iv.len, 0);
116d09abf2dSFan Zhang 			if (!vec.iv.val)
117d09abf2dSFan Zhang 				return -ENOMEM;
118d09abf2dSFan Zhang 		}
119d09abf2dSFan Zhang 
120d09abf2dSFan Zhang 		for (i = 0; i < vec.iv.len; i++) {
121d09abf2dSFan Zhang 			int random = rand();
122d09abf2dSFan Zhang 			vec.iv.val[i] = (uint8_t)random;
123d09abf2dSFan Zhang 		}
124d09abf2dSFan Zhang 	}
125d09abf2dSFan Zhang 
126d09abf2dSFan Zhang 	/* if PTlen == 0, pt or ct will be handled by AAD later */
127d09abf2dSFan Zhang 	if (info.interim_info.gcm_data.is_gmac)
128d09abf2dSFan Zhang 		return 0;
129d09abf2dSFan Zhang 
130d09abf2dSFan Zhang 	return parse_uint8_known_len_hex_str(key, src, val);
131d09abf2dSFan Zhang }
132d09abf2dSFan Zhang 
1334aaad299SMarko Kovacevic struct fips_test_callback gcm_dec_vectors[] = {
13451b9292eSSucharitha Sarananaga 		{KEY_STR, parse_uint8_known_len_hex_str, &vec.aead.key},
1354aaad299SMarko Kovacevic 		{IV_STR, parse_uint8_known_len_hex_str, &vec.iv},
136d09abf2dSFan Zhang 		{CT_STR, parse_gcm_pt_ct_str, &vec.ct},
137d09abf2dSFan Zhang 		{AAD_STR, parse_gcm_aad_str, &vec.aead.aad},
1384aaad299SMarko Kovacevic 		{TAG_STR, parse_uint8_known_len_hex_str,
13951b9292eSSucharitha Sarananaga 				&vec.aead.digest},
1404aaad299SMarko Kovacevic 		{NULL, NULL, NULL} /**< end pointer */
1414aaad299SMarko Kovacevic };
142d09abf2dSFan Zhang 
1434aaad299SMarko Kovacevic struct fips_test_callback gcm_interim_vectors[] = {
14451b9292eSSucharitha Sarananaga 		{KEYLEN_STR, parser_read_uint32_bit_val, &vec.aead.key},
1454aaad299SMarko Kovacevic 		{IVLEN_STR, parser_read_uint32_bit_val, &vec.iv},
146d09abf2dSFan Zhang 		{PTLEN_STR, parser_read_gcm_pt_len, &vec.pt},
147b1ea86a0SAnoob Joseph 		{PTLEN_STR, parser_read_uint32_bit_val, &vec.ct},
148b1ea86a0SAnoob Joseph 		/**< The NIST test vectors use 'PTlen' to denote input text
149b1ea86a0SAnoob Joseph 		 *  length in case of decrypt & encrypt operations.
150b1ea86a0SAnoob Joseph 		 */
15151b9292eSSucharitha Sarananaga 		{AADLEN_STR, parser_read_uint32_bit_val, &vec.aead.aad},
1524aaad299SMarko Kovacevic 		{TAGLEN_STR, parser_read_uint32_bit_val,
15351b9292eSSucharitha Sarananaga 				&vec.aead.digest},
1544aaad299SMarko Kovacevic 		{NULL, NULL, NULL} /**< end pointer */
1554aaad299SMarko Kovacevic };
1564aaad299SMarko Kovacevic 
1574aaad299SMarko Kovacevic struct fips_test_callback gcm_enc_vectors[] = {
15851b9292eSSucharitha Sarananaga 		{KEY_STR, parse_uint8_known_len_hex_str, &vec.aead.key},
1594aaad299SMarko Kovacevic 		{IV_STR, parse_uint8_known_len_hex_str, &vec.iv},
160d09abf2dSFan Zhang 		{PT_STR, parse_gcm_pt_ct_str, &vec.pt},
161d09abf2dSFan Zhang 		{AAD_STR, parse_gcm_aad_str, &vec.aead.aad},
1624aaad299SMarko Kovacevic 		{NULL, NULL, NULL} /**< end pointer */
1634aaad299SMarko Kovacevic };
1644aaad299SMarko Kovacevic 
1658d70a194SDavid Marchand #ifdef USE_JANSSON
166b09aac2dSBrandon Lo struct fips_test_callback gcm_dec_json_vectors[] = {
167b09aac2dSBrandon Lo 		{KEY_JSON_STR, parse_uint8_known_len_hex_str, &vec.aead.key},
168b09aac2dSBrandon Lo 		{IV_JSON_STR, parse_uint8_known_len_hex_str, &vec.iv},
169b09aac2dSBrandon Lo 		{CT_JSON_STR, parse_gcm_pt_ct_str, &vec.ct},
170b09aac2dSBrandon Lo 		{AAD_JSON_STR, parse_gcm_aad_str, &vec.aead.aad},
171b09aac2dSBrandon Lo 		{TAG_JSON_STR, parse_uint8_known_len_hex_str,
172b09aac2dSBrandon Lo 				&vec.aead.digest},
173b09aac2dSBrandon Lo 		{NULL, NULL, NULL} /**< end pointer */
174b09aac2dSBrandon Lo };
175b09aac2dSBrandon Lo 
176b09aac2dSBrandon Lo struct fips_test_callback gcm_interim_json_vectors[] = {
177b09aac2dSBrandon Lo 		{KEYLEN_JSON_STR, parser_read_uint32_bit_val, &vec.aead.key},
178b09aac2dSBrandon Lo 		{IVLEN_JSON_STR, parser_read_uint32_bit_val, &vec.iv},
179b09aac2dSBrandon Lo 		{PAYLOADLEN_JSON_STR, parser_read_gcm_pt_len, &vec.pt},
180b09aac2dSBrandon Lo 		{PAYLOADLEN_JSON_STR, parser_read_uint32_bit_val, &vec.ct},
181b09aac2dSBrandon Lo 		/**< The NIST json test vectors use 'payloadLen' to denote input text
182b09aac2dSBrandon Lo 		 *  length in case of decrypt & encrypt operations.
183b09aac2dSBrandon Lo 		 */
184b09aac2dSBrandon Lo 		{AADLEN_JSON_STR, parser_read_uint32_bit_val, &vec.aead.aad},
185b09aac2dSBrandon Lo 		{TAGLEN_JSON_STR, parser_read_uint32_bit_val,
186b09aac2dSBrandon Lo 				&vec.aead.digest},
187b09aac2dSBrandon Lo 		{NULL, NULL, NULL} /**< end pointer */
188b09aac2dSBrandon Lo };
189b09aac2dSBrandon Lo 
190b09aac2dSBrandon Lo struct fips_test_callback gcm_enc_json_vectors[] = {
191b09aac2dSBrandon Lo 		{KEY_JSON_STR, parse_uint8_known_len_hex_str, &vec.aead.key},
192b09aac2dSBrandon Lo 		{IV_JSON_STR, parse_uint8_known_len_hex_str, &vec.iv},
193b09aac2dSBrandon Lo 		{PT_JSON_STR, parse_gcm_pt_ct_str, &vec.pt},
194b09aac2dSBrandon Lo 		{AAD_JSON_STR, parse_gcm_aad_str, &vec.aead.aad},
195b09aac2dSBrandon Lo 		{NULL, NULL, NULL} /**< end pointer */
196b09aac2dSBrandon Lo };
1978d70a194SDavid Marchand #endif /* USE_JANSSON */
198b09aac2dSBrandon Lo 
1994aaad299SMarko Kovacevic static int
parse_test_gcm_writeback(struct fips_val * val)2004aaad299SMarko Kovacevic parse_test_gcm_writeback(struct fips_val *val)
2014aaad299SMarko Kovacevic {
2024aaad299SMarko Kovacevic 	struct fips_val tmp_val;
2034aaad299SMarko Kovacevic 
2044aaad299SMarko Kovacevic 	if (info.op == FIPS_TEST_ENC_AUTH_GEN) {
205d09abf2dSFan Zhang 		/* According to NIST GCMVS section 6.1, IUT should provide
206d09abf2dSFan Zhang 		 * generate IV data
207d09abf2dSFan Zhang 		 */
208d09abf2dSFan Zhang 		if (info.interim_info.gcm_data.gen_iv) {
209d09abf2dSFan Zhang 			fprintf(info.fp_wr, "%s", IV_STR);
210d09abf2dSFan Zhang 			tmp_val.val = vec.iv.val;
211d09abf2dSFan Zhang 			tmp_val.len = vec.iv.len;
212d09abf2dSFan Zhang 
213d09abf2dSFan Zhang 			parse_write_hex_str(&tmp_val);
214d09abf2dSFan Zhang 			rte_free(vec.iv.val);
215d09abf2dSFan Zhang 			vec.iv.val = NULL;
216d09abf2dSFan Zhang 		}
217d09abf2dSFan Zhang 
2184aaad299SMarko Kovacevic 		fprintf(info.fp_wr, "%s", CT_STR);
2194aaad299SMarko Kovacevic 
220d09abf2dSFan Zhang 		if (!info.interim_info.gcm_data.is_gmac) {
2214aaad299SMarko Kovacevic 			tmp_val.val = val->val;
2224aaad299SMarko Kovacevic 			tmp_val.len = vec.pt.len;
2234aaad299SMarko Kovacevic 
2244aaad299SMarko Kovacevic 			parse_write_hex_str(&tmp_val);
225d09abf2dSFan Zhang 		} else
226d09abf2dSFan Zhang 			fprintf(info.fp_wr, "\n");
2274aaad299SMarko Kovacevic 
2284aaad299SMarko Kovacevic 		fprintf(info.fp_wr, "%s", TAG_STR);
2294aaad299SMarko Kovacevic 
2304aaad299SMarko Kovacevic 		tmp_val.val = val->val + vec.pt.len;
2314aaad299SMarko Kovacevic 		tmp_val.len = val->len - vec.pt.len;
2324aaad299SMarko Kovacevic 
2334aaad299SMarko Kovacevic 		parse_write_hex_str(&tmp_val);
2344aaad299SMarko Kovacevic 	} else {
2354aaad299SMarko Kovacevic 		if (vec.status == RTE_CRYPTO_OP_STATUS_SUCCESS) {
2364aaad299SMarko Kovacevic 			fprintf(info.fp_wr, "%s", PT_STR);
237d09abf2dSFan Zhang 			if (!info.interim_info.gcm_data.is_gmac) {
2384aaad299SMarko Kovacevic 				tmp_val.val = val->val;
2394aaad299SMarko Kovacevic 				tmp_val.len = vec.pt.len;
2404aaad299SMarko Kovacevic 
2414aaad299SMarko Kovacevic 				parse_write_hex_str(&tmp_val);
2424aaad299SMarko Kovacevic 			} else
243d09abf2dSFan Zhang 				fprintf(info.fp_wr, "\n");
244d09abf2dSFan Zhang 		} else
2454aaad299SMarko Kovacevic 			fprintf(info.fp_wr, "%s\n", NEG_TEST_STR);
2464aaad299SMarko Kovacevic 	}
2474aaad299SMarko Kovacevic 
2484aaad299SMarko Kovacevic 	return 0;
2494aaad299SMarko Kovacevic }
2504aaad299SMarko Kovacevic 
2514aaad299SMarko Kovacevic int
parse_test_gcm_init(void)2524aaad299SMarko Kovacevic parse_test_gcm_init(void)
2534aaad299SMarko Kovacevic {
2544aaad299SMarko Kovacevic 	char *tmp;
2554aaad299SMarko Kovacevic 	uint32_t i;
2564aaad299SMarko Kovacevic 
2574aaad299SMarko Kovacevic 	for (i = 0; i < info.nb_vec_lines; i++) {
2584aaad299SMarko Kovacevic 		char *line = info.vec[i];
2594aaad299SMarko Kovacevic 
2604aaad299SMarko Kovacevic 		tmp = strstr(line, OP_STR);
2614aaad299SMarko Kovacevic 		if (tmp) {
2624aaad299SMarko Kovacevic 			if (strstr(line, OP_ENC_STR)) {
2634aaad299SMarko Kovacevic 				info.op = FIPS_TEST_ENC_AUTH_GEN;
2644aaad299SMarko Kovacevic 				info.callbacks = gcm_enc_vectors;
265d09abf2dSFan Zhang 				if (strstr(info.file_name, OP_ENC_INT_STR))
266d09abf2dSFan Zhang 					info.interim_info.gcm_data.gen_iv = 1;
2674aaad299SMarko Kovacevic 			} else if (strstr(line, OP_DEC_STR)) {
2684aaad299SMarko Kovacevic 				info.op = FIPS_TEST_DEC_AUTH_VERIF;
2694aaad299SMarko Kovacevic 				info.callbacks = gcm_dec_vectors;
2704aaad299SMarko Kovacevic 			} else
2714aaad299SMarko Kovacevic 				return -EINVAL;
2724aaad299SMarko Kovacevic 		}
2734aaad299SMarko Kovacevic 	}
2744aaad299SMarko Kovacevic 
2754aaad299SMarko Kovacevic 	info.interim_callbacks = gcm_interim_vectors;
2764aaad299SMarko Kovacevic 	info.parse_writeback = parse_test_gcm_writeback;
2774aaad299SMarko Kovacevic 
2784aaad299SMarko Kovacevic 	return 0;
2794aaad299SMarko Kovacevic }
280b09aac2dSBrandon Lo 
2818d70a194SDavid Marchand #ifdef USE_JANSSON
282b09aac2dSBrandon Lo static int
parse_test_gcm_json_writeback(struct fips_val * val)283b09aac2dSBrandon Lo parse_test_gcm_json_writeback(struct fips_val *val)
284b09aac2dSBrandon Lo {
285b09aac2dSBrandon Lo 	struct fips_val tmp_val;
286b09aac2dSBrandon Lo 	json_t *tcId, *tag;
287b09aac2dSBrandon Lo 
288b09aac2dSBrandon Lo 	tcId = json_object_get(json_info.json_test_case, "tcId");
289b09aac2dSBrandon Lo 
290b09aac2dSBrandon Lo 	json_info.json_write_case = json_object();
291b09aac2dSBrandon Lo 	json_object_set(json_info.json_write_case, "tcId", tcId);
292b09aac2dSBrandon Lo 
293b09aac2dSBrandon Lo 	if (info.op == FIPS_TEST_ENC_AUTH_GEN) {
294b09aac2dSBrandon Lo 		json_t *ct;
295e27268bdSBrian Dooley 		if (!info.interim_info.gcm_data.is_gmac) {
296b09aac2dSBrandon Lo 			tmp_val.val = val->val;
297b09aac2dSBrandon Lo 			tmp_val.len = vec.pt.len;
298b09aac2dSBrandon Lo 
299*02913adaSGowrishankar Muthukrishnan 			info.one_line_text[0] = '\0';
300b09aac2dSBrandon Lo 			writeback_hex_str("", info.one_line_text, &tmp_val);
301b09aac2dSBrandon Lo 			ct = json_string(info.one_line_text);
302b09aac2dSBrandon Lo 			json_object_set_new(json_info.json_write_case, CT_JSON_STR, ct);
303e27268bdSBrian Dooley 		}
304b09aac2dSBrandon Lo 
305b09aac2dSBrandon Lo 		if (info.interim_info.gcm_data.gen_iv) {
306b09aac2dSBrandon Lo 			json_t *iv;
307b09aac2dSBrandon Lo 			tmp_val.val = vec.iv.val;
308b09aac2dSBrandon Lo 			tmp_val.len = vec.iv.len;
309b09aac2dSBrandon Lo 
310b09aac2dSBrandon Lo 			writeback_hex_str("", info.one_line_text, &tmp_val);
311b09aac2dSBrandon Lo 			iv = json_string(info.one_line_text);
312b09aac2dSBrandon Lo 			json_object_set_new(json_info.json_write_case, IV_JSON_STR, iv);
313b09aac2dSBrandon Lo 
314b09aac2dSBrandon Lo 			rte_free(vec.iv.val);
315b09aac2dSBrandon Lo 			vec.iv.val = NULL;
316b09aac2dSBrandon Lo 		}
317b09aac2dSBrandon Lo 
318b09aac2dSBrandon Lo 		tmp_val.val = val->val + vec.pt.len;
319b09aac2dSBrandon Lo 		tmp_val.len = val->len - vec.pt.len;
320b09aac2dSBrandon Lo 
321b09aac2dSBrandon Lo 		writeback_hex_str("", info.one_line_text, &tmp_val);
322b09aac2dSBrandon Lo 		tag = json_string(info.one_line_text);
323b09aac2dSBrandon Lo 		json_object_set_new(json_info.json_write_case, TAG_JSON_STR, tag);
324b09aac2dSBrandon Lo 	} else {
325b09aac2dSBrandon Lo 		if (vec.status == RTE_CRYPTO_OP_STATUS_SUCCESS) {
326b09aac2dSBrandon Lo 			if (!info.interim_info.gcm_data.is_gmac) {
327b09aac2dSBrandon Lo 				tmp_val.val = val->val;
328b09aac2dSBrandon Lo 				tmp_val.len = vec.pt.len;
329b09aac2dSBrandon Lo 
330*02913adaSGowrishankar Muthukrishnan 				info.one_line_text[0] = '\0';
331b09aac2dSBrandon Lo 				writeback_hex_str("", info.one_line_text, &tmp_val);
332b09aac2dSBrandon Lo 				json_object_set_new(json_info.json_write_case, PT_JSON_STR,
333b09aac2dSBrandon Lo 					json_string(info.one_line_text));
334ad42b228SArchana Muniganti 			} else {
3355b540bebSGowrishankar Muthukrishnan 				json_object_set_new(json_info.json_write_case, "testPassed",
3365b540bebSGowrishankar Muthukrishnan 					json_true());
337b09aac2dSBrandon Lo 			}
338b09aac2dSBrandon Lo 		} else {
3395b540bebSGowrishankar Muthukrishnan 			json_object_set_new(json_info.json_write_case, "testPassed",
3405b540bebSGowrishankar Muthukrishnan 				json_false());
341b09aac2dSBrandon Lo 		}
342b09aac2dSBrandon Lo 	}
343b09aac2dSBrandon Lo 
344b09aac2dSBrandon Lo 	return 0;
345b09aac2dSBrandon Lo }
346b09aac2dSBrandon Lo 
347b09aac2dSBrandon Lo int
parse_test_gcm_json_init(void)348b09aac2dSBrandon Lo parse_test_gcm_json_init(void)
349b09aac2dSBrandon Lo {
350b09aac2dSBrandon Lo 	json_t *direction_obj;
351b09aac2dSBrandon Lo 	const char *direction_str;
352b09aac2dSBrandon Lo 
353b09aac2dSBrandon Lo 	direction_obj = json_object_get(json_info.json_test_group, DIR_JSON_STR);
354b09aac2dSBrandon Lo 	direction_str = json_string_value(direction_obj);
355b09aac2dSBrandon Lo 	info.interim_info.gcm_data.gen_iv = 0;
356b09aac2dSBrandon Lo 
357b09aac2dSBrandon Lo 	if (strcmp(direction_str, OP_ENC_JSON_STR) == 0) {
358b09aac2dSBrandon Lo 		json_t *ivGen_obj = json_object_get(json_info.json_test_group, IVGEN_JSON_STR);
359b09aac2dSBrandon Lo 		const char *ivGen_str = json_string_value(ivGen_obj);
360b09aac2dSBrandon Lo 
361b09aac2dSBrandon Lo 		info.op = FIPS_TEST_ENC_AUTH_GEN;
362b09aac2dSBrandon Lo 		info.callbacks = gcm_enc_json_vectors;
363b09aac2dSBrandon Lo 
364b09aac2dSBrandon Lo 		if (strcmp(ivGen_str, OP_ENC_INT_JSON_STR) == 0)
365b09aac2dSBrandon Lo 			info.interim_info.gcm_data.gen_iv = 1;
366b09aac2dSBrandon Lo 	} else if (strcmp(direction_str, OP_DEC_JSON_STR) == 0) {
367b09aac2dSBrandon Lo 		info.op = FIPS_TEST_DEC_AUTH_VERIF;
368b09aac2dSBrandon Lo 		info.callbacks = gcm_dec_json_vectors;
369b09aac2dSBrandon Lo 	} else {
370b09aac2dSBrandon Lo 		return -EINVAL;
371b09aac2dSBrandon Lo 	}
372b09aac2dSBrandon Lo 	info.interim_callbacks = gcm_interim_json_vectors;
373b09aac2dSBrandon Lo 	info.parse_writeback = parse_test_gcm_json_writeback;
374b09aac2dSBrandon Lo 
375b09aac2dSBrandon Lo 	return 0;
376b09aac2dSBrandon Lo }
377b09aac2dSBrandon Lo 
3788d70a194SDavid Marchand #endif /* USE_JANSSON */
379