F-2533 - https://fenrir.wolfssl.com/finding/2533 - Add TPM2_Packet_ParseSensitive counterpart and roundtrip test

pull/488/head
Aidan 2026-04-17 15:39:54 -07:00
parent 07924bf158
commit adc2713145
3 changed files with 113 additions and 1 deletions

View File

@ -825,6 +825,45 @@ void TPM2_Packet_AppendSensitive(TPM2_Packet* packet, TPM2B_SENSITIVE* sensitive
TPM2_Packet_PlaceU16(packet, tmpSz);
}
void TPM2_Packet_ParseSensitive(TPM2_Packet* packet, TPM2B_SENSITIVE* sensitive)
{
TPMU_SENSITIVE_COMPOSITE* sens = &sensitive->sensitiveArea.sensitive;
TPM2_Packet_ParseU16(packet, &sensitive->size);
if (sensitive->size == 0) {
return;
}
TPM2_Packet_ParseU16(packet, &sensitive->sensitiveArea.sensitiveType);
TPM2_Packet_ParseU16Buf(packet, &sensitive->sensitiveArea.authValue.size,
sensitive->sensitiveArea.authValue.buffer,
(UINT16)sizeof(sensitive->sensitiveArea.authValue.buffer));
TPM2_Packet_ParseU16Buf(packet, &sensitive->sensitiveArea.seedValue.size,
sensitive->sensitiveArea.seedValue.buffer,
(UINT16)sizeof(sensitive->sensitiveArea.seedValue.buffer));
switch (sensitive->sensitiveArea.sensitiveType) {
case TPM_ALG_RSA:
TPM2_Packet_ParseU16Buf(packet, &sens->rsa.size,
sens->rsa.buffer, (UINT16)sizeof(sens->rsa.buffer));
break;
case TPM_ALG_ECC:
TPM2_Packet_ParseU16Buf(packet, &sens->ecc.size,
sens->ecc.buffer, (UINT16)sizeof(sens->ecc.buffer));
break;
case TPM_ALG_KEYEDHASH:
TPM2_Packet_ParseU16Buf(packet, &sens->bits.size,
sens->bits.buffer, (UINT16)sizeof(sens->bits.buffer));
break;
case TPM_ALG_SYMCIPHER:
TPM2_Packet_ParseU16Buf(packet, &sens->sym.size,
sens->sym.buffer, (UINT16)sizeof(sens->sym.buffer));
break;
}
}
void TPM2_Packet_AppendSensitiveCreate(TPM2_Packet* packet, TPM2B_SENSITIVE_CREATE* sensitive)
{
int tmpSz = 0;

View File

@ -1944,6 +1944,77 @@ static void test_TPM2_Signature_EcSchnorrSm2Serialize(void)
printf("Test TPM Wrapper:\tSignature ECSCHNORR/SM2 serialize:\tPassed\n");
}
static void test_TPM2_Sensitive_Roundtrip(void)
{
TPM2_Packet packet;
byte buf[512];
TPM2B_SENSITIVE sensIn, sensOut;
const byte authBuf[4] = {0x01, 0x02, 0x03, 0x04};
const byte seedBuf[8] = {0xaa, 0xbb, 0xcc, 0xdd, 0xee, 0xff, 0x00, 0x11};
const byte rsaPriv[16] = {
0xde, 0xad, 0xbe, 0xef, 0x11, 0x22, 0x33, 0x44,
0x55, 0x66, 0x77, 0x88, 0x99, 0xaa, 0xbb, 0xcc
};
/* RSA sensitive roundtrip */
XMEMSET(&sensIn, 0, sizeof(sensIn));
sensIn.sensitiveArea.sensitiveType = TPM_ALG_RSA;
sensIn.sensitiveArea.authValue.size = sizeof(authBuf);
XMEMCPY(sensIn.sensitiveArea.authValue.buffer, authBuf, sizeof(authBuf));
sensIn.sensitiveArea.seedValue.size = sizeof(seedBuf);
XMEMCPY(sensIn.sensitiveArea.seedValue.buffer, seedBuf, sizeof(seedBuf));
sensIn.sensitiveArea.sensitive.rsa.size = sizeof(rsaPriv);
XMEMCPY(sensIn.sensitiveArea.sensitive.rsa.buffer, rsaPriv,
sizeof(rsaPriv));
XMEMSET(buf, 0, sizeof(buf));
XMEMSET(&packet, 0, sizeof(packet));
packet.buf = buf;
packet.size = sizeof(buf);
TPM2_Packet_AppendSensitive(&packet, &sensIn);
packet.pos = 0;
XMEMSET(&sensOut, 0, sizeof(sensOut));
TPM2_Packet_ParseSensitive(&packet, &sensOut);
AssertIntEQ(sensOut.sensitiveArea.sensitiveType, TPM_ALG_RSA);
AssertIntEQ(sensOut.sensitiveArea.authValue.size, sizeof(authBuf));
AssertIntEQ(XMEMCMP(sensOut.sensitiveArea.authValue.buffer,
authBuf, sizeof(authBuf)), 0);
AssertIntEQ(sensOut.sensitiveArea.seedValue.size, sizeof(seedBuf));
AssertIntEQ(XMEMCMP(sensOut.sensitiveArea.seedValue.buffer,
seedBuf, sizeof(seedBuf)), 0);
AssertIntEQ(sensOut.sensitiveArea.sensitive.rsa.size, sizeof(rsaPriv));
AssertIntEQ(XMEMCMP(sensOut.sensitiveArea.sensitive.rsa.buffer,
rsaPriv, sizeof(rsaPriv)), 0);
/* ECC sensitive roundtrip */
XMEMSET(&sensIn, 0, sizeof(sensIn));
sensIn.sensitiveArea.sensitiveType = TPM_ALG_ECC;
sensIn.sensitiveArea.sensitive.ecc.size = sizeof(rsaPriv);
XMEMCPY(sensIn.sensitiveArea.sensitive.ecc.buffer, rsaPriv,
sizeof(rsaPriv));
XMEMSET(buf, 0, sizeof(buf));
XMEMSET(&packet, 0, sizeof(packet));
packet.buf = buf;
packet.size = sizeof(buf);
TPM2_Packet_AppendSensitive(&packet, &sensIn);
packet.pos = 0;
XMEMSET(&sensOut, 0, sizeof(sensOut));
TPM2_Packet_ParseSensitive(&packet, &sensOut);
AssertIntEQ(sensOut.sensitiveArea.sensitiveType, TPM_ALG_ECC);
AssertIntEQ(sensOut.sensitiveArea.sensitive.ecc.size, sizeof(rsaPriv));
AssertIntEQ(XMEMCMP(sensOut.sensitiveArea.sensitive.ecc.buffer,
rsaPriv, sizeof(rsaPriv)), 0);
printf("Test TPM Wrapper:\tSensitive roundtrip:\t\tPassed\n");
}
static void test_KeySealTemplate(void)
{
int rc;
@ -3094,6 +3165,7 @@ int unit_tests(int argc, char *argv[])
test_TPM2_SchemeSerialize();
test_TPM2_KeyedHashScheme_XorSerialize();
test_TPM2_Signature_EcSchnorrSm2Serialize();
test_TPM2_Sensitive_Roundtrip();
test_KeySealTemplate();
test_SealAndKeyedHash_Boundaries();
test_GetAlgId();

View File

@ -197,7 +197,8 @@ WOLFTPM_LOCAL void TPM2_Packet_AppendEccPoint(TPM2_Packet* packet, TPMS_ECC_POIN
WOLFTPM_LOCAL void TPM2_Packet_ParseEccPoint(TPM2_Packet* packet, TPMS_ECC_POINT* point);
WOLFTPM_LOCAL void TPM2_Packet_AppendPoint(TPM2_Packet* packet, TPM2B_ECC_POINT* point);
WOLFTPM_LOCAL void TPM2_Packet_ParsePoint(TPM2_Packet* packet, TPM2B_ECC_POINT* point);
WOLFTPM_LOCAL void TPM2_Packet_AppendSensitive(TPM2_Packet* packet, TPM2B_SENSITIVE* sensitive);
WOLFTPM_TEST_API void TPM2_Packet_AppendSensitive(TPM2_Packet* packet, TPM2B_SENSITIVE* sensitive);
WOLFTPM_TEST_API void TPM2_Packet_ParseSensitive(TPM2_Packet* packet, TPM2B_SENSITIVE* sensitive);
WOLFTPM_LOCAL void TPM2_Packet_AppendSensitiveCreate(TPM2_Packet* packet, TPM2B_SENSITIVE_CREATE* sensitive);
#ifdef WOLFTPM_FWTPM
/*!