1*758e9fbaSOystein Eftevaag /* SPDX-License-Identifier: BSD-2-Clause */
2*758e9fbaSOystein Eftevaag /***********************************************************************;
3*758e9fbaSOystein Eftevaag * Copyright (c) 2015, Intel Corporation
4*758e9fbaSOystein Eftevaag * All rights reserved.
5*758e9fbaSOystein Eftevaag ***********************************************************************;
6*758e9fbaSOystein Eftevaag */
7*758e9fbaSOystein Eftevaag
8*758e9fbaSOystein Eftevaag #ifdef HAVE_CONFIG_H
9*758e9fbaSOystein Eftevaag #include <config.h>
10*758e9fbaSOystein Eftevaag #endif
11*758e9fbaSOystein Eftevaag
12*758e9fbaSOystein Eftevaag #include <stdbool.h>
13*758e9fbaSOystein Eftevaag #include <inttypes.h>
14*758e9fbaSOystein Eftevaag #include <stdio.h>
15*758e9fbaSOystein Eftevaag #include <stdlib.h>
16*758e9fbaSOystein Eftevaag #include <string.h>
17*758e9fbaSOystein Eftevaag
18*758e9fbaSOystein Eftevaag #include "tss2_sys.h"
19*758e9fbaSOystein Eftevaag #include "tss2_tcti_device.h"
20*758e9fbaSOystein Eftevaag #include "tss2_tcti_mssim.h"
21*758e9fbaSOystein Eftevaag
22*758e9fbaSOystein Eftevaag #include "../integration/context-util.h"
23*758e9fbaSOystein Eftevaag #include "../integration/sapi-util.h"
24*758e9fbaSOystein Eftevaag #include "../integration/session-util.h"
25*758e9fbaSOystein Eftevaag #include "util/tss2_endian.h"
26*758e9fbaSOystein Eftevaag #include "sysapi_util.h"
27*758e9fbaSOystein Eftevaag #define LOGMODULE testtpmclient
28*758e9fbaSOystein Eftevaag #include "util/log.h"
29*758e9fbaSOystein Eftevaag
30*758e9fbaSOystein Eftevaag /*
31*758e9fbaSOystein Eftevaag * TPM indices and sizes
32*758e9fbaSOystein Eftevaag */
33*758e9fbaSOystein Eftevaag #define NV_AUX_INDEX_SIZE 96
34*758e9fbaSOystein Eftevaag #define NV_PS_INDEX_SIZE 34
35*758e9fbaSOystein Eftevaag
36*758e9fbaSOystein Eftevaag #define INDEX_AUX 0x01800003 /* NV Storage */
37*758e9fbaSOystein Eftevaag #define INDEX_LCP_OWN 0x01400001 /* Launch Policy Owner */
38*758e9fbaSOystein Eftevaag #define INDEX_LCP_SUP 0x01800001 /* Launch Policy Default (Supplier) */
39*758e9fbaSOystein Eftevaag #define TPM20_INDEX_TEST1 0x01500015
40*758e9fbaSOystein Eftevaag #define TPM20_INDEX_TEST2 0x01500016
41*758e9fbaSOystein Eftevaag #define TPM20_INDEX_PASSWORD_TEST 0x01500020
42*758e9fbaSOystein Eftevaag
43*758e9fbaSOystein Eftevaag #define SESSIONS_COUNT 1
44*758e9fbaSOystein Eftevaag
45*758e9fbaSOystein Eftevaag
46*758e9fbaSOystein Eftevaag #define SET_PCR_SELECT_BIT( pcrSelection, pcr ) \
47*758e9fbaSOystein Eftevaag (pcrSelection).pcrSelect[( (pcr)/8 )] |= ( 1 << ( (pcr) % 8) );
48*758e9fbaSOystein Eftevaag
49*758e9fbaSOystein Eftevaag #define CLEAR_PCR_SELECT_BITS( pcrSelection ) \
50*758e9fbaSOystein Eftevaag (pcrSelection).pcrSelect[0] = 0; \
51*758e9fbaSOystein Eftevaag (pcrSelection).pcrSelect[1] = 0; \
52*758e9fbaSOystein Eftevaag (pcrSelection).pcrSelect[2] = 0;
53*758e9fbaSOystein Eftevaag
54*758e9fbaSOystein Eftevaag #define SET_PCR_SELECT_SIZE( pcrSelection, size ) \
55*758e9fbaSOystein Eftevaag (pcrSelection).sizeofSelect = size;
56*758e9fbaSOystein Eftevaag
57*758e9fbaSOystein Eftevaag
58*758e9fbaSOystein Eftevaag TSS2_SYS_CONTEXT *sysContext;
59*758e9fbaSOystein Eftevaag
60*758e9fbaSOystein Eftevaag TSS2_TCTI_CONTEXT *resMgrTctiContext = 0;
61*758e9fbaSOystein Eftevaag
62*758e9fbaSOystein Eftevaag #define INIT_SIMPLE_TPM2B_SIZE(type) (type).size = sizeof(type) - 2;
63*758e9fbaSOystein Eftevaag #define YES 1
64*758e9fbaSOystein Eftevaag #define NO 0
65*758e9fbaSOystein Eftevaag
ErrorHandler(UINT32 rval,char * errorString,int errorStringSize)66*758e9fbaSOystein Eftevaag static void ErrorHandler(UINT32 rval, char *errorString, int errorStringSize)
67*758e9fbaSOystein Eftevaag {
68*758e9fbaSOystein Eftevaag UINT32 errorLevel = rval & TSS2_RC_LAYER_MASK;
69*758e9fbaSOystein Eftevaag char levelString[32];
70*758e9fbaSOystein Eftevaag
71*758e9fbaSOystein Eftevaag switch (errorLevel)
72*758e9fbaSOystein Eftevaag {
73*758e9fbaSOystein Eftevaag case TSS2_TPM_RC_LAYER:
74*758e9fbaSOystein Eftevaag strcpy(levelString, "TPM");
75*758e9fbaSOystein Eftevaag break;
76*758e9fbaSOystein Eftevaag case TSS2_SYS_RC_LAYER:
77*758e9fbaSOystein Eftevaag strcpy(levelString, "System API");
78*758e9fbaSOystein Eftevaag break;
79*758e9fbaSOystein Eftevaag case TSS2_MU_RC_LAYER:
80*758e9fbaSOystein Eftevaag strcpy(levelString, "System API TPM encoded");
81*758e9fbaSOystein Eftevaag break;
82*758e9fbaSOystein Eftevaag case TSS2_TCTI_RC_LAYER:
83*758e9fbaSOystein Eftevaag strcpy(levelString, "TCTI");
84*758e9fbaSOystein Eftevaag break;
85*758e9fbaSOystein Eftevaag case TSS2_RESMGR_TPM_RC_LAYER:
86*758e9fbaSOystein Eftevaag strcpy(levelString, "Resource Mgr TPM encoded");
87*758e9fbaSOystein Eftevaag break;
88*758e9fbaSOystein Eftevaag case TSS2_RESMGR_RC_LAYER:
89*758e9fbaSOystein Eftevaag strcpy(levelString, "Resource Mgr");
90*758e9fbaSOystein Eftevaag break;
91*758e9fbaSOystein Eftevaag default:
92*758e9fbaSOystein Eftevaag strcpy(levelString, "Unknown Level");
93*758e9fbaSOystein Eftevaag break;
94*758e9fbaSOystein Eftevaag }
95*758e9fbaSOystein Eftevaag
96*758e9fbaSOystein Eftevaag snprintf(errorString, errorStringSize, "%s Error: 0x%x\n", levelString, rval);
97*758e9fbaSOystein Eftevaag }
98*758e9fbaSOystein Eftevaag
Cleanup()99*758e9fbaSOystein Eftevaag static void Cleanup()
100*758e9fbaSOystein Eftevaag {
101*758e9fbaSOystein Eftevaag if (resMgrTctiContext != NULL) {
102*758e9fbaSOystein Eftevaag tcti_platform_command(resMgrTctiContext, MS_SIM_POWER_OFF);
103*758e9fbaSOystein Eftevaag tcti_teardown(resMgrTctiContext);
104*758e9fbaSOystein Eftevaag resMgrTctiContext = NULL;
105*758e9fbaSOystein Eftevaag }
106*758e9fbaSOystein Eftevaag
107*758e9fbaSOystein Eftevaag exit(1);
108*758e9fbaSOystein Eftevaag }
109*758e9fbaSOystein Eftevaag
InitSysContextFailure()110*758e9fbaSOystein Eftevaag static void InitSysContextFailure()
111*758e9fbaSOystein Eftevaag {
112*758e9fbaSOystein Eftevaag LOG_ERROR("InitSysContext failed, exiting...");
113*758e9fbaSOystein Eftevaag Cleanup();
114*758e9fbaSOystein Eftevaag }
115*758e9fbaSOystein Eftevaag
116*758e9fbaSOystein Eftevaag #define ERROR_STR_LEN 200
117*758e9fbaSOystein Eftevaag #define CheckPassed(rval) { \
118*758e9fbaSOystein Eftevaag char error_string[ERROR_STR_LEN]; \
119*758e9fbaSOystein Eftevaag if ((rval) != TPM2_RC_SUCCESS) { \
120*758e9fbaSOystein Eftevaag ErrorHandler((rval), error_string, ERROR_STR_LEN); \
121*758e9fbaSOystein Eftevaag LOG_INFO("passing case: \tFAILED! %s (%s@%u)", \
122*758e9fbaSOystein Eftevaag error_string, __FUNCTION__, __LINE__ ); \
123*758e9fbaSOystein Eftevaag Cleanup(); \
124*758e9fbaSOystein Eftevaag } else { \
125*758e9fbaSOystein Eftevaag LOG_INFO("passing case: \tPASSED! (%s@%u)", \
126*758e9fbaSOystein Eftevaag __FUNCTION__, __LINE__); \
127*758e9fbaSOystein Eftevaag } \
128*758e9fbaSOystein Eftevaag }
129*758e9fbaSOystein Eftevaag
130*758e9fbaSOystein Eftevaag #define CheckFailed(rval, expected_rval) { \
131*758e9fbaSOystein Eftevaag char error_string[ERROR_STR_LEN]; \
132*758e9fbaSOystein Eftevaag if ((rval) != (expected_rval)) { \
133*758e9fbaSOystein Eftevaag ErrorHandler((rval), error_string, ERROR_STR_LEN); \
134*758e9fbaSOystein Eftevaag LOG_INFO("\tfailing case: FAILED! %s Ret code s/b: 0x%x, but was: 0x%x (%s@%u)", \
135*758e9fbaSOystein Eftevaag error_string, (expected_rval), (rval), __FUNCTION__, __LINE__ ); \
136*758e9fbaSOystein Eftevaag Cleanup(); \
137*758e9fbaSOystein Eftevaag } else { \
138*758e9fbaSOystein Eftevaag LOG_INFO("\tfailing case: PASSED! (%s@%u)", \
139*758e9fbaSOystein Eftevaag __FUNCTION__, __LINE__); \
140*758e9fbaSOystein Eftevaag } \
141*758e9fbaSOystein Eftevaag }
142*758e9fbaSOystein Eftevaag
TpmReset()143*758e9fbaSOystein Eftevaag static TSS2_RC TpmReset()
144*758e9fbaSOystein Eftevaag {
145*758e9fbaSOystein Eftevaag TSS2_RC rval = TSS2_RC_SUCCESS;
146*758e9fbaSOystein Eftevaag
147*758e9fbaSOystein Eftevaag rval = (TSS2_RC)tcti_platform_command( resMgrTctiContext, MS_SIM_POWER_OFF );
148*758e9fbaSOystein Eftevaag if( rval == TSS2_RC_SUCCESS )
149*758e9fbaSOystein Eftevaag {
150*758e9fbaSOystein Eftevaag rval = (TSS2_RC)tcti_platform_command( resMgrTctiContext, MS_SIM_POWER_ON );
151*758e9fbaSOystein Eftevaag }
152*758e9fbaSOystein Eftevaag return rval;
153*758e9fbaSOystein Eftevaag }
154*758e9fbaSOystein Eftevaag
TestDictionaryAttackLockReset()155*758e9fbaSOystein Eftevaag static void TestDictionaryAttackLockReset()
156*758e9fbaSOystein Eftevaag {
157*758e9fbaSOystein Eftevaag UINT32 rval;
158*758e9fbaSOystein Eftevaag TSS2L_SYS_AUTH_RESPONSE sessionsDataOut;
159*758e9fbaSOystein Eftevaag
160*758e9fbaSOystein Eftevaag TSS2L_SYS_AUTH_COMMAND sessionsData = { .count = 1, .auths = {{
161*758e9fbaSOystein Eftevaag .sessionHandle = TPM2_RS_PW,
162*758e9fbaSOystein Eftevaag .sessionAttributes = 0,
163*758e9fbaSOystein Eftevaag .nonce={.size=0},
164*758e9fbaSOystein Eftevaag .hmac={.size=0}}}};
165*758e9fbaSOystein Eftevaag
166*758e9fbaSOystein Eftevaag LOG_INFO("DICTIONARY ATTACK LOCK RESET TEST :" );
167*758e9fbaSOystein Eftevaag
168*758e9fbaSOystein Eftevaag rval = Tss2_Sys_DictionaryAttackLockReset ( sysContext, TPM2_RH_LOCKOUT, &sessionsData, &sessionsDataOut );
169*758e9fbaSOystein Eftevaag CheckPassed( rval );
170*758e9fbaSOystein Eftevaag }
171*758e9fbaSOystein Eftevaag
TestTpmStartup()172*758e9fbaSOystein Eftevaag static void TestTpmStartup()
173*758e9fbaSOystein Eftevaag {
174*758e9fbaSOystein Eftevaag UINT32 rval;
175*758e9fbaSOystein Eftevaag
176*758e9fbaSOystein Eftevaag LOG_INFO("STARTUP TESTS:" );
177*758e9fbaSOystein Eftevaag
178*758e9fbaSOystein Eftevaag /*
179*758e9fbaSOystein Eftevaag * First test the one-call interface.
180*758e9fbaSOystein Eftevaag */
181*758e9fbaSOystein Eftevaag
182*758e9fbaSOystein Eftevaag /* First must do TPM reset. */
183*758e9fbaSOystein Eftevaag rval = TpmReset();
184*758e9fbaSOystein Eftevaag CheckPassed(rval);
185*758e9fbaSOystein Eftevaag
186*758e9fbaSOystein Eftevaag /* This one should pass. */
187*758e9fbaSOystein Eftevaag rval = Tss2_Sys_Startup( sysContext, TPM2_SU_CLEAR );
188*758e9fbaSOystein Eftevaag CheckPassed(rval);
189*758e9fbaSOystein Eftevaag
190*758e9fbaSOystein Eftevaag /* This one should fail. */
191*758e9fbaSOystein Eftevaag rval = Tss2_Sys_Startup( sysContext, TPM2_SU_CLEAR );
192*758e9fbaSOystein Eftevaag CheckFailed( rval, TPM2_RC_INITIALIZE );
193*758e9fbaSOystein Eftevaag
194*758e9fbaSOystein Eftevaag
195*758e9fbaSOystein Eftevaag /* Cycle power using simulator interface. */
196*758e9fbaSOystein Eftevaag rval = tcti_platform_command( resMgrTctiContext, MS_SIM_POWER_OFF );
197*758e9fbaSOystein Eftevaag CheckPassed( rval );
198*758e9fbaSOystein Eftevaag rval = tcti_platform_command( resMgrTctiContext, MS_SIM_POWER_ON );
199*758e9fbaSOystein Eftevaag CheckPassed( rval );
200*758e9fbaSOystein Eftevaag
201*758e9fbaSOystein Eftevaag
202*758e9fbaSOystein Eftevaag /*
203*758e9fbaSOystein Eftevaag * Now test the synchronous, non-one-call interface.
204*758e9fbaSOystein Eftevaag */
205*758e9fbaSOystein Eftevaag rval = Tss2_Sys_Startup_Prepare( sysContext, TPM2_SU_CLEAR );
206*758e9fbaSOystein Eftevaag CheckPassed(rval);
207*758e9fbaSOystein Eftevaag
208*758e9fbaSOystein Eftevaag /* Execute the command synchronously. */
209*758e9fbaSOystein Eftevaag rval = Tss2_Sys_Execute( sysContext );
210*758e9fbaSOystein Eftevaag CheckPassed( rval );
211*758e9fbaSOystein Eftevaag
212*758e9fbaSOystein Eftevaag /* Cycle power using simulator interface. */
213*758e9fbaSOystein Eftevaag rval = tcti_platform_command( resMgrTctiContext, MS_SIM_POWER_OFF );
214*758e9fbaSOystein Eftevaag CheckPassed( rval );
215*758e9fbaSOystein Eftevaag rval = tcti_platform_command( resMgrTctiContext, MS_SIM_POWER_ON );
216*758e9fbaSOystein Eftevaag CheckPassed( rval );
217*758e9fbaSOystein Eftevaag
218*758e9fbaSOystein Eftevaag
219*758e9fbaSOystein Eftevaag /*
220*758e9fbaSOystein Eftevaag * Now test the asynchronous, non-one-call interface.
221*758e9fbaSOystein Eftevaag */
222*758e9fbaSOystein Eftevaag rval = Tss2_Sys_Startup_Prepare( sysContext, TPM2_SU_CLEAR );
223*758e9fbaSOystein Eftevaag CheckPassed(rval);
224*758e9fbaSOystein Eftevaag
225*758e9fbaSOystein Eftevaag /* Execute the command asynchronously. */
226*758e9fbaSOystein Eftevaag rval = Tss2_Sys_ExecuteAsync( sysContext );
227*758e9fbaSOystein Eftevaag CheckPassed(rval);
228*758e9fbaSOystein Eftevaag
229*758e9fbaSOystein Eftevaag /*
230*758e9fbaSOystein Eftevaag * Get the command response. Wait a maximum of 20ms
231*758e9fbaSOystein Eftevaag * for response.
232*758e9fbaSOystein Eftevaag */
233*758e9fbaSOystein Eftevaag rval = Tss2_Sys_ExecuteFinish( sysContext, TSS2_TCTI_TIMEOUT_BLOCK );
234*758e9fbaSOystein Eftevaag CheckPassed(rval);
235*758e9fbaSOystein Eftevaag }
236*758e9fbaSOystein Eftevaag
TestTpmGetCapability()237*758e9fbaSOystein Eftevaag static void TestTpmGetCapability()
238*758e9fbaSOystein Eftevaag {
239*758e9fbaSOystein Eftevaag UINT32 rval;
240*758e9fbaSOystein Eftevaag
241*758e9fbaSOystein Eftevaag char manuID[5] = " ";
242*758e9fbaSOystein Eftevaag char *manuIDPtr = &manuID[0];
243*758e9fbaSOystein Eftevaag TPMI_YES_NO moreData;
244*758e9fbaSOystein Eftevaag TPMS_CAPABILITY_DATA capabilityData;
245*758e9fbaSOystein Eftevaag
246*758e9fbaSOystein Eftevaag LOG_INFO("GET_CAPABILITY TESTS:" );
247*758e9fbaSOystein Eftevaag
248*758e9fbaSOystein Eftevaag rval = Tss2_Sys_GetCapability( sysContext, 0, TPM2_CAP_TPM_PROPERTIES, TPM2_PT_MANUFACTURER, 1, &moreData, &capabilityData, 0 );
249*758e9fbaSOystein Eftevaag CheckPassed( rval );
250*758e9fbaSOystein Eftevaag
251*758e9fbaSOystein Eftevaag *((UINT32 *)manuIDPtr) = BE_TO_HOST_32(capabilityData.data.tpmProperties.tpmProperty[0].value);
252*758e9fbaSOystein Eftevaag LOG_INFO("\t\tcount: %d, property: %x, manuId: %s",
253*758e9fbaSOystein Eftevaag capabilityData.data.tpmProperties.count,
254*758e9fbaSOystein Eftevaag capabilityData.data.tpmProperties.tpmProperty[0].property,
255*758e9fbaSOystein Eftevaag manuID );
256*758e9fbaSOystein Eftevaag
257*758e9fbaSOystein Eftevaag rval = Tss2_Sys_GetCapability( sysContext, 0, TPM2_CAP_TPM_PROPERTIES, TPM2_PT_MAX_COMMAND_SIZE, 1, &moreData, &capabilityData, 0 );
258*758e9fbaSOystein Eftevaag CheckPassed( rval );
259*758e9fbaSOystein Eftevaag LOG_INFO("\t\tcount: %d, property: %x, max cmd size: %d",
260*758e9fbaSOystein Eftevaag capabilityData.data.tpmProperties.count,
261*758e9fbaSOystein Eftevaag capabilityData.data.tpmProperties.tpmProperty[0].property,
262*758e9fbaSOystein Eftevaag capabilityData.data.tpmProperties.tpmProperty[0].value );
263*758e9fbaSOystein Eftevaag
264*758e9fbaSOystein Eftevaag
265*758e9fbaSOystein Eftevaag rval = Tss2_Sys_GetCapability( sysContext, 0, TPM2_CAP_TPM_PROPERTIES, TPM2_PT_MAX_COMMAND_SIZE, 40, &moreData, &capabilityData, 0 );
266*758e9fbaSOystein Eftevaag CheckPassed( rval );
267*758e9fbaSOystein Eftevaag LOG_INFO("\t\tcount: %d, property: %x, max cmd size: %d",
268*758e9fbaSOystein Eftevaag capabilityData.data.tpmProperties.count,
269*758e9fbaSOystein Eftevaag capabilityData.data.tpmProperties.tpmProperty[0].property,
270*758e9fbaSOystein Eftevaag capabilityData.data.tpmProperties.tpmProperty[0].value );
271*758e9fbaSOystein Eftevaag
272*758e9fbaSOystein Eftevaag
273*758e9fbaSOystein Eftevaag rval = Tss2_Sys_GetCapability( sysContext, 0, TPM2_CAP_TPM_PROPERTIES, TPM2_PT_MAX_RESPONSE_SIZE, 1, &moreData, &capabilityData, 0 );
274*758e9fbaSOystein Eftevaag CheckPassed( rval );
275*758e9fbaSOystein Eftevaag LOG_INFO("\t count: %d, property: %x, max response size: %d",
276*758e9fbaSOystein Eftevaag capabilityData.data.tpmProperties.count,
277*758e9fbaSOystein Eftevaag capabilityData.data.tpmProperties.tpmProperty[0].property,
278*758e9fbaSOystein Eftevaag capabilityData.data.tpmProperties.tpmProperty[0].value );
279*758e9fbaSOystein Eftevaag
280*758e9fbaSOystein Eftevaag rval = Tss2_Sys_GetCapability( sysContext, 0, 0xff, TPM2_PT_MANUFACTURER, 1, &moreData, &capabilityData, 0 );
281*758e9fbaSOystein Eftevaag CheckFailed(rval, TPM2_RC_VALUE+TPM2_RC_1+TPM2_RC_P);
282*758e9fbaSOystein Eftevaag }
283*758e9fbaSOystein Eftevaag
TestTpmClear()284*758e9fbaSOystein Eftevaag static void TestTpmClear()
285*758e9fbaSOystein Eftevaag {
286*758e9fbaSOystein Eftevaag UINT32 rval;
287*758e9fbaSOystein Eftevaag TPM2B_AUTH hmac = { .size = 0 };
288*758e9fbaSOystein Eftevaag TPM2B_NONCE nonce = { .size = 0 };
289*758e9fbaSOystein Eftevaag TSS2L_SYS_AUTH_RESPONSE sessionsDataOut;
290*758e9fbaSOystein Eftevaag
291*758e9fbaSOystein Eftevaag TSS2L_SYS_AUTH_COMMAND sessionsDataIn = { .count = 1, .auths = {{
292*758e9fbaSOystein Eftevaag .sessionHandle = TPM2_RS_PW,
293*758e9fbaSOystein Eftevaag .sessionAttributes = 0,
294*758e9fbaSOystein Eftevaag .nonce=nonce,
295*758e9fbaSOystein Eftevaag .hmac=hmac}}};
296*758e9fbaSOystein Eftevaag
297*758e9fbaSOystein Eftevaag LOG_INFO("CLEAR and CLEAR CONTROL TESTS:" );
298*758e9fbaSOystein Eftevaag
299*758e9fbaSOystein Eftevaag rval = Tss2_Sys_Clear ( sysContext, TPM2_RH_PLATFORM, &sessionsDataIn, 0 );
300*758e9fbaSOystein Eftevaag CheckPassed( rval );
301*758e9fbaSOystein Eftevaag
302*758e9fbaSOystein Eftevaag rval = Tss2_Sys_ClearControl ( sysContext, TPM2_RH_PLATFORM, &sessionsDataIn, YES, &sessionsDataOut );
303*758e9fbaSOystein Eftevaag CheckPassed( rval );
304*758e9fbaSOystein Eftevaag
305*758e9fbaSOystein Eftevaag rval = Tss2_Sys_Clear ( sysContext, TPM2_RH_PLATFORM, &sessionsDataIn, 0 );
306*758e9fbaSOystein Eftevaag CheckFailed( rval, TPM2_RC_DISABLED );
307*758e9fbaSOystein Eftevaag
308*758e9fbaSOystein Eftevaag rval = Tss2_Sys_ClearControl ( sysContext, TPM2_RH_PLATFORM, &sessionsDataIn, NO, &sessionsDataOut );
309*758e9fbaSOystein Eftevaag CheckPassed( rval );
310*758e9fbaSOystein Eftevaag
311*758e9fbaSOystein Eftevaag sessionsDataIn.auths[0].sessionAttributes = 0xff;
312*758e9fbaSOystein Eftevaag rval = Tss2_Sys_Clear ( sysContext, TPM2_RH_PLATFORM, &sessionsDataIn, &sessionsDataOut );
313*758e9fbaSOystein Eftevaag CheckFailed( rval, TPM2_RC_9 + TPM2_RC_RESERVED_BITS );
314*758e9fbaSOystein Eftevaag
315*758e9fbaSOystein Eftevaag rval = Tss2_Sys_ClearControl ( sysContext, TPM2_RH_PLATFORM, &sessionsDataIn, NO, &sessionsDataOut );
316*758e9fbaSOystein Eftevaag CheckFailed( rval, TPM2_RC_9 + TPM2_RC_RESERVED_BITS );
317*758e9fbaSOystein Eftevaag }
318*758e9fbaSOystein Eftevaag
319*758e9fbaSOystein Eftevaag #define SESSIONS_ABOVE_MAX_ACTIVE 0
320*758e9fbaSOystein Eftevaag #define DEBUG_MAX_ACTIVE_SESSIONS 8
321*758e9fbaSOystein Eftevaag #define DEBUG_GAP_MAX 2*DEBUG_MAX_ACTIVE_SESSIONS
322*758e9fbaSOystein Eftevaag
323*758e9fbaSOystein Eftevaag SESSION *sessions[SESSIONS_COUNT];
324*758e9fbaSOystein Eftevaag
TestStartAuthSession()325*758e9fbaSOystein Eftevaag static void TestStartAuthSession()
326*758e9fbaSOystein Eftevaag {
327*758e9fbaSOystein Eftevaag UINT32 rval;
328*758e9fbaSOystein Eftevaag TPM2B_ENCRYPTED_SECRET encryptedSalt;
329*758e9fbaSOystein Eftevaag TPMT_SYM_DEF symmetric;
330*758e9fbaSOystein Eftevaag SESSION *authSession = NULL;
331*758e9fbaSOystein Eftevaag TPM2B_NONCE nonceCaller;
332*758e9fbaSOystein Eftevaag UINT16 i;
333*758e9fbaSOystein Eftevaag TPM2_HANDLE badSessionHandle = 0x03010000;
334*758e9fbaSOystein Eftevaag
335*758e9fbaSOystein Eftevaag TPMS_AUTH_COMMAND sessionData;
336*758e9fbaSOystein Eftevaag TPM2B_NONCE nonce;
337*758e9fbaSOystein Eftevaag
338*758e9fbaSOystein Eftevaag
339*758e9fbaSOystein Eftevaag TPM2B_AUTH hmac;
340*758e9fbaSOystein Eftevaag
341*758e9fbaSOystein Eftevaag
342*758e9fbaSOystein Eftevaag /* Init sessionHandle */
343*758e9fbaSOystein Eftevaag sessionData.sessionHandle = badSessionHandle;
344*758e9fbaSOystein Eftevaag
345*758e9fbaSOystein Eftevaag /* Init nonce. */
346*758e9fbaSOystein Eftevaag nonce.size = 0;
347*758e9fbaSOystein Eftevaag sessionData.nonce = nonce;
348*758e9fbaSOystein Eftevaag
349*758e9fbaSOystein Eftevaag /* init hmac */
350*758e9fbaSOystein Eftevaag hmac.size = 0;
351*758e9fbaSOystein Eftevaag sessionData.hmac = hmac;
352*758e9fbaSOystein Eftevaag
353*758e9fbaSOystein Eftevaag /* Init session attributes */
354*758e9fbaSOystein Eftevaag *( (UINT8 *)((void *)&sessionData.sessionAttributes ) ) = 0;
355*758e9fbaSOystein Eftevaag
356*758e9fbaSOystein Eftevaag encryptedSalt.size = 0;
357*758e9fbaSOystein Eftevaag
358*758e9fbaSOystein Eftevaag LOG_INFO("START_AUTH_SESSION TESTS:" );
359*758e9fbaSOystein Eftevaag
360*758e9fbaSOystein Eftevaag symmetric.algorithm = TPM2_ALG_NULL;
361*758e9fbaSOystein Eftevaag symmetric.keyBits.sym = 0;
362*758e9fbaSOystein Eftevaag symmetric.mode.sym = 0;
363*758e9fbaSOystein Eftevaag
364*758e9fbaSOystein Eftevaag nonceCaller.size = 0;
365*758e9fbaSOystein Eftevaag
366*758e9fbaSOystein Eftevaag encryptedSalt.size = 0;
367*758e9fbaSOystein Eftevaag
368*758e9fbaSOystein Eftevaag /* Init session */
369*758e9fbaSOystein Eftevaag rval = create_auth_session(&authSession, TPM2_RH_NULL, 0, TPM2_RH_PLATFORM, 0, &nonceCaller, &encryptedSalt, TPM2_SE_POLICY, &symmetric, TPM2_ALG_SHA256, resMgrTctiContext );
370*758e9fbaSOystein Eftevaag CheckPassed( rval );
371*758e9fbaSOystein Eftevaag
372*758e9fbaSOystein Eftevaag rval = Tss2_Sys_FlushContext( sysContext, authSession->sessionHandle );
373*758e9fbaSOystein Eftevaag CheckPassed( rval );
374*758e9fbaSOystein Eftevaag end_auth_session( authSession );
375*758e9fbaSOystein Eftevaag
376*758e9fbaSOystein Eftevaag /* Init session */
377*758e9fbaSOystein Eftevaag rval = create_auth_session(&authSession, TPM2_RH_NULL, 0, TPM2_RH_PLATFORM, 0, &nonceCaller, &encryptedSalt, 0xff, &symmetric, TPM2_ALG_SHA256, resMgrTctiContext );
378*758e9fbaSOystein Eftevaag CheckFailed( rval, TPM2_RC_VALUE + TPM2_RC_P + TPM2_RC_3 );
379*758e9fbaSOystein Eftevaag
380*758e9fbaSOystein Eftevaag /*
381*758e9fbaSOystein Eftevaag * Try starting a bunch to see if resource manager handles this correctly.
382*758e9fbaSOystein Eftevaag */
383*758e9fbaSOystein Eftevaag for( i = 0; i < ( sizeof(sessions) / sizeof (SESSION *) ); i++ )
384*758e9fbaSOystein Eftevaag {
385*758e9fbaSOystein Eftevaag /* Init session struct */
386*758e9fbaSOystein Eftevaag rval = create_auth_session(&sessions[i], TPM2_RH_NULL, 0, TPM2_RH_PLATFORM, 0, &nonceCaller, &encryptedSalt, TPM2_SE_POLICY, &symmetric, TPM2_ALG_SHA256, resMgrTctiContext );
387*758e9fbaSOystein Eftevaag CheckPassed( rval );
388*758e9fbaSOystein Eftevaag LOG_INFO("Number of sessions created: %d", i+1 );
389*758e9fbaSOystein Eftevaag
390*758e9fbaSOystein Eftevaag }
391*758e9fbaSOystein Eftevaag /* clean up the sessions that I don't want here. */
392*758e9fbaSOystein Eftevaag for( i = 0; i < ( sizeof(sessions) / sizeof (SESSION *)); i++ )
393*758e9fbaSOystein Eftevaag {
394*758e9fbaSOystein Eftevaag rval = Tss2_Sys_FlushContext( sysContext, sessions[i]->sessionHandle );
395*758e9fbaSOystein Eftevaag CheckPassed( rval );
396*758e9fbaSOystein Eftevaag
397*758e9fbaSOystein Eftevaag end_auth_session(sessions[i]);
398*758e9fbaSOystein Eftevaag }
399*758e9fbaSOystein Eftevaag
400*758e9fbaSOystein Eftevaag /* Now do some gap tests. */
401*758e9fbaSOystein Eftevaag rval = create_auth_session(&sessions[0], TPM2_RH_NULL, 0, TPM2_RH_PLATFORM, 0, &nonceCaller, &encryptedSalt, TPM2_SE_POLICY, &symmetric, TPM2_ALG_SHA256, resMgrTctiContext );
402*758e9fbaSOystein Eftevaag CheckPassed( rval );
403*758e9fbaSOystein Eftevaag
404*758e9fbaSOystein Eftevaag for( i = 1; i < ( sizeof(sessions) / sizeof (SESSION *) ); i++ )
405*758e9fbaSOystein Eftevaag {
406*758e9fbaSOystein Eftevaag rval = create_auth_session(&sessions[i], TPM2_RH_NULL, 0, TPM2_RH_PLATFORM, 0, &nonceCaller, &encryptedSalt, TPM2_SE_POLICY, &symmetric, TPM2_ALG_SHA256, resMgrTctiContext );
407*758e9fbaSOystein Eftevaag CheckPassed( rval );
408*758e9fbaSOystein Eftevaag
409*758e9fbaSOystein Eftevaag rval = Tss2_Sys_FlushContext( sysContext, sessions[i]->sessionHandle );
410*758e9fbaSOystein Eftevaag CheckPassed( rval );
411*758e9fbaSOystein Eftevaag
412*758e9fbaSOystein Eftevaag end_auth_session(sessions[i]);
413*758e9fbaSOystein Eftevaag }
414*758e9fbaSOystein Eftevaag end_auth_session(sessions[0]);
415*758e9fbaSOystein Eftevaag
416*758e9fbaSOystein Eftevaag for( i = 0; i < ( sizeof(sessions) / sizeof (SESSION *) ); i++ )
417*758e9fbaSOystein Eftevaag {
418*758e9fbaSOystein Eftevaag rval = create_auth_session(&sessions[i], TPM2_RH_NULL, 0, TPM2_RH_PLATFORM, 0, &nonceCaller, &encryptedSalt, TPM2_SE_POLICY, &symmetric, TPM2_ALG_SHA256, resMgrTctiContext );
419*758e9fbaSOystein Eftevaag CheckPassed( rval );
420*758e9fbaSOystein Eftevaag
421*758e9fbaSOystein Eftevaag rval = Tss2_Sys_FlushContext( sysContext, sessions[i]->sessionHandle );
422*758e9fbaSOystein Eftevaag CheckPassed( rval );
423*758e9fbaSOystein Eftevaag
424*758e9fbaSOystein Eftevaag end_auth_session(sessions[i]);
425*758e9fbaSOystein Eftevaag }
426*758e9fbaSOystein Eftevaag }
427*758e9fbaSOystein Eftevaag
TestChangeEps()428*758e9fbaSOystein Eftevaag static void TestChangeEps()
429*758e9fbaSOystein Eftevaag {
430*758e9fbaSOystein Eftevaag UINT32 rval;
431*758e9fbaSOystein Eftevaag TSS2L_SYS_AUTH_RESPONSE sessionsDataOut;
432*758e9fbaSOystein Eftevaag TSS2L_SYS_AUTH_COMMAND sessionsData = { .count = 1, .auths = {{
433*758e9fbaSOystein Eftevaag .sessionHandle = TPM2_RS_PW,
434*758e9fbaSOystein Eftevaag .sessionAttributes = 0,
435*758e9fbaSOystein Eftevaag .nonce = {.size = 0},
436*758e9fbaSOystein Eftevaag .hmac = {.size = 0}}}};
437*758e9fbaSOystein Eftevaag
438*758e9fbaSOystein Eftevaag LOG_INFO("CHANGE_EPS TESTS:" );
439*758e9fbaSOystein Eftevaag
440*758e9fbaSOystein Eftevaag rval = Tss2_Sys_ChangeEPS( sysContext, TPM2_RH_PLATFORM, &sessionsData, &sessionsDataOut );
441*758e9fbaSOystein Eftevaag CheckPassed( rval );
442*758e9fbaSOystein Eftevaag }
443*758e9fbaSOystein Eftevaag
TestChangePps()444*758e9fbaSOystein Eftevaag static void TestChangePps()
445*758e9fbaSOystein Eftevaag {
446*758e9fbaSOystein Eftevaag UINT32 rval;
447*758e9fbaSOystein Eftevaag
448*758e9fbaSOystein Eftevaag TSS2L_SYS_AUTH_RESPONSE sessionsDataOut;
449*758e9fbaSOystein Eftevaag
450*758e9fbaSOystein Eftevaag TSS2L_SYS_AUTH_COMMAND sessionsData = { .count = 1, .auths = {{
451*758e9fbaSOystein Eftevaag .sessionHandle = TPM2_RS_PW,
452*758e9fbaSOystein Eftevaag .sessionAttributes = 0,
453*758e9fbaSOystein Eftevaag .nonce = {.size = 0},
454*758e9fbaSOystein Eftevaag .hmac = {.size = 0}}}};
455*758e9fbaSOystein Eftevaag
456*758e9fbaSOystein Eftevaag LOG_INFO("CHANGE_PPS TESTS:" );
457*758e9fbaSOystein Eftevaag
458*758e9fbaSOystein Eftevaag rval = Tss2_Sys_ChangePPS( sysContext, TPM2_RH_PLATFORM, &sessionsData, &sessionsDataOut );
459*758e9fbaSOystein Eftevaag CheckPassed( rval );
460*758e9fbaSOystein Eftevaag }
461*758e9fbaSOystein Eftevaag
TestHierarchyChangeAuth()462*758e9fbaSOystein Eftevaag static void TestHierarchyChangeAuth()
463*758e9fbaSOystein Eftevaag {
464*758e9fbaSOystein Eftevaag UINT32 rval;
465*758e9fbaSOystein Eftevaag TPM2B_AUTH newAuth;
466*758e9fbaSOystein Eftevaag int i;
467*758e9fbaSOystein Eftevaag
468*758e9fbaSOystein Eftevaag TSS2L_SYS_AUTH_COMMAND sessionsData = { .count = 1, .auths = {{
469*758e9fbaSOystein Eftevaag .sessionHandle = TPM2_RS_PW,
470*758e9fbaSOystein Eftevaag .sessionAttributes = 0,
471*758e9fbaSOystein Eftevaag .nonce = {.size = 0},
472*758e9fbaSOystein Eftevaag .hmac = {.size = 0}}}};
473*758e9fbaSOystein Eftevaag
474*758e9fbaSOystein Eftevaag LOG_INFO("HIERARCHY_CHANGE_AUTH TESTS:" );
475*758e9fbaSOystein Eftevaag
476*758e9fbaSOystein Eftevaag newAuth.size = 0;
477*758e9fbaSOystein Eftevaag rval = Tss2_Sys_HierarchyChangeAuth( sysContext, TPM2_RH_PLATFORM, &sessionsData, &newAuth, 0 );
478*758e9fbaSOystein Eftevaag CheckPassed( rval );
479*758e9fbaSOystein Eftevaag
480*758e9fbaSOystein Eftevaag /* Init new auth */
481*758e9fbaSOystein Eftevaag newAuth.size = 20;
482*758e9fbaSOystein Eftevaag for( i = 0; i < newAuth.size; i++ )
483*758e9fbaSOystein Eftevaag newAuth.buffer[i] = i;
484*758e9fbaSOystein Eftevaag
485*758e9fbaSOystein Eftevaag rval = Tss2_Sys_HierarchyChangeAuth( sysContext, TPM2_RH_PLATFORM, &sessionsData, &newAuth, 0 );
486*758e9fbaSOystein Eftevaag CheckPassed( rval );
487*758e9fbaSOystein Eftevaag
488*758e9fbaSOystein Eftevaag sessionsData.auths[0].hmac = newAuth;
489*758e9fbaSOystein Eftevaag rval = Tss2_Sys_HierarchyChangeAuth( sysContext, TPM2_RH_PLATFORM, &sessionsData, &newAuth, 0 );
490*758e9fbaSOystein Eftevaag CheckPassed( rval );
491*758e9fbaSOystein Eftevaag
492*758e9fbaSOystein Eftevaag /* Init new auth */
493*758e9fbaSOystein Eftevaag newAuth.size = 0;
494*758e9fbaSOystein Eftevaag
495*758e9fbaSOystein Eftevaag rval = Tss2_Sys_HierarchyChangeAuth( sysContext, TPM2_RH_PLATFORM, &sessionsData, &newAuth, 0 );
496*758e9fbaSOystein Eftevaag CheckPassed( rval );
497*758e9fbaSOystein Eftevaag
498*758e9fbaSOystein Eftevaag rval = Tss2_Sys_HierarchyChangeAuth( sysContext, TPM2_RH_PLATFORM, &sessionsData, &newAuth, 0 );
499*758e9fbaSOystein Eftevaag CheckFailed( rval, TPM2_RC_1 + TPM2_RC_S + TPM2_RC_BAD_AUTH );
500*758e9fbaSOystein Eftevaag
501*758e9fbaSOystein Eftevaag rval = Tss2_Sys_HierarchyChangeAuth( sysContext, 0, &sessionsData, &newAuth, 0 );
502*758e9fbaSOystein Eftevaag CheckFailed( rval, TPM2_RC_1 + TPM2_RC_VALUE );
503*758e9fbaSOystein Eftevaag }
504*758e9fbaSOystein Eftevaag
505*758e9fbaSOystein Eftevaag #define PCR_0 0
506*758e9fbaSOystein Eftevaag #define PCR_1 1
507*758e9fbaSOystein Eftevaag #define PCR_2 2
508*758e9fbaSOystein Eftevaag #define PCR_3 3
509*758e9fbaSOystein Eftevaag #define PCR_4 4
510*758e9fbaSOystein Eftevaag #define PCR_5 5
511*758e9fbaSOystein Eftevaag #define PCR_6 6
512*758e9fbaSOystein Eftevaag #define PCR_7 7
513*758e9fbaSOystein Eftevaag #define PCR_8 8
514*758e9fbaSOystein Eftevaag #define PCR_9 9
515*758e9fbaSOystein Eftevaag #define PCR_10 10
516*758e9fbaSOystein Eftevaag #define PCR_11 11
517*758e9fbaSOystein Eftevaag #define PCR_12 12
518*758e9fbaSOystein Eftevaag #define PCR_13 13
519*758e9fbaSOystein Eftevaag #define PCR_14 14
520*758e9fbaSOystein Eftevaag #define PCR_15 15
521*758e9fbaSOystein Eftevaag #define PCR_16 16
522*758e9fbaSOystein Eftevaag #define PCR_17 17
523*758e9fbaSOystein Eftevaag #define PCR_18 18
524*758e9fbaSOystein Eftevaag #define PCR_SIZE 20
525*758e9fbaSOystein Eftevaag
TestPcrExtend()526*758e9fbaSOystein Eftevaag static void TestPcrExtend()
527*758e9fbaSOystein Eftevaag {
528*758e9fbaSOystein Eftevaag UINT32 rval;
529*758e9fbaSOystein Eftevaag UINT16 i, digestSize;
530*758e9fbaSOystein Eftevaag TPML_PCR_SELECTION pcrSelection;
531*758e9fbaSOystein Eftevaag UINT32 pcrUpdateCounterBeforeExtend;
532*758e9fbaSOystein Eftevaag UINT32 pcrUpdateCounterAfterExtend;
533*758e9fbaSOystein Eftevaag UINT8 pcrBeforeExtend[PCR_SIZE];
534*758e9fbaSOystein Eftevaag TPM2B_EVENT eventData;
535*758e9fbaSOystein Eftevaag TPML_DIGEST pcrValues;
536*758e9fbaSOystein Eftevaag TPML_DIGEST_VALUES digests;
537*758e9fbaSOystein Eftevaag TPML_PCR_SELECTION pcrSelectionOut;
538*758e9fbaSOystein Eftevaag UINT8 pcrAfterExtend[20];
539*758e9fbaSOystein Eftevaag TSS2_TCTI_CONTEXT *tctiContext;
540*758e9fbaSOystein Eftevaag
541*758e9fbaSOystein Eftevaag TSS2L_SYS_AUTH_COMMAND sessionsData = { .count = 1, .auths = {{
542*758e9fbaSOystein Eftevaag .sessionHandle = TPM2_RS_PW,
543*758e9fbaSOystein Eftevaag .sessionAttributes = 0,
544*758e9fbaSOystein Eftevaag .nonce = {.size = 0},
545*758e9fbaSOystein Eftevaag .hmac = {.size = 0}}}};
546*758e9fbaSOystein Eftevaag
547*758e9fbaSOystein Eftevaag LOG_INFO("PCR_EXTEND, PCR_EVENT, PCR_ALLOCATE, and PCR_READ TESTS:" );
548*758e9fbaSOystein Eftevaag
549*758e9fbaSOystein Eftevaag /* Init digests */
550*758e9fbaSOystein Eftevaag digests.count = 1;
551*758e9fbaSOystein Eftevaag digests.digests[0].hashAlg = TPM2_ALG_SHA1;
552*758e9fbaSOystein Eftevaag digestSize = GetDigestSize( digests.digests[0].hashAlg );
553*758e9fbaSOystein Eftevaag
554*758e9fbaSOystein Eftevaag for( i = 0; i < digestSize; i++ )
555*758e9fbaSOystein Eftevaag {
556*758e9fbaSOystein Eftevaag digests.digests[0].digest.sha1[i] = (UINT8)(i % 256);
557*758e9fbaSOystein Eftevaag }
558*758e9fbaSOystein Eftevaag
559*758e9fbaSOystein Eftevaag pcrSelection.count = 1;
560*758e9fbaSOystein Eftevaag pcrSelection.pcrSelections[0].hash = TPM2_ALG_SHA1;
561*758e9fbaSOystein Eftevaag pcrSelection.pcrSelections[0].sizeofSelect = 3;
562*758e9fbaSOystein Eftevaag
563*758e9fbaSOystein Eftevaag /* Clear out PCR select bit field */
564*758e9fbaSOystein Eftevaag pcrSelection.pcrSelections[0].pcrSelect[0] = 0;
565*758e9fbaSOystein Eftevaag pcrSelection.pcrSelections[0].pcrSelect[1] = 0;
566*758e9fbaSOystein Eftevaag pcrSelection.pcrSelections[0].pcrSelect[2] = 0;
567*758e9fbaSOystein Eftevaag
568*758e9fbaSOystein Eftevaag /* Now set the PCR you want to read */
569*758e9fbaSOystein Eftevaag SET_PCR_SELECT_BIT( pcrSelection.pcrSelections[0], PCR_17 );
570*758e9fbaSOystein Eftevaag
571*758e9fbaSOystein Eftevaag rval = Tss2_Sys_PCR_Read( sysContext, 0, &pcrSelection, &pcrUpdateCounterBeforeExtend, &pcrSelectionOut, &pcrValues, 0 );
572*758e9fbaSOystein Eftevaag CheckPassed( rval );
573*758e9fbaSOystein Eftevaag
574*758e9fbaSOystein Eftevaag if( pcrValues.digests[0].size <= PCR_SIZE &&
575*758e9fbaSOystein Eftevaag pcrValues.digests[0].size <= sizeof( pcrValues.digests[0].buffer ) )
576*758e9fbaSOystein Eftevaag memcpy( &( pcrBeforeExtend[0] ), &( pcrValues.digests[0].buffer[0] ), pcrValues.digests[0].size );
577*758e9fbaSOystein Eftevaag
578*758e9fbaSOystein Eftevaag /* Set locality 3 to enable PCR extend with PCR 17 */
579*758e9fbaSOystein Eftevaag rval = Tss2_Sys_GetTctiContext(sysContext, &tctiContext);
580*758e9fbaSOystein Eftevaag CheckPassed(rval);
581*758e9fbaSOystein Eftevaag
582*758e9fbaSOystein Eftevaag rval = Tss2_Tcti_SetLocality(tctiContext, 3);
583*758e9fbaSOystein Eftevaag CheckPassed(rval);
584*758e9fbaSOystein Eftevaag
585*758e9fbaSOystein Eftevaag rval = Tss2_Sys_PCR_Extend( sysContext, PCR_17, &sessionsData, &digests, 0 );
586*758e9fbaSOystein Eftevaag CheckPassed( rval );
587*758e9fbaSOystein Eftevaag
588*758e9fbaSOystein Eftevaag rval = Tss2_Sys_PCR_Read( sysContext, 0, &pcrSelection, &pcrUpdateCounterAfterExtend, &pcrSelectionOut, &pcrValues, 0 );
589*758e9fbaSOystein Eftevaag CheckPassed( rval );
590*758e9fbaSOystein Eftevaag
591*758e9fbaSOystein Eftevaag memcpy( &( pcrAfterExtend[0] ), &( pcrValues.digests[0].buffer[0] ), pcrValues.digests[0].size );
592*758e9fbaSOystein Eftevaag
593*758e9fbaSOystein Eftevaag if( pcrUpdateCounterBeforeExtend == pcrUpdateCounterAfterExtend )
594*758e9fbaSOystein Eftevaag {
595*758e9fbaSOystein Eftevaag LOG_ERROR("ERROR!! pcrUpdateCounter didn't change value" );
596*758e9fbaSOystein Eftevaag Cleanup();
597*758e9fbaSOystein Eftevaag }
598*758e9fbaSOystein Eftevaag
599*758e9fbaSOystein Eftevaag if( 0 == memcmp( &( pcrBeforeExtend[0] ), &( pcrAfterExtend[0] ), 20 ) )
600*758e9fbaSOystein Eftevaag {
601*758e9fbaSOystein Eftevaag LOG_ERROR("ERROR!! PCR didn't change value" );
602*758e9fbaSOystein Eftevaag Cleanup();
603*758e9fbaSOystein Eftevaag }
604*758e9fbaSOystein Eftevaag
605*758e9fbaSOystein Eftevaag pcrSelection.pcrSelections[0].sizeofSelect = 255;
606*758e9fbaSOystein Eftevaag
607*758e9fbaSOystein Eftevaag rval = Tss2_Sys_PCR_Read( sysContext, 0, &pcrSelection, &pcrUpdateCounterAfterExtend, 0, 0, 0 );
608*758e9fbaSOystein Eftevaag CheckFailed( rval, TSS2_SYS_RC_BAD_VALUE );
609*758e9fbaSOystein Eftevaag
610*758e9fbaSOystein Eftevaag eventData.size = 4;
611*758e9fbaSOystein Eftevaag eventData.buffer[0] = 0;
612*758e9fbaSOystein Eftevaag eventData.buffer[1] = 0xff;
613*758e9fbaSOystein Eftevaag eventData.buffer[2] = 0x55;
614*758e9fbaSOystein Eftevaag eventData.buffer[3] = 0xaa;
615*758e9fbaSOystein Eftevaag
616*758e9fbaSOystein Eftevaag rval = Tss2_Sys_PCR_Event( sysContext, PCR_18, &sessionsData, &eventData, &digests, 0 );
617*758e9fbaSOystein Eftevaag CheckPassed( rval );
618*758e9fbaSOystein Eftevaag
619*758e9fbaSOystein Eftevaag /* Reset locality and check whether extend PCR 17 is no possible */
620*758e9fbaSOystein Eftevaag rval = Tss2_Tcti_SetLocality(tctiContext, 0);
621*758e9fbaSOystein Eftevaag CheckPassed( rval );
622*758e9fbaSOystein Eftevaag
623*758e9fbaSOystein Eftevaag rval = Tss2_Sys_PCR_Extend( sysContext, PCR_17, &sessionsData, &digests, 0 );
624*758e9fbaSOystein Eftevaag CheckFailed( rval, TPM2_RC_LOCALITY );
625*758e9fbaSOystein Eftevaag }
626*758e9fbaSOystein Eftevaag
TestShutdown()627*758e9fbaSOystein Eftevaag static void TestShutdown()
628*758e9fbaSOystein Eftevaag {
629*758e9fbaSOystein Eftevaag UINT32 rval;
630*758e9fbaSOystein Eftevaag TSS2L_SYS_AUTH_RESPONSE sessionsDataOut;
631*758e9fbaSOystein Eftevaag
632*758e9fbaSOystein Eftevaag LOG_INFO("SHUTDOWN TESTS:" );
633*758e9fbaSOystein Eftevaag
634*758e9fbaSOystein Eftevaag rval = Tss2_Sys_Shutdown( sysContext, 0, TPM2_SU_STATE, &sessionsDataOut );
635*758e9fbaSOystein Eftevaag CheckPassed( rval );
636*758e9fbaSOystein Eftevaag
637*758e9fbaSOystein Eftevaag rval = Tss2_Sys_Shutdown( sysContext, 0, TPM2_SU_CLEAR, &sessionsDataOut );
638*758e9fbaSOystein Eftevaag CheckPassed( rval );
639*758e9fbaSOystein Eftevaag
640*758e9fbaSOystein Eftevaag rval = Tss2_Sys_Shutdown( sysContext, 0, 0xff, 0 );
641*758e9fbaSOystein Eftevaag CheckFailed( rval, TPM2_RC_VALUE+TPM2_RC_1+TPM2_RC_P );
642*758e9fbaSOystein Eftevaag }
643*758e9fbaSOystein Eftevaag
TestNV()644*758e9fbaSOystein Eftevaag static void TestNV()
645*758e9fbaSOystein Eftevaag {
646*758e9fbaSOystein Eftevaag UINT32 rval;
647*758e9fbaSOystein Eftevaag TPM2B_NV_PUBLIC publicInfo;
648*758e9fbaSOystein Eftevaag TPM2B_AUTH nvAuth;
649*758e9fbaSOystein Eftevaag TSS2L_SYS_AUTH_RESPONSE sessionsDataOut;
650*758e9fbaSOystein Eftevaag int i;
651*758e9fbaSOystein Eftevaag TPM2B_MAX_NV_BUFFER nvWriteData;
652*758e9fbaSOystein Eftevaag TPM2B_MAX_NV_BUFFER nvData;
653*758e9fbaSOystein Eftevaag
654*758e9fbaSOystein Eftevaag TPM2B_NV_PUBLIC nvPublic;
655*758e9fbaSOystein Eftevaag TPM2B_NAME nvName;
656*758e9fbaSOystein Eftevaag
657*758e9fbaSOystein Eftevaag TSS2L_SYS_AUTH_COMMAND sessionsData = { .count = 1, .auths = {{
658*758e9fbaSOystein Eftevaag .sessionHandle = TPM2_RS_PW,
659*758e9fbaSOystein Eftevaag .sessionAttributes = 0,
660*758e9fbaSOystein Eftevaag .nonce = {.size = 0},
661*758e9fbaSOystein Eftevaag .hmac = {.size = 0}}}};
662*758e9fbaSOystein Eftevaag
663*758e9fbaSOystein Eftevaag LOG_INFO("NV INDEX TESTS:" );
664*758e9fbaSOystein Eftevaag
665*758e9fbaSOystein Eftevaag nvAuth.size = 20;
666*758e9fbaSOystein Eftevaag for( i = 0; i < nvAuth.size; i++ ) {
667*758e9fbaSOystein Eftevaag nvAuth.buffer[i] = (UINT8)i;
668*758e9fbaSOystein Eftevaag }
669*758e9fbaSOystein Eftevaag
670*758e9fbaSOystein Eftevaag publicInfo.size = 0;
671*758e9fbaSOystein Eftevaag publicInfo.nvPublic.nvIndex = TPM20_INDEX_TEST1;
672*758e9fbaSOystein Eftevaag publicInfo.nvPublic.nameAlg = TPM2_ALG_SHA1;
673*758e9fbaSOystein Eftevaag
674*758e9fbaSOystein Eftevaag /* First zero out attributes. */
675*758e9fbaSOystein Eftevaag *(UINT32 *)&( publicInfo.nvPublic.attributes ) = 0;
676*758e9fbaSOystein Eftevaag
677*758e9fbaSOystein Eftevaag /* Now set the attributes. */
678*758e9fbaSOystein Eftevaag publicInfo.nvPublic.attributes |= TPMA_NV_PPREAD;
679*758e9fbaSOystein Eftevaag publicInfo.nvPublic.attributes |= TPMA_NV_PPWRITE;
680*758e9fbaSOystein Eftevaag publicInfo.nvPublic.attributes |= TPMA_NV_WRITE_STCLEAR;
681*758e9fbaSOystein Eftevaag publicInfo.nvPublic.attributes |= TPMA_NV_PLATFORMCREATE;
682*758e9fbaSOystein Eftevaag publicInfo.nvPublic.attributes |= TPMA_NV_ORDERLY;
683*758e9fbaSOystein Eftevaag publicInfo.nvPublic.authPolicy.size = 0;
684*758e9fbaSOystein Eftevaag publicInfo.nvPublic.dataSize = 32;
685*758e9fbaSOystein Eftevaag
686*758e9fbaSOystein Eftevaag INIT_SIMPLE_TPM2B_SIZE( nvData );
687*758e9fbaSOystein Eftevaag rval = Tss2_Sys_NV_Read( sysContext, TPM2_RH_PLATFORM, TPM20_INDEX_TEST1, &sessionsData, 32, 0, &nvData, &sessionsDataOut );
688*758e9fbaSOystein Eftevaag CheckFailed( rval, TPM2_RC_2 + TPM2_RC_HANDLE );
689*758e9fbaSOystein Eftevaag
690*758e9fbaSOystein Eftevaag rval = Tss2_Sys_NV_DefineSpace( sysContext, TPM2_RH_PLATFORM, &sessionsData, &nvAuth, &publicInfo, &sessionsDataOut );
691*758e9fbaSOystein Eftevaag CheckPassed( rval );
692*758e9fbaSOystein Eftevaag
693*758e9fbaSOystein Eftevaag nvPublic.size = 0;
694*758e9fbaSOystein Eftevaag INIT_SIMPLE_TPM2B_SIZE( nvName );
695*758e9fbaSOystein Eftevaag rval = Tss2_Sys_NV_ReadPublic( sysContext, TPM20_INDEX_TEST1, 0, &nvPublic, &nvName, 0 );
696*758e9fbaSOystein Eftevaag CheckPassed( rval );
697*758e9fbaSOystein Eftevaag
698*758e9fbaSOystein Eftevaag INIT_SIMPLE_TPM2B_SIZE( nvData );
699*758e9fbaSOystein Eftevaag rval = Tss2_Sys_NV_Read( sysContext, TPM2_RH_PLATFORM, TPM20_INDEX_TEST1, &sessionsData, 32, 0, &nvData, &sessionsDataOut );
700*758e9fbaSOystein Eftevaag CheckFailed( rval, TPM2_RC_NV_UNINITIALIZED );
701*758e9fbaSOystein Eftevaag
702*758e9fbaSOystein Eftevaag /* Should fail since index is already defined. */
703*758e9fbaSOystein Eftevaag rval = Tss2_Sys_NV_DefineSpace( sysContext, TPM2_RH_PLATFORM, &sessionsData, &nvAuth, &publicInfo, &sessionsDataOut );
704*758e9fbaSOystein Eftevaag CheckFailed( rval, TPM2_RC_NV_DEFINED );
705*758e9fbaSOystein Eftevaag
706*758e9fbaSOystein Eftevaag nvWriteData.size = 4;
707*758e9fbaSOystein Eftevaag for( i = 0; i < nvWriteData.size; i++ )
708*758e9fbaSOystein Eftevaag nvWriteData.buffer[i] = 0xff - i;
709*758e9fbaSOystein Eftevaag
710*758e9fbaSOystein Eftevaag #if 1
711*758e9fbaSOystein Eftevaag /*
712*758e9fbaSOystein Eftevaag * The following, at one point, was commented out so that NVDefine will
713*758e9fbaSOystein Eftevaag * work on successive invocations of client app.
714*758e9fbaSOystein Eftevaag *
715*758e9fbaSOystein Eftevaag * Noticed on 12/13/12, this doesn't seem to be necessary anymore.
716*758e9fbaSOystein Eftevaag * Maybe something else fixed it.
717*758e9fbaSOystein Eftevaag *
718*758e9fbaSOystein Eftevaag * Seems to be a bug in TPM 2.0 simulator that if:
719*758e9fbaSOystein Eftevaag * First pass of tpmclient.exe after restarting TPM 2.0 simulator will
720*758e9fbaSOystein Eftevaag * work fine.
721*758e9fbaSOystein Eftevaag * If NVWrite is done, subsequent invocations of tpmclient.exe will
722*758e9fbaSOystein Eftevaag * ALWAYS fail on the first call to Tpm2NVDefineSpace with 0x2cb error.
723*758e9fbaSOystein Eftevaag * Removing NVWrite fixes this.
724*758e9fbaSOystein Eftevaag * And restarting TPM 2.0 simulator will make it work the first time
725*758e9fbaSOystein Eftevaag * and fail subsequent times.
726*758e9fbaSOystein Eftevaag * Removing NVWrite works around this problem.
727*758e9fbaSOystein Eftevaag */
728*758e9fbaSOystein Eftevaag rval = Tss2_Sys_NV_Write( sysContext, TPM2_RH_PLATFORM, TPM20_INDEX_TEST1, &sessionsData, &nvWriteData, 0, &sessionsDataOut );
729*758e9fbaSOystein Eftevaag CheckPassed( rval );
730*758e9fbaSOystein Eftevaag
731*758e9fbaSOystein Eftevaag INIT_SIMPLE_TPM2B_SIZE( nvData );
732*758e9fbaSOystein Eftevaag rval = Tss2_Sys_NV_Read( sysContext, TPM2_RH_PLATFORM, TPM20_INDEX_TEST1, &sessionsData, 32, 0, &nvData, &sessionsDataOut );
733*758e9fbaSOystein Eftevaag CheckPassed( rval );
734*758e9fbaSOystein Eftevaag
735*758e9fbaSOystein Eftevaag rval = Tss2_Sys_NV_WriteLock( sysContext, TPM2_RH_PLATFORM, TPM20_INDEX_TEST1, &sessionsData, &sessionsDataOut );
736*758e9fbaSOystein Eftevaag CheckPassed( rval );
737*758e9fbaSOystein Eftevaag
738*758e9fbaSOystein Eftevaag rval = Tss2_Sys_NV_Write( sysContext, TPM2_RH_PLATFORM, TPM20_INDEX_TEST1, &sessionsData, &nvWriteData, 0, &sessionsDataOut );
739*758e9fbaSOystein Eftevaag CheckFailed( rval, TPM2_RC_NV_LOCKED );
740*758e9fbaSOystein Eftevaag #endif
741*758e9fbaSOystein Eftevaag
742*758e9fbaSOystein Eftevaag /* Now undefine the index. */
743*758e9fbaSOystein Eftevaag rval = Tss2_Sys_NV_UndefineSpace( sysContext, TPM2_RH_PLATFORM, TPM20_INDEX_TEST1, &sessionsData, 0 );
744*758e9fbaSOystein Eftevaag CheckPassed( rval );
745*758e9fbaSOystein Eftevaag
746*758e9fbaSOystein Eftevaag rval = Tss2_Sys_NV_DefineSpace( sysContext, TPM2_RH_PLATFORM, &sessionsData, &nvAuth, &publicInfo, 0 );
747*758e9fbaSOystein Eftevaag CheckPassed( rval );
748*758e9fbaSOystein Eftevaag
749*758e9fbaSOystein Eftevaag /* Now undefine the index so that next run will work correctly. */
750*758e9fbaSOystein Eftevaag rval = Tss2_Sys_NV_UndefineSpace( sysContext, TPM2_RH_PLATFORM, TPM20_INDEX_TEST1, &sessionsData, 0 );
751*758e9fbaSOystein Eftevaag CheckPassed( rval );
752*758e9fbaSOystein Eftevaag
753*758e9fbaSOystein Eftevaag publicInfo.nvPublic.attributes &= ~TPMA_NV_PPREAD;
754*758e9fbaSOystein Eftevaag publicInfo.nvPublic.attributes &= ~TPMA_NV_PPWRITE;
755*758e9fbaSOystein Eftevaag publicInfo.nvPublic.attributes |= TPMA_NV_OWNERREAD;
756*758e9fbaSOystein Eftevaag publicInfo.nvPublic.attributes |= TPMA_NV_OWNERWRITE;
757*758e9fbaSOystein Eftevaag publicInfo.nvPublic.attributes &= ~TPMA_NV_PLATFORMCREATE;
758*758e9fbaSOystein Eftevaag publicInfo.nvPublic.attributes |= TPMA_NV_ORDERLY;
759*758e9fbaSOystein Eftevaag publicInfo.nvPublic.nvIndex = TPM20_INDEX_TEST2;
760*758e9fbaSOystein Eftevaag rval = Tss2_Sys_NV_DefineSpace( sysContext, TPM2_RH_OWNER, &sessionsData, &nvAuth, &publicInfo, 0 );
761*758e9fbaSOystein Eftevaag CheckPassed( rval );
762*758e9fbaSOystein Eftevaag
763*758e9fbaSOystein Eftevaag nvPublic.size = 0;
764*758e9fbaSOystein Eftevaag INIT_SIMPLE_TPM2B_SIZE( nvName );
765*758e9fbaSOystein Eftevaag rval = Tss2_Sys_NV_ReadPublic( sysContext, TPM20_INDEX_TEST2, 0, &nvPublic, &nvName, 0 );
766*758e9fbaSOystein Eftevaag CheckPassed( rval );
767*758e9fbaSOystein Eftevaag
768*758e9fbaSOystein Eftevaag INIT_SIMPLE_TPM2B_SIZE( nvData );
769*758e9fbaSOystein Eftevaag rval = Tss2_Sys_NV_Read( sysContext, TPM2_RH_PLATFORM, TPM20_INDEX_TEST2, &sessionsData, 32, 0, &nvData, 0 );
770*758e9fbaSOystein Eftevaag CheckFailed( rval, TPM2_RC_NV_AUTHORIZATION );
771*758e9fbaSOystein Eftevaag
772*758e9fbaSOystein Eftevaag /* Now undefine the index. */
773*758e9fbaSOystein Eftevaag rval = Tss2_Sys_NV_UndefineSpace( sysContext, TPM2_RH_OWNER, TPM20_INDEX_TEST2, &sessionsData, 0 );
774*758e9fbaSOystein Eftevaag CheckPassed( rval );
775*758e9fbaSOystein Eftevaag
776*758e9fbaSOystein Eftevaag rval = Tss2_Sys_NV_DefineSpace( sysContext, TPM2_RH_OWNER, &sessionsData, &nvAuth, &publicInfo, 0 );
777*758e9fbaSOystein Eftevaag CheckPassed( rval );
778*758e9fbaSOystein Eftevaag
779*758e9fbaSOystein Eftevaag /* Now undefine the index so that next run will work correctly. */
780*758e9fbaSOystein Eftevaag rval = Tss2_Sys_NV_UndefineSpace( sysContext, TPM2_RH_OWNER, TPM20_INDEX_TEST2, &sessionsData, 0 );
781*758e9fbaSOystein Eftevaag CheckPassed( rval );
782*758e9fbaSOystein Eftevaag }
783*758e9fbaSOystein Eftevaag
TestHierarchyControl()784*758e9fbaSOystein Eftevaag static void TestHierarchyControl()
785*758e9fbaSOystein Eftevaag {
786*758e9fbaSOystein Eftevaag UINT32 rval;
787*758e9fbaSOystein Eftevaag TPM2B_NV_PUBLIC publicInfo;
788*758e9fbaSOystein Eftevaag TPM2B_AUTH nvAuth;
789*758e9fbaSOystein Eftevaag TSS2L_SYS_AUTH_RESPONSE sessionsDataOut;
790*758e9fbaSOystein Eftevaag int i;
791*758e9fbaSOystein Eftevaag TPM2B_NAME nvName;
792*758e9fbaSOystein Eftevaag TPM2B_NV_PUBLIC nvPublic;
793*758e9fbaSOystein Eftevaag TPM2B_MAX_NV_BUFFER nvData;
794*758e9fbaSOystein Eftevaag
795*758e9fbaSOystein Eftevaag TSS2L_SYS_AUTH_COMMAND sessionsData = { .count = 1, .auths = {{
796*758e9fbaSOystein Eftevaag .sessionHandle = TPM2_RS_PW,
797*758e9fbaSOystein Eftevaag .sessionAttributes = 0,
798*758e9fbaSOystein Eftevaag .nonce = {.size = 0},
799*758e9fbaSOystein Eftevaag .hmac = {.size = 0}}}};
800*758e9fbaSOystein Eftevaag
801*758e9fbaSOystein Eftevaag LOG_INFO("HIERARCHY CONTROL TESTS:" );
802*758e9fbaSOystein Eftevaag
803*758e9fbaSOystein Eftevaag nvAuth.size = 20;
804*758e9fbaSOystein Eftevaag for( i = 0; i < nvAuth.size; i++ ) {
805*758e9fbaSOystein Eftevaag nvAuth.buffer[i] = i;
806*758e9fbaSOystein Eftevaag }
807*758e9fbaSOystein Eftevaag
808*758e9fbaSOystein Eftevaag publicInfo.size = 0;
809*758e9fbaSOystein Eftevaag publicInfo.nvPublic.nvIndex = TPM20_INDEX_TEST1;
810*758e9fbaSOystein Eftevaag publicInfo.nvPublic.nameAlg = TPM2_ALG_SHA1;
811*758e9fbaSOystein Eftevaag
812*758e9fbaSOystein Eftevaag /* First zero out attributes. */
813*758e9fbaSOystein Eftevaag *(UINT32 *)&( publicInfo.nvPublic.attributes ) = 0;
814*758e9fbaSOystein Eftevaag
815*758e9fbaSOystein Eftevaag /* Now set the attributes. */
816*758e9fbaSOystein Eftevaag publicInfo.nvPublic.attributes |= TPMA_NV_PPREAD;
817*758e9fbaSOystein Eftevaag publicInfo.nvPublic.attributes |= TPMA_NV_PPWRITE;
818*758e9fbaSOystein Eftevaag publicInfo.nvPublic.attributes |= TPMA_NV_PPWRITE;
819*758e9fbaSOystein Eftevaag publicInfo.nvPublic.attributes |= TPMA_NV_WRITE_STCLEAR;
820*758e9fbaSOystein Eftevaag publicInfo.nvPublic.attributes |= TPMA_NV_PLATFORMCREATE;
821*758e9fbaSOystein Eftevaag publicInfo.nvPublic.attributes |= TPMA_NV_ORDERLY;
822*758e9fbaSOystein Eftevaag publicInfo.nvPublic.authPolicy.size = 0;
823*758e9fbaSOystein Eftevaag publicInfo.nvPublic.dataSize = 32;
824*758e9fbaSOystein Eftevaag
825*758e9fbaSOystein Eftevaag rval = Tss2_Sys_NV_DefineSpace( sysContext, TPM2_RH_PLATFORM, &sessionsData, &nvAuth, &publicInfo, 0 );
826*758e9fbaSOystein Eftevaag CheckPassed( rval );
827*758e9fbaSOystein Eftevaag
828*758e9fbaSOystein Eftevaag /* Test SAPI for case where nvPublic.size != 0 */
829*758e9fbaSOystein Eftevaag nvPublic.size = 0xff;
830*758e9fbaSOystein Eftevaag INIT_SIMPLE_TPM2B_SIZE( nvName );
831*758e9fbaSOystein Eftevaag rval = Tss2_Sys_NV_ReadPublic( sysContext, TPM20_INDEX_TEST1, 0, &nvPublic, &nvName, 0 );
832*758e9fbaSOystein Eftevaag CheckFailed( rval, TSS2_SYS_RC_BAD_VALUE );
833*758e9fbaSOystein Eftevaag
834*758e9fbaSOystein Eftevaag nvPublic.size = 0;
835*758e9fbaSOystein Eftevaag INIT_SIMPLE_TPM2B_SIZE( nvName );
836*758e9fbaSOystein Eftevaag rval = Tss2_Sys_NV_ReadPublic( sysContext, TPM20_INDEX_TEST1, 0, &nvPublic, &nvName, 0 );
837*758e9fbaSOystein Eftevaag CheckPassed( rval );
838*758e9fbaSOystein Eftevaag
839*758e9fbaSOystein Eftevaag rval = Tss2_Sys_NV_Read( sysContext, TPM2_RH_PLATFORM, TPM20_INDEX_TEST1, &sessionsData, 32, 0, &nvData, &sessionsDataOut );
840*758e9fbaSOystein Eftevaag CheckFailed( rval, TPM2_RC_NV_UNINITIALIZED );
841*758e9fbaSOystein Eftevaag
842*758e9fbaSOystein Eftevaag rval = Tss2_Sys_HierarchyControl( sysContext, TPM2_RH_PLATFORM, &sessionsData, TPM2_RH_PLATFORM, NO, &sessionsDataOut );
843*758e9fbaSOystein Eftevaag CheckPassed( rval );
844*758e9fbaSOystein Eftevaag
845*758e9fbaSOystein Eftevaag rval = Tss2_Sys_NV_Read( sysContext, TPM2_RH_PLATFORM, TPM20_INDEX_TEST1, &sessionsData, 32, 0, &nvData, &sessionsDataOut );
846*758e9fbaSOystein Eftevaag CheckFailed( rval, TPM2_RC_1 + TPM2_RC_HIERARCHY );
847*758e9fbaSOystein Eftevaag
848*758e9fbaSOystein Eftevaag rval = Tss2_Sys_HierarchyControl( sysContext, TPM2_RH_PLATFORM, &sessionsData, TPM2_RH_PLATFORM, YES, &sessionsDataOut );
849*758e9fbaSOystein Eftevaag CheckFailed( rval, TPM2_RC_1 + TPM2_RC_HIERARCHY );
850*758e9fbaSOystein Eftevaag
851*758e9fbaSOystein Eftevaag /* Need to do TPM reset and Startup to re-enable platform hierarchy. */
852*758e9fbaSOystein Eftevaag rval = TpmReset();
853*758e9fbaSOystein Eftevaag CheckPassed(rval);
854*758e9fbaSOystein Eftevaag
855*758e9fbaSOystein Eftevaag rval = Tss2_Sys_Startup ( sysContext, TPM2_SU_CLEAR );
856*758e9fbaSOystein Eftevaag CheckPassed( rval );
857*758e9fbaSOystein Eftevaag
858*758e9fbaSOystein Eftevaag rval = Tss2_Sys_HierarchyControl( sysContext, TPM2_RH_PLATFORM, &sessionsData, TPM2_RH_PLATFORM, YES, &sessionsDataOut );
859*758e9fbaSOystein Eftevaag CheckPassed( rval );
860*758e9fbaSOystein Eftevaag
861*758e9fbaSOystein Eftevaag /* Now undefine the index so that next run will work correctly. */
862*758e9fbaSOystein Eftevaag rval = Tss2_Sys_NV_UndefineSpace( sysContext, TPM2_RH_PLATFORM, TPM20_INDEX_TEST1, &sessionsData, 0 );
863*758e9fbaSOystein Eftevaag CheckPassed( rval );
864*758e9fbaSOystein Eftevaag }
865*758e9fbaSOystein Eftevaag
866*758e9fbaSOystein Eftevaag typedef struct {
867*758e9fbaSOystein Eftevaag char name[50];
868*758e9fbaSOystein Eftevaag TSS2_RC (*buildPolicyFn )( TSS2_SYS_CONTEXT *sysContext, SESSION *trialPolicySession, TPM2B_DIGEST *policyDigest );
869*758e9fbaSOystein Eftevaag TSS2_RC (*createObjectFn )( TSS2_SYS_CONTEXT *sysContext, SESSION **policySession, TPM2B_DIGEST *policyDigest );
870*758e9fbaSOystein Eftevaag TSS2_RC (*testPolicyFn )( TSS2_SYS_CONTEXT *sysContext, SESSION *policySession );
871*758e9fbaSOystein Eftevaag } POLICY_TEST_SETUP;
872*758e9fbaSOystein Eftevaag
BuildPolicy(TSS2_SYS_CONTEXT * sysContext,SESSION ** policySession,TSS2_RC (* buildPolicyFn)(TSS2_SYS_CONTEXT * sysContext,SESSION * policySession,TPM2B_DIGEST * policyDigest),TPM2B_DIGEST * policyDigest,bool trialSession)873*758e9fbaSOystein Eftevaag static TSS2_RC BuildPolicy( TSS2_SYS_CONTEXT *sysContext, SESSION **policySession,
874*758e9fbaSOystein Eftevaag TSS2_RC (*buildPolicyFn )( TSS2_SYS_CONTEXT *sysContext, SESSION *policySession, TPM2B_DIGEST *policyDigest ),
875*758e9fbaSOystein Eftevaag TPM2B_DIGEST *policyDigest, bool trialSession )
876*758e9fbaSOystein Eftevaag {
877*758e9fbaSOystein Eftevaag /*
878*758e9fbaSOystein Eftevaag * NOTE: this policySession will be either a trial or normal policy session
879*758e9fbaSOystein Eftevaag * depending on the value of the passed in trialSession parameter.
880*758e9fbaSOystein Eftevaag */
881*758e9fbaSOystein Eftevaag TPM2B_ENCRYPTED_SECRET encryptedSalt = {0,};
882*758e9fbaSOystein Eftevaag TPMT_SYM_DEF symmetric;
883*758e9fbaSOystein Eftevaag TSS2_RC rval;
884*758e9fbaSOystein Eftevaag TPM2B_NONCE nonceCaller;
885*758e9fbaSOystein Eftevaag
886*758e9fbaSOystein Eftevaag nonceCaller.size = 0;
887*758e9fbaSOystein Eftevaag
888*758e9fbaSOystein Eftevaag /* Start policy session. */
889*758e9fbaSOystein Eftevaag symmetric.algorithm = TPM2_ALG_NULL;
890*758e9fbaSOystein Eftevaag rval = create_auth_session(policySession, TPM2_RH_NULL, 0, TPM2_RH_NULL, 0, &nonceCaller, &encryptedSalt, trialSession ? TPM2_SE_TRIAL : TPM2_SE_POLICY , &symmetric, TPM2_ALG_SHA256, resMgrTctiContext );
891*758e9fbaSOystein Eftevaag if( rval != TPM2_RC_SUCCESS )
892*758e9fbaSOystein Eftevaag return rval;
893*758e9fbaSOystein Eftevaag
894*758e9fbaSOystein Eftevaag /* Send policy command. */
895*758e9fbaSOystein Eftevaag rval = ( *buildPolicyFn )( sysContext, *policySession, policyDigest );
896*758e9fbaSOystein Eftevaag CheckPassed( rval );
897*758e9fbaSOystein Eftevaag
898*758e9fbaSOystein Eftevaag /* Get policy hash. */
899*758e9fbaSOystein Eftevaag INIT_SIMPLE_TPM2B_SIZE( *policyDigest );
900*758e9fbaSOystein Eftevaag rval = Tss2_Sys_PolicyGetDigest( sysContext, (*policySession)->sessionHandle,
901*758e9fbaSOystein Eftevaag 0, policyDigest, 0 );
902*758e9fbaSOystein Eftevaag CheckPassed( rval );
903*758e9fbaSOystein Eftevaag
904*758e9fbaSOystein Eftevaag if( trialSession )
905*758e9fbaSOystein Eftevaag {
906*758e9fbaSOystein Eftevaag /* Need to flush the session here. */
907*758e9fbaSOystein Eftevaag rval = Tss2_Sys_FlushContext( sysContext, (*policySession)->sessionHandle );
908*758e9fbaSOystein Eftevaag CheckPassed( rval );
909*758e9fbaSOystein Eftevaag
910*758e9fbaSOystein Eftevaag /* And remove the session from sessions table. */
911*758e9fbaSOystein Eftevaag end_auth_session( *policySession );
912*758e9fbaSOystein Eftevaag }
913*758e9fbaSOystein Eftevaag
914*758e9fbaSOystein Eftevaag return rval;
915*758e9fbaSOystein Eftevaag }
916*758e9fbaSOystein Eftevaag
CreateNVIndex(TSS2_SYS_CONTEXT * sysContext,SESSION ** policySession,TPM2B_DIGEST * policyDigest)917*758e9fbaSOystein Eftevaag static TSS2_RC CreateNVIndex( TSS2_SYS_CONTEXT *sysContext, SESSION **policySession, TPM2B_DIGEST *policyDigest )
918*758e9fbaSOystein Eftevaag {
919*758e9fbaSOystein Eftevaag TSS2_RC rval = TPM2_RC_SUCCESS;
920*758e9fbaSOystein Eftevaag TPMA_LOCALITY locality;
921*758e9fbaSOystein Eftevaag TPM2B_ENCRYPTED_SECRET encryptedSalt = {0};
922*758e9fbaSOystein Eftevaag TPMT_SYM_DEF symmetric;
923*758e9fbaSOystein Eftevaag TPMA_NV nvAttributes;
924*758e9fbaSOystein Eftevaag TPM2B_AUTH nvAuth;
925*758e9fbaSOystein Eftevaag TPM2B_NONCE nonceCaller;
926*758e9fbaSOystein Eftevaag
927*758e9fbaSOystein Eftevaag nonceCaller.size = 0;
928*758e9fbaSOystein Eftevaag
929*758e9fbaSOystein Eftevaag /*
930*758e9fbaSOystein Eftevaag * Since locality is a fairly simple command and we can guarantee
931*758e9fbaSOystein Eftevaag * its correctness, we don't need a trial session for this.
932*758e9fbaSOystein Eftevaag */
933*758e9fbaSOystein Eftevaag
934*758e9fbaSOystein Eftevaag /* Start real policy session */
935*758e9fbaSOystein Eftevaag symmetric.algorithm = TPM2_ALG_NULL;
936*758e9fbaSOystein Eftevaag rval = create_auth_session(policySession, TPM2_RH_NULL,
937*758e9fbaSOystein Eftevaag 0, TPM2_RH_NULL, 0, &nonceCaller, &encryptedSalt, TPM2_SE_POLICY,
938*758e9fbaSOystein Eftevaag &symmetric, TPM2_ALG_SHA256, resMgrTctiContext );
939*758e9fbaSOystein Eftevaag CheckPassed( rval );
940*758e9fbaSOystein Eftevaag
941*758e9fbaSOystein Eftevaag /* Send PolicyLocality command */
942*758e9fbaSOystein Eftevaag *(UINT8 *)( (void *)&locality ) = 0;
943*758e9fbaSOystein Eftevaag locality |= TPMA_LOCALITY_TPM2_LOC_THREE;
944*758e9fbaSOystein Eftevaag rval = Tss2_Sys_PolicyLocality( sysContext, (*policySession)->sessionHandle,
945*758e9fbaSOystein Eftevaag 0, locality, 0 );
946*758e9fbaSOystein Eftevaag CheckPassed( rval );
947*758e9fbaSOystein Eftevaag
948*758e9fbaSOystein Eftevaag /* Read policyHash */
949*758e9fbaSOystein Eftevaag INIT_SIMPLE_TPM2B_SIZE( *policyDigest );
950*758e9fbaSOystein Eftevaag rval = Tss2_Sys_PolicyGetDigest( sysContext,
951*758e9fbaSOystein Eftevaag (*policySession)->sessionHandle, 0, policyDigest, 0 );
952*758e9fbaSOystein Eftevaag CheckPassed( rval );
953*758e9fbaSOystein Eftevaag
954*758e9fbaSOystein Eftevaag nvAuth.size = 0;
955*758e9fbaSOystein Eftevaag
956*758e9fbaSOystein Eftevaag /* Now set the attributes. */
957*758e9fbaSOystein Eftevaag *(UINT32 *)( (void *)&nvAttributes ) = 0;
958*758e9fbaSOystein Eftevaag nvAttributes |= TPMA_NV_POLICYREAD;
959*758e9fbaSOystein Eftevaag nvAttributes |= TPMA_NV_POLICYWRITE;
960*758e9fbaSOystein Eftevaag nvAttributes |= TPMA_NV_PLATFORMCREATE;
961*758e9fbaSOystein Eftevaag
962*758e9fbaSOystein Eftevaag rval = DefineNvIndex( sysContext, TPM2_RH_PLATFORM, &nvAuth, policyDigest,
963*758e9fbaSOystein Eftevaag TPM20_INDEX_PASSWORD_TEST, TPM2_ALG_SHA256, nvAttributes, 32 );
964*758e9fbaSOystein Eftevaag CheckPassed( rval );
965*758e9fbaSOystein Eftevaag
966*758e9fbaSOystein Eftevaag rval = AddEntity(TPM20_INDEX_PASSWORD_TEST, &nvAuth);
967*758e9fbaSOystein Eftevaag CheckPassed(rval);
968*758e9fbaSOystein Eftevaag
969*758e9fbaSOystein Eftevaag return rval;
970*758e9fbaSOystein Eftevaag }
971*758e9fbaSOystein Eftevaag
972*758e9fbaSOystein Eftevaag
TestLocality(TSS2_SYS_CONTEXT * sysContext,SESSION * policySession)973*758e9fbaSOystein Eftevaag static TSS2_RC TestLocality( TSS2_SYS_CONTEXT *sysContext, SESSION *policySession )
974*758e9fbaSOystein Eftevaag {
975*758e9fbaSOystein Eftevaag TSS2_RC rval = TPM2_RC_SUCCESS;
976*758e9fbaSOystein Eftevaag TPM2B_MAX_NV_BUFFER nvWriteData;
977*758e9fbaSOystein Eftevaag TSS2L_SYS_AUTH_RESPONSE sessionsDataOut = { 1, };
978*758e9fbaSOystein Eftevaag TSS2_TCTI_CONTEXT *tctiContext;
979*758e9fbaSOystein Eftevaag TSS2L_SYS_AUTH_COMMAND sessionsData = { .count = 1, .auths = {{
980*758e9fbaSOystein Eftevaag .sessionHandle = policySession->sessionHandle,
981*758e9fbaSOystein Eftevaag .sessionAttributes = TPMA_SESSION_CONTINUESESSION,
982*758e9fbaSOystein Eftevaag .nonce = {.size = 0},
983*758e9fbaSOystein Eftevaag .hmac = {.size = 0}}}};
984*758e9fbaSOystein Eftevaag
985*758e9fbaSOystein Eftevaag
986*758e9fbaSOystein Eftevaag /* Init write data. */
987*758e9fbaSOystein Eftevaag nvWriteData.size = 0;
988*758e9fbaSOystein Eftevaag
989*758e9fbaSOystein Eftevaag rval = Tss2_Sys_GetTctiContext(sysContext, &tctiContext);
990*758e9fbaSOystein Eftevaag CheckPassed(rval);
991*758e9fbaSOystein Eftevaag
992*758e9fbaSOystein Eftevaag rval = Tss2_Tcti_SetLocality(tctiContext, 2);
993*758e9fbaSOystein Eftevaag CheckPassed(rval);
994*758e9fbaSOystein Eftevaag
995*758e9fbaSOystein Eftevaag /* Do NV write using open session's policy. */
996*758e9fbaSOystein Eftevaag rval = Tss2_Sys_NV_Write( sysContext, TPM20_INDEX_PASSWORD_TEST,
997*758e9fbaSOystein Eftevaag TPM20_INDEX_PASSWORD_TEST,
998*758e9fbaSOystein Eftevaag &sessionsData, &nvWriteData, 0, &sessionsDataOut );
999*758e9fbaSOystein Eftevaag CheckFailed( rval, TPM2_RC_LOCALITY );
1000*758e9fbaSOystein Eftevaag
1001*758e9fbaSOystein Eftevaag rval = Tss2_Tcti_SetLocality(tctiContext, 3);
1002*758e9fbaSOystein Eftevaag CheckPassed( rval );
1003*758e9fbaSOystein Eftevaag
1004*758e9fbaSOystein Eftevaag /* Do NV write using open session's policy. */
1005*758e9fbaSOystein Eftevaag rval = Tss2_Sys_NV_Write( sysContext, TPM20_INDEX_PASSWORD_TEST,
1006*758e9fbaSOystein Eftevaag TPM20_INDEX_PASSWORD_TEST,
1007*758e9fbaSOystein Eftevaag &sessionsData, &nvWriteData, 0, &sessionsDataOut );
1008*758e9fbaSOystein Eftevaag CheckPassed( rval );
1009*758e9fbaSOystein Eftevaag
1010*758e9fbaSOystein Eftevaag /* Do another NV write using open session's policy. */
1011*758e9fbaSOystein Eftevaag rval = Tss2_Sys_NV_Write( sysContext, TPM20_INDEX_PASSWORD_TEST,
1012*758e9fbaSOystein Eftevaag TPM20_INDEX_PASSWORD_TEST,
1013*758e9fbaSOystein Eftevaag &sessionsData, &nvWriteData, 0, &sessionsDataOut );
1014*758e9fbaSOystein Eftevaag CheckFailed( rval, TPM2_RC_POLICY_FAIL + TPM2_RC_S + TPM2_RC_1 );
1015*758e9fbaSOystein Eftevaag
1016*758e9fbaSOystein Eftevaag /* Delete NV index */
1017*758e9fbaSOystein Eftevaag sessionsData.auths[0].sessionHandle = TPM2_RS_PW;
1018*758e9fbaSOystein Eftevaag sessionsData.auths[0].nonce.size = 0;
1019*758e9fbaSOystein Eftevaag sessionsData.auths[0].nonce.buffer[0] = 0xa5;
1020*758e9fbaSOystein Eftevaag sessionsData.auths[0].hmac.size = 0;
1021*758e9fbaSOystein Eftevaag
1022*758e9fbaSOystein Eftevaag /* Now undefine the index. */
1023*758e9fbaSOystein Eftevaag rval = Tss2_Sys_NV_UndefineSpace( sysContext, TPM2_RH_PLATFORM,
1024*758e9fbaSOystein Eftevaag TPM20_INDEX_PASSWORD_TEST, &sessionsData, 0 );
1025*758e9fbaSOystein Eftevaag CheckPassed( rval );
1026*758e9fbaSOystein Eftevaag
1027*758e9fbaSOystein Eftevaag DeleteEntity(TPM20_INDEX_PASSWORD_TEST);
1028*758e9fbaSOystein Eftevaag
1029*758e9fbaSOystein Eftevaag /* Reset locality */
1030*758e9fbaSOystein Eftevaag rval = Tss2_Tcti_SetLocality(tctiContext, 0);
1031*758e9fbaSOystein Eftevaag CheckPassed( rval );
1032*758e9fbaSOystein Eftevaag
1033*758e9fbaSOystein Eftevaag return rval;
1034*758e9fbaSOystein Eftevaag }
1035*758e9fbaSOystein Eftevaag
1036*758e9fbaSOystein Eftevaag UINT8 passwordPCRTestPassword[] = "password PCR";
1037*758e9fbaSOystein Eftevaag UINT8 dataBlob[] = "some data";
1038*758e9fbaSOystein Eftevaag TPM2_HANDLE blobHandle;
1039*758e9fbaSOystein Eftevaag TPM2B_AUTH blobAuth;
1040*758e9fbaSOystein Eftevaag
BuildPasswordPolicy(TSS2_SYS_CONTEXT * sysContext,SESSION * policySession,TPM2B_DIGEST * policyDigest)1041*758e9fbaSOystein Eftevaag static TSS2_RC BuildPasswordPolicy( TSS2_SYS_CONTEXT *sysContext, SESSION *policySession, TPM2B_DIGEST *policyDigest )
1042*758e9fbaSOystein Eftevaag {
1043*758e9fbaSOystein Eftevaag TSS2_RC rval = TPM2_RC_SUCCESS;
1044*758e9fbaSOystein Eftevaag
1045*758e9fbaSOystein Eftevaag rval = Tss2_Sys_PolicyPassword( sysContext, policySession->sessionHandle, 0, 0 );
1046*758e9fbaSOystein Eftevaag CheckPassed( rval );
1047*758e9fbaSOystein Eftevaag
1048*758e9fbaSOystein Eftevaag return rval;
1049*758e9fbaSOystein Eftevaag }
1050*758e9fbaSOystein Eftevaag
CreateDataBlob(TSS2_SYS_CONTEXT * sysContext,SESSION ** policySession,TPM2B_DIGEST * policyDigest)1051*758e9fbaSOystein Eftevaag static TSS2_RC CreateDataBlob( TSS2_SYS_CONTEXT *sysContext, SESSION **policySession, TPM2B_DIGEST *policyDigest )
1052*758e9fbaSOystein Eftevaag {
1053*758e9fbaSOystein Eftevaag TSS2_RC rval = TPM2_RC_SUCCESS;
1054*758e9fbaSOystein Eftevaag TPM2B_SENSITIVE_CREATE inSensitive;
1055*758e9fbaSOystein Eftevaag TPM2B_PUBLIC inPublic;
1056*758e9fbaSOystein Eftevaag TPM2B_DATA outsideInfo = {0,};
1057*758e9fbaSOystein Eftevaag TPML_PCR_SELECTION creationPcr = { 0 };
1058*758e9fbaSOystein Eftevaag TPM2B_PUBLIC outPublic;
1059*758e9fbaSOystein Eftevaag TPM2B_CREATION_DATA creationData;
1060*758e9fbaSOystein Eftevaag TPM2_HANDLE srkHandle;
1061*758e9fbaSOystein Eftevaag TPM2B_DIGEST creationHash;
1062*758e9fbaSOystein Eftevaag TPMT_TK_CREATION creationTicket;
1063*758e9fbaSOystein Eftevaag TPM2B_NAME srkName, blobName;
1064*758e9fbaSOystein Eftevaag TPM2B_DIGEST data;
1065*758e9fbaSOystein Eftevaag TPM2B_PRIVATE outPrivate;
1066*758e9fbaSOystein Eftevaag
1067*758e9fbaSOystein Eftevaag TSS2L_SYS_AUTH_COMMAND cmdAuthArray = { .count = 1, .auths = {{
1068*758e9fbaSOystein Eftevaag .sessionHandle = TPM2_RS_PW,
1069*758e9fbaSOystein Eftevaag .sessionAttributes = 0,
1070*758e9fbaSOystein Eftevaag .nonce = {.size = 0},
1071*758e9fbaSOystein Eftevaag .hmac = {.size = 0}}}};
1072*758e9fbaSOystein Eftevaag
1073*758e9fbaSOystein Eftevaag inSensitive.size = 0;
1074*758e9fbaSOystein Eftevaag inSensitive.sensitive.userAuth.size = 0;
1075*758e9fbaSOystein Eftevaag inSensitive.sensitive.data.size = 0;
1076*758e9fbaSOystein Eftevaag
1077*758e9fbaSOystein Eftevaag inPublic.size = 0;
1078*758e9fbaSOystein Eftevaag inPublic.publicArea.type = TPM2_ALG_RSA;
1079*758e9fbaSOystein Eftevaag inPublic.publicArea.nameAlg = TPM2_ALG_SHA1;
1080*758e9fbaSOystein Eftevaag *(UINT32 *)&( inPublic.publicArea.objectAttributes) = 0;
1081*758e9fbaSOystein Eftevaag inPublic.publicArea.objectAttributes |= TPMA_OBJECT_RESTRICTED;
1082*758e9fbaSOystein Eftevaag inPublic.publicArea.objectAttributes |= TPMA_OBJECT_USERWITHAUTH;
1083*758e9fbaSOystein Eftevaag inPublic.publicArea.objectAttributes |= TPMA_OBJECT_DECRYPT;
1084*758e9fbaSOystein Eftevaag inPublic.publicArea.objectAttributes |= TPMA_OBJECT_FIXEDTPM;
1085*758e9fbaSOystein Eftevaag inPublic.publicArea.objectAttributes |= TPMA_OBJECT_FIXEDPARENT;
1086*758e9fbaSOystein Eftevaag inPublic.publicArea.objectAttributes |= TPMA_OBJECT_SENSITIVEDATAORIGIN;
1087*758e9fbaSOystein Eftevaag inPublic.publicArea.authPolicy.size = 0;
1088*758e9fbaSOystein Eftevaag inPublic.publicArea.parameters.rsaDetail.symmetric.algorithm = TPM2_ALG_AES;
1089*758e9fbaSOystein Eftevaag inPublic.publicArea.parameters.rsaDetail.symmetric.keyBits.aes = 128;
1090*758e9fbaSOystein Eftevaag inPublic.publicArea.parameters.rsaDetail.symmetric.mode.aes = TPM2_ALG_CBC;
1091*758e9fbaSOystein Eftevaag inPublic.publicArea.parameters.rsaDetail.scheme.scheme = TPM2_ALG_NULL;
1092*758e9fbaSOystein Eftevaag inPublic.publicArea.parameters.rsaDetail.keyBits = 2048;
1093*758e9fbaSOystein Eftevaag inPublic.publicArea.parameters.rsaDetail.exponent = 0;
1094*758e9fbaSOystein Eftevaag inPublic.publicArea.unique.rsa.size = 0;
1095*758e9fbaSOystein Eftevaag
1096*758e9fbaSOystein Eftevaag outPublic.size = 0;
1097*758e9fbaSOystein Eftevaag creationData.size = 0;
1098*758e9fbaSOystein Eftevaag INIT_SIMPLE_TPM2B_SIZE( creationHash );
1099*758e9fbaSOystein Eftevaag INIT_SIMPLE_TPM2B_SIZE( srkName );
1100*758e9fbaSOystein Eftevaag rval = Tss2_Sys_CreatePrimary( sysContext, TPM2_RH_PLATFORM, &cmdAuthArray,
1101*758e9fbaSOystein Eftevaag &inSensitive, &inPublic, &outsideInfo, &creationPcr,
1102*758e9fbaSOystein Eftevaag &srkHandle, &outPublic, &creationData, &creationHash,
1103*758e9fbaSOystein Eftevaag &creationTicket, &srkName, 0 );
1104*758e9fbaSOystein Eftevaag CheckPassed( rval );
1105*758e9fbaSOystein Eftevaag
1106*758e9fbaSOystein Eftevaag cmdAuthArray.auths[0].sessionHandle = TPM2_RS_PW;
1107*758e9fbaSOystein Eftevaag
1108*758e9fbaSOystein Eftevaag inSensitive.sensitive.userAuth.size = 0;
1109*758e9fbaSOystein Eftevaag blobAuth.size = sizeof( passwordPCRTestPassword );
1110*758e9fbaSOystein Eftevaag memcpy( &blobAuth.buffer, passwordPCRTestPassword, sizeof( passwordPCRTestPassword ) );
1111*758e9fbaSOystein Eftevaag CopySizedByteBuffer((TPM2B *)&inSensitive.sensitive.userAuth, (TPM2B *)&blobAuth);
1112*758e9fbaSOystein Eftevaag data.size = sizeof( dataBlob );
1113*758e9fbaSOystein Eftevaag memcpy( &data.buffer, dataBlob, sizeof( dataBlob ) );
1114*758e9fbaSOystein Eftevaag CopySizedByteBuffer((TPM2B *)&inSensitive.sensitive.data, (TPM2B *)&data);
1115*758e9fbaSOystein Eftevaag
1116*758e9fbaSOystein Eftevaag inPublic.publicArea.type = TPM2_ALG_KEYEDHASH;
1117*758e9fbaSOystein Eftevaag inPublic.publicArea.nameAlg = TPM2_ALG_SHA256;
1118*758e9fbaSOystein Eftevaag inPublic.publicArea.objectAttributes &= ~TPMA_OBJECT_RESTRICTED;
1119*758e9fbaSOystein Eftevaag inPublic.publicArea.objectAttributes &= ~TPMA_OBJECT_DECRYPT;
1120*758e9fbaSOystein Eftevaag inPublic.publicArea.objectAttributes &= ~TPMA_OBJECT_SENSITIVEDATAORIGIN;
1121*758e9fbaSOystein Eftevaag CopySizedByteBuffer((TPM2B *)&inPublic.publicArea.authPolicy, (TPM2B *)policyDigest);
1122*758e9fbaSOystein Eftevaag inPublic.publicArea.parameters.keyedHashDetail.scheme.scheme = TPM2_ALG_NULL;
1123*758e9fbaSOystein Eftevaag inPublic.publicArea.unique.keyedHash.size = 0;
1124*758e9fbaSOystein Eftevaag
1125*758e9fbaSOystein Eftevaag outPublic.size = 0;
1126*758e9fbaSOystein Eftevaag creationData.size = 0;
1127*758e9fbaSOystein Eftevaag INIT_SIMPLE_TPM2B_SIZE( outPrivate );
1128*758e9fbaSOystein Eftevaag INIT_SIMPLE_TPM2B_SIZE( creationHash );
1129*758e9fbaSOystein Eftevaag rval = Tss2_Sys_Create( sysContext, srkHandle, &cmdAuthArray,
1130*758e9fbaSOystein Eftevaag &inSensitive, &inPublic, &outsideInfo, &creationPcr,
1131*758e9fbaSOystein Eftevaag &outPrivate, &outPublic, &creationData, &creationHash,
1132*758e9fbaSOystein Eftevaag &creationTicket, 0 );
1133*758e9fbaSOystein Eftevaag CheckPassed( rval );
1134*758e9fbaSOystein Eftevaag
1135*758e9fbaSOystein Eftevaag /* Now we need to load the object. */
1136*758e9fbaSOystein Eftevaag INIT_SIMPLE_TPM2B_SIZE( blobName );
1137*758e9fbaSOystein Eftevaag rval = Tss2_Sys_Load( sysContext, srkHandle, &cmdAuthArray, &outPrivate, &outPublic, &blobHandle, &blobName, 0 );
1138*758e9fbaSOystein Eftevaag CheckPassed( rval );
1139*758e9fbaSOystein Eftevaag
1140*758e9fbaSOystein Eftevaag return rval;
1141*758e9fbaSOystein Eftevaag }
1142*758e9fbaSOystein Eftevaag
PasswordUnseal(TSS2_SYS_CONTEXT * sysContext,SESSION * policySession)1143*758e9fbaSOystein Eftevaag static TSS2_RC PasswordUnseal( TSS2_SYS_CONTEXT *sysContext, SESSION *policySession )
1144*758e9fbaSOystein Eftevaag {
1145*758e9fbaSOystein Eftevaag TSS2_RC rval = TPM2_RC_SUCCESS;
1146*758e9fbaSOystein Eftevaag TPM2B_SENSITIVE_DATA outData;
1147*758e9fbaSOystein Eftevaag TSS2L_SYS_AUTH_COMMAND cmdAuthArray = { .count = 1, .auths = {{
1148*758e9fbaSOystein Eftevaag .sessionHandle = policySession->sessionHandle,
1149*758e9fbaSOystein Eftevaag .sessionAttributes = TPMA_SESSION_CONTINUESESSION,
1150*758e9fbaSOystein Eftevaag .nonce = {.size = 0},
1151*758e9fbaSOystein Eftevaag .hmac = {.size = 0}}}};
1152*758e9fbaSOystein Eftevaag
1153*758e9fbaSOystein Eftevaag /*
1154*758e9fbaSOystein Eftevaag * Now try to unseal the blob without setting the password.
1155*758e9fbaSOystein Eftevaag * This test should fail.
1156*758e9fbaSOystein Eftevaag */
1157*758e9fbaSOystein Eftevaag INIT_SIMPLE_TPM2B_SIZE( outData );
1158*758e9fbaSOystein Eftevaag rval = Tss2_Sys_Unseal( sysContext, blobHandle, &cmdAuthArray, &outData, 0 );
1159*758e9fbaSOystein Eftevaag CheckFailed( rval, TPM2_RC_S + TPM2_RC_1 + TPM2_RC_AUTH_FAIL );
1160*758e9fbaSOystein Eftevaag
1161*758e9fbaSOystein Eftevaag /* Clear DA lockout. */
1162*758e9fbaSOystein Eftevaag TestDictionaryAttackLockReset();
1163*758e9fbaSOystein Eftevaag
1164*758e9fbaSOystein Eftevaag /*
1165*758e9fbaSOystein Eftevaag * Now try to unseal the blob after setting the password.
1166*758e9fbaSOystein Eftevaag * This test should pass.
1167*758e9fbaSOystein Eftevaag */
1168*758e9fbaSOystein Eftevaag INIT_SIMPLE_TPM2B_SIZE( outData );
1169*758e9fbaSOystein Eftevaag cmdAuthArray.auths[0].hmac.size = sizeof( passwordPCRTestPassword );
1170*758e9fbaSOystein Eftevaag memcpy( &cmdAuthArray.auths[0].hmac.buffer, passwordPCRTestPassword, sizeof( passwordPCRTestPassword ) );
1171*758e9fbaSOystein Eftevaag rval = Tss2_Sys_Unseal( sysContext, blobHandle, &cmdAuthArray, &outData, 0 );
1172*758e9fbaSOystein Eftevaag CheckPassed( rval );
1173*758e9fbaSOystein Eftevaag
1174*758e9fbaSOystein Eftevaag /* Add test to make sure we unsealed correctly. */
1175*758e9fbaSOystein Eftevaag
1176*758e9fbaSOystein Eftevaag /*
1177*758e9fbaSOystein Eftevaag * Now we'll want to flush the data blob and remove it
1178*758e9fbaSOystein Eftevaag * from resource manager tables.
1179*758e9fbaSOystein Eftevaag */
1180*758e9fbaSOystein Eftevaag rval = Tss2_Sys_FlushContext( sysContext, blobHandle );
1181*758e9fbaSOystein Eftevaag CheckPassed( rval );
1182*758e9fbaSOystein Eftevaag
1183*758e9fbaSOystein Eftevaag return rval;
1184*758e9fbaSOystein Eftevaag }
1185*758e9fbaSOystein Eftevaag
1186*758e9fbaSOystein Eftevaag POLICY_TEST_SETUP policyTestSetups[] =
1187*758e9fbaSOystein Eftevaag {
1188*758e9fbaSOystein Eftevaag /*
1189*758e9fbaSOystein Eftevaag * NOTE: Since locality is a fairly simple command and we
1190*758e9fbaSOystein Eftevaag * can guarantee its correctness, we don't need a trial
1191*758e9fbaSOystein Eftevaag * session for this. buildPolicyFn pointer can be 0 in
1192*758e9fbaSOystein Eftevaag * this case.
1193*758e9fbaSOystein Eftevaag */
1194*758e9fbaSOystein Eftevaag { "LOCALITY", 0, CreateNVIndex, TestLocality },
1195*758e9fbaSOystein Eftevaag { "PASSWORD", BuildPasswordPolicy, CreateDataBlob, PasswordUnseal },
1196*758e9fbaSOystein Eftevaag };
1197*758e9fbaSOystein Eftevaag
TestPolicy()1198*758e9fbaSOystein Eftevaag static void TestPolicy()
1199*758e9fbaSOystein Eftevaag {
1200*758e9fbaSOystein Eftevaag UINT32 rval;
1201*758e9fbaSOystein Eftevaag unsigned int i;
1202*758e9fbaSOystein Eftevaag SESSION *policySession = 0;
1203*758e9fbaSOystein Eftevaag
1204*758e9fbaSOystein Eftevaag LOG_INFO("POLICY TESTS:" );
1205*758e9fbaSOystein Eftevaag
1206*758e9fbaSOystein Eftevaag for( i = 0; i < ( sizeof( policyTestSetups ) / sizeof( POLICY_TEST_SETUP ) ); i++ )
1207*758e9fbaSOystein Eftevaag {
1208*758e9fbaSOystein Eftevaag TPM2B_DIGEST policyDigest;
1209*758e9fbaSOystein Eftevaag
1210*758e9fbaSOystein Eftevaag policyDigest.size = 0;
1211*758e9fbaSOystein Eftevaag
1212*758e9fbaSOystein Eftevaag rval = TPM2_RC_SUCCESS;
1213*758e9fbaSOystein Eftevaag
1214*758e9fbaSOystein Eftevaag LOG_INFO("Policy Test: %s", policyTestSetups[i].name );
1215*758e9fbaSOystein Eftevaag
1216*758e9fbaSOystein Eftevaag /* Create trial policy session and run policy commands, in order to create policyDigest. */
1217*758e9fbaSOystein Eftevaag if( policyTestSetups[i].buildPolicyFn != 0)
1218*758e9fbaSOystein Eftevaag {
1219*758e9fbaSOystein Eftevaag rval = BuildPolicy( sysContext, &policySession, policyTestSetups[i].buildPolicyFn, &policyDigest, true );
1220*758e9fbaSOystein Eftevaag CheckPassed( rval );
1221*758e9fbaSOystein Eftevaag LOGBLOB_DEBUG(&(policyDigest.buffer[0]), policyDigest.size, "Built policy digest:");
1222*758e9fbaSOystein Eftevaag }
1223*758e9fbaSOystein Eftevaag
1224*758e9fbaSOystein Eftevaag /* Create entity that will use that policyDigest as authPolicy. */
1225*758e9fbaSOystein Eftevaag if( policyTestSetups[i].createObjectFn != 0 )
1226*758e9fbaSOystein Eftevaag {
1227*758e9fbaSOystein Eftevaag LOGBLOB_DEBUG(&(policyDigest.buffer[0]), policyDigest.size,
1228*758e9fbaSOystein Eftevaag "Policy digest used to create object:");
1229*758e9fbaSOystein Eftevaag
1230*758e9fbaSOystein Eftevaag rval = ( *policyTestSetups[i].createObjectFn )( sysContext, &policySession, &policyDigest);
1231*758e9fbaSOystein Eftevaag CheckPassed( rval );
1232*758e9fbaSOystein Eftevaag }
1233*758e9fbaSOystein Eftevaag
1234*758e9fbaSOystein Eftevaag /*
1235*758e9fbaSOystein Eftevaag * Create real policy session and run policy commands; after this
1236*758e9fbaSOystein Eftevaag * we're ready to authorize actions on the entity.
1237*758e9fbaSOystein Eftevaag */
1238*758e9fbaSOystein Eftevaag if( policyTestSetups[i].buildPolicyFn != 0)
1239*758e9fbaSOystein Eftevaag {
1240*758e9fbaSOystein Eftevaag rval = BuildPolicy( sysContext, &policySession, policyTestSetups[i].buildPolicyFn, &policyDigest, false );
1241*758e9fbaSOystein Eftevaag CheckPassed( rval );
1242*758e9fbaSOystein Eftevaag LOGBLOB_DEBUG(&(policyDigest.buffer[0]), policyDigest.size,
1243*758e9fbaSOystein Eftevaag "Command policy digest: ");
1244*758e9fbaSOystein Eftevaag }
1245*758e9fbaSOystein Eftevaag
1246*758e9fbaSOystein Eftevaag if( policySession )
1247*758e9fbaSOystein Eftevaag {
1248*758e9fbaSOystein Eftevaag /* Now do tests by authorizing actions on the entity. */
1249*758e9fbaSOystein Eftevaag rval = ( *policyTestSetups[i].testPolicyFn)( sysContext, policySession );
1250*758e9fbaSOystein Eftevaag CheckPassed( rval );
1251*758e9fbaSOystein Eftevaag
1252*758e9fbaSOystein Eftevaag /* Need to flush the session here. */
1253*758e9fbaSOystein Eftevaag rval = Tss2_Sys_FlushContext( sysContext, policySession->sessionHandle );
1254*758e9fbaSOystein Eftevaag CheckPassed( rval );
1255*758e9fbaSOystein Eftevaag
1256*758e9fbaSOystein Eftevaag /* And remove the session from test app session table. */
1257*758e9fbaSOystein Eftevaag end_auth_session( policySession );
1258*758e9fbaSOystein Eftevaag }
1259*758e9fbaSOystein Eftevaag else
1260*758e9fbaSOystein Eftevaag {
1261*758e9fbaSOystein Eftevaag CheckFailed( rval, 0xffffffff );
1262*758e9fbaSOystein Eftevaag }
1263*758e9fbaSOystein Eftevaag }
1264*758e9fbaSOystein Eftevaag }
1265*758e9fbaSOystein Eftevaag
1266*758e9fbaSOystein Eftevaag #define MAX_TEST_SEQUENCES 10
TestHash()1267*758e9fbaSOystein Eftevaag static void TestHash()
1268*758e9fbaSOystein Eftevaag {
1269*758e9fbaSOystein Eftevaag UINT32 rval;
1270*758e9fbaSOystein Eftevaag TPM2B_AUTH auth;
1271*758e9fbaSOystein Eftevaag TPMI_DH_OBJECT sequenceHandle[MAX_TEST_SEQUENCES];
1272*758e9fbaSOystein Eftevaag TSS2L_SYS_AUTH_COMMAND sessionsData;
1273*758e9fbaSOystein Eftevaag TPM2B_MAX_BUFFER dataToHash;
1274*758e9fbaSOystein Eftevaag TPM2B_DIGEST result;
1275*758e9fbaSOystein Eftevaag TPMT_TK_HASHCHECK validation;
1276*758e9fbaSOystein Eftevaag TSS2L_SYS_AUTH_RESPONSE sessionsDataOut;
1277*758e9fbaSOystein Eftevaag UINT8 memoryToHash[] =
1278*758e9fbaSOystein Eftevaag {
1279*758e9fbaSOystein Eftevaag 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
1280*758e9fbaSOystein Eftevaag 0xff, 0xfe, 0xfd, 0xfc, 0xfb, 0xfa, 0xf9, 0xf8, 0xf7, 0xf6, 0xf5, 0xf4, 0xf3, 0xf2, 0xf1, 0xf0,
1281*758e9fbaSOystein Eftevaag 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
1282*758e9fbaSOystein Eftevaag 0xff, 0xfe, 0xfd, 0xfc, 0xfb, 0xfa, 0xf9, 0xf8, 0xf7, 0xf6, 0xf5, 0xf4, 0xf3, 0xf2, 0xf1, 0xf0,
1283*758e9fbaSOystein Eftevaag 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
1284*758e9fbaSOystein Eftevaag 0xff, 0xfe, 0xfd, 0xfc, 0xfb, 0xfa, 0xf9, 0xf8, 0xf7, 0xf6, 0xf5, 0xf4, 0xf3, 0xf2, 0xf1, 0xf0,
1285*758e9fbaSOystein Eftevaag 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
1286*758e9fbaSOystein Eftevaag 0xff, 0xfe, 0xfd, 0xfc, 0xfb, 0xfa, 0xf9, 0xf8, 0xf7, 0xf6, 0xf5, 0xf4, 0xf3, 0xf2, 0xf1, 0xf0,
1287*758e9fbaSOystein Eftevaag 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
1288*758e9fbaSOystein Eftevaag 0xff, 0xfe, 0xfd, 0xfc, 0xfb, 0xfa, 0xf9, 0xf8, 0xf7, 0xf6, 0xf5, 0xf4, 0xf3, 0xf2, 0xf1, 0xf0,
1289*758e9fbaSOystein Eftevaag 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
1290*758e9fbaSOystein Eftevaag 0xff, 0xfe, 0xfd, 0xfc, 0xfb, 0xfa, 0xf9, 0xf8, 0xf7, 0xf6, 0xf5, 0xf4, 0xf3, 0xf2, 0xf1, 0xf0,
1291*758e9fbaSOystein Eftevaag 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
1292*758e9fbaSOystein Eftevaag 0xff, 0xfe, 0xfd, 0xfc, 0xfb, 0xfa, 0xf9, 0xf8, 0xf7, 0xf6, 0xf5, 0xf4, 0xf3, 0xf2, 0xf1, 0xf0,
1293*758e9fbaSOystein Eftevaag 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
1294*758e9fbaSOystein Eftevaag 0xff, 0xfe, 0xfd, 0xfc, 0xfb, 0xfa, 0xf9, 0xf8, 0xf7, 0xf6, 0xf5, 0xf4, 0xf3, 0xf2, 0xf1, 0xf0,
1295*758e9fbaSOystein Eftevaag 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
1296*758e9fbaSOystein Eftevaag 0xff, 0xfe, 0xfd, 0xfc, 0xfb, 0xfa, 0xf9, 0xf8, 0xf7, 0xf6, 0xf5, 0xf4, 0xf3, 0xf2, 0xf1, 0xf0,
1297*758e9fbaSOystein Eftevaag 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
1298*758e9fbaSOystein Eftevaag 0xff, 0xfe, 0xfd, 0xfc, 0xfb, 0xfa, 0xf9, 0xf8, 0xf7, 0xf6, 0xf5, 0xf4, 0xf3, 0xf2, 0xf1, 0xf0,
1299*758e9fbaSOystein Eftevaag 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
1300*758e9fbaSOystein Eftevaag 0xff, 0xfe, 0xfd, 0xfc, 0xfb, 0xfa, 0xf9, 0xf8, 0xf7, 0xf6, 0xf5, 0xf4, 0xf3, 0xf2, 0xf1, 0xf0,
1301*758e9fbaSOystein Eftevaag 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
1302*758e9fbaSOystein Eftevaag 0xff, 0xfe, 0xfd, 0xfc, 0xfb, 0xfa, 0xf9, 0xf8, 0xf7, 0xf6, 0xf5, 0xf4, 0xf3, 0xf2, 0xf1, 0xf0,
1303*758e9fbaSOystein Eftevaag 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
1304*758e9fbaSOystein Eftevaag 0xff, 0xfe, 0xfd, 0xfc, 0xfb, 0xfa, 0xf9, 0xf8, 0xf7, 0xf6, 0xf5, 0xf4, 0xf3, 0xf2, 0xf1, 0xf0,
1305*758e9fbaSOystein Eftevaag 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
1306*758e9fbaSOystein Eftevaag 0xff, 0xfe, 0xfd, 0xfc, 0xfb, 0xfa, 0xf9, 0xf8, 0xf7, 0xf6, 0xf5, 0xf4, 0xf3, 0xf2, 0xf1, 0xf0,
1307*758e9fbaSOystein Eftevaag 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
1308*758e9fbaSOystein Eftevaag 0xff, 0xfe, 0xfd, 0xfc, 0xfb, 0xfa, 0xf9, 0xf8, 0xf7, 0xf6, 0xf5, 0xf4, 0xf3, 0xf2, 0xf1, 0xf0,
1309*758e9fbaSOystein Eftevaag 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
1310*758e9fbaSOystein Eftevaag 0xff, 0xfe, 0xfd, 0xfc, 0xfb, 0xfa, 0xf9, 0xf8, 0xf7, 0xf6, 0xf5, 0xf4, 0xf3, 0xf2, 0xf1, 0xf0,
1311*758e9fbaSOystein Eftevaag 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
1312*758e9fbaSOystein Eftevaag 0xff, 0xfe, 0xfd, 0xfc, 0xfb, 0xfa, 0xf9, 0xf8, 0xf7, 0xf6, 0xf5, 0xf4, 0xf3, 0xf2, 0xf1, 0xf0,
1313*758e9fbaSOystein Eftevaag 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
1314*758e9fbaSOystein Eftevaag 0xff, 0xfe, 0xfd, 0xfc, 0xfb, 0xfa, 0xf9, 0xf8, 0xf7, 0xf6, 0xf5, 0xf4, 0xf3, 0xf2, 0xf1, 0xf0,
1315*758e9fbaSOystein Eftevaag 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
1316*758e9fbaSOystein Eftevaag 0xff, 0xfe, 0xfd, 0xfc, 0xfb, 0xfa, 0xf9, 0xf8, 0xf7, 0xf6, 0xf5, 0xf4, 0xf3, 0xf2, 0xf1, 0xf0,
1317*758e9fbaSOystein Eftevaag 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
1318*758e9fbaSOystein Eftevaag 0xff, 0xfe, 0xfd, 0xfc, 0xfb, 0xfa, 0xf9, 0xf8, 0xf7, 0xf6, 0xf5, 0xf4, 0xf3, 0xf2, 0xf1, 0xf0,
1319*758e9fbaSOystein Eftevaag 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
1320*758e9fbaSOystein Eftevaag 0xff, 0xfe, 0xfd, 0xfc, 0xfb, 0xfa, 0xf9, 0xf8, 0xf7, 0xf6, 0xf5, 0xf4, 0xf3, 0xf2, 0xf1, 0xf0,
1321*758e9fbaSOystein Eftevaag 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
1322*758e9fbaSOystein Eftevaag 0xff, 0xfe, 0xfd, 0xfc, 0xfb, 0xfa, 0xf9, 0xf8, 0xf7, 0xf6, 0xf5, 0xf4, 0xf3, 0xf2, 0xf1, 0xf0,
1323*758e9fbaSOystein Eftevaag 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
1324*758e9fbaSOystein Eftevaag 0xff, 0xfe, 0xfd, 0xfc, 0xfb, 0xfa, 0xf9, 0xf8, 0xf7, 0xf6, 0xf5, 0xf4, 0xf3, 0xf2, 0xf1, 0xf0,
1325*758e9fbaSOystein Eftevaag 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
1326*758e9fbaSOystein Eftevaag 0xff, 0xfe, 0xfd, 0xfc, 0xfb, 0xfa, 0xf9, 0xf8, 0xf7, 0xf6, 0xf5, 0xf4, 0xf3, 0xf2, 0xf1, 0xf0,
1327*758e9fbaSOystein Eftevaag 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
1328*758e9fbaSOystein Eftevaag 0xff, 0xfe, 0xfd, 0xfc, 0xfb, 0xfa, 0xf9, 0xf8, 0xf7, 0xf6, 0xf5, 0xf4, 0xf3, 0xf2, 0xf1, 0xf0,
1329*758e9fbaSOystein Eftevaag 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
1330*758e9fbaSOystein Eftevaag 0xff, 0xfe, 0xfd, 0xfc, 0xfb, 0xfa, 0xf9, 0xf8, 0xf7, 0xf6, 0xf5, 0xf4, 0xf3, 0xf2, 0xf1, 0xf0,
1331*758e9fbaSOystein Eftevaag 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
1332*758e9fbaSOystein Eftevaag 0xff, 0xfe, 0xfd, 0xfc, 0xfb, 0xfa, 0xf9, 0xf8, 0xf7, 0xf6, 0xf5, 0xf4, 0xf3, 0xf2, 0xf1, 0xf0,
1333*758e9fbaSOystein Eftevaag 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
1334*758e9fbaSOystein Eftevaag 0xff, 0xfe, 0xfd, 0xfc, 0xfb, 0xfa, 0xf9, 0xf8, 0xf7, 0xf6, 0xf5, 0xf4, 0xf3, 0xf2, 0xf1, 0xf0,
1335*758e9fbaSOystein Eftevaag 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
1336*758e9fbaSOystein Eftevaag 0xff, 0xfe, 0xfd, 0xfc, 0xfb, 0xfa, 0xf9, 0xf8, 0xf7, 0xf6, 0xf5, 0xf4, 0xf3, 0xf2, 0xf1, 0xf0,
1337*758e9fbaSOystein Eftevaag 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
1338*758e9fbaSOystein Eftevaag 0xff, 0xfe, 0xfd, 0xfc, 0xfb, 0xfa, 0xf9, 0xf8, 0xf7, 0xf6, 0xf5, 0xf4, 0xf3, 0xf2, 0xf1, 0xf0,
1339*758e9fbaSOystein Eftevaag 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
1340*758e9fbaSOystein Eftevaag 0xff, 0xfe, 0xfd, 0xfc, 0xfb, 0xfa, 0xf9, 0xf8, 0xf7, 0xf6, 0xf5, 0xf4, 0xf3, 0xf2, 0xf1, 0xf0,
1341*758e9fbaSOystein Eftevaag 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
1342*758e9fbaSOystein Eftevaag 0xff, 0xfe, 0xfd, 0xfc, 0xfb, 0xfa, 0xf9, 0xf8, 0xf7, 0xf6, 0xf5, 0xf4, 0xf3, 0xf2, 0xf1, 0xf0,
1343*758e9fbaSOystein Eftevaag 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
1344*758e9fbaSOystein Eftevaag 0xff, 0xfe, 0xfd, 0xfc, 0xfb, 0xfa, 0xf9, 0xf8, 0xf7, 0xf6, 0xf5, 0xf4, 0xf3, 0xf2, 0xf1, 0xf0,
1345*758e9fbaSOystein Eftevaag 0xde, 0xad, 0xbe, 0xef };
1346*758e9fbaSOystein Eftevaag
1347*758e9fbaSOystein Eftevaag UINT8 goodHashValue[] =
1348*758e9fbaSOystein Eftevaag { 0xB3, 0xFD, 0x6A, 0xD2, 0x9F, 0xD0, 0x13, 0x52, 0xBA, 0xFC,
1349*758e9fbaSOystein Eftevaag 0x8B, 0x22, 0xC9, 0x6D, 0x88, 0x42, 0xA3, 0x3C, 0xB0, 0xC9 };
1350*758e9fbaSOystein Eftevaag
1351*758e9fbaSOystein Eftevaag LOG_INFO("HASH TESTS:" );
1352*758e9fbaSOystein Eftevaag
1353*758e9fbaSOystein Eftevaag auth.size = 2;
1354*758e9fbaSOystein Eftevaag auth.buffer[0] = 0;
1355*758e9fbaSOystein Eftevaag auth.buffer[1] = 0xff;
1356*758e9fbaSOystein Eftevaag rval = Tss2_Sys_HashSequenceStart ( sysContext, 0, &auth, TPM2_ALG_SHA1, &sequenceHandle[0], 0 );
1357*758e9fbaSOystein Eftevaag CheckPassed( rval );
1358*758e9fbaSOystein Eftevaag
1359*758e9fbaSOystein Eftevaag sessionsData.auths[0].sessionHandle = TPM2_RS_PW;
1360*758e9fbaSOystein Eftevaag sessionsData.auths[0].nonce.size = 0;
1361*758e9fbaSOystein Eftevaag sessionsData.auths[0].hmac = auth;
1362*758e9fbaSOystein Eftevaag sessionsData.auths[0].sessionAttributes = 0;
1363*758e9fbaSOystein Eftevaag sessionsData.count = 1;
1364*758e9fbaSOystein Eftevaag
1365*758e9fbaSOystein Eftevaag dataToHash.size = TPM2_MAX_DIGEST_BUFFER;
1366*758e9fbaSOystein Eftevaag memcpy( &dataToHash.buffer[0], &memoryToHash[0], dataToHash.size );
1367*758e9fbaSOystein Eftevaag
1368*758e9fbaSOystein Eftevaag rval = Tss2_Sys_SequenceUpdate ( sysContext, sequenceHandle[0], &sessionsData, &dataToHash, &sessionsDataOut );
1369*758e9fbaSOystein Eftevaag CheckPassed( rval );
1370*758e9fbaSOystein Eftevaag dataToHash.size = sizeof( memoryToHash ) - TPM2_MAX_DIGEST_BUFFER;
1371*758e9fbaSOystein Eftevaag memcpy( &dataToHash.buffer[0], &memoryToHash[TPM2_MAX_DIGEST_BUFFER], dataToHash.size );
1372*758e9fbaSOystein Eftevaag INIT_SIMPLE_TPM2B_SIZE( result );
1373*758e9fbaSOystein Eftevaag rval = Tss2_Sys_SequenceComplete ( sysContext, sequenceHandle[0], &sessionsData, &dataToHash,
1374*758e9fbaSOystein Eftevaag TPM2_RH_PLATFORM, &result, &validation, &sessionsDataOut );
1375*758e9fbaSOystein Eftevaag CheckPassed( rval );
1376*758e9fbaSOystein Eftevaag
1377*758e9fbaSOystein Eftevaag /* Test the resulting hash. */
1378*758e9fbaSOystein Eftevaag if (memcmp(result.buffer, goodHashValue, result.size)) {
1379*758e9fbaSOystein Eftevaag LOG_ERROR("ERROR!! resulting hash is incorrect." );
1380*758e9fbaSOystein Eftevaag Cleanup();
1381*758e9fbaSOystein Eftevaag }
1382*758e9fbaSOystein Eftevaag }
1383*758e9fbaSOystein Eftevaag
TestQuote()1384*758e9fbaSOystein Eftevaag static void TestQuote()
1385*758e9fbaSOystein Eftevaag {
1386*758e9fbaSOystein Eftevaag UINT32 rval;
1387*758e9fbaSOystein Eftevaag TPM2B_DATA qualifyingData;
1388*758e9fbaSOystein Eftevaag UINT8 qualDataString[] = { 0x00, 0xff, 0x55, 0xaa };
1389*758e9fbaSOystein Eftevaag TPMT_SIG_SCHEME inScheme;
1390*758e9fbaSOystein Eftevaag TPML_PCR_SELECTION pcrSelection;
1391*758e9fbaSOystein Eftevaag TSS2L_SYS_AUTH_RESPONSE sessionsDataOut;
1392*758e9fbaSOystein Eftevaag TPM2B_ATTEST quoted;
1393*758e9fbaSOystein Eftevaag TPMT_SIGNATURE signature;
1394*758e9fbaSOystein Eftevaag TSS2L_SYS_AUTH_COMMAND sessionsData = { .count = 1,
1395*758e9fbaSOystein Eftevaag .auths = {{
1396*758e9fbaSOystein Eftevaag .sessionHandle = TPM2_RS_PW,
1397*758e9fbaSOystein Eftevaag .sessionAttributes = 0,
1398*758e9fbaSOystein Eftevaag .nonce = { .size = 0 },
1399*758e9fbaSOystein Eftevaag .hmac = { .size = 0, .buffer={0x00} },
1400*758e9fbaSOystein Eftevaag }},
1401*758e9fbaSOystein Eftevaag };
1402*758e9fbaSOystein Eftevaag TPM2_HANDLE handle, handle_parent;
1403*758e9fbaSOystein Eftevaag
1404*758e9fbaSOystein Eftevaag LOG_INFO("QUOTE CONTROL TESTS:" );
1405*758e9fbaSOystein Eftevaag
1406*758e9fbaSOystein Eftevaag qualifyingData.size = sizeof( qualDataString );
1407*758e9fbaSOystein Eftevaag memcpy( &( qualifyingData.buffer[0] ), qualDataString, sizeof( qualDataString ) );
1408*758e9fbaSOystein Eftevaag
1409*758e9fbaSOystein Eftevaag inScheme.scheme = TPM2_ALG_NULL;
1410*758e9fbaSOystein Eftevaag
1411*758e9fbaSOystein Eftevaag pcrSelection.count = 1;
1412*758e9fbaSOystein Eftevaag pcrSelection.pcrSelections[0].hash = TPM2_ALG_SHA256;
1413*758e9fbaSOystein Eftevaag pcrSelection.pcrSelections[0].sizeofSelect = 3;
1414*758e9fbaSOystein Eftevaag
1415*758e9fbaSOystein Eftevaag /* Clear out PCR select bit field */
1416*758e9fbaSOystein Eftevaag pcrSelection.pcrSelections[0].pcrSelect[0] = 0;
1417*758e9fbaSOystein Eftevaag pcrSelection.pcrSelections[0].pcrSelect[1] = 0;
1418*758e9fbaSOystein Eftevaag pcrSelection.pcrSelections[0].pcrSelect[2] = 0;
1419*758e9fbaSOystein Eftevaag
1420*758e9fbaSOystein Eftevaag /* Now set the PCR you want */
1421*758e9fbaSOystein Eftevaag pcrSelection.pcrSelections[0].pcrSelect[( PCR_17/8 )] = ( 1 << ( PCR_18 % 8) );
1422*758e9fbaSOystein Eftevaag
1423*758e9fbaSOystein Eftevaag rval = create_primary_rsa_2048_aes_128_cfb(sysContext, &handle_parent);
1424*758e9fbaSOystein Eftevaag CheckPassed( rval );
1425*758e9fbaSOystein Eftevaag
1426*758e9fbaSOystein Eftevaag rval = create_keyedhash_key (sysContext, handle_parent, &handle);
1427*758e9fbaSOystein Eftevaag CheckPassed( rval );
1428*758e9fbaSOystein Eftevaag
1429*758e9fbaSOystein Eftevaag /* Test with wrong type of key. */
1430*758e9fbaSOystein Eftevaag INIT_SIMPLE_TPM2B_SIZE( quoted );
1431*758e9fbaSOystein Eftevaag rval = Tss2_Sys_Quote ( sysContext, handle, &sessionsData, &qualifyingData, &inScheme,
1432*758e9fbaSOystein Eftevaag &pcrSelection, "ed, &signature, &sessionsDataOut );
1433*758e9fbaSOystein Eftevaag CheckPassed( rval );
1434*758e9fbaSOystein Eftevaag
1435*758e9fbaSOystein Eftevaag rval = Tss2_Sys_FlushContext(sysContext, handle);
1436*758e9fbaSOystein Eftevaag CheckPassed( rval );
1437*758e9fbaSOystein Eftevaag
1438*758e9fbaSOystein Eftevaag rval = Tss2_Sys_FlushContext(sysContext, handle_parent);
1439*758e9fbaSOystein Eftevaag CheckPassed( rval );
1440*758e9fbaSOystein Eftevaag }
1441*758e9fbaSOystein Eftevaag
1442*758e9fbaSOystein Eftevaag TSS2L_SYS_AUTH_COMMAND nullSessionsData = { 1, { 0 } };
1443*758e9fbaSOystein Eftevaag TSS2L_SYS_AUTH_RESPONSE nullSessionsDataOut = { 0, { 0 } };
1444*758e9fbaSOystein Eftevaag TPM2B_NONCE nullSessionNonce, nullSessionNonceOut;
1445*758e9fbaSOystein Eftevaag TPM2B_AUTH nullSessionHmac;
1446*758e9fbaSOystein Eftevaag
TestPcrAllocate()1447*758e9fbaSOystein Eftevaag static void TestPcrAllocate()
1448*758e9fbaSOystein Eftevaag {
1449*758e9fbaSOystein Eftevaag UINT32 rval;
1450*758e9fbaSOystein Eftevaag TPML_PCR_SELECTION pcrSelection;
1451*758e9fbaSOystein Eftevaag TSS2L_SYS_AUTH_RESPONSE sessionsDataOut;
1452*758e9fbaSOystein Eftevaag TPMI_YES_NO allocationSuccess;
1453*758e9fbaSOystein Eftevaag UINT32 maxPcr;
1454*758e9fbaSOystein Eftevaag UINT32 sizeNeeded;
1455*758e9fbaSOystein Eftevaag UINT32 sizeAvailable;
1456*758e9fbaSOystein Eftevaag
1457*758e9fbaSOystein Eftevaag TSS2L_SYS_AUTH_COMMAND sessionsData = { .count = 1, .auths= {{
1458*758e9fbaSOystein Eftevaag .sessionHandle = TPM2_RS_PW,
1459*758e9fbaSOystein Eftevaag .sessionAttributes = 0,
1460*758e9fbaSOystein Eftevaag .nonce={.size=0},
1461*758e9fbaSOystein Eftevaag .hmac={.size=0}}}};
1462*758e9fbaSOystein Eftevaag
1463*758e9fbaSOystein Eftevaag LOG_INFO("PCR ALLOCATE TEST :" );
1464*758e9fbaSOystein Eftevaag
1465*758e9fbaSOystein Eftevaag pcrSelection.count = 0;
1466*758e9fbaSOystein Eftevaag
1467*758e9fbaSOystein Eftevaag rval = Tss2_Sys_PCR_Allocate( sysContext, TPM2_RH_PLATFORM, &sessionsData, &pcrSelection,
1468*758e9fbaSOystein Eftevaag &allocationSuccess, &maxPcr, &sizeNeeded, &sizeAvailable, &sessionsDataOut);
1469*758e9fbaSOystein Eftevaag CheckPassed( rval );
1470*758e9fbaSOystein Eftevaag
1471*758e9fbaSOystein Eftevaag pcrSelection.count = 3;
1472*758e9fbaSOystein Eftevaag pcrSelection.pcrSelections[0].hash = TPM2_ALG_SHA256;
1473*758e9fbaSOystein Eftevaag CLEAR_PCR_SELECT_BITS( pcrSelection.pcrSelections[0] );
1474*758e9fbaSOystein Eftevaag SET_PCR_SELECT_SIZE( pcrSelection.pcrSelections[0], 3 );
1475*758e9fbaSOystein Eftevaag SET_PCR_SELECT_BIT( pcrSelection.pcrSelections[0], PCR_5 );
1476*758e9fbaSOystein Eftevaag SET_PCR_SELECT_BIT( pcrSelection.pcrSelections[0], PCR_7 );
1477*758e9fbaSOystein Eftevaag pcrSelection.pcrSelections[1].hash = TPM2_ALG_SHA384;
1478*758e9fbaSOystein Eftevaag CLEAR_PCR_SELECT_BITS( pcrSelection.pcrSelections[1] );
1479*758e9fbaSOystein Eftevaag SET_PCR_SELECT_SIZE( pcrSelection.pcrSelections[1], 3 );
1480*758e9fbaSOystein Eftevaag SET_PCR_SELECT_BIT( pcrSelection.pcrSelections[1], PCR_5 );
1481*758e9fbaSOystein Eftevaag SET_PCR_SELECT_BIT( pcrSelection.pcrSelections[1], PCR_8 );
1482*758e9fbaSOystein Eftevaag pcrSelection.pcrSelections[2].hash = TPM2_ALG_SHA256;
1483*758e9fbaSOystein Eftevaag CLEAR_PCR_SELECT_BITS( pcrSelection.pcrSelections[2] );
1484*758e9fbaSOystein Eftevaag SET_PCR_SELECT_SIZE( pcrSelection.pcrSelections[2], 3 );
1485*758e9fbaSOystein Eftevaag SET_PCR_SELECT_BIT( pcrSelection.pcrSelections[2], PCR_6 );
1486*758e9fbaSOystein Eftevaag
1487*758e9fbaSOystein Eftevaag rval = Tss2_Sys_PCR_Allocate( sysContext, TPM2_RH_PLATFORM, &sessionsData, &pcrSelection,
1488*758e9fbaSOystein Eftevaag &allocationSuccess, &maxPcr, &sizeNeeded, &sizeAvailable, &sessionsDataOut);
1489*758e9fbaSOystein Eftevaag CheckPassed( rval );
1490*758e9fbaSOystein Eftevaag }
1491*758e9fbaSOystein Eftevaag
TestUnseal()1492*758e9fbaSOystein Eftevaag static void TestUnseal()
1493*758e9fbaSOystein Eftevaag {
1494*758e9fbaSOystein Eftevaag UINT32 rval;
1495*758e9fbaSOystein Eftevaag TSS2L_SYS_AUTH_RESPONSE sessionsDataOut;
1496*758e9fbaSOystein Eftevaag TPM2B_SENSITIVE_CREATE inSensitive;
1497*758e9fbaSOystein Eftevaag TPML_PCR_SELECTION creationPCR;
1498*758e9fbaSOystein Eftevaag TPM2B_DATA outsideInfo;
1499*758e9fbaSOystein Eftevaag TPM2B_PUBLIC inPublic;
1500*758e9fbaSOystein Eftevaag TPM2_HANDLE loadedObjectHandle, handle_parent;
1501*758e9fbaSOystein Eftevaag
1502*758e9fbaSOystein Eftevaag TSS2L_SYS_AUTH_COMMAND sessionsData = { .count = 1,
1503*758e9fbaSOystein Eftevaag .auths= {{
1504*758e9fbaSOystein Eftevaag .sessionHandle = TPM2_RS_PW,
1505*758e9fbaSOystein Eftevaag .sessionAttributes = 0,
1506*758e9fbaSOystein Eftevaag .nonce={.size=0},
1507*758e9fbaSOystein Eftevaag .hmac={.size=0, .buffer={0x00}}
1508*758e9fbaSOystein Eftevaag }},
1509*758e9fbaSOystein Eftevaag };
1510*758e9fbaSOystein Eftevaag
1511*758e9fbaSOystein Eftevaag TPM2B_PRIVATE outPrivate;
1512*758e9fbaSOystein Eftevaag TPM2B_PUBLIC outPublic;
1513*758e9fbaSOystein Eftevaag TPM2B_CREATION_DATA creationData;
1514*758e9fbaSOystein Eftevaag TPM2B_DIGEST creationHash;
1515*758e9fbaSOystein Eftevaag TPMT_TK_CREATION creationTicket;
1516*758e9fbaSOystein Eftevaag TPM2B_NAME name;
1517*758e9fbaSOystein Eftevaag TPM2B_SENSITIVE_DATA outData;
1518*758e9fbaSOystein Eftevaag
1519*758e9fbaSOystein Eftevaag
1520*758e9fbaSOystein Eftevaag const char authStr[] = "test";
1521*758e9fbaSOystein Eftevaag const char sensitiveData[] = "this is sensitive";
1522*758e9fbaSOystein Eftevaag
1523*758e9fbaSOystein Eftevaag LOG_INFO("UNSEAL TEST :" );
1524*758e9fbaSOystein Eftevaag
1525*758e9fbaSOystein Eftevaag inSensitive.size = 0;
1526*758e9fbaSOystein Eftevaag inSensitive.sensitive.userAuth.size = sizeof( authStr ) - 1;
1527*758e9fbaSOystein Eftevaag memcpy( &( inSensitive.sensitive.userAuth.buffer[0] ), authStr, sizeof( authStr ) - 1 );
1528*758e9fbaSOystein Eftevaag inSensitive.sensitive.data.size = sizeof( sensitiveData ) - 1;
1529*758e9fbaSOystein Eftevaag memcpy( &( inSensitive.sensitive.data.buffer[0] ), sensitiveData, sizeof( sensitiveData ) - 1 );
1530*758e9fbaSOystein Eftevaag
1531*758e9fbaSOystein Eftevaag inPublic.size = 0;
1532*758e9fbaSOystein Eftevaag inPublic.publicArea.authPolicy.size = 0;
1533*758e9fbaSOystein Eftevaag
1534*758e9fbaSOystein Eftevaag inPublic.publicArea.unique.keyedHash.size = 0;
1535*758e9fbaSOystein Eftevaag
1536*758e9fbaSOystein Eftevaag outsideInfo.size = 0;
1537*758e9fbaSOystein Eftevaag creationPCR.count = 0;
1538*758e9fbaSOystein Eftevaag
1539*758e9fbaSOystein Eftevaag inPublic.publicArea.type = TPM2_ALG_KEYEDHASH;
1540*758e9fbaSOystein Eftevaag inPublic.publicArea.nameAlg = TPM2_ALG_SHA1;
1541*758e9fbaSOystein Eftevaag
1542*758e9fbaSOystein Eftevaag *(UINT32 *)&( inPublic.publicArea.objectAttributes) = 0;
1543*758e9fbaSOystein Eftevaag inPublic.publicArea.objectAttributes |= TPMA_OBJECT_USERWITHAUTH;
1544*758e9fbaSOystein Eftevaag
1545*758e9fbaSOystein Eftevaag inPublic.publicArea.parameters.keyedHashDetail.scheme.scheme = TPM2_ALG_NULL;
1546*758e9fbaSOystein Eftevaag
1547*758e9fbaSOystein Eftevaag inPublic.publicArea.unique.keyedHash.size = 0;
1548*758e9fbaSOystein Eftevaag
1549*758e9fbaSOystein Eftevaag outsideInfo.size = 0;
1550*758e9fbaSOystein Eftevaag
1551*758e9fbaSOystein Eftevaag outPublic.size = 0;
1552*758e9fbaSOystein Eftevaag creationData.size = 0;
1553*758e9fbaSOystein Eftevaag
1554*758e9fbaSOystein Eftevaag rval = create_primary_rsa_2048_aes_128_cfb(sysContext, &handle_parent);
1555*758e9fbaSOystein Eftevaag CheckPassed( rval );
1556*758e9fbaSOystein Eftevaag
1557*758e9fbaSOystein Eftevaag INIT_SIMPLE_TPM2B_SIZE( creationHash );
1558*758e9fbaSOystein Eftevaag INIT_SIMPLE_TPM2B_SIZE( outPrivate );
1559*758e9fbaSOystein Eftevaag rval = Tss2_Sys_Create( sysContext, handle_parent, &sessionsData, &inSensitive, &inPublic,
1560*758e9fbaSOystein Eftevaag &outsideInfo, &creationPCR,
1561*758e9fbaSOystein Eftevaag &outPrivate, &outPublic, &creationData,
1562*758e9fbaSOystein Eftevaag &creationHash, &creationTicket, &sessionsDataOut );
1563*758e9fbaSOystein Eftevaag CheckPassed( rval );
1564*758e9fbaSOystein Eftevaag
1565*758e9fbaSOystein Eftevaag INIT_SIMPLE_TPM2B_SIZE( name );
1566*758e9fbaSOystein Eftevaag rval = Tss2_Sys_LoadExternal ( sysContext, 0, 0, &outPublic,
1567*758e9fbaSOystein Eftevaag TPM2_RH_PLATFORM, &loadedObjectHandle, &name, 0 );
1568*758e9fbaSOystein Eftevaag CheckPassed( rval );
1569*758e9fbaSOystein Eftevaag
1570*758e9fbaSOystein Eftevaag rval = Tss2_Sys_FlushContext( sysContext, loadedObjectHandle );
1571*758e9fbaSOystein Eftevaag CheckPassed( rval );
1572*758e9fbaSOystein Eftevaag
1573*758e9fbaSOystein Eftevaag INIT_SIMPLE_TPM2B_SIZE( name );
1574*758e9fbaSOystein Eftevaag rval = Tss2_Sys_Load (sysContext, handle_parent, &sessionsData, &outPrivate, &outPublic,
1575*758e9fbaSOystein Eftevaag &loadedObjectHandle, &name, &sessionsDataOut);
1576*758e9fbaSOystein Eftevaag CheckPassed(rval);
1577*758e9fbaSOystein Eftevaag
1578*758e9fbaSOystein Eftevaag sessionsData.auths[0].hmac.size = sizeof( authStr ) - 1;
1579*758e9fbaSOystein Eftevaag memcpy( &( sessionsData.auths[0].hmac.buffer[0] ), authStr, sizeof( authStr ) - 1 );
1580*758e9fbaSOystein Eftevaag
1581*758e9fbaSOystein Eftevaag INIT_SIMPLE_TPM2B_SIZE( outData );
1582*758e9fbaSOystein Eftevaag rval = Tss2_Sys_Unseal( sysContext, loadedObjectHandle, &sessionsData, &outData, &sessionsDataOut );
1583*758e9fbaSOystein Eftevaag CheckPassed(rval);
1584*758e9fbaSOystein Eftevaag
1585*758e9fbaSOystein Eftevaag rval = Tss2_Sys_FlushContext(sysContext, loadedObjectHandle);
1586*758e9fbaSOystein Eftevaag CheckPassed(rval);
1587*758e9fbaSOystein Eftevaag
1588*758e9fbaSOystein Eftevaag rval = Tss2_Sys_FlushContext(sysContext, handle_parent);
1589*758e9fbaSOystein Eftevaag CheckPassed(rval);
1590*758e9fbaSOystein Eftevaag }
1591*758e9fbaSOystein Eftevaag
1592*758e9fbaSOystein Eftevaag
CreatePasswordTestNV(TPMI_RH_NV_INDEX nvIndex,char * password)1593*758e9fbaSOystein Eftevaag static void CreatePasswordTestNV( TPMI_RH_NV_INDEX nvIndex, char * password )
1594*758e9fbaSOystein Eftevaag {
1595*758e9fbaSOystein Eftevaag UINT32 rval;
1596*758e9fbaSOystein Eftevaag int i;
1597*758e9fbaSOystein Eftevaag TSS2L_SYS_AUTH_RESPONSE sessionsDataOut;
1598*758e9fbaSOystein Eftevaag TPM2B_NV_PUBLIC publicInfo;
1599*758e9fbaSOystein Eftevaag TPM2B_AUTH nvAuth;
1600*758e9fbaSOystein Eftevaag
1601*758e9fbaSOystein Eftevaag
1602*758e9fbaSOystein Eftevaag TSS2L_SYS_AUTH_COMMAND sessionsData = { .count = 1, .auths= {{
1603*758e9fbaSOystein Eftevaag .sessionHandle = TPM2_RS_PW,
1604*758e9fbaSOystein Eftevaag .sessionAttributes = 0,
1605*758e9fbaSOystein Eftevaag .nonce={.size=0},
1606*758e9fbaSOystein Eftevaag .hmac={.size=0}}}};
1607*758e9fbaSOystein Eftevaag
1608*758e9fbaSOystein Eftevaag nvAuth.size = strlen( password );
1609*758e9fbaSOystein Eftevaag for( i = 0; i < nvAuth.size; i++ ) {
1610*758e9fbaSOystein Eftevaag nvAuth.buffer[i] = password[i];
1611*758e9fbaSOystein Eftevaag }
1612*758e9fbaSOystein Eftevaag
1613*758e9fbaSOystein Eftevaag publicInfo.size = 0;
1614*758e9fbaSOystein Eftevaag publicInfo.nvPublic.nvIndex = nvIndex;
1615*758e9fbaSOystein Eftevaag publicInfo.nvPublic.nameAlg = TPM2_ALG_SHA1;
1616*758e9fbaSOystein Eftevaag
1617*758e9fbaSOystein Eftevaag /* First zero out attributes. */
1618*758e9fbaSOystein Eftevaag *(UINT32 *)&( publicInfo.nvPublic.attributes ) = 0;
1619*758e9fbaSOystein Eftevaag
1620*758e9fbaSOystein Eftevaag /* Now set the attributes. */
1621*758e9fbaSOystein Eftevaag publicInfo.nvPublic.attributes |= TPMA_NV_AUTHREAD;
1622*758e9fbaSOystein Eftevaag publicInfo.nvPublic.attributes |= TPMA_NV_AUTHWRITE;
1623*758e9fbaSOystein Eftevaag publicInfo.nvPublic.attributes |= TPMA_NV_PLATFORMCREATE;
1624*758e9fbaSOystein Eftevaag publicInfo.nvPublic.attributes |= TPMA_NV_ORDERLY;
1625*758e9fbaSOystein Eftevaag publicInfo.nvPublic.authPolicy.size = 0;
1626*758e9fbaSOystein Eftevaag publicInfo.nvPublic.dataSize = 32;
1627*758e9fbaSOystein Eftevaag
1628*758e9fbaSOystein Eftevaag rval = Tss2_Sys_NV_DefineSpace( sysContext, TPM2_RH_PLATFORM,
1629*758e9fbaSOystein Eftevaag &sessionsData, &nvAuth, &publicInfo, &sessionsDataOut );
1630*758e9fbaSOystein Eftevaag CheckPassed( rval );
1631*758e9fbaSOystein Eftevaag }
1632*758e9fbaSOystein Eftevaag
PasswordTest()1633*758e9fbaSOystein Eftevaag static void PasswordTest()
1634*758e9fbaSOystein Eftevaag {
1635*758e9fbaSOystein Eftevaag char *password = "test password";
1636*758e9fbaSOystein Eftevaag UINT32 rval;
1637*758e9fbaSOystein Eftevaag int i;
1638*758e9fbaSOystein Eftevaag
1639*758e9fbaSOystein Eftevaag /* Authorization array for response. */
1640*758e9fbaSOystein Eftevaag TSS2L_SYS_AUTH_RESPONSE sessionsDataOut;
1641*758e9fbaSOystein Eftevaag
1642*758e9fbaSOystein Eftevaag /* Authorization array for command (only has one auth structure). */
1643*758e9fbaSOystein Eftevaag TSS2L_SYS_AUTH_COMMAND sessionsData = { .count = 1, .auths= {{
1644*758e9fbaSOystein Eftevaag .sessionHandle = TPM2_RS_PW,
1645*758e9fbaSOystein Eftevaag .sessionAttributes = 0,
1646*758e9fbaSOystein Eftevaag .nonce={.size=0},
1647*758e9fbaSOystein Eftevaag .hmac={.size=0}}}};
1648*758e9fbaSOystein Eftevaag
1649*758e9fbaSOystein Eftevaag TPM2B_MAX_NV_BUFFER nvWriteData;
1650*758e9fbaSOystein Eftevaag
1651*758e9fbaSOystein Eftevaag LOG_INFO("PASSWORD TESTS:" );
1652*758e9fbaSOystein Eftevaag
1653*758e9fbaSOystein Eftevaag /*
1654*758e9fbaSOystein Eftevaag * Create an NV index that will use password authorizations.
1655*758e9fbaSOystein Eftevaag * The password will be "test password".
1656*758e9fbaSOystein Eftevaag */
1657*758e9fbaSOystein Eftevaag CreatePasswordTestNV( TPM20_INDEX_PASSWORD_TEST, password );
1658*758e9fbaSOystein Eftevaag
1659*758e9fbaSOystein Eftevaag /* Init password (HMAC field in authorization structure). */
1660*758e9fbaSOystein Eftevaag sessionsData.auths[0].hmac.size = strlen( password );
1661*758e9fbaSOystein Eftevaag memcpy( &( sessionsData.auths[0].hmac.buffer[0] ),
1662*758e9fbaSOystein Eftevaag &( password[0] ), sessionsData.auths[0].hmac.size );
1663*758e9fbaSOystein Eftevaag
1664*758e9fbaSOystein Eftevaag /* Initialize write data. */
1665*758e9fbaSOystein Eftevaag nvWriteData.size = 4;
1666*758e9fbaSOystein Eftevaag for( i = 0; i < nvWriteData.size; i++ )
1667*758e9fbaSOystein Eftevaag nvWriteData.buffer[i] = 0xff - i;
1668*758e9fbaSOystein Eftevaag
1669*758e9fbaSOystein Eftevaag /*
1670*758e9fbaSOystein Eftevaag * Attempt write with the correct password.
1671*758e9fbaSOystein Eftevaag * It should pass.
1672*758e9fbaSOystein Eftevaag */
1673*758e9fbaSOystein Eftevaag do {
1674*758e9fbaSOystein Eftevaag rval = Tss2_Sys_NV_Write( sysContext,
1675*758e9fbaSOystein Eftevaag TPM20_INDEX_PASSWORD_TEST,
1676*758e9fbaSOystein Eftevaag TPM20_INDEX_PASSWORD_TEST,
1677*758e9fbaSOystein Eftevaag &sessionsData, &nvWriteData, 0,
1678*758e9fbaSOystein Eftevaag &sessionsDataOut );
1679*758e9fbaSOystein Eftevaag } while (rval == TPM2_RC_RETRY);
1680*758e9fbaSOystein Eftevaag /*
1681*758e9fbaSOystein Eftevaag * Check that the function passed as
1682*758e9fbaSOystein Eftevaag * expected. Otherwise, exit.
1683*758e9fbaSOystein Eftevaag */
1684*758e9fbaSOystein Eftevaag CheckPassed( rval );
1685*758e9fbaSOystein Eftevaag
1686*758e9fbaSOystein Eftevaag /* Alter the password so it's incorrect. */
1687*758e9fbaSOystein Eftevaag sessionsData.auths[0].hmac.buffer[4] = 0xff;
1688*758e9fbaSOystein Eftevaag rval = Tss2_Sys_NV_Write( sysContext,
1689*758e9fbaSOystein Eftevaag TPM20_INDEX_PASSWORD_TEST,
1690*758e9fbaSOystein Eftevaag TPM20_INDEX_PASSWORD_TEST,
1691*758e9fbaSOystein Eftevaag &sessionsData, &nvWriteData, 0,
1692*758e9fbaSOystein Eftevaag &sessionsDataOut );
1693*758e9fbaSOystein Eftevaag /*
1694*758e9fbaSOystein Eftevaag * Check that the function failed as expected,
1695*758e9fbaSOystein Eftevaag * since password was incorrect. If wrong
1696*758e9fbaSOystein Eftevaag * response code received, exit.
1697*758e9fbaSOystein Eftevaag */
1698*758e9fbaSOystein Eftevaag CheckFailed( rval,
1699*758e9fbaSOystein Eftevaag TPM2_RC_S + TPM2_RC_1 + TPM2_RC_AUTH_FAIL );
1700*758e9fbaSOystein Eftevaag
1701*758e9fbaSOystein Eftevaag /*
1702*758e9fbaSOystein Eftevaag * Change hmac to null one, since null auth is
1703*758e9fbaSOystein Eftevaag * used to undefine the index.
1704*758e9fbaSOystein Eftevaag */
1705*758e9fbaSOystein Eftevaag sessionsData.auths[0].hmac.size = 0;
1706*758e9fbaSOystein Eftevaag
1707*758e9fbaSOystein Eftevaag /* Now undefine the index. */
1708*758e9fbaSOystein Eftevaag rval = Tss2_Sys_NV_UndefineSpace( sysContext, TPM2_RH_PLATFORM,
1709*758e9fbaSOystein Eftevaag TPM20_INDEX_PASSWORD_TEST, &sessionsData, 0 );
1710*758e9fbaSOystein Eftevaag CheckPassed( rval );
1711*758e9fbaSOystein Eftevaag }
1712*758e9fbaSOystein Eftevaag
GetSetDecryptParamTests()1713*758e9fbaSOystein Eftevaag static void GetSetDecryptParamTests()
1714*758e9fbaSOystein Eftevaag {
1715*758e9fbaSOystein Eftevaag TPM2B_MAX_NV_BUFFER nvWriteData = {4, { 0xde, 0xad, 0xbe, 0xef,} };
1716*758e9fbaSOystein Eftevaag TPM2B_MAX_NV_BUFFER nvWriteData1 = {4, { 0x01, 0x01, 0x02, 0x03,} };
1717*758e9fbaSOystein Eftevaag const uint8_t *decryptParamBuffer;
1718*758e9fbaSOystein Eftevaag size_t decryptParamSize;
1719*758e9fbaSOystein Eftevaag size_t cpBufferUsedSize1, cpBufferUsedSize2;
1720*758e9fbaSOystein Eftevaag const uint8_t *cpBuffer1, *cpBuffer2;
1721*758e9fbaSOystein Eftevaag TSS2_RC rval;
1722*758e9fbaSOystein Eftevaag int i;
1723*758e9fbaSOystein Eftevaag TSS2_SYS_CONTEXT *decryptParamTestSysContext;
1724*758e9fbaSOystein Eftevaag
1725*758e9fbaSOystein Eftevaag LOG_INFO("GET/SET DECRYPT PARAM TESTS:" );
1726*758e9fbaSOystein Eftevaag
1727*758e9fbaSOystein Eftevaag /* Create two sysContext structures. */
1728*758e9fbaSOystein Eftevaag decryptParamTestSysContext = sapi_init_from_tcti_ctx(resMgrTctiContext);
1729*758e9fbaSOystein Eftevaag if (decryptParamTestSysContext == NULL)
1730*758e9fbaSOystein Eftevaag InitSysContextFailure();
1731*758e9fbaSOystein Eftevaag
1732*758e9fbaSOystein Eftevaag /* Test for bad sequence: Tss2_Sys_GetDecryptParam */
1733*758e9fbaSOystein Eftevaag rval = Tss2_Sys_GetDecryptParam( decryptParamTestSysContext, &decryptParamSize, &decryptParamBuffer );
1734*758e9fbaSOystein Eftevaag CheckFailed( rval, TSS2_SYS_RC_BAD_SEQUENCE );
1735*758e9fbaSOystein Eftevaag
1736*758e9fbaSOystein Eftevaag /* Test for bad sequence: Tss2_Sys_SetDecryptParam */
1737*758e9fbaSOystein Eftevaag rval = Tss2_Sys_SetDecryptParam( decryptParamTestSysContext, 4, &( nvWriteData.buffer[0] ) );
1738*758e9fbaSOystein Eftevaag CheckFailed( rval, TSS2_SYS_RC_BAD_SEQUENCE );
1739*758e9fbaSOystein Eftevaag
1740*758e9fbaSOystein Eftevaag /*
1741*758e9fbaSOystein Eftevaag * NOTE: Two tests for BAD_SEQUENCE for GetDecryptParam and
1742*758e9fbaSOystein Eftevaag * SetDecryptParam after ExecuteAsync are in the GetSetEncryptParamTests
1743*758e9fbaSOystein Eftevaag * function, just because it's easier to do this way.
1744*758e9fbaSOystein Eftevaag */
1745*758e9fbaSOystein Eftevaag
1746*758e9fbaSOystein Eftevaag /* Do Prepare. */
1747*758e9fbaSOystein Eftevaag rval = Tss2_Sys_NV_Write_Prepare( decryptParamTestSysContext, TPM20_INDEX_PASSWORD_TEST,
1748*758e9fbaSOystein Eftevaag TPM20_INDEX_PASSWORD_TEST, &nvWriteData1, 0x55aa );
1749*758e9fbaSOystein Eftevaag CheckPassed( rval );
1750*758e9fbaSOystein Eftevaag
1751*758e9fbaSOystein Eftevaag /* Test for bad reference: Tss2_Sys_GetDecryptParam */
1752*758e9fbaSOystein Eftevaag rval = Tss2_Sys_GetDecryptParam( 0, &decryptParamSize, &decryptParamBuffer );
1753*758e9fbaSOystein Eftevaag CheckFailed( rval, TSS2_SYS_RC_BAD_REFERENCE );
1754*758e9fbaSOystein Eftevaag
1755*758e9fbaSOystein Eftevaag rval = Tss2_Sys_GetDecryptParam( decryptParamTestSysContext, 0, &decryptParamBuffer );
1756*758e9fbaSOystein Eftevaag CheckFailed( rval, TSS2_SYS_RC_BAD_REFERENCE );
1757*758e9fbaSOystein Eftevaag
1758*758e9fbaSOystein Eftevaag rval = Tss2_Sys_GetDecryptParam( decryptParamTestSysContext, &decryptParamSize, 0 );
1759*758e9fbaSOystein Eftevaag CheckFailed( rval, TSS2_SYS_RC_BAD_REFERENCE );
1760*758e9fbaSOystein Eftevaag
1761*758e9fbaSOystein Eftevaag
1762*758e9fbaSOystein Eftevaag /* Test for bad reference: Tss2_Sys_SetDecryptParam */
1763*758e9fbaSOystein Eftevaag rval = Tss2_Sys_SetDecryptParam( decryptParamTestSysContext, 4, 0 );
1764*758e9fbaSOystein Eftevaag CheckFailed( rval, TSS2_SYS_RC_BAD_REFERENCE );
1765*758e9fbaSOystein Eftevaag
1766*758e9fbaSOystein Eftevaag rval = Tss2_Sys_SetDecryptParam( 0, 4, 0 );
1767*758e9fbaSOystein Eftevaag CheckFailed( rval, TSS2_SYS_RC_BAD_REFERENCE );
1768*758e9fbaSOystein Eftevaag
1769*758e9fbaSOystein Eftevaag
1770*758e9fbaSOystein Eftevaag /* Test for bad size. */
1771*758e9fbaSOystein Eftevaag rval = Tss2_Sys_SetDecryptParam( decryptParamTestSysContext, 5, &( nvWriteData.buffer[0] ) );
1772*758e9fbaSOystein Eftevaag CheckFailed( rval, TSS2_SYS_RC_BAD_SIZE );
1773*758e9fbaSOystein Eftevaag
1774*758e9fbaSOystein Eftevaag rval = Tss2_Sys_SetDecryptParam( decryptParamTestSysContext, 3, &( nvWriteData.buffer[0] ) );
1775*758e9fbaSOystein Eftevaag CheckFailed( rval, TSS2_SYS_RC_BAD_SIZE );
1776*758e9fbaSOystein Eftevaag
1777*758e9fbaSOystein Eftevaag /* Test for good size. */
1778*758e9fbaSOystein Eftevaag rval = Tss2_Sys_SetDecryptParam( decryptParamTestSysContext, 4, &( nvWriteData.buffer[0] ) );
1779*758e9fbaSOystein Eftevaag CheckPassed( rval );
1780*758e9fbaSOystein Eftevaag
1781*758e9fbaSOystein Eftevaag /* Make sure that the set operation really did the right thing. */
1782*758e9fbaSOystein Eftevaag rval = Tss2_Sys_GetDecryptParam( decryptParamTestSysContext, &decryptParamSize, &decryptParamBuffer );
1783*758e9fbaSOystein Eftevaag CheckPassed( rval );
1784*758e9fbaSOystein Eftevaag for( i = 0; i < 4; i++ )
1785*758e9fbaSOystein Eftevaag {
1786*758e9fbaSOystein Eftevaag if( decryptParamBuffer[i] != nvWriteData.buffer[i] )
1787*758e9fbaSOystein Eftevaag {
1788*758e9fbaSOystein Eftevaag LOG_ERROR("ERROR!! decryptParamBuffer[%d] s/b: %2.2x, was: %2.2x", i, nvWriteData.buffer[i], decryptParamBuffer[i] );
1789*758e9fbaSOystein Eftevaag Cleanup();
1790*758e9fbaSOystein Eftevaag }
1791*758e9fbaSOystein Eftevaag }
1792*758e9fbaSOystein Eftevaag
1793*758e9fbaSOystein Eftevaag rval = Tss2_Sys_GetCpBuffer( decryptParamTestSysContext, &cpBufferUsedSize1, &cpBuffer1 );
1794*758e9fbaSOystein Eftevaag CheckPassed( rval );
1795*758e9fbaSOystein Eftevaag
1796*758e9fbaSOystein Eftevaag LOGBLOB_DEBUG((UINT8 *)cpBuffer1, cpBufferUsedSize1, "cpBuffer = ");
1797*758e9fbaSOystein Eftevaag
1798*758e9fbaSOystein Eftevaag /* Test for no decrypt param. */
1799*758e9fbaSOystein Eftevaag rval = Tss2_Sys_NV_Read_Prepare( decryptParamTestSysContext, TPM20_INDEX_PASSWORD_TEST, TPM20_INDEX_PASSWORD_TEST, sizeof( nvWriteData ) - 2, 0 );
1800*758e9fbaSOystein Eftevaag CheckPassed( rval );
1801*758e9fbaSOystein Eftevaag
1802*758e9fbaSOystein Eftevaag rval = Tss2_Sys_GetDecryptParam( decryptParamTestSysContext, &decryptParamSize, &decryptParamBuffer );
1803*758e9fbaSOystein Eftevaag CheckFailed( rval, TSS2_SYS_RC_NO_DECRYPT_PARAM );
1804*758e9fbaSOystein Eftevaag
1805*758e9fbaSOystein Eftevaag rval = Tss2_Sys_SetDecryptParam( decryptParamTestSysContext, 4, &( nvWriteData.buffer[0] ) );
1806*758e9fbaSOystein Eftevaag CheckFailed( rval, TSS2_SYS_RC_NO_DECRYPT_PARAM );
1807*758e9fbaSOystein Eftevaag
1808*758e9fbaSOystein Eftevaag /* Null decrypt param. */
1809*758e9fbaSOystein Eftevaag rval = Tss2_Sys_NV_Write_Prepare( decryptParamTestSysContext, TPM20_INDEX_PASSWORD_TEST,
1810*758e9fbaSOystein Eftevaag TPM20_INDEX_PASSWORD_TEST, 0, 0x55aa );
1811*758e9fbaSOystein Eftevaag CheckPassed( rval );
1812*758e9fbaSOystein Eftevaag
1813*758e9fbaSOystein Eftevaag rval = Tss2_Sys_GetDecryptParam( decryptParamTestSysContext, &decryptParamSize, &decryptParamBuffer );
1814*758e9fbaSOystein Eftevaag CheckPassed( rval );
1815*758e9fbaSOystein Eftevaag
1816*758e9fbaSOystein Eftevaag /* Check that size == 0. */
1817*758e9fbaSOystein Eftevaag if( decryptParamSize != 0 )
1818*758e9fbaSOystein Eftevaag {
1819*758e9fbaSOystein Eftevaag LOG_ERROR("ERROR!! decryptParamSize s/b: 0, was: %u", (unsigned int)decryptParamSize );
1820*758e9fbaSOystein Eftevaag Cleanup();
1821*758e9fbaSOystein Eftevaag }
1822*758e9fbaSOystein Eftevaag
1823*758e9fbaSOystein Eftevaag /* Test for insufficient size. */
1824*758e9fbaSOystein Eftevaag /* Create a buffer that is too large */
1825*758e9fbaSOystein Eftevaag size_t testBufferSize = TPM2_MAX_COMMAND_SIZE -
1826*758e9fbaSOystein Eftevaag BE_TO_HOST_32(((TPM20_Header_In *)(((_TSS2_SYS_CONTEXT_BLOB *)decryptParamTestSysContext)->cmdBuffer))->commandSize) + 1;
1827*758e9fbaSOystein Eftevaag UINT8 testBuffer [testBufferSize];
1828*758e9fbaSOystein Eftevaag memset(testBuffer, 0, testBufferSize);
1829*758e9fbaSOystein Eftevaag memcpy(testBuffer, nvWriteData.buffer, nvWriteData.size);
1830*758e9fbaSOystein Eftevaag
1831*758e9fbaSOystein Eftevaag rval = Tss2_Sys_GetCpBuffer(decryptParamTestSysContext, &cpBufferUsedSize2, &cpBuffer2);
1832*758e9fbaSOystein Eftevaag CheckPassed(rval);
1833*758e9fbaSOystein Eftevaag rval = Tss2_Sys_SetDecryptParam(decryptParamTestSysContext, testBufferSize,
1834*758e9fbaSOystein Eftevaag testBuffer);
1835*758e9fbaSOystein Eftevaag CheckFailed(rval, TSS2_SYS_RC_INSUFFICIENT_CONTEXT);
1836*758e9fbaSOystein Eftevaag
1837*758e9fbaSOystein Eftevaag /*
1838*758e9fbaSOystein Eftevaag * Test that one less will work.
1839*758e9fbaSOystein Eftevaag * This tests that we're checking the correct corner case.
1840*758e9fbaSOystein Eftevaag */
1841*758e9fbaSOystein Eftevaag testBufferSize -= 1;
1842*758e9fbaSOystein Eftevaag rval = Tss2_Sys_SetDecryptParam(decryptParamTestSysContext, testBufferSize,
1843*758e9fbaSOystein Eftevaag testBuffer);
1844*758e9fbaSOystein Eftevaag CheckPassed(rval);
1845*758e9fbaSOystein Eftevaag
1846*758e9fbaSOystein Eftevaag rval = Tss2_Sys_NV_Write_Prepare( decryptParamTestSysContext, TPM20_INDEX_PASSWORD_TEST,
1847*758e9fbaSOystein Eftevaag TPM20_INDEX_PASSWORD_TEST, 0, 0x55aa );
1848*758e9fbaSOystein Eftevaag CheckPassed( rval );
1849*758e9fbaSOystein Eftevaag
1850*758e9fbaSOystein Eftevaag rval = Tss2_Sys_GetDecryptParam( decryptParamTestSysContext, &decryptParamSize, &decryptParamBuffer );
1851*758e9fbaSOystein Eftevaag CheckPassed( rval );
1852*758e9fbaSOystein Eftevaag
1853*758e9fbaSOystein Eftevaag rval = Tss2_Sys_SetDecryptParam( decryptParamTestSysContext, 4, &( nvWriteData.buffer[0] ) );
1854*758e9fbaSOystein Eftevaag CheckPassed( rval );
1855*758e9fbaSOystein Eftevaag
1856*758e9fbaSOystein Eftevaag rval = Tss2_Sys_GetCpBuffer( decryptParamTestSysContext, &cpBufferUsedSize2, &cpBuffer2 );
1857*758e9fbaSOystein Eftevaag CheckPassed( rval );
1858*758e9fbaSOystein Eftevaag
1859*758e9fbaSOystein Eftevaag LOGBLOB_INFO((UINT8 *)cpBuffer2, cpBufferUsedSize2, "cpBuffer = ");
1860*758e9fbaSOystein Eftevaag
1861*758e9fbaSOystein Eftevaag if( cpBufferUsedSize1 != cpBufferUsedSize2 )
1862*758e9fbaSOystein Eftevaag {
1863*758e9fbaSOystein Eftevaag LOG_ERROR("ERROR!! cpBufferUsedSize1(%x) != cpBufferUsedSize2(%x)", (UINT32)cpBufferUsedSize1, (UINT32)cpBufferUsedSize2 );
1864*758e9fbaSOystein Eftevaag Cleanup();
1865*758e9fbaSOystein Eftevaag }
1866*758e9fbaSOystein Eftevaag for( i = 0; i < (int)cpBufferUsedSize1; i++ )
1867*758e9fbaSOystein Eftevaag {
1868*758e9fbaSOystein Eftevaag if( cpBuffer1[i] != cpBuffer2[i] )
1869*758e9fbaSOystein Eftevaag {
1870*758e9fbaSOystein Eftevaag LOG_ERROR("ERROR!! cpBufferUsedSize1[%d] s/b: %2.2x, was: %2.2x", i, cpBuffer1[i], cpBuffer2[i] );
1871*758e9fbaSOystein Eftevaag Cleanup();
1872*758e9fbaSOystein Eftevaag }
1873*758e9fbaSOystein Eftevaag }
1874*758e9fbaSOystein Eftevaag
1875*758e9fbaSOystein Eftevaag /* Test case of zero sized decrypt param, another case of bad size. */
1876*758e9fbaSOystein Eftevaag nvWriteData1.size = 0;
1877*758e9fbaSOystein Eftevaag rval = Tss2_Sys_NV_Write_Prepare( decryptParamTestSysContext, TPM20_INDEX_PASSWORD_TEST,
1878*758e9fbaSOystein Eftevaag TPM20_INDEX_PASSWORD_TEST, &nvWriteData1, 0x55aa );
1879*758e9fbaSOystein Eftevaag CheckPassed( rval );
1880*758e9fbaSOystein Eftevaag
1881*758e9fbaSOystein Eftevaag rval = Tss2_Sys_SetDecryptParam( decryptParamTestSysContext, 1, &( nvWriteData.buffer[0] ) );
1882*758e9fbaSOystein Eftevaag CheckFailed( rval, TSS2_SYS_RC_BAD_SIZE );
1883*758e9fbaSOystein Eftevaag
1884*758e9fbaSOystein Eftevaag sapi_teardown(decryptParamTestSysContext);
1885*758e9fbaSOystein Eftevaag }
1886*758e9fbaSOystein Eftevaag
SysFinalizeTests()1887*758e9fbaSOystein Eftevaag static void SysFinalizeTests()
1888*758e9fbaSOystein Eftevaag {
1889*758e9fbaSOystein Eftevaag LOG_INFO("SYS FINALIZE TESTS:" );
1890*758e9fbaSOystein Eftevaag
1891*758e9fbaSOystein Eftevaag Tss2_Sys_Finalize( 0 );
1892*758e9fbaSOystein Eftevaag
1893*758e9fbaSOystein Eftevaag /* Note: other cases tested by other tests. */
1894*758e9fbaSOystein Eftevaag }
1895*758e9fbaSOystein Eftevaag
GetContextSizeTests()1896*758e9fbaSOystein Eftevaag static void GetContextSizeTests()
1897*758e9fbaSOystein Eftevaag {
1898*758e9fbaSOystein Eftevaag TSS2_RC rval = TSS2_RC_SUCCESS;
1899*758e9fbaSOystein Eftevaag TSS2_SYS_CONTEXT *testSysContext;
1900*758e9fbaSOystein Eftevaag
1901*758e9fbaSOystein Eftevaag LOG_INFO("SYS GETCONTEXTSIZE TESTS:" );
1902*758e9fbaSOystein Eftevaag
1903*758e9fbaSOystein Eftevaag testSysContext = sapi_init_from_tcti_ctx(resMgrTctiContext);
1904*758e9fbaSOystein Eftevaag if (testSysContext == NULL)
1905*758e9fbaSOystein Eftevaag InitSysContextFailure();
1906*758e9fbaSOystein Eftevaag
1907*758e9fbaSOystein Eftevaag rval = Tss2_Sys_Startup(testSysContext, TPM2_SU_CLEAR);
1908*758e9fbaSOystein Eftevaag CheckPassed(rval);
1909*758e9fbaSOystein Eftevaag
1910*758e9fbaSOystein Eftevaag rval = Tss2_Sys_GetTestResult_Prepare(testSysContext);
1911*758e9fbaSOystein Eftevaag CheckPassed(rval);
1912*758e9fbaSOystein Eftevaag
1913*758e9fbaSOystein Eftevaag sapi_teardown(testSysContext);
1914*758e9fbaSOystein Eftevaag }
1915*758e9fbaSOystein Eftevaag
GetTctiContextTests()1916*758e9fbaSOystein Eftevaag static void GetTctiContextTests()
1917*758e9fbaSOystein Eftevaag {
1918*758e9fbaSOystein Eftevaag TSS2_RC rval = TSS2_RC_SUCCESS;
1919*758e9fbaSOystein Eftevaag TSS2_SYS_CONTEXT *testSysContext;
1920*758e9fbaSOystein Eftevaag TSS2_TCTI_CONTEXT *tctiContext;
1921*758e9fbaSOystein Eftevaag
1922*758e9fbaSOystein Eftevaag LOG_INFO("SYS GETTCTICONTEXT TESTS:" );
1923*758e9fbaSOystein Eftevaag
1924*758e9fbaSOystein Eftevaag testSysContext = sapi_init_from_tcti_ctx(resMgrTctiContext);
1925*758e9fbaSOystein Eftevaag if (testSysContext == NULL)
1926*758e9fbaSOystein Eftevaag InitSysContextFailure();
1927*758e9fbaSOystein Eftevaag
1928*758e9fbaSOystein Eftevaag rval = Tss2_Sys_GetTctiContext(testSysContext, 0);
1929*758e9fbaSOystein Eftevaag CheckFailed(rval, TSS2_SYS_RC_BAD_REFERENCE);
1930*758e9fbaSOystein Eftevaag
1931*758e9fbaSOystein Eftevaag rval = Tss2_Sys_GetTctiContext(0, &tctiContext);
1932*758e9fbaSOystein Eftevaag CheckFailed(rval, TSS2_SYS_RC_BAD_REFERENCE);
1933*758e9fbaSOystein Eftevaag
1934*758e9fbaSOystein Eftevaag sapi_teardown(testSysContext);
1935*758e9fbaSOystein Eftevaag }
1936*758e9fbaSOystein Eftevaag
GetSetEncryptParamTests()1937*758e9fbaSOystein Eftevaag static void GetSetEncryptParamTests()
1938*758e9fbaSOystein Eftevaag {
1939*758e9fbaSOystein Eftevaag TPM2B_MAX_NV_BUFFER nvWriteData = {4, { 0xde, 0xad, 0xbe, 0xef,} };
1940*758e9fbaSOystein Eftevaag const uint8_t *encryptParamBuffer;
1941*758e9fbaSOystein Eftevaag const uint8_t encryptParamBuffer1[4] = { 01, 02, 03, 04 };
1942*758e9fbaSOystein Eftevaag size_t encryptParamSize;
1943*758e9fbaSOystein Eftevaag TSS2_RC rval;
1944*758e9fbaSOystein Eftevaag int i;
1945*758e9fbaSOystein Eftevaag TPM2B_DIGEST authPolicy;
1946*758e9fbaSOystein Eftevaag TPMA_NV nvAttributes;
1947*758e9fbaSOystein Eftevaag TPM2B_AUTH nvAuth;
1948*758e9fbaSOystein Eftevaag
1949*758e9fbaSOystein Eftevaag TSS2L_SYS_AUTH_RESPONSE sessionsDataOut;
1950*758e9fbaSOystein Eftevaag TSS2L_SYS_AUTH_COMMAND sessionsData = { .count = 1, .auths= {{
1951*758e9fbaSOystein Eftevaag .sessionHandle = TPM2_RS_PW }}};
1952*758e9fbaSOystein Eftevaag
1953*758e9fbaSOystein Eftevaag TPM2B_MAX_NV_BUFFER nvReadData;
1954*758e9fbaSOystein Eftevaag const uint8_t *cpBuffer;
1955*758e9fbaSOystein Eftevaag _TSS2_SYS_CONTEXT_BLOB *ctx = syscontext_cast(sysContext);
1956*758e9fbaSOystein Eftevaag
1957*758e9fbaSOystein Eftevaag LOG_INFO("GET/SET ENCRYPT PARAM TESTS:" );
1958*758e9fbaSOystein Eftevaag
1959*758e9fbaSOystein Eftevaag /* Do Prepare. */
1960*758e9fbaSOystein Eftevaag rval = Tss2_Sys_NV_Read_Prepare( sysContext, TPM20_INDEX_PASSWORD_TEST,
1961*758e9fbaSOystein Eftevaag TPM20_INDEX_PASSWORD_TEST, 0, 0 );
1962*758e9fbaSOystein Eftevaag CheckPassed( rval ); /* #1 */
1963*758e9fbaSOystein Eftevaag
1964*758e9fbaSOystein Eftevaag resp_header_from_cxt(ctx)->tag = TPM2_ST_SESSIONS;
1965*758e9fbaSOystein Eftevaag
1966*758e9fbaSOystein Eftevaag /* Test for bad sequence */
1967*758e9fbaSOystein Eftevaag rval = Tss2_Sys_GetEncryptParam( sysContext, &encryptParamSize, &encryptParamBuffer );
1968*758e9fbaSOystein Eftevaag CheckFailed( rval, TSS2_SYS_RC_BAD_SEQUENCE ); /* #2 */
1969*758e9fbaSOystein Eftevaag
1970*758e9fbaSOystein Eftevaag rval = Tss2_Sys_SetEncryptParam( sysContext, 4, &( nvWriteData.buffer[0] ) );
1971*758e9fbaSOystein Eftevaag CheckFailed( rval, TSS2_SYS_RC_BAD_SEQUENCE ); /* #3 */
1972*758e9fbaSOystein Eftevaag
1973*758e9fbaSOystein Eftevaag /* Create NV index */
1974*758e9fbaSOystein Eftevaag
1975*758e9fbaSOystein Eftevaag /* Set empty policy and auth value. */
1976*758e9fbaSOystein Eftevaag authPolicy.size = 0;
1977*758e9fbaSOystein Eftevaag nvAuth.size = 0;
1978*758e9fbaSOystein Eftevaag
1979*758e9fbaSOystein Eftevaag /* Now set the attributes. */
1980*758e9fbaSOystein Eftevaag *(UINT32 *)( (void *)&nvAttributes ) = 0;
1981*758e9fbaSOystein Eftevaag nvAttributes |= TPMA_NV_AUTHREAD;
1982*758e9fbaSOystein Eftevaag nvAttributes |= TPMA_NV_AUTHWRITE;
1983*758e9fbaSOystein Eftevaag nvAttributes |= TPMA_NV_PLATFORMCREATE;
1984*758e9fbaSOystein Eftevaag
1985*758e9fbaSOystein Eftevaag rval = DefineNvIndex( sysContext, TPM2_RH_PLATFORM, &nvAuth, &authPolicy,
1986*758e9fbaSOystein Eftevaag TPM20_INDEX_PASSWORD_TEST, TPM2_ALG_SHA1, nvAttributes, 32 );
1987*758e9fbaSOystein Eftevaag CheckPassed( rval ); /* #4 */
1988*758e9fbaSOystein Eftevaag
1989*758e9fbaSOystein Eftevaag /* Write the index. */
1990*758e9fbaSOystein Eftevaag retry:
1991*758e9fbaSOystein Eftevaag rval = Tss2_Sys_NV_Write_Prepare( sysContext, TPM20_INDEX_PASSWORD_TEST,
1992*758e9fbaSOystein Eftevaag TPM20_INDEX_PASSWORD_TEST, &nvWriteData, 0 );
1993*758e9fbaSOystein Eftevaag CheckPassed( rval ); /* #5 */
1994*758e9fbaSOystein Eftevaag
1995*758e9fbaSOystein Eftevaag /* NOTE: add GetCpBuffer tests here, just because it's easier. */
1996*758e9fbaSOystein Eftevaag rval = Tss2_Sys_GetCpBuffer( 0, (size_t *)4, (const uint8_t **)4 );
1997*758e9fbaSOystein Eftevaag CheckFailed( rval, TSS2_SYS_RC_BAD_REFERENCE ); /* #6 */
1998*758e9fbaSOystein Eftevaag
1999*758e9fbaSOystein Eftevaag rval = Tss2_Sys_GetCpBuffer( sysContext, (size_t *)0, (const uint8_t **)4 );
2000*758e9fbaSOystein Eftevaag CheckFailed( rval, TSS2_SYS_RC_BAD_REFERENCE ); /* #7 */
2001*758e9fbaSOystein Eftevaag
2002*758e9fbaSOystein Eftevaag rval = Tss2_Sys_GetCpBuffer( sysContext, (size_t *)4, (const uint8_t **)0 );
2003*758e9fbaSOystein Eftevaag CheckFailed( rval, TSS2_SYS_RC_BAD_REFERENCE ); /* #8 */
2004*758e9fbaSOystein Eftevaag
2005*758e9fbaSOystein Eftevaag
2006*758e9fbaSOystein Eftevaag rval = Tss2_Sys_SetCmdAuths( sysContext, &sessionsData );
2007*758e9fbaSOystein Eftevaag CheckPassed( rval ); /* #9 */
2008*758e9fbaSOystein Eftevaag
2009*758e9fbaSOystein Eftevaag rval = Tss2_Sys_ExecuteAsync( sysContext );
2010*758e9fbaSOystein Eftevaag CheckPassed( rval ); /* #10 */
2011*758e9fbaSOystein Eftevaag
2012*758e9fbaSOystein Eftevaag /*
2013*758e9fbaSOystein Eftevaag * NOTE: Stick two tests for BAD_SEQUENCE for GetDecryptParam and
2014*758e9fbaSOystein Eftevaag * SetDecryptParam here, just because it's easier to do this way.
2015*758e9fbaSOystein Eftevaag */
2016*758e9fbaSOystein Eftevaag rval = Tss2_Sys_GetDecryptParam( sysContext, (size_t *)4, (const uint8_t **)4 );
2017*758e9fbaSOystein Eftevaag CheckFailed( rval, TSS2_SYS_RC_BAD_SEQUENCE ); /* #11 */
2018*758e9fbaSOystein Eftevaag
2019*758e9fbaSOystein Eftevaag rval = Tss2_Sys_SetDecryptParam( sysContext, 10, (uint8_t *)4 );
2020*758e9fbaSOystein Eftevaag CheckFailed( rval, TSS2_SYS_RC_BAD_SEQUENCE ); /* #12 */
2021*758e9fbaSOystein Eftevaag
2022*758e9fbaSOystein Eftevaag /*
2023*758e9fbaSOystein Eftevaag * NOTE: Stick test for BAD_SEQUENCE for GetCpBuffer here, just
2024*758e9fbaSOystein Eftevaag * because it's easier to do this way.
2025*758e9fbaSOystein Eftevaag */
2026*758e9fbaSOystein Eftevaag rval = Tss2_Sys_GetCpBuffer( sysContext, (size_t *)4, &cpBuffer );
2027*758e9fbaSOystein Eftevaag CheckFailed( rval, TSS2_SYS_RC_BAD_SEQUENCE ); /* #13 */
2028*758e9fbaSOystein Eftevaag
2029*758e9fbaSOystein Eftevaag /*
2030*758e9fbaSOystein Eftevaag * Now finish the write command so that TPM isn't stuck trying
2031*758e9fbaSOystein Eftevaag * to send a response.
2032*758e9fbaSOystein Eftevaag */
2033*758e9fbaSOystein Eftevaag rval = Tss2_Sys_ExecuteFinish( sysContext, -1 );
2034*758e9fbaSOystein Eftevaag if (rval == TPM2_RC_RETRY) {
2035*758e9fbaSOystein Eftevaag LOG_INFO ("got TPM2_RC_RETRY, trying again");
2036*758e9fbaSOystein Eftevaag goto retry;
2037*758e9fbaSOystein Eftevaag }
2038*758e9fbaSOystein Eftevaag CheckPassed( rval ); /* #14 */
2039*758e9fbaSOystein Eftevaag
2040*758e9fbaSOystein Eftevaag /* Test GetEncryptParam for no encrypt param case. */
2041*758e9fbaSOystein Eftevaag rval = Tss2_Sys_GetEncryptParam( sysContext, &encryptParamSize, &encryptParamBuffer );
2042*758e9fbaSOystein Eftevaag CheckFailed( rval, TSS2_SYS_RC_NO_ENCRYPT_PARAM ); /* #15 */
2043*758e9fbaSOystein Eftevaag
2044*758e9fbaSOystein Eftevaag /* Test SetEncryptParam for no encrypt param case. */
2045*758e9fbaSOystein Eftevaag rval = Tss2_Sys_SetEncryptParam( sysContext, encryptParamSize, encryptParamBuffer1 );
2046*758e9fbaSOystein Eftevaag CheckFailed( rval, TSS2_SYS_RC_NO_ENCRYPT_PARAM ); /* #16 */
2047*758e9fbaSOystein Eftevaag
2048*758e9fbaSOystein Eftevaag /* Now read it and do tests on get/set encrypt functions */
2049*758e9fbaSOystein Eftevaag rval = Tss2_Sys_NV_Read_Prepare( sysContext, TPM20_INDEX_PASSWORD_TEST, TPM20_INDEX_PASSWORD_TEST, 4, 0 );
2050*758e9fbaSOystein Eftevaag CheckPassed( rval ); /* #17 */
2051*758e9fbaSOystein Eftevaag
2052*758e9fbaSOystein Eftevaag INIT_SIMPLE_TPM2B_SIZE( nvReadData );
2053*758e9fbaSOystein Eftevaag rval = Tss2_Sys_NV_Read( sysContext, TPM20_INDEX_PASSWORD_TEST,
2054*758e9fbaSOystein Eftevaag TPM20_INDEX_PASSWORD_TEST, &sessionsData, 4, 0, &nvReadData, &sessionsDataOut );
2055*758e9fbaSOystein Eftevaag CheckPassed( rval ); /* #18 */
2056*758e9fbaSOystein Eftevaag
2057*758e9fbaSOystein Eftevaag rval = Tss2_Sys_GetEncryptParam( sysContext, &encryptParamSize, &encryptParamBuffer );
2058*758e9fbaSOystein Eftevaag CheckPassed( rval ); /* #19 */
2059*758e9fbaSOystein Eftevaag
2060*758e9fbaSOystein Eftevaag /* Test case of encryptParamSize being too small. */
2061*758e9fbaSOystein Eftevaag encryptParamSize--;
2062*758e9fbaSOystein Eftevaag rval = Tss2_Sys_SetEncryptParam( sysContext, encryptParamSize, encryptParamBuffer1 );
2063*758e9fbaSOystein Eftevaag CheckFailed( rval, TSS2_SYS_RC_BAD_SIZE ); /* #20 */
2064*758e9fbaSOystein Eftevaag encryptParamSize += 2;
2065*758e9fbaSOystein Eftevaag
2066*758e9fbaSOystein Eftevaag /* Size too large... */
2067*758e9fbaSOystein Eftevaag rval = Tss2_Sys_SetEncryptParam( sysContext, encryptParamSize, encryptParamBuffer1 );
2068*758e9fbaSOystein Eftevaag CheckFailed( rval, TSS2_SYS_RC_BAD_SIZE ); /* #21 */
2069*758e9fbaSOystein Eftevaag
2070*758e9fbaSOystein Eftevaag encryptParamSize--;
2071*758e9fbaSOystein Eftevaag rval = Tss2_Sys_SetEncryptParam( sysContext, encryptParamSize, encryptParamBuffer1 );
2072*758e9fbaSOystein Eftevaag CheckPassed( rval ); /* #22 */
2073*758e9fbaSOystein Eftevaag
2074*758e9fbaSOystein Eftevaag rval = Tss2_Sys_GetEncryptParam( sysContext, &encryptParamSize, &encryptParamBuffer );
2075*758e9fbaSOystein Eftevaag CheckPassed( rval ); /* #23 */
2076*758e9fbaSOystein Eftevaag
2077*758e9fbaSOystein Eftevaag /* Test that encryptParamBuffer is the same as encryptParamBuffer1 */
2078*758e9fbaSOystein Eftevaag for( i = 0; i < 4; i++ )
2079*758e9fbaSOystein Eftevaag {
2080*758e9fbaSOystein Eftevaag if( encryptParamBuffer[i] != encryptParamBuffer1[i] )
2081*758e9fbaSOystein Eftevaag {
2082*758e9fbaSOystein Eftevaag LOG_ERROR("ERROR!! encryptParamBuffer[%d] s/b: %2.2x, was: %2.2x", i, encryptParamBuffer[i], encryptParamBuffer1[i] );
2083*758e9fbaSOystein Eftevaag Cleanup();
2084*758e9fbaSOystein Eftevaag }
2085*758e9fbaSOystein Eftevaag }
2086*758e9fbaSOystein Eftevaag
2087*758e9fbaSOystein Eftevaag rval = Tss2_Sys_NV_UndefineSpace( sysContext, TPM2_RH_PLATFORM, TPM20_INDEX_PASSWORD_TEST, &sessionsData, 0 );
2088*758e9fbaSOystein Eftevaag CheckPassed( rval ); /* #24 */
2089*758e9fbaSOystein Eftevaag
2090*758e9fbaSOystein Eftevaag
2091*758e9fbaSOystein Eftevaag /* Test for bad reference */
2092*758e9fbaSOystein Eftevaag rval = Tss2_Sys_GetEncryptParam( 0, &encryptParamSize, &encryptParamBuffer );
2093*758e9fbaSOystein Eftevaag CheckFailed( rval, TSS2_SYS_RC_BAD_REFERENCE ); /* #25 */
2094*758e9fbaSOystein Eftevaag
2095*758e9fbaSOystein Eftevaag rval = Tss2_Sys_GetEncryptParam( sysContext, 0, &encryptParamBuffer );
2096*758e9fbaSOystein Eftevaag CheckFailed( rval, TSS2_SYS_RC_BAD_REFERENCE ); /* #26 */
2097*758e9fbaSOystein Eftevaag
2098*758e9fbaSOystein Eftevaag rval = Tss2_Sys_GetEncryptParam( sysContext, &encryptParamSize, 0 );
2099*758e9fbaSOystein Eftevaag CheckFailed( rval, TSS2_SYS_RC_BAD_REFERENCE ); /* #27 */
2100*758e9fbaSOystein Eftevaag
2101*758e9fbaSOystein Eftevaag rval = Tss2_Sys_SetEncryptParam( sysContext, 4, 0 );
2102*758e9fbaSOystein Eftevaag CheckFailed( rval, TSS2_SYS_RC_BAD_REFERENCE ); /* #28 */
2103*758e9fbaSOystein Eftevaag
2104*758e9fbaSOystein Eftevaag rval = Tss2_Sys_SetEncryptParam( 0, 4, encryptParamBuffer );
2105*758e9fbaSOystein Eftevaag CheckFailed( rval, TSS2_SYS_RC_BAD_REFERENCE ); /* #29 */
2106*758e9fbaSOystein Eftevaag }
2107*758e9fbaSOystein Eftevaag
EcEphemeralTest()2108*758e9fbaSOystein Eftevaag static void EcEphemeralTest()
2109*758e9fbaSOystein Eftevaag {
2110*758e9fbaSOystein Eftevaag TSS2_RC rval = TSS2_RC_SUCCESS;
2111*758e9fbaSOystein Eftevaag TPM2B_ECC_POINT Q;
2112*758e9fbaSOystein Eftevaag UINT16 counter;
2113*758e9fbaSOystein Eftevaag
2114*758e9fbaSOystein Eftevaag LOG_INFO("EC Ephemeral TESTS:" );
2115*758e9fbaSOystein Eftevaag
2116*758e9fbaSOystein Eftevaag /* Test SAPI for case of Q size field not being set to 0. */
2117*758e9fbaSOystein Eftevaag INIT_SIMPLE_TPM2B_SIZE( Q );
2118*758e9fbaSOystein Eftevaag rval = Tss2_Sys_EC_Ephemeral( sysContext, 0, TPM2_ECC_BN_P256, &Q, &counter, 0 );
2119*758e9fbaSOystein Eftevaag CheckFailed( rval, TSS2_SYS_RC_BAD_VALUE );
2120*758e9fbaSOystein Eftevaag
2121*758e9fbaSOystein Eftevaag Q.size = 0;
2122*758e9fbaSOystein Eftevaag rval = Tss2_Sys_EC_Ephemeral( sysContext, 0, TPM2_ECC_BN_P256, &Q, &counter, 0 );
2123*758e9fbaSOystein Eftevaag CheckPassed( rval );
2124*758e9fbaSOystein Eftevaag }
2125*758e9fbaSOystein Eftevaag
2126*758e9fbaSOystein Eftevaag int
test_invoke(TSS2_SYS_CONTEXT * sapi_context)2127*758e9fbaSOystein Eftevaag test_invoke (TSS2_SYS_CONTEXT *sapi_context)
2128*758e9fbaSOystein Eftevaag {
2129*758e9fbaSOystein Eftevaag TSS2_RC rval = TSS2_RC_SUCCESS;
2130*758e9fbaSOystein Eftevaag
2131*758e9fbaSOystein Eftevaag sysContext = sapi_context;
2132*758e9fbaSOystein Eftevaag rval = Tss2_Sys_GetTctiContext (sapi_context, &resMgrTctiContext);
2133*758e9fbaSOystein Eftevaag if (rval != TSS2_RC_SUCCESS) {
2134*758e9fbaSOystein Eftevaag printf ("Failed to get TCTI context from sapi_context: 0x%" PRIx32
2135*758e9fbaSOystein Eftevaag "\n", rval);
2136*758e9fbaSOystein Eftevaag return 1;
2137*758e9fbaSOystein Eftevaag }
2138*758e9fbaSOystein Eftevaag
2139*758e9fbaSOystein Eftevaag nullSessionsData.auths[0].sessionHandle = TPM2_RS_PW;
2140*758e9fbaSOystein Eftevaag nullSessionsDataOut.count = 1;
2141*758e9fbaSOystein Eftevaag nullSessionsDataOut.auths[0].nonce = nullSessionNonceOut;
2142*758e9fbaSOystein Eftevaag nullSessionsDataOut.auths[0].hmac = nullSessionHmac;
2143*758e9fbaSOystein Eftevaag nullSessionNonceOut.size = 0;
2144*758e9fbaSOystein Eftevaag nullSessionNonce.size = 0;
2145*758e9fbaSOystein Eftevaag
2146*758e9fbaSOystein Eftevaag rval = tcti_platform_command( resMgrTctiContext, MS_SIM_POWER_OFF );
2147*758e9fbaSOystein Eftevaag CheckPassed(rval);
2148*758e9fbaSOystein Eftevaag
2149*758e9fbaSOystein Eftevaag rval = tcti_platform_command( resMgrTctiContext, MS_SIM_POWER_ON );
2150*758e9fbaSOystein Eftevaag CheckPassed(rval);
2151*758e9fbaSOystein Eftevaag
2152*758e9fbaSOystein Eftevaag SysFinalizeTests();
2153*758e9fbaSOystein Eftevaag
2154*758e9fbaSOystein Eftevaag GetContextSizeTests();
2155*758e9fbaSOystein Eftevaag
2156*758e9fbaSOystein Eftevaag GetTctiContextTests();
2157*758e9fbaSOystein Eftevaag
2158*758e9fbaSOystein Eftevaag GetSetDecryptParamTests();
2159*758e9fbaSOystein Eftevaag
2160*758e9fbaSOystein Eftevaag TestTpmStartup();
2161*758e9fbaSOystein Eftevaag
2162*758e9fbaSOystein Eftevaag /*
2163*758e9fbaSOystein Eftevaag * Run this directly after Startup tests to test for
2164*758e9fbaSOystein Eftevaag * a resource mgr corner case with SaveContext.
2165*758e9fbaSOystein Eftevaag */
2166*758e9fbaSOystein Eftevaag TestStartAuthSession();
2167*758e9fbaSOystein Eftevaag /* Clear DA lockout. */
2168*758e9fbaSOystein Eftevaag TestDictionaryAttackLockReset();
2169*758e9fbaSOystein Eftevaag TestDictionaryAttackLockReset();
2170*758e9fbaSOystein Eftevaag TestHierarchyControl();
2171*758e9fbaSOystein Eftevaag GetSetEncryptParamTests();
2172*758e9fbaSOystein Eftevaag TestTpmGetCapability();
2173*758e9fbaSOystein Eftevaag TestPcrExtend();
2174*758e9fbaSOystein Eftevaag TestHash();
2175*758e9fbaSOystein Eftevaag TestPolicy();
2176*758e9fbaSOystein Eftevaag TestTpmClear();
2177*758e9fbaSOystein Eftevaag TestChangeEps();
2178*758e9fbaSOystein Eftevaag TestChangePps();
2179*758e9fbaSOystein Eftevaag TestHierarchyChangeAuth();
2180*758e9fbaSOystein Eftevaag TestShutdown();
2181*758e9fbaSOystein Eftevaag TestNV();
2182*758e9fbaSOystein Eftevaag PasswordTest();
2183*758e9fbaSOystein Eftevaag TestQuote();
2184*758e9fbaSOystein Eftevaag TestDictionaryAttackLockReset();
2185*758e9fbaSOystein Eftevaag TestPcrAllocate();
2186*758e9fbaSOystein Eftevaag TestUnseal();
2187*758e9fbaSOystein Eftevaag EcEphemeralTest();
2188*758e9fbaSOystein Eftevaag return 0;
2189*758e9fbaSOystein Eftevaag }
2190