Skip to content

Commit 15add23

Browse files
committed
Add code for calculating NV extend policies. Fixed issue with wolfTPM2_PolicyHash where input digest could be too large.
1 parent 671b702 commit 15add23

File tree

2 files changed

+73
-53
lines changed

2 files changed

+73
-53
lines changed

examples/nvram/extend.c

Lines changed: 70 additions & 53 deletions
Original file line numberDiff line numberDiff line change
@@ -27,15 +27,17 @@
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
319336
int 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

src/tpm2_wrap.c

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7499,6 +7499,9 @@ int wolfTPM2_PolicyHash(TPM_ALG_ID hashAlg,
74997499

75007500
/* policyDigestOld */
75017501
if (rc == 0 && inSz > 0) {
7502+
/* old digest cannot be larger than digest size */
7503+
if (inSz > *digestSz)
7504+
inSz = *digestSz;
75027505
rc = wc_HashUpdate(&hash_ctx, hashType, digest, inSz);
75037506
}
75047507
/* Command Code (optional) */

0 commit comments

Comments
 (0)