Skip to content

Commit 070c2b7

Browse files
committed
F-3271 - https://fenrir.wolfssl.com/finding/3271 - Use TPM2_Packet_AppendSensitive in TPM2_LoadExternal and extend roundtrip test coverage
1 parent 76a2c6a commit 070c2b7

3 files changed

Lines changed: 73 additions & 37 deletions

File tree

src/fwtpm/fwtpm_command.c

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -434,7 +434,8 @@ static void FwLookupEntityAuth(FWTPM_CTX* ctx, TPM_HANDLE handle,
434434
* neither the trip count nor per-iteration work depends on the secret
435435
* authValSz. Trailing zeros on either side are treated as insignificant
436436
* (matches TCG reference for authValues padded to nameAlg digest size).
437-
* Returns 1 on mismatch, 0 on match. */
437+
* Returns 1 on mismatch, 0 on match. Precondition: pwSz and avSz must
438+
* each be <= TPM_MAX_DIGEST_SIZE; out-of-range inputs fail closed. */
438439
static int FwCtAuthCompare(const byte* password, int pwSz,
439440
const byte* authVal, int avSz)
440441
{
@@ -443,13 +444,19 @@ static int FwCtAuthCompare(const byte* password, int pwSz,
443444
volatile byte diff = 0;
444445
int ci;
445446

447+
if (pwSz < 0 || avSz < 0 ||
448+
pwSz > TPM_MAX_DIGEST_SIZE || avSz > TPM_MAX_DIGEST_SIZE) {
449+
return 1;
450+
}
451+
446452
XMEMSET(zeroAuth, 0, sizeof(zeroAuth));
447453
avPtr = (authVal != NULL) ? authVal : zeroAuth;
448454

449455
for (ci = 0; ci < TPM_MAX_DIGEST_SIZE; ci++) {
450-
/* 0xFF if ci < bound, else 0x00 (bounds are at most 64) */
451-
byte pwMask = (byte)-(((unsigned)(ci - pwSz)) >> 31);
452-
byte avMask = (byte)-(((unsigned)(ci - avSz)) >> 31);
456+
/* 0xFF if ci < bound, else 0x00. Use UINT32 (guaranteed 32-bit
457+
* wolfTPM typedef) so the >> 31 shift is always well-defined. */
458+
byte pwMask = (byte)-((UINT32)(ci - pwSz) >> 31);
459+
byte avMask = (byte)-((UINT32)(ci - avSz) >> 31);
453460
byte overlap = (byte)(pwMask & avMask);
454461
/* Overlap region: bytes must match */
455462
diff |= (byte)((password[ci] ^ avPtr[ci]) & overlap);

src/tpm2.c

Lines changed: 16 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -1304,10 +1304,11 @@ TPM_RC TPM2_PCR_Extend(PCR_Extend_In* in)
13041304
int i;
13051305
TPM2_Packet packet;
13061306
CmdInfo_t info = {0,0,0,0};
1307+
UINT32 count;
13071308
info.inHandleCnt = 1;
13081309
info.flags = (CMD_FLAG_AUTH_USER1);
13091310

1310-
UINT32 count = in->digests.count;
1311+
count = in->digests.count;
13111312
if (count > HASH_COUNT)
13121313
count = HASH_COUNT;
13131314

@@ -1723,34 +1724,14 @@ TPM_RC TPM2_LoadExternal(LoadExternal_In* in, LoadExternal_Out* out)
17231724
TPM2_Packet_Init(ctx, &packet);
17241725

17251726
st = TPM2_Packet_AppendAuth(&packet, ctx, &info);
1727+
/* Reading sensitive.any.size is valid regardless of sensitiveType:
1728+
* every TPM2B variant in TPMU_SENSITIVE_COMPOSITE has UINT16 size
1729+
* at offset 0, so the .any view reliably reflects the populated
1730+
* typed member (common-initial-sequence aliasing). */
17261731
if (in->inPrivate.sensitiveArea.authValue.size > 0 ||
17271732
in->inPrivate.sensitiveArea.seedValue.size > 0 ||
17281733
in->inPrivate.sensitiveArea.sensitive.any.size > 0) {
1729-
1730-
in->inPrivate.size = 2 + /* sensitiveType */
1731-
2 + in->inPrivate.sensitiveArea.authValue.size +
1732-
2 + in->inPrivate.sensitiveArea.seedValue.size +
1733-
2 + in->inPrivate.sensitiveArea.sensitive.any.size;
1734-
TPM2_Packet_AppendU16(&packet, in->inPrivate.size);
1735-
1736-
TPM2_Packet_AppendU16(&packet,
1737-
in->inPrivate.sensitiveArea.sensitiveType);
1738-
TPM2_Packet_AppendU16(&packet,
1739-
in->inPrivate.sensitiveArea.authValue.size);
1740-
TPM2_Packet_AppendBytes(&packet,
1741-
in->inPrivate.sensitiveArea.authValue.buffer,
1742-
in->inPrivate.sensitiveArea.authValue.size);
1743-
TPM2_Packet_AppendU16(&packet,
1744-
in->inPrivate.sensitiveArea.seedValue.size);
1745-
TPM2_Packet_AppendBytes(&packet,
1746-
in->inPrivate.sensitiveArea.seedValue.buffer,
1747-
in->inPrivate.sensitiveArea.seedValue.size);
1748-
1749-
TPM2_Packet_AppendU16(&packet,
1750-
in->inPrivate.sensitiveArea.sensitive.any.size);
1751-
TPM2_Packet_AppendBytes(&packet,
1752-
in->inPrivate.sensitiveArea.sensitive.any.buffer,
1753-
in->inPrivate.sensitiveArea.sensitive.any.size);
1734+
TPM2_Packet_AppendSensitive(&packet, &in->inPrivate);
17541735
}
17551736
else {
17561737
TPM2_Packet_AppendU16(&packet, 0);
@@ -3326,22 +3307,24 @@ TPM_RC TPM2_SetCommandCodeAuditStatus(SetCommandCodeAuditStatus_In* in)
33263307
int i;
33273308
TPM2_Packet packet;
33283309
CmdInfo_t info = {0,0,0,0};
3310+
UINT32 setCount;
3311+
UINT32 clearCount;
33293312
info.inHandleCnt = 1;
33303313
info.flags = (CMD_FLAG_AUTH_USER1);
33313314

3315+
setCount = in->setList.count;
3316+
clearCount = in->clearList.count;
3317+
if (setCount > MAX_CAP_CC)
3318+
setCount = MAX_CAP_CC;
3319+
if (clearCount > MAX_CAP_CC)
3320+
clearCount = MAX_CAP_CC;
3321+
33323322
TPM2_Packet_Init(ctx, &packet);
33333323

33343324
TPM2_Packet_AppendU32(&packet, in->auth);
33353325

33363326
TPM2_Packet_AppendAuth(&packet, ctx, &info);
33373327

3338-
UINT32 setCount = in->setList.count;
3339-
UINT32 clearCount = in->clearList.count;
3340-
if (setCount > MAX_CAP_CC)
3341-
setCount = MAX_CAP_CC;
3342-
if (clearCount > MAX_CAP_CC)
3343-
clearCount = MAX_CAP_CC;
3344-
33453328
TPM2_Packet_AppendU16(&packet, in->auditAlg);
33463329

33473330
TPM2_Packet_AppendU32(&packet, setCount);

tests/unit_tests.c

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2059,6 +2059,52 @@ static void test_TPM2_Sensitive_Roundtrip(void)
20592059
AssertIntEQ(XMEMCMP(sensOut.sensitiveArea.sensitive.ecc.buffer,
20602060
rsaPriv, sizeof(rsaPriv)), 0);
20612061

2062+
/* KEYEDHASH sensitive roundtrip */
2063+
XMEMSET(&sensIn, 0, sizeof(sensIn));
2064+
sensIn.sensitiveArea.sensitiveType = TPM_ALG_KEYEDHASH;
2065+
sensIn.sensitiveArea.sensitive.bits.size = sizeof(rsaPriv);
2066+
XMEMCPY(sensIn.sensitiveArea.sensitive.bits.buffer, rsaPriv,
2067+
sizeof(rsaPriv));
2068+
2069+
XMEMSET(buf, 0, sizeof(buf));
2070+
XMEMSET(&packet, 0, sizeof(packet));
2071+
packet.buf = buf;
2072+
packet.size = sizeof(buf);
2073+
2074+
TPM2_Packet_AppendSensitive(&packet, &sensIn);
2075+
2076+
packet.pos = 0;
2077+
XMEMSET(&sensOut, 0, sizeof(sensOut));
2078+
TPM2_Packet_ParseSensitive(&packet, &sensOut);
2079+
2080+
AssertIntEQ(sensOut.sensitiveArea.sensitiveType, TPM_ALG_KEYEDHASH);
2081+
AssertIntEQ(sensOut.sensitiveArea.sensitive.bits.size, sizeof(rsaPriv));
2082+
AssertIntEQ(XMEMCMP(sensOut.sensitiveArea.sensitive.bits.buffer,
2083+
rsaPriv, sizeof(rsaPriv)), 0);
2084+
2085+
/* SYMCIPHER sensitive roundtrip */
2086+
XMEMSET(&sensIn, 0, sizeof(sensIn));
2087+
sensIn.sensitiveArea.sensitiveType = TPM_ALG_SYMCIPHER;
2088+
sensIn.sensitiveArea.sensitive.sym.size = sizeof(rsaPriv);
2089+
XMEMCPY(sensIn.sensitiveArea.sensitive.sym.buffer, rsaPriv,
2090+
sizeof(rsaPriv));
2091+
2092+
XMEMSET(buf, 0, sizeof(buf));
2093+
XMEMSET(&packet, 0, sizeof(packet));
2094+
packet.buf = buf;
2095+
packet.size = sizeof(buf);
2096+
2097+
TPM2_Packet_AppendSensitive(&packet, &sensIn);
2098+
2099+
packet.pos = 0;
2100+
XMEMSET(&sensOut, 0, sizeof(sensOut));
2101+
TPM2_Packet_ParseSensitive(&packet, &sensOut);
2102+
2103+
AssertIntEQ(sensOut.sensitiveArea.sensitiveType, TPM_ALG_SYMCIPHER);
2104+
AssertIntEQ(sensOut.sensitiveArea.sensitive.sym.size, sizeof(rsaPriv));
2105+
AssertIntEQ(XMEMCMP(sensOut.sensitiveArea.sensitive.sym.buffer,
2106+
rsaPriv, sizeof(rsaPriv)), 0);
2107+
20622108
printf("Test TPM Wrapper:\tSensitive roundtrip:\t\tPassed\n");
20632109
}
20642110

0 commit comments

Comments
 (0)