1*758e9fbaSOystein Eftevaag /* SPDX-License-Identifier: BSD-2-Clause */
2*758e9fbaSOystein Eftevaag /*******************************************************************************
3*758e9fbaSOystein Eftevaag * Copyright 2017-2018, 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 <stdbool.h>
12*758e9fbaSOystein Eftevaag #include <stdlib.h>
13*758e9fbaSOystein Eftevaag #include <stdio.h>
14*758e9fbaSOystein Eftevaag #include <string.h>
15*758e9fbaSOystein Eftevaag #include <errno.h>
16*758e9fbaSOystein Eftevaag #include <fcntl.h>
17*758e9fbaSOystein Eftevaag #include <unistd.h>
18*758e9fbaSOystein Eftevaag
19*758e9fbaSOystein Eftevaag #include "tss2_fapi.h"
20*758e9fbaSOystein Eftevaag
21*758e9fbaSOystein Eftevaag #include "test-fapi.h"
22*758e9fbaSOystein Eftevaag
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 static bool cb_called = false;
28*758e9fbaSOystein Eftevaag
29*758e9fbaSOystein Eftevaag static TSS2_RC
branch_callback(FAPI_CONTEXT * context,char const * description,char const ** branchNames,size_t numBranches,size_t * selectedBranch,void * userData)30*758e9fbaSOystein Eftevaag branch_callback(
31*758e9fbaSOystein Eftevaag FAPI_CONTEXT *context,
32*758e9fbaSOystein Eftevaag char const *description,
33*758e9fbaSOystein Eftevaag char const **branchNames,
34*758e9fbaSOystein Eftevaag size_t numBranches,
35*758e9fbaSOystein Eftevaag size_t *selectedBranch,
36*758e9fbaSOystein Eftevaag void *userData)
37*758e9fbaSOystein Eftevaag {
38*758e9fbaSOystein Eftevaag (void) description;
39*758e9fbaSOystein Eftevaag (void) userData;
40*758e9fbaSOystein Eftevaag
41*758e9fbaSOystein Eftevaag if (numBranches != 2) {
42*758e9fbaSOystein Eftevaag LOG_ERROR("Wrong number of branches");
43*758e9fbaSOystein Eftevaag return TSS2_FAPI_RC_GENERAL_FAILURE;
44*758e9fbaSOystein Eftevaag }
45*758e9fbaSOystein Eftevaag
46*758e9fbaSOystein Eftevaag if (!strcmp(branchNames[0], "/policy/pol_name_hash"))
47*758e9fbaSOystein Eftevaag *selectedBranch = 0;
48*758e9fbaSOystein Eftevaag else if (!strcmp(branchNames[1], "/policy/pol_name_hash"))
49*758e9fbaSOystein Eftevaag *selectedBranch = 1;
50*758e9fbaSOystein Eftevaag else {
51*758e9fbaSOystein Eftevaag LOG_ERROR("BranchName not found. Got \"%s\" and \"%s\"",
52*758e9fbaSOystein Eftevaag branchNames[0], branchNames[1]);
53*758e9fbaSOystein Eftevaag return TSS2_FAPI_RC_GENERAL_FAILURE;
54*758e9fbaSOystein Eftevaag }
55*758e9fbaSOystein Eftevaag
56*758e9fbaSOystein Eftevaag cb_called = true;
57*758e9fbaSOystein Eftevaag
58*758e9fbaSOystein Eftevaag return TSS2_RC_SUCCESS;
59*758e9fbaSOystein Eftevaag }
60*758e9fbaSOystein Eftevaag
61*758e9fbaSOystein Eftevaag /** Test the FAPI functions for PolicyAuthoirze with signing.
62*758e9fbaSOystein Eftevaag *
63*758e9fbaSOystein Eftevaag * Tested FAPI commands:
64*758e9fbaSOystein Eftevaag * - Fapi_Provision()
65*758e9fbaSOystein Eftevaag * - Fapi_SetBranchCB()
66*758e9fbaSOystein Eftevaag * - Fapi_Import()
67*758e9fbaSOystein Eftevaag * - Fapi_CreateKey()
68*758e9fbaSOystein Eftevaag * - Fapi_AuthorizePolicy()
69*758e9fbaSOystein Eftevaag * - Fapi_Sign()
70*758e9fbaSOystein Eftevaag * - Fapi_List()
71*758e9fbaSOystein Eftevaag * - Fapi_Delete()
72*758e9fbaSOystein Eftevaag *
73*758e9fbaSOystein Eftevaag * Tested Policies:
74*758e9fbaSOystein Eftevaag * - PolicyNameHash
75*758e9fbaSOystein Eftevaag * - PolicyAuthorize
76*758e9fbaSOystein Eftevaag * - PolicyCpHash (Not entered, only as alternative branch)
77*758e9fbaSOystein Eftevaag *
78*758e9fbaSOystein Eftevaag * @param[in,out] context The FAPI_CONTEXT.
79*758e9fbaSOystein Eftevaag * @retval EXIT_FAILURE
80*758e9fbaSOystein Eftevaag * @retval EXIT_SUCCESS
81*758e9fbaSOystein Eftevaag */
82*758e9fbaSOystein Eftevaag int
test_fapi_key_create_policy_authorize_sign(FAPI_CONTEXT * context)83*758e9fbaSOystein Eftevaag test_fapi_key_create_policy_authorize_sign(FAPI_CONTEXT *context)
84*758e9fbaSOystein Eftevaag {
85*758e9fbaSOystein Eftevaag TSS2_RC r;
86*758e9fbaSOystein Eftevaag char *policy_name_hash = "/policy/pol_name_hash";
87*758e9fbaSOystein Eftevaag char *policy_file_name_hash = TOP_SOURCEDIR "/test/data/fapi/policy/pol_name_hash.json";
88*758e9fbaSOystein Eftevaag
89*758e9fbaSOystein Eftevaag /* This policy cannot succeed, but that's the intention. We authorize it but then choose
90*758e9fbaSOystein Eftevaag the other policy from branch selection. */
91*758e9fbaSOystein Eftevaag char *policy_cphash = "/policy/pol_cphash";
92*758e9fbaSOystein Eftevaag char *policy_file_cphash = TOP_SOURCEDIR "/test/data/fapi/policy/pol_cphash.json";
93*758e9fbaSOystein Eftevaag char *policy_name_authorize = "/policy/pol_authorize";
94*758e9fbaSOystein Eftevaag char *policy_file_authorize = TOP_SOURCEDIR "/test/data/fapi/policy/pol_authorize.json";
95*758e9fbaSOystein Eftevaag char *policy_name_authorize_outer = "/policy/pol_authorize_outer";
96*758e9fbaSOystein Eftevaag char *policy_file_authorize_outer = TOP_SOURCEDIR
97*758e9fbaSOystein Eftevaag "/test/data/fapi/policy/pol_authorize_outer.json";
98*758e9fbaSOystein Eftevaag uint8_t policyRef[] = { 1, 2, 3, 4, 5 };
99*758e9fbaSOystein Eftevaag FILE *stream = NULL;
100*758e9fbaSOystein Eftevaag char *json_policy = NULL;
101*758e9fbaSOystein Eftevaag long policy_size;
102*758e9fbaSOystein Eftevaag
103*758e9fbaSOystein Eftevaag uint8_t *signature = NULL;
104*758e9fbaSOystein Eftevaag char *publicKey = NULL;
105*758e9fbaSOystein Eftevaag char *pathList = NULL;
106*758e9fbaSOystein Eftevaag
107*758e9fbaSOystein Eftevaag
108*758e9fbaSOystein Eftevaag r = Fapi_Provision(context, NULL, NULL, NULL);
109*758e9fbaSOystein Eftevaag goto_if_error(r, "Error Fapi_Provision", error);
110*758e9fbaSOystein Eftevaag
111*758e9fbaSOystein Eftevaag r = pcr_reset(context, 16);
112*758e9fbaSOystein Eftevaag goto_if_error(r, "Error pcr_reset", error);
113*758e9fbaSOystein Eftevaag
114*758e9fbaSOystein Eftevaag r = Fapi_SetBranchCB(context, branch_callback, NULL);
115*758e9fbaSOystein Eftevaag goto_if_error(r, "Error SetPolicybranchselectioncallback", error);
116*758e9fbaSOystein Eftevaag
117*758e9fbaSOystein Eftevaag /* Read in the first policy */
118*758e9fbaSOystein Eftevaag stream = fopen(policy_file_name_hash, "r");
119*758e9fbaSOystein Eftevaag if (!stream) {
120*758e9fbaSOystein Eftevaag LOG_ERROR("File %s does not exist", policy_file_name_hash);
121*758e9fbaSOystein Eftevaag goto error;
122*758e9fbaSOystein Eftevaag }
123*758e9fbaSOystein Eftevaag fseek(stream, 0L, SEEK_END);
124*758e9fbaSOystein Eftevaag policy_size = ftell(stream);
125*758e9fbaSOystein Eftevaag fclose(stream);
126*758e9fbaSOystein Eftevaag json_policy = malloc(policy_size + 1);
127*758e9fbaSOystein Eftevaag goto_if_null(json_policy,
128*758e9fbaSOystein Eftevaag "Could not allocate memory for the JSON policy",
129*758e9fbaSOystein Eftevaag TSS2_FAPI_RC_MEMORY, error);
130*758e9fbaSOystein Eftevaag stream = fopen(policy_file_name_hash, "r");
131*758e9fbaSOystein Eftevaag ssize_t ret = read(fileno(stream), json_policy, policy_size);
132*758e9fbaSOystein Eftevaag if (ret != policy_size) {
133*758e9fbaSOystein Eftevaag LOG_ERROR("IO error %s.", policy_file_name_hash);
134*758e9fbaSOystein Eftevaag goto error;
135*758e9fbaSOystein Eftevaag }
136*758e9fbaSOystein Eftevaag json_policy[policy_size] = '\0';
137*758e9fbaSOystein Eftevaag
138*758e9fbaSOystein Eftevaag r = Fapi_Import(context, policy_name_hash, json_policy);
139*758e9fbaSOystein Eftevaag SAFE_FREE(json_policy);
140*758e9fbaSOystein Eftevaag goto_if_error(r, "Error Fapi_List", error);
141*758e9fbaSOystein Eftevaag
142*758e9fbaSOystein Eftevaag /* Read in the second policy */
143*758e9fbaSOystein Eftevaag stream = fopen(policy_file_cphash, "r");
144*758e9fbaSOystein Eftevaag if (!stream) {
145*758e9fbaSOystein Eftevaag LOG_ERROR("File %s does not exist", policy_file_name_hash);
146*758e9fbaSOystein Eftevaag goto error;
147*758e9fbaSOystein Eftevaag }
148*758e9fbaSOystein Eftevaag fseek(stream, 0L, SEEK_END);
149*758e9fbaSOystein Eftevaag policy_size = ftell(stream);
150*758e9fbaSOystein Eftevaag fclose(stream);
151*758e9fbaSOystein Eftevaag json_policy = malloc(policy_size + 1);
152*758e9fbaSOystein Eftevaag goto_if_null(json_policy,
153*758e9fbaSOystein Eftevaag "Could not allocate memory for the JSON policy",
154*758e9fbaSOystein Eftevaag TSS2_FAPI_RC_MEMORY, error);
155*758e9fbaSOystein Eftevaag stream = fopen(policy_file_cphash, "r");
156*758e9fbaSOystein Eftevaag ret = read(fileno(stream), json_policy, policy_size);
157*758e9fbaSOystein Eftevaag if (ret != policy_size) {
158*758e9fbaSOystein Eftevaag LOG_ERROR("IO error %s.", policy_file_name_hash);
159*758e9fbaSOystein Eftevaag goto error;
160*758e9fbaSOystein Eftevaag }
161*758e9fbaSOystein Eftevaag json_policy[policy_size] = '\0';
162*758e9fbaSOystein Eftevaag
163*758e9fbaSOystein Eftevaag r = Fapi_Import(context, policy_cphash, json_policy);
164*758e9fbaSOystein Eftevaag SAFE_FREE(json_policy);
165*758e9fbaSOystein Eftevaag goto_if_error(r, "Error Fapi_List", error);
166*758e9fbaSOystein Eftevaag
167*758e9fbaSOystein Eftevaag /* Read in the third policy */
168*758e9fbaSOystein Eftevaag stream = fopen(policy_file_authorize, "r");
169*758e9fbaSOystein Eftevaag if (!stream) {
170*758e9fbaSOystein Eftevaag LOG_ERROR("File %s does not exist", policy_file_authorize);
171*758e9fbaSOystein Eftevaag goto error;
172*758e9fbaSOystein Eftevaag }
173*758e9fbaSOystein Eftevaag fseek(stream, 0L, SEEK_END);
174*758e9fbaSOystein Eftevaag policy_size = ftell(stream);
175*758e9fbaSOystein Eftevaag fclose(stream);
176*758e9fbaSOystein Eftevaag json_policy = malloc(policy_size + 1);
177*758e9fbaSOystein Eftevaag goto_if_null(json_policy,
178*758e9fbaSOystein Eftevaag "Could not allocate memory for the JSON policy",
179*758e9fbaSOystein Eftevaag TSS2_FAPI_RC_MEMORY, error);
180*758e9fbaSOystein Eftevaag stream = fopen(policy_file_authorize, "r");
181*758e9fbaSOystein Eftevaag ret = read(fileno(stream), json_policy, policy_size);
182*758e9fbaSOystein Eftevaag if (ret != policy_size) {
183*758e9fbaSOystein Eftevaag LOG_ERROR("IO error %s.", policy_file_authorize);
184*758e9fbaSOystein Eftevaag goto error;
185*758e9fbaSOystein Eftevaag }
186*758e9fbaSOystein Eftevaag json_policy[policy_size] = '\0';
187*758e9fbaSOystein Eftevaag
188*758e9fbaSOystein Eftevaag r = Fapi_Import(context, policy_name_authorize, json_policy);
189*758e9fbaSOystein Eftevaag SAFE_FREE(json_policy);
190*758e9fbaSOystein Eftevaag goto_if_error(r, "Error Fapi_Import", error);
191*758e9fbaSOystein Eftevaag
192*758e9fbaSOystein Eftevaag /* Read in the fourth policy */
193*758e9fbaSOystein Eftevaag stream = fopen(policy_file_authorize_outer, "r");
194*758e9fbaSOystein Eftevaag if (!stream) {
195*758e9fbaSOystein Eftevaag LOG_ERROR("File %s does not exist", policy_file_authorize_outer);
196*758e9fbaSOystein Eftevaag goto error;
197*758e9fbaSOystein Eftevaag }
198*758e9fbaSOystein Eftevaag fseek(stream, 0L, SEEK_END);
199*758e9fbaSOystein Eftevaag policy_size = ftell(stream);
200*758e9fbaSOystein Eftevaag fclose(stream);
201*758e9fbaSOystein Eftevaag json_policy = malloc(policy_size + 1);
202*758e9fbaSOystein Eftevaag goto_if_null(json_policy,
203*758e9fbaSOystein Eftevaag "Could not allocate memory for the JSON policy",
204*758e9fbaSOystein Eftevaag TSS2_FAPI_RC_MEMORY, error);
205*758e9fbaSOystein Eftevaag stream = fopen(policy_file_authorize_outer, "r");
206*758e9fbaSOystein Eftevaag ret = read(fileno(stream), json_policy, policy_size);
207*758e9fbaSOystein Eftevaag if (ret != policy_size) {
208*758e9fbaSOystein Eftevaag LOG_ERROR("IO error %s.", policy_file_authorize_outer);
209*758e9fbaSOystein Eftevaag goto error;
210*758e9fbaSOystein Eftevaag }
211*758e9fbaSOystein Eftevaag json_policy[policy_size] = '\0';
212*758e9fbaSOystein Eftevaag
213*758e9fbaSOystein Eftevaag r = Fapi_Import(context, policy_name_authorize_outer, json_policy);
214*758e9fbaSOystein Eftevaag SAFE_FREE(json_policy);
215*758e9fbaSOystein Eftevaag goto_if_error(r, "Error Fapi_Import", error);
216*758e9fbaSOystein Eftevaag
217*758e9fbaSOystein Eftevaag /* Create keys and use them to authorize the authorize policy */
218*758e9fbaSOystein Eftevaag r = Fapi_CreateKey(context, "HS/SRK/myPolicySignKeyOuter", "sign,noDa",
219*758e9fbaSOystein Eftevaag "", NULL);
220*758e9fbaSOystein Eftevaag goto_if_error(r, "Error Fapi_CreateKey", error);
221*758e9fbaSOystein Eftevaag
222*758e9fbaSOystein Eftevaag /* Create keys and use them to authorize policies */
223*758e9fbaSOystein Eftevaag r = Fapi_CreateKey(context, "HS/SRK/myPolicySignKey", "sign,noDa",
224*758e9fbaSOystein Eftevaag "", NULL);
225*758e9fbaSOystein Eftevaag goto_if_error(r, "Error Fapi_CreateKey", error);
226*758e9fbaSOystein Eftevaag
227*758e9fbaSOystein Eftevaag /* Create the actual key */
228*758e9fbaSOystein Eftevaag r = Fapi_CreateKey(context, "HS/SRK/mySignKey", "sign, noda",
229*758e9fbaSOystein Eftevaag policy_name_authorize_outer, NULL);
230*758e9fbaSOystein Eftevaag goto_if_error(r, "Error Fapi_CreateKey", error);
231*758e9fbaSOystein Eftevaag
232*758e9fbaSOystein Eftevaag /* Authorize the policies in sequence. */
233*758e9fbaSOystein Eftevaag r = Fapi_AuthorizePolicy(context, policy_name_authorize,
234*758e9fbaSOystein Eftevaag "HS/SRK/myPolicySignKeyOuter", NULL, 0);
235*758e9fbaSOystein Eftevaag goto_if_error(r, "Authorize policy", error);
236*758e9fbaSOystein Eftevaag
237*758e9fbaSOystein Eftevaag r = Fapi_AuthorizePolicy(context, policy_name_hash,
238*758e9fbaSOystein Eftevaag "HS/SRK/myPolicySignKey", policyRef, sizeof(policyRef));
239*758e9fbaSOystein Eftevaag goto_if_error(r, "Authorize policy", error);
240*758e9fbaSOystein Eftevaag
241*758e9fbaSOystein Eftevaag r = Fapi_AuthorizePolicy(context, policy_cphash,
242*758e9fbaSOystein Eftevaag "HS/SRK/myPolicySignKey", policyRef, sizeof(policyRef));
243*758e9fbaSOystein Eftevaag goto_if_error(r, "Authorize policy", error);
244*758e9fbaSOystein Eftevaag
245*758e9fbaSOystein Eftevaag /* The policy is authorized twice with idfferent keys in order to test the code that
246*758e9fbaSOystein Eftevaag stores multiple authorizations inside the policy statements. */
247*758e9fbaSOystein Eftevaag r = Fapi_CreateKey(context, "HS/SRK/myPolicySignKey2", "sign,noDa",
248*758e9fbaSOystein Eftevaag "", NULL);
249*758e9fbaSOystein Eftevaag goto_if_error(r, "Error Fapi_CreateKey", error);
250*758e9fbaSOystein Eftevaag
251*758e9fbaSOystein Eftevaag /* Use the key */
252*758e9fbaSOystein Eftevaag size_t signatureSize = 0;
253*758e9fbaSOystein Eftevaag
254*758e9fbaSOystein Eftevaag TPM2B_DIGEST digest = {
255*758e9fbaSOystein Eftevaag .size = 32,
256*758e9fbaSOystein Eftevaag .buffer = {
257*758e9fbaSOystein Eftevaag 0x67, 0x68, 0x03, 0x3e, 0x21, 0x64, 0x68, 0x24, 0x7b, 0xd0,
258*758e9fbaSOystein Eftevaag 0x31, 0xa0, 0xa2, 0xd9, 0x87, 0x6d, 0x79, 0x81, 0x8f, 0x8f,
259*758e9fbaSOystein Eftevaag 0x31, 0xa0, 0xa2, 0xd9, 0x87, 0x6d, 0x79, 0x81, 0x8f, 0x8f,
260*758e9fbaSOystein Eftevaag 0x41, 0x42
261*758e9fbaSOystein Eftevaag }
262*758e9fbaSOystein Eftevaag };
263*758e9fbaSOystein Eftevaag
264*758e9fbaSOystein Eftevaag r = Fapi_Sign(context, "HS/SRK/mySignKey", NULL,
265*758e9fbaSOystein Eftevaag &digest.buffer[0], digest.size, &signature, &signatureSize,
266*758e9fbaSOystein Eftevaag &publicKey, NULL);
267*758e9fbaSOystein Eftevaag goto_if_error(r, "Error Fapi_Sign", error);
268*758e9fbaSOystein Eftevaag
269*758e9fbaSOystein Eftevaag r = Fapi_List(context, "/", &pathList);
270*758e9fbaSOystein Eftevaag goto_if_error(r, "Error Fapi_List", error);
271*758e9fbaSOystein Eftevaag SAFE_FREE(pathList);
272*758e9fbaSOystein Eftevaag
273*758e9fbaSOystein Eftevaag r = Fapi_List(context, "/SRK/", &pathList);
274*758e9fbaSOystein Eftevaag goto_if_error(r, "Error Fapi_List", error);
275*758e9fbaSOystein Eftevaag fprintf(stderr, "\n%s\n", pathList);
276*758e9fbaSOystein Eftevaag SAFE_FREE(pathList);
277*758e9fbaSOystein Eftevaag
278*758e9fbaSOystein Eftevaag r = Fapi_List(context, "/HS/", &pathList);
279*758e9fbaSOystein Eftevaag goto_if_error(r, "Error Fapi_List", error);
280*758e9fbaSOystein Eftevaag fprintf(stderr, "\n%s\n", pathList);
281*758e9fbaSOystein Eftevaag SAFE_FREE(pathList);
282*758e9fbaSOystein Eftevaag
283*758e9fbaSOystein Eftevaag LOG_WARNING("Next is a failure-test, and we expect errors in the log");
284*758e9fbaSOystein Eftevaag r = Fapi_List(context, "XXX", &pathList);
285*758e9fbaSOystein Eftevaag if (r == TSS2_RC_SUCCESS) {
286*758e9fbaSOystein Eftevaag LOG_ERROR("Path XXX was found");
287*758e9fbaSOystein Eftevaag goto error;
288*758e9fbaSOystein Eftevaag }
289*758e9fbaSOystein Eftevaag SAFE_FREE(pathList);
290*758e9fbaSOystein Eftevaag
291*758e9fbaSOystein Eftevaag r = Fapi_List(context, "/HS/", &pathList);
292*758e9fbaSOystein Eftevaag goto_if_error(r, "Error Fapi_List", error);
293*758e9fbaSOystein Eftevaag fprintf(stderr, "\n%s\n", pathList);
294*758e9fbaSOystein Eftevaag SAFE_FREE(pathList);
295*758e9fbaSOystein Eftevaag
296*758e9fbaSOystein Eftevaag /* Cleanup */
297*758e9fbaSOystein Eftevaag r = Fapi_Delete(context, "/HS/SRK");
298*758e9fbaSOystein Eftevaag goto_if_error(r, "Error Fapi_Delete", error);
299*758e9fbaSOystein Eftevaag
300*758e9fbaSOystein Eftevaag SAFE_FREE(signature);
301*758e9fbaSOystein Eftevaag SAFE_FREE(publicKey);
302*758e9fbaSOystein Eftevaag
303*758e9fbaSOystein Eftevaag if (!cb_called) {
304*758e9fbaSOystein Eftevaag LOG_ERROR("Branch selection callback was not called.");
305*758e9fbaSOystein Eftevaag return EXIT_FAILURE;
306*758e9fbaSOystein Eftevaag }
307*758e9fbaSOystein Eftevaag
308*758e9fbaSOystein Eftevaag return EXIT_SUCCESS;
309*758e9fbaSOystein Eftevaag
310*758e9fbaSOystein Eftevaag error:
311*758e9fbaSOystein Eftevaag SAFE_FREE(json_policy);
312*758e9fbaSOystein Eftevaag SAFE_FREE(signature);
313*758e9fbaSOystein Eftevaag SAFE_FREE(publicKey);
314*758e9fbaSOystein Eftevaag SAFE_FREE(pathList);
315*758e9fbaSOystein Eftevaag Fapi_Delete(context, "/HS/SRK");
316*758e9fbaSOystein Eftevaag return EXIT_FAILURE;
317*758e9fbaSOystein Eftevaag }
318*758e9fbaSOystein Eftevaag
319*758e9fbaSOystein Eftevaag int
test_invoke_fapi(FAPI_CONTEXT * fapi_context)320*758e9fbaSOystein Eftevaag test_invoke_fapi(FAPI_CONTEXT *fapi_context)
321*758e9fbaSOystein Eftevaag {
322*758e9fbaSOystein Eftevaag return test_fapi_key_create_policy_authorize_sign(fapi_context);
323*758e9fbaSOystein Eftevaag }
324