xref: /aosp_15_r20/external/tpm2-tss/test/tpmclient/tpmclient.int.c (revision 758e9fba6fc9adbf15340f70c73baee7b168b1c9)
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,  &quoted, &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