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*b09aac2dSBrandon Lo #ifdef RTE_HAS_JANSSON 10*b09aac2dSBrandon Lo #include <jansson.h> 11*b09aac2dSBrandon Lo #endif /* RTE_HAS_JANSSON */ 12*b09aac2dSBrandon 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 44*b09aac2dSBrandon Lo #define KEYLEN_JSON_STR "keyLen" 45*b09aac2dSBrandon Lo #define IVLEN_JSON_STR "ivLen" 46*b09aac2dSBrandon Lo #define PAYLOADLEN_JSON_STR "payloadLen" 47*b09aac2dSBrandon Lo #define AADLEN_JSON_STR "aadLen" 48*b09aac2dSBrandon Lo #define TAGLEN_JSON_STR "tagLen" 49*b09aac2dSBrandon Lo 50*b09aac2dSBrandon Lo #define KEY_JSON_STR "key" 51*b09aac2dSBrandon Lo #define IV_JSON_STR "iv" 52*b09aac2dSBrandon Lo #define PT_JSON_STR "pt" 53*b09aac2dSBrandon Lo #define CT_JSON_STR "ct" 54*b09aac2dSBrandon Lo #define AAD_JSON_STR "aad" 55*b09aac2dSBrandon Lo #define TAG_JSON_STR "tag" 56*b09aac2dSBrandon Lo #define DIR_JSON_STR "direction" 57*b09aac2dSBrandon Lo 58*b09aac2dSBrandon Lo #define OP_ENC_JSON_STR "encrypt" 59*b09aac2dSBrandon Lo #define OP_DEC_JSON_STR "decrypt" 60*b09aac2dSBrandon Lo 61*b09aac2dSBrandon Lo #define IVGEN_JSON_STR "ivGen" 62*b09aac2dSBrandon Lo #define OP_ENC_EXT_JSON_STR "external" 63*b09aac2dSBrandon Lo #define OP_ENC_INT_JSON_STR "internal" 64*b09aac2dSBrandon 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*b09aac2dSBrandon Lo #ifdef RTE_HAS_JANSSON 165*b09aac2dSBrandon Lo struct fips_test_callback gcm_dec_json_vectors[] = { 166*b09aac2dSBrandon Lo {KEY_JSON_STR, parse_uint8_known_len_hex_str, &vec.aead.key}, 167*b09aac2dSBrandon Lo {IV_JSON_STR, parse_uint8_known_len_hex_str, &vec.iv}, 168*b09aac2dSBrandon Lo {CT_JSON_STR, parse_gcm_pt_ct_str, &vec.ct}, 169*b09aac2dSBrandon Lo {AAD_JSON_STR, parse_gcm_aad_str, &vec.aead.aad}, 170*b09aac2dSBrandon Lo {TAG_JSON_STR, parse_uint8_known_len_hex_str, 171*b09aac2dSBrandon Lo &vec.aead.digest}, 172*b09aac2dSBrandon Lo {NULL, NULL, NULL} /**< end pointer */ 173*b09aac2dSBrandon Lo }; 174*b09aac2dSBrandon Lo 175*b09aac2dSBrandon Lo struct fips_test_callback gcm_interim_json_vectors[] = { 176*b09aac2dSBrandon Lo {KEYLEN_JSON_STR, parser_read_uint32_bit_val, &vec.aead.key}, 177*b09aac2dSBrandon Lo {IVLEN_JSON_STR, parser_read_uint32_bit_val, &vec.iv}, 178*b09aac2dSBrandon Lo {PAYLOADLEN_JSON_STR, parser_read_gcm_pt_len, &vec.pt}, 179*b09aac2dSBrandon Lo {PAYLOADLEN_JSON_STR, parser_read_uint32_bit_val, &vec.ct}, 180*b09aac2dSBrandon Lo /**< The NIST json test vectors use 'payloadLen' to denote input text 181*b09aac2dSBrandon Lo * length in case of decrypt & encrypt operations. 182*b09aac2dSBrandon Lo */ 183*b09aac2dSBrandon Lo {AADLEN_JSON_STR, parser_read_uint32_bit_val, &vec.aead.aad}, 184*b09aac2dSBrandon Lo {TAGLEN_JSON_STR, parser_read_uint32_bit_val, 185*b09aac2dSBrandon Lo &vec.aead.digest}, 186*b09aac2dSBrandon Lo {NULL, NULL, NULL} /**< end pointer */ 187*b09aac2dSBrandon Lo }; 188*b09aac2dSBrandon Lo 189*b09aac2dSBrandon Lo struct fips_test_callback gcm_enc_json_vectors[] = { 190*b09aac2dSBrandon Lo {KEY_JSON_STR, parse_uint8_known_len_hex_str, &vec.aead.key}, 191*b09aac2dSBrandon Lo {IV_JSON_STR, parse_uint8_known_len_hex_str, &vec.iv}, 192*b09aac2dSBrandon Lo {PT_JSON_STR, parse_gcm_pt_ct_str, &vec.pt}, 193*b09aac2dSBrandon Lo {AAD_JSON_STR, parse_gcm_aad_str, &vec.aead.aad}, 194*b09aac2dSBrandon Lo {NULL, NULL, NULL} /**< end pointer */ 195*b09aac2dSBrandon Lo }; 196*b09aac2dSBrandon Lo #endif /* RTE_HAS_JANSSON */ 197*b09aac2dSBrandon 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 } 279*b09aac2dSBrandon Lo 280*b09aac2dSBrandon Lo #ifdef RTE_HAS_JANSSON 281*b09aac2dSBrandon Lo static int 282*b09aac2dSBrandon Lo parse_test_gcm_json_writeback(struct fips_val *val) 283*b09aac2dSBrandon Lo { 284*b09aac2dSBrandon Lo struct fips_val tmp_val; 285*b09aac2dSBrandon Lo json_t *tcId, *tag; 286*b09aac2dSBrandon Lo 287*b09aac2dSBrandon Lo tcId = json_object_get(json_info.json_test_case, "tcId"); 288*b09aac2dSBrandon Lo 289*b09aac2dSBrandon Lo json_info.json_write_case = json_object(); 290*b09aac2dSBrandon Lo json_object_set(json_info.json_write_case, "tcId", tcId); 291*b09aac2dSBrandon Lo 292*b09aac2dSBrandon Lo if (info.op == FIPS_TEST_ENC_AUTH_GEN) { 293*b09aac2dSBrandon Lo json_t *ct; 294*b09aac2dSBrandon Lo 295*b09aac2dSBrandon Lo tmp_val.val = val->val; 296*b09aac2dSBrandon Lo tmp_val.len = vec.pt.len; 297*b09aac2dSBrandon Lo 298*b09aac2dSBrandon Lo writeback_hex_str("", info.one_line_text, &tmp_val); 299*b09aac2dSBrandon Lo ct = json_string(info.one_line_text); 300*b09aac2dSBrandon Lo json_object_set_new(json_info.json_write_case, CT_JSON_STR, ct); 301*b09aac2dSBrandon Lo 302*b09aac2dSBrandon Lo if (info.interim_info.gcm_data.gen_iv) { 303*b09aac2dSBrandon Lo json_t *iv; 304*b09aac2dSBrandon Lo tmp_val.val = vec.iv.val; 305*b09aac2dSBrandon Lo tmp_val.len = vec.iv.len; 306*b09aac2dSBrandon Lo 307*b09aac2dSBrandon Lo writeback_hex_str("", info.one_line_text, &tmp_val); 308*b09aac2dSBrandon Lo iv = json_string(info.one_line_text); 309*b09aac2dSBrandon Lo json_object_set_new(json_info.json_write_case, IV_JSON_STR, iv); 310*b09aac2dSBrandon Lo 311*b09aac2dSBrandon Lo rte_free(vec.iv.val); 312*b09aac2dSBrandon Lo vec.iv.val = NULL; 313*b09aac2dSBrandon Lo } 314*b09aac2dSBrandon Lo 315*b09aac2dSBrandon Lo tmp_val.val = val->val + vec.pt.len; 316*b09aac2dSBrandon Lo tmp_val.len = val->len - vec.pt.len; 317*b09aac2dSBrandon Lo 318*b09aac2dSBrandon Lo writeback_hex_str("", info.one_line_text, &tmp_val); 319*b09aac2dSBrandon Lo tag = json_string(info.one_line_text); 320*b09aac2dSBrandon Lo json_object_set_new(json_info.json_write_case, TAG_JSON_STR, tag); 321*b09aac2dSBrandon Lo } else { 322*b09aac2dSBrandon Lo if (vec.status == RTE_CRYPTO_OP_STATUS_SUCCESS) { 323*b09aac2dSBrandon Lo if (!info.interim_info.gcm_data.is_gmac) { 324*b09aac2dSBrandon Lo tmp_val.val = val->val; 325*b09aac2dSBrandon Lo tmp_val.len = vec.pt.len; 326*b09aac2dSBrandon Lo 327*b09aac2dSBrandon Lo writeback_hex_str("", info.one_line_text, &tmp_val); 328*b09aac2dSBrandon Lo json_object_set_new(json_info.json_write_case, PT_JSON_STR, 329*b09aac2dSBrandon Lo json_string(info.one_line_text)); 330*b09aac2dSBrandon Lo } 331*b09aac2dSBrandon Lo } else { 332*b09aac2dSBrandon Lo json_object_set_new(json_info.json_write_case, "testPassed", json_false()); 333*b09aac2dSBrandon Lo } 334*b09aac2dSBrandon Lo } 335*b09aac2dSBrandon Lo 336*b09aac2dSBrandon Lo return 0; 337*b09aac2dSBrandon Lo } 338*b09aac2dSBrandon Lo 339*b09aac2dSBrandon Lo int 340*b09aac2dSBrandon Lo parse_test_gcm_json_init(void) 341*b09aac2dSBrandon Lo { 342*b09aac2dSBrandon Lo json_t *direction_obj; 343*b09aac2dSBrandon Lo const char *direction_str; 344*b09aac2dSBrandon Lo 345*b09aac2dSBrandon Lo direction_obj = json_object_get(json_info.json_test_group, DIR_JSON_STR); 346*b09aac2dSBrandon Lo direction_str = json_string_value(direction_obj); 347*b09aac2dSBrandon Lo info.interim_info.gcm_data.gen_iv = 0; 348*b09aac2dSBrandon Lo 349*b09aac2dSBrandon Lo if (strcmp(direction_str, OP_ENC_JSON_STR) == 0) { 350*b09aac2dSBrandon Lo json_t *ivGen_obj = json_object_get(json_info.json_test_group, IVGEN_JSON_STR); 351*b09aac2dSBrandon Lo const char *ivGen_str = json_string_value(ivGen_obj); 352*b09aac2dSBrandon Lo 353*b09aac2dSBrandon Lo info.op = FIPS_TEST_ENC_AUTH_GEN; 354*b09aac2dSBrandon Lo info.callbacks = gcm_enc_json_vectors; 355*b09aac2dSBrandon Lo 356*b09aac2dSBrandon Lo if (strcmp(ivGen_str, OP_ENC_INT_JSON_STR) == 0) 357*b09aac2dSBrandon Lo info.interim_info.gcm_data.gen_iv = 1; 358*b09aac2dSBrandon Lo } else if (strcmp(direction_str, OP_DEC_JSON_STR) == 0) { 359*b09aac2dSBrandon Lo info.op = FIPS_TEST_DEC_AUTH_VERIF; 360*b09aac2dSBrandon Lo info.callbacks = gcm_dec_json_vectors; 361*b09aac2dSBrandon Lo } else { 362*b09aac2dSBrandon Lo return -EINVAL; 363*b09aac2dSBrandon Lo } 364*b09aac2dSBrandon Lo info.interim_callbacks = gcm_interim_json_vectors; 365*b09aac2dSBrandon Lo info.parse_writeback = parse_test_gcm_json_writeback; 366*b09aac2dSBrandon Lo 367*b09aac2dSBrandon Lo return 0; 368*b09aac2dSBrandon Lo } 369*b09aac2dSBrandon Lo 370*b09aac2dSBrandon Lo #endif /* RTE_HAS_JANSSON */ 371