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