xref: /dpdk/examples/fips_validation/fips_validation_gcm.c (revision 8d70a19417ad70accc3e138190875ff8f2baae8c)
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>
84aaad299SMarko Kovacevic 
9*8d70a194SDavid Marchand #ifdef USE_JANSSON
10b09aac2dSBrandon Lo #include <jansson.h>
11*8d70a194SDavid Marchand #endif /* USE_JANSSON */
12b09aac2dSBrandon Lo 
134aaad299SMarko Kovacevic #include <rte_cryptodev.h>
14d09abf2dSFan Zhang #include <rte_malloc.h>
154aaad299SMarko Kovacevic 
164aaad299SMarko Kovacevic #include "fips_validation.h"
174aaad299SMarko Kovacevic 
184aaad299SMarko Kovacevic #define NEW_LINE_STR	"#"
194aaad299SMarko Kovacevic #define OP_STR		"GCM "
204aaad299SMarko Kovacevic 
214aaad299SMarko Kovacevic #define PARAM_PREFIX	"["
224aaad299SMarko Kovacevic #define KEYLEN_STR	"Keylen = "
234aaad299SMarko Kovacevic #define IVLEN_STR	"IVlen = "
244aaad299SMarko Kovacevic #define PTLEN_STR	"PTlen = "
254aaad299SMarko Kovacevic #define AADLEN_STR	"AADlen = "
264aaad299SMarko Kovacevic #define TAGLEN_STR	"Taglen = "
274aaad299SMarko Kovacevic 
284aaad299SMarko Kovacevic #define COUNT_STR	"Count = "
294aaad299SMarko Kovacevic #define KEY_STR		"Key = "
304aaad299SMarko Kovacevic #define IV_STR		"IV = "
314aaad299SMarko Kovacevic #define PT_STR		"PT = "
324aaad299SMarko Kovacevic #define CT_STR		"CT = "
334aaad299SMarko Kovacevic #define TAG_STR		"Tag = "
344aaad299SMarko Kovacevic #define AAD_STR		"AAD = "
354aaad299SMarko Kovacevic 
364aaad299SMarko Kovacevic #define OP_ENC_STR	"Encrypt"
374aaad299SMarko Kovacevic #define OP_DEC_STR	"Decrypt"
38d09abf2dSFan Zhang /* External/Internal IV generation, specified in file name, following NIST
39d09abf2dSFan Zhang  * GCMVS Section 6.1
40d09abf2dSFan Zhang  */
41d09abf2dSFan Zhang #define OP_ENC_EXT_STR	"ExtIV"
42d09abf2dSFan Zhang #define OP_ENC_INT_STR	"IntIV"
434aaad299SMarko Kovacevic 
44b09aac2dSBrandon Lo #define KEYLEN_JSON_STR		"keyLen"
45b09aac2dSBrandon Lo #define IVLEN_JSON_STR		"ivLen"
46b09aac2dSBrandon Lo #define PAYLOADLEN_JSON_STR	"payloadLen"
47b09aac2dSBrandon Lo #define AADLEN_JSON_STR		"aadLen"
48b09aac2dSBrandon Lo #define TAGLEN_JSON_STR		"tagLen"
49b09aac2dSBrandon Lo 
50b09aac2dSBrandon Lo #define KEY_JSON_STR	"key"
51b09aac2dSBrandon Lo #define IV_JSON_STR		"iv"
52b09aac2dSBrandon Lo #define PT_JSON_STR		"pt"
53b09aac2dSBrandon Lo #define CT_JSON_STR		"ct"
54b09aac2dSBrandon Lo #define AAD_JSON_STR	"aad"
55b09aac2dSBrandon Lo #define TAG_JSON_STR	"tag"
56b09aac2dSBrandon Lo #define DIR_JSON_STR	"direction"
57b09aac2dSBrandon Lo 
58b09aac2dSBrandon Lo #define OP_ENC_JSON_STR	"encrypt"
59b09aac2dSBrandon Lo #define OP_DEC_JSON_STR	"decrypt"
60b09aac2dSBrandon Lo 
61b09aac2dSBrandon Lo #define IVGEN_JSON_STR	"ivGen"
62b09aac2dSBrandon Lo #define OP_ENC_EXT_JSON_STR	"external"
63b09aac2dSBrandon Lo #define OP_ENC_INT_JSON_STR	"internal"
64b09aac2dSBrandon Lo 
654aaad299SMarko Kovacevic #define NEG_TEST_STR	"FAIL"
664aaad299SMarko Kovacevic 
67d09abf2dSFan Zhang /**
68d09abf2dSFan Zhang  * GMAC is essentially zero length plaintext and uses AAD as input data.
69d09abf2dSFan Zhang  * NIST does not have GMAC specific test vector but using zero length "PTlen"
70d09abf2dSFan Zhang  * and uses AAD as input.
71d09abf2dSFan Zhang  **/
72d09abf2dSFan Zhang static int
73d09abf2dSFan Zhang parser_read_gcm_pt_len(const char *key, char *src,
74d09abf2dSFan Zhang 		__rte_unused struct fips_val *val)
75d09abf2dSFan Zhang {
76d09abf2dSFan Zhang 	int ret = parser_read_uint32_bit_val(key, src, &vec.pt);
77d09abf2dSFan Zhang 
78d09abf2dSFan Zhang 	if (ret < 0)
79d09abf2dSFan Zhang 		return ret;
80d09abf2dSFan Zhang 
81d09abf2dSFan Zhang 	if (vec.pt.len == 0) {
82d09abf2dSFan Zhang 		info.interim_info.gcm_data.is_gmac = 1;
83d09abf2dSFan Zhang 		test_ops.prepare_op = prepare_auth_op;
84d09abf2dSFan Zhang 		test_ops.prepare_xform = prepare_gmac_xform;
85d09abf2dSFan Zhang 	} else {
86d09abf2dSFan Zhang 		info.interim_info.gcm_data.is_gmac = 0;
87d09abf2dSFan Zhang 		test_ops.prepare_op = prepare_aead_op;
88d09abf2dSFan Zhang 		test_ops.prepare_xform = prepare_gcm_xform;
89d09abf2dSFan Zhang 	}
90d09abf2dSFan Zhang 
91d09abf2dSFan Zhang 	return ret;
92d09abf2dSFan Zhang }
93d09abf2dSFan Zhang 
94d09abf2dSFan Zhang static int
95d09abf2dSFan Zhang parse_gcm_aad_str(const char *key, char *src,
96d09abf2dSFan Zhang 		__rte_unused struct fips_val *val)
97d09abf2dSFan Zhang {
98d09abf2dSFan Zhang 	/* For GMAC test vector, AAD is treated as input */
99d09abf2dSFan Zhang 	if (info.interim_info.gcm_data.is_gmac) {
100d09abf2dSFan Zhang 		vec.pt.len = vec.aead.aad.len;
101d09abf2dSFan Zhang 		return parse_uint8_known_len_hex_str(key, src, &vec.pt);
102d09abf2dSFan Zhang 	} else /* gcm */
103d09abf2dSFan Zhang 		return parse_uint8_known_len_hex_str(key, src, &vec.aead.aad);
104d09abf2dSFan Zhang }
105d09abf2dSFan Zhang 
106d09abf2dSFan Zhang static int
107d09abf2dSFan Zhang parse_gcm_pt_ct_str(const char *key, char *src, struct fips_val *val)
108d09abf2dSFan Zhang {
109d09abf2dSFan Zhang 	/* According to NIST GCMVS section 6.1, IUT should generate IV data */
110d09abf2dSFan Zhang 	if (info.interim_info.gcm_data.gen_iv && vec.iv.len) {
111d09abf2dSFan Zhang 		uint32_t i;
112d09abf2dSFan Zhang 
113d09abf2dSFan Zhang 		if (!vec.iv.val) {
114d09abf2dSFan Zhang 			vec.iv.val = rte_malloc(0, vec.iv.len, 0);
115d09abf2dSFan Zhang 			if (!vec.iv.val)
116d09abf2dSFan Zhang 				return -ENOMEM;
117d09abf2dSFan Zhang 		}
118d09abf2dSFan Zhang 
119d09abf2dSFan Zhang 		for (i = 0; i < vec.iv.len; i++) {
120d09abf2dSFan Zhang 			int random = rand();
121d09abf2dSFan Zhang 			vec.iv.val[i] = (uint8_t)random;
122d09abf2dSFan Zhang 		}
123d09abf2dSFan Zhang 	}
124d09abf2dSFan Zhang 
125d09abf2dSFan Zhang 	/* if PTlen == 0, pt or ct will be handled by AAD later */
126d09abf2dSFan Zhang 	if (info.interim_info.gcm_data.is_gmac)
127d09abf2dSFan Zhang 		return 0;
128d09abf2dSFan Zhang 
129d09abf2dSFan Zhang 	return parse_uint8_known_len_hex_str(key, src, val);
130d09abf2dSFan Zhang }
131d09abf2dSFan Zhang 
1324aaad299SMarko Kovacevic struct fips_test_callback gcm_dec_vectors[] = {
13351b9292eSSucharitha Sarananaga 		{KEY_STR, parse_uint8_known_len_hex_str, &vec.aead.key},
1344aaad299SMarko Kovacevic 		{IV_STR, parse_uint8_known_len_hex_str, &vec.iv},
135d09abf2dSFan Zhang 		{CT_STR, parse_gcm_pt_ct_str, &vec.ct},
136d09abf2dSFan Zhang 		{AAD_STR, parse_gcm_aad_str, &vec.aead.aad},
1374aaad299SMarko Kovacevic 		{TAG_STR, parse_uint8_known_len_hex_str,
13851b9292eSSucharitha Sarananaga 				&vec.aead.digest},
1394aaad299SMarko Kovacevic 		{NULL, NULL, NULL} /**< end pointer */
1404aaad299SMarko Kovacevic };
141d09abf2dSFan Zhang 
1424aaad299SMarko Kovacevic struct fips_test_callback gcm_interim_vectors[] = {
14351b9292eSSucharitha Sarananaga 		{KEYLEN_STR, parser_read_uint32_bit_val, &vec.aead.key},
1444aaad299SMarko Kovacevic 		{IVLEN_STR, parser_read_uint32_bit_val, &vec.iv},
145d09abf2dSFan Zhang 		{PTLEN_STR, parser_read_gcm_pt_len, &vec.pt},
146b1ea86a0SAnoob Joseph 		{PTLEN_STR, parser_read_uint32_bit_val, &vec.ct},
147b1ea86a0SAnoob Joseph 		/**< The NIST test vectors use 'PTlen' to denote input text
148b1ea86a0SAnoob Joseph 		 *  length in case of decrypt & encrypt operations.
149b1ea86a0SAnoob Joseph 		 */
15051b9292eSSucharitha Sarananaga 		{AADLEN_STR, parser_read_uint32_bit_val, &vec.aead.aad},
1514aaad299SMarko Kovacevic 		{TAGLEN_STR, parser_read_uint32_bit_val,
15251b9292eSSucharitha Sarananaga 				&vec.aead.digest},
1534aaad299SMarko Kovacevic 		{NULL, NULL, NULL} /**< end pointer */
1544aaad299SMarko Kovacevic };
1554aaad299SMarko Kovacevic 
1564aaad299SMarko Kovacevic struct fips_test_callback gcm_enc_vectors[] = {
15751b9292eSSucharitha Sarananaga 		{KEY_STR, parse_uint8_known_len_hex_str, &vec.aead.key},
1584aaad299SMarko Kovacevic 		{IV_STR, parse_uint8_known_len_hex_str, &vec.iv},
159d09abf2dSFan Zhang 		{PT_STR, parse_gcm_pt_ct_str, &vec.pt},
160d09abf2dSFan Zhang 		{AAD_STR, parse_gcm_aad_str, &vec.aead.aad},
1614aaad299SMarko Kovacevic 		{NULL, NULL, NULL} /**< end pointer */
1624aaad299SMarko Kovacevic };
1634aaad299SMarko Kovacevic 
164*8d70a194SDavid Marchand #ifdef USE_JANSSON
165b09aac2dSBrandon Lo struct fips_test_callback gcm_dec_json_vectors[] = {
166b09aac2dSBrandon Lo 		{KEY_JSON_STR, parse_uint8_known_len_hex_str, &vec.aead.key},
167b09aac2dSBrandon Lo 		{IV_JSON_STR, parse_uint8_known_len_hex_str, &vec.iv},
168b09aac2dSBrandon Lo 		{CT_JSON_STR, parse_gcm_pt_ct_str, &vec.ct},
169b09aac2dSBrandon Lo 		{AAD_JSON_STR, parse_gcm_aad_str, &vec.aead.aad},
170b09aac2dSBrandon Lo 		{TAG_JSON_STR, parse_uint8_known_len_hex_str,
171b09aac2dSBrandon Lo 				&vec.aead.digest},
172b09aac2dSBrandon Lo 		{NULL, NULL, NULL} /**< end pointer */
173b09aac2dSBrandon Lo };
174b09aac2dSBrandon Lo 
175b09aac2dSBrandon Lo struct fips_test_callback gcm_interim_json_vectors[] = {
176b09aac2dSBrandon Lo 		{KEYLEN_JSON_STR, parser_read_uint32_bit_val, &vec.aead.key},
177b09aac2dSBrandon Lo 		{IVLEN_JSON_STR, parser_read_uint32_bit_val, &vec.iv},
178b09aac2dSBrandon Lo 		{PAYLOADLEN_JSON_STR, parser_read_gcm_pt_len, &vec.pt},
179b09aac2dSBrandon Lo 		{PAYLOADLEN_JSON_STR, parser_read_uint32_bit_val, &vec.ct},
180b09aac2dSBrandon Lo 		/**< The NIST json test vectors use 'payloadLen' to denote input text
181b09aac2dSBrandon Lo 		 *  length in case of decrypt & encrypt operations.
182b09aac2dSBrandon Lo 		 */
183b09aac2dSBrandon Lo 		{AADLEN_JSON_STR, parser_read_uint32_bit_val, &vec.aead.aad},
184b09aac2dSBrandon Lo 		{TAGLEN_JSON_STR, parser_read_uint32_bit_val,
185b09aac2dSBrandon Lo 				&vec.aead.digest},
186b09aac2dSBrandon Lo 		{NULL, NULL, NULL} /**< end pointer */
187b09aac2dSBrandon Lo };
188b09aac2dSBrandon Lo 
189b09aac2dSBrandon Lo struct fips_test_callback gcm_enc_json_vectors[] = {
190b09aac2dSBrandon Lo 		{KEY_JSON_STR, parse_uint8_known_len_hex_str, &vec.aead.key},
191b09aac2dSBrandon Lo 		{IV_JSON_STR, parse_uint8_known_len_hex_str, &vec.iv},
192b09aac2dSBrandon Lo 		{PT_JSON_STR, parse_gcm_pt_ct_str, &vec.pt},
193b09aac2dSBrandon Lo 		{AAD_JSON_STR, parse_gcm_aad_str, &vec.aead.aad},
194b09aac2dSBrandon Lo 		{NULL, NULL, NULL} /**< end pointer */
195b09aac2dSBrandon Lo };
196*8d70a194SDavid Marchand #endif /* USE_JANSSON */
197b09aac2dSBrandon Lo 
1984aaad299SMarko Kovacevic static int
1994aaad299SMarko Kovacevic parse_test_gcm_writeback(struct fips_val *val)
2004aaad299SMarko Kovacevic {
2014aaad299SMarko Kovacevic 	struct fips_val tmp_val;
2024aaad299SMarko Kovacevic 
2034aaad299SMarko Kovacevic 	if (info.op == FIPS_TEST_ENC_AUTH_GEN) {
204d09abf2dSFan Zhang 		/* According to NIST GCMVS section 6.1, IUT should provide
205d09abf2dSFan Zhang 		 * generate IV data
206d09abf2dSFan Zhang 		 */
207d09abf2dSFan Zhang 		if (info.interim_info.gcm_data.gen_iv) {
208d09abf2dSFan Zhang 			fprintf(info.fp_wr, "%s", IV_STR);
209d09abf2dSFan Zhang 			tmp_val.val = vec.iv.val;
210d09abf2dSFan Zhang 			tmp_val.len = vec.iv.len;
211d09abf2dSFan Zhang 
212d09abf2dSFan Zhang 			parse_write_hex_str(&tmp_val);
213d09abf2dSFan Zhang 			rte_free(vec.iv.val);
214d09abf2dSFan Zhang 			vec.iv.val = NULL;
215d09abf2dSFan Zhang 		}
216d09abf2dSFan Zhang 
2174aaad299SMarko Kovacevic 		fprintf(info.fp_wr, "%s", CT_STR);
2184aaad299SMarko Kovacevic 
219d09abf2dSFan Zhang 		if (!info.interim_info.gcm_data.is_gmac) {
2204aaad299SMarko Kovacevic 			tmp_val.val = val->val;
2214aaad299SMarko Kovacevic 			tmp_val.len = vec.pt.len;
2224aaad299SMarko Kovacevic 
2234aaad299SMarko Kovacevic 			parse_write_hex_str(&tmp_val);
224d09abf2dSFan Zhang 		} else
225d09abf2dSFan Zhang 			fprintf(info.fp_wr, "\n");
2264aaad299SMarko Kovacevic 
2274aaad299SMarko Kovacevic 		fprintf(info.fp_wr, "%s", TAG_STR);
2284aaad299SMarko Kovacevic 
2294aaad299SMarko Kovacevic 		tmp_val.val = val->val + vec.pt.len;
2304aaad299SMarko Kovacevic 		tmp_val.len = val->len - vec.pt.len;
2314aaad299SMarko Kovacevic 
2324aaad299SMarko Kovacevic 		parse_write_hex_str(&tmp_val);
2334aaad299SMarko Kovacevic 	} else {
2344aaad299SMarko Kovacevic 		if (vec.status == RTE_CRYPTO_OP_STATUS_SUCCESS) {
2354aaad299SMarko Kovacevic 			fprintf(info.fp_wr, "%s", PT_STR);
236d09abf2dSFan Zhang 			if (!info.interim_info.gcm_data.is_gmac) {
2374aaad299SMarko Kovacevic 				tmp_val.val = val->val;
2384aaad299SMarko Kovacevic 				tmp_val.len = vec.pt.len;
2394aaad299SMarko Kovacevic 
2404aaad299SMarko Kovacevic 				parse_write_hex_str(&tmp_val);
2414aaad299SMarko Kovacevic 			} else
242d09abf2dSFan Zhang 				fprintf(info.fp_wr, "\n");
243d09abf2dSFan Zhang 		} else
2444aaad299SMarko Kovacevic 			fprintf(info.fp_wr, "%s\n", NEG_TEST_STR);
2454aaad299SMarko Kovacevic 	}
2464aaad299SMarko Kovacevic 
2474aaad299SMarko Kovacevic 	return 0;
2484aaad299SMarko Kovacevic }
2494aaad299SMarko Kovacevic 
2504aaad299SMarko Kovacevic int
2514aaad299SMarko Kovacevic parse_test_gcm_init(void)
2524aaad299SMarko Kovacevic {
2534aaad299SMarko Kovacevic 	char *tmp;
2544aaad299SMarko Kovacevic 	uint32_t i;
2554aaad299SMarko Kovacevic 
2564aaad299SMarko Kovacevic 	for (i = 0; i < info.nb_vec_lines; i++) {
2574aaad299SMarko Kovacevic 		char *line = info.vec[i];
2584aaad299SMarko Kovacevic 
2594aaad299SMarko Kovacevic 		tmp = strstr(line, OP_STR);
2604aaad299SMarko Kovacevic 		if (tmp) {
2614aaad299SMarko Kovacevic 			if (strstr(line, OP_ENC_STR)) {
2624aaad299SMarko Kovacevic 				info.op = FIPS_TEST_ENC_AUTH_GEN;
2634aaad299SMarko Kovacevic 				info.callbacks = gcm_enc_vectors;
264d09abf2dSFan Zhang 				if (strstr(info.file_name, OP_ENC_INT_STR))
265d09abf2dSFan Zhang 					info.interim_info.gcm_data.gen_iv = 1;
2664aaad299SMarko Kovacevic 			} else if (strstr(line, OP_DEC_STR)) {
2674aaad299SMarko Kovacevic 				info.op = FIPS_TEST_DEC_AUTH_VERIF;
2684aaad299SMarko Kovacevic 				info.callbacks = gcm_dec_vectors;
2694aaad299SMarko Kovacevic 			} else
2704aaad299SMarko Kovacevic 				return -EINVAL;
2714aaad299SMarko Kovacevic 		}
2724aaad299SMarko Kovacevic 	}
2734aaad299SMarko Kovacevic 
2744aaad299SMarko Kovacevic 	info.interim_callbacks = gcm_interim_vectors;
2754aaad299SMarko Kovacevic 	info.parse_writeback = parse_test_gcm_writeback;
2764aaad299SMarko Kovacevic 
2774aaad299SMarko Kovacevic 	return 0;
2784aaad299SMarko Kovacevic }
279b09aac2dSBrandon Lo 
280*8d70a194SDavid Marchand #ifdef USE_JANSSON
281b09aac2dSBrandon Lo static int
282b09aac2dSBrandon Lo parse_test_gcm_json_writeback(struct fips_val *val)
283b09aac2dSBrandon Lo {
284b09aac2dSBrandon Lo 	struct fips_val tmp_val;
285b09aac2dSBrandon Lo 	json_t *tcId, *tag;
286b09aac2dSBrandon Lo 
287b09aac2dSBrandon Lo 	tcId = json_object_get(json_info.json_test_case, "tcId");
288b09aac2dSBrandon Lo 
289b09aac2dSBrandon Lo 	json_info.json_write_case = json_object();
290b09aac2dSBrandon Lo 	json_object_set(json_info.json_write_case, "tcId", tcId);
291b09aac2dSBrandon Lo 
292b09aac2dSBrandon Lo 	if (info.op == FIPS_TEST_ENC_AUTH_GEN) {
293b09aac2dSBrandon Lo 		json_t *ct;
294b09aac2dSBrandon Lo 
295b09aac2dSBrandon Lo 		tmp_val.val = val->val;
296b09aac2dSBrandon Lo 		tmp_val.len = vec.pt.len;
297b09aac2dSBrandon Lo 
298b09aac2dSBrandon Lo 		writeback_hex_str("", info.one_line_text, &tmp_val);
299b09aac2dSBrandon Lo 		ct = json_string(info.one_line_text);
300b09aac2dSBrandon Lo 		json_object_set_new(json_info.json_write_case, CT_JSON_STR, ct);
301b09aac2dSBrandon Lo 
302b09aac2dSBrandon Lo 		if (info.interim_info.gcm_data.gen_iv) {
303b09aac2dSBrandon Lo 			json_t *iv;
304b09aac2dSBrandon Lo 			tmp_val.val = vec.iv.val;
305b09aac2dSBrandon Lo 			tmp_val.len = vec.iv.len;
306b09aac2dSBrandon Lo 
307b09aac2dSBrandon Lo 			writeback_hex_str("", info.one_line_text, &tmp_val);
308b09aac2dSBrandon Lo 			iv = json_string(info.one_line_text);
309b09aac2dSBrandon Lo 			json_object_set_new(json_info.json_write_case, IV_JSON_STR, iv);
310b09aac2dSBrandon Lo 
311b09aac2dSBrandon Lo 			rte_free(vec.iv.val);
312b09aac2dSBrandon Lo 			vec.iv.val = NULL;
313b09aac2dSBrandon Lo 		}
314b09aac2dSBrandon Lo 
315b09aac2dSBrandon Lo 		tmp_val.val = val->val + vec.pt.len;
316b09aac2dSBrandon Lo 		tmp_val.len = val->len - vec.pt.len;
317b09aac2dSBrandon Lo 
318b09aac2dSBrandon Lo 		writeback_hex_str("", info.one_line_text, &tmp_val);
319b09aac2dSBrandon Lo 		tag = json_string(info.one_line_text);
320b09aac2dSBrandon Lo 		json_object_set_new(json_info.json_write_case, TAG_JSON_STR, tag);
321b09aac2dSBrandon Lo 	} else {
322b09aac2dSBrandon Lo 		if (vec.status == RTE_CRYPTO_OP_STATUS_SUCCESS) {
323b09aac2dSBrandon Lo 			if (!info.interim_info.gcm_data.is_gmac) {
324b09aac2dSBrandon Lo 				tmp_val.val = val->val;
325b09aac2dSBrandon Lo 				tmp_val.len = vec.pt.len;
326b09aac2dSBrandon Lo 
327b09aac2dSBrandon Lo 				writeback_hex_str("", info.one_line_text, &tmp_val);
328b09aac2dSBrandon Lo 				json_object_set_new(json_info.json_write_case, PT_JSON_STR,
329b09aac2dSBrandon Lo 					json_string(info.one_line_text));
330b09aac2dSBrandon Lo 			}
331b09aac2dSBrandon Lo 		} else {
332b09aac2dSBrandon Lo 			json_object_set_new(json_info.json_write_case, "testPassed", json_false());
333b09aac2dSBrandon Lo 		}
334b09aac2dSBrandon Lo 	}
335b09aac2dSBrandon Lo 
336b09aac2dSBrandon Lo 	return 0;
337b09aac2dSBrandon Lo }
338b09aac2dSBrandon Lo 
339b09aac2dSBrandon Lo int
340b09aac2dSBrandon Lo parse_test_gcm_json_init(void)
341b09aac2dSBrandon Lo {
342b09aac2dSBrandon Lo 	json_t *direction_obj;
343b09aac2dSBrandon Lo 	const char *direction_str;
344b09aac2dSBrandon Lo 
345b09aac2dSBrandon Lo 	direction_obj = json_object_get(json_info.json_test_group, DIR_JSON_STR);
346b09aac2dSBrandon Lo 	direction_str = json_string_value(direction_obj);
347b09aac2dSBrandon Lo 	info.interim_info.gcm_data.gen_iv = 0;
348b09aac2dSBrandon Lo 
349b09aac2dSBrandon Lo 	if (strcmp(direction_str, OP_ENC_JSON_STR) == 0) {
350b09aac2dSBrandon Lo 		json_t *ivGen_obj = json_object_get(json_info.json_test_group, IVGEN_JSON_STR);
351b09aac2dSBrandon Lo 		const char *ivGen_str = json_string_value(ivGen_obj);
352b09aac2dSBrandon Lo 
353b09aac2dSBrandon Lo 		info.op = FIPS_TEST_ENC_AUTH_GEN;
354b09aac2dSBrandon Lo 		info.callbacks = gcm_enc_json_vectors;
355b09aac2dSBrandon Lo 
356b09aac2dSBrandon Lo 		if (strcmp(ivGen_str, OP_ENC_INT_JSON_STR) == 0)
357b09aac2dSBrandon Lo 			info.interim_info.gcm_data.gen_iv = 1;
358b09aac2dSBrandon Lo 	} else if (strcmp(direction_str, OP_DEC_JSON_STR) == 0) {
359b09aac2dSBrandon Lo 		info.op = FIPS_TEST_DEC_AUTH_VERIF;
360b09aac2dSBrandon Lo 		info.callbacks = gcm_dec_json_vectors;
361b09aac2dSBrandon Lo 	} else {
362b09aac2dSBrandon Lo 		return -EINVAL;
363b09aac2dSBrandon Lo 	}
364b09aac2dSBrandon Lo 	info.interim_callbacks = gcm_interim_json_vectors;
365b09aac2dSBrandon Lo 	info.parse_writeback = parse_test_gcm_json_writeback;
366b09aac2dSBrandon Lo 
367b09aac2dSBrandon Lo 	return 0;
368b09aac2dSBrandon Lo }
369b09aac2dSBrandon Lo 
370*8d70a194SDavid Marchand #endif /* USE_JANSSON */
371