1*758e9fbaSOystein Eftevaag /* SPDX-License-Identifier: BSD-2-Clause */
2*758e9fbaSOystein Eftevaag /*******************************************************************************
3*758e9fbaSOystein Eftevaag * Copyright 2017, Fraunhofer SIT sponsored by Infineon Technologies AG
4*758e9fbaSOystein Eftevaag * All rights reserved.
5*758e9fbaSOystein Eftevaag *******************************************************************************/
6*758e9fbaSOystein Eftevaag
7*758e9fbaSOystein Eftevaag #ifdef HAVE_CONFIG_H
8*758e9fbaSOystein Eftevaag #include <config.h>
9*758e9fbaSOystein Eftevaag #endif
10*758e9fbaSOystein Eftevaag
11*758e9fbaSOystein Eftevaag #include <stdio.h>
12*758e9fbaSOystein Eftevaag #include <stdbool.h>
13*758e9fbaSOystein Eftevaag #include <stdlib.h>
14*758e9fbaSOystein Eftevaag #include <string.h>
15*758e9fbaSOystein Eftevaag #include <sys/stat.h>
16*758e9fbaSOystein Eftevaag
17*758e9fbaSOystein Eftevaag #include "tss2_esys.h"
18*758e9fbaSOystein Eftevaag #include "tss2_fapi.h"
19*758e9fbaSOystein Eftevaag
20*758e9fbaSOystein Eftevaag #include "test-fapi.h"
21*758e9fbaSOystein Eftevaag
22*758e9fbaSOystein Eftevaag #define LOGDEFAULT LOGLEVEL_INFO
23*758e9fbaSOystein Eftevaag #define LOGMODULE test
24*758e9fbaSOystein Eftevaag #include "util/log.h"
25*758e9fbaSOystein Eftevaag #include "util/aux_util.h"
26*758e9fbaSOystein Eftevaag
27*758e9fbaSOystein Eftevaag #ifndef FAPI_PROFILE
28*758e9fbaSOystein Eftevaag #define FAPI_PROFILE "P_ECC"
29*758e9fbaSOystein Eftevaag #endif /* FAPI_PROFILE */
30*758e9fbaSOystein Eftevaag
31*758e9fbaSOystein Eftevaag char *fapi_profile = NULL;
32*758e9fbaSOystein Eftevaag
33*758e9fbaSOystein Eftevaag TSS2_RC
pcr_reset(FAPI_CONTEXT * context,UINT32 pcr)34*758e9fbaSOystein Eftevaag pcr_reset(FAPI_CONTEXT *context, UINT32 pcr)
35*758e9fbaSOystein Eftevaag {
36*758e9fbaSOystein Eftevaag TSS2_RC r;
37*758e9fbaSOystein Eftevaag TSS2_TCTI_CONTEXT *tcti;
38*758e9fbaSOystein Eftevaag ESYS_CONTEXT *esys;
39*758e9fbaSOystein Eftevaag
40*758e9fbaSOystein Eftevaag r = Fapi_GetTcti(context, &tcti);
41*758e9fbaSOystein Eftevaag goto_if_error(r, "Error Fapi_GetTcti", error);
42*758e9fbaSOystein Eftevaag
43*758e9fbaSOystein Eftevaag r = Esys_Initialize(&esys, tcti, NULL);
44*758e9fbaSOystein Eftevaag goto_if_error(r, "Error Fapi_GetTcti", error);
45*758e9fbaSOystein Eftevaag
46*758e9fbaSOystein Eftevaag r = Esys_PCR_Reset(esys, pcr,
47*758e9fbaSOystein Eftevaag ESYS_TR_PASSWORD, ESYS_TR_NONE, ESYS_TR_NONE);
48*758e9fbaSOystein Eftevaag Esys_Finalize(&esys);
49*758e9fbaSOystein Eftevaag goto_if_error(r, "Error Eys_PCR_Reset", error);
50*758e9fbaSOystein Eftevaag
51*758e9fbaSOystein Eftevaag error:
52*758e9fbaSOystein Eftevaag return r;
53*758e9fbaSOystein Eftevaag }
54*758e9fbaSOystein Eftevaag
55*758e9fbaSOystein Eftevaag /**
56*758e9fbaSOystein Eftevaag * This program is a template for integration tests (ones that use the TCTI,
57*758e9fbaSOystein Eftevaag * the ESAPI, and FAPI contexts / API directly). It does nothing more than
58*758e9fbaSOystein Eftevaag * parsing command line options that allow the caller (likely a script)
59*758e9fbaSOystein Eftevaag * to specifywhich TCTI to use for the test using getenv("TPM20TEST_TCTI").
60*758e9fbaSOystein Eftevaag */
61*758e9fbaSOystein Eftevaag int
main(int argc,char * argv[])62*758e9fbaSOystein Eftevaag main(int argc, char *argv[])
63*758e9fbaSOystein Eftevaag {
64*758e9fbaSOystein Eftevaag TSS2_RC rc;
65*758e9fbaSOystein Eftevaag FAPI_CONTEXT *fapi_context = NULL;
66*758e9fbaSOystein Eftevaag
67*758e9fbaSOystein Eftevaag int ret, size;
68*758e9fbaSOystein Eftevaag char *config = NULL;
69*758e9fbaSOystein Eftevaag char *config_path = NULL;
70*758e9fbaSOystein Eftevaag char *config_env = NULL;
71*758e9fbaSOystein Eftevaag char *remove_cmd = NULL;
72*758e9fbaSOystein Eftevaag char *system_dir = NULL;
73*758e9fbaSOystein Eftevaag
74*758e9fbaSOystein Eftevaag FILE *config_file;
75*758e9fbaSOystein Eftevaag
76*758e9fbaSOystein Eftevaag char template[] = "/tmp/fapi_tmpdir.XXXXXX";
77*758e9fbaSOystein Eftevaag
78*758e9fbaSOystein Eftevaag char *tmpdir = mkdtemp(template);
79*758e9fbaSOystein Eftevaag if (!tmpdir) {
80*758e9fbaSOystein Eftevaag LOG_ERROR("No temp dir created");
81*758e9fbaSOystein Eftevaag return EXIT_ERROR;
82*758e9fbaSOystein Eftevaag }
83*758e9fbaSOystein Eftevaag
84*758e9fbaSOystein Eftevaag fapi_profile = FAPI_PROFILE;
85*758e9fbaSOystein Eftevaag
86*758e9fbaSOystein Eftevaag /* First we construct a fapi config file */
87*758e9fbaSOystein Eftevaag #if defined(FAPI_NONTPM)
88*758e9fbaSOystein Eftevaag size = asprintf(&config, "{\n"
89*758e9fbaSOystein Eftevaag " \"profile_name\": \"" FAPI_PROFILE "\",\n"
90*758e9fbaSOystein Eftevaag " \"profile_dir\": \"" TOP_SOURCEDIR "/test/data/fapi/\",\n"
91*758e9fbaSOystein Eftevaag " \"user_dir\": \"%s/user/dir\",\n"
92*758e9fbaSOystein Eftevaag " \"system_dir\": \"%s/system_dir\",\n"
93*758e9fbaSOystein Eftevaag " \"system_pcrs\" : [],\n"
94*758e9fbaSOystein Eftevaag " \"log_dir\" : \"%s\",\n"
95*758e9fbaSOystein Eftevaag " \"tcti\": \"none\",\n"
96*758e9fbaSOystein Eftevaag "}\n",
97*758e9fbaSOystein Eftevaag tmpdir, tmpdir, tmpdir);
98*758e9fbaSOystein Eftevaag #elif defined(FAPI_TEST_FINGERPRINT)
99*758e9fbaSOystein Eftevaag size = asprintf(&config, "{\n"
100*758e9fbaSOystein Eftevaag " \"profile_name\": \"" FAPI_PROFILE "\",\n"
101*758e9fbaSOystein Eftevaag " \"profile_dir\": \"" TOP_SOURCEDIR "/test/data/fapi/\",\n"
102*758e9fbaSOystein Eftevaag " \"user_dir\": \"%s/user/dir\",\n"
103*758e9fbaSOystein Eftevaag " \"system_dir\": \"%s/system_dir\",\n"
104*758e9fbaSOystein Eftevaag " \"system_pcrs\" : [],\n"
105*758e9fbaSOystein Eftevaag " \"log_dir\" : \"%s\",\n"
106*758e9fbaSOystein Eftevaag " \"tcti\": \"%s\",\n"
107*758e9fbaSOystein Eftevaag #if defined(FAPI_TEST_EK_CERT_LESS)
108*758e9fbaSOystein Eftevaag " \"ek_cert_less\": \"yes\",\n"
109*758e9fbaSOystein Eftevaag #else
110*758e9fbaSOystein Eftevaag " \"ek_fingerprint\": %s,\n"
111*758e9fbaSOystein Eftevaag #endif
112*758e9fbaSOystein Eftevaag "}\n",
113*758e9fbaSOystein Eftevaag tmpdir, tmpdir, tmpdir,
114*758e9fbaSOystein Eftevaag getenv("TPM20TEST_TCTI"),
115*758e9fbaSOystein Eftevaag getenv("FAPI_TEST_FINGERPRINT"));
116*758e9fbaSOystein Eftevaag #elif defined(FAPI_TEST_CERTIFICATE)
117*758e9fbaSOystein Eftevaag size = asprintf(&config, "{\n"
118*758e9fbaSOystein Eftevaag " \"profile_name\": \"" FAPI_PROFILE "\",\n"
119*758e9fbaSOystein Eftevaag " \"profile_dir\": \"" TOP_SOURCEDIR "/test/data/fapi/\",\n"
120*758e9fbaSOystein Eftevaag " \"user_dir\": \"%s/user/dir\",\n"
121*758e9fbaSOystein Eftevaag " \"system_dir\": \"%s/system_dir\",\n"
122*758e9fbaSOystein Eftevaag " \"system_pcrs\" : [],\n"
123*758e9fbaSOystein Eftevaag " \"log_dir\" : \"%s\",\n"
124*758e9fbaSOystein Eftevaag " \"tcti\": \"%s\",\n"
125*758e9fbaSOystein Eftevaag #if defined(FAPI_TEST_EK_CERT_LESS)
126*758e9fbaSOystein Eftevaag " \"ek_cert_less\": \"yes\",\n"
127*758e9fbaSOystein Eftevaag #else
128*758e9fbaSOystein Eftevaag " \"ek_cert_file\": \"%s\",\n"
129*758e9fbaSOystein Eftevaag #endif
130*758e9fbaSOystein Eftevaag "}\n",
131*758e9fbaSOystein Eftevaag tmpdir, tmpdir, tmpdir,
132*758e9fbaSOystein Eftevaag getenv("TPM20TEST_TCTI"),
133*758e9fbaSOystein Eftevaag getenv("FAPI_TEST_CERTIFICATE"));
134*758e9fbaSOystein Eftevaag #elif defined(FAPI_TEST_FINGERPRINT_ECC)
135*758e9fbaSOystein Eftevaag size = asprintf(&config, "{\n"
136*758e9fbaSOystein Eftevaag " \"profile_name\": \"" FAPI_PROFILE "\",\n"
137*758e9fbaSOystein Eftevaag " \"profile_dir\": \"" TOP_SOURCEDIR "/test/data/fapi/\",\n"
138*758e9fbaSOystein Eftevaag " \"user_dir\": \"%s/user/dir\",\n"
139*758e9fbaSOystein Eftevaag " \"system_dir\": \"%s/system_dir\",\n"
140*758e9fbaSOystein Eftevaag " \"system_pcrs\" : [],\n"
141*758e9fbaSOystein Eftevaag " \"log_dir\" : \"%s\",\n"
142*758e9fbaSOystein Eftevaag " \"tcti\": \"%s\",\n"
143*758e9fbaSOystein Eftevaag #if defined(FAPI_TEST_EK_CERT_LESS)
144*758e9fbaSOystein Eftevaag " \"ek_cert_less\": \"yes\",\n"
145*758e9fbaSOystein Eftevaag #else
146*758e9fbaSOystein Eftevaag " \"ek_fingerprint\": %s,\n"
147*758e9fbaSOystein Eftevaag #endif
148*758e9fbaSOystein Eftevaag "}\n",
149*758e9fbaSOystein Eftevaag tmpdir, tmpdir, tmpdir,
150*758e9fbaSOystein Eftevaag getenv("TPM20TEST_TCTI"),
151*758e9fbaSOystein Eftevaag getenv("FAPI_TEST_FINGERPRINT_ECC"));
152*758e9fbaSOystein Eftevaag #elif defined(FAPI_TEST_CERTIFICATE_ECC)
153*758e9fbaSOystein Eftevaag size = asprintf(&config, "{\n"
154*758e9fbaSOystein Eftevaag " \"profile_name\": \"" FAPI_PROFILE "\",\n"
155*758e9fbaSOystein Eftevaag " \"profile_dir\": \"" TOP_SOURCEDIR "/test/data/fapi/\",\n"
156*758e9fbaSOystein Eftevaag " \"user_dir\": \"%s/user/dir\",\n"
157*758e9fbaSOystein Eftevaag " \"system_dir\": \"%s/system_dir\",\n"
158*758e9fbaSOystein Eftevaag " \"system_pcrs\" : [],\n"
159*758e9fbaSOystein Eftevaag " \"log_dir\" : \"%s\",\n"
160*758e9fbaSOystein Eftevaag " \"tcti\": \"%s\",\n"
161*758e9fbaSOystein Eftevaag #if defined(FAPI_TEST_EK_CERT_LESS)
162*758e9fbaSOystein Eftevaag " \"ek_cert_less\": \"yes\",\n"
163*758e9fbaSOystein Eftevaag #else
164*758e9fbaSOystein Eftevaag " \"ek_cert_file\": \"%s\",\n"
165*758e9fbaSOystein Eftevaag #endif
166*758e9fbaSOystein Eftevaag "}\n",
167*758e9fbaSOystein Eftevaag tmpdir, tmpdir, tmpdir,
168*758e9fbaSOystein Eftevaag getenv("TPM20TEST_TCTI"),
169*758e9fbaSOystein Eftevaag getenv("FAPI_TEST_CERTIFICATE_ECC"));
170*758e9fbaSOystein Eftevaag #else /* FAPI_NONTPM */
171*758e9fbaSOystein Eftevaag size = asprintf(&config, "{\n"
172*758e9fbaSOystein Eftevaag " \"profile_name\": \"" FAPI_PROFILE "\",\n"
173*758e9fbaSOystein Eftevaag " \"profile_dir\": \"" TOP_SOURCEDIR "/test/data/fapi/\",\n"
174*758e9fbaSOystein Eftevaag " \"user_dir\": \"%s/user/dir\",\n"
175*758e9fbaSOystein Eftevaag " \"system_dir\": \"%s/system_dir\",\n"
176*758e9fbaSOystein Eftevaag " \"system_pcrs\" : [],\n"
177*758e9fbaSOystein Eftevaag " \"log_dir\" : \"%s\",\n"
178*758e9fbaSOystein Eftevaag " \"tcti\": \"%s\",\n"
179*758e9fbaSOystein Eftevaag #if defined(FAPI_TEST_EK_CERT_LESS)
180*758e9fbaSOystein Eftevaag " \"ek_cert_less\": \"yes\",\n"
181*758e9fbaSOystein Eftevaag #endif
182*758e9fbaSOystein Eftevaag "}\n",
183*758e9fbaSOystein Eftevaag tmpdir, tmpdir, tmpdir,
184*758e9fbaSOystein Eftevaag getenv("TPM20TEST_TCTI"));
185*758e9fbaSOystein Eftevaag #endif /* FAPI_NONTPM */
186*758e9fbaSOystein Eftevaag if (size < 0) {
187*758e9fbaSOystein Eftevaag LOG_ERROR("Out of memory");
188*758e9fbaSOystein Eftevaag ret = EXIT_ERROR;
189*758e9fbaSOystein Eftevaag goto error;
190*758e9fbaSOystein Eftevaag }
191*758e9fbaSOystein Eftevaag
192*758e9fbaSOystein Eftevaag size = asprintf(&system_dir, "%s/system_dir/", tmpdir);
193*758e9fbaSOystein Eftevaag if (size < 0) {
194*758e9fbaSOystein Eftevaag LOG_ERROR("Out of memory");
195*758e9fbaSOystein Eftevaag ret = EXIT_ERROR;
196*758e9fbaSOystein Eftevaag goto error;
197*758e9fbaSOystein Eftevaag }
198*758e9fbaSOystein Eftevaag
199*758e9fbaSOystein Eftevaag int rc_mkdir = mkdir(system_dir, 0777);
200*758e9fbaSOystein Eftevaag if (rc_mkdir != 0) {
201*758e9fbaSOystein Eftevaag LOG_ERROR("mkdir not possible: %i %s", rc_mkdir, system_dir);
202*758e9fbaSOystein Eftevaag ret = EXIT_ERROR;
203*758e9fbaSOystein Eftevaag goto error;
204*758e9fbaSOystein Eftevaag }
205*758e9fbaSOystein Eftevaag
206*758e9fbaSOystein Eftevaag if (size < 0) {
207*758e9fbaSOystein Eftevaag LOG_ERROR("Out of memory");
208*758e9fbaSOystein Eftevaag ret = EXIT_ERROR;
209*758e9fbaSOystein Eftevaag goto error;
210*758e9fbaSOystein Eftevaag }
211*758e9fbaSOystein Eftevaag LOG_INFO("Using config:\n%s", config);
212*758e9fbaSOystein Eftevaag
213*758e9fbaSOystein Eftevaag /* We construct the path for the config file */
214*758e9fbaSOystein Eftevaag size = asprintf(&config_path, "%s/fapi-config.json", tmpdir);
215*758e9fbaSOystein Eftevaag if (size < 0) {
216*758e9fbaSOystein Eftevaag LOG_ERROR("Out of memory");
217*758e9fbaSOystein Eftevaag ret = EXIT_ERROR;
218*758e9fbaSOystein Eftevaag goto error;
219*758e9fbaSOystein Eftevaag }
220*758e9fbaSOystein Eftevaag
221*758e9fbaSOystein Eftevaag /* We write the config file to disk */
222*758e9fbaSOystein Eftevaag config_file = fopen(config_path, "w");
223*758e9fbaSOystein Eftevaag if (!config_file) {
224*758e9fbaSOystein Eftevaag LOG_ERROR("Opening config file for writing");
225*758e9fbaSOystein Eftevaag perror(config_path);
226*758e9fbaSOystein Eftevaag ret = EXIT_ERROR;
227*758e9fbaSOystein Eftevaag goto error;
228*758e9fbaSOystein Eftevaag }
229*758e9fbaSOystein Eftevaag size = fprintf(config_file, "%s", config);
230*758e9fbaSOystein Eftevaag fclose(config_file);
231*758e9fbaSOystein Eftevaag if (size < 0) {
232*758e9fbaSOystein Eftevaag LOG_ERROR("Writing config file");
233*758e9fbaSOystein Eftevaag perror(config_path);
234*758e9fbaSOystein Eftevaag ret = EXIT_ERROR;
235*758e9fbaSOystein Eftevaag goto error;
236*758e9fbaSOystein Eftevaag }
237*758e9fbaSOystein Eftevaag
238*758e9fbaSOystein Eftevaag /* We set the environment variable for FAPI to consume the config file */
239*758e9fbaSOystein Eftevaag size = asprintf(&config_env, "TSS2_FAPICONF=%s", config_path);
240*758e9fbaSOystein Eftevaag if (size < 0) {
241*758e9fbaSOystein Eftevaag LOG_ERROR("Out of memory");
242*758e9fbaSOystein Eftevaag ret = EXIT_ERROR;
243*758e9fbaSOystein Eftevaag goto error;
244*758e9fbaSOystein Eftevaag }
245*758e9fbaSOystein Eftevaag putenv(config_env);
246*758e9fbaSOystein Eftevaag
247*758e9fbaSOystein Eftevaag /***********
248*758e9fbaSOystein Eftevaag * Call FAPI
249*758e9fbaSOystein Eftevaag ***********/
250*758e9fbaSOystein Eftevaag
251*758e9fbaSOystein Eftevaag rc = Fapi_Initialize(&fapi_context, NULL);
252*758e9fbaSOystein Eftevaag if (rc != TSS2_RC_SUCCESS) {
253*758e9fbaSOystein Eftevaag LOG_ERROR("Esys_Initialize FAILED! Response Code : 0x%x", rc);
254*758e9fbaSOystein Eftevaag ret = EXIT_FAILURE;
255*758e9fbaSOystein Eftevaag goto error;
256*758e9fbaSOystein Eftevaag }
257*758e9fbaSOystein Eftevaag
258*758e9fbaSOystein Eftevaag ret = test_invoke_fapi(fapi_context);
259*758e9fbaSOystein Eftevaag LOG_INFO("Test returned %i", ret);
260*758e9fbaSOystein Eftevaag if (ret) goto error;
261*758e9fbaSOystein Eftevaag
262*758e9fbaSOystein Eftevaag size = asprintf(&remove_cmd, "rm -r -f %s", tmpdir);
263*758e9fbaSOystein Eftevaag if (size < 0) {
264*758e9fbaSOystein Eftevaag LOG_ERROR("Out of memory");
265*758e9fbaSOystein Eftevaag ret = EXIT_ERROR;
266*758e9fbaSOystein Eftevaag goto error;
267*758e9fbaSOystein Eftevaag }
268*758e9fbaSOystein Eftevaag if (system(remove_cmd) != 0) {
269*758e9fbaSOystein Eftevaag LOG_ERROR("Directory %s can't be deleted.", tmpdir);
270*758e9fbaSOystein Eftevaag ret = EXIT_ERROR;
271*758e9fbaSOystein Eftevaag goto error;
272*758e9fbaSOystein Eftevaag }
273*758e9fbaSOystein Eftevaag
274*758e9fbaSOystein Eftevaag error:
275*758e9fbaSOystein Eftevaag Fapi_Finalize(&fapi_context);
276*758e9fbaSOystein Eftevaag
277*758e9fbaSOystein Eftevaag if (system_dir) free(system_dir);
278*758e9fbaSOystein Eftevaag if (config) free(config);
279*758e9fbaSOystein Eftevaag if (config_path) free(config_path);
280*758e9fbaSOystein Eftevaag if (config_env) free(config_env);
281*758e9fbaSOystein Eftevaag if (remove_cmd) free(remove_cmd);
282*758e9fbaSOystein Eftevaag
283*758e9fbaSOystein Eftevaag return ret;
284*758e9fbaSOystein Eftevaag }
285