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> 8*72b452c5SDmitry 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 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 82d09abf2dSFan Zhang if (vec.pt.len == 0) { 83d09abf2dSFan Zhang info.interim_info.gcm_data.is_gmac = 1; 84d09abf2dSFan Zhang test_ops.prepare_op = prepare_auth_op; 85d09abf2dSFan Zhang test_ops.prepare_xform = prepare_gmac_xform; 86d09abf2dSFan Zhang } else { 87d09abf2dSFan Zhang info.interim_info.gcm_data.is_gmac = 0; 88d09abf2dSFan Zhang test_ops.prepare_op = prepare_aead_op; 89d09abf2dSFan Zhang test_ops.prepare_xform = prepare_gcm_xform; 90d09abf2dSFan Zhang } 91d09abf2dSFan Zhang 92d09abf2dSFan Zhang return ret; 93d09abf2dSFan Zhang } 94d09abf2dSFan Zhang 95d09abf2dSFan Zhang static int 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 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 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 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 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; 295b09aac2dSBrandon Lo 296b09aac2dSBrandon Lo tmp_val.val = val->val; 297b09aac2dSBrandon Lo tmp_val.len = vec.pt.len; 298b09aac2dSBrandon Lo 299b09aac2dSBrandon Lo writeback_hex_str("", info.one_line_text, &tmp_val); 300b09aac2dSBrandon Lo ct = json_string(info.one_line_text); 301b09aac2dSBrandon Lo json_object_set_new(json_info.json_write_case, CT_JSON_STR, ct); 302b09aac2dSBrandon Lo 303b09aac2dSBrandon Lo if (info.interim_info.gcm_data.gen_iv) { 304b09aac2dSBrandon Lo json_t *iv; 305b09aac2dSBrandon Lo tmp_val.val = vec.iv.val; 306b09aac2dSBrandon Lo tmp_val.len = vec.iv.len; 307b09aac2dSBrandon Lo 308b09aac2dSBrandon Lo writeback_hex_str("", info.one_line_text, &tmp_val); 309b09aac2dSBrandon Lo iv = json_string(info.one_line_text); 310b09aac2dSBrandon Lo json_object_set_new(json_info.json_write_case, IV_JSON_STR, iv); 311b09aac2dSBrandon Lo 312b09aac2dSBrandon Lo rte_free(vec.iv.val); 313b09aac2dSBrandon Lo vec.iv.val = NULL; 314b09aac2dSBrandon Lo } 315b09aac2dSBrandon Lo 316b09aac2dSBrandon Lo tmp_val.val = val->val + vec.pt.len; 317b09aac2dSBrandon Lo tmp_val.len = val->len - vec.pt.len; 318b09aac2dSBrandon Lo 319b09aac2dSBrandon Lo writeback_hex_str("", info.one_line_text, &tmp_val); 320b09aac2dSBrandon Lo tag = json_string(info.one_line_text); 321b09aac2dSBrandon Lo json_object_set_new(json_info.json_write_case, TAG_JSON_STR, tag); 322b09aac2dSBrandon Lo } else { 323b09aac2dSBrandon Lo if (vec.status == RTE_CRYPTO_OP_STATUS_SUCCESS) { 324b09aac2dSBrandon Lo if (!info.interim_info.gcm_data.is_gmac) { 325b09aac2dSBrandon Lo tmp_val.val = val->val; 326b09aac2dSBrandon Lo tmp_val.len = vec.pt.len; 327b09aac2dSBrandon Lo 328b09aac2dSBrandon Lo writeback_hex_str("", info.one_line_text, &tmp_val); 329b09aac2dSBrandon Lo json_object_set_new(json_info.json_write_case, PT_JSON_STR, 330b09aac2dSBrandon Lo json_string(info.one_line_text)); 331ad42b228SArchana Muniganti } else { 332ad42b228SArchana Muniganti json_object_set_new(json_info.json_write_case, PT_JSON_STR, 333ad42b228SArchana Muniganti json_string("")); 334b09aac2dSBrandon Lo } 335b09aac2dSBrandon Lo } else { 336b09aac2dSBrandon Lo json_object_set_new(json_info.json_write_case, "testPassed", json_false()); 337b09aac2dSBrandon Lo } 338b09aac2dSBrandon Lo } 339b09aac2dSBrandon Lo 340b09aac2dSBrandon Lo return 0; 341b09aac2dSBrandon Lo } 342b09aac2dSBrandon Lo 343b09aac2dSBrandon Lo int 344b09aac2dSBrandon Lo parse_test_gcm_json_init(void) 345b09aac2dSBrandon Lo { 346b09aac2dSBrandon Lo json_t *direction_obj; 347b09aac2dSBrandon Lo const char *direction_str; 348b09aac2dSBrandon Lo 349b09aac2dSBrandon Lo direction_obj = json_object_get(json_info.json_test_group, DIR_JSON_STR); 350b09aac2dSBrandon Lo direction_str = json_string_value(direction_obj); 351b09aac2dSBrandon Lo info.interim_info.gcm_data.gen_iv = 0; 352b09aac2dSBrandon Lo 353b09aac2dSBrandon Lo if (strcmp(direction_str, OP_ENC_JSON_STR) == 0) { 354b09aac2dSBrandon Lo json_t *ivGen_obj = json_object_get(json_info.json_test_group, IVGEN_JSON_STR); 355b09aac2dSBrandon Lo const char *ivGen_str = json_string_value(ivGen_obj); 356b09aac2dSBrandon Lo 357b09aac2dSBrandon Lo info.op = FIPS_TEST_ENC_AUTH_GEN; 358b09aac2dSBrandon Lo info.callbacks = gcm_enc_json_vectors; 359b09aac2dSBrandon Lo 360b09aac2dSBrandon Lo if (strcmp(ivGen_str, OP_ENC_INT_JSON_STR) == 0) 361b09aac2dSBrandon Lo info.interim_info.gcm_data.gen_iv = 1; 362b09aac2dSBrandon Lo } else if (strcmp(direction_str, OP_DEC_JSON_STR) == 0) { 363b09aac2dSBrandon Lo info.op = FIPS_TEST_DEC_AUTH_VERIF; 364b09aac2dSBrandon Lo info.callbacks = gcm_dec_json_vectors; 365b09aac2dSBrandon Lo } else { 366b09aac2dSBrandon Lo return -EINVAL; 367b09aac2dSBrandon Lo } 368b09aac2dSBrandon Lo info.interim_callbacks = gcm_interim_json_vectors; 369b09aac2dSBrandon Lo info.parse_writeback = parse_test_gcm_json_writeback; 370b09aac2dSBrandon Lo 371b09aac2dSBrandon Lo return 0; 372b09aac2dSBrandon Lo } 373b09aac2dSBrandon Lo 3748d70a194SDavid Marchand #endif /* USE_JANSSON */ 375