1 /* SPDX-License-Identifier: BSD-2-Clause */
2 /*******************************************************************************
3 * Copyright 2017-2018, Fraunhofer SIT sponsored by Infineon Technologies AG
4 * All rights reserved.
5 *******************************************************************************/
6
7 #ifdef HAVE_CONFIG_H
8 #include <config.h>
9 #endif
10
11 #include <stdlib.h>
12
13 #include "tss2_esys.h"
14
15 #include "esys_iutil.h"
16 #include "test-esapi.h"
17 #define LOGMODULE test
18 #include "util/log.h"
19 #include "util/aux_util.h"
20
21 /** Test the basic commands for PCR processing.
22 *
23 *\b Note: platform authorization needed.
24 *
25 * Tested ESAPI commands:
26 * - Esys_PCR_Allocate() (M)
27 * - Esys_PCR_Event() (M)
28 * - Esys_PCR_Extend() (M)
29 * - Esys_PCR_Read() (M)
30 * - Esys_PCR_Reset() (M)
31 *
32 * @param[in,out] esys_context The ESYS_CONTEXT.
33 * @retval EXIT_FAILURE
34 * @retval EXIT_SKIP
35 * @retval EXIT_SUCCESS
36 */
37
38 int
test_esys_pcr_basic(ESYS_CONTEXT * esys_context)39 test_esys_pcr_basic(ESYS_CONTEXT * esys_context)
40 {
41 TSS2_RC r;
42 int failure_return = EXIT_FAILURE;
43
44 TPMS_CAPABILITY_DATA *savedPCRs = NULL;
45 TPML_PCR_SELECTION *pcrSelectionOut = NULL;
46 TPML_DIGEST *pcrValues = NULL;
47 TPML_DIGEST_VALUES *digestsEvent = NULL;
48
49 ESYS_TR pcrHandle_handle = 16;
50 TPML_DIGEST_VALUES digests
51 = {
52 .count = 1,
53 .digests = {
54 {
55 .hashAlg = TPM2_ALG_SHA1,
56 .digest = {
57 .sha1 = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10,
58 11, 12, 13, 14, 15, 16, 17, 18, 19}
59 }
60 },
61 }};
62
63 r = Esys_PCR_Extend(
64 esys_context,
65 pcrHandle_handle,
66 ESYS_TR_PASSWORD,
67 ESYS_TR_NONE,
68 ESYS_TR_NONE,
69 &digests
70 );
71 goto_if_error(r, "Error: PCR_Extend", error);
72
73 TPML_PCR_SELECTION pcrSelectionIn = {
74 .count = 2,
75 .pcrSelections = {
76 { .hash = TPM2_ALG_SHA1,
77 .sizeofSelect = 3,
78 .pcrSelect = { 01, 00, 03},
79 },
80 { .hash = TPM2_ALG_SHA256,
81 .sizeofSelect = 3,
82 .pcrSelect = { 01, 00, 03}
83 },
84 }
85 };
86 UINT32 pcrUpdateCounter;
87
88 r = Esys_PCR_Read(
89 esys_context,
90 ESYS_TR_NONE,
91 ESYS_TR_NONE,
92 ESYS_TR_NONE,
93 &pcrSelectionIn,
94 &pcrUpdateCounter,
95 &pcrSelectionOut,
96 &pcrValues);
97 goto_if_error(r, "Error: PCR_Read", error);
98
99 r = Esys_PCR_Reset(
100 esys_context,
101 pcrHandle_handle,
102 ESYS_TR_PASSWORD,
103 ESYS_TR_NONE,
104 ESYS_TR_NONE);
105
106 goto_if_error(r, "Error: PCR_Reset", error);
107
108 TPM2B_EVENT eventData = { .size = 20,
109 .buffer={0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0,
110 1, 2, 3, 4, 5, 6, 7, 8, 9}};
111 r = Esys_PCR_Event(
112 esys_context,
113 pcrHandle_handle,
114 ESYS_TR_PASSWORD,
115 ESYS_TR_NONE,
116 ESYS_TR_NONE,
117 &eventData,
118 &digestsEvent);
119
120 goto_if_error(r, "Error: PCR_Reset", error);
121
122 TPMI_YES_NO allocationSuccess;
123 UINT32 maxPCR;
124 UINT32 sizeNeeded;
125 UINT32 sizeAvailable;
126
127 r = Esys_GetCapability(esys_context,
128 ESYS_TR_NONE, ESYS_TR_NONE, ESYS_TR_NONE,
129 TPM2_CAP_PCRS, 0, 10, NULL, &savedPCRs);
130 goto_if_error(r, "Error: GetCapabilities", error);
131
132
133 r = Esys_PCR_Allocate(
134 esys_context,
135 ESYS_TR_RH_PLATFORM,
136 ESYS_TR_PASSWORD,
137 ESYS_TR_NONE,
138 ESYS_TR_NONE,
139 &pcrSelectionIn,
140 &allocationSuccess,
141 &maxPCR,
142 &sizeNeeded,
143 &sizeAvailable);
144
145 if ((r & ~TPM2_RC_N_MASK) == TPM2_RC_BAD_AUTH) {
146 /* Platform authorization not possible test will be skipped */
147 LOG_WARNING("Platform authorization not possible.");
148 failure_return = EXIT_SKIP;
149 }
150
151 goto_if_error(r, "Error: PCR_Allocate", error);
152
153 r = Esys_PCR_Allocate(
154 esys_context,
155 ESYS_TR_RH_PLATFORM,
156 ESYS_TR_PASSWORD,
157 ESYS_TR_NONE,
158 ESYS_TR_NONE,
159 &savedPCRs->data.assignedPCR,
160 &allocationSuccess,
161 &maxPCR,
162 &sizeNeeded,
163 &sizeAvailable);
164
165 goto_if_error(r, "Error: PCR_Allocate", error);
166
167 Esys_Free(savedPCRs);
168 Esys_Free(pcrSelectionOut);
169 Esys_Free(pcrValues);
170 Esys_Free(digestsEvent);
171 return EXIT_SUCCESS;
172
173 error:
174 Esys_Free(savedPCRs);
175 Esys_Free(pcrSelectionOut);
176 Esys_Free(pcrValues);
177 Esys_Free(digestsEvent);
178 return failure_return;
179
180 }
181
182 int
test_invoke_esapi(ESYS_CONTEXT * esys_context)183 test_invoke_esapi(ESYS_CONTEXT * esys_context) {
184 return test_esys_pcr_basic(esys_context);
185 }
186