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