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 #include <unistd.h>
16*758e9fbaSOystein Eftevaag
17*758e9fbaSOystein Eftevaag #include "tss2_fapi.h"
18*758e9fbaSOystein Eftevaag #include "tss2_esys.h"
19*758e9fbaSOystein Eftevaag
20*758e9fbaSOystein Eftevaag #include "test-fapi.h"
21*758e9fbaSOystein Eftevaag #define LOGMODULE test
22*758e9fbaSOystein Eftevaag #include "util/log.h"
23*758e9fbaSOystein Eftevaag #include "util/aux_util.h"
24*758e9fbaSOystein Eftevaag
25*758e9fbaSOystein Eftevaag static TSS2_RC
check_tpm_cmd(FAPI_CONTEXT * context,TPM2_CC command_code)26*758e9fbaSOystein Eftevaag check_tpm_cmd(FAPI_CONTEXT *context, TPM2_CC command_code)
27*758e9fbaSOystein Eftevaag {
28*758e9fbaSOystein Eftevaag TSS2_RC r;
29*758e9fbaSOystein Eftevaag TSS2_TCTI_CONTEXT *tcti;
30*758e9fbaSOystein Eftevaag ESYS_CONTEXT *esys;
31*758e9fbaSOystein Eftevaag TPMS_CAPABILITY_DATA *cap_data;
32*758e9fbaSOystein Eftevaag
33*758e9fbaSOystein Eftevaag r = Fapi_GetTcti(context, &tcti);
34*758e9fbaSOystein Eftevaag goto_if_error(r, "Error Fapi_GetTcti", error);
35*758e9fbaSOystein Eftevaag
36*758e9fbaSOystein Eftevaag r = Esys_Initialize(&esys, tcti, NULL);
37*758e9fbaSOystein Eftevaag goto_if_error(r, "Error Fapi_GetTcti", error);
38*758e9fbaSOystein Eftevaag
39*758e9fbaSOystein Eftevaag r = Esys_GetCapability(esys,
40*758e9fbaSOystein Eftevaag ESYS_TR_NONE, ESYS_TR_NONE, ESYS_TR_NONE,
41*758e9fbaSOystein Eftevaag TPM2_CAP_COMMANDS, command_code, 1, NULL, &cap_data);
42*758e9fbaSOystein Eftevaag Esys_Finalize(&esys);
43*758e9fbaSOystein Eftevaag return_if_error(r, "Error: GetCapabilities");
44*758e9fbaSOystein Eftevaag
45*758e9fbaSOystein Eftevaag if ((cap_data->data.command.commandAttributes[0] & TPMA_CC_COMMANDINDEX_MASK) ==
46*758e9fbaSOystein Eftevaag command_code) {
47*758e9fbaSOystein Eftevaag free(cap_data);
48*758e9fbaSOystein Eftevaag return TSS2_RC_SUCCESS;
49*758e9fbaSOystein Eftevaag } else {
50*758e9fbaSOystein Eftevaag free(cap_data);
51*758e9fbaSOystein Eftevaag return TSS2_FAPI_RC_NOT_IMPLEMENTED;
52*758e9fbaSOystein Eftevaag }
53*758e9fbaSOystein Eftevaag
54*758e9fbaSOystein Eftevaag error:
55*758e9fbaSOystein Eftevaag return r;
56*758e9fbaSOystein Eftevaag }
57*758e9fbaSOystein Eftevaag
58*758e9fbaSOystein Eftevaag /** Test the FAPI PolicyCpHash but means of AuthorizeNv.
59*758e9fbaSOystein Eftevaag *
60*758e9fbaSOystein Eftevaag * Tested FAPI commands:
61*758e9fbaSOystein Eftevaag * - Fapi_GetTcti()
62*758e9fbaSOystein Eftevaag * - Fapi_Provision()
63*758e9fbaSOystein Eftevaag * - Fapi_Import()
64*758e9fbaSOystein Eftevaag * - Fapi_CreateNv()
65*758e9fbaSOystein Eftevaag * - Fapi_WriteAuthorizeNv
66*758e9fbaSOystein Eftevaag * - Fapi_NvWrite()
67*758e9fbaSOystein Eftevaag *
68*758e9fbaSOystein Eftevaag * Tested Policies:
69*758e9fbaSOystein Eftevaag * - PolicyAuthorize
70*758e9fbaSOystein Eftevaag * - PolicyCpHash
71*758e9fbaSOystein Eftevaag *
72*758e9fbaSOystein Eftevaag * @param[in,out] context The FAPI_CONTEXT.
73*758e9fbaSOystein Eftevaag * @retval EXIT_FAILURE
74*758e9fbaSOystein Eftevaag * @retval EXIT_SUCCESS
75*758e9fbaSOystein Eftevaag */
76*758e9fbaSOystein Eftevaag int
test_fapi_nv_authorizenv_cphash(FAPI_CONTEXT * context)77*758e9fbaSOystein Eftevaag test_fapi_nv_authorizenv_cphash(FAPI_CONTEXT *context)
78*758e9fbaSOystein Eftevaag {
79*758e9fbaSOystein Eftevaag TSS2_RC r;
80*758e9fbaSOystein Eftevaag ssize_t ret;
81*758e9fbaSOystein Eftevaag uint8_t data[] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
82*758e9fbaSOystein Eftevaag char *policy1_name = "/policy/pol_authorize_nv";
83*758e9fbaSOystein Eftevaag char *policy1_file = TOP_SOURCEDIR "/test/data/fapi/policy/pol_authorize_nv.json";
84*758e9fbaSOystein Eftevaag char *policy2_name = "/policy/pol_cphash";
85*758e9fbaSOystein Eftevaag char *policy2_file = TOP_SOURCEDIR "/test/data/fapi/policy/pol_cphash.json";
86*758e9fbaSOystein Eftevaag FILE *stream = NULL;
87*758e9fbaSOystein Eftevaag char json[1024];
88*758e9fbaSOystein Eftevaag
89*758e9fbaSOystein Eftevaag if (check_tpm_cmd(context, TPM2_CC_PolicyAuthorizeNV) != TPM2_RC_SUCCESS) {
90*758e9fbaSOystein Eftevaag LOG_WARNING("Command PolicyAuthorizeNV not available.");
91*758e9fbaSOystein Eftevaag return EXIT_SKIP;
92*758e9fbaSOystein Eftevaag }
93*758e9fbaSOystein Eftevaag
94*758e9fbaSOystein Eftevaag r = Fapi_Provision(context, NULL, NULL, NULL);
95*758e9fbaSOystein Eftevaag goto_if_error(r, "Error Fapi_Provision", error);
96*758e9fbaSOystein Eftevaag
97*758e9fbaSOystein Eftevaag memset(&json[0], 0, sizeof(json));
98*758e9fbaSOystein Eftevaag stream = fopen(policy1_file, "r");
99*758e9fbaSOystein Eftevaag ret = read(fileno(stream), &json[0], sizeof(json));
100*758e9fbaSOystein Eftevaag fclose(stream);
101*758e9fbaSOystein Eftevaag if (ret < 0) {
102*758e9fbaSOystein Eftevaag LOG_ERROR("IO error %s.", policy1_file);
103*758e9fbaSOystein Eftevaag goto error;
104*758e9fbaSOystein Eftevaag }
105*758e9fbaSOystein Eftevaag json[ret] = '\0';
106*758e9fbaSOystein Eftevaag r = Fapi_Import(context, policy1_name, json);
107*758e9fbaSOystein Eftevaag goto_if_error(r, "Error Fapi_Import", error);
108*758e9fbaSOystein Eftevaag
109*758e9fbaSOystein Eftevaag memset(&json[0], 0, sizeof(json));
110*758e9fbaSOystein Eftevaag stream = fopen(policy2_file, "r");
111*758e9fbaSOystein Eftevaag ret = read(fileno(stream), &json[0], sizeof(json));
112*758e9fbaSOystein Eftevaag fclose(stream);
113*758e9fbaSOystein Eftevaag if (ret < 0) {
114*758e9fbaSOystein Eftevaag LOG_ERROR("IO error %s.", policy2_file);
115*758e9fbaSOystein Eftevaag goto error;
116*758e9fbaSOystein Eftevaag }
117*758e9fbaSOystein Eftevaag json[ret] = '\0';
118*758e9fbaSOystein Eftevaag r = Fapi_Import(context, policy2_name, json);
119*758e9fbaSOystein Eftevaag goto_if_error(r, "Error Fapi_Import", error);
120*758e9fbaSOystein Eftevaag
121*758e9fbaSOystein Eftevaag /* Start the test */
122*758e9fbaSOystein Eftevaag
123*758e9fbaSOystein Eftevaag r = Fapi_CreateNv(context, "/nv/Owner/myNV", "", 34, "", "");
124*758e9fbaSOystein Eftevaag goto_if_error(r, "Error Fapi_CreateNv", error);
125*758e9fbaSOystein Eftevaag
126*758e9fbaSOystein Eftevaag
127*758e9fbaSOystein Eftevaag r = Fapi_CreateNv(context, "/nv/Owner/myNV2", "", sizeof(data), policy1_name, "");
128*758e9fbaSOystein Eftevaag goto_if_error(r, "Error Fapi_CreateNv", error);
129*758e9fbaSOystein Eftevaag
130*758e9fbaSOystein Eftevaag r = Fapi_WriteAuthorizeNv(context, "/nv/Owner/myNV", policy2_name);
131*758e9fbaSOystein Eftevaag goto_if_error(r, "Error Fapi_WriteAuthorizeNv", error);
132*758e9fbaSOystein Eftevaag
133*758e9fbaSOystein Eftevaag r = Fapi_NvWrite(context, "/nv/Owner/myNV2", &data[0], sizeof(data));
134*758e9fbaSOystein Eftevaag goto_if_error(r, "Error Fapi_NvWrite", error);
135*758e9fbaSOystein Eftevaag
136*758e9fbaSOystein Eftevaag /* Cleanup */
137*758e9fbaSOystein Eftevaag
138*758e9fbaSOystein Eftevaag r = Fapi_Delete(context, "/nv/Owner/myNV");
139*758e9fbaSOystein Eftevaag goto_if_error(r, "Error Fapi_NV_Undefine", error);
140*758e9fbaSOystein Eftevaag
141*758e9fbaSOystein Eftevaag r = Fapi_Delete(context, "/nv/Owner/myNV2");
142*758e9fbaSOystein Eftevaag goto_if_error(r, "Error Fapi_NV_Undefine", error);
143*758e9fbaSOystein Eftevaag
144*758e9fbaSOystein Eftevaag r = Fapi_Delete(context, "/");
145*758e9fbaSOystein Eftevaag goto_if_error(r, "Error Fapi_Delete", error);
146*758e9fbaSOystein Eftevaag
147*758e9fbaSOystein Eftevaag return EXIT_SUCCESS;
148*758e9fbaSOystein Eftevaag
149*758e9fbaSOystein Eftevaag error:
150*758e9fbaSOystein Eftevaag return EXIT_FAILURE;
151*758e9fbaSOystein Eftevaag }
152*758e9fbaSOystein Eftevaag
153*758e9fbaSOystein Eftevaag int
test_invoke_fapi(FAPI_CONTEXT * context)154*758e9fbaSOystein Eftevaag test_invoke_fapi(FAPI_CONTEXT *context)
155*758e9fbaSOystein Eftevaag {
156*758e9fbaSOystein Eftevaag return test_fapi_nv_authorizenv_cphash(context);
157*758e9fbaSOystein Eftevaag }
158