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 <stdlib.h>
12*758e9fbaSOystein Eftevaag #include <stdio.h>
13*758e9fbaSOystein Eftevaag #include <inttypes.h>
14*758e9fbaSOystein Eftevaag #include <string.h>
15*758e9fbaSOystein Eftevaag
16*758e9fbaSOystein Eftevaag #include "tss2_fapi.h"
17*758e9fbaSOystein Eftevaag
18*758e9fbaSOystein Eftevaag #define LOGMODULE test
19*758e9fbaSOystein Eftevaag #include "util/log.h"
20*758e9fbaSOystein Eftevaag #include "util/aux_util.h"
21*758e9fbaSOystein Eftevaag
22*758e9fbaSOystein Eftevaag #define NV_SIZE 32
23*758e9fbaSOystein Eftevaag
24*758e9fbaSOystein Eftevaag #define PASSWORD "abc"
25*758e9fbaSOystein Eftevaag
26*758e9fbaSOystein Eftevaag static char *password;
27*758e9fbaSOystein Eftevaag
28*758e9fbaSOystein Eftevaag static TSS2_RC
auth_callback(FAPI_CONTEXT * context,char const * description,char ** auth,void * userData)29*758e9fbaSOystein Eftevaag auth_callback(
30*758e9fbaSOystein Eftevaag FAPI_CONTEXT *context,
31*758e9fbaSOystein Eftevaag char const *description,
32*758e9fbaSOystein Eftevaag char **auth,
33*758e9fbaSOystein Eftevaag void *userData)
34*758e9fbaSOystein Eftevaag {
35*758e9fbaSOystein Eftevaag (void)description;
36*758e9fbaSOystein Eftevaag (void)userData;
37*758e9fbaSOystein Eftevaag *auth = strdup(password);
38*758e9fbaSOystein Eftevaag return_if_null(*auth, "Out of memory.", TSS2_FAPI_RC_MEMORY);
39*758e9fbaSOystein Eftevaag return TSS2_RC_SUCCESS;
40*758e9fbaSOystein Eftevaag }
41*758e9fbaSOystein Eftevaag
42*758e9fbaSOystein Eftevaag
43*758e9fbaSOystein Eftevaag /** Test the FAPI function FAPI_NvExtend.
44*758e9fbaSOystein Eftevaag *
45*758e9fbaSOystein Eftevaag * Tested FAPI commands:
46*758e9fbaSOystein Eftevaag * - Fapi_Provision()
47*758e9fbaSOystein Eftevaag * - Fapi_CreateNv()
48*758e9fbaSOystein Eftevaag * - Fapi_NvExtend()
49*758e9fbaSOystein Eftevaag * - Fapi_Delete()
50*758e9fbaSOystein Eftevaag * - Fapi_SetAuthCB()
51*758e9fbaSOystein Eftevaag *
52*758e9fbaSOystein Eftevaag * @param[in,out] context The FAPI_CONTEXT.
53*758e9fbaSOystein Eftevaag * @retval EXIT_FAILURE
54*758e9fbaSOystein Eftevaag * @retval EXIT_SUCCESS
55*758e9fbaSOystein Eftevaag */
56*758e9fbaSOystein Eftevaag int
test_fapi_nv_extend(FAPI_CONTEXT * context)57*758e9fbaSOystein Eftevaag test_fapi_nv_extend(FAPI_CONTEXT *context)
58*758e9fbaSOystein Eftevaag {
59*758e9fbaSOystein Eftevaag TSS2_RC r;
60*758e9fbaSOystein Eftevaag char *nvPathExtend = "/nv/Owner/myNVextend";
61*758e9fbaSOystein Eftevaag uint8_t *data_dest = NULL;
62*758e9fbaSOystein Eftevaag char *log = NULL;
63*758e9fbaSOystein Eftevaag size_t dest_size;
64*758e9fbaSOystein Eftevaag
65*758e9fbaSOystein Eftevaag r = Fapi_Provision(context, NULL, NULL, NULL);
66*758e9fbaSOystein Eftevaag goto_if_error(r, "Error Fapi_Provision", error);
67*758e9fbaSOystein Eftevaag
68*758e9fbaSOystein Eftevaag /* Test no password, noda set */
69*758e9fbaSOystein Eftevaag r = Fapi_CreateNv(context, nvPathExtend, "pcr, noda", 0, "", "");
70*758e9fbaSOystein Eftevaag goto_if_error(r, "Error Fapi_CreateNv", error);
71*758e9fbaSOystein Eftevaag
72*758e9fbaSOystein Eftevaag uint8_t data_src[NV_SIZE] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9,
73*758e9fbaSOystein Eftevaag 0, 1, 2, 3, 4, 5, 6, 7, 8, 9,
74*758e9fbaSOystein Eftevaag 0, 1, 2, 3, 4, 5, 6, 7, 8, 9,
75*758e9fbaSOystein Eftevaag 0, 1
76*758e9fbaSOystein Eftevaag };
77*758e9fbaSOystein Eftevaag
78*758e9fbaSOystein Eftevaag
79*758e9fbaSOystein Eftevaag r = Fapi_NvExtend(context, nvPathExtend, &data_src[0], NV_SIZE, "{ \"test\": \"myfile\" }");
80*758e9fbaSOystein Eftevaag goto_if_error(r, "Error Fapi_NV_EXTEND", error);
81*758e9fbaSOystein Eftevaag
82*758e9fbaSOystein Eftevaag r = Fapi_NvRead(context, nvPathExtend, &data_dest, &dest_size, &log);
83*758e9fbaSOystein Eftevaag goto_if_error(r, "Error Fapi_NvRead", error);
84*758e9fbaSOystein Eftevaag
85*758e9fbaSOystein Eftevaag fprintf(stderr, "\nLog:\n%s\n", log);
86*758e9fbaSOystein Eftevaag SAFE_FREE(data_dest);
87*758e9fbaSOystein Eftevaag
88*758e9fbaSOystein Eftevaag r = Fapi_NvExtend(context, nvPathExtend, &data_src[0], NV_SIZE, "{ \"test\": \"myfile\" }");
89*758e9fbaSOystein Eftevaag goto_if_error(r, "Error Fapi_NV_EXTEND", error);
90*758e9fbaSOystein Eftevaag
91*758e9fbaSOystein Eftevaag SAFE_FREE(log);
92*758e9fbaSOystein Eftevaag r = Fapi_NvRead(context, nvPathExtend, &data_dest, &dest_size, &log);
93*758e9fbaSOystein Eftevaag goto_if_error(r, "Error Fapi_NvRead", error);
94*758e9fbaSOystein Eftevaag
95*758e9fbaSOystein Eftevaag fprintf(stderr, "\nLog:\n%s\n", log);
96*758e9fbaSOystein Eftevaag
97*758e9fbaSOystein Eftevaag r = Fapi_Delete(context, nvPathExtend);
98*758e9fbaSOystein Eftevaag goto_if_error(r, "Error Fapi_NV_Undefine", error);
99*758e9fbaSOystein Eftevaag
100*758e9fbaSOystein Eftevaag r = Fapi_SetAuthCB(context, auth_callback, "");
101*758e9fbaSOystein Eftevaag goto_if_error(r, "Error SetPolicyAuthCallback", error);
102*758e9fbaSOystein Eftevaag
103*758e9fbaSOystein Eftevaag /* Test with password noda set */
104*758e9fbaSOystein Eftevaag password = PASSWORD;
105*758e9fbaSOystein Eftevaag r = Fapi_CreateNv(context, nvPathExtend, "pcr, noda", 0, "", PASSWORD);
106*758e9fbaSOystein Eftevaag goto_if_error(r, "Error Fapi_CreateNv", error);
107*758e9fbaSOystein Eftevaag
108*758e9fbaSOystein Eftevaag r = Fapi_SetAuthCB(context, auth_callback, "");
109*758e9fbaSOystein Eftevaag goto_if_error(r, "Error SetPolicyAuthCallback", error);
110*758e9fbaSOystein Eftevaag
111*758e9fbaSOystein Eftevaag r = Fapi_NvExtend(context, nvPathExtend, &data_src[0], NV_SIZE, "{ \"test\": \"myfile\" }");
112*758e9fbaSOystein Eftevaag goto_if_error(r, "Error Fapi_NV_EXTEN", error);
113*758e9fbaSOystein Eftevaag
114*758e9fbaSOystein Eftevaag r = Fapi_Delete(context, nvPathExtend);
115*758e9fbaSOystein Eftevaag goto_if_error(r, "Error Fapi_NV_Undefine", error);
116*758e9fbaSOystein Eftevaag
117*758e9fbaSOystein Eftevaag /* Test no password, noda clear */
118*758e9fbaSOystein Eftevaag password = "";
119*758e9fbaSOystein Eftevaag r = Fapi_CreateNv(context, nvPathExtend, "pcr", 0, "", "");
120*758e9fbaSOystein Eftevaag goto_if_error(r, "Error Fapi_CreateNv", error);
121*758e9fbaSOystein Eftevaag
122*758e9fbaSOystein Eftevaag r = Fapi_NvExtend(context, nvPathExtend, &data_src[0], NV_SIZE, "{ \"test\": \"myfile\" }");
123*758e9fbaSOystein Eftevaag goto_if_error(r, "Error Fapi_NV_EXTEN", error);
124*758e9fbaSOystein Eftevaag
125*758e9fbaSOystein Eftevaag r = Fapi_Delete(context, nvPathExtend);
126*758e9fbaSOystein Eftevaag goto_if_error(r, "Error Fapi_NV_Undefine", error);
127*758e9fbaSOystein Eftevaag
128*758e9fbaSOystein Eftevaag /* Test with password noda clear */
129*758e9fbaSOystein Eftevaag password = PASSWORD;
130*758e9fbaSOystein Eftevaag r = Fapi_CreateNv(context, nvPathExtend, "pcr", 0, "", PASSWORD);
131*758e9fbaSOystein Eftevaag goto_if_error(r, "Error Fapi_CreateNv", error);
132*758e9fbaSOystein Eftevaag
133*758e9fbaSOystein Eftevaag r = Fapi_SetAuthCB(context, auth_callback, "");
134*758e9fbaSOystein Eftevaag goto_if_error(r, "Error SetPolicyAuthCallback", error);
135*758e9fbaSOystein Eftevaag
136*758e9fbaSOystein Eftevaag r = Fapi_NvExtend(context, nvPathExtend, &data_src[0], NV_SIZE, "{ \"test\": \"myfile\" }");
137*758e9fbaSOystein Eftevaag goto_if_error(r, "Error Fapi_NV_EXTEN", error);
138*758e9fbaSOystein Eftevaag
139*758e9fbaSOystein Eftevaag r = Fapi_Delete(context, nvPathExtend);
140*758e9fbaSOystein Eftevaag goto_if_error(r, "Error Fapi_NV_Undefine", error);
141*758e9fbaSOystein Eftevaag
142*758e9fbaSOystein Eftevaag r = Fapi_Delete(context, "/");
143*758e9fbaSOystein Eftevaag goto_if_error(r, "Error Fapi_Delete", error);
144*758e9fbaSOystein Eftevaag
145*758e9fbaSOystein Eftevaag SAFE_FREE(log);
146*758e9fbaSOystein Eftevaag SAFE_FREE(data_dest);
147*758e9fbaSOystein Eftevaag return EXIT_SUCCESS;
148*758e9fbaSOystein Eftevaag
149*758e9fbaSOystein Eftevaag error:
150*758e9fbaSOystein Eftevaag SAFE_FREE(log);
151*758e9fbaSOystein Eftevaag SAFE_FREE(data_dest);
152*758e9fbaSOystein Eftevaag return EXIT_FAILURE;
153*758e9fbaSOystein Eftevaag }
154*758e9fbaSOystein Eftevaag
155*758e9fbaSOystein Eftevaag int
test_invoke_fapi(FAPI_CONTEXT * context)156*758e9fbaSOystein Eftevaag test_invoke_fapi(FAPI_CONTEXT *context)
157*758e9fbaSOystein Eftevaag {
158*758e9fbaSOystein Eftevaag return test_fapi_nv_extend(context);
159*758e9fbaSOystein Eftevaag }
160