2727#endif
2828
2929#include <wolftpm/tpm2_wrap.h>
30+ #include <wolftpm/tpm2_packet.h>
3031#include <stdio.h>
3132
32- #ifndef WOLFTPM2_NO_WRAPPER
33+ #if !defined( WOLFTPM2_NO_WRAPPER ) && !defined( WOLFTPM2_NO_WOLFCRYPT )
3334
3435#include <examples/nvram/nvram.h>
3536#include <hal/tpm_io.h>
3637#include <examples/tpm_test.h>
3738#include <examples/tpm_test_keys.h>
3839
40+
3941/******************************************************************************/
4042/* --- BEGIN TPM NVRAM Extend Example -- */
4143/******************************************************************************/
@@ -48,50 +50,26 @@ static void usage(void)
4850 printf ("* -aes/xor: Use Parameter Encryption\n" );;
4951}
5052
51- /* Policy A: TPM2_PolicyCommandCode -> TPM_CC_NV_Read */
52- static const byte policyA [] = {
53- 0x47 , 0xCE , 0x30 , 0x32 , 0xD8 , 0xBA , 0xD1 , 0xF3 ,
54- 0x08 , 0x9C , 0xB0 , 0xC0 , 0x90 , 0x88 , 0xDE , 0x43 ,
55- 0x50 , 0x14 , 0x91 , 0xD4 , 0x60 , 0x40 , 0x2B , 0x90 ,
56- 0xCD , 0x1B , 0x7F , 0xC0 , 0xB6 , 0x8C , 0xA9 , 0x2F
57- };
58- /* Policy B: TPM2_PolicyCommandCode -> TPM_CC_NV_Extend */
59- static const byte policyB [] = {
60- 0xB6 , 0xA2 , 0xE7 , 0x14 , 0x2E , 0xE5 , 0x6F , 0xD9 ,
61- 0x78 , 0x04 , 0x74 , 0x88 , 0x48 , 0x3D , 0xAA , 0x5B ,
62- 0x42 , 0xB8 , 0xDC , 0x4C , 0xC7 , 0xDD , 0xCC , 0xED ,
63- 0xDF , 0xB9 , 0x17 , 0x93 , 0xCF , 0x1F , 0xF1 , 0xB7
64- };
65- /* Policy C: TPM2_PolicyCommandCode -> TPM_CC_PolicyNV */
66- static const byte policyC [] = {
67- 0x20 , 0x3E , 0x4B , 0xD5 , 0xD0 , 0x44 , 0x8C , 0x96 ,
68- 0x15 , 0xCC , 0x13 , 0xFA , 0x18 , 0xE8 , 0xD3 , 0x92 ,
69- 0x22 , 0x44 , 0x1C , 0xC4 , 0x02 , 0x04 , 0xD9 , 0x9A ,
70- 0x77 , 0x26 , 0x20 , 0x68 , 0xDB , 0xD5 , 0x5A , 0x43
71- };
72-
73- /* pre-computed policy:
74- * NV Read (A), NV Extend (B), PolicyNV (C), then policy OR (A/B/C) */
75- static const byte policyNv [] = {
76- 0x7F , 0x17 , 0x93 , 0x7E , 0x20 , 0x62 , 0x79 , 0xA3 ,
77- 0xF7 , 0x55 , 0xFB , 0x60 , 0xF4 , 0x0C , 0xF1 , 0x26 ,
78- 0xB7 , 0x0E , 0x5B , 0x1D , 0x9B , 0xF2 , 0x02 , 0x86 ,
79- 0x6D , 0x52 , 0x76 , 0x13 , 0x87 , 0x4A , 0x64 , 0xAC
80- };
81-
82-
83- static int PolicyOrApply (WOLFTPM2_DEV * dev , WOLFTPM2_SESSION * policySession )
53+ static int BuildPolicyCommandCode (TPMI_ALG_HASH hashAlg ,
54+ byte * digest , word32 * digestSz , TPM_CC cc )
55+ {
56+ word32 val = cpu_to_be32 (cc );
57+ return wolfTPM2_PolicyHash (hashAlg , digest , digestSz ,
58+ TPM_CC_PolicyCommandCode , (byte * )& val , sizeof (val ));
59+ }
60+
61+ static int PolicyOrApply (WOLFTPM2_DEV * dev , WOLFTPM2_SESSION * policySession ,
62+ byte * * hashList , word32 hashListSz , word32 digestSz )
8463{
64+ word32 i ;
8565 PolicyOR_In policyOR ;
8666 XMEMSET (& policyOR , 0 , sizeof (policyOR ));
8767 policyOR .policySession = policySession -> handle .hndl ;
88- policyOR .pHashList .count = 3 ;
89- policyOR .pHashList .digests [0 ].size = sizeof (policyA );
90- XMEMCPY (policyOR .pHashList .digests [0 ].buffer , policyA , sizeof (policyA ));
91- policyOR .pHashList .digests [1 ].size = sizeof (policyB );
92- XMEMCPY (policyOR .pHashList .digests [1 ].buffer , policyB , sizeof (policyB ));
93- policyOR .pHashList .digests [2 ].size = sizeof (policyC );
94- XMEMCPY (policyOR .pHashList .digests [2 ].buffer , policyC , sizeof (policyC ));
68+ policyOR .pHashList .count = hashListSz ;
69+ for (i = 0 ; i < hashListSz ; i ++ ) {
70+ policyOR .pHashList .digests [i ].size = digestSz ;
71+ XMEMCPY (policyOR .pHashList .digests [i ].buffer , hashList [i ], digestSz );
72+ }
9573 (void )dev ;
9674 return TPM2_PolicyOR (& policyOR );
9775}
@@ -109,11 +87,15 @@ int TPM2_NVRAM_Extend_Example(void* userCtx, int argc, char *argv[])
10987 int paramEncAlg = TPM_ALG_CFB ;
11088 TPMI_RH_NV_AUTH authHandle = TPM_RH_PLATFORM ;
11189 word32 nvIndex = TPM2_DEMO_NVRAM_EXTEND_INDEX ;
112- word32 nvSize ; /* 32 for SHA2-256 */
11390 byte * auth = (byte * )"cpusecret" ;
11491 word32 authSz = (word32 )XSTRLEN ((const char * )auth );
115- byte nvDigest [32 ];
116- word32 nvDigestSz = (word32 )sizeof (nvDigest );
92+ TPMI_ALG_HASH hashAlg = WOLFTPM2_WRAP_DIGEST ;
93+ word32 nvSize = TPM2_GetHashDigestSize (hashAlg );
94+ byte nvDigest [TPM_MAX_DIGEST_SIZE ]; /* buffer for nv read */
95+ byte policyDigest [3 * TPM_MAX_DIGEST_SIZE ]; /* Policy A/B/C */
96+ word32 policyDigestSz = 0 ;
97+ byte * policy [3 ]; /* pointers to policy A/B/C */
98+ byte policyOr [TPM_MAX_DIGEST_SIZE ];
11799
118100 if (argc >= 2 ) {
119101 if (XSTRCMP (argv [1 ], "-?" ) == 0 ||
@@ -166,13 +148,48 @@ int TPM2_NVRAM_Extend_Example(void* userCtx, int argc, char *argv[])
166148 XMEMSET (& bind , 0 , sizeof (bind ));
167149 XMEMSET (& nv , 0 , sizeof (nv ));
168150 XMEMSET (& nvAuth , 0 , sizeof (nvAuth ));
151+ XMEMSET (nvDigest , 0 , sizeof (nvDigest ));
152+ XMEMSET (policyDigest , 0 , sizeof (policyDigest ));
169153
170154 rc = wolfTPM2_Init (& dev , TPM2_IoCb , userCtx );
171155 if (rc != TPM_RC_SUCCESS ) {
172156 printf ("wolfTPM2_Init failed\n" );
173157 goto exit ;
174158 }
175159
160+ /* Build Policies A/B/C */
161+ /* Policy A: TPM2_PolicyCommandCode -> TPM_CC_NV_Read */
162+ /* 47ce3032d8bad1f3089cb0c09088de43501491d460402b90cd1b7fc0b68ca92f */
163+ policy [0 ] = & policyDigest [policyDigestSz ];
164+ BuildPolicyCommandCode (hashAlg , policy [0 ], & nvSize , TPM_CC_NV_Read );
165+ printf ("PolicyA: %d\n" , nvSize );
166+ TPM2_PrintBin (policy [0 ], nvSize );
167+ policyDigestSz += nvSize ;
168+
169+ /* Policy B: TPM2_PolicyCommandCode -> TPM_CC_NV_Extend */
170+ /* b6a2e7142ee56fd978047488483daa5b42b8dc4cc7ddcceddfb91793cf1ff1b7 */
171+ policy [1 ] = & policyDigest [policyDigestSz ];
172+ BuildPolicyCommandCode (hashAlg , policy [1 ], & nvSize , TPM_CC_NV_Extend );
173+ printf ("PolicyB: %d\n" , nvSize );
174+ TPM2_PrintBin (policy [1 ], nvSize );
175+ policyDigestSz += nvSize ;
176+
177+ /* Policy C: TPM2_PolicyCommandCode -> TPM_CC_PolicyNV */
178+ /* 203e4bd5d0448c9615cc13fa18e8d39222441cc40204d99a77262068dbd55a43 */
179+ policy [2 ] = & policyDigest [policyDigestSz ];
180+ BuildPolicyCommandCode (hashAlg , policy [2 ], & nvSize , TPM_CC_PolicyNV );
181+ printf ("PolicyC: %d\n" , nvSize );
182+ TPM2_PrintBin (policy [2 ], nvSize );
183+ policyDigestSz += nvSize ;
184+
185+ /* Policy OR A/B/C */
186+ /* 7f17937e206279a3f755fb60f40cf126b70e5b1d9bf202866d527613874a64ac */
187+ XMEMSET (policyOr , 0 , sizeof (policyOr ));
188+ rc = wolfTPM2_PolicyHash (hashAlg , policyOr , & nvSize ,
189+ TPM_CC_PolicyOR , policyDigest , policyDigestSz );
190+ printf ("PolicyOR A/B/C: %d\n" , nvSize );
191+ TPM2_PrintBin (policyOr , nvSize );
192+
176193 /* 1: Create EK (RSA or ECC) */
177194 rc = wolfTPM2_CreateEK (& dev , & endorse ,
178195 #ifndef NO_RSA
@@ -227,7 +244,7 @@ int TPM2_NVRAM_Extend_Example(void* userCtx, int argc, char *argv[])
227244 nvAttributes , /* needs TPM_NT_EXTEND set */
228245 nvSize , /* must match nameAlg digest size */
229246 auth , authSz , /* the password to bind session with */
230- policyNv , ( word32 ) sizeof ( policyNv )
247+ policyOr , nvSize
231248 );
232249 }
233250
@@ -255,7 +272,7 @@ int TPM2_NVRAM_Extend_Example(void* userCtx, int argc, char *argv[])
255272 /* 5. Satisfy policy for NV Extend (policy B) */
256273 rc = wolfTPM2_PolicyCommandCode (& dev , & tpmSession , TPM_CC_NV_Extend );
257274 if (rc == 0 ) {
258- rc = PolicyOrApply (& dev , & tpmSession );
275+ rc = PolicyOrApply (& dev , & tpmSession , policy , 3 , nvSize );
259276 }
260277 if (rc != 0 ) {
261278 printf ("Failed to apply policy B\n" );
@@ -280,7 +297,7 @@ int TPM2_NVRAM_Extend_Example(void* userCtx, int argc, char *argv[])
280297 /* 8. Satisfy policy for NV Read (policy A) */
281298 rc = wolfTPM2_PolicyCommandCode (& dev , & tpmSession , TPM_CC_NV_Read );
282299 if (rc == 0 ) {
283- rc = PolicyOrApply (& dev , & tpmSession );
300+ rc = PolicyOrApply (& dev , & tpmSession , policy , 3 , nvSize );
284301 }
285302 if (rc != 0 ) {
286303 printf ("Failed to apply policy A\n" );
@@ -289,10 +306,10 @@ int TPM2_NVRAM_Extend_Example(void* userCtx, int argc, char *argv[])
289306
290307 /* 9. Read NV extend digest */
291308 rc = wolfTPM2_NVRead (& dev , authHandle , nv .handle .hndl ,
292- nvDigest , & nvDigestSz , 0 );
309+ nvDigest , & nvSize , 0 );
293310 if (rc == 0 ) {
294- printf ("NV Digest: %d\n" , nvDigestSz );
295- TPM2_PrintBin (nvDigest , nvDigestSz );
311+ printf ("NV Digest: %d\n" , nvSize );
312+ TPM2_PrintBin (nvDigest , nvSize );
296313
297314 /* Should be:
298315 * 0ad80f8e4450587760d9137df41c9374f657bafa621fe37d4d5c8cecf0bcce5e */
@@ -313,17 +330,17 @@ int TPM2_NVRAM_Extend_Example(void* userCtx, int argc, char *argv[])
313330/******************************************************************************/
314331/* --- END TPM NVRAM Extend Example -- */
315332/******************************************************************************/
316- #endif /* !WOLFTPM2_NO_WRAPPER */
333+ #endif /* !WOLFTPM2_NO_WRAPPER && !WOLFTPM2_NO_WOLFCRYPT */
317334
318335#ifndef NO_MAIN_DRIVER
319336int main (int argc , char * argv [])
320337{
321338 int rc = NOT_COMPILED_IN ;
322339
323- #ifndef WOLFTPM2_NO_WRAPPER
340+ #if !defined( WOLFTPM2_NO_WRAPPER ) && !defined( WOLFTPM2_NO_WOLFCRYPT )
324341 rc = TPM2_NVRAM_Extend_Example (NULL , argc , argv );
325342#else
326- printf ("NVRAM code not compiled in\n" );
343+ printf ("NVRAM extend code not compiled in\n" );
327344 (void )argc ;
328345 (void )argv ;
329346#endif
0 commit comments