/* SPDX-License-Identifier: BSD-2-Clause */ /******************************************************************************* * Copyright 2018, Fraunhofer SIT sponsored by Infineon Technologies AG * All rights reserved. ******************************************************************************/ #ifdef HAVE_CONFIG_H #include #endif #include #include #include #include #include #include #include #include #include #include #include #include #include "ifapi_io.h" #include "ifapi_profiles.h" #include "util/aux_util.h" #define LOGMODULE tests #include "util/log.h" /* * The unit tests will test deserialization of FAPI profiles. It will be * checked whether the correct return codes are returned if optional and * mandatory fields are removed from the profile. */ /* Profile file which will be used for the test. */ char *wrap_profile_file; /* JSON field which will be removed for the test. */ char *wrap_remove_field; json_object * read_json(char *file_name) { FILE *stream = NULL; long file_size; char *json_string = NULL; json_object *jso = NULL; char file[1024]; if (snprintf(&file[0], 1023, TOP_SOURCEDIR "/%s", file_name) < 0) return NULL; stream = fopen(file, "r"); if (!stream) { LOG_ERROR("File %s does not exist", file); return NULL; } fseek(stream, 0L, SEEK_END); file_size = ftell(stream); fclose(stream); json_string = malloc(file_size + 1); stream = fopen(file, "r"); ssize_t ret = read(fileno(stream), json_string, file_size); if (ret != file_size) { LOG_ERROR("IO error %s.",file); return NULL; } json_string[file_size] = '\0'; jso = json_tokener_parse(json_string); SAFE_FREE(json_string); return jso; } /* * Wrappers for reading the JSON profile. */ TSS2_RC __wrap_ifapi_io_read_finish( struct IFAPI_IO *io, uint8_t **buffer, size_t *length, ...); TSS2_RC __wrap_ifapi_io_read_finish( struct IFAPI_IO *io, uint8_t **buffer, size_t *length, ...) { json_object *jso = NULL; const char *jso_string = NULL; jso = read_json(wrap_profile_file); assert_ptr_not_equal(jso, NULL); json_object_object_del(jso, wrap_remove_field); jso_string = json_object_to_json_string_ext(jso, JSON_C_TO_STRING_PRETTY); assert_ptr_not_equal(jso_string, NULL); *buffer = (uint8_t *)strdup(jso_string); json_object_put(jso); assert_ptr_not_equal(*buffer, NULL); return TSS2_RC_SUCCESS; } /* Function to remove the field and check the profile initialization. */ void check_remove_field(char *file, char* fname, TSS2_RC rc) { IFAPI_IO io; IFAPI_PROFILES profiles; TSS2_RC r; profiles.num_profiles = 1; profiles.profiles_idx = 0; profiles.default_name = strdup("dmy_name"); profiles.filenames = calloc(1 ,sizeof(profiles.filenames[0])); assert_ptr_not_equal(profiles.filenames, NULL); profiles.profiles = calloc(profiles.num_profiles, sizeof(profiles.profiles[0])); profiles.profiles[0].name = strdup("dmy_name"); assert_ptr_not_equal(profiles.profiles[0].name, NULL); profiles.filenames[0] = strdup("dmy_name"); assert_ptr_not_equal( profiles.filenames[0], NULL); wrap_profile_file = file; wrap_remove_field = fname; r = ifapi_profiles_initialize_finish(&profiles, &io); assert_int_equal(r, rc); ifapi_profiles_finalize(&profiles); } /* Check removing the optional fields. */ static void check_profile_json_remove_field_allowed(void **state) { check_remove_field("test/data/fapi/P_RSA.json", "srk_description", TSS2_RC_SUCCESS); check_remove_field("test/data/fapi/P_RSA.json", "ekk_description", TSS2_RC_SUCCESS); } /* Check removing of the mandatory fields. */ static void check_profile_json_remove_field_not_allowed(void **state) { check_remove_field("test/data/fapi/P_ECC.json", "type", TSS2_FAPI_RC_BAD_VALUE); check_remove_field("test/data/fapi/P_ECC.json", "curveID", TSS2_FAPI_RC_BAD_VALUE); check_remove_field("test/data/fapi/P_RSA.json", "keyBits", TSS2_FAPI_RC_BAD_VALUE); check_remove_field("test/data/fapi/P_RSA.json", "exponent", TSS2_FAPI_RC_BAD_VALUE); check_remove_field("test/data/fapi/P_RSA.json", "nameAlg", TSS2_FAPI_RC_BAD_VALUE); check_remove_field("test/data/fapi/P_RSA.json", "pcr_selection", TSS2_FAPI_RC_BAD_VALUE); check_remove_field("test/data/fapi/P_RSA.json", "pcr_selection", TSS2_FAPI_RC_BAD_VALUE); check_remove_field("test/data/fapi/P_RSA.json", "sym_block_size", TSS2_FAPI_RC_BAD_VALUE); check_remove_field("test/data/fapi/P_RSA.json", "sym_parameters", TSS2_FAPI_RC_BAD_VALUE); check_remove_field("test/data/fapi/P_RSA.json", "sym_mode", TSS2_FAPI_RC_BAD_VALUE); check_remove_field("test/data/fapi/P_RSA.json", "ek_template", TSS2_FAPI_RC_BAD_VALUE); check_remove_field("test/data/fapi/P_RSA.json", "srk_template", TSS2_FAPI_RC_BAD_VALUE); } int main(int argc, char *argv[]) { const struct CMUnitTest tests[] = { cmocka_unit_test(check_profile_json_remove_field_allowed), cmocka_unit_test(check_profile_json_remove_field_not_allowed), }; return cmocka_run_group_tests(tests, NULL, NULL); }