| /* SPDX-License-Identifier: BSD-2-Clause */ |
| /******************************************************************************* |
| * Copyright 2017, Fraunhofer SIT sponsored by Infineon Technologies AG |
| * All rights reserved. |
| *******************************************************************************/ |
| |
| #ifdef HAVE_CONFIG_H |
| #include <config.h> |
| #endif |
| |
| #include <stdio.h> |
| #include <stdbool.h> |
| #include <stdlib.h> |
| #include <string.h> |
| #include <sys/stat.h> |
| |
| #include "tss2_esys.h" |
| #include "tss2_fapi.h" |
| |
| #include "test-fapi.h" |
| |
| #define LOGDEFAULT LOGLEVEL_INFO |
| #define LOGMODULE test |
| #include "util/log.h" |
| #include "util/aux_util.h" |
| |
| #ifndef FAPI_PROFILE |
| #define FAPI_PROFILE "P_ECC" |
| #endif /* FAPI_PROFILE */ |
| |
| char *fapi_profile = NULL; |
| |
| TSS2_RC |
| pcr_reset(FAPI_CONTEXT *context, UINT32 pcr) |
| { |
| TSS2_RC r; |
| TSS2_TCTI_CONTEXT *tcti; |
| ESYS_CONTEXT *esys; |
| |
| r = Fapi_GetTcti(context, &tcti); |
| goto_if_error(r, "Error Fapi_GetTcti", error); |
| |
| r = Esys_Initialize(&esys, tcti, NULL); |
| goto_if_error(r, "Error Fapi_GetTcti", error); |
| |
| r = Esys_PCR_Reset(esys, pcr, |
| ESYS_TR_PASSWORD, ESYS_TR_NONE, ESYS_TR_NONE); |
| Esys_Finalize(&esys); |
| goto_if_error(r, "Error Eys_PCR_Reset", error); |
| |
| error: |
| return r; |
| } |
| |
| /** |
| * This program is a template for integration tests (ones that use the TCTI, |
| * the ESAPI, and FAPI contexts / API directly). It does nothing more than |
| * parsing command line options that allow the caller (likely a script) |
| * to specifywhich TCTI to use for the test using getenv("TPM20TEST_TCTI"). |
| */ |
| int |
| main(int argc, char *argv[]) |
| { |
| TSS2_RC rc; |
| FAPI_CONTEXT *fapi_context = NULL; |
| |
| int ret, size; |
| char *config = NULL; |
| char *config_path = NULL; |
| char *config_env = NULL; |
| char *remove_cmd = NULL; |
| char *system_dir = NULL; |
| |
| FILE *config_file; |
| |
| char template[] = "/tmp/fapi_tmpdir.XXXXXX"; |
| |
| char *tmpdir = mkdtemp(template); |
| if (!tmpdir) { |
| LOG_ERROR("No temp dir created"); |
| return EXIT_ERROR; |
| } |
| |
| fapi_profile = FAPI_PROFILE; |
| |
| /* First we construct a fapi config file */ |
| #if defined(FAPI_NONTPM) |
| size = asprintf(&config, "{\n" |
| " \"profile_name\": \"" FAPI_PROFILE "\",\n" |
| " \"profile_dir\": \"" TOP_SOURCEDIR "/test/data/fapi/\",\n" |
| " \"user_dir\": \"%s/user/dir\",\n" |
| " \"system_dir\": \"%s/system_dir\",\n" |
| " \"system_pcrs\" : [],\n" |
| " \"log_dir\" : \"%s\",\n" |
| " \"tcti\": \"none\",\n" |
| "}\n", |
| tmpdir, tmpdir, tmpdir); |
| #elif defined(FAPI_TEST_FINGERPRINT) |
| size = asprintf(&config, "{\n" |
| " \"profile_name\": \"" FAPI_PROFILE "\",\n" |
| " \"profile_dir\": \"" TOP_SOURCEDIR "/test/data/fapi/\",\n" |
| " \"user_dir\": \"%s/user/dir\",\n" |
| " \"system_dir\": \"%s/system_dir\",\n" |
| " \"system_pcrs\" : [],\n" |
| " \"log_dir\" : \"%s\",\n" |
| " \"tcti\": \"%s\",\n" |
| #if defined(FAPI_TEST_EK_CERT_LESS) |
| " \"ek_cert_less\": \"yes\",\n" |
| #else |
| " \"ek_fingerprint\": %s,\n" |
| #endif |
| "}\n", |
| tmpdir, tmpdir, tmpdir, |
| getenv("TPM20TEST_TCTI"), |
| getenv("FAPI_TEST_FINGERPRINT")); |
| #elif defined(FAPI_TEST_CERTIFICATE) |
| size = asprintf(&config, "{\n" |
| " \"profile_name\": \"" FAPI_PROFILE "\",\n" |
| " \"profile_dir\": \"" TOP_SOURCEDIR "/test/data/fapi/\",\n" |
| " \"user_dir\": \"%s/user/dir\",\n" |
| " \"system_dir\": \"%s/system_dir\",\n" |
| " \"system_pcrs\" : [],\n" |
| " \"log_dir\" : \"%s\",\n" |
| " \"tcti\": \"%s\",\n" |
| #if defined(FAPI_TEST_EK_CERT_LESS) |
| " \"ek_cert_less\": \"yes\",\n" |
| #else |
| " \"ek_cert_file\": \"%s\",\n" |
| #endif |
| "}\n", |
| tmpdir, tmpdir, tmpdir, |
| getenv("TPM20TEST_TCTI"), |
| getenv("FAPI_TEST_CERTIFICATE")); |
| #elif defined(FAPI_TEST_FINGERPRINT_ECC) |
| size = asprintf(&config, "{\n" |
| " \"profile_name\": \"" FAPI_PROFILE "\",\n" |
| " \"profile_dir\": \"" TOP_SOURCEDIR "/test/data/fapi/\",\n" |
| " \"user_dir\": \"%s/user/dir\",\n" |
| " \"system_dir\": \"%s/system_dir\",\n" |
| " \"system_pcrs\" : [],\n" |
| " \"log_dir\" : \"%s\",\n" |
| " \"tcti\": \"%s\",\n" |
| #if defined(FAPI_TEST_EK_CERT_LESS) |
| " \"ek_cert_less\": \"yes\",\n" |
| #else |
| " \"ek_fingerprint\": %s,\n" |
| #endif |
| "}\n", |
| tmpdir, tmpdir, tmpdir, |
| getenv("TPM20TEST_TCTI"), |
| getenv("FAPI_TEST_FINGERPRINT_ECC")); |
| #elif defined(FAPI_TEST_CERTIFICATE_ECC) |
| size = asprintf(&config, "{\n" |
| " \"profile_name\": \"" FAPI_PROFILE "\",\n" |
| " \"profile_dir\": \"" TOP_SOURCEDIR "/test/data/fapi/\",\n" |
| " \"user_dir\": \"%s/user/dir\",\n" |
| " \"system_dir\": \"%s/system_dir\",\n" |
| " \"system_pcrs\" : [],\n" |
| " \"log_dir\" : \"%s\",\n" |
| " \"tcti\": \"%s\",\n" |
| #if defined(FAPI_TEST_EK_CERT_LESS) |
| " \"ek_cert_less\": \"yes\",\n" |
| #else |
| " \"ek_cert_file\": \"%s\",\n" |
| #endif |
| "}\n", |
| tmpdir, tmpdir, tmpdir, |
| getenv("TPM20TEST_TCTI"), |
| getenv("FAPI_TEST_CERTIFICATE_ECC")); |
| #else /* FAPI_NONTPM */ |
| size = asprintf(&config, "{\n" |
| " \"profile_name\": \"" FAPI_PROFILE "\",\n" |
| " \"profile_dir\": \"" TOP_SOURCEDIR "/test/data/fapi/\",\n" |
| " \"user_dir\": \"%s/user/dir\",\n" |
| " \"system_dir\": \"%s/system_dir\",\n" |
| " \"system_pcrs\" : [],\n" |
| " \"log_dir\" : \"%s\",\n" |
| " \"tcti\": \"%s\",\n" |
| #if defined(FAPI_TEST_EK_CERT_LESS) |
| " \"ek_cert_less\": \"yes\",\n" |
| #endif |
| "}\n", |
| tmpdir, tmpdir, tmpdir, |
| getenv("TPM20TEST_TCTI")); |
| #endif /* FAPI_NONTPM */ |
| if (size < 0) { |
| LOG_ERROR("Out of memory"); |
| ret = EXIT_ERROR; |
| goto error; |
| } |
| |
| size = asprintf(&system_dir, "%s/system_dir/", tmpdir); |
| if (size < 0) { |
| LOG_ERROR("Out of memory"); |
| ret = EXIT_ERROR; |
| goto error; |
| } |
| |
| int rc_mkdir = mkdir(system_dir, 0777); |
| if (rc_mkdir != 0) { |
| LOG_ERROR("mkdir not possible: %i %s", rc_mkdir, system_dir); |
| ret = EXIT_ERROR; |
| goto error; |
| } |
| |
| if (size < 0) { |
| LOG_ERROR("Out of memory"); |
| ret = EXIT_ERROR; |
| goto error; |
| } |
| LOG_INFO("Using config:\n%s", config); |
| |
| /* We construct the path for the config file */ |
| size = asprintf(&config_path, "%s/fapi-config.json", tmpdir); |
| if (size < 0) { |
| LOG_ERROR("Out of memory"); |
| ret = EXIT_ERROR; |
| goto error; |
| } |
| |
| /* We write the config file to disk */ |
| config_file = fopen(config_path, "w"); |
| if (!config_file) { |
| LOG_ERROR("Opening config file for writing"); |
| perror(config_path); |
| ret = EXIT_ERROR; |
| goto error; |
| } |
| size = fprintf(config_file, "%s", config); |
| fclose(config_file); |
| if (size < 0) { |
| LOG_ERROR("Writing config file"); |
| perror(config_path); |
| ret = EXIT_ERROR; |
| goto error; |
| } |
| |
| /* We set the environment variable for FAPI to consume the config file */ |
| size = asprintf(&config_env, "TSS2_FAPICONF=%s", config_path); |
| if (size < 0) { |
| LOG_ERROR("Out of memory"); |
| ret = EXIT_ERROR; |
| goto error; |
| } |
| putenv(config_env); |
| |
| /*********** |
| * Call FAPI |
| ***********/ |
| |
| rc = Fapi_Initialize(&fapi_context, NULL); |
| if (rc != TSS2_RC_SUCCESS) { |
| LOG_ERROR("Esys_Initialize FAILED! Response Code : 0x%x", rc); |
| ret = EXIT_FAILURE; |
| goto error; |
| } |
| |
| ret = test_invoke_fapi(fapi_context); |
| LOG_INFO("Test returned %i", ret); |
| if (ret) goto error; |
| |
| size = asprintf(&remove_cmd, "rm -r -f %s", tmpdir); |
| if (size < 0) { |
| LOG_ERROR("Out of memory"); |
| ret = EXIT_ERROR; |
| goto error; |
| } |
| if (system(remove_cmd) != 0) { |
| LOG_ERROR("Directory %s can't be deleted.", tmpdir); |
| ret = EXIT_ERROR; |
| goto error; |
| } |
| |
| error: |
| Fapi_Finalize(&fapi_context); |
| |
| if (system_dir) free(system_dir); |
| if (config) free(config); |
| if (config_path) free(config_path); |
| if (config_env) free(config_env); |
| if (remove_cmd) free(remove_cmd); |
| |
| return ret; |
| } |