xref: /aosp_15_r20/external/tpm2-tss/test/integration/esys-pcr-basic.int.c (revision 758e9fba6fc9adbf15340f70c73baee7b168b1c9)
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