blob: 4577539dfa38959f8a7d5dfd5d1d1262872049ac [file] [log] [blame]
/* SPDX-License-Identifier: BSD-2-Clause */
/*******************************************************************************
* Copyright 2018, Fraunhofer SIT sponsored by Infineon Technologies AG
* All rights reserved.
******************************************************************************/
#ifdef HAVE_CONFIG_H
#include <config.h>
#endif
#include <stdarg.h>
#include <inttypes.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
#include <stdio.h>
#include <json-c/json_object.h>
#include <json-c/json_util.h>
#include <json-c/json_tokener.h>
#include <setjmp.h>
#include <cmocka.h>
#include <errno.h>
#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);
}