blob: e468d2fb2480a025f2af81b36d4bd163035eca8f [file] [log] [blame]
Will Arthur54e04e42015-07-15 11:29:25 -04001//**********************************************************************;
2// Copyright (c) 2015, Intel Corporation
3// All rights reserved.
Philip Tricca1ea84a52015-11-19 18:07:06 -08004//
5// Redistribution and use in source and binary forms, with or without
Will Arthur54e04e42015-07-15 11:29:25 -04006// modification, are permitted provided that the following conditions are met:
Philip Tricca1ea84a52015-11-19 18:07:06 -08007//
8// 1. Redistributions of source code must retain the above copyright notice,
Will Arthur54e04e42015-07-15 11:29:25 -04009// this list of conditions and the following disclaimer.
Philip Tricca1ea84a52015-11-19 18:07:06 -080010//
11// 2. Redistributions in binary form must reproduce the above copyright notice,
12// this list of conditions and the following disclaimer in the documentation
Will Arthur54e04e42015-07-15 11:29:25 -040013// and/or other materials provided with the distribution.
Philip Tricca1ea84a52015-11-19 18:07:06 -080014//
15// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
16// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
17// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
18// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
19// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
20// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
21// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
22// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
23// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
24// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
Will Arthur54e04e42015-07-15 11:29:25 -040025// THE POSSIBILITY OF SUCH DAMAGE.
26//**********************************************************************;
27
28//
29// tpmclient.cpp : Defines the entry point for the console test application.
30//
31
32#ifdef _WIN32
33#include "stdafx.h"
34#else
35#include <stdarg.h>
36#endif
37
38#ifndef UNICODE
39#define UNICODE 1
40#endif
41
42#ifdef _WIN32
43// link with Ws2_32.lib
44#pragma comment(lib,"Ws2_32.lib")
45
46#include <winsock2.h>
47#include <ws2tcpip.h>
48#else
49#define sprintf_s snprintf
50#define sscanf_s sscanf
51#endif
52
53#include <stdio.h>
54#include <stdlib.h> // Needed for _wtoi
55#include <string.h>
56
57#include "tpm20.h"
58#include "sample.h"
59#include "resourcemgr.h"
60#include "tpmclient.h"
wcarthur02340012015-10-28 08:32:42 -040061
62// This is done to allow the tests to access fields
63// in the sysContext structure that are needed for
64// special test cases.
65//
66// ATTENTION: Normal applications should NEVER do this!!
67//
Will Arthur54e04e42015-07-15 11:29:25 -040068#include "tss2_sysapi_util.h"
wcarthur02340012015-10-28 08:32:42 -040069
Will Arthur54e04e42015-07-15 11:29:25 -040070#include "tpmsockets.h"
71#include "syscontext.h"
Will Arthurca8e7f32015-08-03 15:35:19 -040072#include "debug.h"
Will-nuc8619aca2015-12-10 17:20:26 -050073#include "localtpm.h"
Will Arthur54e04e42015-07-15 11:29:25 -040074
Philip Tricca1ea84a52015-11-19 18:07:06 -080075//
Will Arthur54e04e42015-07-15 11:29:25 -040076// TPM indices and sizes
Philip Tricca1ea84a52015-11-19 18:07:06 -080077//
Will Arthur54e04e42015-07-15 11:29:25 -040078#define NV_AUX_INDEX_SIZE 96
79#define NV_PS_INDEX_SIZE 34
80#define NV_PO_INDEX_SIZE 34
81
82#define INDEX_AUX 0x01800003 // NV Storage
83#define INDEX_LCP_OWN 0x01400001 // Launch Policy Owner
84#define INDEX_LCP_SUP 0x01800001 // Launch Policy Default (Supplier)
85#define TPM20_INDEX_TEST1 0x01500015
86#define TPM20_INDEX_TEST2 0x01500016
87#define TPM20_INDEX_PASSWORD_TEST 0x01500020
88
89
90#define SET_PCR_SELECT_BIT( pcrSelection, pcr ) \
91 (pcrSelection).pcrSelect[( (pcr)/8 )] |= ( 1 << ( (pcr) % 8) );
92
93#define CLEAR_PCR_SELECT_BITS( pcrSelection ) \
94 (pcrSelection).pcrSelect[0] = 0; \
95 (pcrSelection).pcrSelect[1] = 0; \
96 (pcrSelection).pcrSelect[2] = 0;
97
98#define SET_PCR_SELECT_SIZE( pcrSelection, size ) \
99 (pcrSelection).sizeofSelect = size;
100
101char outFileName[200] = "";
102
103TPM_CC currentCommandCode;
104TPM_CC *currentCommandCodePtr = &currentCommandCode;
105
106#define errorStringSize 200
107char errorString[errorStringSize];
108
Will Arthurca8e7f32015-08-03 15:35:19 -0400109UINT8 simulator = 1;
110
wcarthur007a1a92015-12-11 08:06:59 -0500111#if __linux || __unix
Will-nuc8619aca2015-12-10 17:20:26 -0500112UINT8 testLocalTcti = 0;
wcarthur007a1a92015-12-11 08:06:59 -0500113#endif
Will Arthur54e04e42015-07-15 11:29:25 -0400114
115UINT32 tpmMaxResponseLen = TPMBUF_LEN;
116
Will-nuc8619aca2015-12-10 17:20:26 -0500117UINT8 resMgrInitialized = 0;
118
Will Arthur54e04e42015-07-15 11:29:25 -0400119UINT8 pcrAfterExtend[20];
120TPM_HANDLE loadedRsaKeyHandle;
121TPM_HANDLE loadedSha1KeyHandle;
122
123TPM2B_AUTH loadedSha1KeyAuth;
124
125TPM_HANDLE handle1024, handle2048sha1, handle2048rsa;
126
127UINT32 passCount = 1;
128UINT32 demoDelay = 0;
129int debugLevel = 0;
Will Arthur54e04e42015-07-15 11:29:25 -0400130UINT8 indent = 0;
131
132TSS2_SYS_CONTEXT *sysContext;
133
134#define rmInterfaceConfigSize 250
135char rmInterfaceConfig[rmInterfaceConfigSize];
136
Will Arthurca8e7f32015-08-03 15:35:19 -0400137TSS2_TCTI_DRIVER_INFO resMgrInterfaceInfo = { "resMgr", "", InitSocketsTcti, TeardownSocketsTcti };
Will Arthur54e04e42015-07-15 11:29:25 -0400138
139TSS2_TCTI_CONTEXT *resMgrTctiContext = 0;
140TSS2_ABI_VERSION abiVersion = { TSSWG_INTEROP, TSS_SAPI_FIRST_FAMILY, TSS_SAPI_FIRST_LEVEL, TSS_SAPI_FIRST_VERSION };
141
142UINT32 tpmSpecVersion = 0;
wcarthureedecd62015-11-20 16:59:45 -0500143UINT32 tpmManufacturer = 0;
144
145#define MSFT_MANUFACTURER_ID 0x4d534654
Will Arthur54e04e42015-07-15 11:29:25 -0400146
147//
148// These are helper functions that are called through function pointers so that
149// they could be swapped easily to point to different functions.
150//
151// Currently they are set to functions that use the TPM to perform the function, but SW-only
152// implementations could be substituted as well.
153//
154UINT32 ( *ComputeSessionHmacPtr )(
155 TSS2_SYS_CONTEXT *sysContext,
156 TPMS_AUTH_COMMAND *cmdAuth, // Pointer to session input struct
157 TPM_HANDLE entityHandle, // Used to determine if we're accessing a different
158 // resource than the bound resoure.
159 TPM_RC responseCode, // Response code for the command, 0xffff for "none" is
160 // used to indicate that no response code is present
161 // (used for calculating command HMACs vs response HMACs).
162 TPM_HANDLE handle1, // First handle == 0xff000000 indicates no handle
163 TPM_HANDLE handle2, // Second handle == 0xff000000 indicates no handle
164 TPMA_SESSION sessionAttributes, // Current session attributes
165 TPM2B_DIGEST *result, // Where the result hash is saved.
166 TPM_RC sessionCmdRval
167 ) = TpmComputeSessionHmac;
168
169TPM_RC ( *GetSessionAlgIdPtr )( TPMI_SH_AUTH_SESSION authHandle, TPMI_ALG_HASH *sessionAlgId ) = GetSessionAlgId;
170
171TPM_RC ( *CalcPHash )( TSS2_SYS_CONTEXT *sysContext,TPM_HANDLE handle1, TPM_HANDLE handle2, TPMI_ALG_HASH authHash,
172 TPM_RC responseCode, TPM2B_DIGEST *pHash ) = TpmCalcPHash;
173
174UINT32 (*HmacFunctionPtr)( TPM_ALG_ID hashAlg, TPM2B *key,TPM2B **bufferList, TPM2B_DIGEST *result ) = TpmHmac;
175
176UINT32 (*HashFunctionPtr)( TPMI_ALG_HASH hashAlg, UINT16 size, BYTE *data, TPM2B_DIGEST *result ) = TpmHash;
177
178UINT32 (*HandleToNameFunctionPtr)( TPM_HANDLE handle, TPM2B_NAME *name ) = TpmHandleToName;
179
180TPMI_SH_AUTH_SESSION StartPolicySession();
181
182TPMI_SH_AUTH_SESSION InitNvAuxPolicySession();
183
184FILE *outFp;
185
186//
187// Used by some high level sample routines to copy the results.
188//
189void copyData( UINT8 *to, UINT8 *from, UINT32 length )
190{
191 if( to != 0 && from != 0 )
192 memcpy( to, from, length );
193}
194
195int TpmClientPrintf( UINT8 type, const char *format, ...)
196{
197 va_list args;
198 int rval = 0;
199
200 OpenOutFile( &outFp );
201
202 if( outFp )
203 {
204 if( type == RM_PREFIX )
205 {
206 PrintRMDebugPrefix();
207 }
208
209 va_start( args, format );
210 rval = vfprintf( outFp, format, args );
211 va_end (args);
212
213 CloseOutFile( &outFp );
214 }
215 else
216 {
217 printf( "TpmClientPrintf failed\n" );
218 }
219
220 return rval;
221}
222
223TPM_RC CompareTPM2B( TPM2B *buffer1, TPM2B *buffer2 )
224{
225 if( buffer1->size != buffer2->size )
226 return TPM_RC_FAILURE;
227 for( int i = 0; i < buffer1->size; i++ )
228 {
229 if( buffer1->buffer[0] != buffer2->buffer[0] )
230 return TPM_RC_FAILURE;
231 }
232 return TPM_RC_SUCCESS;
233}
234
235void PrintSizedBufferOpen( TPM2B *sizedBuffer )
236{
237 int i;
238
239
240 OpenOutFile( &outFp );
241
242 if( outFp )
243 {
244 for( i = 0; i < sizedBuffer->size; i++ )
245 {
246 TpmClientPrintf( 0, "%2.2x ", sizedBuffer->buffer[i] );
247
248 if( ( (i+1) % 16 ) == 0 )
249 {
250 TpmClientPrintf( 0, "\n" );
251 }
252 }
253 TpmClientPrintf( 0, "\n" );
254
255 CloseOutFile( &outFp );
256 }
257 else
258 {
259 printf( "PrintSizedBufferOpen failed\n" );
260 }
261
262}
263
264void PrintSizedBuffer( TPM2B *sizedBuffer )
265{
266 int i;
267
268 for( i = 0; i < sizedBuffer->size; i++ )
269 {
270 TpmClientPrintf( 0, "%2.2x ", sizedBuffer->buffer[i] );
271
272 if( ( (i+1) % 16 ) == 0 )
273 {
274 TpmClientPrintf( 0, "\n" );
275 }
276 }
277 TpmClientPrintf( 0, "\n" );
278}
279
280#define LEVEL_STRING_SIZE 50
281
282void ErrorHandler( UINT32 rval )
283{
284 UINT32 errorLevel = rval & TSS2_ERROR_LEVEL_MASK;
285 char levelString[LEVEL_STRING_SIZE + 1];
286
287 switch( errorLevel )
288 {
289 case TSS2_TPM_ERROR_LEVEL:
290 strncpy( levelString, "TPM", LEVEL_STRING_SIZE );
291 break;
292 case TSS2_APP_ERROR_LEVEL:
293 strncpy( levelString, "Application", LEVEL_STRING_SIZE );
294 break;
295 case TSS2_SYS_ERROR_LEVEL:
296 strncpy( levelString, "System API", LEVEL_STRING_SIZE );
297 break;
298 case TSS2_SYS_PART2_ERROR_LEVEL:
299 strncpy( levelString, "System API TPM encoded", LEVEL_STRING_SIZE );
300 break;
301 case TSS2_TCTI_ERROR_LEVEL:
302 strncpy( levelString, "TCTI", LEVEL_STRING_SIZE );
303 break;
304 case TSS2_RESMGRTPM_ERROR_LEVEL:
305 strncpy( levelString, "Resource Mgr TPM encoded", LEVEL_STRING_SIZE );
306 break;
307 case TSS2_RESMGR_ERROR_LEVEL:
308 strncpy( levelString, "Resource Mgr", LEVEL_STRING_SIZE );
309 break;
310 case TSS2_DRIVER_ERROR_LEVEL:
311 strncpy( levelString, "Driver", LEVEL_STRING_SIZE );
312 break;
313 default:
314 strncpy( levelString, "Unknown Level", LEVEL_STRING_SIZE );
315 break;
316 }
317
318 sprintf_s( errorString, errorStringSize, "%s Error: 0x%x\n", levelString, rval );
319}
320
321char resMgrInterfaceName[] = "Resource Manager";
322
323TSS2_RC InitTctiResMgrContext( char *rmInterfaceConfig, TSS2_TCTI_CONTEXT **tctiContext, char *name )
324{
325 size_t size;
326
327 TSS2_RC rval;
328
329 rval = resMgrInterfaceInfo.initialize(NULL, &size, rmInterfaceConfig, 0, 0, &resMgrInterfaceName[0], 0 );
330 if( rval != TSS2_RC_SUCCESS )
331 return rval;
332
333 *tctiContext = (TSS2_TCTI_CONTEXT *)malloc(size);
334
335 if( *tctiContext )
336 {
wcarthur1ac13972015-11-20 18:10:04 -0500337 rval = resMgrInterfaceInfo.initialize(*tctiContext, &size, rmInterfaceConfig, TCTI_MAGIC, TCTI_VERSION, resMgrInterfaceName, 0 );
Will Arthur54e04e42015-07-15 11:29:25 -0400338 }
339 else
340 {
341 rval = TSS2_TCTI_RC_BAD_CONTEXT;
342 }
343 return rval;
344}
345
346TSS2_RC TeardownTctiResMgrContext( char *interfaceConfig, TSS2_TCTI_CONTEXT *tctiContext, char *name )
347{
348 return resMgrInterfaceInfo.teardown( tctiContext, interfaceConfig, name );
349}
350
351void Cleanup()
352{
353 fflush( stdout );
354
Will-nuc8619aca2015-12-10 17:20:26 -0500355 if( resMgrTctiContext != 0 )
356 {
357 PlatformCommand( resMgrTctiContext, MS_SIM_POWER_OFF );
Will Arthur54e04e42015-07-15 11:29:25 -0400358
Will-nuc8619aca2015-12-10 17:20:26 -0500359 TeardownTctiResMgrContext( rmInterfaceConfig, resMgrTctiContext, &resMgrInterfaceName[0] );
360 }
361
Will Arthur54e04e42015-07-15 11:29:25 -0400362#ifdef _WIN32
363 WSACleanup();
364#endif
365 exit(1);
366}
367
368void InitSysContextFailure()
369{
370 TpmClientPrintf( 0, "InitSysContext failed, exiting...\n" );
371 Cleanup();
372}
373
374void Delay( UINT16 delay)
375{
376 volatile UINT32 i, j;
377
378 for( j = 0; j < delay; j++ )
379 {
380 for( i = 0; i < 10000000; i++ )
381 ;
382 }
383}
384
385void CheckPassed( UINT32 rval )
386{
387 OpenOutFile( &outFp );
388 TpmClientPrintf( 0, "\tpassing case: " );
389 if ( rval != TPM_RC_SUCCESS) {
390 ErrorHandler( rval);
391 TpmClientPrintf( 0, "\tFAILED! %s\n", errorString );
392 Cleanup();
393 }
394 else
395 {
396 TpmClientPrintf( 0, "\tPASSED!\n" );
397 }
398
399 CloseOutFile( &outFp );
400 Delay(demoDelay);
401}
402
403TPMS_AUTH_COMMAND nullSessionData;
404TPMS_AUTH_RESPONSE nullSessionDataOut;
405TPMS_AUTH_COMMAND *nullSessionDataArray[1] = { &nullSessionData };
406TPMS_AUTH_RESPONSE *nullSessionDataOutArray[1] = { &nullSessionDataOut };
407TSS2_SYS_CMD_AUTHS nullSessionsData = { 1, &nullSessionDataArray[0] };
408TSS2_SYS_RSP_AUTHS nullSessionsDataOut = { 1, &nullSessionDataOutArray[0] };
409TPM2B_NONCE nullSessionNonce, nullSessionNonceOut;
410TPM2B_AUTH nullSessionHmac;
411
412void CheckFailed( UINT32 rval, UINT32 expectedTpmErrorCode )
413{
414 OpenOutFile( &outFp );
415 TpmClientPrintf( 0, "\tfailing case: " );
416 if ( rval != expectedTpmErrorCode) {
417 ErrorHandler( rval);
418 TpmClientPrintf( 0, "\tFAILED! Ret code s/b: %x, but was: %x\n", expectedTpmErrorCode, rval );
419 Cleanup();
420 }
421 else
422 {
423 TpmClientPrintf( 0, "\tPASSED!\n" );
424 }
425 fflush( stdout );
426 CloseOutFile( &outFp );
427 Delay(demoDelay);
428}
429
430TSS2_RC TpmReset()
431{
432 TSS2_RC rval = TSS2_RC_SUCCESS;
433
434 rval = (TSS2_RC)PlatformCommand( resMgrTctiContext, MS_SIM_POWER_OFF );
435 if( rval == TSS2_RC_SUCCESS )
436 {
437 rval = (TSS2_RC)PlatformCommand( resMgrTctiContext, MS_SIM_POWER_ON );
438 }
439 return rval;
440}
441
442void GetTpmVersion()
443{
444 TSS2_RC rval = TSS2_RC_SUCCESS;
445 TPMS_CAPABILITY_DATA capabilityData;
446
447 rval = Tss2_Sys_GetCapability( sysContext, 0,
448 TPM_CAP_TPM_PROPERTIES, TPM_PT_REVISION,
449 1, 0, &capabilityData, 0 );
450 CheckPassed( rval );
451
452 if( capabilityData.data.tpmProperties.count == 1 &&
453 (capabilityData.data.tpmProperties.tpmProperty[0].property == TPM_PT_REVISION) )
454 {
455 tpmSpecVersion = capabilityData.data.tpmProperties.tpmProperty[0].value;
wcarthur11d22382016-01-19 08:29:07 -0500456 TpmClientPrintf( 0, "TPM spec version: %d\n", tpmSpecVersion );
Will Arthur54e04e42015-07-15 11:29:25 -0400457 }
458 else
459 {
460 TpmClientPrintf( 0, "Failed to get TPM spec version!!\n" );
461 Cleanup();
462 }
463}
464
wcarthureedecd62015-11-20 16:59:45 -0500465void GetTpmManufacturer()
466{
467 TSS2_RC rval = TSS2_RC_SUCCESS;
468 TPMS_CAPABILITY_DATA capabilityData;
469
470 rval = Tss2_Sys_GetCapability( sysContext, 0,
471 TPM_CAP_TPM_PROPERTIES, TPM_PT_MANUFACTURER,
472 1, 0, &capabilityData, 0 );
473 CheckPassed( rval );
474
475 if( capabilityData.data.tpmProperties.count == 1 &&
476 (capabilityData.data.tpmProperties.tpmProperty[0].property == TPM_PT_MANUFACTURER ) )
477 {
478 tpmManufacturer = capabilityData.data.tpmProperties.tpmProperty[0].value;
479 }
480 else
481 {
482 TpmClientPrintf( 0, "Failed to get TPM manufacturer!!\n" );
483 Cleanup();
484 }
485}
Will Arthur54e04e42015-07-15 11:29:25 -0400486
487void TestDictionaryAttackLockReset()
488{
489 UINT32 rval;
490 TPMS_AUTH_COMMAND sessionData;
491 TPMS_AUTH_RESPONSE sessionDataOut;
492 TSS2_SYS_CMD_AUTHS sessionsData;
493 TSS2_SYS_RSP_AUTHS sessionsDataOut;
494
495 TPMS_AUTH_COMMAND *sessionDataArray[1];
496 TPMS_AUTH_RESPONSE *sessionDataOutArray[1];
497
498 sessionDataArray[0] = &sessionData;
499 sessionDataOutArray[0] = &sessionDataOut;
500
501 sessionsDataOut.rspAuths = &sessionDataOutArray[0];
502 sessionsData.cmdAuths = &sessionDataArray[0];
503
504 sessionsDataOut.rspAuthsCount = 1;
505
506 TpmClientPrintf( 0, "\nDICTIONARY ATTACK LOCK RESET TEST :\n" );
507
508 // Init authHandle
509 sessionData.sessionHandle = TPM_RS_PW;
510
511 // Init nonce.
512 sessionData.nonce.t.size = 0;
513
514 // init hmac
515 sessionData.hmac.t.size = 0;
516
517 // Init session attributes
518 *( (UINT8 *)((void *)&sessionData.sessionAttributes ) ) = 0;
519
520 sessionsData.cmdAuthsCount = 1;
521 sessionsData.cmdAuths[0] = &sessionData;
522
523 rval = Tss2_Sys_DictionaryAttackLockReset ( sysContext, TPM_RH_LOCKOUT, &sessionsData, &sessionsDataOut );
524 CheckPassed( rval );
525}
526
527TSS2_RC StartPolicySession( TPMI_SH_AUTH_SESSION *sessionHandle )
528{
529 UINT8 i;
530 TPM2B_NONCE nonceCaller, nonceTpm;
531 TPM2B_ENCRYPTED_SECRET salt;
532 TPMT_SYM_DEF symmetric;
533 UINT16 digestSize;
534 UINT32 rval;
535
536 digestSize = GetDigestSize( TPM_ALG_SHA1 );
537 nonceCaller.t.size = digestSize;
538 for( i = 0; i < nonceCaller.t.size; i++ )
539 nonceCaller.t.buffer[i] = 0;
540
541 salt.t.size = 0;
542 symmetric.algorithm = TPM_ALG_NULL;
543
544 // Create policy session
Will-nucd6bbaa12015-12-08 11:51:25 -0500545 nonceTpm.t.size = sizeof( nonceTpm ) - 2;
Will Arthur54e04e42015-07-15 11:29:25 -0400546 rval = Tss2_Sys_StartAuthSession ( sysContext, TPM_RH_NULL, TPM_RH_NULL, 0, &nonceCaller, &salt,
547 TPM_SE_POLICY, &symmetric, TPM_ALG_SHA1, sessionHandle, &nonceTpm, 0 );
548 return( rval );
549}
550
551void TestTpmStartup()
552{
553 UINT32 rval;
554
555 TpmClientPrintf( 0, "\nSTARTUP TESTS:\n" );
556
557 //
558 // First test the one-call interface.
559 //
560
561 // First must do TPM reset.
562 rval = TpmReset();
563 CheckPassed(rval);
564
565 // This one should pass.
566 rval = Tss2_Sys_Startup( sysContext, TPM_SU_CLEAR );
567 CheckPassed(rval);
568
569 // This one should fail.
570 rval = Tss2_Sys_Startup( sysContext, TPM_SU_CLEAR );
571 CheckFailed( rval, TPM_RC_INITIALIZE );
572
573
574 // Cycle power using simulator interface.
575 rval = PlatformCommand( resMgrTctiContext, MS_SIM_POWER_OFF );
576 CheckPassed( rval );
577 rval = PlatformCommand( resMgrTctiContext, MS_SIM_POWER_ON );
578 CheckPassed( rval );
579
580
581 //
582 // Now test the syncronous, non-one-call interface.
583 //
584 rval = Tss2_Sys_Startup_Prepare( sysContext, TPM_SU_CLEAR );
585 CheckPassed(rval);
586
587 // Execute the command syncronously.
588 rval = Tss2_Sys_Execute( sysContext );
wcarthurf60ec992015-11-09 10:17:11 -0500589 CheckPassed( rval );
590
Will Arthur54e04e42015-07-15 11:29:25 -0400591 // Cycle power using simulator interface.
592 rval = PlatformCommand( resMgrTctiContext, MS_SIM_POWER_OFF );
593 CheckPassed( rval );
594 rval = PlatformCommand( resMgrTctiContext, MS_SIM_POWER_ON );
595 CheckPassed( rval );
596
597
598 //
599 // Now test the asyncronous, non-one-call interface.
600 //
601 rval = Tss2_Sys_Startup_Prepare( sysContext, TPM_SU_CLEAR );
602 CheckPassed(rval);
603
604 // Execute the command asyncronously.
605 rval = Tss2_Sys_ExecuteAsync( sysContext );
606 CheckPassed(rval);
607
608 // Get the command response. Wait a maximum of 20ms
609 // for response.
610 rval = Tss2_Sys_ExecuteFinish( sysContext, TSS2_TCTI_TIMEOUT_BLOCK );
611 CheckPassed(rval);
612}
613
wcarthureedecd62015-11-20 16:59:45 -0500614
Will-nuc8619aca2015-12-10 17:20:26 -0500615void ForceIOError( TSS2_TCTI_CONTEXT *tstTctiContext, SOCKET *savedTpmSock, SOCKET *savedOtherSock, int *savedDevFile, int tpmSock )
wcarthureedecd62015-11-20 16:59:45 -0500616{
Will-nuc8619aca2015-12-10 17:20:26 -0500617 if( resMgrInitialized )
wcarthureedecd62015-11-20 16:59:45 -0500618 {
wcarthur0651af22015-11-25 15:01:22 -0500619 if( tpmSock )
620 {
Will-nuc8619aca2015-12-10 17:20:26 -0500621 *savedTpmSock = ( (TSS2_TCTI_CONTEXT_INTEL *)tstTctiContext )->tpmSock;
622 ( (TSS2_TCTI_CONTEXT_INTEL *)tstTctiContext )->tpmSock = ~*savedTpmSock;
wcarthur0651af22015-11-25 15:01:22 -0500623 }
624 else
625 {
Will-nuc8619aca2015-12-10 17:20:26 -0500626 *savedOtherSock = ( (TSS2_TCTI_CONTEXT_INTEL *)tstTctiContext )->otherSock;
627 ( (TSS2_TCTI_CONTEXT_INTEL *)tstTctiContext )->otherSock = ~*savedOtherSock;
wcarthur0651af22015-11-25 15:01:22 -0500628 }
wcarthureedecd62015-11-20 16:59:45 -0500629 }
630 else
631 {
Will-nuc8619aca2015-12-10 17:20:26 -0500632 *savedDevFile = ( (TSS2_TCTI_CONTEXT_INTEL *)tstTctiContext )->devFile;
633 ( (TSS2_TCTI_CONTEXT_INTEL *)tstTctiContext )->devFile = ~*savedDevFile;
wcarthureedecd62015-11-20 16:59:45 -0500634 }
635}
636
Will-nuc8619aca2015-12-10 17:20:26 -0500637void CleanupIOError( TSS2_TCTI_CONTEXT *tstTctiContext, SOCKET savedTpmSock, SOCKET savedOtherSock, int savedDevFile, int tpmSock )
wcarthureedecd62015-11-20 16:59:45 -0500638{
Will-nuc8619aca2015-12-10 17:20:26 -0500639 if( resMgrInitialized )
wcarthureedecd62015-11-20 16:59:45 -0500640 {
wcarthur0651af22015-11-25 15:01:22 -0500641 if( tpmSock )
642 {
Will-nuc8619aca2015-12-10 17:20:26 -0500643 ( (TSS2_TCTI_CONTEXT_INTEL *)tstTctiContext )->tpmSock = savedTpmSock;
wcarthur0651af22015-11-25 15:01:22 -0500644 }
645 else
646 {
Will-nuc8619aca2015-12-10 17:20:26 -0500647 ( (TSS2_TCTI_CONTEXT_INTEL *)tstTctiContext )->otherSock = savedOtherSock;
wcarthur0651af22015-11-25 15:01:22 -0500648 }
wcarthureedecd62015-11-20 16:59:45 -0500649 }
650 else
651 {
Will-nuc8619aca2015-12-10 17:20:26 -0500652 ( (TSS2_TCTI_CONTEXT_INTEL *)tstTctiContext )->devFile = savedDevFile;
wcarthureedecd62015-11-20 16:59:45 -0500653 }
654}
655
Will-nuc8619aca2015-12-10 17:20:26 -0500656void ForceContextError( TSS2_TCTI_CONTEXT *tstTctiContext, int magic, uint64_t *savedMagic, uint32_t *savedVersion )
wcarthur1ac13972015-11-20 18:10:04 -0500657{
658 if( magic )
659 {
Will-nuc8619aca2015-12-10 17:20:26 -0500660 *savedMagic = ( (TSS2_TCTI_CONTEXT_COMMON_CURRENT *)tstTctiContext )->magic;
661 ( (TSS2_TCTI_CONTEXT_COMMON_CURRENT *)tstTctiContext )->magic = ~*savedMagic;
wcarthur1ac13972015-11-20 18:10:04 -0500662 }
663 else
664 {
Will-nuc8619aca2015-12-10 17:20:26 -0500665 *savedVersion = ( (TSS2_TCTI_CONTEXT_COMMON_CURRENT *)tstTctiContext )->version;
666 ( (TSS2_TCTI_CONTEXT_COMMON_CURRENT *)tstTctiContext )->version = ~*savedVersion;
wcarthur1ac13972015-11-20 18:10:04 -0500667 }
668}
669
Will-nuc8619aca2015-12-10 17:20:26 -0500670void CleanupContextError( TSS2_TCTI_CONTEXT *tstTctiContext, int magic, uint64_t savedMagic, uint32_t savedVersion )
wcarthur1ac13972015-11-20 18:10:04 -0500671{
672 if( magic )
673 {
Will-nuc8619aca2015-12-10 17:20:26 -0500674 ( (TSS2_TCTI_CONTEXT_COMMON_CURRENT *)tstTctiContext )->magic = savedMagic;
wcarthur1ac13972015-11-20 18:10:04 -0500675 }
676 else
677 {
Will-nuc8619aca2015-12-10 17:20:26 -0500678 ( (TSS2_TCTI_CONTEXT_COMMON_CURRENT *)tstTctiContext )->version = savedVersion;
wcarthur1ac13972015-11-20 18:10:04 -0500679 }
680}
681
Will-nuc8619aca2015-12-10 17:20:26 -0500682void TestTctiApis( TSS2_TCTI_CONTEXT *tstTctiContext, int againstRM )
wcarthureedecd62015-11-20 16:59:45 -0500683{
wcarthur0f237fe2015-12-07 13:38:59 -0500684 uint8_t tpmStartCommandBuffer[] = { 0x80, 0x01, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x01, 0x44, 0x00, 0x00 };
685 uint8_t getTestResultCommandBuffer[] = { 0x80, 0x01, 0x00, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x01, 0x7c };
wcarthureedecd62015-11-20 16:59:45 -0500686 uint8_t responseBuffer[20];
687 size_t responseSize;
Will-nuce0d3ec22015-12-09 15:09:49 -0500688 size_t expectedResponseSize;
wcarthureedecd62015-11-20 16:59:45 -0500689 SOCKET savedTpmSock;
wcarthur0651af22015-11-25 15:01:22 -0500690 SOCKET savedOtherSock;
wcarthureedecd62015-11-20 16:59:45 -0500691 int savedDevFile;
wcarthur1ac13972015-11-20 18:10:04 -0500692 uint64_t savedMagic;
693 uint32_t savedVersion;
wcarthur0f237fe2015-12-07 13:38:59 -0500694 uint8_t goodResponseBuffer[] = { 0x80, 0x01, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
Will-nuce0d3ec22015-12-09 15:09:49 -0500695 uint8_t goodResponseBuffer1[] = { 0x80, 0x01, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00,
696 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
697 uint8_t *goodRspBuffer;
698
wcarthur0f237fe2015-12-07 13:38:59 -0500699 int responseBufferError = 0;
Will-nucd6bbaa12015-12-08 11:51:25 -0500700 unsigned int i;
Will-nuc8619aca2015-12-10 17:20:26 -0500701 char *typeString;
702 char typeRMString[] = "RM";
703 char typeLocalString[] = "Local TPM";
wcarthureedecd62015-11-20 16:59:45 -0500704
705 TSS2_RC rval = TSS2_RC_SUCCESS;
706
Will-nuce0d3ec22015-12-09 15:09:49 -0500707 if( tpmManufacturer == MSFT_MANUFACTURER_ID )
708 {
709 expectedResponseSize = 0x10;
710 goodRspBuffer = &( goodResponseBuffer[0] );
711 }
712 else
713 {
714 expectedResponseSize = 0x18;
715 goodRspBuffer = &( goodResponseBuffer1[0] );
716 }
Will-nuc8619aca2015-12-10 17:20:26 -0500717
718 if( againstRM != 0 )
719 {
720 typeString = &typeRMString[0];
721 }
722 else
723 {
724 typeString = &typeLocalString[0];
725 }
Will-nuce0d3ec22015-12-09 15:09:49 -0500726
Will-nuc8619aca2015-12-10 17:20:26 -0500727 TpmClientPrintf( 0, "\nTCTI API TESTS (against %s TCTI interface):\n", typeString );
wcarthureedecd62015-11-20 16:59:45 -0500728
729 //
wcarthur0651af22015-11-25 15:01:22 -0500730 // Test transmit for NULL pointers.
wcarthureedecd62015-11-20 16:59:45 -0500731 //
Will-nuc8619aca2015-12-10 17:20:26 -0500732 rval = ( (TSS2_TCTI_CONTEXT_COMMON_CURRENT *)tstTctiContext )->transmit( 0, sizeof( tpmStartCommandBuffer ), &tpmStartCommandBuffer[0] );
wcarthur0651af22015-11-25 15:01:22 -0500733 CheckFailed( rval, TSS2_TCTI_RC_BAD_REFERENCE ); // #1
wcarthureedecd62015-11-20 16:59:45 -0500734
Will-nuc8619aca2015-12-10 17:20:26 -0500735 rval = ( (TSS2_TCTI_CONTEXT_COMMON_CURRENT *)tstTctiContext )->transmit( tstTctiContext, sizeof( tpmStartCommandBuffer ), 0 );
wcarthur0651af22015-11-25 15:01:22 -0500736 CheckFailed( rval, TSS2_TCTI_RC_BAD_REFERENCE ); // #2
wcarthur1ac13972015-11-20 18:10:04 -0500737
738 //
739 // Test transmit for BAD CONTEXT: magic.
740 //
Will-nuc8619aca2015-12-10 17:20:26 -0500741 ForceContextError( tstTctiContext, 1, &savedMagic, &savedVersion );
742 rval = ( (TSS2_TCTI_CONTEXT_COMMON_CURRENT *)tstTctiContext )->transmit( 0, sizeof( tpmStartCommandBuffer ), &tpmStartCommandBuffer[0] );
wcarthur0651af22015-11-25 15:01:22 -0500743 CheckFailed( rval, TSS2_TCTI_RC_BAD_REFERENCE ); // #3
Will-nuc8619aca2015-12-10 17:20:26 -0500744 CleanupContextError( tstTctiContext, 1, savedMagic, savedVersion );
wcarthur1ac13972015-11-20 18:10:04 -0500745
746 //
747 // Test transmit for BAD CONTEXT: version.
748 //
Will-nuc8619aca2015-12-10 17:20:26 -0500749 ForceContextError( tstTctiContext, 0, &savedMagic, &savedVersion );
750 rval = ( (TSS2_TCTI_CONTEXT_COMMON_CURRENT *)tstTctiContext )->transmit( 0, sizeof( tpmStartCommandBuffer ), &tpmStartCommandBuffer[0] );
wcarthur0651af22015-11-25 15:01:22 -0500751 CheckFailed( rval, TSS2_TCTI_RC_BAD_REFERENCE ); // #4
Will-nuc8619aca2015-12-10 17:20:26 -0500752 CleanupContextError( tstTctiContext, 0, savedMagic, savedVersion );
wcarthureedecd62015-11-20 16:59:45 -0500753
754 //
755 // Test transmit for IO error.
756 //
Will-nuc8619aca2015-12-10 17:20:26 -0500757 ForceIOError( tstTctiContext, &savedTpmSock, &savedOtherSock, &savedDevFile, 1 );
758 rval = ( (TSS2_TCTI_CONTEXT_COMMON_CURRENT *)tstTctiContext )->transmit( tstTctiContext, sizeof( tpmStartCommandBuffer ), &tpmStartCommandBuffer[0] );
759 CleanupIOError( tstTctiContext, savedTpmSock, savedOtherSock, savedDevFile, 1 );
wcarthur0651af22015-11-25 15:01:22 -0500760 CheckFailed( rval, TSS2_TCTI_RC_IO_ERROR ); // #5
wcarthureedecd62015-11-20 16:59:45 -0500761
Will-nuc8619aca2015-12-10 17:20:26 -0500762 if( againstRM )
763 {
764 //
765 // Test cancel for SEQUENCE error.
766 //
767 rval = ( (TSS2_TCTI_CONTEXT_COMMON_CURRENT *)tstTctiContext )->cancel( tstTctiContext );
768 CheckFailed( rval, TSS2_TCTI_RC_BAD_SEQUENCE ); // #6
769
770 //
771 // Test setLocality for BAD_REFERENCE error.
772 //
773 rval = ( (TSS2_TCTI_CONTEXT_COMMON_CURRENT *)tstTctiContext )->setLocality( 0, 0 );
774 CheckFailed( rval, TSS2_TCTI_RC_BAD_REFERENCE ); // #7
775 }
wcarthur0651af22015-11-25 15:01:22 -0500776#if 0
777 //
778 // setLocality in TCTI interface to resource manager doesn't actually do
779 // any IO, so this test case will never work. Left it and this comment here
780 // in case anyone ever questions why we're not testing this case.
781 //
782
783 //
784 // Test setLocality for IO error.
785 //
Will-nuc8619aca2015-12-10 17:20:26 -0500786 ForceIOError( tstTctiContext, &savedTpmSock, &savedOtherSock, &savedDevFile, 0 );
787 rval = ( (TSS2_TCTI_CONTEXT_COMMON_CURRENT *)tstTctiContext )->setLocality( tstTctiContext, 0 );
788 CleanupIOError( tstTctiContext, savedTpmSock, savedOtherSock, savedDevFile, 0 );
wcarthur0651af22015-11-25 15:01:22 -0500789 CheckFailed( rval, TSS2_TCTI_RC_IO_ERROR ); // #8
790#endif
791
Will-nuc8619aca2015-12-10 17:20:26 -0500792 rval = ( (TSS2_TCTI_CONTEXT_COMMON_CURRENT *)tstTctiContext )->transmit( tstTctiContext, sizeof( tpmStartCommandBuffer ), &tpmStartCommandBuffer[0] );
wcarthur0651af22015-11-25 15:01:22 -0500793 CheckPassed( rval ); // #9
794
Will-nuc8619aca2015-12-10 17:20:26 -0500795 if( againstRM )
796 {
797 //
798 // Test cancel for IO error.
799 //
800 ForceIOError( tstTctiContext, &savedTpmSock, &savedOtherSock, &savedDevFile, 0 );
801 rval = ( (TSS2_TCTI_CONTEXT_COMMON_CURRENT *)tstTctiContext )->cancel( tstTctiContext );
802 CleanupIOError( tstTctiContext, savedTpmSock, savedOtherSock, savedDevFile, 0 );
803 CheckFailed( rval, TSS2_TCTI_RC_IO_ERROR ); // #8
wcarthur0651af22015-11-25 15:01:22 -0500804
Will-nuc8619aca2015-12-10 17:20:26 -0500805 //
806 // Test setLocality for BAD_REFERENCE error.
807 //
808 rval = ( (TSS2_TCTI_CONTEXT_COMMON_CURRENT *)tstTctiContext )->setLocality( tstTctiContext, 0 );
809 CheckFailed( rval, TSS2_TCTI_RC_BAD_SEQUENCE ); // #10
810 }
811
wcarthur0651af22015-11-25 15:01:22 -0500812 //
813 // Test transmit for SEQUENCE error.
wcarthureedecd62015-11-20 16:59:45 -0500814 //
Will-nuc8619aca2015-12-10 17:20:26 -0500815 rval = ( (TSS2_TCTI_CONTEXT_COMMON_CURRENT *)tstTctiContext )->transmit( tstTctiContext, sizeof( tpmStartCommandBuffer ), &tpmStartCommandBuffer[0] );
wcarthur0651af22015-11-25 15:01:22 -0500816 CheckFailed( rval, TSS2_TCTI_RC_BAD_SEQUENCE ); // #11
wcarthureedecd62015-11-20 16:59:45 -0500817
wcarthurf979e352015-11-24 17:34:44 -0500818 responseSize = sizeof( responseBuffer );
wcarthureedecd62015-11-20 16:59:45 -0500819
Will-nuc8619aca2015-12-10 17:20:26 -0500820 if( againstRM )
821 {
822 //
823 // Test cancel for BAD REFERENCE error.
824 //
825 rval = ( (TSS2_TCTI_CONTEXT_COMMON_CURRENT *)tstTctiContext )->cancel( 0 );
826 CheckFailed( rval, TSS2_TCTI_RC_BAD_REFERENCE ); // #12
827 }
828
wcarthur0651af22015-11-25 15:01:22 -0500829 //
wcarthurf979e352015-11-24 17:34:44 -0500830 // Test receive for NULL pointers.
831 //
Will-nuc8619aca2015-12-10 17:20:26 -0500832 rval = ( (TSS2_TCTI_CONTEXT_COMMON_CURRENT *)tstTctiContext )->receive( 0, &responseSize, &responseBuffer[0], TSS2_TCTI_TIMEOUT_BLOCK );
wcarthur0651af22015-11-25 15:01:22 -0500833 CheckFailed( rval, TSS2_TCTI_RC_BAD_REFERENCE ); // #13
wcarthureedecd62015-11-20 16:59:45 -0500834
Will-nuc8619aca2015-12-10 17:20:26 -0500835 rval = ( (TSS2_TCTI_CONTEXT_COMMON_CURRENT *)tstTctiContext )->receive( tstTctiContext, 0, &responseBuffer[0], TSS2_TCTI_TIMEOUT_BLOCK );
wcarthur0651af22015-11-25 15:01:22 -0500836 CheckFailed( rval, TSS2_TCTI_RC_BAD_REFERENCE ); // #14
wcarthureedecd62015-11-20 16:59:45 -0500837
wcarthurf979e352015-11-24 17:34:44 -0500838 //
839 // Test receive for IO error.
840 //
Will-nuc8619aca2015-12-10 17:20:26 -0500841 ForceIOError( tstTctiContext, &savedTpmSock, &savedOtherSock, &savedDevFile, 1 );
842 rval = ( (TSS2_TCTI_CONTEXT_COMMON_CURRENT *)tstTctiContext )->receive( tstTctiContext, &responseSize, &responseBuffer[0], TSS2_TCTI_TIMEOUT_BLOCK );
843 CleanupIOError( tstTctiContext, savedTpmSock, savedOtherSock, savedDevFile, 1 );
wcarthur0651af22015-11-25 15:01:22 -0500844 CheckFailed( rval, TSS2_TCTI_RC_IO_ERROR ); // #16
wcarthur1ac13972015-11-20 18:10:04 -0500845
wcarthurf979e352015-11-24 17:34:44 -0500846 //
847 // Test receive for BAD CONTEXT: magic.
848 //
Will-nuc8619aca2015-12-10 17:20:26 -0500849 ForceContextError( tstTctiContext, 1, &savedMagic, &savedVersion );
850 rval = ( (TSS2_TCTI_CONTEXT_COMMON_CURRENT *)tstTctiContext )->receive( tstTctiContext, &responseSize, &responseBuffer[0], TSS2_TCTI_TIMEOUT_BLOCK );
wcarthur0651af22015-11-25 15:01:22 -0500851 CheckFailed( rval, TSS2_TCTI_RC_BAD_CONTEXT ); // #17
Will-nuc8619aca2015-12-10 17:20:26 -0500852 CleanupContextError( tstTctiContext, 1, savedMagic, savedVersion );
wcarthur1ac13972015-11-20 18:10:04 -0500853
wcarthurf979e352015-11-24 17:34:44 -0500854 //
855 // Test receive for BAD CONTEXT: version.
856 //
Will-nuc8619aca2015-12-10 17:20:26 -0500857 ForceContextError( tstTctiContext, 0, &savedMagic, &savedVersion );
858 rval = ( (TSS2_TCTI_CONTEXT_COMMON_CURRENT *)tstTctiContext )->receive( tstTctiContext, &responseSize, &responseBuffer[0], TSS2_TCTI_TIMEOUT_BLOCK );
wcarthur0651af22015-11-25 15:01:22 -0500859 CheckFailed( rval, TSS2_TCTI_RC_BAD_CONTEXT ); // #18
Will-nuc8619aca2015-12-10 17:20:26 -0500860 CleanupContextError( tstTctiContext, 0, savedMagic, savedVersion );
wcarthureedecd62015-11-20 16:59:45 -0500861
Will-nuc8619aca2015-12-10 17:20:26 -0500862 rval = ( (TSS2_TCTI_CONTEXT_COMMON_CURRENT *)tstTctiContext )->receive( tstTctiContext, &responseSize, &responseBuffer[0], TSS2_TCTI_TIMEOUT_BLOCK );
wcarthur0651af22015-11-25 15:01:22 -0500863 CheckPassed( rval ); // #19
wcarthurf979e352015-11-24 17:34:44 -0500864
Will-nuc8619aca2015-12-10 17:20:26 -0500865 if( againstRM )
866 {
867 // Test cancel for SEQUENCE error.
868 rval = ( (TSS2_TCTI_CONTEXT_COMMON_CURRENT *)tstTctiContext )->cancel( tstTctiContext );
869 CheckFailed( rval, TSS2_TCTI_RC_BAD_SEQUENCE ); // #20
870 }
wcarthur0651af22015-11-25 15:01:22 -0500871
wcarthurf979e352015-11-24 17:34:44 -0500872 //
873 // Test receive for SEQUENCE error.
874 //
Will-nuc8619aca2015-12-10 17:20:26 -0500875 rval = ( (TSS2_TCTI_CONTEXT_COMMON_CURRENT *)tstTctiContext )->receive( tstTctiContext, &responseSize, &responseBuffer[0], TSS2_TCTI_TIMEOUT_BLOCK );
wcarthur0651af22015-11-25 15:01:22 -0500876 CheckFailed( rval, TSS2_TCTI_RC_BAD_SEQUENCE ); // #21
wcarthurf979e352015-11-24 17:34:44 -0500877
878 //
879 // Test finalize for BAD REFERENCE error.
Will-nuc8619aca2015-12-10 17:20:26 -0500880 rval = ( (TSS2_TCTI_CONTEXT_COMMON_CURRENT *)tstTctiContext )->finalize( 0 );
wcarthur0651af22015-11-25 15:01:22 -0500881 CheckFailed( rval, TSS2_TCTI_RC_BAD_REFERENCE ); // #22
882
wcarthur0f237fe2015-12-07 13:38:59 -0500883
884 //
885 // Test Receive for too small a response buffer
886 //
Will-nuc8619aca2015-12-10 17:20:26 -0500887 rval = ( (TSS2_TCTI_CONTEXT_COMMON_CURRENT *)tstTctiContext )->transmit( tstTctiContext, sizeof( getTestResultCommandBuffer ), &getTestResultCommandBuffer[0] );
wcarthur0f237fe2015-12-07 13:38:59 -0500888 CheckPassed( rval ); // #23
889
890 responseSize = sizeof( TPM20_Header_Out ) - 1;
Will-nuc8619aca2015-12-10 17:20:26 -0500891 rval = ( (TSS2_TCTI_CONTEXT_COMMON_CURRENT *)tstTctiContext )->receive( tstTctiContext, &responseSize, &responseBuffer[0], TSS2_TCTI_TIMEOUT_BLOCK );
wcarthur0f237fe2015-12-07 13:38:59 -0500892 CheckFailed( rval, TSS2_TCTI_RC_INSUFFICIENT_BUFFER ); // #24
893
894 // Test returned responseSize here.
Will-nuce0d3ec22015-12-09 15:09:49 -0500895 if( responseSize != expectedResponseSize )
wcarthur0f237fe2015-12-07 13:38:59 -0500896 {
Will-nuc8619aca2015-12-10 17:20:26 -0500897 TpmClientPrintf( NO_PREFIX, "\nERROR!! responseSize after receive with too small a buffer is incorrect, s/b: 0x%x, was: 0x%x\n", expectedResponseSize, responseSize );
wcarthur0f237fe2015-12-07 13:38:59 -0500898 Cleanup();
899 }
900
Will-nuc8619aca2015-12-10 17:20:26 -0500901 rval = ( (TSS2_TCTI_CONTEXT_COMMON_CURRENT *)tstTctiContext )->receive( tstTctiContext, &responseSize, 0, TSS2_TCTI_TIMEOUT_BLOCK );
wcarthurc07856b2015-12-07 15:13:23 -0500902 CheckPassed( rval ); // #24
903
904 // Test returned responseSize here.
Will-nuce0d3ec22015-12-09 15:09:49 -0500905 if( responseSize != expectedResponseSize )
wcarthurc07856b2015-12-07 15:13:23 -0500906 {
Will-nuc8619aca2015-12-10 17:20:26 -0500907 TpmClientPrintf( NO_PREFIX, "\nERROR!! responseSize after receive with NULL responseBuffer is incorrect, s/b: 0x%x, was: 0x%x\n", expectedResponseSize, responseSize );
wcarthurc07856b2015-12-07 15:13:23 -0500908 Cleanup();
909 }
910
wcarthur0f237fe2015-12-07 13:38:59 -0500911 responseSize = sizeof( TPM20_Header_Out ) - 1 + sizeof( UINT16 );
Will-nuc8619aca2015-12-10 17:20:26 -0500912 rval = ( (TSS2_TCTI_CONTEXT_COMMON_CURRENT *)tstTctiContext )->receive( tstTctiContext, &responseSize, &responseBuffer[0], TSS2_TCTI_TIMEOUT_BLOCK );
wcarthur0f237fe2015-12-07 13:38:59 -0500913 CheckFailed( rval, TSS2_TCTI_RC_INSUFFICIENT_BUFFER ); // #25
914
915 // Test returned responseSize here.
Will-nuce0d3ec22015-12-09 15:09:49 -0500916 if( responseSize != expectedResponseSize )
wcarthur0f237fe2015-12-07 13:38:59 -0500917 {
Will-nuc8619aca2015-12-10 17:20:26 -0500918 TpmClientPrintf( NO_PREFIX, "\nERROR!! responseSize after receive with too small a buffer is incorrect, s/b: 0x%x, was: 0x%x\n", expectedResponseSize, responseSize );
wcarthur0f237fe2015-12-07 13:38:59 -0500919 Cleanup();
920 }
921
922 responseSize = sizeof( TPM20_Header_Out ) - 1 + sizeof( UINT16 ) + sizeof( UINT32 ) - 1;
Will-nuc8619aca2015-12-10 17:20:26 -0500923 rval = ( (TSS2_TCTI_CONTEXT_COMMON_CURRENT *)tstTctiContext )->receive( tstTctiContext, &responseSize, &responseBuffer[0], TSS2_TCTI_TIMEOUT_BLOCK );
wcarthur0f237fe2015-12-07 13:38:59 -0500924 CheckFailed( rval, TSS2_TCTI_RC_INSUFFICIENT_BUFFER ); // #26
925
926 // Test returned responseSize here.
Will-nuce0d3ec22015-12-09 15:09:49 -0500927 if( responseSize != expectedResponseSize )
wcarthur0f237fe2015-12-07 13:38:59 -0500928 {
Will-nuc8619aca2015-12-10 17:20:26 -0500929 TpmClientPrintf( NO_PREFIX, "\nERROR!! responseSize after receive with too small a buffer is incorrect, s/b: 0x%x, was: 0x%x\n", expectedResponseSize, responseSize );
wcarthur0f237fe2015-12-07 13:38:59 -0500930 Cleanup();
931 }
932
Will-nuce0d3ec22015-12-09 15:09:49 -0500933 responseSize = expectedResponseSize;
Will-nuc8619aca2015-12-10 17:20:26 -0500934 rval = ( (TSS2_TCTI_CONTEXT_COMMON_CURRENT *)tstTctiContext )->receive( tstTctiContext, &responseSize, &responseBuffer[0], TSS2_TCTI_TIMEOUT_BLOCK );
wcarthur0f237fe2015-12-07 13:38:59 -0500935 CheckPassed( rval ); // #27
936
937 // Test responseBuffer here.
938 // Now compare RP buffer to what it should be
939 for( i = 0; i < responseSize; i++ )
940 {
Will-nuce0d3ec22015-12-09 15:09:49 -0500941 if( responseBuffer[i] != goodRspBuffer[i] )
wcarthur0f237fe2015-12-07 13:38:59 -0500942 {
943 responseBufferError = 1;
944 break;
945 }
946 }
947 if( responseBufferError )
948 {
Will-nuce0d3ec22015-12-09 15:09:49 -0500949 TpmClientPrintf( NO_PREFIX, "\nERROR!! responseBuffer after receive is incorrect, s/b:\n" );
950 DebugPrintBuffer( (UINT8 *)&goodRspBuffer[0], responseSize );
951 TpmClientPrintf( NO_PREFIX, "\nwas:\n" );
952 DebugPrintBuffer( (UINT8 *)&responseBuffer, responseSize );
wcarthur0f237fe2015-12-07 13:38:59 -0500953 Cleanup();
954 }
955
956
957 // Now test other corner cases for size: 1 bytes smaller than tag size and 1 bytes smaller smaller than tag size plus sizeof UINT32.
958
959
wcarthur0651af22015-11-25 15:01:22 -0500960#if 0
961 //
962 // No getPollHandles function so these are #ifdef'd out for now.
963 //
964
965 //
966 // Test getPollHandles for BAD REFERENCE errors.
967 //
Will-nuc8619aca2015-12-10 17:20:26 -0500968 rval = ( (TSS2_TCTI_CONTEXT_COMMON_CURRENT *)tstTctiContext )->getPollHandles( (TSS2_TCTI_CONTEXT *)0, (TSS2_TCTI_POLL_HANDLE *)1, (size_t *)1 );
wcarthur0651af22015-11-25 15:01:22 -0500969 CheckFailed( rval, TSS2_TCTI_RC_BAD_REFERENCE ); // #23
970
Will-nuc8619aca2015-12-10 17:20:26 -0500971 rval = ( (TSS2_TCTI_CONTEXT_COMMON_CURRENT *)tstTctiContext )->getPollHandles( tstTctiContext, (TSS2_TCTI_POLL_HANDLE *)0, (size_t *)1 );
wcarthur0651af22015-11-25 15:01:22 -0500972 CheckFailed( rval, TSS2_TCTI_RC_BAD_REFERENCE ); // #24
973
Will-nuc8619aca2015-12-10 17:20:26 -0500974 rval = ( (TSS2_TCTI_CONTEXT_COMMON_CURRENT *)tstTctiContext )->getPollHandles( tstTctiContext, (TSS2_TCTI_POLL_HANDLE *)1, (size_t *)0 );
wcarthur0651af22015-11-25 15:01:22 -0500975 CheckFailed( rval, TSS2_TCTI_RC_BAD_REFERENCE ); // #25
976#endif
wcarthureedecd62015-11-20 16:59:45 -0500977}
978
979
Will Arthur54e04e42015-07-15 11:29:25 -0400980void TestSapiApis()
981{
982 UINT32 rval;
983 TPM2B_MAX_BUFFER outData = { { MAX_DIGEST_BUFFER, } };
984 TPM_RC testResult;
wcarthur2efe2912015-11-16 11:19:42 -0500985 TSS2_SYS_CONTEXT *testSysContext;
986 TPM2B_PUBLIC outPublic;
987 TPM2B_NAME name;
988 TPM2B_NAME qualifiedName;
wcarthur2efe2912015-11-16 11:19:42 -0500989 UINT8 commandCode[4];
990 size_t rpBufferUsedSize;
991 const uint8_t *rpBuffer;
wcarthur7b810772015-11-30 15:23:08 -0500992 const uint8_t goodRpBuffer[] = { 0x01, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00,
993 0x01, 0x00, 0x00, 0x01, 0x11, 0x00, 0x00, 0x00,
994 0x40 };
995 TPMI_YES_NO moreData;
996 TPMS_CAPABILITY_DATA capabilityData;
997 int rpBufferError = 0;
998 unsigned int i;
wcarthur01e35ad2015-12-14 18:00:18 -0500999 UINT32 savedRspSize;
Will Arthur54e04e42015-07-15 11:29:25 -04001000
wcarthur2efe2912015-11-16 11:19:42 -05001001 TpmClientPrintf( 0, "\nSAPI API TESTS:\n" );
Will Arthur54e04e42015-07-15 11:29:25 -04001002
1003 //
1004 // First test the one-call interface.
1005 //
1006 rval = Tss2_Sys_GetTestResult( sysContext, 0, &outData, &testResult, 0 );
wcarthur2efe2912015-11-16 11:19:42 -05001007 CheckPassed(rval); // #1
Will Arthur54e04e42015-07-15 11:29:25 -04001008
wcarthur2efe2912015-11-16 11:19:42 -05001009 // Check for BAD_SEQUENCE error.
1010 rval = Tss2_Sys_ExecuteAsync( sysContext );
1011 CheckFailed( rval, TSS2_SYS_RC_BAD_SEQUENCE ); // #2
1012
1013 // Check for BAD_SEQUENCE error.
1014 rval = Tss2_Sys_Execute( sysContext );
1015 CheckFailed( rval, TSS2_SYS_RC_BAD_SEQUENCE ); // #3
1016
Will Arthur54e04e42015-07-15 11:29:25 -04001017 //
1018 // Now test the syncronous, non-one-call interface.
1019 //
1020 rval = Tss2_Sys_GetTestResult_Prepare( sysContext );
wcarthur2efe2912015-11-16 11:19:42 -05001021 CheckPassed(rval); // #4
1022
1023 // Check for BAD_REFERENCE error.
1024 rval = Tss2_Sys_Execute( 0 );
1025 CheckFailed( rval, TSS2_SYS_RC_BAD_REFERENCE ); // #5
Will Arthur54e04e42015-07-15 11:29:25 -04001026
1027 // Execute the command syncronously.
1028 rval = Tss2_Sys_Execute( sysContext );
wcarthur2efe2912015-11-16 11:19:42 -05001029 CheckPassed(rval); // #6
1030
1031 // Check for BAD_SEQUENCE error.
1032 rval = Tss2_Sys_Execute( sysContext );
1033 CheckFailed( rval, TSS2_SYS_RC_BAD_SEQUENCE ); // #7
1034
1035 // Check for BAD_SEQUENCE error.
1036 rval = Tss2_Sys_ExecuteAsync( sysContext );
1037 CheckFailed( rval, TSS2_SYS_RC_BAD_SEQUENCE ); // #8
Will Arthur54e04e42015-07-15 11:29:25 -04001038
1039 // Get the command results
1040 rval = Tss2_Sys_GetTestResult_Complete( sysContext, &outData, &testResult );
wcarthur2efe2912015-11-16 11:19:42 -05001041 CheckPassed(rval); // #9
Will Arthur54e04e42015-07-15 11:29:25 -04001042
1043 //
1044 // Now test the asyncronous, non-one-call interface.
1045 //
1046 rval = Tss2_Sys_GetTestResult_Prepare( sysContext );
wcarthur2efe2912015-11-16 11:19:42 -05001047 CheckPassed(rval); // #10
1048
1049 // Test XXXX_Complete for bad sequence: after _Prepare
1050 // and before ExecuteFinish
1051 rval = Tss2_Sys_GetTestResult_Complete( sysContext, &outData, &testResult );
1052 CheckFailed( rval, TSS2_SYS_RC_BAD_SEQUENCE ); // #11
1053
1054 // Check for BAD_REFERENCE error.
1055 rval = Tss2_Sys_ExecuteAsync( 0 );
1056 CheckFailed( rval, TSS2_SYS_RC_BAD_REFERENCE ); // #12
1057
1058 // Test ExecuteFinish for BAD_SEQUENCE
1059 rval = Tss2_Sys_ExecuteFinish( sysContext, TSS2_TCTI_TIMEOUT_BLOCK );
1060 CheckFailed( rval, TSS2_SYS_RC_BAD_SEQUENCE ); // #13
Will Arthur54e04e42015-07-15 11:29:25 -04001061
1062 // Execute the command asyncronously.
1063 rval = Tss2_Sys_ExecuteAsync( sysContext );
wcarthur2efe2912015-11-16 11:19:42 -05001064 CheckPassed(rval); // #14
Will Arthur54e04e42015-07-15 11:29:25 -04001065
wcarthur2efe2912015-11-16 11:19:42 -05001066 // Check for BAD_SEQUENCE error.
1067 rval = Tss2_Sys_ExecuteAsync( sysContext );
1068 CheckFailed( rval, TSS2_SYS_RC_BAD_SEQUENCE ); // #15
1069
1070 // Check for BAD_SEQUENCE error.
1071 rval = Tss2_Sys_Execute( sysContext );
1072 CheckFailed( rval, TSS2_SYS_RC_BAD_SEQUENCE ); // #16
1073
1074 // Test ExecuteFinish for BAD_REFERENCE
1075 rval = Tss2_Sys_ExecuteFinish( 0, TSS2_TCTI_TIMEOUT_BLOCK );
1076 CheckFailed( rval, TSS2_SYS_RC_BAD_REFERENCE ); // #17
1077
1078 // Test XXXX_Complete for bad sequence: after _Prepare
1079 // and before ExecuteFinish
1080 rval = Tss2_Sys_GetTestResult_Complete( sysContext, &outData, &testResult );
1081 CheckFailed( rval, TSS2_SYS_RC_BAD_SEQUENCE ); // #18
1082
Will Arthur54e04e42015-07-15 11:29:25 -04001083 // Get the command response. Wait a maximum of 20ms
1084 // for response.
1085 rval = Tss2_Sys_ExecuteFinish( sysContext, TSS2_TCTI_TIMEOUT_BLOCK );
wcarthur2efe2912015-11-16 11:19:42 -05001086 CheckPassed(rval); // #19
1087
1088 rval = Tss2_Sys_ExecuteFinish( sysContext, TSS2_TCTI_TIMEOUT_BLOCK );
1089 CheckFailed( rval, TSS2_SYS_RC_BAD_SEQUENCE ); // #20
1090
1091 // Check for BAD_SEQUENCE error.
1092 rval = Tss2_Sys_ExecuteAsync( sysContext );
1093 CheckFailed( rval, TSS2_SYS_RC_BAD_SEQUENCE ); // #21
1094
1095 // Check for BAD_SEQUENCE error.
1096 rval = Tss2_Sys_Execute( sysContext );
1097 CheckFailed( rval, TSS2_SYS_RC_BAD_SEQUENCE ); // #22
1098
1099 // Test _Complete for bad reference cases.
1100 rval = Tss2_Sys_GetTestResult_Complete( 0, &outData, &testResult );
1101 CheckFailed( rval, TSS2_SYS_RC_BAD_REFERENCE ); // #23
Will Arthur54e04e42015-07-15 11:29:25 -04001102
1103 // Get the command results
1104 rval = Tss2_Sys_GetTestResult_Complete( sysContext, &outData, &testResult );
wcarthur2efe2912015-11-16 11:19:42 -05001105 CheckPassed(rval); // #24
1106
wcarthur35727452015-12-07 09:53:18 -05001107 testSysContext = InitSysContext( 0, resMgrTctiContext, &abiVersion );
wcarthur2efe2912015-11-16 11:19:42 -05001108 if( testSysContext == 0 )
1109 {
1110 InitSysContextFailure();
1111 }
1112
1113 // Test GetCommandCode for bad sequence
1114 rval = Tss2_Sys_GetCommandCode( testSysContext, &commandCode );
1115 CheckFailed( rval, TSS2_SYS_RC_BAD_SEQUENCE ); // #25
wcarthur35727452015-12-07 09:53:18 -05001116
wcarthur2efe2912015-11-16 11:19:42 -05001117 rval = Tss2_Sys_GetRpBuffer( testSysContext, &rpBufferUsedSize, &rpBuffer );
1118 CheckFailed( rval, TSS2_SYS_RC_BAD_SEQUENCE ); // #26
wcarthur35727452015-12-07 09:53:18 -05001119
1120 TeardownSysContext( &testSysContext );
wcarthur2efe2912015-11-16 11:19:42 -05001121
wcarthur35727452015-12-07 09:53:18 -05001122 rval = Tss2_Sys_ReadPublic_Prepare( sysContext, handle2048rsa );
wcarthur2efe2912015-11-16 11:19:42 -05001123 CheckPassed(rval); // #27
1124
1125 // Execute the command syncronously.
wcarthur35727452015-12-07 09:53:18 -05001126 rval = Tss2_Sys_ExecuteAsync( sysContext );
wcarthur2efe2912015-11-16 11:19:42 -05001127 CheckPassed( rval ); // #28
1128
1129 // Test _Complete for bad sequence case when ExecuteFinish has never
1130 // been done on a context.
wcarthur35727452015-12-07 09:53:18 -05001131 rval = Tss2_Sys_ReadPublic_Complete( sysContext, &outPublic, &name, &qualifiedName );
wcarthur2efe2912015-11-16 11:19:42 -05001132 CheckFailed( rval, TSS2_SYS_RC_BAD_SEQUENCE ); // #29
1133
wcarthur35727452015-12-07 09:53:18 -05001134 rval = Tss2_Sys_ExecuteFinish( sysContext, TSS2_TCTI_TIMEOUT_BLOCK );
1135 CheckPassed( rval ); // #30
wcarthur2efe2912015-11-16 11:19:42 -05001136
wcarthur35727452015-12-07 09:53:18 -05001137 rval = Tss2_Sys_ExecuteFinish( sysContext, TSS2_TCTI_TIMEOUT_BLOCK );
wcarthur2efe2912015-11-16 11:19:42 -05001138 CheckFailed( rval, TSS2_SYS_RC_BAD_SEQUENCE ); // #31
1139
wcarthur35727452015-12-07 09:53:18 -05001140 rval = Tss2_Sys_ReadPublic_Prepare( sysContext, handle2048rsa );
wcarthur2efe2912015-11-16 11:19:42 -05001141 CheckPassed(rval); // #32
1142
wcarthur35727452015-12-07 09:53:18 -05001143 rval = Tss2_Sys_ExecuteFinish( sysContext, TSS2_TCTI_TIMEOUT_BLOCK );
1144 CheckFailed( rval, TSS2_SYS_RC_BAD_SEQUENCE ); // #33
wcarthura05cdcc2015-12-04 18:07:16 -05001145
wcarthur2efe2912015-11-16 11:19:42 -05001146 rval = Tss2_Sys_ReadPublic_Prepare( sysContext, handle2048rsa );
wcarthur35727452015-12-07 09:53:18 -05001147 CheckPassed(rval); // #34
wcarthur2efe2912015-11-16 11:19:42 -05001148
1149 // Execute the command syncronously.
1150 rval = Tss2_Sys_Execute( sysContext );
wcarthur35727452015-12-07 09:53:18 -05001151 CheckPassed( rval ); // #35
wcarthur2efe2912015-11-16 11:19:42 -05001152
wcarthur2efe2912015-11-16 11:19:42 -05001153 outPublic.t.size = name.t.size = qualifiedName.t.size = 0;
1154 rval = Tss2_Sys_ReadPublic( sysContext, handle2048rsa, 0,
wcarthur7b10eeb2015-12-03 16:40:41 -05001155 &outPublic, 0, 0, 0 );
wcarthur35727452015-12-07 09:53:18 -05001156 CheckPassed( rval ); // #36
wcarthur2efe2912015-11-16 11:19:42 -05001157
Will Arthur54e04e42015-07-15 11:29:25 -04001158 // Check case of ExecuteFinish receving TPM error code.
1159 // Subsequent _Complete call should fail with SEQUENCE error.
1160 rval = TpmReset();
wcarthur35727452015-12-07 09:53:18 -05001161 CheckPassed(rval); // #37
Will Arthur54e04e42015-07-15 11:29:25 -04001162
1163 rval = Tss2_Sys_GetCapability_Prepare( sysContext,
1164 TPM_CAP_TPM_PROPERTIES, TPM_PT_ACTIVE_SESSIONS_MAX,
1165 1 );
wcarthur35727452015-12-07 09:53:18 -05001166 CheckPassed(rval); // #38
Will Arthur54e04e42015-07-15 11:29:25 -04001167
1168 // Execute the command asyncronously.
1169 rval = Tss2_Sys_ExecuteAsync( sysContext );
wcarthur35727452015-12-07 09:53:18 -05001170 CheckPassed(rval); // #39
Will Arthur54e04e42015-07-15 11:29:25 -04001171
1172 // Get the command response. Wait a maximum of 20ms
1173 // for response.
1174 rval = Tss2_Sys_ExecuteFinish( sysContext, TSS2_TCTI_TIMEOUT_BLOCK );
wcarthur35727452015-12-07 09:53:18 -05001175 CheckFailed( rval, TPM_RC_INITIALIZE ); // #40
Will Arthur54e04e42015-07-15 11:29:25 -04001176
wcarthur2efe2912015-11-16 11:19:42 -05001177 // Test _Complete for case when ExecuteFinish had an error.
Will Arthur54e04e42015-07-15 11:29:25 -04001178 rval = Tss2_Sys_GetCapability_Complete( sysContext, 0, 0 );
wcarthur35727452015-12-07 09:53:18 -05001179 CheckFailed( rval, TSS2_SYS_RC_BAD_SEQUENCE ); // #41
Will Arthur54e04e42015-07-15 11:29:25 -04001180
1181 rval = Tss2_Sys_Startup( sysContext, TPM_SU_CLEAR );
wcarthur35727452015-12-07 09:53:18 -05001182 CheckPassed(rval); // #42
wcarthur2efe2912015-11-16 11:19:42 -05001183
1184 rval = Tss2_Sys_GetRpBuffer( 0, &rpBufferUsedSize, &rpBuffer );
wcarthur35727452015-12-07 09:53:18 -05001185 CheckFailed( rval, TSS2_SYS_RC_BAD_REFERENCE ); // #43
wcarthur2efe2912015-11-16 11:19:42 -05001186
1187 rval = Tss2_Sys_GetRpBuffer( sysContext, 0, &rpBuffer );
wcarthur35727452015-12-07 09:53:18 -05001188 CheckFailed( rval, TSS2_SYS_RC_BAD_REFERENCE ); // #44
wcarthur2efe2912015-11-16 11:19:42 -05001189
1190 rval = Tss2_Sys_GetRpBuffer( sysContext, &rpBufferUsedSize, 0 );
wcarthur35727452015-12-07 09:53:18 -05001191 CheckFailed( rval, TSS2_SYS_RC_BAD_REFERENCE ); // #45
wcarthur2efe2912015-11-16 11:19:42 -05001192
1193 rval = Tss2_Sys_GetRpBuffer( sysContext, &rpBufferUsedSize, &rpBuffer );
wcarthur35727452015-12-07 09:53:18 -05001194 CheckPassed( rval ); // #46
wcarthur2efe2912015-11-16 11:19:42 -05001195
1196 // Now test case for ExecuteFinish where TPM returns
1197 // an error. ExecuteFinish should return same error
1198 // as TPM.
1199 rval = Tss2_Sys_Startup_Prepare( sysContext, TPM_SU_CLEAR );
wcarthur35727452015-12-07 09:53:18 -05001200 CheckPassed(rval); // #47
wcarthur2efe2912015-11-16 11:19:42 -05001201
1202 // Execute the command ayncronously.
1203 rval = Tss2_Sys_ExecuteAsync( sysContext );
wcarthur35727452015-12-07 09:53:18 -05001204 CheckPassed( rval ); // #48
wcarthur2efe2912015-11-16 11:19:42 -05001205
1206 rval = Tss2_Sys_Startup( sysContext, TPM_SU_CLEAR );
wcarthur35727452015-12-07 09:53:18 -05001207 CheckFailed( rval, TSS2_SYS_RC_BAD_SEQUENCE ); // #49
wcarthur2efe2912015-11-16 11:19:42 -05001208
1209 rval = Tss2_Sys_ExecuteFinish( sysContext, TSS2_TCTI_TIMEOUT_BLOCK );
wcarthur35727452015-12-07 09:53:18 -05001210 CheckFailed( rval, TPM_RC_INITIALIZE ); // #50
wcarthur2efe2912015-11-16 11:19:42 -05001211
1212 // Now test case for ExecuteFinish where TPM returns
1213 // an error. ExecuteFinish should return same error
1214 // as TPM.
1215 rval = Tss2_Sys_Startup_Prepare( sysContext, TPM_SU_CLEAR );
wcarthur35727452015-12-07 09:53:18 -05001216 CheckPassed(rval); // #51
1217
1218 rval = Tss2_Sys_GetRpBuffer( sysContext, &rpBufferUsedSize, &rpBuffer );
1219 CheckFailed( rval, TSS2_SYS_RC_BAD_SEQUENCE ); // #52
1220
1221 // Execute the command ayncronously.
1222 rval = Tss2_Sys_Execute( sysContext );
1223 CheckFailed( rval, TPM_RC_INITIALIZE ); // #53
wcarthur2efe2912015-11-16 11:19:42 -05001224
1225 rval = Tss2_Sys_GetRpBuffer( sysContext, &rpBufferUsedSize, &rpBuffer );
wcarthur5da9e092015-11-23 17:22:44 -05001226 CheckFailed( rval, TSS2_SYS_RC_BAD_SEQUENCE ); // #54
wcarthur2efe2912015-11-16 11:19:42 -05001227
wcarthur2efe2912015-11-16 11:19:42 -05001228 // Test one-call for null sysContext pointer.
1229 rval = Tss2_Sys_Startup( 0, TPM_SU_CLEAR );
wcarthur35727452015-12-07 09:53:18 -05001230 CheckFailed( rval, TSS2_SYS_RC_BAD_REFERENCE ); // #55
wcarthur2efe2912015-11-16 11:19:42 -05001231
wcarthur2efe2912015-11-16 11:19:42 -05001232 // Test one-call for NULL input parameter that should be a
1233 // pointer.
wcarthur5da9e092015-11-23 17:22:44 -05001234 rval = Tss2_Sys_Create( testSysContext, 0xffffffff, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 );
wcarthur35727452015-12-07 09:53:18 -05001235 CheckFailed( rval, TSS2_SYS_RC_BAD_REFERENCE ); // #56
wcarthur2efe2912015-11-16 11:19:42 -05001236
1237 // Test GetCommandCode for bad reference
1238 rval = Tss2_Sys_GetCommandCode( 0, &commandCode );
wcarthur35727452015-12-07 09:53:18 -05001239 CheckFailed( rval, TSS2_SYS_RC_BAD_REFERENCE ); // #57
wcarthur2efe2912015-11-16 11:19:42 -05001240
1241 rval = Tss2_Sys_GetCommandCode( sysContext, 0 );
wcarthur35727452015-12-07 09:53:18 -05001242 CheckFailed( rval, TSS2_SYS_RC_BAD_REFERENCE ); // #58
wcarthur7b810772015-11-30 15:23:08 -05001243
1244 //
1245 // Test GetRpBuffer for case of no response params or handles.
1246 //
1247 rval = Tss2_Sys_Shutdown( sysContext, 0, TPM_SU_STATE, 0 );
wcarthur35727452015-12-07 09:53:18 -05001248 CheckPassed( rval ); // #59
wcarthur7b810772015-11-30 15:23:08 -05001249
1250 rval = Tss2_Sys_GetRpBuffer( sysContext, &rpBufferUsedSize, &rpBuffer );
wcarthur35727452015-12-07 09:53:18 -05001251 CheckPassed( rval ); // #60
wcarthur7b810772015-11-30 15:23:08 -05001252
1253 if( rpBufferUsedSize != 0 )
1254 {
1255 TpmClientPrintf( NO_PREFIX, "\nERROR!! Tss2_Sys_GetRpBuffer returned non-zero size for command that returns no handles or parameters\n" );
1256 Cleanup();
1257 }
1258
1259 //
1260 // Test GetRpBuffer for case of response params.
1261 //
1262 rval = Tss2_Sys_GetCapability( sysContext, 0,
1263 TPM_CAP_TPM_PROPERTIES, TPM_PT_ACTIVE_SESSIONS_MAX,
1264 1, &moreData, &capabilityData, 0 );
wcarthur35727452015-12-07 09:53:18 -05001265 CheckPassed(rval); // #61
wcarthur7b810772015-11-30 15:23:08 -05001266
1267 rval = Tss2_Sys_GetRpBuffer( sysContext, &rpBufferUsedSize, &rpBuffer );
wcarthur35727452015-12-07 09:53:18 -05001268 CheckPassed( rval ); // #62
wcarthur7b810772015-11-30 15:23:08 -05001269
1270 if( rpBufferUsedSize != 17 )
1271 {
1272 TpmClientPrintf( NO_PREFIX, "\nERROR!! Tss2_Sys_GetRpBuffer returned wrong size for command that returns handles and/or parameters\n" );
1273 Cleanup();
1274 }
1275
1276 // Now compare RP buffer to what it should be
1277 for( i = 0; i < rpBufferUsedSize; i++ )
1278 {
1279 if( rpBuffer[i] != goodRpBuffer[i] )
1280 {
1281 rpBufferError = 1;
1282 break;
1283 }
1284 }
1285
1286 if( rpBufferError )
1287 {
1288 TpmClientPrintf( NO_PREFIX, "\nERROR!! Tss2_Sys_GetRpBuffer returned wrong rpBuffer contents:\nrpBuffer was: \n\t" );
1289 DebugPrintBuffer( (UINT8 *)&rpBuffer, rpBufferUsedSize );
1290 TpmClientPrintf( NO_PREFIX, "\nrpBuffer s/b:\n\t" );
1291 DebugPrintBuffer( (UINT8 *)&(goodRpBuffer[0]), rpBufferUsedSize );
1292 Cleanup();
1293 }
1294
1295 TeardownSysContext( &testSysContext );
wcarthur01e35ad2015-12-14 18:00:18 -05001296
1297 rval = Tss2_Sys_GetTestResult_Prepare( sysContext );
1298 CheckPassed(rval); // #63
1299
1300 // Execute the command syncronously.
1301 rval = Tss2_Sys_Execute( sysContext );
1302 CheckPassed(rval); // #64
1303
1304 // Get the command results
wcarthur4402db32015-12-15 12:25:33 -05001305 // NOTE: this test modifies internal fields of the sysContext structure.
1306 // DON'T DO THIS IN REAL APPS!!
wcarthur01e35ad2015-12-14 18:00:18 -05001307 savedRspSize = CHANGE_ENDIAN_DWORD( ( (TPM20_Header_Out *)( SYS_CONTEXT->tpmOutBuffPtr ) )->responseSize );
1308 ( (TPM20_Header_Out *)( SYS_CONTEXT->tpmOutBuffPtr ) )->responseSize = 4097;
1309 rval = Tss2_Sys_GetTestResult_Complete( sysContext, &outData, &testResult );
1310 ( (TPM20_Header_Out *)( SYS_CONTEXT->tpmOutBuffPtr ) )->responseSize = savedRspSize;
1311 CheckFailed( rval, TSS2_SYS_RC_MALFORMED_RESPONSE ); // #65
1312
wcarthur4402db32015-12-15 12:25:33 -05001313 // NOTE: this test case is kind of bogus--no application would ever do this
1314 // since apps can't change the responseSize after TPM has returned the response.
1315 // ONce the MALFOMED_RESPONSE occurs, there's no way to recover the response data.
wcarthur01e35ad2015-12-14 18:00:18 -05001316 rval = Tss2_Sys_GetTestResult_Complete( sysContext, &outData, &testResult );
1317 CheckFailed( rval, TSS2_SYS_RC_BAD_SEQUENCE ); // #66
Will Arthur54e04e42015-07-15 11:29:25 -04001318}
1319
1320
1321void TestTpmSelftest()
1322{
1323 UINT32 rval;
1324
1325 TpmClientPrintf( 0, "\nSELFTEST TESTS:\n" );
1326
1327 rval = Tss2_Sys_SelfTest( sysContext, 0, YES, 0);
1328 CheckPassed( rval );
1329
1330 rval = Tss2_Sys_SelfTest( sysContext, 0, NO, 0);
1331 CheckPassed( rval );
1332
1333 rval = Tss2_Sys_SelfTest( sysContext, 0, YES, 0);
1334 CheckPassed( rval );
1335
1336}
1337
1338void TestTpmGetCapability()
1339{
1340 UINT32 rval;
1341
1342 char manuID[5] = " ";
1343 char *manuIDPtr = &manuID[0];
1344 TPMI_YES_NO moreData;
1345 TPMS_CAPABILITY_DATA capabilityData;
1346
1347 TpmClientPrintf( 0, "\nGET_CAPABILITY TESTS:\n" );
1348
1349 rval = Tss2_Sys_GetCapability( sysContext, 0, TPM_CAP_TPM_PROPERTIES, TPM_PT_MANUFACTURER, 1, &moreData, &capabilityData, 0 );
1350 CheckPassed( rval );
1351
1352 *( (UINT32 *)manuIDPtr ) = CHANGE_ENDIAN_DWORD( capabilityData.data.tpmProperties.tpmProperty[0].value );
1353 TpmClientPrintf( 0, "\t\tcount: %d, property: %x, manuId: %s\n",
1354 capabilityData.data.tpmProperties.count,
1355 capabilityData.data.tpmProperties.tpmProperty[0].property,
1356 manuID );
1357
1358 rval = Tss2_Sys_GetCapability( sysContext, 0, TPM_CAP_TPM_PROPERTIES, TPM_PT_MAX_COMMAND_SIZE, 1, &moreData, &capabilityData, 0 );
1359 CheckPassed( rval );
1360 TpmClientPrintf( 0, "\t\tcount: %d, property: %x, max cmd size: %d\n",
1361 capabilityData.data.tpmProperties.count,
1362 capabilityData.data.tpmProperties.tpmProperty[0].property,
1363 capabilityData.data.tpmProperties.tpmProperty[0].value );
1364
1365
1366 rval = Tss2_Sys_GetCapability( sysContext, 0, TPM_CAP_TPM_PROPERTIES, TPM_PT_MAX_COMMAND_SIZE, 40, &moreData, &capabilityData, 0 );
1367 CheckPassed( rval );
1368 TpmClientPrintf( 0, "\t\tcount: %d, property: %x, max cmd size: %d\n",
1369 capabilityData.data.tpmProperties.count,
1370 capabilityData.data.tpmProperties.tpmProperty[0].property,
1371 capabilityData.data.tpmProperties.tpmProperty[0].value );
1372
1373
1374 rval = Tss2_Sys_GetCapability( sysContext, 0, TPM_CAP_TPM_PROPERTIES, TPM_PT_MAX_RESPONSE_SIZE, 1, &moreData, &capabilityData, 0 );
1375 CheckPassed( rval );
1376 TpmClientPrintf( 0, "\t count: %d, property: %x, max response size: %d\n",
1377 capabilityData.data.tpmProperties.count,
1378 capabilityData.data.tpmProperties.tpmProperty[0].property,
1379 capabilityData.data.tpmProperties.tpmProperty[0].value );
1380
1381 rval = Tss2_Sys_GetCapability( sysContext, 0, 0xff, TPM_PT_MANUFACTURER, 1, &moreData, &capabilityData, 0 );
1382
1383 if( tpmSpecVersion == 115 || tpmSpecVersion == 119 )
1384 {
1385 CheckFailed( rval, TPM_RC_VALUE );
1386 }
1387 else
1388 {
1389 CheckFailed( rval, TPM_RC_VALUE+TPM_RC_1+TPM_RC_P );
1390 }
1391}
1392
1393void TestTpmClear()
1394{
1395 UINT32 rval;
1396 TPM2B_AUTH hmac;
1397 TPMS_AUTH_COMMAND sessionData;
1398 TPMS_AUTH_RESPONSE sessionDataOut;
1399 TPM2B_NONCE nonce;
1400 TSS2_SYS_CMD_AUTHS sessionsDataIn;
1401 TSS2_SYS_RSP_AUTHS sessionsDataOut;
1402
1403 TPMS_AUTH_COMMAND *sessionDataArray[1];
1404 TPMS_AUTH_RESPONSE *sessionDataOutArray[1];
1405
1406 sessionDataArray[0] = &sessionData;
1407 sessionDataOutArray[0] = &sessionDataOut;
1408
1409 sessionsDataOut.rspAuths = &sessionDataOutArray[0];
1410 sessionsDataIn.cmdAuths = &sessionDataArray[0];
1411
1412 sessionsDataOut.rspAuthsCount = 1;
1413 sessionsDataOut.rspAuths[0] = &sessionDataOut;
1414
1415 TpmClientPrintf( 0, "\nCLEAR and CLEAR CONTROL TESTS:\n" );
1416
1417 // Init sessionHandle
1418 sessionData.sessionHandle = TPM_RS_PW;
1419
1420 // Init nonce.
1421 nonce.t.size = 0;
1422 sessionData.nonce = nonce;
1423
1424 // init hmac
1425 hmac.t.size = 0;
1426 sessionData.hmac = hmac;
1427
1428 // Init session attributes
1429 *( (UINT8 *)((void *)&sessionData.sessionAttributes ) ) = 0;
1430
1431 sessionsDataIn.cmdAuthsCount = 1;
1432 sessionsDataIn.cmdAuths[0] = &sessionData;
1433
1434 rval = Tss2_Sys_Clear ( sysContext, TPM_RH_PLATFORM, &sessionsDataIn, 0 );
1435 CheckPassed( rval );
1436
1437 rval = Tss2_Sys_ClearControl ( sysContext, TPM_RH_PLATFORM, &sessionsDataIn, YES, &sessionsDataOut );
1438 CheckPassed( rval );
1439
1440 rval = Tss2_Sys_Clear ( sysContext, TPM_RH_PLATFORM, &sessionsDataIn, 0 );
1441 CheckFailed( rval, TPM_RC_DISABLED );
1442
1443 rval = Tss2_Sys_ClearControl ( sysContext, TPM_RH_PLATFORM, &sessionsDataIn, NO, &sessionsDataOut );
1444 CheckPassed( rval );
1445
1446 *( (UINT8 *)((void *)&sessionData.sessionAttributes ) ) = 0xff;
1447 sessionsDataIn.cmdAuths[0] = &sessionData;
1448 rval = Tss2_Sys_Clear ( sysContext, TPM_RH_PLATFORM, &sessionsDataIn, &sessionsDataOut );
1449 CheckFailed( rval, TPM_RC_9 + TPM_RC_RESERVED_BITS );
1450
1451 rval = Tss2_Sys_ClearControl ( sysContext, TPM_RH_PLATFORM, &sessionsDataIn, NO, &sessionsDataOut );
1452 CheckFailed( rval, TPM_RC_9 + TPM_RC_RESERVED_BITS );
1453
1454 hmac.t.size = 0;
1455
1456
1457}
1458
1459#ifdef DEBUG_GAP_HANDLING
1460
1461#define SESSIONS_ABOVE_MAX_ACTIVE 1
1462// SESSION sessions[DEBUG_GAP_MAX*3];
1463 SESSION *sessions[300];
1464#else
1465
1466#define SESSIONS_ABOVE_MAX_ACTIVE 0
1467#define DEBUG_MAX_ACTIVE_SESSIONS 8
1468#define DEBUG_GAP_MAX 2*DEBUG_MAX_ACTIVE_SESSIONS
1469 SESSION *sessions[5];
1470
1471#endif
1472
1473void TestStartAuthSession()
1474{
1475 UINT32 rval;
1476 TPM2B_ENCRYPTED_SECRET encryptedSalt;
1477 TPMT_SYM_DEF symmetric;
1478 SESSION *authSession;
1479 TPM2B_NONCE nonceCaller;
1480 UINT16 i, debugGapMax = DEBUG_GAP_MAX, debugMaxActiveSessions = DEBUG_MAX_ACTIVE_SESSIONS;
1481 TPMA_LOCALITY locality;
1482 TPM_HANDLE badSessionHandle = 0x03010000;
1483
1484 TPMS_AUTH_COMMAND sessionData;
1485 TPM2B_NONCE nonce;
1486 TSS2_SYS_CMD_AUTHS sessionsDataIn;
1487
1488 TPMS_AUTH_COMMAND *sessionDataArray[1];
1489
1490 TPM2B_AUTH hmac;
1491
1492 TPMS_CONTEXT evictedSessionContext;
1493 TPM_HANDLE evictedHandle;
1494
1495 sessionDataArray[0] = &sessionData;
1496
1497 sessionsDataIn.cmdAuths = &sessionDataArray[0];
1498
1499 sessionsDataIn.cmdAuthsCount = 1;
1500
1501 // Init sessionHandle
1502 sessionData.sessionHandle = badSessionHandle;
1503
1504 // Init nonce.
1505 nonce.t.size = 0;
1506 sessionData.nonce = nonce;
1507
1508 // init hmac
1509 hmac.t.size = 0;
1510 sessionData.hmac = hmac;
1511
1512 // Init session attributes
1513 *( (UINT8 *)((void *)&sessionData.sessionAttributes ) ) = 0;
1514
1515 encryptedSalt.t.size = 0;
1516
1517 TpmClientPrintf( 0, "\nSTART_AUTH_SESSION TESTS:\n" );
1518
1519 symmetric.algorithm = TPM_ALG_NULL;
1520 symmetric.keyBits.sym = 0;
1521 symmetric.mode.sym = 0;
1522
1523 nonceCaller.t.size = 0;
1524
1525 encryptedSalt.t.size = 0;
1526
1527 // Init session
1528 rval = StartAuthSessionWithParams( &authSession, TPM_RH_NULL, 0, TPM_RH_PLATFORM, 0, &nonceCaller, &encryptedSalt, TPM_SE_POLICY, &symmetric, TPM_ALG_SHA256 );
1529 CheckPassed( rval );
1530
1531 rval = Tss2_Sys_FlushContext( sysContext, authSession->sessionHandle );
1532 CheckPassed( rval );
1533 EndAuthSession( authSession );
1534
1535 // Init session
1536 rval = StartAuthSessionWithParams( &authSession, TPM_RH_NULL, 0, TPM_RH_PLATFORM, 0, &nonceCaller, &encryptedSalt, 0xff, &symmetric, TPM_ALG_SHA256 );
1537 CheckFailed( rval, TPM_RC_VALUE + TPM_RC_P + TPM_RC_3 );
1538
1539 // Try starting a bunch to see if resource manager handles this correctly.
1540
1541#ifdef DEBUG_GAP_HANDLING
1542 for( i = 0; i < debugMaxActiveSessions*3; i++ )
1543#else
1544 for( i = 0; i < ( sizeof(sessions) / sizeof (SESSION *) ); i++ )
1545#endif
1546 {
1547// TpmClientPrintf( 0, "i = 0x%4.4x\n", i );
1548
1549 // Init session struct
1550 rval = StartAuthSessionWithParams( &sessions[i], TPM_RH_NULL, 0, TPM_RH_PLATFORM, 0, &nonceCaller, &encryptedSalt, TPM_SE_POLICY, &symmetric, TPM_ALG_SHA256 );
1551 CheckPassed( rval );
1552 TpmClientPrintf( 0, "Number of sessions created: %d\n\n", i );
1553
1554#ifdef DEBUG_GAP_HANDLING
1555 if( i == 0 )
1556 {
1557 // Save evicted session's context so we can use it for a test.
1558 rval = Tss2_Sys_ContextSave( sysContext, sessions[i]->sessionHandle, &evictedSessionContext );
1559 CheckPassed( rval );
1560 }
1561#endif
1562 }
1563
1564#ifdef DEBUG_GAP_HANDLING
1565 TpmClientPrintf( 0, "loading evicted session's context\n" );
1566 // Now try loading an evicted session's context.
1567 // NOTE: simulator versions 01.19 and earlier this test will fail due to a
1568 // simulator bug (unless patches have been applied).
1569 rval = Tss2_Sys_ContextLoad( sysContext, &evictedSessionContext, &evictedHandle );
1570 CheckFailed( rval, TPM_RC_HANDLE + TPM_RC_P + ( 1 << 8 ));
1571#endif
1572
1573 // Now try two ways of using a bad session handle. Both should fail.
1574
1575 // first way is to use as command parameter.
1576 *(UINT8 *)( (void *)&locality ) = 0;
1577 locality.TPM_LOC_THREE = 1;
1578 rval = Tss2_Sys_PolicyLocality( sysContext, badSessionHandle, 0, locality, 0 );
1579 CheckFailed( rval, TSS2_RESMGRTPM_ERROR_LEVEL + TPM_RC_HANDLE + ( 1 << 8 ) );
1580
1581 // Second way is to use as handle in session area.
1582 rval = Tss2_Sys_PolicyLocality( sysContext, sessions[0]->sessionHandle, &sessionsDataIn, locality, 0 );
1583 CheckFailed( rval, TSS2_RESMGRTPM_ERROR_LEVEL + TPM_RC_VALUE + TPM_RC_S + ( 1 << 8 ) );
1584
1585 // clean up the sessions that I don't want here.
1586#ifdef DEBUG_GAP_HANDLING
1587 for( i = 0; i < ( debugMaxActiveSessions*3); i++ )
1588#else
1589 for( i = 0; i < ( sizeof(sessions) / sizeof (SESSION *)); i++ )
1590#endif
1591 {
1592// TpmClientPrintf( 0, "i(2) = 0x%4.4x\n", i );
1593 rval = Tss2_Sys_FlushContext( sysContext, sessions[i]->sessionHandle );
1594
1595 rval = EndAuthSession( sessions[i] );
1596 }
1597
1598 // Now do some gap tests.
1599 rval = StartAuthSessionWithParams( &sessions[0], TPM_RH_NULL, 0, TPM_RH_PLATFORM, 0, &nonceCaller, &encryptedSalt, TPM_SE_POLICY, &symmetric, TPM_ALG_SHA256 );
1600 CheckPassed( rval );
1601
1602#ifdef DEBUG_GAP_HANDLING
1603// for( i = 1; i < debugGapMax/2; i++ )
1604 for( i = 1; i < 300; i++ )
1605#else
1606 for( i = 1; i < ( sizeof(sessions) / sizeof (SESSION *) ); i++ )
1607#endif
1608 {
1609// TpmClientPrintf( 0, "i(3) = 0x%4.4x\n", i );
1610
1611 rval = StartAuthSessionWithParams( &sessions[i], TPM_RH_NULL, 0, TPM_RH_PLATFORM, 0, &nonceCaller, &encryptedSalt, TPM_SE_POLICY, &symmetric, TPM_ALG_SHA256 );
1612 CheckPassed( rval );
1613
1614 rval = Tss2_Sys_FlushContext( sysContext, sessions[i]->sessionHandle );
1615 CheckPassed( rval );
1616
1617 rval = EndAuthSession( sessions[i] );
1618 CheckPassed( rval );
1619 }
1620
1621#ifdef DEBUG_GAP_HANDLING
1622 // Now do some gap tests.
1623 rval = StartAuthSessionWithParams( &sessions[8], TPM_RH_NULL, 0, TPM_RH_PLATFORM, 0, &nonceCaller, &encryptedSalt, TPM_SE_POLICY, &symmetric, TPM_ALG_SHA256 );
1624 CheckPassed( rval );
1625#endif
1626
1627#ifdef DEBUG_GAP_HANDLING
1628 for( i = 9; i < debugGapMax; i++ )
1629#else
1630 for( i = 0; i < ( sizeof(sessions) / sizeof (SESSION *) ); i++ )
1631#endif
1632 {
1633// TpmClientPrintf( 0, "i(4) = 0x%4.4x\n", i );
1634 rval = StartAuthSessionWithParams( &sessions[i], TPM_RH_NULL, 0, TPM_RH_PLATFORM, 0, &nonceCaller, &encryptedSalt, TPM_SE_POLICY, &symmetric, TPM_ALG_SHA256 );
1635 CheckPassed( rval );
1636
1637 rval = Tss2_Sys_FlushContext( sysContext, sessions[i]->sessionHandle );
1638 CheckPassed( rval );
1639
1640 rval = EndAuthSession( sessions[i] );
1641 CheckPassed( rval );
1642
1643 }
1644
1645#ifdef DEBUG_GAP_HANDLING
1646 for( i = 0; i < 5; i++ )
1647 {
1648// TpmClientPrintf( 0, "i(5) = 0x%4.4x\n", i );
1649 rval = StartAuthSessionWithParams( &sessions[i+16], TPM_RH_NULL, 0, TPM_RH_PLATFORM, 0, &nonceCaller, &encryptedSalt, TPM_SE_POLICY, &symmetric, TPM_ALG_SHA256 );
1650 CheckPassed( rval );
1651 }
1652
1653 for( i = 0; i < 5; i++ )
1654 {
1655// TpmClientPrintf( 0, "i(6) = 0x%4.4x\n", i );
1656 rval = Tss2_Sys_FlushContext( sysContext, sessions[i+16]->sessionHandle );
1657 CheckPassed( rval );
1658
1659 rval = EndAuthSession( sessions[i+16] );
1660 CheckPassed( rval );
1661 }
1662
1663 rval = Tss2_Sys_FlushContext( sysContext, sessions[0]->sessionHandle );
1664 CheckPassed( rval );
1665
1666 rval = EndAuthSession( sessions[0] );
1667 CheckPassed( rval );
1668
1669 rval = Tss2_Sys_FlushContext( sysContext, sessions[8]->sessionHandle );
1670 CheckPassed( rval );
1671
1672 rval = EndAuthSession( sessions[8] );
1673 CheckPassed( rval );
1674#endif
1675
1676}
1677
1678void TestChangeEps()
1679{
1680 UINT32 rval;
1681 TSS2_SYS_CMD_AUTHS sessionsData;
1682 TSS2_SYS_RSP_AUTHS sessionsDataOut;
1683
1684 TPMS_AUTH_COMMAND sessionData;
1685 TPMS_AUTH_RESPONSE sessionDataOut;
1686
1687 TPMS_AUTH_COMMAND *sessionDataArray[1];
1688 TPMS_AUTH_RESPONSE *sessionDataOutArray[1];
1689
1690 sessionDataArray[0] = &sessionData;
1691 sessionDataOutArray[0] = &sessionDataOut;
1692
1693 sessionsDataOut.rspAuths = &sessionDataOutArray[0];
1694 sessionsData.cmdAuths = &sessionDataArray[0];
1695
1696 sessionsDataOut.rspAuthsCount = 1;
1697
1698 TpmClientPrintf( 0, "\nCHANGE_EPS TESTS:\n" );
1699
1700 sessionsData.cmdAuthsCount = 1;
1701
1702 // Init authHandle
1703 sessionsData.cmdAuths[0]->sessionHandle = TPM_RS_PW;
1704
1705 // Init nonce.
1706 sessionsData.cmdAuths[0]->nonce.t.size = 0;
1707
1708 // init hmac
1709 sessionsData.cmdAuths[0]->hmac.t.size = 0;
1710
1711 // Init session attributes
1712 *( (UINT8 *)((void *)&sessionsData.cmdAuths[0]->sessionAttributes ) ) = 0;
1713
1714 rval = Tss2_Sys_ChangeEPS( sysContext, TPM_RH_PLATFORM, &sessionsData, &sessionsDataOut );
1715 CheckPassed( rval );
1716
1717 sessionsData.cmdAuths[0]->hmac.t.size = 0x10;
1718
1719 rval = Tss2_Sys_ChangeEPS( sysContext, TPM_RH_PLATFORM, &sessionsData, 0 );
1720 CheckFailed( rval, TPM_RC_1 + TPM_RC_S + TPM_RC_BAD_AUTH );
1721}
1722
1723void TestChangePps()
1724{
1725 UINT32 rval;
1726 TSS2_SYS_CMD_AUTHS sessionsData;
1727
1728 TSS2_SYS_RSP_AUTHS sessionsDataOut;
1729
1730 TPMS_AUTH_COMMAND sessionData;
1731 TPMS_AUTH_RESPONSE sessionDataOut;
1732
1733 TPMS_AUTH_COMMAND *sessionDataArray[1];
1734 TPMS_AUTH_RESPONSE *sessionDataOutArray[1];
1735
1736 sessionDataArray[0] = &sessionData;
1737 sessionDataOutArray[0] = &sessionDataOut;
1738
1739 sessionsDataOut.rspAuths = &sessionDataOutArray[0];
1740 sessionsData.cmdAuths = &sessionDataArray[0];
1741
1742 sessionsDataOut.rspAuthsCount = 1;
1743
1744 TpmClientPrintf( 0, "\nCHANGE_PPS TESTS:\n" );
1745
1746 sessionsData.cmdAuthsCount = 1;
1747
1748 // Init authHandle
1749 sessionsData.cmdAuths[0]->sessionHandle = TPM_RS_PW;
1750
1751 // Init nonce.
1752 sessionsData.cmdAuths[0]->nonce.t.size = 0;
1753
1754 // init hmac
1755 sessionsData.cmdAuths[0]->hmac.t.size = 0;
1756
1757 // Init session attributes
1758 *( (UINT8 *)((void *)&sessionsData.cmdAuths[0]->sessionAttributes ) ) = 0;
1759
1760 rval = Tss2_Sys_ChangePPS( sysContext, TPM_RH_PLATFORM, &sessionsData, &sessionsDataOut );
1761 CheckPassed( rval );
1762
1763 sessionsData.cmdAuths[0]->hmac.t.size = 0x10;
1764
1765 rval = Tss2_Sys_ChangePPS( sysContext, TPM_RH_PLATFORM, &sessionsData, &sessionsDataOut );
1766 CheckFailed( rval, TPM_RC_1 + TPM_RC_S + TPM_RC_BAD_AUTH );
1767}
1768
1769void TestHierarchyChangeAuth()
1770{
1771 UINT32 rval;
1772 TPM2B_AUTH newAuth;
1773 TPMS_AUTH_COMMAND sessionData;
1774 TSS2_SYS_CMD_AUTHS sessionsData;
1775 int i;
1776
1777 TPMS_AUTH_COMMAND *sessionDataArray[1];
1778
1779 sessionDataArray[0] = &sessionData;
1780
1781 sessionsData.cmdAuths = &sessionDataArray[0];
1782
1783 TpmClientPrintf( 0, "\nHIERARCHY_CHANGE_AUTH TESTS:\n" );
1784
1785 // Init authHandle
1786 sessionData.sessionHandle = TPM_RS_PW;
1787
1788 // Init nonce.
1789 sessionData.nonce.t.size = 0;
1790
1791 // init hmac
1792 sessionData.hmac.t.size = 0;
1793
1794 // Init session attributes
1795 *( (UINT8 *)((void *)&sessionData.sessionAttributes ) ) = 0;
1796
1797 sessionsData.cmdAuthsCount = 1;
1798 sessionsData.cmdAuths[0] = &sessionData;
1799
1800 newAuth.t.size = 0;
1801 rval = Tss2_Sys_HierarchyChangeAuth( sysContext, TPM_RH_PLATFORM, &sessionsData, &newAuth, 0 );
1802 CheckPassed( rval );
1803
1804 // Init new auth
1805 newAuth.t.size = 20;
1806 for( i = 0; i < newAuth.t.size; i++ )
1807 newAuth.t.buffer[i] = i;
1808
1809 rval = Tss2_Sys_HierarchyChangeAuth( sysContext, TPM_RH_PLATFORM, &sessionsData, &newAuth, 0 );
1810 CheckPassed( rval );
1811
1812 sessionData.hmac = newAuth;
1813 rval = Tss2_Sys_HierarchyChangeAuth( sysContext, TPM_RH_PLATFORM, &sessionsData, &newAuth, 0 );
1814 CheckPassed( rval );
1815
1816 // Init new auth
1817 newAuth.t.size = 0;
1818
1819 rval = Tss2_Sys_HierarchyChangeAuth( sysContext, TPM_RH_PLATFORM, &sessionsData, &newAuth, 0 );
1820 CheckPassed( rval );
1821
1822 sessionsData.cmdAuths[0] = &sessionData;
1823 rval = Tss2_Sys_HierarchyChangeAuth( sysContext, TPM_RH_PLATFORM, &sessionsData, &newAuth, 0 );
1824 CheckFailed( rval, TPM_RC_1 + TPM_RC_S + TPM_RC_BAD_AUTH );
1825
1826 rval = Tss2_Sys_HierarchyChangeAuth( sysContext, 0, &sessionsData, &newAuth, 0 );
1827 CheckFailed( rval, TPM_RC_1 + TPM_RC_VALUE );
1828}
1829
1830#define PCR_0 0
1831#define PCR_1 1
1832#define PCR_2 2
1833#define PCR_3 3
1834#define PCR_4 4
1835#define PCR_5 5
1836#define PCR_6 6
1837#define PCR_7 7
1838#define PCR_8 8
1839#define PCR_9 9
1840#define PCR_10 10
1841#define PCR_11 11
1842#define PCR_12 12
1843#define PCR_13 13
1844#define PCR_14 14
1845#define PCR_15 15
1846#define PCR_16 16
1847#define PCR_17 17
1848#define PCR_18 18
1849
1850#define PCR_SIZE 20
1851
1852void TestPcrExtend()
1853{
1854 UINT32 rval;
1855 TPMS_AUTH_COMMAND sessionData;
1856 TSS2_SYS_CMD_AUTHS sessionsData;
1857 UINT16 i, digestSize;
1858 TPML_PCR_SELECTION pcrSelection;
1859 UINT32 pcrUpdateCounterBeforeExtend;
1860 UINT32 pcrUpdateCounterAfterExtend;
1861 UINT8 pcrBeforeExtend[PCR_SIZE];
1862 TPM2B_EVENT eventData;
1863 TPML_DIGEST pcrValues;
1864 TPML_DIGEST_VALUES digests;
1865 TPML_PCR_SELECTION pcrSelectionOut;
1866
1867 TPMS_AUTH_COMMAND *sessionDataArray[1];
1868
1869 sessionDataArray[0] = &sessionData;
1870 sessionsData.cmdAuths = &sessionDataArray[0];
1871
1872 TpmClientPrintf( 0, "\nPCR_EXTEND, PCR_EVENT, PCR_ALLOCATE, and PCR_READ TESTS:\n" );
1873
1874 // Init authHandle
1875 sessionData.sessionHandle = TPM_RS_PW;
1876
1877 // Init nonce.
1878 sessionData.nonce.t.size = 0;
1879
1880 // init hmac
1881 sessionData.hmac.t.size = 0;
1882
1883 // Init session attributes
1884 *( (UINT8 *)((void *)&sessionData.sessionAttributes ) ) = 0;
1885
1886 // Init digests
1887 digests.count = 1;
1888 digests.digests[0].hashAlg = TPM_ALG_SHA1;
1889 digestSize = GetDigestSize( digests.digests[0].hashAlg );
1890
1891 for( i = 0; i < digestSize; i++ )
1892 {
1893 digests.digests[0].digest.sha1[i] = (UINT8)(i % 256);
1894 }
1895
1896 pcrSelection.count = 1;
1897 pcrSelection.pcrSelections[0].hash = TPM_ALG_SHA1;
1898 pcrSelection.pcrSelections[0].sizeofSelect = 3;
1899
1900 // Clear out PCR select bit field
1901 pcrSelection.pcrSelections[0].pcrSelect[0] = 0;
1902 pcrSelection.pcrSelections[0].pcrSelect[1] = 0;
1903 pcrSelection.pcrSelections[0].pcrSelect[2] = 0;
1904
1905 // Now set the PCR you want to read
1906 SET_PCR_SELECT_BIT( pcrSelection.pcrSelections[0], PCR_17 );
1907
1908 rval = Tss2_Sys_PCR_Read( sysContext, 0, &pcrSelection, &pcrUpdateCounterBeforeExtend, &pcrSelectionOut, &pcrValues, 0 );
1909 CheckPassed( rval );
1910
1911 if( pcrValues.digests[0].t.size <= PCR_SIZE &&
1912 pcrValues.digests[0].t.size <= sizeof( pcrValues.digests[0].t.buffer ) )
1913 memcpy( &( pcrBeforeExtend[0] ), &( pcrValues.digests[0].t.buffer[0] ), pcrValues.digests[0].t.size );
1914
1915 sessionsData.cmdAuthsCount = 1;
1916 sessionsData.cmdAuths[0] = &sessionData;
1917
1918 rval = Tss2_Sys_PCR_Extend( sysContext, PCR_17, &sessionsData, &digests, 0 );
1919 CheckPassed( rval );
1920
1921 rval = Tss2_Sys_PCR_Read( sysContext, 0, &pcrSelection, &pcrUpdateCounterAfterExtend, &pcrSelectionOut, &pcrValues, 0 );
1922 CheckPassed( rval );
1923
1924 memcpy( &( pcrAfterExtend[0] ), &( pcrValues.digests[0].t.buffer[0] ), pcrValues.digests[0].t.size );
1925
1926 if( pcrUpdateCounterBeforeExtend == pcrUpdateCounterAfterExtend )
1927 {
1928 TpmClientPrintf( 0, "ERROR!! pcrUpdateCounter didn't change value\n" );
1929 Cleanup();
1930 }
1931
1932 if( 0 == memcmp( &( pcrBeforeExtend[0] ), &( pcrAfterExtend[0] ), 20 ) )
1933 {
1934 TpmClientPrintf( 0, "ERROR!! PCR didn't change value\n" );
1935 Cleanup();
1936 }
1937
1938 pcrSelection.pcrSelections[0].sizeofSelect = 4;
1939
1940 rval = Tss2_Sys_PCR_Read( sysContext, 0, &pcrSelection, &pcrUpdateCounterAfterExtend, 0, 0, 0 );
1941 CheckFailed( rval, TPM_RC_1 + TPM_RC_P + TPM_RC_VALUE );
1942
1943 eventData.t.size = 4;
1944 eventData.t.buffer[0] = 0;
1945 eventData.t.buffer[1] = 0xff;
1946 eventData.t.buffer[2] = 0x55;
1947 eventData.t.buffer[3] = 0xaa;
1948
1949 rval = Tss2_Sys_PCR_Event( sysContext, PCR_18, &sessionsData, &eventData, &digests, 0 );
1950 CheckPassed( rval );
1951}
1952
1953void TestGetRandom()
1954{
1955 UINT32 rval;
1956 TPM2B_DIGEST randomBytes1, randomBytes2;
1957
1958 TpmClientPrintf( 0, "\nGET_RANDOM TESTS:\n" );
1959
Will-nucd6bbaa12015-12-08 11:51:25 -05001960 randomBytes1.t.size = sizeof( randomBytes1 ) - 2;
Will Arthur54e04e42015-07-15 11:29:25 -04001961 rval = Tss2_Sys_GetRandom( sysContext, 0, 20, &randomBytes1, 0 );
1962 CheckPassed( rval );
1963
Will-nucd6bbaa12015-12-08 11:51:25 -05001964 randomBytes2.t.size = sizeof( randomBytes2 ) - 2;
Will Arthur54e04e42015-07-15 11:29:25 -04001965 rval = Tss2_Sys_GetRandom( sysContext, 0, 20, &randomBytes2, 0 );
1966 CheckPassed( rval );
1967
1968 if( 0 == memcmp( &randomBytes1, &randomBytes2, 20 ) )
1969 {
1970 TpmClientPrintf( 0, "ERROR!! Random value is the same\n" );
1971 Cleanup();
1972 }
1973}
1974
1975void TestShutdown()
1976{
1977 UINT32 rval;
1978 TSS2_SYS_RSP_AUTHS sessionsDataOut;
1979
1980 TPMS_AUTH_RESPONSE *sessionDataOutArray[1];
1981 TPMS_AUTH_RESPONSE sessionDataOut;
1982
1983 sessionDataOutArray[0] = &sessionDataOut;
1984
1985 sessionsDataOut.rspAuths = &sessionDataOutArray[0];
1986
1987 sessionsDataOut.rspAuthsCount = 1;
1988
1989 TpmClientPrintf( 0, "\nSHUTDOWN TESTS:\n" );
1990
1991 rval = Tss2_Sys_Shutdown( sysContext, 0, TPM_SU_STATE, &sessionsDataOut );
1992 CheckPassed( rval );
1993
1994 rval = Tss2_Sys_Shutdown( sysContext, 0, TPM_SU_CLEAR, &sessionsDataOut );
1995 CheckPassed( rval );
1996
1997 if( !( tpmSpecVersion == 115 || tpmSpecVersion == 119 ) )
1998 {
1999 rval = Tss2_Sys_Shutdown( sysContext, 0, 0xff, 0 );
2000 CheckFailed( rval, TPM_RC_VALUE+TPM_RC_1+TPM_RC_P );
2001 }
2002}
2003
2004void TestNV()
2005{
2006 UINT32 rval;
2007 TPM2B_NV_PUBLIC publicInfo;
2008 TPM2B_AUTH nvAuth;
2009 TPMS_AUTH_COMMAND sessionData;
2010 TPMS_AUTH_RESPONSE sessionDataOut;
2011 TSS2_SYS_CMD_AUTHS sessionsData;
2012 TSS2_SYS_RSP_AUTHS sessionsDataOut;
2013 int i;
2014 TPM2B_MAX_NV_BUFFER nvWriteData;
2015 TPM2B_MAX_NV_BUFFER nvData;
2016
2017 TPM2B_NV_PUBLIC nvPublic;
2018 TPM2B_NAME nvName;
2019
2020 TPMS_AUTH_COMMAND *sessionDataArray[1];
2021 TPMS_AUTH_RESPONSE *sessionDataOutArray[1];
2022
2023 sessionDataArray[0] = &sessionData;
2024 sessionDataOutArray[0] = &sessionDataOut;
2025
2026 sessionsDataOut.rspAuths = &sessionDataOutArray[0];
2027 sessionsData.cmdAuths = &sessionDataArray[0];
2028
2029 sessionsDataOut.rspAuthsCount = 1;
2030
2031 TpmClientPrintf( 0, "\nNV INDEX TESTS:\n" );
2032
2033 nvAuth.t.size = 20;
2034 for( i = 0; i < nvAuth.t.size; i++ )
2035 nvAuth.t.buffer[i] = (UINT8)i;
2036
2037 publicInfo.t.size = sizeof( TPMI_RH_NV_INDEX ) +
2038 sizeof( TPMI_ALG_HASH ) + sizeof( TPMA_NV ) + sizeof( UINT16) +
2039 sizeof( UINT16 );
2040 publicInfo.t.nvPublic.nvIndex = TPM20_INDEX_TEST1;
2041 publicInfo.t.nvPublic.nameAlg = TPM_ALG_SHA1;
2042
2043 // First zero out attributes.
2044 *(UINT32 *)&( publicInfo.t.nvPublic.attributes ) = 0;
2045
2046 // Now set the attributes.
2047 publicInfo.t.nvPublic.attributes.TPMA_NV_PPREAD = 1;
2048 publicInfo.t.nvPublic.attributes.TPMA_NV_PPWRITE = 1;
2049 publicInfo.t.nvPublic.attributes.TPMA_NV_WRITE_STCLEAR = 1;
2050 publicInfo.t.nvPublic.attributes.TPMA_NV_PLATFORMCREATE = 1;
2051 publicInfo.t.nvPublic.attributes.TPMA_NV_ORDERLY = 1;
2052 publicInfo.t.nvPublic.authPolicy.t.size = 0;
2053 publicInfo.t.nvPublic.dataSize = 32;
2054
2055 sessionData.sessionHandle = TPM_RS_PW;
2056
2057 // Init nonce.
2058 sessionData.nonce.t.size = 0;
2059
2060 // init hmac
2061 sessionData.hmac.t.size = 0;
2062
2063 // Init session attributes
2064 *( (UINT8 *)((void *)&sessionData.sessionAttributes ) ) = 0;
2065
2066 sessionsData.cmdAuthsCount = 1;
2067 sessionsData.cmdAuths[0] = &sessionData;
2068
2069 rval = Tss2_Sys_NV_Read( sysContext, TPM_RH_PLATFORM, TPM20_INDEX_TEST1, &sessionsData, 32, 0, &nvData, &sessionsDataOut );
2070 CheckFailed( rval, TPM_RC_2 + TPM_RC_HANDLE );
2071
2072 rval = Tss2_Sys_NV_DefineSpace( sysContext, TPM_RH_PLATFORM, &sessionsData, &nvAuth, &publicInfo, &sessionsDataOut );
2073 CheckPassed( rval );
2074
2075 nvPublic.t.size = 0;
2076 rval = Tss2_Sys_NV_ReadPublic( sysContext, TPM20_INDEX_TEST1, 0, &nvPublic, &nvName, 0 );
2077 CheckPassed( rval );
2078
2079 rval = Tss2_Sys_NV_Read( sysContext, TPM_RH_PLATFORM, TPM20_INDEX_TEST1, &sessionsData, 32, 0, &nvData, &sessionsDataOut );
2080 CheckFailed( rval, TPM_RC_NV_UNINITIALIZED );
2081
2082 // Should fail since index is already defined.
2083 rval = Tss2_Sys_NV_DefineSpace( sysContext, TPM_RH_PLATFORM, &sessionsData, &nvAuth, &publicInfo, &sessionsDataOut );
2084 CheckFailed( rval, TPM_RC_NV_DEFINED );
2085
2086 nvWriteData.t.size = 4;
2087 for( i = 0; i < nvWriteData.t.size; i++ )
2088 nvWriteData.t.buffer[i] = 0xff - i;
2089
2090#if 1
2091 //
2092 // Following, at one point, was commented out so that NVDefine will work on successive
2093 // invocations of client app.
2094 //
2095 // Noticed on 12/13/12, this doesn't seem to be necessary anymore. Maybe something else
2096 // I did fixed it.
2097 //
2098 // Seems to be a bug in TPM 2.0 simulator that if:
2099 // First pass of tpmclient.exe after restarting TPM 2.0 simulator will work fine.
2100 // If NVWrite is done, subsequent invocations of tpmclient.exe will ALWAYS fail on
2101 // first call to Tpm2NVDefineSpace with 0x2cb error. Removing NVWrite removes this.
2102 // And restarting TPM 2.0 simulator will make it work the first time and fail
2103 // subsequent times.
2104 // Removing NVWrite works around this problem.
2105 //
2106 rval = Tss2_Sys_NV_Write( sysContext, TPM_RH_PLATFORM, TPM20_INDEX_TEST1, &sessionsData, &nvWriteData, 0, &sessionsDataOut );
2107 CheckPassed( rval );
Will-nucd6bbaa12015-12-08 11:51:25 -05002108
2109 nvData.t.size = sizeof( nvData ) - 2;
Will Arthur54e04e42015-07-15 11:29:25 -04002110 rval = Tss2_Sys_NV_Read( sysContext, TPM_RH_PLATFORM, TPM20_INDEX_TEST1, &sessionsData, 32, 0, &nvData, &sessionsDataOut );
2111 CheckPassed( rval );
2112
2113 rval = Tss2_Sys_NV_WriteLock( sysContext, TPM_RH_PLATFORM, TPM20_INDEX_TEST1, &sessionsData, &sessionsDataOut );
2114 CheckPassed( rval );
2115
2116 rval = Tss2_Sys_NV_Write( sysContext, TPM_RH_PLATFORM, TPM20_INDEX_TEST1, &sessionsData, &nvWriteData, 0, &sessionsDataOut );
2117 CheckFailed( rval, TPM_RC_NV_LOCKED );
2118#endif
2119
2120 // Now undefine the index.
2121 rval = Tss2_Sys_NV_UndefineSpace( sysContext, TPM_RH_PLATFORM, TPM20_INDEX_TEST1, &sessionsData, 0 );
2122 CheckPassed( rval );
2123
2124 rval = Tss2_Sys_NV_DefineSpace( sysContext, TPM_RH_PLATFORM, &sessionsData, &nvAuth, &publicInfo, 0 );
2125 CheckPassed( rval );
2126
2127 // Now undefine the index so that next run will work correctly.
2128 rval = Tss2_Sys_NV_UndefineSpace( sysContext, TPM_RH_PLATFORM, TPM20_INDEX_TEST1, &sessionsData, 0 );
2129 CheckPassed( rval );
2130
2131 publicInfo.t.nvPublic.attributes.TPMA_NV_PPREAD = 0;
2132 publicInfo.t.nvPublic.attributes.TPMA_NV_PPWRITE = 0;
2133 publicInfo.t.nvPublic.attributes.TPMA_NV_OWNERREAD = 1;
2134 publicInfo.t.nvPublic.attributes.TPMA_NV_OWNERWRITE = 1;
2135 publicInfo.t.nvPublic.attributes.TPMA_NV_PLATFORMCREATE = 0;
2136 publicInfo.t.nvPublic.attributes.TPMA_NV_ORDERLY = 1;
2137 publicInfo.t.nvPublic.nvIndex = TPM20_INDEX_TEST2;
2138 rval = Tss2_Sys_NV_DefineSpace( sysContext, TPM_RH_OWNER, &sessionsData, &nvAuth, &publicInfo, 0 );
2139 CheckPassed( rval );
2140
2141 nvPublic.t.size = 0;
Will-nucd6bbaa12015-12-08 11:51:25 -05002142 nvName.t.size = sizeof( nvName ) - 2;
Will Arthur54e04e42015-07-15 11:29:25 -04002143 rval = Tss2_Sys_NV_ReadPublic( sysContext, TPM20_INDEX_TEST2, 0, &nvPublic, &nvName, 0 );
2144 CheckPassed( rval );
2145
Will-nucd6bbaa12015-12-08 11:51:25 -05002146 nvData.t.size = sizeof( nvData ) - 2;
Will Arthur54e04e42015-07-15 11:29:25 -04002147 rval = Tss2_Sys_NV_Read( sysContext, TPM_RH_PLATFORM, TPM20_INDEX_TEST2, &sessionsData, 32, 0, &nvData, 0 );
2148 CheckFailed( rval, TPM_RC_NV_AUTHORIZATION );
2149
2150 // Now undefine the index.
2151 rval = Tss2_Sys_NV_UndefineSpace( sysContext, TPM_RH_OWNER, TPM20_INDEX_TEST2, &sessionsData, 0 );
2152 CheckPassed( rval );
2153
2154 rval = Tss2_Sys_NV_DefineSpace( sysContext, TPM_RH_OWNER, &sessionsData, &nvAuth, &publicInfo, 0 );
2155 CheckPassed( rval );
2156
2157 // Now undefine the index so that next run will work correctly.
2158 rval = Tss2_Sys_NV_UndefineSpace( sysContext, TPM_RH_OWNER, TPM20_INDEX_TEST2, &sessionsData, 0 );
2159 CheckPassed( rval );
2160
2161#if 0
2162 TpmClientPrintf( 0, "\nStart of NVUndefineSpaceSpecial test\n" );
2163
2164 // Init nonceNewer
2165 digestSize = GetDigestSize( TPM_ALG_SHA1 );
2166 nonceNewer.t.size = digestSize;
2167 for( i = 0; i < nonceNewer.t.size; i++ )
2168 nonceNewer.t.buffer[i] = 0;
2169
2170 // Init salt
2171 salt.t.size = 0;
2172
2173 // Init symmetric.
2174 symmetric.algorithm = TPM_ALG_NULL;
2175 symmetric.keyBits.sym = 0;
2176 symmetric.mode.sym = 0;
2177 rval = Tss2_Sys_StartAuthSession ( sysContext, TPM_RH_NULL, TPM_RH_PLATFORM, 0, &nonceNewer, &salt,
2178 TPM_SE_TRIAL, &symmetric, TPM_ALG_SHA1, &nvSessionHandle, &nvSessionNonce );
2179 CheckPassed( rval );
2180
2181 nvSessionHandle = ( ( TPM20_StartAuthSession_Out *)(TpmOutBuff) )->sessionHandle;
2182
2183 rval = Tss2_Sys_PolicyCommandCode ( sysContext, nvSessionHandle, 0, TPM_CC_NV_UndefineSpaceSpecial, 0 );
2184 CheckPassed( rval );
2185
2186 rval = Tss2_Sys_PolicyGetDigest( sysContext, nvSessionHandle, 0, &nvAuth1, 0 );
2187 CheckPassed( rval );
2188
2189 rval = Tss2_Sys_FlushContext( sysContext, nvSessionHandle );
2190
2191 nvAuth1 = (TPM2B_AUTH *)&( ( ( TPM20_PolicyGetDigest_Out *)(TpmOutBuff) )->otherData );
2192 publicInfo.t.nvPublic.authPolicy.t.size = nvAuth1->t.size;
2193 memcpy( &( publicInfo.t.nvPublic.authPolicy.t.buffer[0] ),c
2194 &( nvAuth1->t.buffer[0] ),
2195 publicInfo.t.nvPublic.authPolicy.t.size );
2196
2197 publicInfo.t.nvPublic.attributes.TPMA_NV_POLICY_DELETE = 1;
2198 publicInfo.t.nvPublic.attributes.TPMA_NV_PPREAD = 1;
2199 publicInfo.t.nvPublic.attributes.TPMA_NV_PPWRITE = 1;
2200 publicInfo.t.nvPublic.attributes.TPMA_NV_OWNERREAD = 0;
2201 publicInfo.t.nvPublic.attributes.TPMA_NV_OWNERWRITE = 0;
2202 publicInfo.t.nvPublic.attributes.TPMA_NV_PLATFORMCREATE = 1;
2203 publicInfo.t.nvPublic.attributes.TPMA_NV_ORDERLY = 1;
2204
2205 InitNullSession( &nvSession );
2206
2207 rval = Tss2_Sys_NV_DefineSpace( sysContext, TPM_RH_PLATFORM, &sessionsData, &nvAuth, &publicInfo, &sessionsDataOut );
2208 CheckPassed( rval );
2209
2210 rval = Tss2_Sys_StartAuthSession ( sysContext, TPM_RH_NULL, TPM_RH_PLATFORM, 0, &nonceCaller, &salt,
2211 TPM_SE_POLICY, &symmetric, TPM_ALG_SHA1, &nvSessionHandle, &nvSessionNonce );
2212 CheckPassed( rval );
2213
2214 nvSession.sessionHandle = nvSessionHandle = ( ( TPM20_StartAuthSession_Out *)(TpmOutBuff) )->sessionHandle;
2215
2216 rval = Tss2_Sys_PolicyCommandCode ( sysContext, nvSessionHandle, 0, TPM_CC_NV_UndefineSpaceSpecial, 0 );
2217 CheckPassed( rval );
2218
2219 nvSession->hmac = publicInfo.t.nvPublic.authPolicy;
2220
2221 nvSessions.cmdAuthsCount = 2;
2222 nvSessions.session[0] = nvSession;
2223
2224 rval = Tss2_Sys_NVUndefineSpaceSpecial( sysContext, TPM20_INDEX_TEST2, TPM_RH_PLATFORM, &nvSessions, &sessionsData );
2225 CheckPassed( rval );
2226#endif
2227}
2228
2229void TestHierarchyControl()
2230{
2231 UINT32 rval;
2232 TPM2B_NV_PUBLIC publicInfo;
2233 TPM2B_AUTH nvAuth;
2234 TPMS_AUTH_COMMAND sessionData;
2235 TPMS_AUTH_RESPONSE sessionDataOut;
2236 TSS2_SYS_CMD_AUTHS sessionsData;
2237 TSS2_SYS_RSP_AUTHS sessionsDataOut;
2238 int i;
2239 TPM2B_NAME nvName;
2240 TPM2B_NV_PUBLIC nvPublic;
2241 TPM2B_MAX_NV_BUFFER nvData;
2242
2243 TPMS_AUTH_COMMAND *sessionDataArray[1];
2244 TPMS_AUTH_RESPONSE *sessionDataOutArray[1];
2245
2246 sessionDataArray[0] = &sessionData;
2247 sessionDataOutArray[0] = &sessionDataOut;
2248
2249 sessionsDataOut.rspAuths = &sessionDataOutArray[0];
2250 sessionsData.cmdAuths = &sessionDataArray[0];
2251
2252 sessionsDataOut.rspAuthsCount = 1;
2253
2254 TpmClientPrintf( 0, "\nHIERARCHY CONTROL TESTS:\n" );
2255
2256 nvAuth.t.size = 20;
2257 for( i = 0; i < nvAuth.t.size; i++ )
2258 nvAuth.t.buffer[i] = i;
2259
2260 publicInfo.t.size = sizeof( TPMI_RH_NV_INDEX ) +
2261 sizeof( TPMI_ALG_HASH ) + sizeof( TPMA_NV ) + sizeof( UINT16) +
2262 sizeof( UINT16 );
2263 publicInfo.t.nvPublic.nvIndex = TPM20_INDEX_TEST1;
2264 publicInfo.t.nvPublic.nameAlg = TPM_ALG_SHA1;
2265
2266 // First zero out attributes.
2267 *(UINT32 *)&( publicInfo.t.nvPublic.attributes ) = 0;
2268
2269 // Now set the attributes.
2270 publicInfo.t.nvPublic.attributes.TPMA_NV_PPREAD = 1;
2271 publicInfo.t.nvPublic.attributes.TPMA_NV_PPWRITE = 1;
2272 publicInfo.t.nvPublic.attributes.TPMA_NV_PPWRITE = 1;
2273 publicInfo.t.nvPublic.attributes.TPMA_NV_WRITE_STCLEAR = 1;
2274 publicInfo.t.nvPublic.attributes.TPMA_NV_PLATFORMCREATE = 1;
2275 publicInfo.t.nvPublic.attributes.TPMA_NV_ORDERLY = 1;
2276 publicInfo.t.nvPublic.authPolicy.t.size = 0;
2277 publicInfo.t.nvPublic.dataSize = 32;
2278
2279 sessionData.sessionHandle = TPM_RS_PW;
2280
2281 // Init nonce.
2282 sessionData.nonce.t.size = 0;
2283
2284 // init hmac
2285 sessionData.hmac.t.size = 0;
2286
2287 // Init session attributes
2288 *( (UINT8 *)((void *)&sessionData.sessionAttributes ) ) = 0;
2289
2290 sessionsData.cmdAuthsCount = 1;
2291 sessionsData.cmdAuths[0] = &sessionData;
2292
2293 rval = Tss2_Sys_NV_DefineSpace( sysContext, TPM_RH_PLATFORM, &sessionsData, &nvAuth, &publicInfo, 0 );
2294 CheckPassed( rval );
2295
2296 // Test SAPI for case where nvPublic.t.size != 0
2297 nvPublic.t.size = 0xff;
2298 rval = Tss2_Sys_NV_ReadPublic( sysContext, TPM20_INDEX_TEST1, 0, &nvPublic, &nvName, 0 );
2299 CheckFailed( rval, TSS2_SYS_RC_BAD_VALUE );
2300
2301 nvPublic.t.size = 0;
Will-nucd6bbaa12015-12-08 11:51:25 -05002302 nvName.t.size = sizeof( nvName ) - 2;
Will Arthur54e04e42015-07-15 11:29:25 -04002303 rval = Tss2_Sys_NV_ReadPublic( sysContext, TPM20_INDEX_TEST1, 0, &nvPublic, &nvName, 0 );
2304 CheckPassed( rval );
2305
2306 rval = Tss2_Sys_NV_Read( sysContext, TPM_RH_PLATFORM, TPM20_INDEX_TEST1, &sessionsData, 32, 0, &nvData, &sessionsDataOut );
2307 CheckFailed( rval, TPM_RC_NV_UNINITIALIZED );
2308
2309 rval = Tss2_Sys_HierarchyControl( sysContext, TPM_RH_PLATFORM, &sessionsData, TPM_RH_PLATFORM, NO, &sessionsDataOut );
2310 CheckPassed( rval );
2311
2312 rval = Tss2_Sys_NV_Read( sysContext, TPM_RH_PLATFORM, TPM20_INDEX_TEST1, &sessionsData, 32, 0, &nvData, &sessionsDataOut );
2313 CheckFailed( rval, TPM_RC_1 + TPM_RC_HIERARCHY );
2314
2315 rval = Tss2_Sys_HierarchyControl( sysContext, TPM_RH_PLATFORM, &sessionsData, TPM_RH_PLATFORM, YES, &sessionsDataOut );
2316 CheckFailed( rval, TPM_RC_1 + TPM_RC_HIERARCHY );
2317
2318 // Need to do TPM reset and Startup to re-enable platform hierarchy.
2319 rval = TpmReset();
2320 CheckPassed(rval);
2321
2322 rval = Tss2_Sys_Startup ( sysContext, TPM_SU_CLEAR );
2323 CheckPassed( rval );
2324
2325 rval = Tss2_Sys_HierarchyControl( sysContext, TPM_RH_PLATFORM, &sessionsData, TPM_RH_PLATFORM, YES, &sessionsDataOut );
2326 CheckPassed( rval );
2327
2328 // Now undefine the index so that next run will work correctly.
2329 rval = Tss2_Sys_NV_UndefineSpace( sysContext, TPM_RH_PLATFORM, TPM20_INDEX_TEST1, &sessionsData, 0 );
2330 CheckPassed( rval );
2331}
2332
2333TPM2B_PUBLIC inPublic = { { sizeof( TPM2B_PUBLIC ) - 2, } };
2334
2335void TestCreate(){
2336 UINT32 rval;
2337 TPM2B_SENSITIVE_CREATE inSensitive = { { sizeof( TPM2B_SENSITIVE_CREATE ) - 2, } };
2338 TPM2B_DATA outsideInfo = { { sizeof( TPM2B_DATA ) - 2, } };
2339 TPML_PCR_SELECTION creationPCR;
2340 TPMS_AUTH_COMMAND sessionData;
2341 TPMS_AUTH_RESPONSE sessionDataOut;
2342 TSS2_SYS_CMD_AUTHS sessionsData;
2343
2344 TSS2_SYS_RSP_AUTHS sessionsDataOut;
2345 TPM2B_NAME name = { { sizeof( TPM2B_NAME ) - 2, } };
2346 TPM2B_NAME name1 = { { sizeof( TPM2B_NAME ) - 2, } };
2347 TPM2B_PRIVATE outPrivate = { { sizeof( TPM2B_PRIVATE ) - 2, } };
2348 TPM2B_PUBLIC outPublic = { { sizeof( TPM2B_PUBLIC ) - 2, } };
2349 TPM2B_CREATION_DATA creationData = { { sizeof( TPM2B_CREATION_DATA ) - 2, } };
2350 TPM2B_DIGEST creationHash = { { sizeof( TPM2B_DIGEST ) - 2, } };
2351 TPMT_TK_CREATION creationTicket = { 0, 0, { { sizeof( TPM2B_DIGEST ) - 2, } } };
2352
2353 TPMS_AUTH_COMMAND *sessionDataArray[1];
2354 TPMS_AUTH_RESPONSE *sessionDataOutArray[1];
2355
2356 sessionDataArray[0] = &sessionData;
2357 sessionDataOutArray[0] = &sessionDataOut;
2358
2359 sessionsDataOut.rspAuths = &sessionDataOutArray[0];
2360 sessionsData.cmdAuths = &sessionDataArray[0];
2361
2362 sessionsDataOut.rspAuthsCount = 1;
2363
2364 TpmClientPrintf( 0, "\nCREATE, CREATE PRIMARY, and LOAD TESTS:\n" );
2365
2366 inSensitive.t.sensitive.userAuth = loadedSha1KeyAuth;
2367 inSensitive.t.sensitive.userAuth = loadedSha1KeyAuth;
2368 inSensitive.t.sensitive.data.t.size = 0;
2369 inSensitive.t.size = loadedSha1KeyAuth.b.size + 2;
2370
2371 inPublic.t.publicArea.type = TPM_ALG_RSA;
2372 inPublic.t.publicArea.nameAlg = TPM_ALG_SHA1;
2373
2374 // First clear attributes bit field.
2375 *(UINT32 *)&( inPublic.t.publicArea.objectAttributes) = 0;
2376 inPublic.t.publicArea.objectAttributes.restricted = 1;
2377 inPublic.t.publicArea.objectAttributes.userWithAuth = 1;
2378 inPublic.t.publicArea.objectAttributes.decrypt = 1;
2379 inPublic.t.publicArea.objectAttributes.fixedTPM = 1;
2380 inPublic.t.publicArea.objectAttributes.fixedParent = 1;
2381 inPublic.t.publicArea.objectAttributes.sensitiveDataOrigin = 1;
2382
2383 inPublic.t.publicArea.authPolicy.t.size = 0;
2384
2385 inPublic.t.publicArea.parameters.rsaDetail.symmetric.algorithm = TPM_ALG_AES;
2386 inPublic.t.publicArea.parameters.rsaDetail.symmetric.keyBits.aes = 128;
2387 inPublic.t.publicArea.parameters.rsaDetail.symmetric.mode.aes = TPM_ALG_ECB;
2388 inPublic.t.publicArea.parameters.rsaDetail.scheme.scheme = TPM_ALG_NULL;
2389 inPublic.t.publicArea.parameters.rsaDetail.keyBits = 1024;
2390 inPublic.t.publicArea.parameters.rsaDetail.exponent = 0;
2391
2392 inPublic.t.publicArea.unique.rsa.t.size = 0;
2393
2394 outsideInfo.t.size = 0;
2395 creationPCR.count = 0;
2396
2397 sessionData.sessionHandle = TPM_RS_PW;
2398
2399 // Init nonce.
2400 sessionData.nonce.t.size = 0;
2401
2402 // init hmac
2403 sessionData.hmac.t.size = 0;
2404
2405 // Init session attributes
2406 *( (UINT8 *)((void *)&sessionData.sessionAttributes ) ) = 0;
2407
2408 sessionsData.cmdAuthsCount = 1;
2409 sessionsData.cmdAuths[0] = &sessionData;
2410
2411 inPublic.t.publicArea.parameters.rsaDetail.keyBits = 2048;
2412
2413 // Do SAPI test for non-zero sized outPublic
2414 outPublic.t.size = 0xff;
2415 creationData.t.size = 0;
2416 rval = Tss2_Sys_CreatePrimary( sysContext, TPM_RH_PLATFORM, &sessionsData, &inSensitive, &inPublic,
2417 &outsideInfo, &creationPCR, &handle2048rsa, &outPublic, &creationData, &creationHash,
2418 &creationTicket, &name, &sessionsDataOut );
2419 CheckFailed( rval, TSS2_SYS_RC_BAD_VALUE );
2420
2421 rval = Tss2_Sys_FlushContext( sysContext, handle2048rsa );
2422 CheckPassed( rval );
Will Arthur54e04e42015-07-15 11:29:25 -04002423
2424 outPublic.t.size = 0;
2425 creationData.t.size = sizeof( TPM2B_CREATION_DATA ) - 2;
wcarthur7b10eeb2015-12-03 16:40:41 -05002426 rval = Tss2_Sys_CreatePrimary( sysContext, TPM_RH_PLATFORM, &sessionsData, &inSensitive, &inPublic,
2427 &outsideInfo, &creationPCR, &handle2048rsa, &outPublic, &creationData, &creationHash,
2428 &creationTicket, &name, &sessionsDataOut );
2429 CheckFailed( rval, TSS2_SYS_RC_BAD_VALUE );
2430
2431 rval = Tss2_Sys_FlushContext( sysContext, handle2048rsa );
2432 CheckPassed( rval );
2433
2434 outPublic.t.size = 0;
2435 creationData.t.size = 0;
Will Arthur54e04e42015-07-15 11:29:25 -04002436 rval = Tss2_Sys_CreatePrimary( sysContext, TPM_RH_PLATFORM, &sessionsData, &inSensitive, &inPublic,
2437 &outsideInfo, &creationPCR, &handle2048rsa, &outPublic, &creationData, &creationHash,
2438 &creationTicket, &name, &sessionsDataOut );
2439 CheckPassed( rval );
2440
2441 TpmClientPrintf( 0, "\nNew key successfully created in platform hierarchy (RSA 2048). Handle: 0x%8.8x\n",
2442 handle2048rsa );
2443
2444 sessionData.hmac.t.size = 2;
2445 sessionData.hmac.t.buffer[0] = 0x00;
2446 sessionData.hmac.t.buffer[1] = 0xff;
2447
2448 inPublic.t.publicArea.type = TPM_ALG_KEYEDHASH;
2449 inPublic.t.publicArea.objectAttributes.decrypt = 0;
2450 inPublic.t.publicArea.objectAttributes.sign = 1;
2451
2452 inPublic.t.publicArea.parameters.keyedHashDetail.scheme.scheme = TPM_ALG_HMAC;
2453 inPublic.t.publicArea.parameters.keyedHashDetail.scheme.details.hmac.hashAlg = TPM_ALG_SHA1;
2454
2455 inPublic.t.publicArea.unique.keyedHash.t.size = 0;
2456
2457 outsideInfo.t.size = 0;
2458 outPublic.t.size = 0;
2459 creationData.t.size = 0;
2460 rval = Tss2_Sys_Create( sysContext, handle2048rsa, &sessionsData, &inSensitive, &inPublic,
2461 &outsideInfo, &creationPCR,
2462 &outPrivate, &outPublic, &creationData,
2463 &creationHash, &creationTicket, &sessionsDataOut );
2464 CheckPassed( rval );
2465
2466 rval = Tss2_Sys_Load ( sysContext, handle2048rsa, &sessionsData, &outPrivate, &outPublic,
2467 &loadedSha1KeyHandle, &name, &sessionsDataOut);
2468 CheckPassed( rval );
2469
2470 rval = (*HandleToNameFunctionPtr)( loadedSha1KeyHandle, &name1 );
2471 CheckPassed( rval );
2472 OpenOutFile( &outFp );
2473 TpmClientPrintf( 0, "Name of loaded key: " );
2474 PrintSizedBuffer( (TPM2B *)&name1 );
2475 CloseOutFile( &outFp );
2476
2477 rval = CompareTPM2B( &name.b, &name1.b );
2478 CheckPassed( rval );
2479
2480 TpmClientPrintf( 0, "\nLoaded key handle: %8.8x\n", loadedSha1KeyHandle );
2481}
2482
2483void TestEvict()
2484{
2485 TPM_RC rval = TPM_RC_SUCCESS;
2486 TPM2B_SENSITIVE_CREATE inSensitive = { { sizeof( TPM2B_SENSITIVE_CREATE ) - 2, } };
2487 TPM2B_DATA outsideInfo = { { sizeof( TPM2B_DATA ) - 2, } };
2488 TPML_PCR_SELECTION creationPCR;
2489 TPMS_AUTH_COMMAND sessionData;
2490 TPMS_AUTH_RESPONSE sessionDataOut;
2491 TSS2_SYS_CMD_AUTHS sessionsData;
2492 TSS2_SYS_RSP_AUTHS sessionsDataOut;
2493
2494 TPM2B_PRIVATE outPrivate = { { sizeof( TPM2B_PRIVATE ) - 2, } };
2495 TPM2B_PUBLIC outPublic = { { sizeof( TPM2B_PUBLIC ) - 2, } };
2496 TPM2B_CREATION_DATA creationData = { { sizeof( TPM2B_CREATION_DATA ) - 2, } };
2497 TPM2B_DIGEST creationHash = { { sizeof( TPM2B_DIGEST ) - 2, } };
2498 TPMT_TK_CREATION creationTicket = { 0, 0, { { sizeof( TPM2B_DIGEST ) - 2, } } };
2499
2500 TPMS_AUTH_COMMAND *sessionDataArray[1];
2501 TPMS_AUTH_RESPONSE *sessionDataOutArray[1];
2502
2503 TSS2_TCTI_CONTEXT *otherResMgrTctiContext = 0;
2504 TSS2_SYS_CONTEXT *otherSysContext;
2505 char otherResMgrInterfaceName[] = "Other Resource Manager";
2506
2507 sessionDataArray[0] = &sessionData;
2508 sessionDataOutArray[0] = &sessionDataOut;
2509
2510 sessionsDataOut.rspAuths = &sessionDataOutArray[0];
2511 sessionsData.cmdAuths = &sessionDataArray[0];
2512 sessionsData.cmdAuthsCount = 1;
2513
2514 sessionsDataOut.rspAuthsCount = 1;
2515
2516 outsideInfo.t.size = 0;
2517 creationPCR.count = 0;
2518
2519 TpmClientPrintf( 0, "\nEVICT CONTROL TESTS:\n" );
2520
2521 // Make transient key persistent.
2522 sessionData.sessionHandle = TPM_RS_PW;
2523
2524 // Init nonce.
2525 sessionData.nonce.t.size = 0;
2526
2527 // init hmac
2528 sessionData.hmac.t.size = 0;
2529
2530 // Init session attributes
2531 *( (UINT8 *)((void *)&sessionData.sessionAttributes ) ) = 0;
2532
2533 rval = Tss2_Sys_EvictControl( sysContext, TPM_RH_PLATFORM, handle2048rsa, &sessionsData, 0x81800000, &sessionsDataOut );
2534 CheckPassed( rval );
2535
2536 sessionData.sessionHandle = TPM_RS_PW;
2537
2538 // Init nonce.
2539 sessionData.nonce.t.size = 0;
2540
2541 // Init session attributes
2542 *( (UINT8 *)((void *)&sessionData.sessionAttributes ) ) = 0;
2543
2544 // Create new key under persistent one.
2545 sessionData.hmac.t.size = 2;
2546 sessionData.hmac.t.buffer[0] = 0x00;
2547 sessionData.hmac.t.buffer[1] = 0xff;
2548
2549 inPublic.t.publicArea.nameAlg = TPM_ALG_SHA1;
2550 inPublic.t.publicArea.type = TPM_ALG_KEYEDHASH;
2551 inPublic.t.publicArea.objectAttributes.decrypt = 0;
2552 inPublic.t.publicArea.objectAttributes.sign = 1;
2553
2554 inPublic.t.publicArea.parameters.keyedHashDetail.scheme.scheme = TPM_ALG_HMAC;
2555 inPublic.t.publicArea.parameters.keyedHashDetail.scheme.details.hmac.hashAlg = TPM_ALG_SHA1;
2556
2557 inPublic.t.publicArea.unique.keyedHash.t.size = 0;
2558
2559 inSensitive.t.sensitive.userAuth = loadedSha1KeyAuth;
2560 inSensitive.t.sensitive.userAuth = loadedSha1KeyAuth;
2561 inSensitive.t.sensitive.data.t.size = 0;
2562 inSensitive.t.size = loadedSha1KeyAuth.b.size + 2;
2563
2564 outsideInfo.t.size = 0;
2565 outPublic.t.size = 0;
2566 creationData.t.size = 0;
2567
2568 // Try creating a key under the persistent key using a different context.
2569
2570 rval = InitTctiResMgrContext( rmInterfaceConfig, &otherResMgrTctiContext, &otherResMgrInterfaceName[0] );
2571 if( rval != TSS2_RC_SUCCESS )
2572 {
2573 TpmClientPrintf( 0, "Resource Mgr, %s, failed initialization: 0x%x. Exiting...\n", resMgrInterfaceInfo.shortName, rval );
2574 Cleanup();
2575 return;
2576 }
2577 else
2578 {
2579 (( TSS2_TCTI_CONTEXT_INTEL *)otherResMgrTctiContext )->status.debugMsgLevel = debugLevel;
2580 }
2581
2582 otherSysContext = InitSysContext( 0, otherResMgrTctiContext, &abiVersion );
2583 if( otherSysContext == 0 )
2584 {
2585 InitSysContextFailure();
2586 }
2587
2588 rval = Tss2_Sys_Create( otherSysContext, 0x81800000, &sessionsData, &inSensitive, &inPublic,
2589 &outsideInfo, &creationPCR,
2590 &outPrivate, &outPublic, &creationData,
2591 &creationHash, &creationTicket, &sessionsDataOut );
2592 CheckPassed( rval );
2593
2594 rval = TeardownTctiResMgrContext( rmInterfaceConfig, otherResMgrTctiContext, &otherResMgrInterfaceName[0] );
2595 CheckPassed( rval );
2596
2597 TeardownSysContext( &otherSysContext );
2598
2599 outsideInfo.t.size = 0;
2600 outPublic.t.size = 0;
2601 creationData.t.size = 0;
2602
2603 // Try creating a key under the transient key. This should work, too.
2604 rval = Tss2_Sys_Create( sysContext, handle2048rsa, &sessionsData, &inSensitive, &inPublic,
2605 &outsideInfo, &creationPCR,
2606 &outPrivate, &outPublic, &creationData,
2607 &creationHash, &creationTicket, &sessionsDataOut );
2608 CheckPassed( rval );
2609
2610 // Reset persistent key to be transitent.
2611 sessionData.hmac.t.size = 0;
2612 rval = Tss2_Sys_EvictControl( sysContext, TPM_RH_PLATFORM, 0x81800000, &sessionsData, 0x81800000, &sessionsDataOut );
2613 CheckPassed( rval );
2614}
2615
2616TPM_RC DefineNvIndex( TPMI_RH_PROVISION authHandle, TPMI_SH_AUTH_SESSION sessionAuthHandle, TPM2B_AUTH *auth, TPM2B_DIGEST *authPolicy,
2617 TPMI_RH_NV_INDEX nvIndex, TPMI_ALG_HASH nameAlg, TPMA_NV attributes, UINT16 size )
2618{
2619 TPM_RC rval = TPM_RC_SUCCESS;
2620 TPM2B_NV_PUBLIC publicInfo;
2621
2622 // Command and response session data structures.
2623 TPMS_AUTH_COMMAND sessionData = { sessionAuthHandle, };
2624 TPMS_AUTH_RESPONSE sessionDataOut;
2625 TPMS_AUTH_COMMAND *sessionDataArray[1] = { &sessionData };
2626 TPMS_AUTH_RESPONSE *sessionDataOutArray[1] = { &sessionDataOut };
2627 TSS2_SYS_CMD_AUTHS sessionsData = { 1, &sessionDataArray[0] };
2628 TSS2_SYS_RSP_AUTHS sessionsDataOut = { 1, &sessionDataOutArray[0] };
2629 // Init nonce.
2630 sessionData.nonce.t.size = 0;
2631 // init hmac
2632 sessionData.hmac.t.size = 0;
2633 // Init session attributes
2634 *( (UINT8 *)((void *)&sessionData.sessionAttributes ) ) = 0;
2635
2636 attributes.TPMA_NV_ORDERLY = 1;
2637
2638 // Init public info structure.
2639 publicInfo.t.nvPublic.attributes = attributes;
2640 CopySizedByteBuffer( &publicInfo.t.nvPublic.authPolicy.b, &authPolicy->b );
2641 publicInfo.t.nvPublic.dataSize = size;
2642 publicInfo.t.size = sizeof( TPMI_RH_NV_INDEX ) +
2643 sizeof( TPMI_ALG_HASH ) + sizeof( TPMA_NV ) + sizeof( UINT16) +
2644 sizeof( UINT16 );
2645 publicInfo.t.nvPublic.nvIndex = nvIndex;
2646 publicInfo.t.nvPublic.nameAlg = nameAlg;
2647
2648 // Create the index
2649 rval = Tss2_Sys_NV_DefineSpace( sysContext, authHandle, &sessionsData, auth, &publicInfo, &sessionsDataOut );
2650
2651 return rval;
2652}
2653
2654typedef struct {
2655 char name[50];
2656 TPM_RC (*buildPolicyFn )( TSS2_SYS_CONTEXT *sysContext, SESSION *trialPolicySession, TPM2B_DIGEST *policyDigest );
2657 TPM_RC (*createObjectFn )( TSS2_SYS_CONTEXT *sysContext, SESSION **policySession, TPM2B_DIGEST *policyDigest );
2658 TPM_RC (*testPolicyFn )( TSS2_SYS_CONTEXT *sysContext, SESSION *policySession );
2659} POLICY_TEST_SETUP;
2660
2661TPM_RC BuildPolicy( TSS2_SYS_CONTEXT *sysContext, SESSION **policySession,
2662 TPM_RC (*buildPolicyFn )( TSS2_SYS_CONTEXT *sysContext, SESSION *policySession, TPM2B_DIGEST *policyDigest ),
2663 TPM2B_DIGEST *policyDigest, bool trialSession )
2664{
2665 // NOTE: this policySession will be either a trial or normal policy session
2666 // depending on the value of the passed in trialSession parameter.
2667 TPM2B_ENCRYPTED_SECRET encryptedSalt = { {0}, };
2668 TPMT_SYM_DEF symmetric;
2669 TPM_RC rval;
2670 TPM2B_NONCE nonceCaller;
2671
2672 nonceCaller.t.size = 0;
2673
2674 // Start policy session.
2675 symmetric.algorithm = TPM_ALG_NULL;
2676 rval = StartAuthSessionWithParams( policySession, TPM_RH_NULL, 0, TPM_RH_NULL, 0, &nonceCaller, &encryptedSalt, trialSession ? TPM_SE_TRIAL : TPM_SE_POLICY , &symmetric, TPM_ALG_SHA256 );
2677 if( rval != TPM_RC_SUCCESS )
2678 return rval;
2679
2680 // Send policy command.
2681 rval = ( *buildPolicyFn )( sysContext, *policySession, policyDigest );
2682 CheckPassed( rval );
2683
2684 // Get policy hash.
wcarthur7b10eeb2015-12-03 16:40:41 -05002685 policyDigest->t.size = sizeof( *policyDigest ) - 2;
Will Arthur54e04e42015-07-15 11:29:25 -04002686 rval = Tss2_Sys_PolicyGetDigest( sysContext, (*policySession)->sessionHandle,
2687 0, policyDigest, 0 );
2688 CheckPassed( rval );
2689
2690 if( trialSession )
2691 {
2692 // Need to flush the session here.
2693 rval = Tss2_Sys_FlushContext( sysContext, (*policySession)->sessionHandle );
2694 CheckPassed( rval );
2695
2696 // And remove the session from sessions table.
2697 rval = EndAuthSession( *policySession );
2698 CheckPassed( rval );
2699 }
2700
2701 return rval;
2702}
2703
2704TPM_RC CreateNVIndex( TSS2_SYS_CONTEXT *sysContext, SESSION **policySession, TPM2B_DIGEST *policyDigest )
2705{
2706 TPM_RC rval = TPM_RC_SUCCESS;
2707 TPMA_LOCALITY locality;
2708 TPM2B_ENCRYPTED_SECRET encryptedSalt = { {0}, };
2709 TPMT_SYM_DEF symmetric;
2710 TPMA_NV nvAttributes;
2711 TPM2B_AUTH nvAuth;
2712 TPM2B_NONCE nonceCaller;
2713
2714 nonceCaller.t.size = 0;
2715
2716 // Since locality is a fairly simple command and we can guarantee
2717 // its correctness, we don't need a trial session for this.
2718
2719 // Start real policy session
2720 symmetric.algorithm = TPM_ALG_NULL;
2721 rval = StartAuthSessionWithParams( policySession, TPM_RH_NULL,
2722 0, TPM_RH_NULL, 0, &nonceCaller, &encryptedSalt, TPM_SE_POLICY,
2723 &symmetric, TPM_ALG_SHA256 );
2724 CheckPassed( rval );
2725
2726 // Send PolicyLocality command
2727 *(UINT8 *)( (void *)&locality ) = 0;
2728 locality.TPM_LOC_THREE = 1;
2729 rval = Tss2_Sys_PolicyLocality( sysContext, (*policySession)->sessionHandle,
2730 0, locality, 0 );
2731 CheckPassed( rval );
2732
2733 // Read policyHash
wcarthur7b10eeb2015-12-03 16:40:41 -05002734 policyDigest->t.size = sizeof( *policyDigest ) - 2;
Will Arthur54e04e42015-07-15 11:29:25 -04002735 rval = Tss2_Sys_PolicyGetDigest( sysContext,
2736 (*policySession)->sessionHandle, 0, policyDigest, 0 );
2737 CheckPassed( rval );
2738
2739 nvAuth.t.size = 0;
2740
2741 // Now set the attributes.
2742 *(UINT32 *)( (void *)&nvAttributes ) = 0;
2743 nvAttributes.TPMA_NV_POLICYREAD = 1;
2744 nvAttributes.TPMA_NV_POLICYWRITE = 1;
2745 nvAttributes.TPMA_NV_PLATFORMCREATE = 1;
2746
2747 rval = DefineNvIndex( TPM_RH_PLATFORM, TPM_RS_PW, &nvAuth, policyDigest,
2748 TPM20_INDEX_PASSWORD_TEST, TPM_ALG_SHA256, nvAttributes, 32 );
2749 CheckPassed( rval );
2750
2751 AddEntity( TPM20_INDEX_PASSWORD_TEST, &nvAuth );
2752 CheckPassed( rval );
2753
2754 return rval;
2755}
2756
2757
2758TPM_RC TestLocality( TSS2_SYS_CONTEXT *sysContext, SESSION *policySession )
2759{
2760 TSS2_RC rval = TPM_RC_SUCCESS;
2761 TSS2_SYS_CMD_AUTHS sessionsData;
2762 TPM2B_MAX_NV_BUFFER nvWriteData;
2763 TSS2_SYS_RSP_AUTHS sessionsDataOut = { 1, };
2764 TPMS_AUTH_COMMAND sessionData;
2765 TPMS_AUTH_RESPONSE sessionDataOut;
2766
2767 TPMS_AUTH_COMMAND *sessionDataArray[1];
2768 TPMS_AUTH_RESPONSE *sessionDataOutArray[1];
2769
2770 sessionDataArray[0] = &sessionData;
2771 sessionDataOutArray[0] = &sessionDataOut;
2772
2773 sessionsDataOut.rspAuths = &sessionDataOutArray[0];
2774 sessionsData.cmdAuths = &sessionDataArray[0];
2775
2776 // Init write data.
2777 nvWriteData.t.size = 0;
2778
2779 sessionsData.cmdAuthsCount = 1;
2780 sessionsData.cmdAuths[0]->sessionHandle = policySession->sessionHandle;
2781 sessionsData.cmdAuths[0]->nonce.t.size = 0;
2782 sessionsData.cmdAuths[0]->hmac.t.size = 0;
2783
2784 *(UINT8 *)( (void *)&( sessionsData.cmdAuths[0]->sessionAttributes ) ) = 0;
2785 sessionsData.cmdAuths[0]->sessionAttributes.continueSession = 1;
2786
2787 rval = SetLocality( sysContext, 2 );
2788 CheckPassed( rval );
2789
2790 // Do NV write using open session's policy.
2791 rval = Tss2_Sys_NV_Write( sysContext, TPM20_INDEX_PASSWORD_TEST,
2792 TPM20_INDEX_PASSWORD_TEST,
2793 &sessionsData, &nvWriteData, 0, &sessionsDataOut );
2794 CheckFailed( rval, TPM_RC_LOCALITY );
2795
2796 rval = SetLocality( sysContext, 3 );
2797 CheckPassed( rval );
2798
2799 // Do NV write using open session's policy.
2800 rval = Tss2_Sys_NV_Write( sysContext, TPM20_INDEX_PASSWORD_TEST,
2801 TPM20_INDEX_PASSWORD_TEST,
2802 &sessionsData, &nvWriteData, 0, &sessionsDataOut );
2803 CheckPassed( rval );
2804
2805 // Do another NV write using open session's policy.
2806 rval = Tss2_Sys_NV_Write( sysContext, TPM20_INDEX_PASSWORD_TEST,
2807 TPM20_INDEX_PASSWORD_TEST,
2808 &sessionsData, &nvWriteData, 0, &sessionsDataOut );
2809 CheckFailed( rval, TPM_RC_POLICY_FAIL + TPM_RC_S + TPM_RC_1 );
2810
2811 // Delete NV index
2812 sessionsData.cmdAuths[0]->sessionHandle = TPM_RS_PW;
2813 sessionsData.cmdAuths[0]->nonce.t.size = 0;
2814 sessionsData.cmdAuths[0]->nonce.t.buffer[0] = 0xa5;
2815 sessionData.hmac.t.size = 0;
2816
2817 // Now undefine the index.
2818 rval = Tss2_Sys_NV_UndefineSpace( sysContext, TPM_RH_PLATFORM,
2819 TPM20_INDEX_PASSWORD_TEST, &sessionsData, 0 );
2820 CheckPassed( rval );
2821
2822 rval = DeleteEntity( TPM20_INDEX_PASSWORD_TEST );
2823 CheckPassed( rval );
2824
2825 return rval;
2826}
2827
2828UINT8 passwordPCRTestPassword[] = "password PCR";
2829UINT8 dataBlob[] = "some data";
2830TPM_HANDLE blobHandle;
2831TPM2B_AUTH blobAuth;
2832
2833TPM_RC BuildPasswordPolicy( TSS2_SYS_CONTEXT *sysContext, SESSION *policySession, TPM2B_DIGEST *policyDigest )
2834{
2835 TPM_RC rval = TPM_RC_SUCCESS;
2836
2837 rval = Tss2_Sys_PolicyPassword( sysContext, policySession->sessionHandle, 0, 0 );
2838 CheckPassed( rval );
2839
2840 return rval;
2841}
2842
2843TPM_RC BuildAuthValuePolicy( TSS2_SYS_CONTEXT *sysContext, SESSION *policySession, TPM2B_DIGEST *policyDigest )
2844{
2845 TPM_RC rval = TPM_RC_SUCCESS;
2846
2847 rval = Tss2_Sys_PolicyAuthValue( sysContext, policySession->sessionHandle, 0, 0 );
2848 CheckPassed( rval );
2849
2850 return rval;
2851}
2852
2853
2854TPM_RC BuildPasswordPcrPolicy( TSS2_SYS_CONTEXT *sysContext, SESSION *policySession, TPM2B_DIGEST *policyDigest )
2855{
2856 TPM_RC rval = TPM_RC_SUCCESS;
2857 TPM2B_DIGEST pcrDigest;
2858 TPML_PCR_SELECTION pcrs;
2859 TPML_DIGEST pcrValues;
2860 UINT32 pcrUpdateCounter;
2861 TPML_PCR_SELECTION pcrSelectionOut;
2862
2863 pcrDigest.t.size = 0;
2864 rval = Tss2_Sys_PolicyPassword( sysContext, policySession->sessionHandle, 0, 0 );
2865 CheckPassed( rval );
2866
2867 pcrs.count = 1;
2868 pcrs.pcrSelections[0].hash = TPM_ALG_SHA1;
2869 pcrs.pcrSelections[0].sizeofSelect = 3;
2870 pcrs.pcrSelections[0].pcrSelect[0] = 0;
2871 pcrs.pcrSelections[0].pcrSelect[1] = 0;
2872 pcrs.pcrSelections[0].pcrSelect[2] = 0;
2873 SET_PCR_SELECT_BIT( pcrs.pcrSelections[0], PCR_0 );
2874 SET_PCR_SELECT_BIT( pcrs.pcrSelections[0], PCR_3 );
2875
2876 //
2877 // Compute pcrDigest
2878 //
2879 // Read PCRs
2880 rval = Tss2_Sys_PCR_Read( sysContext, 0, &pcrs, &pcrUpdateCounter, &pcrSelectionOut, &pcrValues, 0 );
2881 CheckPassed( rval );
wcarthur7b10eeb2015-12-03 16:40:41 -05002882
Will Arthur54e04e42015-07-15 11:29:25 -04002883 // Hash them together
wcarthur7b10eeb2015-12-03 16:40:41 -05002884 pcrDigest.t.size = sizeof( pcrDigest ) - 2;
Will Arthur54e04e42015-07-15 11:29:25 -04002885 rval = TpmHashSequence( policySession->authHash, pcrValues.count, &pcrValues.digests[0], &pcrDigest );
wcarthur7b10eeb2015-12-03 16:40:41 -05002886 CheckPassed( rval );
Will Arthur54e04e42015-07-15 11:29:25 -04002887
2888 rval = Tss2_Sys_PolicyPCR( sysContext, policySession->sessionHandle, 0, &pcrDigest, &pcrs, 0 );
2889 CheckPassed( rval );
2890
2891 return rval;
2892}
2893
2894
2895TPM_RC CreateDataBlob( TSS2_SYS_CONTEXT *sysContext, SESSION **policySession, TPM2B_DIGEST *policyDigest )
2896{
2897 TPM_RC rval = TPM_RC_SUCCESS;
2898 TPMS_AUTH_COMMAND cmdAuth;
2899 TPMS_AUTH_COMMAND *cmdSessionArray[1] = { &cmdAuth };
2900 TSS2_SYS_CMD_AUTHS cmdAuthArray = { 1, &cmdSessionArray[0] };
2901 TPM2B_SENSITIVE_CREATE inSensitive;
2902 TPM2B_PUBLIC inPublic;
2903 TPM2B_DATA outsideInfo = { { 0, } };
2904 TPML_PCR_SELECTION creationPcr = { 0 };
2905 TPM2B_PUBLIC outPublic;
2906 TPM2B_CREATION_DATA creationData;
2907 TPM_HANDLE srkHandle;
2908 TPM2B_DIGEST creationHash;
2909 TPMT_TK_CREATION creationTicket;
2910 TPM2B_NAME srkName, blobName;
2911 TPM2B_DIGEST data;
2912 TPM2B_PRIVATE outPrivate;
2913
2914 cmdAuth.sessionHandle = TPM_RS_PW;
2915 cmdAuth.nonce.t.size = 0;
2916 *( (UINT8 *)((void *)&cmdAuth.sessionAttributes ) ) = 0;
2917 cmdAuth.hmac.t.size = 0;
2918
2919 inSensitive.t.sensitive.userAuth.t.size = 0;
2920 inSensitive.t.sensitive.data.t.size = 0;
2921
2922 inPublic.t.publicArea.type = TPM_ALG_RSA;
2923 inPublic.t.publicArea.nameAlg = TPM_ALG_SHA1;
2924 *(UINT32 *)&( inPublic.t.publicArea.objectAttributes) = 0;
2925 inPublic.t.publicArea.objectAttributes.restricted = 1;
2926 inPublic.t.publicArea.objectAttributes.userWithAuth = 1;
2927 inPublic.t.publicArea.objectAttributes.decrypt = 1;
2928 inPublic.t.publicArea.objectAttributes.fixedTPM = 1;
2929 inPublic.t.publicArea.objectAttributes.fixedParent = 1;
2930 inPublic.t.publicArea.objectAttributes.sensitiveDataOrigin = 1;
2931 inPublic.t.publicArea.authPolicy.t.size = 0;
2932 inPublic.t.publicArea.parameters.rsaDetail.symmetric.algorithm = TPM_ALG_AES;
2933 inPublic.t.publicArea.parameters.rsaDetail.symmetric.keyBits.aes = 128;
2934 inPublic.t.publicArea.parameters.rsaDetail.symmetric.mode.aes = TPM_ALG_CBC;
2935 inPublic.t.publicArea.parameters.rsaDetail.scheme.scheme = TPM_ALG_NULL;
2936 inPublic.t.publicArea.parameters.rsaDetail.keyBits = 2048;
2937 inPublic.t.publicArea.parameters.rsaDetail.exponent = 0;
2938 inPublic.t.publicArea.unique.rsa.t.size = 0;
2939
2940 outPublic.t.size = 0;
2941 creationData.t.size = 0;
2942 rval = Tss2_Sys_CreatePrimary( sysContext, TPM_RH_PLATFORM, &cmdAuthArray,
2943 &inSensitive, &inPublic, &outsideInfo, &creationPcr,
2944 &srkHandle, &outPublic, &creationData, &creationHash,
2945 &creationTicket, &srkName, 0 );
2946 CheckPassed( rval );
2947
2948 cmdAuth.sessionHandle = TPM_RS_PW;
2949
2950 inSensitive.t.sensitive.userAuth.t.size = 0;
2951 blobAuth.t.size = sizeof( passwordPCRTestPassword );
2952 memcpy( &blobAuth.t.buffer, passwordPCRTestPassword, sizeof( passwordPCRTestPassword ) );
2953 CopySizedByteBuffer( &(inSensitive.t.sensitive.userAuth.b ), &blobAuth.b );
2954 data.t.size = sizeof( dataBlob );
2955 memcpy( &data.t.buffer, dataBlob, sizeof( dataBlob ) );
2956 CopySizedByteBuffer( &(inSensitive.t.sensitive.data.b ), &data.b );
2957
2958 inPublic.t.publicArea.type = TPM_ALG_KEYEDHASH;
2959 inPublic.t.publicArea.nameAlg = TPM_ALG_SHA256;
2960 inPublic.t.publicArea.objectAttributes.restricted = 0;
2961 inPublic.t.publicArea.objectAttributes.decrypt = 0;
2962 inPublic.t.publicArea.objectAttributes.sensitiveDataOrigin = 0;
2963 CopySizedByteBuffer( &( inPublic.t.publicArea.authPolicy.b), &( policyDigest->b ) );
2964 inPublic.t.publicArea.parameters.keyedHashDetail.scheme.scheme = TPM_ALG_NULL;
2965 inPublic.t.publicArea.unique.keyedHash.t.size = 0;
2966
2967 outPublic.t.size = 0;
2968 creationData.t.size = 0;
wcarthur7b10eeb2015-12-03 16:40:41 -05002969 outPrivate.t.size = sizeof( outPrivate ) - 2;
2970 creationHash.t.size = sizeof( creationHash ) - 2;
Will Arthur54e04e42015-07-15 11:29:25 -04002971 rval = Tss2_Sys_Create( sysContext, srkHandle, &cmdAuthArray,
2972 &inSensitive, &inPublic, &outsideInfo, &creationPcr,
2973 &outPrivate, &outPublic, &creationData, &creationHash,
2974 &creationTicket, 0 );
2975 CheckPassed( rval );
2976
2977 // Now we need to load the object.
Will-nucd6bbaa12015-12-08 11:51:25 -05002978 blobName.t.size = sizeof( blobName ) - 2;
Will Arthur54e04e42015-07-15 11:29:25 -04002979 rval = Tss2_Sys_Load( sysContext, srkHandle, &cmdAuthArray, &outPrivate, &outPublic, &blobHandle, &blobName, 0 );
2980 CheckPassed( rval );
2981
2982 return rval;
2983}
2984
2985TPM_RC AuthValueUnseal( TSS2_SYS_CONTEXT *sysContext, SESSION *policySession )
2986{
2987 TPM_RC rval = TPM_RC_SUCCESS;
2988 TPM2B_SENSITIVE_DATA outData;
2989 TPMS_AUTH_COMMAND cmdAuth;
2990 TPMS_AUTH_COMMAND *cmdSessionArray[1] = { &cmdAuth };
2991 TSS2_SYS_CMD_AUTHS cmdAuthArray = { 1, &cmdSessionArray[0] };
2992
2993 cmdAuth.sessionHandle = policySession->sessionHandle;
2994 cmdAuth.nonce.t.size = 0;
2995 *( (UINT8 *)((void *)&cmdAuth.sessionAttributes ) ) = 0;
2996 cmdAuth.sessionAttributes.continueSession = 1;
2997 cmdAuth.hmac.t.size = 0;
2998
2999 // Now try to unseal the blob without setting the HMAC.
3000 // This test should fail.
3001 rval = Tss2_Sys_Unseal( sysContext, blobHandle, &cmdAuthArray, &outData, 0 );
3002 CheckFailed( rval, TPM_RC_S + TPM_RC_1 + TPM_RC_AUTH_FAIL );
3003
3004 // Clear DA lockout.
3005 TestDictionaryAttackLockReset();
3006
3007 //
3008 // Now try to unseal the blob after setting the HMAC.
3009 // This test should pass.
3010 //
3011
3012 // First, call Prepare.
3013 rval = Tss2_Sys_Unseal_Prepare( sysContext, blobHandle );
3014 CheckPassed( rval );
3015
3016 rval = AddEntity( blobHandle, &blobAuth );
3017 CheckPassed( rval );
3018
3019 // Roll nonces for command.
3020 RollNonces( policySession, &cmdAuth.nonce );
3021
3022 // Now generate the HMAC.
3023 rval = ComputeCommandHmacs( sysContext,
3024 blobHandle,
3025 TPM_HT_NO_HANDLE, &cmdAuthArray, 1 );
3026 CheckPassed( rval );
3027
3028 rval = Tss2_Sys_Unseal( sysContext, blobHandle, &cmdAuthArray, &outData, 0 );
3029 CheckPassed( rval );
3030
3031 rval = DeleteEntity( blobHandle );
3032 CheckPassed( rval );
3033
3034 // Add test to make sure we unsealed correctly.
3035
3036 // Now we'll want to flush the data blob and remove it
3037 // from resource manager tables.
3038 rval = Tss2_Sys_FlushContext( sysContext, blobHandle );
3039 CheckPassed( rval );
3040
3041 return rval;
3042}
3043
3044TPM_RC PasswordUnseal( TSS2_SYS_CONTEXT *sysContext, SESSION *policySession )
3045{
3046 TPM_RC rval = TPM_RC_SUCCESS;
3047 TPM2B_SENSITIVE_DATA outData;
3048 TPMS_AUTH_COMMAND cmdAuth;
3049 TPMS_AUTH_COMMAND *cmdSessionArray[1] = { &cmdAuth };
3050 TSS2_SYS_CMD_AUTHS cmdAuthArray = { 1, &cmdSessionArray[0] };
3051
3052 cmdAuth.sessionHandle = policySession->sessionHandle;
3053 cmdAuth.nonce.t.size = 0;
3054 *( (UINT8 *)((void *)&cmdAuth.sessionAttributes ) ) = 0;
3055 cmdAuth.sessionAttributes.continueSession = 1;
3056 cmdAuth.hmac.t.size = 0;
3057
3058 // Now try to unseal the blob without setting the password.
3059 // This test should fail.
wcarthur7b10eeb2015-12-03 16:40:41 -05003060 outData.t.size = sizeof( outData ) - 2;
Will Arthur54e04e42015-07-15 11:29:25 -04003061 rval = Tss2_Sys_Unseal( sysContext, blobHandle, &cmdAuthArray, &outData, 0 );
3062 CheckFailed( rval, TPM_RC_S + TPM_RC_1 + TPM_RC_AUTH_FAIL );
3063
3064 // Clear DA lockout.
3065 TestDictionaryAttackLockReset();
3066
3067 // Now try to unseal the blob after setting the password.
3068 // This test should pass.
3069 cmdAuth.hmac.t.size = sizeof( passwordPCRTestPassword );
3070 memcpy( &cmdAuth.hmac.t.buffer, passwordPCRTestPassword, sizeof( passwordPCRTestPassword ) );
3071 rval = Tss2_Sys_Unseal( sysContext, blobHandle, &cmdAuthArray, &outData, 0 );
3072 CheckPassed( rval );
3073
3074 // Add test to make sure we unsealed correctly.
3075
3076 // Now we'll want to flush the data blob and remove it
3077 // from resource manager tables.
3078 rval = Tss2_Sys_FlushContext( sysContext, blobHandle );
3079 CheckPassed( rval );
3080
3081 return rval;
3082}
3083
3084POLICY_TEST_SETUP policyTestSetups[] =
3085{
3086 // NOTE: Since locality is a fairly simple command and we
3087 // can guarantee its correctness, we don't need a trial
3088 // session for this. buildPolicyFn pointer can be 0 in
3089 // this case.
3090 { "LOCALITY", 0, CreateNVIndex, TestLocality },
3091 { "PASSWORD", BuildPasswordPolicy, CreateDataBlob, PasswordUnseal },
3092 { "PASSWORD/PCR", BuildPasswordPcrPolicy, CreateDataBlob, PasswordUnseal },
3093 { "AUTHVALUE", BuildAuthValuePolicy, CreateDataBlob, AuthValueUnseal },
3094 // TBD...
3095};
3096
3097void TestPolicy()
3098{
3099 UINT32 rval;
3100 unsigned int i;
3101 SESSION *policySession = 0;
3102
3103 TpmClientPrintf( 0, "\nPOLICY TESTS:\n" );
3104
3105 for( i = 0; i < ( sizeof( policyTestSetups ) / sizeof( POLICY_TEST_SETUP ) ); i++ )
3106 {
3107 TPM2B_DIGEST policyDigest;
3108
wcarthur7b10eeb2015-12-03 16:40:41 -05003109 policyDigest.t.size = 0;
3110
Will Arthur54e04e42015-07-15 11:29:25 -04003111 rval = TPM_RC_SUCCESS;
3112
3113 TpmClientPrintf( 0, "Policy Test: %s\n", policyTestSetups[i].name );
3114
3115 // Create trial policy session and run policy commands, in order to create policyDigest.
3116 if( policyTestSetups[i].buildPolicyFn != 0)
3117 {
3118 rval = BuildPolicy( sysContext, &policySession, policyTestSetups[i].buildPolicyFn, &policyDigest, true );
3119 CheckPassed( rval );
wcarthur7b10eeb2015-12-03 16:40:41 -05003120#ifdef DEBUG
3121 TpmClientPrintf( 0, "Built policy digest: \n" );
3122 DebugPrintBuffer( &(policyDigest.t.buffer[0]), policyDigest.t.size );
3123#endif
Will Arthur54e04e42015-07-15 11:29:25 -04003124 }
3125
3126 // Create entity that will use that policyDigest as authPolicy.
3127 if( policyTestSetups[i].createObjectFn != 0 )
3128 {
wcarthur7b10eeb2015-12-03 16:40:41 -05003129#ifdef DEBUG
3130 TpmClientPrintf( 0, "Policy digest used to create object: \n" );
3131 DebugPrintBuffer( &(policyDigest.t.buffer[0]), policyDigest.t.size );
3132#endif
3133
Will Arthur54e04e42015-07-15 11:29:25 -04003134 rval = ( *policyTestSetups[i].createObjectFn )( sysContext, &policySession, &policyDigest);
3135 CheckPassed( rval );
3136 }
3137
3138 // Create real policy session and run policy commands; after this we're ready
3139 // to authorize actions on the entity.
3140 if( policyTestSetups[i].buildPolicyFn != 0)
3141 {
3142 rval = BuildPolicy( sysContext, &policySession, policyTestSetups[i].buildPolicyFn, &policyDigest, false );
3143 CheckPassed( rval );
wcarthur7b10eeb2015-12-03 16:40:41 -05003144#ifdef DEBUG
3145 TpmClientPrintf( 0, "Command policy digest: \n" );
3146 DebugPrintBuffer( &(policyDigest.t.buffer[0]), policyDigest.t.size );
3147#endif
Will Arthur54e04e42015-07-15 11:29:25 -04003148 }
3149
3150 if( policySession )
3151 {
3152 // Now do tests by authorizing actions on the entity.
3153 rval = ( *policyTestSetups[i].testPolicyFn)( sysContext, policySession );
3154 CheckPassed( rval );
3155
3156 // Need to flush the session here.
3157 rval = Tss2_Sys_FlushContext( sysContext, policySession->sessionHandle );
3158 CheckPassed( rval );
3159
3160 // And remove the session from test app session table.
3161 rval = EndAuthSession( policySession );
3162 }
3163 else
3164 {
3165 CheckFailed( rval, 0xffffffff );
3166 }
3167
3168 CheckPassed( rval );
3169 }
3170}
3171
3172#define MAX_TEST_SEQUENCES 10
3173void TestHash()
3174{
3175 UINT32 rval;
3176 TPM2B_AUTH auth;
3177 TPMI_DH_OBJECT sequenceHandle[MAX_TEST_SEQUENCES];
3178 TPMS_AUTH_COMMAND sessionData, sessionData1;
3179 TPMS_AUTH_RESPONSE sessionDataOut, sessionDataOut1;
3180 TSS2_SYS_CMD_AUTHS sessionsData;
3181 int i;
3182 TPM2B_MAX_BUFFER dataToHash;
3183
3184 UINT8 memoryToHash[] =
3185 {
3186 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
3187 0xff, 0xfe, 0xfd, 0xfc, 0xfb, 0xfa, 0xf9, 0xf8, 0xf7, 0xf6, 0xf5, 0xf4, 0xf3, 0xf2, 0xf1, 0xf0,
3188 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
3189 0xff, 0xfe, 0xfd, 0xfc, 0xfb, 0xfa, 0xf9, 0xf8, 0xf7, 0xf6, 0xf5, 0xf4, 0xf3, 0xf2, 0xf1, 0xf0,
3190 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
3191 0xff, 0xfe, 0xfd, 0xfc, 0xfb, 0xfa, 0xf9, 0xf8, 0xf7, 0xf6, 0xf5, 0xf4, 0xf3, 0xf2, 0xf1, 0xf0,
3192 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
3193 0xff, 0xfe, 0xfd, 0xfc, 0xfb, 0xfa, 0xf9, 0xf8, 0xf7, 0xf6, 0xf5, 0xf4, 0xf3, 0xf2, 0xf1, 0xf0,
3194 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
3195 0xff, 0xfe, 0xfd, 0xfc, 0xfb, 0xfa, 0xf9, 0xf8, 0xf7, 0xf6, 0xf5, 0xf4, 0xf3, 0xf2, 0xf1, 0xf0,
3196 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
3197 0xff, 0xfe, 0xfd, 0xfc, 0xfb, 0xfa, 0xf9, 0xf8, 0xf7, 0xf6, 0xf5, 0xf4, 0xf3, 0xf2, 0xf1, 0xf0,
3198 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
3199 0xff, 0xfe, 0xfd, 0xfc, 0xfb, 0xfa, 0xf9, 0xf8, 0xf7, 0xf6, 0xf5, 0xf4, 0xf3, 0xf2, 0xf1, 0xf0,
3200 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
3201 0xff, 0xfe, 0xfd, 0xfc, 0xfb, 0xfa, 0xf9, 0xf8, 0xf7, 0xf6, 0xf5, 0xf4, 0xf3, 0xf2, 0xf1, 0xf0,
3202 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
3203 0xff, 0xfe, 0xfd, 0xfc, 0xfb, 0xfa, 0xf9, 0xf8, 0xf7, 0xf6, 0xf5, 0xf4, 0xf3, 0xf2, 0xf1, 0xf0,
3204 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
3205 0xff, 0xfe, 0xfd, 0xfc, 0xfb, 0xfa, 0xf9, 0xf8, 0xf7, 0xf6, 0xf5, 0xf4, 0xf3, 0xf2, 0xf1, 0xf0,
3206 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
3207 0xff, 0xfe, 0xfd, 0xfc, 0xfb, 0xfa, 0xf9, 0xf8, 0xf7, 0xf6, 0xf5, 0xf4, 0xf3, 0xf2, 0xf1, 0xf0,
3208 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
3209 0xff, 0xfe, 0xfd, 0xfc, 0xfb, 0xfa, 0xf9, 0xf8, 0xf7, 0xf6, 0xf5, 0xf4, 0xf3, 0xf2, 0xf1, 0xf0,
3210 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
3211 0xff, 0xfe, 0xfd, 0xfc, 0xfb, 0xfa, 0xf9, 0xf8, 0xf7, 0xf6, 0xf5, 0xf4, 0xf3, 0xf2, 0xf1, 0xf0,
3212 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
3213 0xff, 0xfe, 0xfd, 0xfc, 0xfb, 0xfa, 0xf9, 0xf8, 0xf7, 0xf6, 0xf5, 0xf4, 0xf3, 0xf2, 0xf1, 0xf0,
3214 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
3215 0xff, 0xfe, 0xfd, 0xfc, 0xfb, 0xfa, 0xf9, 0xf8, 0xf7, 0xf6, 0xf5, 0xf4, 0xf3, 0xf2, 0xf1, 0xf0,
3216 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
3217 0xff, 0xfe, 0xfd, 0xfc, 0xfb, 0xfa, 0xf9, 0xf8, 0xf7, 0xf6, 0xf5, 0xf4, 0xf3, 0xf2, 0xf1, 0xf0,
3218 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
3219 0xff, 0xfe, 0xfd, 0xfc, 0xfb, 0xfa, 0xf9, 0xf8, 0xf7, 0xf6, 0xf5, 0xf4, 0xf3, 0xf2, 0xf1, 0xf0,
3220 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
3221 0xff, 0xfe, 0xfd, 0xfc, 0xfb, 0xfa, 0xf9, 0xf8, 0xf7, 0xf6, 0xf5, 0xf4, 0xf3, 0xf2, 0xf1, 0xf0,
3222 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
3223 0xff, 0xfe, 0xfd, 0xfc, 0xfb, 0xfa, 0xf9, 0xf8, 0xf7, 0xf6, 0xf5, 0xf4, 0xf3, 0xf2, 0xf1, 0xf0,
3224 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
3225 0xff, 0xfe, 0xfd, 0xfc, 0xfb, 0xfa, 0xf9, 0xf8, 0xf7, 0xf6, 0xf5, 0xf4, 0xf3, 0xf2, 0xf1, 0xf0,
3226 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
3227 0xff, 0xfe, 0xfd, 0xfc, 0xfb, 0xfa, 0xf9, 0xf8, 0xf7, 0xf6, 0xf5, 0xf4, 0xf3, 0xf2, 0xf1, 0xf0,
3228 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
3229 0xff, 0xfe, 0xfd, 0xfc, 0xfb, 0xfa, 0xf9, 0xf8, 0xf7, 0xf6, 0xf5, 0xf4, 0xf3, 0xf2, 0xf1, 0xf0,
3230 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
3231 0xff, 0xfe, 0xfd, 0xfc, 0xfb, 0xfa, 0xf9, 0xf8, 0xf7, 0xf6, 0xf5, 0xf4, 0xf3, 0xf2, 0xf1, 0xf0,
3232 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
3233 0xff, 0xfe, 0xfd, 0xfc, 0xfb, 0xfa, 0xf9, 0xf8, 0xf7, 0xf6, 0xf5, 0xf4, 0xf3, 0xf2, 0xf1, 0xf0,
3234 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
3235 0xff, 0xfe, 0xfd, 0xfc, 0xfb, 0xfa, 0xf9, 0xf8, 0xf7, 0xf6, 0xf5, 0xf4, 0xf3, 0xf2, 0xf1, 0xf0,
3236 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
3237 0xff, 0xfe, 0xfd, 0xfc, 0xfb, 0xfa, 0xf9, 0xf8, 0xf7, 0xf6, 0xf5, 0xf4, 0xf3, 0xf2, 0xf1, 0xf0,
3238 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
3239 0xff, 0xfe, 0xfd, 0xfc, 0xfb, 0xfa, 0xf9, 0xf8, 0xf7, 0xf6, 0xf5, 0xf4, 0xf3, 0xf2, 0xf1, 0xf0,
3240 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
3241 0xff, 0xfe, 0xfd, 0xfc, 0xfb, 0xfa, 0xf9, 0xf8, 0xf7, 0xf6, 0xf5, 0xf4, 0xf3, 0xf2, 0xf1, 0xf0,
3242 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
3243 0xff, 0xfe, 0xfd, 0xfc, 0xfb, 0xfa, 0xf9, 0xf8, 0xf7, 0xf6, 0xf5, 0xf4, 0xf3, 0xf2, 0xf1, 0xf0,
3244 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
3245 0xff, 0xfe, 0xfd, 0xfc, 0xfb, 0xfa, 0xf9, 0xf8, 0xf7, 0xf6, 0xf5, 0xf4, 0xf3, 0xf2, 0xf1, 0xf0,
3246 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
3247 0xff, 0xfe, 0xfd, 0xfc, 0xfb, 0xfa, 0xf9, 0xf8, 0xf7, 0xf6, 0xf5, 0xf4, 0xf3, 0xf2, 0xf1, 0xf0,
3248 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
3249 0xff, 0xfe, 0xfd, 0xfc, 0xfb, 0xfa, 0xf9, 0xf8, 0xf7, 0xf6, 0xf5, 0xf4, 0xf3, 0xf2, 0xf1, 0xf0,
3250 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
3251 0xff, 0xfe, 0xfd, 0xfc, 0xfb, 0xfa, 0xf9, 0xf8, 0xf7, 0xf6, 0xf5, 0xf4, 0xf3, 0xf2, 0xf1, 0xf0,
3252 0xde, 0xad, 0xbe, 0xef
3253 };
3254
3255 // Known good hash of above memory.
3256 UINT8 goodHashValue[] =
3257 { 0xB3, 0xFD, 0x6A, 0xD2, 0x9F, 0xD0, 0x13, 0x52, 0xBA, 0xFC,
3258 0x8B, 0x22, 0xC9, 0x6D, 0x88, 0x42, 0xA3, 0x3C, 0xB0, 0xC9 };
3259
3260 // Hash to be calculated by TPM.
3261 TPM2B_DIGEST result;
3262 TPMT_TK_HASHCHECK validation;
3263 TSS2_SYS_RSP_AUTHS sessionsDataOut;
3264
3265 TPMS_AUTH_COMMAND *sessionDataArray[2];
3266 TPMS_AUTH_RESPONSE *sessionDataOutArray[2];
3267
3268 sessionDataArray[0] = &sessionData;
3269 sessionDataOutArray[0] = &sessionDataOut;
3270 sessionDataArray[1] = &sessionData1;
3271 sessionDataOutArray[1] = &sessionDataOut1;
3272
3273 sessionsDataOut.rspAuths = &sessionDataOutArray[0];
3274 sessionsData.cmdAuths = &sessionDataArray[0];
3275
3276 sessionsDataOut.rspAuthsCount = 1;
3277
3278 TpmClientPrintf( 0, "\nHASH TESTS:\n" );
3279
3280 auth.t.size = 2;
3281 auth.t.buffer[0] = 0;
3282 auth.t.buffer[1] = 0xff;
3283 rval = Tss2_Sys_HashSequenceStart ( sysContext, 0, &auth, TPM_ALG_SHA1, &sequenceHandle[0], 0 );
3284 CheckPassed( rval );
3285
3286 // Init authHandle
3287 sessionData.sessionHandle = TPM_RS_PW;
3288
3289 // Init nonce.
3290 sessionData.nonce.t.size = 0;
3291
3292 // init hmac
3293 sessionData.hmac = auth;
3294
3295 // Init session attributes
3296 *( (UINT8 *)((void *)&sessionData.sessionAttributes ) ) = 0;
3297
3298 sessionsData.cmdAuthsCount = 1;
3299 sessionsData.cmdAuths[0] = &sessionData;
3300
3301 dataToHash.t.size = MAX_DIGEST_BUFFER;
3302 memcpy( &dataToHash.t.buffer[0], &memoryToHash[0], dataToHash.t.size );
3303
3304 rval = Tss2_Sys_SequenceUpdate ( sysContext, sequenceHandle[0], &sessionsData, &dataToHash, &sessionsDataOut );
3305 CheckPassed( rval );
3306
3307 // Now try starting a bunch of sequences to see what happens.
3308 // This checks that the resource manager properly saves and restores the context
3309 // of the interrupted original sequence.
3310 for( i = 1; i < 5; i++ )
3311 {
3312 rval = Tss2_Sys_HashSequenceStart ( sysContext, 0, &auth, TPM_ALG_SHA1, &sequenceHandle[i], 0 );
3313 CheckPassed( rval );
3314 }
3315
3316 // Now end the created sequences.
3317 dataToHash.t.size = 0;
3318 for( i = 1; i < 5; i++ )
3319 {
Will-nucd6bbaa12015-12-08 11:51:25 -05003320 result.t.size = sizeof( result ) - 2;
Will Arthur54e04e42015-07-15 11:29:25 -04003321 rval = Tss2_Sys_SequenceComplete ( sysContext, sequenceHandle[i], &sessionsData, &dataToHash,
3322 TPM_RH_PLATFORM, &result, &validation, &sessionsDataOut );
3323 CheckPassed( rval );
3324 }
3325
3326 // Now try to finish the interrupted sequence.
3327 rval = Tss2_Sys_SequenceUpdate ( sysContext, sequenceHandle[0], &sessionsData, &dataToHash, &sessionsDataOut );
3328 CheckPassed( rval );
3329
3330 dataToHash.t.size = sizeof( memoryToHash ) - MAX_DIGEST_BUFFER;
3331 memcpy( &dataToHash.t.buffer[0], &memoryToHash[MAX_DIGEST_BUFFER], dataToHash.t.size );
3332 rval = Tss2_Sys_SequenceComplete ( sysContext, sequenceHandle[0], &sessionsData, &dataToHash,
3333 TPM_RH_PLATFORM, &result, &validation, &sessionsDataOut );
3334 CheckPassed( rval );
3335
3336 // Test the resulting hash.
3337 if( memcmp( (void *)&( result.t.buffer[0] ), (void *)&( goodHashValue[0] ), result.t.size ) )
3338 {
3339 TpmClientPrintf( 0, "ERROR!! resulting hash is incorrect.\n" );
3340 Cleanup();
3341 }
3342
3343 // Now try starting a bunch of sequences to see what happens.
3344 // This stresses the resource manager.
3345 for( i = 0; i < MAX_TEST_SEQUENCES; i++ )
3346 {
3347 rval = Tss2_Sys_HashSequenceStart ( sysContext, 0, &auth, TPM_ALG_SHA1, &sequenceHandle[i], 0 );
3348 CheckPassed( rval );
3349 }
3350
3351 // Now end them all
3352 dataToHash.t.size = 0;
3353 for( i = (MAX_TEST_SEQUENCES - 1); i >= 0; i-- )
3354// for( i = 0; i < MAX_TEST_SEQUENCES; i++ )
3355 {
3356 rval = Tss2_Sys_SequenceComplete ( sysContext, sequenceHandle[i], &sessionsData, &dataToHash,
3357 TPM_RH_PLATFORM, &result, &validation, &sessionsDataOut );
3358 CheckPassed( rval );
3359 }
3360}
3361
3362void TestQuote()
3363{
3364 UINT32 rval;
3365 TPM2B_DATA qualifyingData;
3366 UINT8 qualDataString[] = { 0x00, 0xff, 0x55, 0xaa };
3367 TPMT_SIG_SCHEME inScheme;
3368 TPML_PCR_SELECTION pcrSelection;
3369 TPMS_AUTH_COMMAND sessionData;
3370 TPMS_AUTH_RESPONSE sessionDataOut;
3371 TSS2_SYS_CMD_AUTHS sessionsData;
3372 TSS2_SYS_RSP_AUTHS sessionsDataOut;
3373 TPM2B_ATTEST quoted;
3374 TPMT_SIGNATURE signature;
3375
3376 TPMS_AUTH_COMMAND *sessionDataArray[1];
3377 TPMS_AUTH_RESPONSE *sessionDataOutArray[1];
3378
3379 sessionDataArray[0] = &sessionData;
3380 sessionDataOutArray[0] = &sessionDataOut;
3381
3382 sessionsDataOut.rspAuths = &sessionDataOutArray[0];
3383 sessionsData.cmdAuths = &sessionDataArray[0];
3384
3385 sessionsDataOut.rspAuthsCount = 1;
3386
3387 TpmClientPrintf( 0, "\nQUOTE CONTROL TESTS:\n" );
3388
3389 // Init authHandle
3390 sessionData.sessionHandle = TPM_RS_PW;
3391
3392 // Init nonce.
3393 sessionData.nonce.t.size = 0;
3394
3395 // init hmac
3396 sessionData.hmac.t.size = 2;
3397 sessionData.hmac.t.buffer[0] = 0x00;
3398 sessionData.hmac.t.buffer[1] = 0xff;
3399
3400 // Init session attributes
3401 *( (UINT8 *)((void *)&sessionData.sessionAttributes ) ) = 0;
3402
3403 qualifyingData.t.size = sizeof( qualDataString );
3404 memcpy( &( qualifyingData.t.buffer[0] ), qualDataString, sizeof( qualDataString ) );
3405
3406 inScheme.scheme = TPM_ALG_NULL;
3407
3408 pcrSelection.count = 1;
3409 pcrSelection.pcrSelections[0].hash = TPM_ALG_SHA1;
3410 pcrSelection.pcrSelections[0].sizeofSelect = 3;
3411
3412 // Clear out PCR select bit field
3413 pcrSelection.pcrSelections[0].pcrSelect[0] = 0;
3414 pcrSelection.pcrSelections[0].pcrSelect[1] = 0;
3415 pcrSelection.pcrSelections[0].pcrSelect[2] = 0;
3416
3417 // Now set the PCR you want
3418 pcrSelection.pcrSelections[0].pcrSelect[( PCR_17/8 )] = ( 1 << ( PCR_18 % 8) );
3419
3420 sessionsData.cmdAuthsCount = 1;
3421 sessionsData.cmdAuths[0] = &sessionData;
3422
3423 // Test with wrong type of key.
3424 rval = Tss2_Sys_Quote ( sysContext, loadedSha1KeyHandle, &sessionsData, &qualifyingData, &inScheme,
3425 &pcrSelection, &quoted, &signature, &sessionsDataOut );
3426 CheckPassed( rval );
3427
3428 // Create signing key
3429
3430
3431 // Now test quote operation
3432// Tpm20Quote ( ??TPMI_DH_OBJECT signHandle, TPM2B_DATA *qualifyingData,
3433// TPMT_SIG_SCHEME *inScheme, TPML_PCR_SELECTION *pcrSelect,
3434// TPMS_AUTH_COMMAND *sessionsData)
3435
3436}
3437
3438void ProvisionOtherIndices()
3439{
3440 UINT32 rval;
3441 TPMI_SH_AUTH_SESSION otherIndicesPolicyAuthHandle;
3442 TPM2B_DIGEST nvPolicyHash;
3443 TPM2B_AUTH nvAuth;
3444 TPMS_AUTH_COMMAND otherIndicesSessionData;
3445 TPMS_AUTH_RESPONSE otherIndicesSessionDataOut;
3446 TSS2_SYS_CMD_AUTHS otherIndicesSessionsData;
3447 TSS2_SYS_RSP_AUTHS otherIndicesSessionsDataOut;
3448 TPM2B_NV_PUBLIC publicInfo;
3449
3450 TPMS_AUTH_COMMAND *sessionDataArray[1];
3451 TPMS_AUTH_RESPONSE *sessionDataOutArray[1];
3452
3453 sessionDataArray[0] = &otherIndicesSessionData;
3454 sessionDataOutArray[0] = &otherIndicesSessionDataOut;
3455
3456 otherIndicesSessionsDataOut.rspAuths = &sessionDataOutArray[0];
3457 otherIndicesSessionsData.cmdAuths = &sessionDataArray[0];
3458
3459 otherIndicesSessionsDataOut.rspAuthsCount = 1;
3460
3461 TpmClientPrintf( 0, "\nPROVISION OTHER NV INDICES:\n" );
3462
3463 //
3464 // AUX index: Write is controlled by TPM2_PolicyLocality; Read is controlled by authValue and is unrestricted since authValue is set to emptyBuffer
3465 // Do this by setting up two policies and ORing them together when creating AuxIndex:
3466 // 1. PolicyLocality(3) && PolicyCommand(NVWrite)
3467 // 2. EmptyAuth policy && PolicyCommand(NVRead)
3468 // Page 126 of Part 1 describes how to do this.
3469 //
3470
3471 // Steps:
3472 rval = StartPolicySession( &otherIndicesPolicyAuthHandle );
3473 CheckPassed( rval );
3474
3475 // 3. GetPolicyDigest and save it
3476 rval = Tss2_Sys_PolicyGetDigest( sysContext, otherIndicesPolicyAuthHandle, 0, &nvPolicyHash, 0 );
3477 CheckPassed( rval );
3478
3479 // Now save the policy digest from the first OR branch.
3480 DEBUG_PRINT_BUFFER( &( nvPolicyHash.t.buffer[0] ), nvPolicyHash.t.size );
3481
3482 // 4. CreateNvIndex
3483 otherIndicesSessionData.sessionHandle = TPM_RS_PW;
3484
3485 // Init nonce.
3486 otherIndicesSessionData.nonce.t.size = 0;
3487
3488 // init hmac
3489 otherIndicesSessionData.hmac.t.size = 0;
3490
3491 // init nvAuth
3492 nvAuth.t.size = 0;
3493
3494 // Init session attributes
3495 *( (UINT8 *)((void *)&otherIndicesSessionData.sessionAttributes ) ) = 0;
3496
3497 publicInfo.t.size = sizeof( TPMI_RH_NV_INDEX ) +
3498 sizeof( TPMI_ALG_HASH ) + sizeof( TPMA_NV ) + sizeof( UINT16) +
3499 sizeof( UINT16 );
3500 publicInfo.t.nvPublic.nvIndex = INDEX_LCP_SUP;
3501 publicInfo.t.nvPublic.nameAlg = TPM_ALG_SHA1;
3502
3503 // First zero out attributes.
3504 *(UINT32 *)&( publicInfo.t.nvPublic.attributes ) = 0;
3505
3506 // Now set the attributes.
3507 publicInfo.t.nvPublic.attributes.TPMA_NV_AUTHREAD = 1;
3508 publicInfo.t.nvPublic.attributes.TPMA_NV_AUTHWRITE = 1;
3509 publicInfo.t.nvPublic.attributes.TPMA_NV_PLATFORMCREATE = 1;
3510 // Following commented out for convenience during development.
3511 // publicInfo.t.nvPublic.attributes.TPMA_NV_POLICY_DELETE = 1;
3512 publicInfo.t.nvPublic.attributes.TPMA_NV_WRITEDEFINE = 1;
3513 publicInfo.t.nvPublic.attributes.TPMA_NV_ORDERLY = 1;
3514
3515 publicInfo.t.nvPublic.authPolicy.t.size = 0;
3516 publicInfo.t.nvPublic.dataSize = NV_PS_INDEX_SIZE;
3517
3518 otherIndicesSessionsData.cmdAuthsCount = 1;
3519 otherIndicesSessionsData.cmdAuths[0] = &otherIndicesSessionData;
3520
3521 rval = Tss2_Sys_NV_DefineSpace( sysContext, TPM_RH_PLATFORM, &otherIndicesSessionsData,
3522 &nvAuth, &publicInfo, &otherIndicesSessionsDataOut );
3523 CheckPassed( rval );
3524
3525 publicInfo.t.nvPublic.nvIndex = INDEX_LCP_OWN;
3526 rval = Tss2_Sys_NV_DefineSpace( sysContext, TPM_RH_PLATFORM, &otherIndicesSessionsData,
3527 &nvAuth, &publicInfo, &otherIndicesSessionsDataOut );
3528 CheckPassed( rval );
3529
3530 // Now teardown session
3531 rval = Tss2_Sys_FlushContext( sysContext, otherIndicesPolicyAuthHandle );
3532 CheckPassed( rval );
3533}
3534
3535
3536TSS2_RC InitNvAuxPolicySession( TPMI_SH_AUTH_SESSION *nvAuxPolicySessionHandle )
3537{
3538 TPMA_LOCALITY locality;
3539 TPM_RC rval;
3540
3541 rval = StartPolicySession( nvAuxPolicySessionHandle );
3542 CheckPassed( rval );
3543
3544 // 2. PolicyLocality(3)
3545 *(UINT8 *)((void *)&locality) = 0;
3546 locality.TPM_LOC_THREE = 1;
3547 locality.TPM_LOC_FOUR = 1;
3548 rval = Tss2_Sys_PolicyLocality( sysContext, *nvAuxPolicySessionHandle, 0, locality, 0 );
3549
3550 return( rval );
3551}
3552
3553void ProvisionNvAux()
3554{
3555 UINT32 rval;
3556 TPMI_SH_AUTH_SESSION nvAuxPolicyAuthHandle;
3557 TPM2B_DIGEST nvPolicyHash;
3558 TPM2B_AUTH nvAuth;
3559 TPMS_AUTH_COMMAND nvAuxSessionData;
3560 TPMS_AUTH_RESPONSE nvAuxSessionDataOut;
3561 TSS2_SYS_CMD_AUTHS nvAuxSessionsData;
3562 TSS2_SYS_RSP_AUTHS nvAuxSessionsDataOut;
3563 TPM2B_NV_PUBLIC publicInfo;
3564
3565 TPMS_AUTH_COMMAND *sessionDataArray[1];
3566 TPMS_AUTH_RESPONSE *sessionDataOutArray[1];
3567
3568 sessionDataArray[0] = &nvAuxSessionData;
3569 sessionDataOutArray[0] = &nvAuxSessionDataOut;
3570
3571 nvAuxSessionsDataOut.rspAuths = &sessionDataOutArray[0];
3572 nvAuxSessionsData.cmdAuths = &sessionDataArray[0];
3573
3574 nvAuxSessionsDataOut.rspAuthsCount = 1;
3575
3576 TpmClientPrintf( 0, "\nPROVISION NV AUX:\n" );
3577
3578 //
3579 // AUX index: Write is controlled by TPM2_PolicyLocality; Read is controlled by authValue and is unrestricted since authValue is set to emptyBuffer
3580 // Do this by setting up two policies and ORing them together when creating AuxIndex:
3581 // 1. PolicyLocality(3) && PolicyCommand(NVWrite)
3582 // 2. EmptyAuth policy && PolicyCommand(NVRead)
3583 // Page 126 of Part 1 describes how to do this.
3584 //
3585
3586 // Steps:
3587 rval = InitNvAuxPolicySession( &nvAuxPolicyAuthHandle );
3588 CheckPassed( rval );
3589
3590 // 3. GetPolicyDigest and save it
Will-nucd6bbaa12015-12-08 11:51:25 -05003591 nvPolicyHash.t.size = sizeof( nvPolicyHash ) - 2;
Will Arthur54e04e42015-07-15 11:29:25 -04003592 rval = Tss2_Sys_PolicyGetDigest( sysContext, nvAuxPolicyAuthHandle, 0, &nvPolicyHash, 0 );
3593 CheckPassed( rval );
3594
3595 // Now save the policy digest.
3596 DEBUG_PRINT_BUFFER( &( nvPolicyHash.t.buffer[0] ), nvPolicyHash.t.size );
3597
3598 // 4. CreateNvIndex
3599 nvAuxSessionData.sessionHandle = TPM_RS_PW;
3600
3601 // Init nonce.
3602 nvAuxSessionData.nonce.t.size = 0;
3603
3604 // init hmac
3605 nvAuxSessionData.hmac.t.size = 0;
3606
3607 // init nvAuth
3608 nvAuth.t.size = 0;
3609
3610 // Init session attributes
3611 *( (UINT8 *)((void *)&nvAuxSessionData.sessionAttributes ) ) = 0;
3612
3613 nvAuxSessionsData.cmdAuthsCount = 1;
3614 nvAuxSessionsData.cmdAuths[0] = &nvAuxSessionData;
3615
3616 publicInfo.t.size = sizeof( TPMI_RH_NV_INDEX ) +
3617 sizeof( TPMI_ALG_HASH ) + sizeof( TPMA_NV ) + sizeof( UINT16) +
3618 sizeof( UINT16 );
3619 publicInfo.t.nvPublic.nvIndex = INDEX_AUX;
3620 publicInfo.t.nvPublic.nameAlg = TPM_ALG_SHA1;
3621
3622 // First zero out attributes.
3623 *(UINT32 *)&( publicInfo.t.nvPublic.attributes ) = 0;
3624
3625 // Now set the attributes.
3626 publicInfo.t.nvPublic.attributes.TPMA_NV_AUTHREAD = 1;
3627 publicInfo.t.nvPublic.attributes.TPMA_NV_POLICYWRITE = 1;
3628 publicInfo.t.nvPublic.attributes.TPMA_NV_PLATFORMCREATE = 1;
3629 // Following commented out for convenience during development.
3630 // publicInfo.t.nvPublic.attributes.TPMA_NV_POLICY_DELETE = 1;
3631
3632 publicInfo.t.nvPublic.authPolicy.t.size = GetDigestSize( TPM_ALG_SHA1 );
3633 memcpy( (UINT8 *)&( publicInfo.t.nvPublic.authPolicy.t.buffer ), (UINT8 *)&(nvPolicyHash.t.buffer[0]),
3634 nvPolicyHash.t.size );
3635
3636 publicInfo.t.nvPublic.dataSize = NV_AUX_INDEX_SIZE;
3637
3638 rval = Tss2_Sys_NV_DefineSpace( sysContext, TPM_RH_PLATFORM, &nvAuxSessionsData,
3639 &nvAuth, &publicInfo, &nvAuxSessionsDataOut );
3640 CheckPassed( rval );
3641
3642 // Now teardown session
3643 rval = Tss2_Sys_FlushContext( sysContext, nvAuxPolicyAuthHandle );
3644 CheckPassed( rval );
3645}
3646
3647void TpmAuxWrite( int locality)
3648{
3649 TSS2_RC rval;
3650 int i;
3651 TPMI_SH_AUTH_SESSION nvAuxPolicyAuthHandle;
3652 TPM2B_MAX_NV_BUFFER nvWriteData;
3653
3654 rval = InitNvAuxPolicySession( &nvAuxPolicyAuthHandle );
3655 CheckPassed( rval );
3656
3657 // Now we're going to test it.
3658 nvWriteData.t.size = 4;
3659 for( i = 0; i < nvWriteData.t.size; i++ )
3660 nvWriteData.t.buffer[i] = 0xff - i;
3661
3662 nullSessionData.sessionHandle = nvAuxPolicyAuthHandle;
3663
3664 // Make sure that session terminates after NVWrite completes.
3665 nullSessionData.sessionAttributes.continueSession = 0;
3666
3667 rval = SetLocality( sysContext, locality );
3668 CheckPassed( rval );
3669
3670 nullSessionsData.cmdAuthsCount = 1;
3671 nullSessionsData.cmdAuths[0] = &nullSessionData;
3672
3673 rval = Tss2_Sys_NV_Write( sysContext, INDEX_AUX, INDEX_AUX, &nullSessionsData, &nvWriteData, 0, &nullSessionsDataOut );
3674
3675 {
3676 TSS2_RC setLocalityRval;
3677 setLocalityRval = SetLocality( sysContext, 3 );
3678 CheckPassed( setLocalityRval );
3679 }
3680
3681 if( locality == 3 || locality == 4 )
3682 {
3683 CheckPassed( rval );
3684
3685 // No teardown of session needed, since the authorization was
3686 // successful.
3687 }
3688 else
3689 {
3690 CheckFailed( rval, TPM_RC_LOCALITY );
3691
3692 // Now teardown session
3693 rval = Tss2_Sys_FlushContext( sysContext, nvAuxPolicyAuthHandle );
3694 CheckPassed( rval );
3695 }
3696}
3697
3698void TpmAuxReadWriteTest()
3699{
3700 UINT32 rval;
3701 int testLocality;
3702 TPM2B_MAX_NV_BUFFER nvData;
3703
3704 TpmClientPrintf( 0, "TPM AUX READ/WRITE TEST\n" );
3705
3706 nullSessionData.sessionAttributes.continueSession = 0;
3707
3708 // Try writing it from all localities. Only locality 3 should work.
3709 for( testLocality = 0; testLocality < 5; testLocality++ )
3710 {
3711 TpmAuxWrite( testLocality );
3712 }
3713
3714 nullSessionData.sessionHandle = TPM_RS_PW;
3715
3716 nullSessionsData.cmdAuths[0] = &nullSessionData;
3717
3718 // Try reading it from all localities. They all should work.
3719 for( testLocality = 0; testLocality < 5; testLocality++ )
3720 {
3721 rval = SetLocality( sysContext, testLocality );
3722 CheckPassed( rval );
3723
wcarthur7b10eeb2015-12-03 16:40:41 -05003724 nvData.t.size = sizeof( TPM2B_MAX_NV_BUFFER ) - 2;
Will Arthur54e04e42015-07-15 11:29:25 -04003725 rval = Tss2_Sys_NV_Read( sysContext, INDEX_AUX, INDEX_AUX, &nullSessionsData, 4, 0, &nvData, &nullSessionsDataOut );
3726 CheckPassed( rval );
3727
3728 rval = SetLocality( sysContext, 3 );
3729 CheckPassed( rval );
3730 }
3731}
3732
3733void TpmOtherIndicesReadWriteTest()
3734{
3735 UINT32 rval;
3736 TPM2B_MAX_NV_BUFFER nvWriteData;
3737 int i;
3738 TPM2B_MAX_NV_BUFFER nvData;
3739
3740 nullSessionData.sessionHandle = TPM_RS_PW;
3741
3742 TpmClientPrintf( 0, "TPM OTHER READ/WRITE TEST\n" );
3743
3744 nvWriteData.t.size = 4;
3745 for( i = 0; i < nvWriteData.t.size; i++ )
3746 nvWriteData.t.buffer[i] = 0xff - i;
3747
3748 nullSessionsData.cmdAuthsCount = 1;
3749 nullSessionsData.cmdAuths[0] = &nullSessionData;
3750
3751 rval = Tss2_Sys_NV_Write( sysContext, INDEX_LCP_SUP, INDEX_LCP_SUP, &nullSessionsData, &nvWriteData, 0, &nullSessionsDataOut );
3752 CheckPassed( rval );
3753
3754 rval = Tss2_Sys_NV_Write( sysContext, INDEX_LCP_OWN, INDEX_LCP_OWN, &nullSessionsData, &nvWriteData, 0, &nullSessionsDataOut );
3755 CheckPassed( rval );
3756
3757 rval = Tss2_Sys_NV_Read( sysContext, INDEX_LCP_SUP, INDEX_LCP_SUP, &nullSessionsData, 4, 0, &nvData, &nullSessionsDataOut );
3758 CheckPassed( rval );
3759
3760 rval = Tss2_Sys_NV_Read( sysContext, INDEX_LCP_OWN, INDEX_LCP_OWN, &nullSessionsData, 4, 0, &nvData, &nullSessionsDataOut );
3761 CheckPassed( rval );
3762}
3763
3764void NvIndexProto()
3765{
3766 UINT32 rval;
3767
3768 TpmClientPrintf( 0, "\nNV INDEX PROTOTYPE TESTS:\n" );
3769
3770
3771 // AUX index: Write is controlled by TPM2_PolicyLocality; Read is controlled by authValue and is unrestricted since authValue is set to emptyBuffer
3772 // PS index: Write and read are unrestricted until TPM2_WriteLock. After that content is write protected
3773 // PO index: Write is restricted by ownerAuth; Read is controlled by authValue and is unrestricted since authValue is set to emptyBuffer
3774
3775 // Now we need to configure NV indices
3776 ProvisionNvAux();
3777
3778 ProvisionOtherIndices();
3779
3780 TpmAuxReadWriteTest();
3781
3782 TpmOtherIndicesReadWriteTest();
3783
3784 // Now undefine the aux index, so that subsequent test passes will work.
3785 rval = Tss2_Sys_NV_UndefineSpace( sysContext, TPM_RH_PLATFORM, INDEX_AUX, &nullSessionsData, &nullSessionsDataOut );
3786 CheckPassed( rval );
3787
3788 // Now undefine the other indices, so that subsequent test passes will work.
3789 rval = Tss2_Sys_NV_UndefineSpace( sysContext, TPM_RH_PLATFORM, INDEX_LCP_SUP, &nullSessionsData, &nullSessionsDataOut );
3790 CheckPassed( rval );
3791
3792 rval = Tss2_Sys_NV_UndefineSpace( sysContext, TPM_RH_PLATFORM, INDEX_LCP_OWN, &nullSessionsData, &nullSessionsDataOut );
3793 CheckPassed( rval );
3794}
3795
3796void TestPcrAllocate()
3797{
3798 UINT32 rval;
3799 TPML_PCR_SELECTION pcrSelection;
3800 TPMS_AUTH_COMMAND sessionData;
3801 TPMS_AUTH_RESPONSE sessionDataOut;
3802 TSS2_SYS_CMD_AUTHS sessionsData;
3803 TSS2_SYS_RSP_AUTHS sessionsDataOut;
3804 TPMI_YES_NO allocationSuccess;
3805 UINT32 maxPcr;
3806 UINT32 sizeNeeded;
3807 UINT32 sizeAvailable;
3808
3809 TPMS_AUTH_COMMAND *sessionDataArray[1];
3810 TPMS_AUTH_RESPONSE *sessionDataOutArray[1];
3811
3812 sessionDataArray[0] = &sessionData;
3813 sessionDataOutArray[0] = &sessionDataOut;
3814
3815 sessionsDataOut.rspAuths = &sessionDataOutArray[0];
3816 sessionsData.cmdAuths = &sessionDataArray[0];
3817
3818 sessionsDataOut.rspAuthsCount = 1;
3819
3820 TpmClientPrintf( 0, "\nPCR ALLOCATE TEST :\n" );
3821
3822 // Init authHandle
3823 sessionData.sessionHandle = TPM_RS_PW;
3824
3825 // Init nonce.
3826 sessionData.nonce.t.size = 0;
3827
3828 // init hmac
3829 sessionData.hmac.t.size = 0;
3830
3831 // Init session attributes
3832 *( (UINT8 *)((void *)&sessionData.sessionAttributes ) ) = 0;
3833
3834 pcrSelection.count = 0;
3835
3836 sessionsData.cmdAuthsCount = 1;
3837 sessionsData.cmdAuths[0] = &sessionData;
3838
3839 rval = Tss2_Sys_PCR_Allocate( sysContext, TPM_RH_PLATFORM, &sessionsData, &pcrSelection,
3840 &allocationSuccess, &maxPcr, &sizeNeeded, &sizeAvailable, &sessionsDataOut);
3841 CheckPassed( rval );
3842
3843 pcrSelection.count = 3;
3844 pcrSelection.pcrSelections[0].hash = TPM_ALG_SHA256;
3845 CLEAR_PCR_SELECT_BITS( pcrSelection.pcrSelections[0] );
3846 SET_PCR_SELECT_SIZE( pcrSelection.pcrSelections[0], 3 );
3847 SET_PCR_SELECT_BIT( pcrSelection.pcrSelections[0], PCR_5 );
3848 SET_PCR_SELECT_BIT( pcrSelection.pcrSelections[0], PCR_7 );
3849 pcrSelection.pcrSelections[1].hash = TPM_ALG_SHA384;
3850 CLEAR_PCR_SELECT_BITS( pcrSelection.pcrSelections[1] );
3851 SET_PCR_SELECT_SIZE( pcrSelection.pcrSelections[1], 3 );
3852 SET_PCR_SELECT_BIT( pcrSelection.pcrSelections[1], PCR_5 );
3853 SET_PCR_SELECT_BIT( pcrSelection.pcrSelections[1], PCR_8 );
3854 pcrSelection.pcrSelections[2].hash = TPM_ALG_SHA256;
3855 CLEAR_PCR_SELECT_BITS( pcrSelection.pcrSelections[2] );
3856 SET_PCR_SELECT_SIZE( pcrSelection.pcrSelections[2], 3 );
3857 SET_PCR_SELECT_BIT( pcrSelection.pcrSelections[2], PCR_6 );
3858
3859 rval = Tss2_Sys_PCR_Allocate( sysContext, TPM_RH_PLATFORM, &sessionsData, &pcrSelection,
3860 &allocationSuccess, &maxPcr, &sizeNeeded, &sizeAvailable, &sessionsDataOut);
3861 CheckPassed( rval );
3862}
3863
3864void TestUnseal()
3865{
3866 UINT32 rval;
3867 TPMS_AUTH_COMMAND sessionData;
3868 TPMS_AUTH_RESPONSE sessionDataOut;
3869 TSS2_SYS_CMD_AUTHS sessionsData;
3870 TSS2_SYS_RSP_AUTHS sessionsDataOut;
3871 TPM2B_SENSITIVE_CREATE inSensitive;
3872 TPML_PCR_SELECTION creationPCR;
3873 TPM2B_DATA outsideInfo;
3874 TPM2B_PUBLIC inPublic;
3875 TPM_HANDLE loadedObjectHandle;
3876
3877 TPMS_AUTH_COMMAND *sessionDataArray[1];
3878 TPMS_AUTH_RESPONSE *sessionDataOutArray[1];
3879
3880 sessionDataArray[0] = &sessionData;
3881 sessionDataOutArray[0] = &sessionDataOut;
3882
3883 sessionsDataOut.rspAuths = &sessionDataOutArray[0];
3884 sessionsData.cmdAuths = &sessionDataArray[0];
3885
3886 sessionsDataOut.rspAuthsCount = 1;
3887
3888 TPM2B_PRIVATE outPrivate;
3889 TPM2B_PUBLIC outPublic;
3890 TPM2B_CREATION_DATA creationData;
3891 TPM2B_DIGEST creationHash;
3892 TPMT_TK_CREATION creationTicket;
3893 TPM2B_NAME name;
3894 TPM2B_SENSITIVE_DATA outData;
3895
3896
3897 const char authStr[] = "test";
3898 const char sensitiveData[] = "this is sensitive";
3899
3900 TpmClientPrintf( 0, "\nUNSEAL TEST :\n" );
3901
3902 sessionData.sessionHandle = TPM_RS_PW;
3903
3904 // Init nonce.
3905 sessionData.nonce.t.size = 0;
3906
3907 sessionData.hmac.t.size = 2;
3908 sessionData.hmac.t.buffer[0] = 0x00;
3909 sessionData.hmac.t.buffer[1] = 0xff;
3910
3911 // Init session attributes
3912 *( (UINT8 *)((void *)&sessionData.sessionAttributes ) ) = 0;
3913
3914 inSensitive.t.sensitive.userAuth.t.size = sizeof( authStr ) - 1;
3915 memcpy( &( inSensitive.t.sensitive.userAuth.t.buffer[0] ), authStr, sizeof( authStr ) - 1 );
3916 inSensitive.t.sensitive.data.t.size = sizeof( sensitiveData ) - 1;
3917 memcpy( &( inSensitive.t.sensitive.data.t.buffer[0] ), sensitiveData, sizeof( sensitiveData ) - 1 );
3918
3919 inPublic.t.publicArea.authPolicy.t.size = 0;
3920
3921 inPublic.t.publicArea.unique.keyedHash.t.size = 0;
3922
3923 outsideInfo.t.size = 0;
3924 creationPCR.count = 0;
3925
3926 inPublic.t.publicArea.type = TPM_ALG_KEYEDHASH;
3927 inPublic.t.publicArea.nameAlg = TPM_ALG_SHA1;
3928
3929 *(UINT32 *)&( inPublic.t.publicArea.objectAttributes) = 0;
3930 inPublic.t.publicArea.objectAttributes.userWithAuth = 1;
3931
3932 inPublic.t.publicArea.parameters.keyedHashDetail.scheme.scheme = TPM_ALG_NULL;
3933
3934 inPublic.t.publicArea.unique.keyedHash.t.size = 0;
3935
3936 outsideInfo.t.size = 0;
3937
3938 sessionsData.cmdAuthsCount = 1;
3939 sessionsData.cmdAuths[0] = &sessionData;
3940
3941 outPublic.t.size = 0;
3942 creationData.t.size = 0;
Will-nucd6bbaa12015-12-08 11:51:25 -05003943 creationHash.t.size = sizeof( creationHash ) - 2;
3944 outPrivate.t.size = sizeof( outPrivate ) - 2;
Will Arthur54e04e42015-07-15 11:29:25 -04003945 rval = Tss2_Sys_Create( sysContext, handle2048rsa, &sessionsData, &inSensitive, &inPublic,
3946 &outsideInfo, &creationPCR,
3947 &outPrivate, &outPublic, &creationData,
3948 &creationHash, &creationTicket, &sessionsDataOut );
3949 CheckPassed( rval );
3950
Will-nucd6bbaa12015-12-08 11:51:25 -05003951 name.t.size = sizeof( name ) - 2;
Will Arthur54e04e42015-07-15 11:29:25 -04003952 rval = Tss2_Sys_LoadExternal ( sysContext, 0, 0, &outPublic,
3953 TPM_RH_PLATFORM, &loadedObjectHandle, &name, 0 );
3954 CheckPassed( rval );
3955
3956 rval = Tss2_Sys_FlushContext( sysContext, loadedObjectHandle );
3957 CheckPassed( rval );
3958
Will-nucd6bbaa12015-12-08 11:51:25 -05003959 name.t.size = sizeof( name ) - 2;
Will Arthur54e04e42015-07-15 11:29:25 -04003960 rval = Tss2_Sys_Load ( sysContext, handle2048rsa, &sessionsData, &outPrivate, &outPublic,
3961 &loadedObjectHandle, &name, &sessionsDataOut);
3962 CheckPassed( rval );
3963
3964 sessionData.hmac.t.size = sizeof( authStr ) - 1;
3965 memcpy( &( sessionData.hmac.t.buffer[0] ), authStr, sizeof( authStr ) - 1 );
3966
Will-nucd6bbaa12015-12-08 11:51:25 -05003967 outData.t.size = sizeof( outData ) - 2;
Will Arthur54e04e42015-07-15 11:29:25 -04003968 rval = Tss2_Sys_Unseal( sysContext, loadedObjectHandle, &sessionsData, &outData, &sessionsDataOut );
3969
3970 rval = Tss2_Sys_FlushContext( sysContext, loadedObjectHandle );
3971 CheckPassed( rval );
3972
3973 CheckPassed( rval );
3974}
3975
3976
3977void CreatePasswordTestNV( TPMI_RH_NV_INDEX nvIndex, char * password )
3978{
3979 UINT32 rval;
3980 int i;
3981 TPMS_AUTH_COMMAND sessionData;
3982 TPMS_AUTH_RESPONSE sessionDataOut;
3983 TSS2_SYS_CMD_AUTHS sessionsData;
3984 TSS2_SYS_RSP_AUTHS sessionsDataOut;
3985 TPM2B_NV_PUBLIC publicInfo;
3986 TPM2B_AUTH nvAuth;
3987
3988 TPMS_AUTH_COMMAND *sessionDataArray[1];
3989 TPMS_AUTH_RESPONSE *sessionDataOutArray[1];
3990
3991 sessionDataArray[0] = &sessionData;
3992 sessionDataOutArray[0] = &sessionDataOut;
3993
3994 sessionsDataOut.rspAuths = &sessionDataOutArray[0];
3995 sessionsData.cmdAuths = &sessionDataArray[0];
3996
3997 sessionData.sessionHandle = TPM_RS_PW;
3998
3999 // Init nonce.
4000 sessionData.nonce.t.size = 0;
4001
4002 // init hmac
4003 sessionData.hmac.t.size = 0;
4004
4005 // Init session attributes
4006 *( (UINT8 *)((void *)&sessionData.sessionAttributes ) ) = 0;
4007
4008 sessionsDataOut.rspAuthsCount = 1;
4009
4010 sessionsData.cmdAuthsCount = 1;
4011 sessionsData.cmdAuths[0] = &sessionData;
4012
4013 nvAuth.t.size = strlen( password );
4014 for( i = 0; i < nvAuth.t.size; i++ )
4015 nvAuth.t.buffer[i] = password[i];
4016
4017 publicInfo.t.size = sizeof( TPMI_RH_NV_INDEX ) +
4018 sizeof( TPMI_ALG_HASH ) + sizeof( TPMA_NV ) + sizeof( UINT16) +
4019 sizeof( UINT16 );
4020 publicInfo.t.nvPublic.nvIndex = nvIndex;
4021 publicInfo.t.nvPublic.nameAlg = TPM_ALG_SHA1;
4022
4023 // First zero out attributes.
4024 *(UINT32 *)&( publicInfo.t.nvPublic.attributes ) = 0;
4025
4026 // Now set the attributes.
4027 publicInfo.t.nvPublic.attributes.TPMA_NV_AUTHREAD = 1;
4028 publicInfo.t.nvPublic.attributes.TPMA_NV_AUTHWRITE = 1;
4029 publicInfo.t.nvPublic.attributes.TPMA_NV_PLATFORMCREATE = 1;
4030 publicInfo.t.nvPublic.attributes.TPMA_NV_ORDERLY = 1;
4031 publicInfo.t.nvPublic.authPolicy.t.size = 0;
4032 publicInfo.t.nvPublic.dataSize = 32;
4033
4034 rval = Tss2_Sys_NV_DefineSpace( sysContext, TPM_RH_PLATFORM,
4035 &sessionsData, &nvAuth, &publicInfo, &sessionsDataOut );
4036 CheckPassed( rval );
4037}
4038
4039// Password used to authorize access to the NV index.
4040char password[] = "test password";
4041
4042void PasswordTest()
4043{
4044 UINT32 rval;
4045 int i;
4046
4047 // Authorization structure for command.
4048 TPMS_AUTH_COMMAND sessionData;
4049
4050 // Authorization structure for response.
4051 TPMS_AUTH_RESPONSE sessionDataOut;
4052
4053 // Create and init authorization area for command:
4054 // only 1 authorization area.
4055 TPMS_AUTH_COMMAND *sessionDataArray[1] = { &sessionData };
4056
4057 // Create authorization area for response:
4058 // only 1 authorization area.
4059 TPMS_AUTH_RESPONSE *sessionDataOutArray[1] = { &sessionDataOut };
4060
4061 // Authorization array for command (only has one auth structure).
4062 TSS2_SYS_CMD_AUTHS sessionsData = { 1, &sessionDataArray[0] };
4063
4064 // Authorization array for response (only has one auth structure).
4065 TSS2_SYS_RSP_AUTHS sessionsDataOut = { 1, &sessionDataOutArray[0] };
4066 TPM2B_MAX_NV_BUFFER nvWriteData;
4067
4068 TpmClientPrintf( 0, "\nPASSWORD TESTS:\n" );
4069
4070 // Create an NV index that will use password
4071 // authorizations the password will be
4072 // "test password".
4073 CreatePasswordTestNV( TPM20_INDEX_PASSWORD_TEST, password );
4074
4075 //
4076 // Initialize the command authorization area.
4077 //
4078
4079 // Init sessionHandle, nonce, session
4080 // attributes, and hmac (password).
4081 sessionData.sessionHandle = TPM_RS_PW;
4082 // Set zero sized nonce.
4083 sessionData.nonce.t.size = 0;
4084 // sessionAttributes is a bit field. To initialize
4085 // it to 0, cast to a pointer to UINT8 and
4086 // write 0 to that pointer.
4087 *( (UINT8 *)&sessionData.sessionAttributes ) = 0;
4088
4089 // Init password (HMAC field in authorization structure).
4090 sessionData.hmac.t.size = strlen( password );
4091 memcpy( &( sessionData.hmac.t.buffer[0] ),
4092 &( password[0] ), sessionData.hmac.t.size );
4093
4094 // Initialize write data.
4095 nvWriteData.t.size = 4;
4096 for( i = 0; i < nvWriteData.t.size; i++ )
4097 nvWriteData.t.buffer[i] = 0xff - i;
4098
4099 // Attempt write with the correct password.
4100 // It should pass.
4101 rval = Tss2_Sys_NV_Write( sysContext,
4102 TPM20_INDEX_PASSWORD_TEST,
4103 TPM20_INDEX_PASSWORD_TEST,
4104 &sessionsData, &nvWriteData, 0,
4105 &sessionsDataOut );
4106 // Check that the function passed as
4107 // expected. Otherwise, exit.
4108 CheckPassed( rval );
4109
4110 // Alter the password so it's incorrect.
4111 sessionData.hmac.t.buffer[4] = 0xff;
4112 rval = Tss2_Sys_NV_Write( sysContext,
4113 TPM20_INDEX_PASSWORD_TEST,
4114 TPM20_INDEX_PASSWORD_TEST,
4115 &sessionsData, &nvWriteData, 0,
4116 &sessionsDataOut );
4117 // Check that the function failed as expected,
4118 // since password was incorrect. If wrong
4119 // response code received, exit.
4120 CheckFailed( rval,
4121 TPM_RC_S + TPM_RC_1 + TPM_RC_AUTH_FAIL );
4122
4123 // Change hmac to null one, since null auth is
4124 // used to undefine the index.
4125 sessionData.hmac.t.size = 0;
4126
4127 // Now undefine the index.
4128 rval = Tss2_Sys_NV_UndefineSpace( sysContext, TPM_RH_PLATFORM,
4129 TPM20_INDEX_PASSWORD_TEST, &sessionsData, 0 );
4130 CheckPassed( rval );
4131}
4132
4133
4134void SimplePolicyTest()
4135{
4136 UINT32 rval, sessionCmdRval;
4137 TPM2B_AUTH nvAuth;
4138 SESSION *nvSession, *trialPolicySession;
4139 TPMA_NV nvAttributes;
4140 TPM2B_DIGEST authPolicy;
4141 TPM2B_NAME nvName;
4142 TPM2B_MAX_NV_BUFFER nvWriteData, nvReadData;
4143 UINT8 dataToWrite[] = { 0x00, 0xff, 0x55, 0xaa };
4144 int i;
4145 TPM2B_ENCRYPTED_SECRET encryptedSalt;
4146 TPMT_SYM_DEF symmetric;
4147 TPMA_SESSION sessionAttributes;
4148
4149 // Command authorization area: one password session.
4150 TPMS_AUTH_COMMAND nvCmdAuth = { TPM_RS_PW, };
4151 TPMS_AUTH_COMMAND *nvCmdAuthArray[1] = { &nvCmdAuth };
4152 TSS2_SYS_CMD_AUTHS nvCmdAuths = { 1, &nvCmdAuthArray[0] };
4153
4154 // Response authorization area.
4155 TPMS_AUTH_RESPONSE nvRspAuth;
4156 TPMS_AUTH_RESPONSE *nvRspAuthArray[1] = { &nvRspAuth };
4157 TSS2_SYS_RSP_AUTHS nvRspAuths = { 1, &nvRspAuthArray[0] };
4158 TPM_ALG_ID sessionAlg = TPM_ALG_SHA256;
4159 TPM2B_NONCE nonceCaller;
4160
4161 nonceCaller.t.size = 0;
4162
4163 TpmClientPrintf( 0, "\nSIMPLE POLICY TEST:\n" );
4164
4165 //
4166 // Create NV index.
4167 //
4168
4169 // Setup the NV index's authorization value.
4170 nvAuth.t.size = 0;
4171
4172 // Zero sized encrypted salt, since the session
4173 // is unsalted.
4174 encryptedSalt.t.size = 0;
4175
4176 // No symmetric algorithm.
4177 symmetric.algorithm = TPM_ALG_NULL;
4178
Philip Tricca1ea84a52015-11-19 18:07:06 -08004179 //
Will Arthur54e04e42015-07-15 11:29:25 -04004180 // Create the NV index's authorization policy
4181 // using a trial policy session.
4182 //
4183 rval = StartAuthSessionWithParams( &trialPolicySession, TPM_RH_NULL,
4184 0, TPM_RH_NULL, 0, &nonceCaller, &encryptedSalt, TPM_SE_TRIAL,
4185 &symmetric, sessionAlg );
4186 CheckPassed( rval );
4187
4188 rval = Tss2_Sys_PolicyAuthValue( sysContext, trialPolicySession->sessionHandle, 0, 0 );
4189 CheckPassed( rval );
4190
4191 // Get policy digest.
4192 rval = Tss2_Sys_PolicyGetDigest( sysContext, trialPolicySession->sessionHandle,
4193 0, &authPolicy, 0 );
4194 CheckPassed( rval );
4195
4196 // End the trial session by flushing it.
4197 rval = Tss2_Sys_FlushContext( sysContext, trialPolicySession->sessionHandle );
4198 CheckPassed( rval );
4199
4200 // And remove the trial policy session from sessions table.
4201 rval = EndAuthSession( trialPolicySession );
4202 CheckPassed( rval );
4203
4204 // Now set the NV index's attributes:
4205 // policyRead, authWrite, and platormCreate.
4206 *(UINT32 *)( (void *)&nvAttributes ) = 0;
4207 nvAttributes.TPMA_NV_POLICYREAD = 1;
4208 nvAttributes.TPMA_NV_POLICYWRITE = 1;
4209 nvAttributes.TPMA_NV_PLATFORMCREATE = 1;
4210
4211 // Create the NV index.
4212 rval = DefineNvIndex( TPM_RH_PLATFORM, TPM_RS_PW,
4213 &nvAuth, &authPolicy, TPM20_INDEX_PASSWORD_TEST,
4214 sessionAlg, nvAttributes, 32 );
4215 CheckPassed( rval );
4216
4217 // Add index and associated authorization value to
4218 // entity table. This helps when we need
4219 // to calculate HMACs.
4220 AddEntity( TPM20_INDEX_PASSWORD_TEST, &nvAuth );
4221 CheckPassed( rval );
4222
4223 // Get the name of the NV index.
4224 rval = (*HandleToNameFunctionPtr)( TPM20_INDEX_PASSWORD_TEST,
4225 &nvName );
4226 CheckPassed( rval );
4227
4228 //
4229 // Start real (non-trial) policy authorization session:
4230 // it's an unbound and unsalted session, no symmetric
4231 // encryption algorithm, and SHA256 is the session's
4232 // hash algorithm.
4233 //
4234
4235 // Zero sized encrypted salt, since the session
4236 // is unsalted.
4237 encryptedSalt.t.size = 0;
4238
4239 // No symmetric algorithm.
4240 symmetric.algorithm = TPM_ALG_NULL;
4241
4242 // Create the session.
4243 // Session state (session handle, nonces, etc.) gets
4244 // saved into nvSession structure for later use.
4245 rval = StartAuthSessionWithParams( &nvSession, TPM_RH_NULL,
4246 0, TPM_RH_NULL, 0, &nonceCaller, &encryptedSalt, TPM_SE_POLICY,
4247 &symmetric, sessionAlg );
4248 CheckPassed( rval );
4249
4250 // Get the name of the session and save it in
4251 // the nvSession structure.
4252 rval = (*HandleToNameFunctionPtr)( nvSession->sessionHandle,
4253 &nvSession->name );
4254 CheckPassed( rval );
4255
4256 // Initialize NV write data.
4257 nvWriteData.t.size = sizeof( dataToWrite );
4258 for( i = 0; i < nvWriteData.t.size; i++ )
4259 {
4260 nvWriteData.t.buffer[i] = dataToWrite[i];
4261 }
4262
4263 //
4264 // Now setup for writing the NV index.
4265 //
4266
4267 rval = Tss2_Sys_PolicyAuthValue( sysContext, nvSession->sessionHandle, 0, 0 );
4268 CheckPassed( rval );
4269
4270 // Get policy digest.
4271 rval = Tss2_Sys_PolicyGetDigest( sysContext, trialPolicySession->sessionHandle,
4272 0, &authPolicy, 0 );
4273 CheckPassed( rval );
4274
4275 // First call prepare in order to create cpBuffer.
4276 rval = Tss2_Sys_NV_Write_Prepare( sysContext, TPM20_INDEX_PASSWORD_TEST,
4277 TPM20_INDEX_PASSWORD_TEST, &nvWriteData, 0 );
4278 CheckPassed( rval );
4279
4280 // Configure command authorization area, except for HMAC.
4281 nvCmdAuths.cmdAuths[0]->sessionHandle = nvSession->sessionHandle;
4282 nvCmdAuths.cmdAuths[0]->nonce.t.size = 1;
4283 nvCmdAuths.cmdAuths[0]->nonce.t.buffer[0] = 0xa5;
4284 *( (UINT8 *)((void *)&sessionAttributes ) ) = 0;
4285 nvCmdAuths.cmdAuths[0]->sessionAttributes = sessionAttributes;
4286 nvCmdAuths.cmdAuths[0]->sessionAttributes.continueSession = 1;
4287
4288 // Roll nonces for command
4289 RollNonces( nvSession, &nvCmdAuths.cmdAuths[0]->nonce );
4290
4291 // Complete command authorization area, by computing
4292 // HMAC and setting it in nvCmdAuths.
4293 rval = ComputeCommandHmacs( sysContext,
4294 TPM20_INDEX_PASSWORD_TEST,
4295 TPM20_INDEX_PASSWORD_TEST, &nvCmdAuths,
4296 TPM_RC_FAILURE );
4297 CheckPassed( rval );
4298
4299 // Finally!! Write the data to the NV index.
4300 // If the command is successful, the command
4301 // HMAC was correct.
4302 sessionCmdRval = Tss2_Sys_NV_Write( sysContext,
4303 TPM20_INDEX_PASSWORD_TEST,
4304 TPM20_INDEX_PASSWORD_TEST,
4305 &nvCmdAuths, &nvWriteData, 0, &nvRspAuths );
4306 CheckPassed( sessionCmdRval );
4307
4308 // Roll nonces for response
4309 RollNonces( nvSession, &nvRspAuths.rspAuths[0]->nonce );
4310
4311 if( sessionCmdRval == TPM_RC_SUCCESS )
4312 {
4313 // If the command was successful, check the
4314 // response HMAC to make sure that the
4315 // response was received correctly.
4316 rval = CheckResponseHMACs( sysContext, sessionCmdRval,
4317 &nvCmdAuths, TPM20_INDEX_PASSWORD_TEST,
4318 TPM20_INDEX_PASSWORD_TEST, &nvRspAuths );
4319 CheckPassed( rval );
4320 }
4321
4322 rval = Tss2_Sys_PolicyAuthValue( sysContext, nvSession->sessionHandle, 0, 0 );
4323 CheckPassed( rval );
4324
4325 // First call prepare in order to create cpBuffer.
4326 rval = Tss2_Sys_NV_Read_Prepare( sysContext, TPM20_INDEX_PASSWORD_TEST,
4327 TPM20_INDEX_PASSWORD_TEST, sizeof( dataToWrite ), 0 );
4328 CheckPassed( rval );
4329
4330 // Roll nonces for command
4331 RollNonces( nvSession, &nvCmdAuths.cmdAuths[0]->nonce );
4332
4333 // End the session after next command.
4334 nvCmdAuths.cmdAuths[0]->sessionAttributes.continueSession = 0;
4335
4336 // Complete command authorization area, by computing
4337 // HMAC and setting it in nvCmdAuths.
4338 rval = ComputeCommandHmacs( sysContext,
4339 TPM20_INDEX_PASSWORD_TEST,
4340 TPM20_INDEX_PASSWORD_TEST, &nvCmdAuths,
4341 TPM_RC_FAILURE );
4342 CheckPassed( rval );
4343
4344 // And now read the data back.
4345 // If the command is successful, the command
4346 // HMAC was correct.
4347 sessionCmdRval = Tss2_Sys_NV_Read( sysContext,
4348 TPM20_INDEX_PASSWORD_TEST,
4349 TPM20_INDEX_PASSWORD_TEST,
4350 &nvCmdAuths, sizeof( dataToWrite ), 0,
4351 &nvReadData, &nvRspAuths );
4352 CheckPassed( sessionCmdRval );
4353
4354 // Roll nonces for response
4355 RollNonces( nvSession, &nvRspAuths.rspAuths[0]->nonce );
4356
4357 if( sessionCmdRval == TPM_RC_SUCCESS )
4358 {
4359 // If the command was successful, check the
4360 // response HMAC to make sure that the
4361 // response was received correctly.
4362 rval = CheckResponseHMACs( sysContext, sessionCmdRval,
4363 &nvCmdAuths, TPM20_INDEX_PASSWORD_TEST,
4364 TPM20_INDEX_PASSWORD_TEST, &nvRspAuths );
4365 CheckPassed( rval );
4366 }
4367
4368 // Check that write and read data are equal.
4369 if( memcmp( (void *)&nvReadData.t.buffer[0],
4370 (void *)&nvWriteData.t.buffer[0], nvReadData.t.size ) )
4371 {
4372 TpmClientPrintf( 0, "ERROR!! read data not equal to written data\n" );
4373 Cleanup();
4374 }
4375
4376 //
4377 // Now cleanup: undefine the NV index and delete
4378 // the NV index's entity table entry.
4379 //
4380
4381 // Setup authorization for undefining the NV index.
4382 nvCmdAuths.cmdAuths[0]->sessionHandle = TPM_RS_PW;
4383 nvCmdAuths.cmdAuths[0]->nonce.t.size = 0;
4384 nvCmdAuths.cmdAuths[0]->hmac.t.size = 0;
4385
4386 // Undefine the NV index.
4387 rval = Tss2_Sys_NV_UndefineSpace( sysContext,
4388 TPM_RH_PLATFORM, TPM20_INDEX_PASSWORD_TEST,
4389 &nvCmdAuths, 0 );
4390 CheckPassed( rval );
4391
4392 // Delete the NV index's entry in the entity table.
4393 rval = DeleteEntity( TPM20_INDEX_PASSWORD_TEST );
4394 CheckPassed( rval );
4395}
4396
4397void SimpleHmacTest()
4398{
4399 UINT32 rval, sessionCmdRval;
4400 TPM2B_AUTH nvAuth;
4401 SESSION *nvSession;
4402 TPMA_NV nvAttributes;
4403 TPM2B_DIGEST authPolicy;
4404 TPM2B_NAME nvName;
4405 TPM2B_MAX_NV_BUFFER nvWriteData, nvReadData;
4406 UINT8 dataToWrite[] = { 0x00, 0xff, 0x55, 0xaa };
4407 char sharedSecret[] = "shared secret";
4408 int i;
4409 TPM2B_ENCRYPTED_SECRET encryptedSalt;
4410 TPMT_SYM_DEF symmetric;
4411 TPMA_SESSION sessionAttributes;
4412
4413 // Command authorization area: one password session.
4414 TPMS_AUTH_COMMAND nvCmdAuth = { TPM_RS_PW, };
4415 TPMS_AUTH_COMMAND *nvCmdAuthArray[1] = { &nvCmdAuth };
4416 TSS2_SYS_CMD_AUTHS nvCmdAuths = { 1, &nvCmdAuthArray[0] };
4417
4418 // Response authorization area.
4419 TPMS_AUTH_RESPONSE nvRspAuth;
4420 TPMS_AUTH_RESPONSE *nvRspAuthArray[1] = { &nvRspAuth };
4421 TSS2_SYS_RSP_AUTHS nvRspAuths = { 1, &nvRspAuthArray[0] };
4422 TPM2B_NONCE nonceCaller;
4423
4424 nonceCaller.t.size = 0;
4425
4426 TpmClientPrintf( 0, "\nSIMPLE HMAC SESSION TEST:\n" );
4427
4428 //
4429 // Create NV index.
4430 //
4431
4432 // Setup the NV index's authorization value.
4433 nvAuth.t.size = strlen( sharedSecret );
4434 for( i = 0; i < nvAuth.t.size; i++ )
4435 nvAuth.t.buffer[i] = sharedSecret[i];
4436
4437 // Set NV index's authorization policy
4438 // to zero sized policy since we won't be
4439 // using policy to authorize.
4440 authPolicy.t.size = 0;
4441
4442 // Now set the NV index's attributes:
4443 // policyRead, authWrite, and platormCreate.
4444 *(UINT32 *)( (void *)&nvAttributes ) = 0;
4445 nvAttributes.TPMA_NV_AUTHREAD = 1;
4446 nvAttributes.TPMA_NV_AUTHWRITE = 1;
4447 nvAttributes.TPMA_NV_PLATFORMCREATE = 1;
4448
4449 // Create the NV index.
4450 rval = DefineNvIndex( TPM_RH_PLATFORM, TPM_RS_PW,
4451 &nvAuth, &authPolicy, TPM20_INDEX_PASSWORD_TEST,
4452 TPM_ALG_SHA256, nvAttributes, 32 );
4453 CheckPassed( rval );
4454
4455 // Add index and associated authorization value to
4456 // entity table. This helps when we need
4457 // to calculate HMACs.
4458 AddEntity( TPM20_INDEX_PASSWORD_TEST, &nvAuth );
4459 CheckPassed( rval );
4460
4461 // Get the name of the NV index.
4462 rval = (*HandleToNameFunctionPtr)( TPM20_INDEX_PASSWORD_TEST,
4463 &nvName );
4464 CheckPassed( rval );
4465
4466 //
4467 // Start HMAC authorization session: it's an
4468 // unbound and unsalted session, no symmetric
4469 // encryption algorithm, and SHA256 is the session's
4470 // hash algorithm.
4471 //
4472
4473 // Zero sized encrypted salt, since the session
4474 // is unsalted.
4475 encryptedSalt.t.size = 0;
4476
4477 // No symmetric algorithm.
4478 symmetric.algorithm = TPM_ALG_NULL;
4479
4480 // Create the session.
4481 // Session state (session handle, nonces, etc.) gets
4482 // saved into nvSession structure for later use.
4483 rval = StartAuthSessionWithParams( &nvSession, TPM_RH_NULL,
4484 0, TPM_RH_NULL, 0, &nonceCaller, &encryptedSalt, TPM_SE_HMAC,
4485 &symmetric, TPM_ALG_SHA256 );
4486 CheckPassed( rval );
4487
4488 // Get the name of the session and save it in
4489 // the nvSession structure.
4490 rval = (*HandleToNameFunctionPtr)( nvSession->sessionHandle,
4491 &nvSession->name );
4492 CheckPassed( rval );
4493
4494 // Initialize NV write data.
4495 nvWriteData.t.size = sizeof( dataToWrite );
4496 for( i = 0; i < nvWriteData.t.size; i++ )
4497 {
4498 nvWriteData.t.buffer[i] = dataToWrite[i];
4499 }
4500
4501 //
4502 // Now setup for writing the NV index.
4503 //
4504
4505 // First call prepare in order to create cpBuffer.
4506 rval = Tss2_Sys_NV_Write_Prepare( sysContext, TPM20_INDEX_PASSWORD_TEST,
4507 TPM20_INDEX_PASSWORD_TEST, &nvWriteData, 0 );
4508 CheckPassed( rval );
4509
4510 // Configure command authorization area, except for HMAC.
4511 nvCmdAuths.cmdAuths[0]->sessionHandle = nvSession->sessionHandle;
4512 nvCmdAuths.cmdAuths[0]->nonce.t.size = 1;
4513 nvCmdAuths.cmdAuths[0]->nonce.t.buffer[0] = 0xa5;
4514 *( (UINT8 *)(&sessionAttributes ) ) = 0;
4515 nvCmdAuths.cmdAuths[0]->sessionAttributes = sessionAttributes;
4516 nvCmdAuths.cmdAuths[0]->sessionAttributes.continueSession = 1;
4517
4518 // Roll nonces for command
4519 RollNonces( nvSession, &nvCmdAuths.cmdAuths[0]->nonce );
4520
4521 // Complete command authorization area, by computing
4522 // HMAC and setting it in nvCmdAuths.
4523 rval = ComputeCommandHmacs( sysContext,
4524 TPM20_INDEX_PASSWORD_TEST,
4525 TPM20_INDEX_PASSWORD_TEST, &nvCmdAuths,
4526 TPM_RC_FAILURE );
4527 CheckPassed( rval );
4528
4529 // Finally!! Write the data to the NV index.
4530 // If the command is successful, the command
4531 // HMAC was correct.
4532 sessionCmdRval = Tss2_Sys_NV_Write( sysContext,
4533 TPM20_INDEX_PASSWORD_TEST,
4534 TPM20_INDEX_PASSWORD_TEST,
4535 &nvCmdAuths, &nvWriteData, 0, &nvRspAuths );
4536 CheckPassed( sessionCmdRval );
4537
4538 // Roll nonces for response
4539 RollNonces( nvSession, &nvRspAuths.rspAuths[0]->nonce );
4540
4541 if( sessionCmdRval == TPM_RC_SUCCESS )
4542 {
4543 // If the command was successful, check the
4544 // response HMAC to make sure that the
4545 // response was received correctly.
4546 rval = CheckResponseHMACs( sysContext, sessionCmdRval,
4547 &nvCmdAuths, TPM20_INDEX_PASSWORD_TEST,
4548 TPM20_INDEX_PASSWORD_TEST, &nvRspAuths );
4549 CheckPassed( rval );
4550 }
4551
4552 // First call prepare in order to create cpBuffer.
4553 rval = Tss2_Sys_NV_Read_Prepare( sysContext, TPM20_INDEX_PASSWORD_TEST,
4554 TPM20_INDEX_PASSWORD_TEST, sizeof( dataToWrite ), 0 );
4555 CheckPassed( rval );
4556
4557 // Roll nonces for command
4558 RollNonces( nvSession, &nvCmdAuths.cmdAuths[0]->nonce );
4559
4560 // End the session after next command.
4561 nvCmdAuths.cmdAuths[0]->sessionAttributes.continueSession = 0;
4562
4563 // Complete command authorization area, by computing
4564 // HMAC and setting it in nvCmdAuths.
4565 rval = ComputeCommandHmacs( sysContext,
4566 TPM20_INDEX_PASSWORD_TEST,
4567 TPM20_INDEX_PASSWORD_TEST, &nvCmdAuths,
4568 TPM_RC_FAILURE );
4569 CheckPassed( rval );
4570
4571 // And now read the data back.
4572 // If the command is successful, the command
4573 // HMAC was correct.
4574 sessionCmdRval = Tss2_Sys_NV_Read( sysContext,
4575 TPM20_INDEX_PASSWORD_TEST,
4576 TPM20_INDEX_PASSWORD_TEST,
4577 &nvCmdAuths, sizeof( dataToWrite ), 0,
4578 &nvReadData, &nvRspAuths );
4579 CheckPassed( sessionCmdRval );
4580
4581 // Roll nonces for response
4582 RollNonces( nvSession, &nvRspAuths.rspAuths[0]->nonce );
4583
4584 if( sessionCmdRval == TPM_RC_SUCCESS )
4585 {
4586 // If the command was successful, check the
4587 // response HMAC to make sure that the
4588 // response was received correctly.
4589 rval = CheckResponseHMACs( sysContext, sessionCmdRval,
4590 &nvCmdAuths, TPM20_INDEX_PASSWORD_TEST,
4591 TPM20_INDEX_PASSWORD_TEST, &nvRspAuths );
4592 CheckPassed( rval );
4593 }
4594
4595 // Check that write and read data are equal.
4596 if( memcmp( (void *)&nvReadData.t.buffer[0],
4597 (void *)&nvWriteData.t.buffer[0], nvReadData.t.size ) )
4598 {
4599 TpmClientPrintf( 0, "ERROR!! read data not equal to written data\n" );
4600 Cleanup();
4601 }
4602
4603 //
4604 // Now cleanup: undefine the NV index and delete
4605 // the NV index's entity table entry.
4606 //
4607
4608 // Setup authorization for undefining the NV index.
4609 nvCmdAuths.cmdAuths[0]->sessionHandle = TPM_RS_PW;
4610 nvCmdAuths.cmdAuths[0]->nonce.t.size = 0;
4611 nvCmdAuths.cmdAuths[0]->hmac.t.size = 0;
4612
4613 // Undefine the NV index.
4614 rval = Tss2_Sys_NV_UndefineSpace( sysContext,
4615 TPM_RH_PLATFORM, TPM20_INDEX_PASSWORD_TEST,
4616 &nvCmdAuths, 0 );
4617 CheckPassed( rval );
4618
4619 // Delete the NV index's entry in the entity table.
4620 rval = DeleteEntity( TPM20_INDEX_PASSWORD_TEST );
4621 CheckPassed( rval );
4622
4623 rval = EndAuthSession( nvSession );
4624
4625 CheckPassed( rval );
Will-nucd937bec2015-11-18 16:51:05 -05004626
4627 PlatformCommand( resMgrTctiContext, MS_SIM_POWER_OFF );
Will Arthur54e04e42015-07-15 11:29:25 -04004628}
4629
4630
4631void SimpleHmacOrPolicyTest( bool hmacTest )
4632{
4633 UINT32 rval, sessionCmdRval;
4634 TPM2B_AUTH nvAuth;
4635 SESSION *nvSession, *trialPolicySession;
4636 TPMA_NV nvAttributes;
4637 TPM2B_DIGEST authPolicy;
4638 TPM2B_NAME nvName;
4639 TPM2B_MAX_NV_BUFFER nvWriteData, nvReadData;
4640 UINT8 dataToWrite[] = { 0x00, 0xff, 0x55, 0xaa };
4641 char sharedSecret[] = "shared secret";
4642 int i;
4643 TPM2B_ENCRYPTED_SECRET encryptedSalt;
4644 TPMT_SYM_DEF symmetric;
4645 TPMA_SESSION sessionAttributes;
4646 TPM_SE tpmSe;
4647 char *testString;
4648 char testStringHmac[] = "HMAC";
4649 char testStringPolicy[] = "POLICY";
4650
4651 // Command authorization area: one password session.
4652 TPMS_AUTH_COMMAND nvCmdAuth = { TPM_RS_PW, };
4653 TPMS_AUTH_COMMAND *nvCmdAuthArray[1] = { &nvCmdAuth };
4654 TSS2_SYS_CMD_AUTHS nvCmdAuths = { 1, &nvCmdAuthArray[0] };
4655
4656 // Response authorization area.
4657 TPMS_AUTH_RESPONSE nvRspAuth;
4658 TPMS_AUTH_RESPONSE *nvRspAuthArray[1] = { &nvRspAuth };
4659 TSS2_SYS_RSP_AUTHS nvRspAuths = { 1, &nvRspAuthArray[0] };
4660
4661 TSS2_SYS_CONTEXT *simpleTestContext;
4662 TPM2B_NONCE nonceCaller;
4663
4664 nonceCaller.t.size = 0;
4665
4666 if( hmacTest )
4667 testString = testStringHmac;
4668 else
4669 testString = testStringPolicy;
4670
4671 TpmClientPrintf( 0, "\nSIMPLE %s SESSION TEST:\n", testString );
4672
4673 // Create sysContext structure.
4674 simpleTestContext = InitSysContext( 1000, resMgrTctiContext, &abiVersion );
4675 if( simpleTestContext == 0 )
4676 {
4677 InitSysContextFailure();
4678 }
4679
4680 // Setup the NV index's authorization value.
4681 nvAuth.t.size = strlen( sharedSecret );
4682 for( i = 0; i < nvAuth.t.size; i++ )
4683 nvAuth.t.buffer[i] = sharedSecret[i];
4684
4685 //
4686 // Create NV index.
4687 //
4688 if( hmacTest )
4689 {
4690 // Setup the NV index's authorization value.
4691 nvAuth.t.size = strlen( sharedSecret );
4692 for( i = 0; i < nvAuth.t.size; i++ )
4693 nvAuth.t.buffer[i] = sharedSecret[i];
4694
4695 // Set NV index's authorization policy
4696 // to zero sized policy since we won't be
4697 // using policy to authorize.
4698
4699 authPolicy.t.size = 0;
4700 }
4701 else
4702 {
4703 // Zero sized encrypted salt, since the session
4704 // is unsalted.
4705
4706 encryptedSalt.t.size = 0;
4707
4708 // No symmetric algorithm.
4709 symmetric.algorithm = TPM_ALG_NULL;
4710
Philip Tricca1ea84a52015-11-19 18:07:06 -08004711 //
Will Arthur54e04e42015-07-15 11:29:25 -04004712 // Create the NV index's authorization policy
4713 // using a trial policy session.
4714 //
4715 rval = StartAuthSessionWithParams( &trialPolicySession,
4716 TPM_RH_NULL, 0, TPM_RH_NULL, 0, &nonceCaller, &encryptedSalt,
4717 TPM_SE_TRIAL,
4718 &symmetric, TPM_ALG_SHA256 );
4719 CheckPassed( rval );
4720
4721 rval = Tss2_Sys_PolicyAuthValue( simpleTestContext,
4722 trialPolicySession->sessionHandle, 0, 0 );
4723 CheckPassed( rval );
4724
4725 // Get policy digest.
Will-nucd6bbaa12015-12-08 11:51:25 -05004726 authPolicy.t.size = sizeof( authPolicy ) - 2;
Will Arthur54e04e42015-07-15 11:29:25 -04004727 rval = Tss2_Sys_PolicyGetDigest( simpleTestContext,
4728 trialPolicySession->sessionHandle,
4729 0, &authPolicy, 0 );
4730 CheckPassed( rval );
4731
4732 // End the trial session by flushing it.
4733 rval = Tss2_Sys_FlushContext( simpleTestContext,
4734 trialPolicySession->sessionHandle );
4735 CheckPassed( rval );
4736
4737 // And remove the trial policy session from
4738 // sessions table.
4739 rval = EndAuthSession( trialPolicySession );
4740 CheckPassed( rval );
4741 }
4742
4743 // Now set the NV index's attributes:
4744 // policyRead, authWrite, and platormCreate.
4745 *(UINT32 *)( &nvAttributes ) = 0;
4746 if( hmacTest )
4747 {
4748 nvAttributes.TPMA_NV_AUTHREAD = 1;
4749 nvAttributes.TPMA_NV_AUTHWRITE = 1;
4750 }
4751 else
4752 {
4753 nvAttributes.TPMA_NV_POLICYREAD = 1;
4754 nvAttributes.TPMA_NV_POLICYWRITE = 1;
4755 }
4756 nvAttributes.TPMA_NV_PLATFORMCREATE = 1;
4757
4758 // Create the NV index.
4759 rval = DefineNvIndex( TPM_RH_PLATFORM, TPM_RS_PW,
4760 &nvAuth, &authPolicy, TPM20_INDEX_PASSWORD_TEST,
4761 TPM_ALG_SHA256, nvAttributes, 32 );
4762 CheckPassed( rval );
4763
4764 // Add index and associated authorization value to
4765 // entity table. This helps when we need
4766 // to calculate HMACs.
4767 AddEntity( TPM20_INDEX_PASSWORD_TEST, &nvAuth );
4768 CheckPassed( rval );
4769
4770 // Get the name of the NV index.
4771 rval = (*HandleToNameFunctionPtr)(
4772 TPM20_INDEX_PASSWORD_TEST,
4773 &nvName );
4774 CheckPassed( rval );
4775
4776
4777 //
4778 // Start HMAC or real (non-trial) policy authorization session:
4779 // it's an unbound and unsalted session, no symmetric
4780 // encryption algorithm, and SHA256 is the session's
4781 // hash algorithm.
4782 //
4783
4784 // Zero sized encrypted salt, since the session
4785 // is unsalted.
4786 encryptedSalt.t.size = 0;
4787
4788 // No symmetric algorithm.
4789 symmetric.algorithm = TPM_ALG_NULL;
4790
4791 // Create the session, hmac or policy depending
4792 // on hmacTest.
4793 // Session state (session handle, nonces, etc.) gets
4794 // saved into nvSession structure for later use.
4795 if( hmacTest )
4796 tpmSe = TPM_SE_HMAC;
4797 else
4798 tpmSe = TPM_SE_POLICY;
4799
4800 rval = StartAuthSessionWithParams( &nvSession, TPM_RH_NULL,
4801 0, TPM_RH_NULL, 0, &nonceCaller, &encryptedSalt, tpmSe,
4802 &symmetric, TPM_ALG_SHA256 );
4803 CheckPassed( rval );
4804
4805 // Get the name of the session and save it in
4806 // the nvSession structure.
4807 rval = (*HandleToNameFunctionPtr)( nvSession->sessionHandle,
4808 &(nvSession->name) );
4809 CheckPassed( rval );
4810
4811 // Initialize NV write data.
4812 nvWriteData.t.size = sizeof( dataToWrite );
4813 for( i = 0; i < nvWriteData.t.size; i++ )
4814 {
4815 nvWriteData.t.buffer[i] = dataToWrite[i];
4816 }
4817
4818 //
4819 // Now setup for writing the NV index.
4820 //
4821 if( !hmacTest )
4822 {
4823 // Send policy command.
4824 rval = Tss2_Sys_PolicyAuthValue( simpleTestContext,
4825 nvSession->sessionHandle, 0, 0 );
4826 CheckPassed( rval );
4827 }
4828
4829 // First call prepare in order to create cpBuffer.
4830 rval = Tss2_Sys_NV_Write_Prepare( simpleTestContext,
4831 TPM20_INDEX_PASSWORD_TEST,
4832 TPM20_INDEX_PASSWORD_TEST, &nvWriteData, 0 );
4833 CheckPassed( rval );
4834
4835 // Configure command authorization area, except for HMAC.
4836 nvCmdAuths.cmdAuths[0]->sessionHandle =
4837 nvSession->sessionHandle;
4838 nvCmdAuths.cmdAuths[0]->nonce.t.size = 1;
4839 nvCmdAuths.cmdAuths[0]->nonce.t.buffer[0] = 0xa5;
4840 *( (UINT8 *)(&sessionAttributes ) ) = 0;
4841 nvCmdAuths.cmdAuths[0]->sessionAttributes = sessionAttributes;
4842 nvCmdAuths.cmdAuths[0]->sessionAttributes.continueSession = 1;
4843
4844 // Roll nonces for command
4845 RollNonces( nvSession, &nvCmdAuths.cmdAuths[0]->nonce );
4846
4847 // Complete command authorization area, by computing
4848 // HMAC and setting it in nvCmdAuths.
4849 rval = ComputeCommandHmacs( simpleTestContext,
4850 TPM20_INDEX_PASSWORD_TEST,
4851 TPM20_INDEX_PASSWORD_TEST, &nvCmdAuths,
4852 TPM_RC_FAILURE );
4853 CheckPassed( rval );
4854
4855 // Finally!! Write the data to the NV index.
4856 // If the command is successful, the command
4857 // HMAC was correct.
4858 sessionCmdRval = Tss2_Sys_NV_Write( simpleTestContext,
4859 TPM20_INDEX_PASSWORD_TEST,
4860 TPM20_INDEX_PASSWORD_TEST,
4861 &nvCmdAuths, &nvWriteData, 0, &nvRspAuths );
4862 CheckPassed( sessionCmdRval );
4863
4864 // Roll nonces for response
4865 RollNonces( nvSession, &nvRspAuths.rspAuths[0]->nonce );
4866
4867 if( sessionCmdRval == TPM_RC_SUCCESS )
4868 {
4869 // If the command was successful, check the
4870 // response HMAC to make sure that the
4871 // response was received correctly.
4872 rval = CheckResponseHMACs( simpleTestContext, sessionCmdRval,
4873 &nvCmdAuths, TPM20_INDEX_PASSWORD_TEST,
4874 TPM20_INDEX_PASSWORD_TEST, &nvRspAuths );
4875 CheckPassed( rval );
4876 }
4877
4878 if( !hmacTest )
4879 {
4880 // Send policy command.
4881 rval = Tss2_Sys_PolicyAuthValue( simpleTestContext,
4882 nvSession->sessionHandle, 0, 0 );
4883 CheckPassed( rval );
4884 }
4885 // First call prepare in order to create cpBuffer.
4886 rval = Tss2_Sys_NV_Read_Prepare( simpleTestContext,
4887 TPM20_INDEX_PASSWORD_TEST,
4888 TPM20_INDEX_PASSWORD_TEST,
4889 sizeof( dataToWrite ), 0 );
4890 CheckPassed( rval );
4891
4892 // Roll nonces for command
4893 RollNonces( nvSession, &nvCmdAuths.cmdAuths[0]->nonce );
4894
4895 // End the session after next command.
4896 nvCmdAuths.cmdAuths[0]->sessionAttributes.continueSession = 0;
4897
4898 // Complete command authorization area, by computing
4899 // HMAC and setting it in nvCmdAuths.
4900 rval = ComputeCommandHmacs( simpleTestContext,
4901 TPM20_INDEX_PASSWORD_TEST,
4902 TPM20_INDEX_PASSWORD_TEST, &nvCmdAuths,
4903 TPM_RC_FAILURE );
4904 CheckPassed( rval );
4905
4906 // And now read the data back.
4907 // If the command is successful, the command
4908 // HMAC was correct.
4909 sessionCmdRval = Tss2_Sys_NV_Read( simpleTestContext,
4910 TPM20_INDEX_PASSWORD_TEST,
4911 TPM20_INDEX_PASSWORD_TEST,
4912 &nvCmdAuths, sizeof( dataToWrite ), 0,
4913 &nvReadData, &nvRspAuths );
4914 CheckPassed( sessionCmdRval );
4915
4916 // Roll nonces for response
4917 RollNonces( nvSession, &nvRspAuths.rspAuths[0]->nonce );
4918
4919 if( sessionCmdRval == TPM_RC_SUCCESS )
4920 {
4921 // If the command was successful, check the
4922 // response HMAC to make sure that the
4923 // response was received correctly.
4924 rval = CheckResponseHMACs( simpleTestContext, sessionCmdRval,
4925 &nvCmdAuths, TPM20_INDEX_PASSWORD_TEST,
4926 TPM20_INDEX_PASSWORD_TEST, &nvRspAuths );
4927 CheckPassed( rval );
4928 }
4929
4930 // Check that write and read data are equal.
4931 if( memcmp( (void *)&nvReadData.t.buffer[0],
4932 (void *)&nvWriteData.t.buffer[0], nvReadData.t.size ) )
4933 {
4934 TpmClientPrintf( 0, "ERROR!! read data not equal to written data\n" );
4935 Cleanup();
4936 }
4937
4938 //
4939 // Now cleanup: undefine the NV index and delete
4940 // the NV index's entity table entry.
4941 //
4942
4943 // Setup authorization for undefining the NV index.
4944 nvCmdAuths.cmdAuths[0]->sessionHandle = TPM_RS_PW;
4945 nvCmdAuths.cmdAuths[0]->nonce.t.size = 0;
4946 nvCmdAuths.cmdAuths[0]->hmac.t.size = 0;
4947
4948 // Undefine the NV index.
4949 rval = Tss2_Sys_NV_UndefineSpace( simpleTestContext,
4950 TPM_RH_PLATFORM, TPM20_INDEX_PASSWORD_TEST,
4951 &nvCmdAuths, 0 );
4952 CheckPassed( rval );
4953
4954 // Delete the NV index's entry in the entity table.
4955 rval = DeleteEntity( TPM20_INDEX_PASSWORD_TEST );
4956 CheckPassed( rval );
4957
4958 // Remove the real session from sessions table.
4959 rval = EndAuthSession( nvSession );
4960
4961 CheckPassed( rval );
4962
4963 TeardownSysContext( &simpleTestContext );
Will-nucd937bec2015-11-18 16:51:05 -05004964
Will Arthur54e04e42015-07-15 11:29:25 -04004965}
4966
4967
4968typedef struct {
4969 TPMI_DH_OBJECT tpmKey;
4970 TPMI_DH_ENTITY bound;
4971 TPM2B_MAX_BUFFER *salt;
4972 char hmacTestDescription[50];
4973} HMAC_TEST_SETUP;
4974
4975TPM2B_MAX_BUFFER nullSalt = { { 0, { 0xa4 } }, };
4976TPM2B_MAX_BUFFER nonNullSalt = { { 2, { 0xa5, 0 } } };
4977
4978HMAC_TEST_SETUP hmacTestSetups[] =
4979{
4980 { TPM_RH_NULL, TPM_RH_NULL, &nullSalt, "UNBOUND/UNSALTED SESSION TEST" },
4981 { TPM_RH_NULL, TPM20_INDEX_PASSWORD_TEST, &nullSalt, "BOUND SESSION TEST" },
4982 { 0, TPM_RH_NULL, &nonNullSalt, "SALTED SESSION TEST" },
4983 { 0, TPM20_INDEX_PASSWORD_TEST, &nonNullSalt, "BOUND/SALTED SESSION TEST" },
4984};
4985
4986#define PLAINTEXT_SESSION 0
4987#define DECRYPT_SESSION 1
4988#define ENCRYPT_SESSION 2
4989
4990//UINT8 decryptEncryptSetups[] = { PLAINTEXT_SESSION, DECRYPT_SESSION, ENCRYPT_SESSION };
4991UINT8 decryptEncryptSetups[] = { PLAINTEXT_SESSION };
4992
4993#define CFB_MODE 0
4994#define XOR_MODE 1
4995
4996void HmacSessionTest()
4997{
4998 UINT32 rval;
4999 unsigned int i, j, k, decryptEncryptMode;
5000 TPM2B_MAX_NV_BUFFER nvWriteData;
5001 UINT8 dataToWrite[] = { 0x00, 0xff, 0x55, 0xaa };
5002 TPM2B_NAME nvName;
5003 TPM_RC sessionCmdRval;
5004
5005 SESSION *nvSession;
5006 TSS2_SYS_CONTEXT *rdSysContext;
5007 TSS2_SYS_CONTEXT *wrSysContext;
5008 TPM2B_AUTH nvAuth;
5009 TPMT_SYM_DEF symmetric;
5010 TPM2B_NONCE nonceOlder;
5011
5012 // Create two sysContext structures.
5013 rdSysContext = InitSysContext( 1000, resMgrTctiContext, &abiVersion );
5014 if( rdSysContext == 0 )
5015 {
5016 InitSysContextFailure();
5017 }
5018
5019 wrSysContext = InitSysContext( 1000, resMgrTctiContext, &abiVersion );
5020 if( wrSysContext == 0 )
5021 {
5022 InitSysContextFailure();
5023 }
5024
5025 char sharedSecret[] = "shared secret";
5026
5027 char buffer1contents[] = "test";
5028 char buffer2contents[] = "string";
5029
5030 TPM2B_MAX_BUFFER buffer1;
5031 TPM2B_MAX_BUFFER buffer2;
5032
5033// TPM2B_IV ivIn, ivOut;
5034 TPM2B_MAX_NV_BUFFER nvData;
5035 TPM2B_ENCRYPTED_SECRET encryptedSalt;
5036
5037 encryptedSalt.t.size = 0;
5038// ivIn.t.size = 0;
5039// ivOut.t.size = 0;
5040
5041 buffer1.t.size = strlen( buffer1contents );
5042 memcpy (buffer1.t.buffer, buffer1contents, buffer1.t.size );
5043 buffer2.t.size = strlen( buffer2contents );
5044 memcpy (buffer2.t.buffer, buffer2contents, buffer2.t.size );
5045
5046
5047 for( j = 0; j < sizeof( hmacTestSetups ) / sizeof( HMAC_TEST_SETUP ); j++ )
5048 {
5049 if( hmacTestSetups[j].salt == &nonNullSalt )
5050 {
5051 hmacTestSetups[j].tpmKey = handle2048rsa;
5052 }
5053 }
5054 TpmClientPrintf( 0, "\nHMAC SESSION TESTS:\n" );
5055
5056 for( j = 0; j < sizeof( hmacTestSetups ) / sizeof( HMAC_TEST_SETUP ); j++ )
5057 {
5058 // Iterate through variations of decrypt and encrypt sessions.
5059 for( k = 0; k < sizeof( decryptEncryptSetups ); k++ )
5060 {
5061 for( decryptEncryptMode = CFB_MODE; decryptEncryptMode < XOR_MODE; decryptEncryptMode++ )
5062 {
5063 TPMS_AUTH_COMMAND sessionData = { TPM_RS_PW, };
5064 TPMS_AUTH_RESPONSE sessionDataOut;
5065 TPMS_AUTH_COMMAND *sessionDataArray[1] = { &sessionData };
5066 TPMS_AUTH_RESPONSE *sessionDataOutArray[1] = { &sessionDataOut };
5067 TSS2_SYS_CMD_AUTHS sessionsData = { 1, &sessionDataArray[0] };
5068 TSS2_SYS_RSP_AUTHS sessionsDataOut = { 1, &sessionDataOutArray[0] };
5069
5070 TPMT_RSA_DECRYPT inScheme;
5071 TPM2B_DATA label;
5072 TPM2B_DIGEST authPolicy;
5073 TPMA_NV nvAttributes;
5074
5075 TpmClientPrintf( 0, "\n\n%s:\n", hmacTestSetups[j].hmacTestDescription );
5076
5077 if( hmacTestSetups[j].tpmKey != TPM_RH_NULL )
5078 {
5079 sessionsData.cmdAuths[0]->hmac = loadedSha1KeyAuth;
5080 sessionsData.cmdAuths[0]->sessionHandle = TPM_RS_PW;
5081 sessionsData.cmdAuths[0]->nonce.t.size = 0;
5082 *( (UINT8 *)(&sessionData.sessionAttributes ) ) = 0;
5083
5084 inScheme.scheme = TPM_ALG_OAEP;
5085 inScheme.details.oaep.hashAlg = TPM_ALG_SHA1;
5086 memcpy( &( label.b.buffer ), "SECRET", 1 + strlen( "SECRET" ) );
5087 label.t.size = strlen( "SECRET" ) + 1;
5088
5089 // Encrypt salt with tpmKey.
wcarthur7b10eeb2015-12-03 16:40:41 -05005090 encryptedSalt.t.size = sizeof( encryptedSalt ) - 2;
Will Arthur54e04e42015-07-15 11:29:25 -04005091 rval = Tss2_Sys_RSA_Encrypt( sysContext, handle2048rsa,
5092 0, (TPM2B_PUBLIC_KEY_RSA *)( hmacTestSetups[j].salt ),
5093 &inScheme, &label, (TPM2B_PUBLIC_KEY_RSA *)&encryptedSalt, 0 );
5094 CheckPassed( rval );
5095 }
5096
5097 // init hmac
5098 sessionData.hmac.t.size = 0;
5099
5100 // NOW CREATE THE INDEX
5101 authPolicy.t.size = 0;
5102
5103 nvAuth.t.size = strlen( sharedSecret );
5104 for( i = 0; i < nvAuth.t.size; i++ )
5105 nvAuth.t.buffer[i] = sharedSecret[i];
5106
5107 // Now set the attributes.
5108 *(UINT32 *)( &nvAttributes ) = 0;
5109 nvAttributes.TPMA_NV_AUTHREAD = 1;
5110 nvAttributes.TPMA_NV_AUTHWRITE = 1;
5111 nvAttributes.TPMA_NV_PLATFORMCREATE = 1;
5112
Will-nuc3ebfeb92015-10-29 15:53:27 -04005113 sessionsData.cmdAuths[0]->sessionHandle = TPM_RS_PW;
5114 sessionsData.cmdAuths[0]->nonce.t.size = 0;
5115 sessionsData.cmdAuths[0]->nonce.t.buffer[0] = 0xa5;
5116 sessionData.hmac.t.size = 0;
5117
5118 // Undefine the index in case a previous test failure left it defined.
5119 rval = Tss2_Sys_NV_UndefineSpace( wrSysContext, TPM_RH_PLATFORM, TPM20_INDEX_PASSWORD_TEST, &sessionsData, 0 );
5120
Will Arthur54e04e42015-07-15 11:29:25 -04005121 rval = DefineNvIndex( TPM_RH_PLATFORM, TPM_RS_PW, &nvAuth, &authPolicy,
5122 TPM20_INDEX_PASSWORD_TEST, TPM_ALG_SHA1, nvAttributes, 32 );
5123 CheckPassed( rval );
5124
5125 AddEntity( TPM20_INDEX_PASSWORD_TEST, &nvAuth );
5126 CheckPassed( rval );
5127
5128 // Get the name using TPM function.
5129 rval = (*HandleToNameFunctionPtr)( TPM20_INDEX_PASSWORD_TEST, &nvName );
5130 CheckPassed( rval );
5131
5132 //
5133 // Start session
5134 //
5135 nonceOlder.t.size = GetDigestSize( TPM_ALG_SHA1 );
5136 for( i = 0; i < nonceOlder.t.size; i++ )
5137 nonceOlder.t.buffer[i] = 0;
5138
5139 if( decryptEncryptSetups[k] == PLAINTEXT_SESSION )
5140 {
5141 symmetric.algorithm = TPM_ALG_NULL;
5142 }
5143 else if( decryptEncryptSetups[k] == DECRYPT_SESSION || decryptEncryptSetups[k] == ENCRYPT_SESSION )
5144 {
5145 if( decryptEncryptMode == CFB_MODE )
5146 {
5147 symmetric.algorithm = TPM_ALG_AES;
5148 symmetric.keyBits.aes = 128;
5149 symmetric.mode.aes = TPM_ALG_CFB;
5150 }
5151 else if( decryptEncryptMode == XOR_MODE )
5152 {
5153 symmetric.algorithm = TPM_ALG_XOR;
5154 symmetric.keyBits.exclusiveOr = TPM_ALG_SHA256;
5155 }
5156 }
5157
5158 rval = StartAuthSessionWithParams( &nvSession, hmacTestSetups[j].tpmKey,
5159 hmacTestSetups[j].salt, hmacTestSetups[j].bound, &nvAuth, &nonceOlder, &encryptedSalt,
5160 TPM_SE_HMAC, &symmetric, TPM_ALG_SHA1 );
5161 CheckPassed( rval );
5162
5163 // Get and print name of the session.
5164 rval = (*HandleToNameFunctionPtr)( nvSession->sessionHandle, &nvSession->name );
5165 CheckPassed( rval );
5166
5167 OpenOutFile( &outFp );
5168 TpmClientPrintf( 0, "Name of authSession: " );
5169 PrintSizedBuffer( (TPM2B *)&nvSession->name );
5170 CloseOutFile( &outFp );
5171
5172 // Init write data.
5173 nvWriteData.t.size = sizeof( dataToWrite );
5174
5175 for( i = 0; i < nvWriteData.t.size; i++ )
5176 {
5177 nvWriteData.t.buffer[i] = dataToWrite[i];
5178 }
5179
5180 if( decryptEncryptSetups[k] == DECRYPT_SESSION )
5181 {
5182 if( decryptEncryptMode == CFB_MODE )
5183 {
5184// rval = EncryptCFB( &nvSession, &( nvWriteData.b ) );
5185 }
5186 else if( decryptEncryptMode == XOR_MODE )
5187 {
5188// rval = EncryptXOR( &nvSession, &( nvWriteData.b ) );
5189 }
5190 sessionsData.cmdAuths[0]->sessionAttributes.decrypt = 1;
5191 }
5192 else
5193 {
5194 sessionsData.cmdAuths[0]->sessionAttributes.decrypt = 0;
5195 }
5196 sessionsData.cmdAuths[0]->sessionAttributes.encrypt = 0;
5197
5198 CheckPassed( rval );
5199
5200 sessionsData.cmdAuths[0]->sessionHandle = nvSession->sessionHandle;
5201 sessionsData.cmdAuths[0]->nonce.t.size = 1;
5202 sessionsData.cmdAuths[0]->nonce.t.buffer[0] = 0xa5;
5203
5204 // Roll nonces for command
5205 RollNonces( nvSession, &sessionsData.cmdAuths[0]->nonce );
5206
5207 // Now try writing with bad HMAC.
5208 rval = Tss2_Sys_NV_Write_Prepare( wrSysContext, TPM20_INDEX_PASSWORD_TEST,
5209 TPM20_INDEX_PASSWORD_TEST, &nvWriteData, 0 );
5210 CheckPassed( rval );
5211
5212 rval = ComputeCommandHmacs( wrSysContext,
5213 TPM20_INDEX_PASSWORD_TEST,
5214 TPM20_INDEX_PASSWORD_TEST, &sessionsData, TPM_RC_FAILURE );
5215 CheckPassed( rval );
5216
5217 // Diddle with HMAC to force failure
5218 sessionsData.cmdAuths[0]->hmac.t.buffer[0] =
5219 ~( sessionsData.cmdAuths[0]->hmac.t.buffer[0] );
5220
5221 sessionCmdRval = Tss2_Sys_NV_Write( wrSysContext, TPM20_INDEX_PASSWORD_TEST,
5222 TPM20_INDEX_PASSWORD_TEST,
5223 &sessionsData, &nvWriteData, 0, &sessionsDataOut );
5224 CheckFailed( sessionCmdRval, TPM_RC_S + TPM_RC_1 + TPM_RC_AUTH_FAIL );
5225
5226 // Since command failed, no need to roll nonces.
5227
5228 TestDictionaryAttackLockReset();
5229
5230 // Now try writing with good HMAC.
5231
5232 // Do stage 1 of NVRead, followed by stage 1 and 2 of NVWrite, followed by
5233 // stage 2 of NVRead. This tests that the staged processing is thread-safe.
5234 sessionsData.cmdAuths[0]->sessionAttributes.continueSession = 0;
5235 rval = Tss2_Sys_NV_Read_Prepare( rdSysContext, TPM20_INDEX_PASSWORD_TEST, TPM20_INDEX_PASSWORD_TEST, sizeof( dataToWrite ), 0 );
5236 CheckPassed( rval );
5237
5238 sessionsData.cmdAuths[0]->sessionAttributes.continueSession = 1;
5239 rval = Tss2_Sys_NV_Write_Prepare( wrSysContext, TPM20_INDEX_PASSWORD_TEST, TPM20_INDEX_PASSWORD_TEST,
5240 &nvWriteData, 0 );
5241 CheckPassed( rval );
5242
5243 rval = ComputeCommandHmacs( wrSysContext, TPM20_INDEX_PASSWORD_TEST,
5244 TPM20_INDEX_PASSWORD_TEST, &sessionsData, sessionCmdRval );
5245 CheckPassed( rval );
5246
5247 sessionCmdRval = Tss2_Sys_NV_Write( wrSysContext,
5248 TPM20_INDEX_PASSWORD_TEST, TPM20_INDEX_PASSWORD_TEST, &sessionsData, &nvWriteData, 0, &sessionsDataOut );
5249 CheckPassed( sessionCmdRval );
5250 if( sessionCmdRval == TPM_RC_SUCCESS )
5251 {
5252 // Roll nonces for response
5253 RollNonces( nvSession, &sessionsDataOut.rspAuths[0]->nonce );
5254
5255 rval = CheckResponseHMACs( wrSysContext, sessionCmdRval,
5256 &sessionsData, TPM20_INDEX_PASSWORD_TEST, TPM20_INDEX_PASSWORD_TEST, &sessionsDataOut );
5257 CheckPassed( rval );
5258 }
5259
5260 // Roll nonces for command
5261 RollNonces( nvSession, &sessionsData.cmdAuths[0]->nonce );
5262
5263 sessionsData.cmdAuths[0]->sessionAttributes.continueSession = 0;
5264 rval = ComputeCommandHmacs( rdSysContext, TPM20_INDEX_PASSWORD_TEST,
5265 TPM20_INDEX_PASSWORD_TEST, &sessionsData, sessionCmdRval );
5266 CheckPassed( rval );
5267
5268 if( decryptEncryptSetups[k] == ENCRYPT_SESSION )
5269 {
5270 sessionsData.cmdAuths[0]->sessionAttributes.encrypt = 1;
5271 }
5272 else
5273 {
5274 sessionsData.cmdAuths[0]->sessionAttributes.encrypt = 0;
5275 }
5276 sessionsData.cmdAuths[0]->sessionAttributes.decrypt = 0;
5277
5278 sessionCmdRval = Tss2_Sys_NV_Read( rdSysContext, TPM20_INDEX_PASSWORD_TEST,
5279 TPM20_INDEX_PASSWORD_TEST, &sessionsData, sizeof( dataToWrite ), 0, &nvData, &sessionsDataOut );
5280 CheckPassed( sessionCmdRval );
5281 if( sessionCmdRval == TPM_RC_SUCCESS )
5282 {
5283 // Roll nonces for response
5284 RollNonces( nvSession, &sessionsDataOut.rspAuths[0]->nonce );
5285
5286 rval = CheckResponseHMACs( rdSysContext, sessionCmdRval,
5287 &sessionsData, TPM20_INDEX_PASSWORD_TEST, TPM20_INDEX_PASSWORD_TEST, &sessionsDataOut );
5288 CheckPassed( rval );
5289
5290 if( decryptEncryptSetups[k] == ENCRYPT_SESSION )
5291 {
5292 if( decryptEncryptMode == CFB_MODE )
5293 {
5294// rval = EncryptCFB( nvSession, &( nvData.b ) );
5295 }
5296 else if( decryptEncryptMode == XOR_MODE )
5297 {
5298// rval = EncryptXOR( nvSession, &( nvData.b ) );
5299 }
5300 CheckPassed( rval );
5301 }
5302
5303 // Check that write actually worked.
5304 rval = CompareTPM2B( &(nvWriteData.b), &(nvData.b) );
5305 CheckPassed( rval );
5306 }
5307
5308 //
5309 // NOTE: When running against version of the simulator for TPM spec versions later
5310 // than version 0.98, in order for the session to act as a bound session when accessing
5311 // the bind entity, we will need to restart the session here since the name of the bound
5312 // entity changed.
5313 //
5314 if( hmacTestSetups[j].bound != TPM_RH_NULL )
5315 {
5316 rval = EndAuthSession( nvSession );
5317 CheckPassed( rval );
5318
5319 //
5320 // Start session
5321 //
5322 nonceOlder.t.size = GetDigestSize( TPM_ALG_SHA1 );
5323 for( i = 0; i < nonceOlder.t.size; i++ )
5324 nonceOlder.t.buffer[i] = 0;
5325
5326 symmetric.algorithm = TPM_ALG_AES;
5327 symmetric.keyBits.aes = 128;
5328 symmetric.mode.aes = TPM_ALG_CFB;
5329
5330 rval = StartAuthSessionWithParams( &nvSession, hmacTestSetups[j].tpmKey, hmacTestSetups[j].salt, hmacTestSetups[j].bound, &nvAuth, &nonceOlder, &encryptedSalt, TPM_SE_HMAC, &symmetric, TPM_ALG_SHA1 );
5331 CheckPassed( rval );
5332
5333 CopySizedByteBuffer( &( nvSession->authValueBind.b ), &( nvAuth.b ) );
5334
5335 // Now try writing with good HMAC.
5336 sessionsData.cmdAuths[0]->sessionHandle = nvSession->sessionHandle;
5337 sessionsData.cmdAuths[0]->nonce.t.size = 1;
5338 sessionsData.cmdAuths[0]->nonce.t.buffer[0] = 0xa5;
5339 sessionsData.cmdAuths[0]->sessionAttributes.continueSession = 1;
5340 sessionsData.cmdAuths[0]->sessionAttributes.decrypt = 1;
5341
5342 // TBD: Need to encrypt data before sending.
5343
5344 rval = Tss2_Sys_NV_Write_Prepare( wrSysContext, TPM20_INDEX_PASSWORD_TEST,
5345 TPM20_INDEX_PASSWORD_TEST, &nvWriteData, 0 );
5346 CheckPassed( rval );
5347
5348 // Roll nonces for command
5349 RollNonces( nvSession, &sessionsData.cmdAuths[0]->nonce );
5350
5351 rval = ComputeCommandHmacs( wrSysContext, TPM20_INDEX_PASSWORD_TEST,
5352 TPM20_INDEX_PASSWORD_TEST, &sessionsData, TPM_RC_FAILURE );
5353 CheckPassed( rval );
5354
5355 sessionCmdRval = Tss2_Sys_NV_Write( wrSysContext, TPM20_INDEX_PASSWORD_TEST, TPM20_INDEX_PASSWORD_TEST, &sessionsData, &nvWriteData, 0, &sessionsDataOut );
5356 sessionsData.cmdAuths[0]->sessionAttributes.decrypt = 0;
5357 CheckPassed( sessionCmdRval );
5358 if( sessionCmdRval == TPM_RC_SUCCESS )
5359 {
5360 // Roll nonces for response
5361 RollNonces( nvSession, &sessionsDataOut.rspAuths[0]->nonce );
5362
5363 rval = CheckResponseHMACs( wrSysContext, sessionCmdRval,
5364 &sessionsData, TPM20_INDEX_PASSWORD_TEST, TPM20_INDEX_PASSWORD_TEST, &sessionsDataOut );
5365 CheckPassed( rval );
5366 }
5367
5368 // Need to do GetSessionAuditDigest to check that audit digest changed.
5369
5370 sessionsData.cmdAuths[0]->sessionAttributes.continueSession = 0;
5371 sessionsData.cmdAuths[0]->sessionAttributes.encrypt = 1;
5372 sessionsData.cmdAuths[0]->sessionAttributes.audit = 1;
5373
5374 rval = Tss2_Sys_NV_Read_Prepare( rdSysContext, TPM20_INDEX_PASSWORD_TEST,
5375 TPM20_INDEX_PASSWORD_TEST, sizeof( dataToWrite ), 0 );
5376 CheckPassed( rval );
5377
5378 // Roll nonces for command
5379 RollNonces( nvSession, &sessionsData.cmdAuths[0]->nonce );
5380
5381 rval = ComputeCommandHmacs( rdSysContext, TPM20_INDEX_PASSWORD_TEST,
5382 TPM20_INDEX_PASSWORD_TEST, &sessionsData, sessionCmdRval );
5383 CheckPassed( rval );
5384
5385 sessionCmdRval = Tss2_Sys_NV_Read( rdSysContext, TPM20_INDEX_PASSWORD_TEST,
5386 TPM20_INDEX_PASSWORD_TEST, &sessionsData, sizeof( dataToWrite ), 0, &nvData, &sessionsDataOut );
5387 sessionsData.cmdAuths[0]->sessionAttributes.encrypt = 0;
5388 sessionsData.cmdAuths[0]->sessionAttributes.audit = 0;
5389 if( sessionCmdRval == TPM_RC_SUCCESS )
5390 {
5391 // Roll nonces for response
5392 RollNonces( nvSession, &sessionsDataOut.rspAuths[0]->nonce );
5393
5394 rval = CheckResponseHMACs( rdSysContext, sessionCmdRval,
5395 &sessionsData, TPM20_INDEX_PASSWORD_TEST, TPM20_INDEX_PASSWORD_TEST, &sessionsDataOut );
5396 CheckPassed( rval );
5397 }
5398
5399 // TBD: Need to decrypt response data.
5400
5401 CheckPassed( rval );
5402 // TBD: Need to do GetSessionAuditDigest to check that audit digest changed.
5403 }
5404
5405 // Removed comparison for now until we figure out how to properly
5406 // encrypt data before writing to NV index.
5407 // rval = CompareTPM2B( &(nvWriteData.b), &(nvData.b) );
5408 // CheckPassed( rval );
5409
5410 sessionsData.cmdAuths[0]->sessionHandle = TPM_RS_PW;
5411 sessionsData.cmdAuths[0]->nonce.t.size = 0;
5412 sessionsData.cmdAuths[0]->nonce.t.buffer[0] = 0xa5;
5413 sessionData.hmac.t.size = 0;
5414 // Now undefine the index.
5415 rval = Tss2_Sys_NV_UndefineSpace( wrSysContext, TPM_RH_PLATFORM, TPM20_INDEX_PASSWORD_TEST, &sessionsData, 0 );
5416 CheckPassed( rval );
5417 rval = DeleteEntity( TPM20_INDEX_PASSWORD_TEST );
5418 CheckPassed( rval );
5419 rval = EndAuthSession( nvSession );
5420 CheckPassed( rval );
5421 }
5422 }
5423 }
5424
5425 TeardownSysContext( &wrSysContext );
5426 TeardownSysContext( &rdSysContext );
5427
5428}
5429
5430UINT32 writeDataString = 0xdeadbeef;
5431
5432void TestEncryptDecryptSession()
5433{
5434 TSS2_RC rval = TSS2_RC_SUCCESS;
5435 SESSION *encryptDecryptSession;
5436 TPMT_SYM_DEF symmetric;
5437 TPM2B_MAX_NV_BUFFER writeData, encryptedWriteData;
5438 TPM2B_MAX_NV_BUFFER encryptedReadData, decryptedReadData,
5439 readData;
5440 size_t decryptParamSize;
5441 uint8_t *decryptParamBuffer;
5442 size_t encryptParamSize;
5443 uint8_t *encryptParamBuffer;
5444 TPM2B_AUTH nvAuth;
5445 TPM2B_DIGEST authPolicy;
5446 TPMA_NV nvAttributes;
5447 int i;
5448 TPMA_SESSION sessionAttributes;
5449 TPM2B_NONCE nonceCaller;
5450
5451 nonceCaller.t.size = 0;
5452
5453 // Authorization structure for undefine command.
5454 TPMS_AUTH_COMMAND nvUndefineAuth;
5455
5456 // Create and init authorization area for undefine command:
5457 // only 1 authorization area.
5458 TPMS_AUTH_COMMAND *nvUndefineAuthArray[1] = { &nvUndefineAuth };
5459
5460 // Authorization array for command (only has one auth structure).
5461 TSS2_SYS_CMD_AUTHS nvUndefineAuths = { 1, &nvUndefineAuthArray[0] };
5462
5463 TpmClientPrintf( 0, "\n\nDECRYPT/ENCRYPT SESSION TESTS:\n" );
5464
5465 writeData.t.size = sizeof( writeDataString );
5466 memcpy( (void *)&writeData.t.buffer, (void *)&writeDataString,
5467 sizeof( writeDataString ) );
5468
5469
5470 // Create NV index with empty auth value.
5471 *(UINT32 *)( (void *)&nvAttributes ) = 0;
5472 nvAttributes.TPMA_NV_AUTHREAD = 1;
5473 nvAttributes.TPMA_NV_AUTHWRITE = 1;
5474 nvAttributes.TPMA_NV_PLATFORMCREATE = 1;
5475
5476 // No authorization required.
5477 authPolicy.t.size = 0;
5478 nvAuth.t.size = 0;
5479 rval = DefineNvIndex( TPM_RH_PLATFORM, TPM_RS_PW,
5480 &nvAuth, &authPolicy, TPM20_INDEX_TEST1,
5481 TPM_ALG_SHA1, nvAttributes,
5482 sizeof( writeDataString ) );
5483
5484 //
5485 // 1st pass with CFB mode.
5486 // 2nd pass with XOR mode.
5487 //
5488 for( i = 0; i < 2; i++ )
5489 {
5490 // Authorization structure for NV
5491 // read/write commands.
5492 TPMS_AUTH_COMMAND nvRdWrCmdAuth;
5493
5494 // Authorization structure for
5495 // encrypt/decrypt session.
5496 TPMS_AUTH_COMMAND decryptEncryptSessionCmdAuth;
5497
5498 // Create and init authorization area for
5499 // NV read/write commands:
5500 // 2 authorization areas.
5501 TPMS_AUTH_COMMAND *nvRdWrCmdAuthArray[2] =
5502 { &nvRdWrCmdAuth, &decryptEncryptSessionCmdAuth };
5503
5504 // Authorization array for commands
5505 // (has two auth structures).
5506 TSS2_SYS_CMD_AUTHS nvRdWrCmdAuths =
5507 { 2, &nvRdWrCmdAuthArray[0] };
5508
5509 // Authorization structure for NV read/write responses.
5510 TPMS_AUTH_RESPONSE nvRdWrRspAuth;
5511 // Authorization structure for decrypt/encrypt
5512 // session responses.
5513 TPMS_AUTH_RESPONSE decryptEncryptSessionRspAuth;
5514
5515 // Create and init authorization area for NV
5516 // read/write responses: 2 authorization areas.
5517 TPMS_AUTH_RESPONSE *nvRdWrRspAuthArray[2] =
5518 { &nvRdWrRspAuth, &decryptEncryptSessionRspAuth };
5519 // Authorization array for responses
5520 // (has two auth structures).
5521 TSS2_SYS_RSP_AUTHS nvRdWrRspAuths =
5522 { 2, &nvRdWrRspAuthArray[0] };
5523
5524 // Setup session parameters.
5525 if( i == 0 )
5526 {
5527 // AES encryption/decryption and CFB mode.
5528 symmetric.algorithm = TPM_ALG_AES;
5529 symmetric.keyBits.aes = 128;
5530 symmetric.mode.aes = TPM_ALG_CFB;
5531 }
5532 else
5533 {
5534 // XOR encryption/decryption.
5535 symmetric.algorithm = TPM_ALG_XOR;
5536 symmetric.keyBits.exclusiveOr = TPM_ALG_SHA256;
5537 }
5538
5539 // Start policy session for decrypt/encrypt session.
5540 rval = StartAuthSessionWithParams( &encryptDecryptSession,
5541 TPM_RH_NULL, 0, TPM_RH_NULL, 0, &nonceCaller, 0, TPM_SE_POLICY,
5542 &symmetric, TPM_ALG_SHA256 );
5543 CheckPassed( rval );
5544
5545 //
5546 // Write TPM index with encrypted parameter used
5547 // as the data to write. Set session for encrypt.
5548 // Use asyncronous APIs to do this.
5549 //
5550 // 1st time: use null buffer, 2nd time use populated one;
5551 // this tests different cases for SetDecryptParam function.
5552 //
5553
5554 // Prepare the input parameters, using unencypted
5555 // write data. This will be encrypted before the
5556 // command is sent to the TPM.
5557 rval = Tss2_Sys_NV_Write_Prepare( sysContext,
5558 TPM20_INDEX_TEST1, TPM20_INDEX_TEST1,
5559 ( i == 0 ? (TPM2B_MAX_NV_BUFFER *)0 : &writeData ),
5560 0 );
5561 CheckPassed( rval );
5562
5563 // Set up password authorization session structure.
5564 nvRdWrCmdAuth.sessionHandle = TPM_RS_PW;
5565 nvRdWrCmdAuth.nonce.t.size = 0;
5566 *( (UINT8 *)((void *)&nvRdWrCmdAuth.sessionAttributes ) ) = 0;
5567 nvRdWrCmdAuth.hmac.t.size = nvAuth.t.size;
5568 memcpy( (void *)&nvRdWrCmdAuth.hmac.t.buffer[0],
5569 (void *)&nvAuth.t.buffer[0],
5570 nvRdWrCmdAuth.hmac.t.size );
5571
5572 // Set up encrypt/decrypt session structure.
5573 decryptEncryptSessionCmdAuth.sessionHandle =
5574 encryptDecryptSession->sessionHandle;
5575 decryptEncryptSessionCmdAuth.nonce.t.size = 0;
5576 *( (UINT8 *)((void *)&sessionAttributes ) ) = 0;
5577 decryptEncryptSessionCmdAuth.sessionAttributes =
5578 sessionAttributes;
5579 decryptEncryptSessionCmdAuth.sessionAttributes.continueSession
5580 = 1;
5581 decryptEncryptSessionCmdAuth.sessionAttributes.decrypt = 1;
5582 decryptEncryptSessionCmdAuth.hmac.t.size = 0;
5583
5584 rval = Tss2_Sys_SetCmdAuths( sysContext, &nvRdWrCmdAuths );
5585 CheckPassed( rval );
5586
5587 // Get decrypt parameter.
5588 rval = Tss2_Sys_GetDecryptParam( sysContext,
5589 &decryptParamSize,
5590 (const uint8_t **)&decryptParamBuffer );
5591 CheckPassed( rval );
5592
5593 if( i == 0 )
5594 {
5595 // 1st pass: test case of Prepare inputting a NULL decrypt
5596 // param; decryptParamSize should be 0.
5597 if( decryptParamSize != 0 )
5598 {
5599 TpmClientPrintf( 0, "ERROR!! decryptParamSize != 0\n" );
5600 Cleanup();
5601 }
5602 }
5603
5604 // Roll nonces for command.
5605 RollNonces( encryptDecryptSession,
5606 &decryptEncryptSessionCmdAuth.nonce );
5607
5608 // Encrypt write data.
5609 rval = EncryptCommandParam( encryptDecryptSession,
5610 (TPM2B_MAX_BUFFER *)&encryptedWriteData,
5611 (TPM2B_MAX_BUFFER *)&writeData, &nvAuth );
5612 CheckPassed( rval );
5613
5614 // Now set decrypt parameter.
5615 rval = Tss2_Sys_SetDecryptParam( sysContext,
5616 (uint8_t )encryptedWriteData.t.size,
5617 (uint8_t *)&encryptedWriteData.t.buffer[0] );
5618 CheckPassed( rval );
5619
5620 // Now write the data to the NV index.
5621 rval = Tss2_Sys_ExecuteAsync( sysContext );
5622 CheckPassed( rval );
5623
5624 rval = Tss2_Sys_ExecuteFinish( sysContext, TSS2_TCTI_TIMEOUT_BLOCK );
5625 CheckPassed( rval );
5626
5627 rval = Tss2_Sys_GetRspAuths( sysContext, &nvRdWrRspAuths );
5628 CheckPassed( rval );
5629
5630 // Roll the nonces for response
5631 RollNonces( encryptDecryptSession,
5632 &nvRdWrRspAuths.rspAuths[1]->nonce );
5633
5634
5635 // Don't need nonces for anything else, so roll
5636 // the nonces for next command.
5637 RollNonces( encryptDecryptSession,
5638 &decryptEncryptSessionCmdAuth.nonce );
5639
5640 // Now read the data without encrypt set.
5641 nvRdWrCmdAuths.cmdAuthsCount = 1;
5642 nvRdWrRspAuths.rspAuthsCount = 1;
5643 rval = Tss2_Sys_NV_Read( sysContext, TPM20_INDEX_TEST1,
5644 TPM20_INDEX_TEST1, &nvRdWrCmdAuths,
5645 sizeof( writeDataString ), 0, &readData,
5646 &nvRdWrRspAuths );
5647 CheckPassed( rval );
5648 nvRdWrCmdAuths.cmdAuthsCount = 2;
5649 nvRdWrRspAuths.rspAuthsCount = 2;
5650
5651 // Roll the nonces for response
5652 RollNonces( encryptDecryptSession,
5653 &nvRdWrRspAuths.rspAuths[1]->nonce );
5654
5655 // Check that write and read data are equal. This
5656 // verifies that the decrypt session was setup correctly.
5657 // If it wasn't, the data stored in the TPM would still
5658 // be encrypted, and this test would fail.
5659 if( memcmp( (void *)&readData.t.buffer[0],
5660 (void *)&writeData.t.buffer[0], readData.t.size ) )
5661 {
5662 TpmClientPrintf( 0, "ERROR!! read data not equal to written data\n" );
5663 Cleanup();
5664 }
5665
5666 //
5667 // Read TPM index with encrypt session; use
5668 // syncronous APIs to do this.
5669 //
5670
5671 rval = Tss2_Sys_NV_Read_Prepare( sysContext, TPM20_INDEX_TEST1,
5672 TPM20_INDEX_TEST1, sizeof( writeDataString ), 0 );
5673 CheckPassed( rval );
5674
5675 // Roll the nonces for next command.
5676 RollNonces( encryptDecryptSession,
5677 &decryptEncryptSessionCmdAuth.nonce );
5678
5679 decryptEncryptSessionCmdAuth.sessionAttributes.decrypt = 0;
5680 decryptEncryptSessionCmdAuth.sessionAttributes.encrypt = 1;
5681 decryptEncryptSessionCmdAuth.sessionAttributes.continueSession =
5682 1;
5683
5684 rval = Tss2_Sys_SetCmdAuths( sysContext, &nvRdWrCmdAuths );
5685 CheckPassed( rval );
5686
5687 //
5688 // Now Read the data.
5689 //
5690 rval = Tss2_Sys_Execute( sysContext );
5691 CheckPassed( rval );
5692
5693 rval = Tss2_Sys_GetEncryptParam( sysContext, &encryptParamSize,
5694 (const uint8_t **)&encryptParamBuffer );
5695 CheckPassed( rval );
5696
5697 rval = Tss2_Sys_GetRspAuths( sysContext, &nvRdWrRspAuths );
5698 CheckPassed( rval );
5699
5700 // Roll the nonces for response
5701 RollNonces( encryptDecryptSession,
5702 &nvRdWrRspAuths.rspAuths[1]->nonce );
5703
5704 // Decrypt read data.
5705 encryptedReadData.t.size = encryptParamSize;
5706 memcpy( (void *)&encryptedReadData.t.buffer[0],
5707 (void *)encryptParamBuffer, encryptParamSize );
5708 rval = DecryptResponseParam( encryptDecryptSession,
5709 (TPM2B_MAX_BUFFER *)&decryptedReadData,
5710 (TPM2B_MAX_BUFFER *)&encryptedReadData, &nvAuth );
5711 CheckPassed( rval );
5712
5713 // Roll the nonces.
5714 RollNonces( encryptDecryptSession,
5715 &nvRdWrRspAuths.rspAuths[1]->nonce );
5716
5717 rval = Tss2_Sys_SetEncryptParam( sysContext,
5718 (uint8_t)decryptedReadData.t.size,
5719 (uint8_t *)&decryptedReadData.t.buffer[0] );
5720 CheckPassed( rval );
5721
5722 // Get the command results, in this case the read data.
5723 rval = Tss2_Sys_NV_Read_Complete( sysContext, &readData );
5724 CheckPassed( rval );
5725
5726 TpmClientPrintf( 0, "Decrypted read data = " );
5727 DEBUG_PRINT_BUFFER( &readData.t.buffer[0], (UINT32 )readData.t.size );
5728
5729 // Check that write and read data are equal.
5730 if( memcmp( (void *)&readData.t.buffer[0],
5731 (void *)&writeData.t.buffer[0], readData.t.size ) )
5732 {
5733 TpmClientPrintf( 0, "ERROR!! read data not equal to written data\n" );
5734 Cleanup();
5735 }
5736
5737 rval = Tss2_Sys_FlushContext( sysContext,
5738 encryptDecryptSession->sessionHandle );
5739 CheckPassed( rval );
5740
5741 rval = EndAuthSession( encryptDecryptSession );
5742 CheckPassed( rval );
5743 }
5744
5745 // Set authorization for NV undefine command.
5746 nvUndefineAuth.sessionHandle = TPM_RS_PW;
5747 nvUndefineAuth.nonce.t.size = 0;
5748 *( (UINT8 *)((void *)&nvUndefineAuth.sessionAttributes ) ) = 0;
5749 nvUndefineAuth.hmac.t.size = 0;
5750
5751 // Undefine NV index.
5752 rval = Tss2_Sys_NV_UndefineSpace( sysContext,
5753 TPM_RH_PLATFORM, TPM20_INDEX_TEST1, &nvUndefineAuths, 0 );
5754 CheckPassed( rval );
5755}
5756
5757
5758void TestRsaEncryptDecrypt()
5759{
5760 TPM2B_SENSITIVE_CREATE inSensitive;
5761 TPM2B_PUBLIC inPublic;
5762 TPMS_AUTH_COMMAND sessionData;
5763 TPMS_AUTH_RESPONSE sessionDataOut;
5764 TPM2B_DATA outsideInfo;
5765 TPML_PCR_SELECTION creationPCR;
5766 TPM_RC rval;
5767 TPM2B_PRIVATE outPrivate;
5768 TPM2B_PUBLIC outPublic;
5769 TPM2B_CREATION_DATA creationData;
5770 TPM2B_DIGEST creationHash;
5771 TPMT_TK_CREATION creationTicket;
5772 TPM2B_NAME rsaKeyName;
5773
5774 TPMS_AUTH_COMMAND *sessionDataArray[1] = { &sessionData };
5775 TPMS_AUTH_RESPONSE *sessionDataOutArray[1] = { &sessionDataOut };
5776
5777 TSS2_SYS_CMD_AUTHS sessionsData = { 1, &sessionDataArray[0] };
5778 TSS2_SYS_RSP_AUTHS sessionsDataOut = { 1, &sessionDataOutArray[0] };
5779
5780 inSensitive.t.sensitive.userAuth = loadedSha1KeyAuth;
5781 inSensitive.t.sensitive.data.t.size = 0;
5782
5783 // Init nonce.
5784 sessionData.nonce.t.size = 0;
5785
5786 // init hmac
5787 sessionData.hmac.t.size = 0;
5788
5789 // Init session attributes
5790 *( (UINT8 *)((void *)&sessionData.sessionAttributes ) ) = 0;
5791
5792 // Create public/private key pair.
5793 inPublic.t.publicArea.type = TPM_ALG_RSA;
5794 inPublic.t.publicArea.nameAlg = TPM_ALG_SHA1;
5795 *(UINT32 *)( (void *)&( inPublic.t.publicArea.objectAttributes ) ) = 0;
5796 inPublic.t.publicArea.objectAttributes.decrypt = 1;
5797 inPublic.t.publicArea.authPolicy.t.size = 0;
5798
5799 inPublic.t.publicArea.parameters.rsaDetail.symmetric.algorithm = TPM_ALG_AES;
5800 inPublic.t.publicArea.parameters.rsaDetail.symmetric.keyBits.aes = 128;
5801 inPublic.t.publicArea.parameters.rsaDetail.symmetric.mode.aes = TPM_ALG_CTR;
5802 inPublic.t.publicArea.parameters.rsaDetail.scheme.scheme = TPM_ALG_NULL;
5803 inPublic.t.publicArea.parameters.rsaDetail.keyBits = 1024;
5804 inPublic.t.publicArea.parameters.rsaDetail.exponent = 0;
5805 inPublic.t.publicArea.unique.rsa.t.size = 0;
5806
5807 outsideInfo.t.size = 0;
5808 outPublic.t.size = 0;
5809 creationData.t.size = 0;
5810 rval = Tss2_Sys_Create( sysContext, handle2048rsa, &sessionsData, &inSensitive, &inPublic,
5811 &outsideInfo, &creationPCR,
5812 &outPrivate, &outPublic, &creationData,
5813 &creationHash, &creationTicket, &sessionsDataOut );
5814
5815 CheckPassed( rval );
5816
5817 // Load private key into TPM
5818 rval = Tss2_Sys_Load ( sysContext, handle2048rsa, 0, &outPrivate, &outPublic,
5819 &loadedSha1KeyHandle, &rsaKeyName, &sessionsDataOut);
5820 CheckPassed( rval );
5821
5822
5823
5824 // Encrypt message with public key
5825
5826 // Print encrypted message.
5827
5828 // Decrypt message with private key.
5829
5830 // Print decrypted message.
5831
5832}
5833
5834
5835void GetSetDecryptParamTests()
5836{
5837 TPM2B_MAX_NV_BUFFER nvWriteData = { { 4, { 0xde, 0xad, 0xbe, 0xef, } } };
5838 TPM2B_MAX_NV_BUFFER nvWriteData1 = { { 4, { 0x01, 0x01, 0x02, 0x03, } } };
5839 const uint8_t *decryptParamBuffer;
5840 size_t decryptParamSize;
5841 size_t cpBufferUsedSize1, cpBufferUsedSize2;
5842 const uint8_t *cpBuffer1, *cpBuffer2;
5843 TSS2_RC rval;
5844 int i;
5845 TSS2_SYS_CONTEXT *decryptParamTestSysContext;
5846
5847 TpmClientPrintf( 0, "\nGET/SET DECRYPT PARAM TESTS:\n" );
5848
5849 // Create two sysContext structures.
5850 decryptParamTestSysContext = InitSysContext( MAX_NV_BUFFER_SIZE, resMgrTctiContext, &abiVersion );
5851 if( decryptParamTestSysContext == 0 )
5852 {
5853 InitSysContextFailure();
5854 }
5855
wcarthurea1d3452015-11-11 09:39:35 -05005856 // Test for bad sequence: Tss2_Sys_GetDecryptParam
Will Arthur54e04e42015-07-15 11:29:25 -04005857 rval = Tss2_Sys_GetDecryptParam( decryptParamTestSysContext, &decryptParamSize, &decryptParamBuffer );
5858 CheckFailed( rval, TSS2_SYS_RC_BAD_SEQUENCE );
wcarthurea1d3452015-11-11 09:39:35 -05005859
5860 // Test for bad sequence: Tss2_Sys_SetDecryptParam
Will Arthur54e04e42015-07-15 11:29:25 -04005861 rval = Tss2_Sys_SetDecryptParam( decryptParamTestSysContext, 4, &( nvWriteData.t.buffer[0] ) );
5862 CheckFailed( rval, TSS2_SYS_RC_BAD_SEQUENCE );
5863
wcarthurea1d3452015-11-11 09:39:35 -05005864 // NOTE: Two tests for BAD_SEQUENCE for GetDecryptParam and SetDecryptParam after ExecuteAsync
5865 // are in the GetSetEncryptParamTests function, just because it's easier to do this way.
5866
Will Arthur54e04e42015-07-15 11:29:25 -04005867 // Do Prepare.
5868 rval = Tss2_Sys_NV_Write_Prepare( decryptParamTestSysContext, TPM20_INDEX_PASSWORD_TEST,
5869 TPM20_INDEX_PASSWORD_TEST, &nvWriteData1, 0x55aa );
5870 CheckPassed( rval );
5871
wcarthurea1d3452015-11-11 09:39:35 -05005872 // Test for bad reference: Tss2_Sys_GetDecryptParam
Will Arthur54e04e42015-07-15 11:29:25 -04005873 rval = Tss2_Sys_GetDecryptParam( 0, &decryptParamSize, &decryptParamBuffer );
5874 CheckFailed( rval, TSS2_SYS_RC_BAD_REFERENCE );
5875
5876 rval = Tss2_Sys_GetDecryptParam( decryptParamTestSysContext, 0, &decryptParamBuffer );
5877 CheckFailed( rval, TSS2_SYS_RC_BAD_REFERENCE );
5878
5879 rval = Tss2_Sys_GetDecryptParam( decryptParamTestSysContext, &decryptParamSize, 0 );
5880 CheckFailed( rval, TSS2_SYS_RC_BAD_REFERENCE );
wcarthurea1d3452015-11-11 09:39:35 -05005881
Will Arthur54e04e42015-07-15 11:29:25 -04005882
wcarthurea1d3452015-11-11 09:39:35 -05005883 // Test for bad reference: Tss2_Sys_SetDecryptParam
Will Arthur54e04e42015-07-15 11:29:25 -04005884 rval = Tss2_Sys_SetDecryptParam( decryptParamTestSysContext, 4, 0 );
5885 CheckFailed( rval, TSS2_SYS_RC_BAD_REFERENCE );
5886
5887 rval = Tss2_Sys_SetDecryptParam( 0, 4, 0 );
5888 CheckFailed( rval, TSS2_SYS_RC_BAD_REFERENCE );
wcarthurea1d3452015-11-11 09:39:35 -05005889
Will Arthur54e04e42015-07-15 11:29:25 -04005890
5891 // Test for bad size.
5892 rval = Tss2_Sys_SetDecryptParam( decryptParamTestSysContext, 5, &( nvWriteData.t.buffer[0] ) );
5893 CheckFailed( rval, TSS2_SYS_RC_BAD_SIZE );
5894
5895 rval = Tss2_Sys_SetDecryptParam( decryptParamTestSysContext, 3, &( nvWriteData.t.buffer[0] ) );
5896 CheckFailed( rval, TSS2_SYS_RC_BAD_SIZE );
5897
5898 // Test for good size.
5899 rval = Tss2_Sys_SetDecryptParam( decryptParamTestSysContext, 4, &( nvWriteData.t.buffer[0] ) );
5900 CheckPassed( rval );
5901
5902 // Make sure that the set operation really did the right thing.
5903 rval = Tss2_Sys_GetDecryptParam( decryptParamTestSysContext, &decryptParamSize, &decryptParamBuffer );
5904 CheckPassed( rval );
5905 for( i = 0; i < 4; i++ )
5906 {
5907 if( decryptParamBuffer[i] != nvWriteData.t.buffer[i] )
5908 {
5909 TpmClientPrintf( 0, "ERROR!! decryptParamBuffer[%d] s/b: %2.2x, was: %2.2x\n", i, nvWriteData.t.buffer[i], decryptParamBuffer[i] );
5910 Cleanup();
5911 }
5912 }
5913
5914 rval = Tss2_Sys_GetCpBuffer( decryptParamTestSysContext, &cpBufferUsedSize1, &cpBuffer1 );
5915 CheckPassed( rval );
5916
5917 OpenOutFile( &outFp );
5918#ifdef DEBUG
5919 TpmClientPrintf( 0, "cpBuffer = ");
5920#endif
5921 DEBUG_PRINT_BUFFER( (UINT8 *)cpBuffer1, cpBufferUsedSize1 );
5922 CloseOutFile( &outFp );
5923
5924 // Test for no decrypt param.
5925 rval = Tss2_Sys_NV_Read_Prepare( decryptParamTestSysContext, TPM20_INDEX_PASSWORD_TEST, TPM20_INDEX_PASSWORD_TEST, sizeof( nvWriteData ) - 2, 0 );
5926 CheckPassed( rval );
5927
5928 rval = Tss2_Sys_GetDecryptParam( decryptParamTestSysContext, &decryptParamSize, &decryptParamBuffer );
5929 CheckFailed( rval, TSS2_SYS_RC_NO_DECRYPT_PARAM );
5930
5931 rval = Tss2_Sys_SetDecryptParam( decryptParamTestSysContext, 4, &( nvWriteData.t.buffer[0] ) );
5932 CheckFailed( rval, TSS2_SYS_RC_NO_DECRYPT_PARAM );
5933
5934 // Null decrypt param.
5935 rval = Tss2_Sys_NV_Write_Prepare( decryptParamTestSysContext, TPM20_INDEX_PASSWORD_TEST,
5936 TPM20_INDEX_PASSWORD_TEST, 0, 0x55aa );
5937 CheckPassed( rval );
5938
5939 rval = Tss2_Sys_GetDecryptParam( decryptParamTestSysContext, &decryptParamSize, &decryptParamBuffer );
5940 CheckPassed( rval );
5941
5942 // Check that size == 0.
5943 if( decryptParamSize != 0 )
5944 {
5945 TpmClientPrintf( 0, "ERROR!! decryptParamSize s/b: 0, was: %u\n", (unsigned int)decryptParamSize );
5946 Cleanup();
5947 }
5948
5949 // Test for insufficient size.
5950 rval = Tss2_Sys_GetCpBuffer( decryptParamTestSysContext, &cpBufferUsedSize2, &cpBuffer2 );
5951 CheckPassed( rval );
5952 nvWriteData.t.size = MAX_NV_BUFFER_SIZE -
5953 CHANGE_ENDIAN_DWORD( ( (TPM20_Header_In *)( ( (_TSS2_SYS_CONTEXT_BLOB *)decryptParamTestSysContext )->tpmInBuffPtr ) )->commandSize ) +
5954 1;
5955 rval = Tss2_Sys_SetDecryptParam( decryptParamTestSysContext, nvWriteData.t.size, &( nvWriteData.t.buffer[0] ) );
wcarthurbad17552015-12-01 10:13:04 -05005956 CheckFailed( rval, TSS2_SYS_RC_INSUFFICIENT_CONTEXT );
Will Arthur54e04e42015-07-15 11:29:25 -04005957
5958 // Test that one less will work. This tests that we're checking the correct corner case.
5959 nvWriteData.t.size -= 1;
5960 rval = Tss2_Sys_SetDecryptParam( decryptParamTestSysContext, nvWriteData.t.size, &( nvWriteData.t.buffer[0] ) );
5961 CheckPassed( rval );
5962
5963
5964 rval = Tss2_Sys_NV_Write_Prepare( decryptParamTestSysContext, TPM20_INDEX_PASSWORD_TEST,
5965 TPM20_INDEX_PASSWORD_TEST, 0, 0x55aa );
5966 CheckPassed( rval );
5967
5968 rval = Tss2_Sys_GetDecryptParam( decryptParamTestSysContext, &decryptParamSize, &decryptParamBuffer );
5969 CheckPassed( rval );
5970
5971 rval = Tss2_Sys_SetDecryptParam( decryptParamTestSysContext, 4, &( nvWriteData.t.buffer[0] ) );
5972 CheckPassed( rval );
5973
5974 rval = Tss2_Sys_GetCpBuffer( decryptParamTestSysContext, &cpBufferUsedSize2, &cpBuffer2 );
5975 CheckPassed( rval );
5976
5977 OpenOutFile( &outFp );
5978#ifdef DEBUG
5979 TpmClientPrintf( 0, "cpBuffer = ");
5980#endif
5981 DEBUG_PRINT_BUFFER( (UINT8 *)cpBuffer2, cpBufferUsedSize2 );
5982 CloseOutFile( &outFp );
5983
5984 if( cpBufferUsedSize1 != cpBufferUsedSize2 )
5985 {
5986 TpmClientPrintf( 0, "ERROR!! cpBufferUsedSize1(%x) != cpBufferUsedSize2(%x)\n", (UINT32)cpBufferUsedSize1, (UINT32)cpBufferUsedSize2 );
5987 Cleanup();
5988 }
5989 for( i = 0; i < (int)cpBufferUsedSize1; i++ )
5990 {
5991 if( cpBuffer1[i] != cpBuffer2[i] )
5992 {
5993 TpmClientPrintf( 0, "ERROR!! cpBufferUsedSize1[%d] s/b: %2.2x, was: %2.2x\n", i, cpBuffer1[i], cpBuffer2[i] );
5994 Cleanup();
5995 }
5996 }
5997
5998 // Test case of zero sized decrypt param, another case of bad size.
5999 nvWriteData1.t.size = 0;
6000 rval = Tss2_Sys_NV_Write_Prepare( decryptParamTestSysContext, TPM20_INDEX_PASSWORD_TEST,
6001 TPM20_INDEX_PASSWORD_TEST, &nvWriteData1, 0x55aa );
6002 CheckPassed( rval );
6003
6004 rval = Tss2_Sys_SetDecryptParam( decryptParamTestSysContext, 1, &( nvWriteData.t.buffer[0] ) );
6005 CheckFailed( rval, TSS2_SYS_RC_BAD_SIZE );
6006
6007 TeardownSysContext( &decryptParamTestSysContext );
6008}
6009
wcarthurd1fe2872015-11-03 07:44:57 -05006010void SysInitializeTests()
6011{
6012 TSS2_RC rval = TSS2_RC_SUCCESS;
6013
6014 // NOTE: this should never be done in real applications.
6015 // It is only done here for test purposes.
6016 TSS2_TCTI_CONTEXT_INTEL tctiContextIntel;
6017
wcarthur12eb0502015-11-06 12:01:24 -05006018 TpmClientPrintf( 0, "\nSYS INITIALIZE TESTS:\n" );
wcarthurd1fe2872015-11-03 07:44:57 -05006019
6020 rval = Tss2_Sys_Initialize( (TSS2_SYS_CONTEXT *)0, 10, (TSS2_TCTI_CONTEXT *)1, (TSS2_ABI_VERSION *)1 );
6021 CheckFailed( rval, TSS2_SYS_RC_BAD_REFERENCE );
6022
6023 rval = Tss2_Sys_Initialize( (TSS2_SYS_CONTEXT *)1, 10, (TSS2_TCTI_CONTEXT *)0, (TSS2_ABI_VERSION *)1 );
6024 CheckFailed( rval, TSS2_SYS_RC_BAD_REFERENCE );
6025
6026 rval = Tss2_Sys_Initialize( (TSS2_SYS_CONTEXT *)1, 10, (TSS2_TCTI_CONTEXT *)1, (TSS2_ABI_VERSION *)0 );
6027 CheckFailed( rval, TSS2_SYS_RC_BAD_REFERENCE );
6028
6029 rval = Tss2_Sys_Initialize( (TSS2_SYS_CONTEXT *)1, 10, (TSS2_TCTI_CONTEXT *)1, (TSS2_ABI_VERSION *)1 );
6030 CheckFailed( rval, TSS2_SYS_RC_INSUFFICIENT_CONTEXT );
6031
6032 // NOTE: don't do this in real applications.
6033 tctiContextIntel.transmit = (TCTI_TRANSMIT_PTR)0;
6034 tctiContextIntel.receive = (TCTI_RECEIVE_PTR)1;
6035
6036 rval = Tss2_Sys_Initialize( (TSS2_SYS_CONTEXT *)1, sizeof( _TSS2_SYS_CONTEXT_BLOB ), (TSS2_TCTI_CONTEXT *)&tctiContextIntel, (TSS2_ABI_VERSION *)1 );
6037 CheckFailed( rval, TSS2_SYS_RC_BAD_TCTI_STRUCTURE );
6038
6039 // NOTE: don't do this in real applications.
6040 tctiContextIntel.transmit = (TCTI_TRANSMIT_PTR)1;
6041 tctiContextIntel.receive = (TCTI_RECEIVE_PTR)0;
6042
6043 rval = Tss2_Sys_Initialize( (TSS2_SYS_CONTEXT *)1, sizeof( _TSS2_SYS_CONTEXT_BLOB ), (TSS2_TCTI_CONTEXT *)&tctiContextIntel, (TSS2_ABI_VERSION *)1 );
6044 CheckFailed( rval, TSS2_SYS_RC_BAD_TCTI_STRUCTURE );
6045}
wcarthur12eb0502015-11-06 12:01:24 -05006046
wcarthur4d547ee2015-11-09 12:55:00 -05006047void SysFinalizeTests()
6048{
6049 TSS2_RC rval = TSS2_RC_SUCCESS;
6050
6051 TpmClientPrintf( 0, "\nSYS FINALIZE TESTS:\n" );
6052
6053 rval = Tss2_Sys_Finalize( 0 );
6054 CheckFailed( rval, TSS2_SYS_RC_BAD_REFERENCE );
6055
6056 // Note: other cases tested by other tests.
6057}
6058
6059void GetContextSizeTests()
6060{
6061 TSS2_RC rval = TSS2_RC_SUCCESS;
6062 TSS2_SYS_CONTEXT *testSysContext;
6063
6064 TpmClientPrintf( 0, "\nSYS GETCONTEXTSIZE TESTS:\n" );
6065
6066 testSysContext = InitSysContext( 9, resMgrTctiContext, &abiVersion );
6067 if( testSysContext == 0 )
6068 {
6069 InitSysContextFailure();
6070 }
6071
6072 rval = Tss2_Sys_Startup( testSysContext, TPM_SU_CLEAR );
wcarthurbad17552015-12-01 10:13:04 -05006073 CheckFailed( rval, TSS2_SYS_RC_INSUFFICIENT_CONTEXT );
wcarthur4d547ee2015-11-09 12:55:00 -05006074
wcarthurd71ab7d2015-11-10 16:11:02 -05006075 rval = Tss2_Sys_GetTestResult_Prepare( testSysContext );
6076 CheckPassed( rval );
wcarthur4d547ee2015-11-09 12:55:00 -05006077
6078 // Note: other cases tested by other tests.
wcarthurd71ab7d2015-11-10 16:11:02 -05006079
6080 TeardownSysContext( &testSysContext );
6081}
6082
6083void GetTctiContextTests()
6084{
6085 TSS2_RC rval = TSS2_RC_SUCCESS;
6086 TSS2_SYS_CONTEXT *testSysContext;
6087 TSS2_TCTI_CONTEXT *tctiContext;
6088
6089 TpmClientPrintf( 0, "\nSYS GETTCTICONTEXT TESTS:\n" );
6090
6091 testSysContext = InitSysContext( 9, resMgrTctiContext, &abiVersion );
6092 if( testSysContext == 0 )
6093 {
6094 InitSysContextFailure();
6095 }
6096
6097 rval = Tss2_Sys_GetTctiContext( testSysContext, 0 );
6098 CheckFailed( rval, TSS2_SYS_RC_BAD_REFERENCE );
6099
6100 rval = Tss2_Sys_GetTctiContext( 0, &tctiContext );
6101 CheckFailed( rval, TSS2_SYS_RC_BAD_REFERENCE );
6102
6103 TeardownSysContext( &testSysContext );
6104}
6105
6106void PrepareTests()
6107{
6108 TSS2_RC rval = TSS2_RC_SUCCESS;
6109 TSS2_SYS_CONTEXT *testSysContext;
wcarthur5da9e092015-11-23 17:22:44 -05006110
wcarthurd71ab7d2015-11-10 16:11:02 -05006111 TpmClientPrintf( 0, "\nSYS PREPARE TESTS:\n" );
6112
6113 testSysContext = InitSysContext( 0, resMgrTctiContext, &abiVersion );
6114 if( testSysContext == 0 )
6115 {
6116 InitSysContextFailure();
6117 }
6118
6119 // Test for bad reference.
6120 rval = Tss2_Sys_GetTestResult_Prepare( 0 );
6121 CheckFailed( rval, TSS2_SYS_RC_BAD_REFERENCE );
6122
6123 // Test for bad sequence: after ExecuteAsync
6124 rval = Tss2_Sys_GetTestResult_Prepare( testSysContext );
6125 CheckPassed( rval );
6126
6127 rval = Tss2_Sys_ExecuteAsync( testSysContext );
6128 CheckPassed( rval );
6129
6130 rval = Tss2_Sys_GetTestResult_Prepare( testSysContext );
6131 CheckFailed( rval, TSS2_SYS_RC_BAD_SEQUENCE );
6132
6133 rval = Tss2_Sys_ExecuteFinish( testSysContext, -1 );
6134 CheckPassed( rval );
6135
6136 // Test for bad sequence: after Execute
6137 rval = Tss2_Sys_GetTestResult_Prepare( testSysContext );
6138 CheckPassed( rval );
6139
6140 rval = Tss2_Sys_Execute( testSysContext );
6141 CheckPassed( rval );
6142
6143 rval = Tss2_Sys_GetTestResult_Prepare( testSysContext );
6144 CheckPassed( rval );
6145
wcarthur5da9e092015-11-23 17:22:44 -05006146 rval = Tss2_Sys_GetTestResult_Prepare( testSysContext );
6147 CheckPassed( rval );
6148
6149 // Test for other NULL params
6150 rval = Tss2_Sys_Create_Prepare( testSysContext, 0xffffffff, 0, 0, 0, 0 );
6151 CheckFailed( rval, TSS2_SYS_RC_BAD_REFERENCE );
6152
wcarthurd71ab7d2015-11-10 16:11:02 -05006153 TeardownSysContext( &testSysContext );
wcarthur4d547ee2015-11-09 12:55:00 -05006154}
6155
wcarthur12eb0502015-11-06 12:01:24 -05006156void RmZeroSizedResponseTest()
6157{
6158 SESSION *encryptSession;
6159 TPM2B_NONCE nonceCaller;
6160 TPMT_SYM_DEF symmetric;
6161 TSS2_RC rval = TSS2_RC_SUCCESS;
6162
6163 //
6164 // Tests what happens in RM when receive comes back with 0 sized response.
6165 // This happens when a command is sent to the simulator but the simulator
6166 // isn't "powered on".
6167 // Added this test because this took me a while to understand, and I
6168 // never want to have to debug this again.
6169 //
wcarthurd1fe2872015-11-03 07:44:57 -05006170
wcarthur12eb0502015-11-06 12:01:24 -05006171 TpmClientPrintf( 0, "\nRM ZERO SIZED RESPONSE TEST:\n" );
6172
6173 rval = PlatformCommand( resMgrTctiContext, MS_SIM_POWER_OFF );
6174
6175 nonceCaller.t.size = 1;
6176 nonceCaller.t.buffer[0] = 0xa5;
6177
6178 // AES encryption/decryption and CFB mode.
6179 symmetric.algorithm = TPM_ALG_AES;
6180 symmetric.keyBits.aes = 128;
6181 symmetric.mode.aes = TPM_ALG_CFB;
6182
6183 // Start policy session for encrypt session.
6184 rval = StartAuthSessionWithParams( &encryptSession,
6185 TPM_RH_NULL, 0, TPM_RH_NULL, 0, &nonceCaller, 0, TPM_SE_HMAC,
6186 &symmetric, TPM_ALG_SHA256 );
6187 CheckFailed( rval, TSS2_TCTI_RC_IO_ERROR );
6188}
6189
6190
wcarthurf60ec992015-11-09 10:17:11 -05006191void CmdRspAuthsTests()
wcarthur12eb0502015-11-06 12:01:24 -05006192{
wcarthurf60ec992015-11-09 10:17:11 -05006193 SESSION *encryptSession, *decryptSession, *auditSession;
6194 TPM2B_NONCE nonceCaller, nonceTpm;
wcarthur12eb0502015-11-06 12:01:24 -05006195 TPMT_SYM_DEF symmetric;
6196 TSS2_RC rval = TSS2_RC_SUCCESS;
6197 int i;
6198 TPM2B_ENCRYPTED_SECRET encryptedSalt;
wcarthurf60ec992015-11-09 10:17:11 -05006199 UINT32 savedMaxCommandSize, savedResponseSize;
6200
6201 TSS2_SYS_CONTEXT *otherSysContext;
6202 TPM_HANDLE testSessionHandle;
wcarthur12eb0502015-11-06 12:01:24 -05006203
6204 TPMS_AUTH_COMMAND encryptCmdAuth, decryptCmdAuth, auditCmdAuth;
6205 TPMS_AUTH_COMMAND *cmdAuthArray[3] = { &encryptCmdAuth, &decryptCmdAuth, &auditCmdAuth };
6206 TSS2_SYS_CMD_AUTHS cmdAuths = { 3, &cmdAuthArray[0] };
wcarthurf60ec992015-11-09 10:17:11 -05006207
6208 TPMS_AUTH_RESPONSE encryptRspAuth, decryptRspAuth, auditRspAuth;
6209 TPMS_AUTH_RESPONSE *rspAuthArray[3] =
6210 { &encryptRspAuth, &decryptRspAuth, &auditRspAuth };
6211 TSS2_SYS_RSP_AUTHS rspAuths = { 3, &rspAuthArray[0] };
wcarthur12eb0502015-11-06 12:01:24 -05006212
6213 TpmClientPrintf( 0, "\nSETCMDAUTHS TESTS:\n" );
6214
6215 nonceCaller.t.size = SHA256_DIGEST_SIZE;
6216
6217 for( i = 0; i < nonceCaller.t.size; i++ )
6218 {
6219 nonceCaller.t.buffer[i] = 0xa5;
6220 }
6221
6222 // AES encryption/decryption and CFB mode.
6223 symmetric.algorithm = TPM_ALG_AES;
6224 symmetric.keyBits.aes = 128;
6225 symmetric.mode.aes = TPM_ALG_CFB;
6226
wcarthurf60ec992015-11-09 10:17:11 -05006227 // Start encrypt session.
wcarthur12eb0502015-11-06 12:01:24 -05006228 rval = StartAuthSessionWithParams( &encryptSession,
6229 TPM_RH_NULL, 0, TPM_RH_NULL, 0, &nonceCaller, 0, TPM_SE_HMAC,
6230 &symmetric, TPM_ALG_SHA256 );
6231 CheckPassed( rval ); // #1
6232
wcarthurf60ec992015-11-09 10:17:11 -05006233 // Start decrypt session.
wcarthur12eb0502015-11-06 12:01:24 -05006234 rval = StartAuthSessionWithParams( &decryptSession,
6235 TPM_RH_NULL, 0, TPM_RH_NULL, 0, &nonceCaller, 0, TPM_SE_HMAC,
6236 &symmetric, TPM_ALG_SHA256 );
6237 CheckPassed( rval ); // #2
6238
wcarthurf60ec992015-11-09 10:17:11 -05006239 // Start audit session.
wcarthur12eb0502015-11-06 12:01:24 -05006240 rval = StartAuthSessionWithParams( &auditSession,
6241 TPM_RH_NULL, 0, TPM_RH_NULL, 0, &nonceCaller, 0, TPM_SE_HMAC,
6242 &symmetric, TPM_ALG_SHA256 );
6243 CheckPassed( rval ); // #3
6244
6245 encryptCmdAuth.sessionHandle = encryptSession->sessionHandle;
6246 encryptCmdAuth.nonce.t.size = 0;
6247 *( (UINT8 *)((void *)&encryptCmdAuth.sessionAttributes ) ) = 0;
6248 encryptCmdAuth.sessionAttributes.encrypt = 1;
6249 encryptCmdAuth.hmac.t.size = 0;
6250
6251 decryptCmdAuth.sessionHandle = decryptSession->sessionHandle;
6252 decryptCmdAuth.nonce.t.size = 0;
6253 *( (UINT8 *)((void *)&decryptCmdAuth.sessionAttributes ) ) = 0;
6254 decryptCmdAuth.sessionAttributes.decrypt = 1;
6255 decryptCmdAuth.hmac.t.size = 0;
6256
6257 auditCmdAuth.sessionHandle = auditSession->sessionHandle;
6258 auditCmdAuth.nonce.t.size = 0;
6259 *( (UINT8 *)((void *)&auditCmdAuth.sessionAttributes ) ) = 0;
6260 auditCmdAuth.sessionAttributes.audit = 1;
6261 auditCmdAuth.hmac.t.size = 0;
6262
6263 // Test for bad sequence.
6264 rval = Tss2_Sys_SetCmdAuths( sysContext, &cmdAuths );
6265 CheckFailed( rval, TSS2_SYS_RC_BAD_SEQUENCE ); // #4
6266
6267 encryptedSalt.t.size = 0;
6268 rval = Tss2_Sys_StartAuthSession_Prepare( sysContext,
6269 TPM_RH_NULL, TPM_RH_NULL, &nonceCaller, &encryptedSalt, TPM_SE_HMAC,
6270 &symmetric, TPM_ALG_SHA256 );
6271 CheckPassed( rval ); // #5
6272
6273 // Test for bad reference.
6274 rval = Tss2_Sys_SetCmdAuths( 0, &cmdAuths );
6275 CheckFailed( rval, TSS2_SYS_RC_BAD_REFERENCE ); // #6
6276
6277 rval = Tss2_Sys_SetCmdAuths( sysContext, 0 );
6278 CheckFailed( rval, TSS2_SYS_RC_BAD_REFERENCE ); // #7
6279
6280 // Test for count == 0; this should pass.
6281 cmdAuths.cmdAuthsCount= 0;
6282 rval = Tss2_Sys_SetCmdAuths( sysContext, &cmdAuths );
6283 CheckPassed( rval ); // #8
6284
6285 // Test for bad value.
6286 cmdAuths.cmdAuthsCount= 3;
6287 cmdAuthArray[0] = 0;
6288 rval = Tss2_Sys_SetCmdAuths( sysContext, &cmdAuths );
6289 CheckFailed( rval, TSS2_SYS_RC_BAD_VALUE ); // #9
6290
6291 cmdAuthArray[0] = &encryptCmdAuth;
6292 cmdAuthArray[1] = 0;
6293 rval = Tss2_Sys_SetCmdAuths( sysContext, &cmdAuths );
6294 CheckFailed( rval, TSS2_SYS_RC_BAD_VALUE ); // #10
6295
6296 cmdAuthArray[1] = &decryptCmdAuth;
6297 cmdAuthArray[2] = 0;
6298 rval = Tss2_Sys_SetCmdAuths( sysContext, &cmdAuths );
6299 CheckFailed( rval, TSS2_SYS_RC_BAD_VALUE ); // #11
6300 cmdAuthArray[2] = &auditCmdAuth;
6301
6302 // Test for insufficient context.
6303 cmdAuths.cmdAuthsCount= 0;
6304 savedMaxCommandSize = ( (_TSS2_SYS_CONTEXT_BLOB *)sysContext )->maxCommandSize;
6305 ( (_TSS2_SYS_CONTEXT_BLOB *)sysContext )->maxCommandSize = sizeof( TPM20_Header_In ) + 3 * sizeof( TPM_HANDLE ) - 1;
6306 rval = Tss2_Sys_SetCmdAuths( sysContext, &cmdAuths );
6307 CheckPassed( rval ); // #12
6308
6309 cmdAuths.cmdAuthsCount= 0;
6310 ( (_TSS2_SYS_CONTEXT_BLOB *)sysContext )->maxCommandSize = sizeof( TPM20_Header_In ) + 3 * sizeof( TPM_HANDLE );
6311 rval = Tss2_Sys_SetCmdAuths( sysContext, &cmdAuths );
6312 CheckPassed( rval );// #13
6313
6314 cmdAuths.cmdAuthsCount= 3;
6315 ( (_TSS2_SYS_CONTEXT_BLOB *)sysContext )->maxCommandSize = sizeof( TPM20_Header_In ) + 3 * sizeof( TPM_HANDLE );
6316 rval = Tss2_Sys_SetCmdAuths( sysContext, &cmdAuths );
wcarthurbad17552015-12-01 10:13:04 -05006317 CheckFailed( rval, TSS2_SYS_RC_INSUFFICIENT_CONTEXT ); // #14
wcarthur12eb0502015-11-06 12:01:24 -05006318
6319 // Do successful one; use this to get size of command.
6320 ( (_TSS2_SYS_CONTEXT_BLOB *)sysContext )->maxCommandSize = savedMaxCommandSize;
6321 rval = Tss2_Sys_SetCmdAuths( sysContext, &cmdAuths );
6322 CheckPassed( rval ); // #15
6323
6324 // Then set maxCommandSize to the the previously gotten commandSize - 1. This should fail.
6325 ( (_TSS2_SYS_CONTEXT_BLOB *)sysContext )->maxCommandSize = GetCommandSize( sysContext ) - 1;
6326 rval = Tss2_Sys_SetCmdAuths( sysContext, &cmdAuths );
wcarthurbad17552015-12-01 10:13:04 -05006327 CheckFailed( rval, TSS2_SYS_RC_INSUFFICIENT_CONTEXT ); // #16
wcarthur12eb0502015-11-06 12:01:24 -05006328
6329 // Reset size of sysContext.
6330 ( (_TSS2_SYS_CONTEXT_BLOB *)sysContext )->maxCommandSize = savedMaxCommandSize;
wcarthur12eb0502015-11-06 12:01:24 -05006331
wcarthurf60ec992015-11-09 10:17:11 -05006332 // Setup for response auths test.
6333 ( (_TSS2_SYS_CONTEXT_BLOB *)sysContext )->maxCommandSize = CHANGE_ENDIAN_DWORD( savedMaxCommandSize );
6334 rval = Tss2_Sys_SetCmdAuths( sysContext, &cmdAuths );
6335 CheckPassed( rval ); // #15
wcarthur12eb0502015-11-06 12:01:24 -05006336
wcarthurf60ec992015-11-09 10:17:11 -05006337 TpmClientPrintf( 0, "\nGETRSPAUTHS TESTS:\n" );
wcarthur12eb0502015-11-06 12:01:24 -05006338
wcarthurf60ec992015-11-09 10:17:11 -05006339 // Test for bad sequence.
6340 rval = Tss2_Sys_GetRspAuths( sysContext, &rspAuths );
6341 CheckFailed( rval, TSS2_SYS_RC_BAD_SEQUENCE ); // #1
6342
6343 otherSysContext = InitSysContext( 0, resMgrTctiContext, &abiVersion );
6344 if( otherSysContext == 0 )
6345 {
6346 InitSysContextFailure();
6347 }
6348
6349 //
6350 // Test for command that failed: invalid handle.
6351 //
6352 rval = Tss2_Sys_StartAuthSession_Prepare( otherSysContext,
6353 0xffffffff, TPM_RH_NULL, &nonceCaller, &encryptedSalt, TPM_SE_HMAC,
6354 &symmetric, TPM_ALG_SHA256 );
6355 CheckPassed( rval ); // #2
6356
6357 rval = Tss2_Sys_Execute( otherSysContext );
6358 CheckFailed( rval, TPM_RC_VALUE | TPM_RC_1 | TPM_RC_H ); // #3
6359
6360 rval = Tss2_Sys_GetRspAuths( otherSysContext, &rspAuths );
6361 CheckFailed( rval, TSS2_SYS_RC_BAD_SEQUENCE ); // #4
6362
6363 //
6364 // Test for command that can never take sessions.
6365 //
6366 rval = Tss2_Sys_ReadClock_Prepare( otherSysContext );
6367 CheckPassed( rval ); // #5
6368
6369 rval = Tss2_Sys_Execute( otherSysContext );
6370 CheckPassed( rval ); // #6
6371
6372 rval = Tss2_Sys_GetRspAuths( otherSysContext, &rspAuths );
6373 CheckFailed( rval, TSS2_SYS_RC_BAD_SEQUENCE ); // #7
6374
6375 // Setup for testing for bad references and other conditions.
6376 rval = Tss2_Sys_StartAuthSession_Prepare( sysContext,
6377 TPM_RH_NULL, TPM_RH_NULL, &nonceCaller, &encryptedSalt, TPM_SE_HMAC,
6378 &symmetric, TPM_ALG_SHA256 );
6379 CheckPassed( rval ); // #8
6380
6381 cmdAuths.cmdAuthsCount = 2;
6382 rval = Tss2_Sys_SetCmdAuths( sysContext, &cmdAuths );
6383 CheckPassed( rval ); // #9
6384
6385 rval = Tss2_Sys_Execute( sysContext );
6386 CheckPassed( rval ); // #10
6387
6388 // Test for bad reference.
6389 rval = Tss2_Sys_GetRspAuths( 0, &rspAuths );
6390 CheckFailed( rval, TSS2_SYS_RC_BAD_REFERENCE ); // #11
6391
6392 rval = Tss2_Sys_GetRspAuths( sysContext, 0 );
6393 CheckFailed( rval, TSS2_SYS_RC_BAD_REFERENCE ); // #12
6394
6395 // Test for bad count.
6396 rspAuths.rspAuthsCount = 0;
6397 rval = Tss2_Sys_GetRspAuths( sysContext, &rspAuths );
6398 CheckFailed( rval, TSS2_SYS_RC_BAD_VALUE ); // #13
6399
6400 // Test for non-matching count: specified count doesn't
6401 // match returned count.
6402 rspAuths.rspAuthsCount = 1;
6403 rval = Tss2_Sys_GetRspAuths( sysContext, &rspAuths );
6404 CheckFailed( rval, TSS2_SYS_RC_INVALID_SESSIONS ); // #14
6405
6406 // Test for non-matching count: cmd auth count doesn't
6407 // match returned auth count.
6408 rspAuths.rspAuthsCount = 3;
6409 savedResponseSize = CHANGE_ENDIAN_DWORD( ( (TPM20_Header_Out *)( ( (_TSS2_SYS_CONTEXT_BLOB *)sysContext )->tpmOutBuffPtr ) )->responseSize );
6410 ( (TPM20_Header_Out *)( ( (_TSS2_SYS_CONTEXT_BLOB *)sysContext )->tpmOutBuffPtr ) )->responseSize = CHANGE_ENDIAN_DWORD( savedResponseSize - 5 );
6411 rval = Tss2_Sys_GetRspAuths( sysContext, &rspAuths );
6412 CheckFailed( rval, TSS2_SYS_RC_INVALID_SESSIONS ); // #15
6413
6414 // Test for malformed response.
6415 rspAuths.rspAuthsCount = 2;
6416 ( (TPM20_Header_Out *)( ( (_TSS2_SYS_CONTEXT_BLOB *)sysContext )->tpmOutBuffPtr ) )->responseSize = CHANGE_ENDIAN_DWORD( savedResponseSize - 7 );
6417 rval = Tss2_Sys_GetRspAuths( sysContext, &rspAuths );
6418 CheckFailed( rval, TSS2_SYS_RC_MALFORMED_RESPONSE ); // #16
6419
6420 // Ths one should pass.
6421 ( (TPM20_Header_Out *)( ( (_TSS2_SYS_CONTEXT_BLOB *)sysContext )->tpmOutBuffPtr ) )->responseSize = CHANGE_ENDIAN_DWORD( savedResponseSize );
6422 rval = Tss2_Sys_GetRspAuths( sysContext, &rspAuths );
6423 CheckPassed( rval ); // #17
6424
6425 // Check for bad sequence.
6426 rval = Tss2_Sys_StartAuthSession_Complete( sysContext,
6427 &testSessionHandle, &nonceTpm );
6428 CheckPassed( rval ); // #17
6429
6430 // Others?
6431
wcarthur12eb0502015-11-06 12:01:24 -05006432}
6433
Will Arthur54e04e42015-07-15 11:29:25 -04006434void GetSetEncryptParamTests()
6435{
6436 TPM2B_MAX_NV_BUFFER nvWriteData = { { 4, { 0xde, 0xad, 0xbe, 0xef, } } };
6437 const uint8_t *encryptParamBuffer;
6438 const uint8_t encryptParamBuffer1[4] = { 01, 02, 03, 04 };
6439 size_t encryptParamSize;
6440 TSS2_RC rval;
6441 int i;
6442 TPM2B_DIGEST authPolicy;
6443 TPMA_NV nvAttributes;
6444 TPM2B_AUTH nvAuth;
6445
6446 TPMS_AUTH_COMMAND sessionData = { TPM_RS_PW, };
6447 TPMS_AUTH_RESPONSE sessionDataOut;
6448 TPMS_AUTH_COMMAND *sessionDataArray[1] = { &sessionData };
6449 TPMS_AUTH_RESPONSE *sessionDataOutArray[1] = { &sessionDataOut };
6450 TSS2_SYS_CMD_AUTHS sessionsData = { 1, &sessionDataArray[0] };
6451 TSS2_SYS_RSP_AUTHS sessionsDataOut = { 1, &sessionDataOutArray[0] };
6452
6453 TPM2B_MAX_NV_BUFFER nvReadData;
wcarthurea1d3452015-11-11 09:39:35 -05006454 const uint8_t *cpBuffer;
Will Arthur54e04e42015-07-15 11:29:25 -04006455
6456 TpmClientPrintf( 0, "\nGET/SET ENCRYPT PARAM TESTS:\n" );
6457
6458 // Do Prepare.
6459 rval = Tss2_Sys_NV_Write_Prepare( sysContext, TPM20_INDEX_PASSWORD_TEST,
6460 TPM20_INDEX_PASSWORD_TEST, &nvWriteData, 0 );
wcarthur2efe2912015-11-16 11:19:42 -05006461 CheckPassed( rval ); // #1
Will Arthur54e04e42015-07-15 11:29:25 -04006462
6463 // Test for bad sequence
6464 rval = Tss2_Sys_GetEncryptParam( sysContext, &encryptParamSize, &encryptParamBuffer );
wcarthur2efe2912015-11-16 11:19:42 -05006465 CheckFailed( rval, TSS2_SYS_RC_BAD_SEQUENCE ); // #2
Will Arthur54e04e42015-07-15 11:29:25 -04006466
6467 rval = Tss2_Sys_SetEncryptParam( sysContext, 4, &( nvWriteData.t.buffer[0] ) );
wcarthur2efe2912015-11-16 11:19:42 -05006468 CheckFailed( rval, TSS2_SYS_RC_BAD_SEQUENCE ); // #3
Will Arthur54e04e42015-07-15 11:29:25 -04006469
6470 // Create NV index
6471
6472 // Set empty policy and auth value.
6473 authPolicy.t.size = 0;
6474 nvAuth.t.size = 0;
6475
6476 // Now set the attributes.
6477 *(UINT32 *)( (void *)&nvAttributes ) = 0;
6478 nvAttributes.TPMA_NV_AUTHREAD = 1;
6479 nvAttributes.TPMA_NV_AUTHWRITE = 1;
6480 nvAttributes.TPMA_NV_PLATFORMCREATE = 1;
6481
6482 rval = DefineNvIndex( TPM_RH_PLATFORM, TPM_RS_PW, &nvAuth, &authPolicy,
6483 TPM20_INDEX_PASSWORD_TEST, TPM_ALG_SHA1, nvAttributes, 32 );
wcarthur2efe2912015-11-16 11:19:42 -05006484 CheckPassed( rval ); // #4
Will Arthur54e04e42015-07-15 11:29:25 -04006485
6486 // Write the index.
6487 rval = Tss2_Sys_NV_Write_Prepare( sysContext, TPM20_INDEX_PASSWORD_TEST,
6488 TPM20_INDEX_PASSWORD_TEST, &nvWriteData, 0 );
wcarthur2efe2912015-11-16 11:19:42 -05006489 CheckPassed( rval ); // #5
Will Arthur54e04e42015-07-15 11:29:25 -04006490
wcarthurea1d3452015-11-11 09:39:35 -05006491 // NOTE: add GetCpBuffer tests here, just because its easier.
6492 rval = Tss2_Sys_GetCpBuffer( 0, (size_t *)4, (const uint8_t **)4 );
wcarthur2efe2912015-11-16 11:19:42 -05006493 CheckFailed( rval, TSS2_SYS_RC_BAD_REFERENCE ); // #6
Will Arthur54e04e42015-07-15 11:29:25 -04006494
wcarthurea1d3452015-11-11 09:39:35 -05006495 rval = Tss2_Sys_GetCpBuffer( sysContext, (size_t *)0, (const uint8_t **)4 );
wcarthur2efe2912015-11-16 11:19:42 -05006496 CheckFailed( rval, TSS2_SYS_RC_BAD_REFERENCE ); // #7
wcarthurea1d3452015-11-11 09:39:35 -05006497
6498 rval = Tss2_Sys_GetCpBuffer( sysContext, (size_t *)4, (const uint8_t **)0 );
wcarthur2efe2912015-11-16 11:19:42 -05006499 CheckFailed( rval, TSS2_SYS_RC_BAD_REFERENCE ); // #8
wcarthurea1d3452015-11-11 09:39:35 -05006500
6501
6502 rval = Tss2_Sys_SetCmdAuths( sysContext, &sessionsData );
wcarthur2efe2912015-11-16 11:19:42 -05006503 CheckPassed( rval ); // #9
Will Arthur54e04e42015-07-15 11:29:25 -04006504
wcarthurea1d3452015-11-11 09:39:35 -05006505 rval = Tss2_Sys_ExecuteAsync( sysContext );
wcarthur2efe2912015-11-16 11:19:42 -05006506 CheckPassed( rval ); // #10
wcarthurea1d3452015-11-11 09:39:35 -05006507
6508 // NOTE: Stick two tests for BAD_SEQUENCE for GetDecryptParam and SetDecryptParam here, just
6509 // because it's easier to do this way.
6510 rval = Tss2_Sys_GetDecryptParam( sysContext, (size_t *)4, (const uint8_t **)4 );
wcarthur2efe2912015-11-16 11:19:42 -05006511 CheckFailed( rval, TSS2_SYS_RC_BAD_SEQUENCE ); // #11
wcarthurea1d3452015-11-11 09:39:35 -05006512
6513 rval = Tss2_Sys_SetDecryptParam( sysContext, 10, (uint8_t *)4 );
wcarthur2efe2912015-11-16 11:19:42 -05006514 CheckFailed( rval, TSS2_SYS_RC_BAD_SEQUENCE ); // #12
wcarthurea1d3452015-11-11 09:39:35 -05006515
6516 // NOTE: Stick test for BAD_SEQUENCE for GetCpBuffer here, just
6517 // because it's easier to do this way.
6518 rval = Tss2_Sys_GetCpBuffer( sysContext, (size_t *)4, &cpBuffer );
wcarthur2efe2912015-11-16 11:19:42 -05006519 CheckFailed( rval, TSS2_SYS_RC_BAD_SEQUENCE ); // #13
wcarthurea1d3452015-11-11 09:39:35 -05006520
6521 // Now finish the write command so that TPM isn't stuck trying
6522 // to send a response.
6523 rval = Tss2_Sys_ExecuteFinish( sysContext, -1 );
wcarthur2efe2912015-11-16 11:19:42 -05006524 CheckPassed( rval ); // #14
Will Arthur54e04e42015-07-15 11:29:25 -04006525
wcarthur2efe2912015-11-16 11:19:42 -05006526 // Test GetEncryptParam for no encrypt param case.
Will Arthur54e04e42015-07-15 11:29:25 -04006527 rval = Tss2_Sys_GetEncryptParam( sysContext, &encryptParamSize, &encryptParamBuffer );
wcarthur2efe2912015-11-16 11:19:42 -05006528 CheckFailed( rval, TSS2_SYS_RC_NO_ENCRYPT_PARAM ); // #15
6529
6530 // Test SetEncryptParam for no encrypt param case.
6531 rval = Tss2_Sys_SetEncryptParam( sysContext, encryptParamSize, encryptParamBuffer1 );
6532 CheckFailed( rval, TSS2_SYS_RC_NO_ENCRYPT_PARAM ); // #16
6533
Will Arthur54e04e42015-07-15 11:29:25 -04006534 // Now read it and do tests on get/set encrypt functions
6535 rval = Tss2_Sys_NV_Read_Prepare( sysContext, TPM20_INDEX_PASSWORD_TEST, TPM20_INDEX_PASSWORD_TEST, 4, 0 );
wcarthur2efe2912015-11-16 11:19:42 -05006536 CheckPassed( rval ); // #17
Will Arthur54e04e42015-07-15 11:29:25 -04006537
6538 rval = Tss2_Sys_NV_Read( sysContext, TPM20_INDEX_PASSWORD_TEST,
6539 TPM20_INDEX_PASSWORD_TEST, &sessionsData, 4, 0, &nvReadData, &sessionsDataOut );
wcarthur2efe2912015-11-16 11:19:42 -05006540 CheckPassed( rval ); // #18
Will Arthur54e04e42015-07-15 11:29:25 -04006541
6542 rval = Tss2_Sys_GetEncryptParam( sysContext, &encryptParamSize, &encryptParamBuffer );
wcarthur2efe2912015-11-16 11:19:42 -05006543 CheckPassed( rval ); // #19
Will Arthur54e04e42015-07-15 11:29:25 -04006544
wcarthur2efe2912015-11-16 11:19:42 -05006545 // Test case of encryptParamSize being too small.
6546 encryptParamSize--;
Will Arthur54e04e42015-07-15 11:29:25 -04006547 rval = Tss2_Sys_SetEncryptParam( sysContext, encryptParamSize, encryptParamBuffer1 );
wcarthur2efe2912015-11-16 11:19:42 -05006548 CheckFailed( rval, TSS2_SYS_RC_BAD_SIZE ); // #20
6549 encryptParamSize += 2;
6550
6551 // Size too large...should pass, but doesn't.
6552 rval = Tss2_Sys_SetEncryptParam( sysContext, encryptParamSize, encryptParamBuffer1 );
6553 CheckPassed( rval ); // #21
6554
6555 encryptParamSize--;
6556 rval = Tss2_Sys_SetEncryptParam( sysContext, encryptParamSize, encryptParamBuffer1 );
6557 CheckPassed( rval ); // #22
Will Arthur54e04e42015-07-15 11:29:25 -04006558
6559 rval = Tss2_Sys_GetEncryptParam( sysContext, &encryptParamSize, &encryptParamBuffer );
wcarthur2efe2912015-11-16 11:19:42 -05006560 CheckPassed( rval ); // #23
Will Arthur54e04e42015-07-15 11:29:25 -04006561
6562 // Test that encryptParamBuffer is the same as encryptParamBuffer1
6563 for( i = 0; i < 4; i++ )
6564 {
6565 if( encryptParamBuffer[i] != encryptParamBuffer1[i] )
6566 {
6567 TpmClientPrintf( 0, "ERROR!! encryptParamBuffer[%d] s/b: %2.2x, was: %2.2x\n", i, encryptParamBuffer[i], encryptParamBuffer1[i] );
6568 Cleanup();
6569 }
6570 }
6571
6572 rval = Tss2_Sys_NV_UndefineSpace( sysContext, TPM_RH_PLATFORM, TPM20_INDEX_PASSWORD_TEST, &sessionsData, 0 );
wcarthur2efe2912015-11-16 11:19:42 -05006573 CheckPassed( rval ); // #24
Will Arthur54e04e42015-07-15 11:29:25 -04006574
6575
6576 // Test for bad reference
6577 rval = Tss2_Sys_GetEncryptParam( 0, &encryptParamSize, &encryptParamBuffer );
wcarthur2efe2912015-11-16 11:19:42 -05006578 CheckFailed( rval, TSS2_SYS_RC_BAD_REFERENCE ); // #25
Will Arthur54e04e42015-07-15 11:29:25 -04006579
6580 rval = Tss2_Sys_GetEncryptParam( sysContext, 0, &encryptParamBuffer );
wcarthur2efe2912015-11-16 11:19:42 -05006581 CheckFailed( rval, TSS2_SYS_RC_BAD_REFERENCE ); // #26
Will Arthur54e04e42015-07-15 11:29:25 -04006582
6583 rval = Tss2_Sys_GetEncryptParam( sysContext, &encryptParamSize, 0 );
wcarthur2efe2912015-11-16 11:19:42 -05006584 CheckFailed( rval, TSS2_SYS_RC_BAD_REFERENCE ); // #27
Will Arthur54e04e42015-07-15 11:29:25 -04006585
6586 rval = Tss2_Sys_SetEncryptParam( sysContext, 4, 0 );
wcarthur2efe2912015-11-16 11:19:42 -05006587 CheckFailed( rval, TSS2_SYS_RC_BAD_REFERENCE ); // #28
Will Arthur54e04e42015-07-15 11:29:25 -04006588
6589 rval = Tss2_Sys_SetEncryptParam( 0, 4, encryptParamBuffer );
wcarthur2efe2912015-11-16 11:19:42 -05006590 CheckFailed( rval, TSS2_SYS_RC_BAD_REFERENCE ); // #29
Will Arthur54e04e42015-07-15 11:29:25 -04006591}
6592
6593void TestRM()
6594{
6595 TSS2_TCTI_CONTEXT *otherResMgrTctiContext = 0;
6596 TSS2_SYS_CONTEXT *otherSysContext;
6597 TPM2B_SENSITIVE_CREATE inSensitive;
6598 TPM2B_PUBLIC inPublic;
6599 TPM2B_DATA outsideInfo;
6600 TPML_PCR_SELECTION creationPCR;
6601 TPMS_AUTH_COMMAND sessionData;
6602 TPMS_AUTH_RESPONSE sessionDataOut;
6603 TSS2_SYS_CMD_AUTHS sessionsData;
6604
6605 TSS2_SYS_RSP_AUTHS sessionsDataOut;
6606 TPM2B_NAME name;
6607 TPM2B_PRIVATE outPrivate;
6608 TPM2B_PUBLIC outPublic;
6609 TPM2B_CREATION_DATA creationData;
6610 TPM2B_DIGEST creationHash;
6611 TPMT_TK_CREATION creationTicket;
6612
6613 TPMS_AUTH_COMMAND *sessionDataArray[1];
6614 TPMS_AUTH_RESPONSE *sessionDataOutArray[1];
6615 TSS2_RC rval = TSS2_RC_SUCCESS;
6616
6617 TPMS_CONTEXT context;
6618 TSS2_TCTI_CONTEXT *tctiContext;
6619
6620 TPMI_DH_CONTEXT loadedHandle, newHandle, newNewHandle, newHandleDummy;
6621 TPMS_CONTEXT newContext;
6622 char otherResMgrInterfaceName[] = "Test RM Resource Manager";
6623
6624 TpmClientPrintf( 0, "\nRM TESTS:\n" );
6625
6626 sessionDataArray[0] = &sessionData;
6627 sessionDataOutArray[0] = &sessionDataOut;
6628
6629 sessionsDataOut.rspAuths = &sessionDataOutArray[0];
6630 sessionsData.cmdAuths = &sessionDataArray[0];
6631
6632 sessionsDataOut.rspAuthsCount = 1;
6633 inSensitive.t.sensitive.userAuth = loadedSha1KeyAuth;
6634 inSensitive.t.sensitive.userAuth = loadedSha1KeyAuth;
6635 inSensitive.t.sensitive.data.t.size = 0;
6636 inSensitive.t.size = loadedSha1KeyAuth.b.size + 2;
6637
6638 inPublic.t.publicArea.type = TPM_ALG_RSA;
6639 inPublic.t.publicArea.nameAlg = TPM_ALG_SHA1;
6640
6641 // First clear attributes bit field.
6642 *(UINT32 *)&( inPublic.t.publicArea.objectAttributes) = 0;
6643 inPublic.t.publicArea.objectAttributes.restricted = 1;
6644 inPublic.t.publicArea.objectAttributes.userWithAuth = 1;
6645 inPublic.t.publicArea.objectAttributes.decrypt = 1;
6646 inPublic.t.publicArea.objectAttributes.fixedTPM = 1;
6647 inPublic.t.publicArea.objectAttributes.fixedParent = 1;
6648 inPublic.t.publicArea.objectAttributes.sensitiveDataOrigin = 1;
6649
6650 inPublic.t.publicArea.authPolicy.t.size = 0;
6651
6652 inPublic.t.publicArea.parameters.rsaDetail.symmetric.algorithm = TPM_ALG_AES;
6653 inPublic.t.publicArea.parameters.rsaDetail.symmetric.keyBits.aes = 128;
6654 inPublic.t.publicArea.parameters.rsaDetail.symmetric.mode.aes = TPM_ALG_ECB;
6655 inPublic.t.publicArea.parameters.rsaDetail.scheme.scheme = TPM_ALG_NULL;
6656 inPublic.t.publicArea.parameters.rsaDetail.keyBits = 1024;
6657 inPublic.t.publicArea.parameters.rsaDetail.exponent = 0;
6658
6659 inPublic.t.publicArea.unique.rsa.t.size = 0;
6660
6661 outsideInfo.t.size = 0;
6662 creationPCR.count = 0;
6663
6664 sessionData.sessionHandle = TPM_RS_PW;
6665
6666 // Init nonce.
6667 sessionData.nonce.t.size = 0;
6668
6669 // init hmac
6670 sessionData.hmac.t.size = 0;
6671
6672 // Init session attributes
6673 *( (UINT8 *)((void *)&sessionData.sessionAttributes ) ) = 0;
6674
6675 sessionsData.cmdAuthsCount = 1;
6676 sessionsData.cmdAuths[0] = &sessionData;
6677
6678 rval = InitTctiResMgrContext( rmInterfaceConfig, &otherResMgrTctiContext, &otherResMgrInterfaceName[0] );
6679 if( rval != TSS2_RC_SUCCESS )
6680 {
6681 TpmClientPrintf( 0, "Resource Mgr, %s, failed initialization: 0x%x. Exiting...\n", resMgrInterfaceInfo.shortName, rval );
6682 Cleanup();
6683 return;
6684 }
6685 else
6686 {
6687 (( TSS2_TCTI_CONTEXT_INTEL *)otherResMgrTctiContext )->status.debugMsgLevel = debugLevel;
6688 }
6689
6690 otherSysContext = InitSysContext( 0, otherResMgrTctiContext, &abiVersion );
6691 if( otherSysContext == 0 )
6692 {
6693 InitSysContextFailure();
6694 }
6695
wcarthur02340012015-10-28 08:32:42 -04006696 // TEST WITH AN INVALID COMMAND CODE.
6697
6698 rval = Tss2_Sys_Startup_Prepare( sysContext, TPM_SU_CLEAR );
6699 CheckPassed(rval);
6700
6701 //
6702 // Alter the CC by altering the CC field in sysContext.
6703 //
6704 // WARNING: This is something only a test application should do. Do
6705 // not use this as sample code.
6706 //
6707 ((TPM20_Header_In *)( ( (_TSS2_SYS_CONTEXT_BLOB *)sysContext )->tpmInBuffPtr) )->commandCode = TPM_CC_FIRST - 1;
6708 rval = Tss2_Sys_Execute( sysContext );
6709 CheckFailed( rval, TPM_RC_COMMAND_CODE );
6710
Will Arthur54e04e42015-07-15 11:29:25 -04006711 // TEST OWNERSHIP
6712
6713 // Try to access a key created by the first TCTI context.
6714 sessionData.hmac.t.size = 2;
6715 sessionData.hmac.t.buffer[0] = 0x00;
6716 sessionData.hmac.t.buffer[1] = 0xff;
6717
6718 inPublic.t.publicArea.type = TPM_ALG_RSA;
6719 inPublic.t.publicArea.nameAlg = TPM_ALG_SHA1;
6720
6721 // First clear attributes bit field.
6722 *(UINT32 *)&( inPublic.t.publicArea.objectAttributes) = 0;
6723 inPublic.t.publicArea.objectAttributes.restricted = 1;
6724 inPublic.t.publicArea.objectAttributes.userWithAuth = 1;
6725 inPublic.t.publicArea.objectAttributes.decrypt = 1;
6726 inPublic.t.publicArea.objectAttributes.fixedTPM = 1;
6727 inPublic.t.publicArea.objectAttributes.fixedParent = 1;
6728 inPublic.t.publicArea.objectAttributes.sensitiveDataOrigin = 1;
6729
6730 inPublic.t.publicArea.authPolicy.t.size = 0;
6731
6732 inPublic.t.publicArea.parameters.rsaDetail.symmetric.algorithm = TPM_ALG_AES;
6733 inPublic.t.publicArea.parameters.rsaDetail.symmetric.keyBits.aes = 128;
6734 inPublic.t.publicArea.parameters.rsaDetail.symmetric.mode.aes = TPM_ALG_ECB;
6735 inPublic.t.publicArea.parameters.rsaDetail.scheme.scheme = TPM_ALG_NULL;
6736 inPublic.t.publicArea.parameters.rsaDetail.keyBits = 2048;
6737 inPublic.t.publicArea.parameters.rsaDetail.exponent = 0;
6738
6739 inPublic.t.publicArea.unique.rsa.t.size = 0;
6740
6741 outsideInfo.t.size = 0;
6742
6743 // This one should fail, because a different context is trying to use the primary object.
6744 outPublic.t.size = 0;
6745 creationData.t.size = 0;
6746 rval = Tss2_Sys_Create( otherSysContext, handle2048rsa, &sessionsData, &inSensitive, &inPublic,
6747 &outsideInfo, &creationPCR,
6748 &outPrivate, &outPublic, &creationData,
6749 &creationHash, &creationTicket, &sessionsDataOut );
6750 CheckFailed( rval, TSS2_RESMGR_UNOWNED_HANDLE );
6751
6752 // This one should pass, because the same context is allowed to save the context.
6753 rval = Tss2_Sys_ContextSave( sysContext, handle2048rsa, &context );
6754 CheckPassed( rval );
6755
6756 // This one should pass, since we saved the context first.
6757 rval = Tss2_Sys_ContextLoad( otherSysContext, &context, &loadedHandle );
6758 CheckPassed( rval );
6759
6760 rval = Tss2_Sys_FlushContext( otherSysContext, loadedHandle );
6761 CheckPassed( rval );
6762
6763 // NOW, DO SOME LOCALITY TESTS
6764
6765 // Test with null tctiContext ptr.
6766 rval = (((TSS2_TCTI_CONTEXT_COMMON_V1 *)otherResMgrTctiContext)->setLocality)( 0, 0 );
6767 CheckFailed( rval, TSS2_TCTI_RC_BAD_REFERENCE );
6768
6769 rval = (((TSS2_TCTI_CONTEXT_COMMON_V1 *)otherResMgrTctiContext)->setLocality)( otherResMgrTctiContext, 0 );
6770 CheckPassed( rval );
6771
6772 // Now try changing localities between send and receive.
6773 rval = Tss2_Sys_ContextLoad( otherSysContext, &context, &loadedHandle );
6774 CheckPassed( rval );
6775
6776 rval = Tss2_Sys_FlushContext_Prepare( otherSysContext, loadedHandle );
6777 CheckPassed( rval );
6778
6779 rval = Tss2_Sys_ExecuteAsync( otherSysContext );
6780 CheckPassed( rval );
6781
6782 // This should fail because locality is changing between send and receive.
6783 rval = (((TSS2_TCTI_CONTEXT_COMMON_V1 *)otherResMgrTctiContext)->setLocality)( otherResMgrTctiContext, 1 );
6784 CheckFailed( rval, TSS2_TCTI_RC_BAD_SEQUENCE );
6785
6786 rval = Tss2_Sys_ExecuteFinish( otherSysContext, TSS2_TCTI_TIMEOUT_BLOCK );
6787 CheckPassed( rval );
6788
6789 // NOW, DO SOME CANCEL TESTS
6790
6791 rval = Tss2_Sys_GetTctiContext( sysContext, &tctiContext );
6792 CheckPassed( rval );
6793
6794 // Try cancel with null tctiContext ptr.
6795 rval = (((TSS2_TCTI_CONTEXT_COMMON_V1 *)otherResMgrTctiContext)->cancel)( 0 );
6796 CheckFailed( rval, TSS2_TCTI_RC_BAD_REFERENCE );
6797
6798 // Try cancel when no commands are pending.
6799 rval = (((TSS2_TCTI_CONTEXT_COMMON_V1 *)otherResMgrTctiContext)->cancel)( otherResMgrTctiContext );
6800 CheckFailed( rval, TSS2_TCTI_RC_BAD_SEQUENCE );
6801
6802 // Then try cancel with a pending command: send cancel before blocking _Finish call.
6803 inPublic.t.publicArea.parameters.rsaDetail.keyBits = 2048;
6804 rval = Tss2_Sys_CreatePrimary_Prepare( sysContext, TPM_RH_PLATFORM, &inSensitive, &inPublic,
6805 &outsideInfo, &creationPCR );
6806 CheckPassed( rval );
6807
6808 //
6809 // NOTE: there are race conditions in tests that use cancel and
6810 // are expecting to receive the CANCEL response code. The tests
6811 // typically pass, but may occasionally fail on the order of
6812 // 1 out of 500 or so test passes.
6813 //
6814 // The OS could delay the test app long enough for the TPM to
6815 // complete the CreatePrimary before the test app gets to run
6816 // again. To make these tests robust would require some way to
6817 // create a critical section in the test app.
6818 //
6819 sessionData.hmac.t.size = 0;
6820 sessionData.nonce.t.size = 0;
6821 rval = Tss2_Sys_SetCmdAuths( sysContext, &sessionsData );
6822 CheckPassed( rval );
6823
6824 rval = Tss2_Sys_ExecuteAsync( sysContext );
6825 CheckPassed( rval );
6826
6827 rval = (((TSS2_TCTI_CONTEXT_COMMON_V1 *)tctiContext)->cancel)( tctiContext );
6828 CheckPassed( rval );
6829
6830 rval = Tss2_Sys_ExecuteFinish( sysContext, TSS2_TCTI_TIMEOUT_BLOCK );
6831 CheckFailed( rval, TPM_RC_CANCELED );
6832
6833 // Then try cancel with a pending command: send cancel after non-blocking _Finish call.
6834 rval = Tss2_Sys_CreatePrimary_Prepare( sysContext, TPM_RH_PLATFORM, &inSensitive, &inPublic,
6835 &outsideInfo, &creationPCR );
6836 CheckPassed( rval );
6837
6838 rval = Tss2_Sys_SetCmdAuths( sysContext, &sessionsData );
6839 CheckPassed( rval );
6840
6841 rval = Tss2_Sys_ExecuteAsync( sysContext );
6842 CheckPassed( rval );
6843
6844 rval = Tss2_Sys_ExecuteFinish( sysContext, 0 );
6845 CheckFailed( rval, TSS2_TCTI_RC_TRY_AGAIN );
6846
6847 rval = (((TSS2_TCTI_CONTEXT_COMMON_V1 *)tctiContext)->cancel)( tctiContext );
6848 CheckPassed( rval );
6849
6850 rval = Tss2_Sys_ExecuteFinish( sysContext, TSS2_TCTI_TIMEOUT_BLOCK );
6851 CheckFailed( rval, TPM_RC_CANCELED );
6852
6853 // Then try cancel from a different connection: it should just get a sequence error.
6854 rval = Tss2_Sys_CreatePrimary_Prepare( sysContext, TPM_RH_PLATFORM, &inSensitive, &inPublic,
6855 &outsideInfo, &creationPCR );
6856 CheckPassed( rval );
6857
6858 rval = Tss2_Sys_SetCmdAuths( sysContext, &sessionsData );
6859 CheckPassed( rval );
6860
6861 rval = Tss2_Sys_ExecuteAsync( sysContext );
6862 CheckPassed( rval );
6863
6864 rval = (((TSS2_TCTI_CONTEXT_COMMON_V1 *)otherResMgrTctiContext)->cancel)( otherResMgrTctiContext );
6865 CheckFailed( rval, TSS2_TCTI_RC_BAD_SEQUENCE );
6866
6867 rval = Tss2_Sys_ExecuteFinish( sysContext, TSS2_TCTI_TIMEOUT_BLOCK );
6868 CheckPassed( rval );
6869
6870 outPublic.t.size = 0;
6871 creationData.t.size = 0;
6872 rval = Tss2_Sys_CreatePrimary_Complete( sysContext, &newHandle, &outPublic, &creationData,
6873 &creationHash, &creationTicket, &name );
6874 CheckPassed( rval );
6875
6876 //
6877 // Now try saving context for object and loading it using a different connection.
6878 //
6879
6880 // First save context.
6881 rval = Tss2_Sys_ContextSave( sysContext, newHandle, &newContext );
6882 CheckPassed( rval );
6883
6884 //
6885 // Now create an object with different hierarchy. This will make sure that
6886 // RM is getting correct hierarchy in it's table.
6887 // NOTE: this test can only be verified by looking at RM output.
6888 //
6889 outPublic.t.size = 0;
6890 creationData.t.size = 0;
6891 rval = Tss2_Sys_CreatePrimary( sysContext, TPM_RH_ENDORSEMENT, &sessionsData, &inSensitive, &inPublic,
6892 &outsideInfo, &creationPCR, &newHandleDummy, &outPublic, &creationData, &creationHash,
6893 &creationTicket, &name, &sessionsDataOut );
6894 CheckPassed( rval );
6895
6896 // Now try loading the context using a different connection.
6897 rval = Tss2_Sys_ContextLoad( otherSysContext, &newContext, &newNewHandle );
6898 CheckPassed( rval );
6899
6900 // Flush original connection's object.
6901 rval = Tss2_Sys_FlushContext( sysContext, newHandle );
6902 CheckPassed( rval );
6903
6904 // Now try flushing new object from wrong connection. Shouldn't be able to.
6905 rval = Tss2_Sys_FlushContext( sysContext, newNewHandle );
6906 CheckFailed( rval, TSS2_RESMGR_UNOWNED_HANDLE );
6907
6908 // Now flush new object from other connection. Should work.
6909 rval = Tss2_Sys_FlushContext( otherSysContext, newNewHandle );
6910 CheckPassed( rval );
6911
6912 // Now flush dummy object.
6913 rval = Tss2_Sys_FlushContext( sysContext, newHandleDummy );
6914 CheckPassed( rval );
6915
6916 rval = TeardownTctiResMgrContext( rmInterfaceConfig, otherResMgrTctiContext, &otherResMgrInterfaceName[0] );
6917 CheckPassed( rval );
6918
6919 TeardownSysContext( &otherSysContext );
6920}
6921
6922void EcEphemeralTest()
6923{
6924 TSS2_RC rval = TSS2_RC_SUCCESS;
6925 TPM2B_ECC_POINT Q;
6926 UINT16 counter;
6927
6928 TpmClientPrintf( 0, "\nEC Ephemeral TESTS:\n" );
6929
6930 // Test SAPI for case of Q size field not being set to 0.
6931 Q.t.size = 0xff;
6932 rval = Tss2_Sys_EC_Ephemeral( sysContext, 0, TPM_ECC_BN_P256, &Q, &counter, 0 );
6933 CheckFailed( rval, TSS2_SYS_RC_BAD_VALUE );
6934
6935 Q.t.size = 0;
6936 rval = Tss2_Sys_EC_Ephemeral( sysContext, 0, TPM_ECC_BN_P256, &Q, &counter, 0 );
6937 CheckPassed( rval );
6938}
6939
6940
6941void AbiVersionTests()
6942{
6943 UINT32 contextSize = 1000;
6944 TSS2_RC rval;
6945 TSS2_SYS_CONTEXT *sysContext;
6946 TSS2_ABI_VERSION tstAbiVersion = { TSSWG_INTEROP, TSS_SAPI_FIRST_FAMILY, TSS_SAPI_FIRST_LEVEL, TSS_SAPI_FIRST_VERSION };
6947
6948 TpmClientPrintf( 0, "\nABI NEGOTIATION TESTS:\n" );
6949
6950 // Get the size needed for system context structure.
6951 contextSize = Tss2_Sys_GetContextSize( contextSize );
6952
6953 // Allocate the space for the system context structure.
6954 sysContext = (TSS2_SYS_CONTEXT *)malloc( contextSize );
6955
6956 if( sysContext != 0 )
6957 {
6958 // Initialized the system context structure.
6959 tstAbiVersion.tssCreator = 0xF0000000;
6960 rval = Tss2_Sys_Initialize( sysContext, contextSize, resMgrTctiContext, &tstAbiVersion );
6961 CheckFailed( rval, TSS2_SYS_RC_ABI_MISMATCH );
6962
6963 tstAbiVersion.tssCreator = TSSWG_INTEROP;
6964 tstAbiVersion.tssFamily = 0xF0000000;
6965 rval = Tss2_Sys_Initialize( sysContext, contextSize, resMgrTctiContext, &tstAbiVersion );
6966 CheckFailed( rval, TSS2_SYS_RC_ABI_MISMATCH );
6967
6968 tstAbiVersion.tssFamily = TSS_SAPI_FIRST_FAMILY;
6969 tstAbiVersion.tssLevel = 0xF0000000;
6970 rval = Tss2_Sys_Initialize( sysContext, contextSize, resMgrTctiContext, &tstAbiVersion );
6971 CheckFailed( rval, TSS2_SYS_RC_ABI_MISMATCH );
6972
6973 tstAbiVersion.tssLevel = TSS_SAPI_FIRST_LEVEL;
6974 tstAbiVersion.tssVersion = 0xF0000000;
6975 rval = Tss2_Sys_Initialize( sysContext, contextSize, resMgrTctiContext, &tstAbiVersion );
6976 CheckFailed( rval, TSS2_SYS_RC_ABI_MISMATCH );
6977 }
6978 free( sysContext );
6979}
6980
6981
6982#ifdef __cplusplus
6983extern "C" {
6984#endif
6985
6986extern int dummy_test();
6987
6988#ifdef __cplusplus
6989}
6990#endif
6991
6992extern TSS2_RC SocketSendTpmCommand(
6993 TSS2_TCTI_CONTEXT *tctiContext, /* in */
6994 size_t command_size, /* in */
6995 uint8_t *command_buffer /* in */
6996 );
6997
6998TSS2_RC SocketReceiveTpmResponse(
6999 TSS2_TCTI_CONTEXT *tctiContext, /* in */
7000 size_t *response_size, /* out */
7001 unsigned char *response_buffer, /* in */
7002 int32_t timeout
7003 );
7004
unknown6ee10422015-10-14 08:59:24 -04007005void TestCreate1()
7006{
7007 UINT32 rval;
7008 TPM2B_SENSITIVE_CREATE inSensitive = { { sizeof( TPM2B_SENSITIVE_CREATE ) - 2, } };
7009 TPM2B_PUBLIC inPublic = { { sizeof( TPM2B_PUBLIC ) - 2, } };
7010 TPM2B_DATA outsideInfo = { { sizeof( TPM2B_DATA ) - 2, } };
7011 TPML_PCR_SELECTION creationPCR;
7012
7013 TPMS_AUTH_COMMAND sessionData = { TPM_RS_PW, };
7014 TPMS_AUTH_RESPONSE sessionDataOut;
7015 TPMS_AUTH_COMMAND *sessionDataArray[1] = { &sessionData };
7016 TPMS_AUTH_RESPONSE *sessionDataOutArray[1] = { &sessionDataOut };
7017 TSS2_SYS_CMD_AUTHS sessionsData = { 1, &sessionDataArray[0] };
7018 TSS2_SYS_RSP_AUTHS sessionsDataOut = { 1, &sessionDataOutArray[0] };
7019
7020 TPM2B_NAME name = { { sizeof( TPM2B_NAME ) - 2, } };
7021 TPM2B_PUBLIC outPublic = { { sizeof( TPM2B_PUBLIC ) - 2, } };
7022 TPM2B_CREATION_DATA creationData = { { sizeof( TPM2B_CREATION_DATA ) - 2, } };
7023 TPM2B_DIGEST creationHash = { { sizeof( TPM2B_DIGEST ) - 2, } };
7024 TPMT_TK_CREATION creationTicket = { 0, 0, { { sizeof( TPM2B_DIGEST ) - 2, } } };
7025
7026 sessionDataArray[0] = &sessionData;
7027 sessionDataOutArray[0] = &sessionDataOut;
7028
7029 sessionsDataOut.rspAuths = &sessionDataOutArray[0];
7030 sessionsData.cmdAuths = &sessionDataArray[0];
7031
7032 sessionsDataOut.rspAuthsCount = 1;
7033
Will-nuc9ab34612015-10-29 17:02:47 -04007034 printf( "\nCREATE PRIMARY, encrypt and decrypt TESTS:\n" );
unknown6ee10422015-10-14 08:59:24 -04007035
7036 inSensitive.t.sensitive.userAuth = loadedSha1KeyAuth;
7037 inSensitive.t.sensitive.userAuth = loadedSha1KeyAuth;
7038 inSensitive.t.sensitive.data.t.size = 0;
7039 inSensitive.t.size = loadedSha1KeyAuth.b.size + 2;
7040
7041 inPublic.t.publicArea.type = TPM_ALG_RSA;
7042 inPublic.t.publicArea.nameAlg = TPM_ALG_SHA1;
7043
7044 // First clear attributes bit field.
7045 *(UINT32 *)&( inPublic.t.publicArea.objectAttributes) = 0;
7046 inPublic.t.publicArea.objectAttributes.restricted = 1;
7047 inPublic.t.publicArea.objectAttributes.userWithAuth = 1;
7048 inPublic.t.publicArea.objectAttributes.decrypt = 1;
7049 inPublic.t.publicArea.objectAttributes.fixedTPM = 1;
7050 inPublic.t.publicArea.objectAttributes.fixedParent = 1;
7051 inPublic.t.publicArea.objectAttributes.sensitiveDataOrigin = 1;
7052
7053 inPublic.t.publicArea.authPolicy.t.size = 0;
7054
7055 inPublic.t.publicArea.parameters.rsaDetail.symmetric.algorithm = TPM_ALG_AES;
7056 inPublic.t.publicArea.parameters.rsaDetail.symmetric.keyBits.aes = 128;
7057 inPublic.t.publicArea.parameters.rsaDetail.symmetric.mode.aes = TPM_ALG_ECB;
7058 inPublic.t.publicArea.parameters.rsaDetail.scheme.scheme = TPM_ALG_NULL;
7059 inPublic.t.publicArea.parameters.rsaDetail.keyBits = 1024;
7060 inPublic.t.publicArea.parameters.rsaDetail.exponent = 0;
7061
7062 inPublic.t.publicArea.unique.rsa.t.size = 0;
7063
7064 outsideInfo.t.size = 0;
7065 creationPCR.count = 0;
7066
7067 sessionData.sessionHandle = TPM_RS_PW;
7068
7069 // Init nonce.
7070 sessionData.nonce.t.size = 0;
7071
7072 // init hmac
7073 sessionData.hmac.t.size = 0;
7074
7075 // Init session attributes
7076 *( (UINT8 *)((void *)&sessionData.sessionAttributes ) ) = 0;
7077
7078 sessionsData.cmdAuthsCount = 1;
7079 sessionsData.cmdAuths[0] = &sessionData;
7080
7081 inPublic.t.publicArea.parameters.rsaDetail.keyBits = 2048;
7082
7083 // Do SAPI test for non-zero sized outPublic
7084 outPublic.t.size = 0xff;
7085 creationData.t.size = 0;
7086 rval = Tss2_Sys_CreatePrimary( sysContext, TPM_RH_OWNER, &sessionsData, &inSensitive, &inPublic,
7087 &outsideInfo, &creationPCR, &handle2048rsa, &outPublic, &creationData, &creationHash,
7088 &creationTicket, &name, &sessionsDataOut );
7089 CheckFailed( rval, TSS2_SYS_RC_BAD_VALUE );
7090
unknown6ee10422015-10-14 08:59:24 -04007091 outPublic.t.size = 0;
wcarthur7b10eeb2015-12-03 16:40:41 -05007092 creationData.t.size = 0;
unknown6ee10422015-10-14 08:59:24 -04007093 outPublic.t.publicArea.authPolicy.t.size = sizeof( TPM2B_DIGEST ) - 2;
7094 outPublic.t.publicArea.unique.keyedHash.t.size = sizeof( TPM2B_DIGEST ) - 2;
7095 rval = Tss2_Sys_CreatePrimary( sysContext, TPM_RH_OWNER, &sessionsData, &inSensitive, &inPublic,
7096 &outsideInfo, &creationPCR, &handle2048rsa, &outPublic, &creationData, &creationHash,
7097 &creationTicket, &name, &sessionsDataOut );
7098 CheckPassed( rval );
7099
7100 printf( "\nNew key successfully created in owner hierarchy (RSA 2048). Handle: 0x%8.8x\n",
7101 handle2048rsa );
7102 printf( "Name of created primary key: " );
7103 PrintSizedBuffer( (TPM2B *)&name );
7104
7105 char buffer1contents[] = "test";
7106 //char buffer2contents[] = "string";
7107
7108 TPMI_DH_OBJECT keyHandle = handle2048rsa;
7109 TPMT_RSA_DECRYPT inScheme;
7110 TPM2B_PUBLIC_KEY_RSA message;
7111 TPM2B_PUBLIC_KEY_RSA outData;
7112
7113 message.t.size = strlen(buffer1contents);
7114 memcpy(message.t.buffer, buffer1contents, message.t.size);
7115
7116 inScheme.scheme = TPM_ALG_NULL;
7117
7118 //printf("keyHandle: %x\n", keyHandle);
7119 rval = Tss2_Sys_RSA_Encrypt(sysContext, keyHandle, &sessionsData, &message, &inScheme, &outsideInfo, &outData, &sessionsDataOut);
7120 if( tpmSpecVersion >= 124 )
7121 CheckFailed( rval, TPM_RC_S + TPM_RC_1 + TPM_RC_HANDLE );
7122 else
7123 CheckFailed( rval, TPM_RC_1 + TPM_RC_HANDLE );
7124
Will-nucd6bbaa12015-12-08 11:51:25 -05007125 outData.t.size = sizeof( outData ) - 2;
unknown6ee10422015-10-14 08:59:24 -04007126 rval = Tss2_Sys_RSA_Encrypt(sysContext, keyHandle, 0, &message, &inScheme, &outsideInfo, &outData, &sessionsDataOut);
7127 CheckPassed( rval );
7128
7129 for (int i=0; i<message.t.size; i++)
7130 printf("\nlabel size:%d, label buffer:%x, outData size:%d, outData buffer:%x, msg size:%d, msg buffer:%x", outsideInfo.t.size, outsideInfo.t.buffer[i], outData.t.size, outData.t.buffer[i], message.t.size, message.t.buffer[i]);
7131 CheckPassed(rval);
7132}
7133
wcarthur007a1a92015-12-11 08:06:59 -05007134#if __linux || __unix
Will-nuc8619aca2015-12-10 17:20:26 -05007135//
7136// NOTE: these tests must be run when no RM is running in the system and when a local TPM is installe.
7137//
7138void TestLocalTCTI()
7139{
7140 char localTpmInterfaceConfig[LOCAL_INTERFACE_CONFIG_SIZE];
7141 TSS2_RC rval = TSS2_RC_SUCCESS;
7142
7143 TSS2_TCTI_DRIVER_INFO localTpmInterfaceInfo = { "local TPM", "", InitLocalTpmTcti, TeardownLocalTpmTcti };
7144 TSS2_TCTI_CONTEXT *downstreamTctiContext;
7145
7146 TpmClientPrintf( NO_PREFIX, "WARNING!! This test requires that a local TPM is present and that the resource manager has NOT been started.\n\n" );
7147
7148 // Test TCTI interface against local TPM TCTI interface, if available.
7149 //
7150 // Init downstream interface to tpm (in this case the local TPM).
7151 //
7152 sprintf_s( localTpmInterfaceConfig, LOCAL_INTERFACE_CONFIG_SIZE, "%s ", "/dev/tpm0" );
7153
7154 rval = InitLocalTpmTctiContext( localTpmInterfaceConfig, &downstreamTctiContext );
7155 if( rval != TSS2_RC_SUCCESS )
7156 {
7157 TpmClientPrintf( NO_PREFIX, "Resource Mgr, %s, failed initialization: 0x%x. Exiting...\n", localTpmInterfaceInfo.shortName, rval );
7158 CheckPassed( rval );
7159 }
7160 else
7161 {
7162 if( debugLevel == DBG_COMMAND )
7163 {
7164 ((TSS2_TCTI_CONTEXT_INTEL *)downstreamTctiContext )->status.debugMsgLevel = TSS2_TCTI_DEBUG_MSG_ENABLED;
7165 }
7166
7167 TestTctiApis( downstreamTctiContext, 0 );
7168
7169 TeardownLocalTpmTctiContext( localTpmInterfaceConfig, downstreamTctiContext );
7170
7171 exit( 0 );
7172 }
7173
7174}
wcarthur007a1a92015-12-11 08:06:59 -05007175#endif
unknown6ee10422015-10-14 08:59:24 -04007176
Will Arthur54e04e42015-07-15 11:29:25 -04007177void TpmTest()
7178{
7179 TSS2_RC rval = TSS2_RC_SUCCESS;
7180 UINT32 i;
7181
7182 nullSessionsDataOut.rspAuthsCount = 1;
7183 nullSessionsDataOut.rspAuths[0]->nonce = nullSessionNonceOut;
7184 nullSessionsDataOut.rspAuths[0]->hmac = nullSessionHmac;
7185 nullSessionNonceOut.t.size = 0;
7186 nullSessionNonce.t.size = 0;
7187
7188 loadedSha1KeyAuth.t.size = 2;
7189 loadedSha1KeyAuth.t.buffer[0] = 0x00;
7190 loadedSha1KeyAuth.t.buffer[1] = 0xff;
7191
wcarthur12eb0502015-11-06 12:01:24 -05007192 rval = PlatformCommand( resMgrTctiContext, MS_SIM_POWER_OFF );
7193 CheckPassed( rval );
7194
Will Arthur54e04e42015-07-15 11:29:25 -04007195 InitEntities();
7196
7197 InitNullSession( &nullSessionData);
7198
7199 AbiVersionTests();
7200
wcarthurd1fe2872015-11-03 07:44:57 -05007201 SysInitializeTests();
wcarthur12eb0502015-11-06 12:01:24 -05007202
wcarthur4d547ee2015-11-09 12:55:00 -05007203 SysFinalizeTests();
7204
7205 GetContextSizeTests();
wcarthurd71ab7d2015-11-10 16:11:02 -05007206
7207 GetTctiContextTests();
wcarthur4d547ee2015-11-09 12:55:00 -05007208
Will Arthur54e04e42015-07-15 11:29:25 -04007209 GetSetDecryptParamTests();
wcarthur12eb0502015-11-06 12:01:24 -05007210
7211#ifdef _WIN32
7212 // This test can only be run agains the simulator
7213 RmZeroSizedResponseTest();
7214#endif
7215
Will Arthur54e04e42015-07-15 11:29:25 -04007216 rval = PlatformCommand( resMgrTctiContext, MS_SIM_POWER_ON );
7217 CheckPassed( rval );
7218
7219 rval = PlatformCommand( resMgrTctiContext, MS_SIM_NV_ON );
7220 CheckPassed( rval );
Will Arthur54e04e42015-07-15 11:29:25 -04007221 TestTpmStartup();
7222
wcarthurf6d78ac2015-12-31 10:58:40 -05007223 // Run this directly after Startup tests to test for
7224 // a resource mgr corner case with SaveContext.
7225 TestStartAuthSession();
7226
Will Arthur54e04e42015-07-15 11:29:25 -04007227 GetTpmVersion();
7228
wcarthureedecd62015-11-20 16:59:45 -05007229 GetTpmManufacturer();
7230
Will-nuc8619aca2015-12-10 17:20:26 -05007231 TestTctiApis( resMgrTctiContext, 1 );
wcarthureedecd62015-11-20 16:59:45 -05007232
wcarthurf60ec992015-11-09 10:17:11 -05007233 CmdRspAuthsTests();
7234
wcarthurd71ab7d2015-11-10 16:11:02 -05007235 PrepareTests();
7236
Will Arthur54e04e42015-07-15 11:29:25 -04007237 // Clear DA lockout.
7238 TestDictionaryAttackLockReset();
7239
7240 TestTpmSelftest();
7241
Will Arthur54e04e42015-07-15 11:29:25 -04007242 TestDictionaryAttackLockReset();
7243
7244 TestCreate();
7245
unknown6ee10422015-10-14 08:59:24 -04007246 TestCreate1();
7247
wcarthur2efe2912015-11-16 11:19:42 -05007248 TestSapiApis();
7249
Will Arthur54e04e42015-07-15 11:29:25 -04007250 TestHierarchyControl();
7251
7252 NvIndexProto();
7253
7254 GetSetEncryptParamTests();
7255
7256 TestEncryptDecryptSession();
7257
7258 SimpleHmacOrPolicyTest( true );
Will-nucd937bec2015-11-18 16:51:05 -05007259
Will Arthur54e04e42015-07-15 11:29:25 -04007260 SimpleHmacOrPolicyTest( false );
7261
7262 for( i = 1; i <= (UINT32)passCount; i++ )
7263 {
7264 TpmClientPrintf( 0, "\n****** PASS #: %d ******\n\n", i );
7265
7266 TestTpmGetCapability();
7267
7268 TestPcrExtend();
7269
7270 TestHash();
7271
7272 TestPolicy();
7273
7274 TestTpmClear();
7275
7276 TestChangeEps();
7277
7278 TestChangePps();
7279
7280 TestHierarchyChangeAuth();
7281
7282 TestGetRandom();
7283
7284 if( i < 2 )
7285 TestShutdown();
7286
7287 TestNV();
7288
7289 TestCreate();
7290
7291 TestEvict();
7292
7293 NvIndexProto();
7294
7295 PasswordTest();
7296
7297 HmacSessionTest();
7298
7299 TestQuote();
7300
7301 TestDictionaryAttackLockReset();
7302
7303 TestPcrAllocate();
7304
7305 TestUnseal();
7306
7307 TestRM();
7308
7309 EcEphemeralTest();
7310#if 0
7311 TestRsaEncryptDecrypt();
7312#endif
7313 }
7314
7315 // Clear out RM entries for objects.
7316 rval = Tss2_Sys_FlushContext( sysContext, handle2048rsa );
7317 CheckPassed( rval );
7318 rval = Tss2_Sys_FlushContext( sysContext, loadedSha1KeyHandle );
7319 CheckPassed( rval );
7320
7321endTests:
7322 PlatformCommand( resMgrTctiContext, MS_SIM_POWER_OFF );
7323}
7324
7325
7326char version[] = "0.90";
7327
7328void PrintHelp()
7329{
wcarthur007a1a92015-12-11 08:06:59 -05007330 printf( "TPM client test app, Version %s\nUsage: tpmclient [-rmhost hostname|ip_addr] [-rmport port] [-passes passNum] [-demoDelay delay] [-dbg dbgLevel] [-startAuthSessionTest] "
7331#if __linux || __unix
7332 "[-localTctiTest]"
7333#endif
7334 "\n\n"
Will Arthur54e04e42015-07-15 11:29:25 -04007335 "where:\n"
7336 "\n"
Will Arthur6aa5aa82015-08-20 17:55:22 -04007337 "-rmhost specifies the host IP address for the system running the resource manager (default: %s)\n"
7338 "-rmport specifies the port number for the system running the resource manager (default: %d)\n"
Will Arthur54e04e42015-07-15 11:29:25 -04007339 "-passes specifies the number of test passes (default: 1)\n"
7340 "-demoDelay specifies a delay in units of loops, not time (default: 0)\n"
Will Arthur6aa5aa82015-08-20 17:55:22 -04007341 "-dbg specifies level of debug messages:\n"
Will Arthur54e04e42015-07-15 11:29:25 -04007342 " 0 (high level test results)\n"
7343 " 1 (test app send/receive byte streams)\n"
7344 " 2 (resource manager send/receive byte streams)\n"
7345 " 3 (resource manager tables)\n"
7346 "-startAuthSessionTest enables some special tests of the resource manager for starting sessions\n"
wcarthur007a1a92015-12-11 08:06:59 -05007347#if __linux || __unix
Will-nuc8619aca2015-12-10 17:20:26 -05007348 "-localTctiTest enables a TCTI interface test against a local TPM. WARNING: This test requires no resource manager and a local TPM\n"
wcarthur007a1a92015-12-11 08:06:59 -05007349#endif
Will Arthur54e04e42015-07-15 11:29:25 -04007350#ifdef SHARED_OUT_FILE
7351 "-out selects the output file (default is stdout)\n"
7352#endif
7353 , version, DEFAULT_HOSTNAME, DEFAULT_RESMGR_TPM_PORT );
7354}
7355
7356int main(int argc, char* argv[])
7357{
7358 char hostName[HOSTNAME_LENGTH] = DEFAULT_HOSTNAME;
7359 int port = DEFAULT_RESMGR_TPM_PORT;
7360 int count;
7361 TSS2_RC rval;
7362
7363 setvbuf (stdout, NULL, _IONBF, BUFSIZ);
7364#ifdef SHARED_OUT_FILE
7365 if( argc > 12 )
7366#else
7367 if( argc > 10 )
7368#endif
7369 {
7370 PrintHelp();
7371 return 1;
7372 }
7373 else
7374 {
7375 for( count = 1; count < argc; count++ )
7376 {
Will Arthur6aa5aa82015-08-20 17:55:22 -04007377 if( 0 == strcmp( argv[count], "-rmhost" ) )
Will Arthur54e04e42015-07-15 11:29:25 -04007378 {
7379 count++;
Will Arthur16fc1802015-08-20 17:07:34 -04007380 if( count >= argc || ( strlen( argv[count] ) + 1 <= HOSTNAME_LENGTH ) )
Will Arthur54e04e42015-07-15 11:29:25 -04007381 {
7382 if( 1 != sscanf( argv[count], "%199s", &hostName[0] ) )
7383 {
7384 PrintHelp();
7385 return 1;
7386 }
7387 }
7388 else
7389 {
7390 PrintHelp();
7391 return 1;
7392 }
7393 }
Will Arthur6aa5aa82015-08-20 17:55:22 -04007394 else if( 0 == strcmp( argv[count], "-rmport" ) )
Will Arthur54e04e42015-07-15 11:29:25 -04007395 {
7396 count++;
Will Arthur16fc1802015-08-20 17:07:34 -04007397 if( count >= argc || 1 != sscanf_s( argv[count], "%d", &port ) )
Will Arthur54e04e42015-07-15 11:29:25 -04007398 {
7399 PrintHelp();
7400 return 1;
7401 }
7402 }
7403 else if( 0 == strcmp( argv[count], "-passes" ) )
7404 {
7405 count++;
Will Arthur16fc1802015-08-20 17:07:34 -04007406 if( count >= argc || 1 != sscanf_s( argv[count], "%x", &passCount ) )
Will Arthur54e04e42015-07-15 11:29:25 -04007407 {
7408 PrintHelp();
7409 return 1;
7410 }
7411 }
7412 else if( 0 == strcmp( argv[count], "-demoDelay" ) )
7413 {
7414 count++;
Will Arthur16fc1802015-08-20 17:07:34 -04007415 if( count >= argc || 1 != sscanf_s( argv[count], "%x", &demoDelay ) )
Will Arthur54e04e42015-07-15 11:29:25 -04007416 {
7417 PrintHelp();
7418 return 1;
7419 }
7420 }
7421 else if( 0 == strcmp( argv[count], "-dbg" ) )
7422 {
7423 count++;
Will Arthur16fc1802015-08-20 17:07:34 -04007424 if( count >= argc || 1 != sscanf_s( argv[count], "%d", &debugLevel ) )
Will Arthur54e04e42015-07-15 11:29:25 -04007425 {
7426 PrintHelp();
7427 return 1;
7428 }
7429 }
wcarthur007a1a92015-12-11 08:06:59 -05007430#if __linux || __unix
Will-nuc8619aca2015-12-10 17:20:26 -05007431 else if( 0 == strcmp( argv[count], "-localTctiTest" ) )
7432 {
7433 testLocalTcti = 1;
wcarthur007a1a92015-12-11 08:06:59 -05007434 }
7435#endif
7436
Will Arthur54e04e42015-07-15 11:29:25 -04007437#ifdef SHARED_OUT_FILE
7438 else if( 0 == strcmp( argv[count], "-out" ) )
7439 {
7440 count++;
Will Arthur16fc1802015-08-20 17:07:34 -04007441 if( count >= argc || 1 != sscanf_s( argv[count], "%199s", &outFileName, sizeof( outFileName ) ) )
Will Arthur54e04e42015-07-15 11:29:25 -04007442 {
7443 PrintHelp();
7444 return 1;
7445 }
7446 else
7447 {
7448 OpenOutFile( &outFp );
7449
7450 if( outFp == 0 )
7451 {
7452 printf( "Unable to open file, %s\n", &outFileName[0] );
7453 PrintHelp();
7454 return 1;
7455 }
7456 CloseOutFile( &outFp );
7457 }
7458 }
7459#endif
7460 else
7461 {
7462 PrintHelp();
7463 return 1;
7464 }
7465 }
7466 }
7467
7468 if( 0 == strcmp( outFileName, "" ) )
7469 {
7470 outFp = stdout;
7471 }
7472 else
7473 {
7474 outFp = 0;
7475 }
Will-nuc8619aca2015-12-10 17:20:26 -05007476
wcarthur007a1a92015-12-11 08:06:59 -05007477#if __linux || __unix
Will-nuc8619aca2015-12-10 17:20:26 -05007478 if( testLocalTcti )
7479 {
7480 TestLocalTCTI();
7481 }
wcarthur007a1a92015-12-11 08:06:59 -05007482#endif
Will Arthur54e04e42015-07-15 11:29:25 -04007483
7484 sprintf_s( rmInterfaceConfig, rmInterfaceConfigSize, "%s %d ", hostName, port );
7485
7486 rval = InitTctiResMgrContext( rmInterfaceConfig, &resMgrTctiContext, &resMgrInterfaceName[0] );
7487 if( rval != TSS2_RC_SUCCESS )
7488 {
7489 TpmClientPrintf( 0, "Resource Mgr, %s, failed initialization: 0x%x. Exiting...\n", resMgrInterfaceInfo.shortName, rval );
Will Arthur6aa5aa82015-08-20 17:55:22 -04007490#ifdef _WIN32
7491 WSACleanup();
7492#endif
7493 if( resMgrTctiContext != 0 )
7494 free( resMgrTctiContext );
7495
Will Arthur54e04e42015-07-15 11:29:25 -04007496 return( 1 );
7497 }
7498 else
7499 {
7500 (( TSS2_TCTI_CONTEXT_INTEL *)resMgrTctiContext )->status.debugMsgLevel = debugLevel;
Will-nuc8619aca2015-12-10 17:20:26 -05007501 resMgrInitialized = 1;
Will Arthur54e04e42015-07-15 11:29:25 -04007502 }
7503
7504 sysContext = InitSysContext( 0, resMgrTctiContext, &abiVersion );
7505 if( sysContext == 0 )
7506 {
7507 InitSysContextFailure();
7508 }
7509 else
7510 {
7511 TpmTest();
7512
7513 rval = TeardownTctiResMgrContext( rmInterfaceConfig, resMgrTctiContext, &resMgrInterfaceName[0] );
7514 CheckPassed( rval );
7515
7516 TeardownSysContext( &sysContext );
7517 }
7518
7519 return 0;
7520}
7521
7522