From dfb65753e1e7cdbb6448e60003e540d2b86e65c4 Mon Sep 17 00:00:00 2001 From: Dimitar Tomov Date: Fri, 5 Mar 2021 17:54:29 +0200 Subject: [PATCH] Add TPM2_PrintPublicArea to help debugging Signed-off-by: Dimitar Tomov --- src/tpm2.c | 81 +++++++++++++++++++++++++++++++++++++++++++++++++ src/tpm2_wrap.c | 1 + wolftpm/tpm2.h | 2 ++ 3 files changed, 84 insertions(+) diff --git a/src/tpm2.c b/src/tpm2.c index 3958157..2ce263b 100644 --- a/src/tpm2.c +++ b/src/tpm2.c @@ -5785,6 +5785,87 @@ void TPM2_PrintAuth(const TPMS_AUTH_COMMAND* authCmd) printf("hmacSize=%u hmacBuffer:\n", authCmd->hmac.size); TPM2_PrintBin(authCmd->hmac.buffer, authCmd->hmac.size); } + +void TPM2_PrintPublicArea(const TPM2B_PUBLIC* pub) +{ + printf("publicArea:\n"); + printf("Total public area size is = %d\n", pub->size); + /* Sanity check */ + if (pub->size > (sizeof(TPM2B_PUBLIC)) || pub->size == 0) { + printf("Incorrect publicArea size. Aborting debug print\n"); + return; + } + printf("algType = 0x%2.2X\n", pub->publicArea.type); + printf("nameAlg = 0x%2.2X\n", pub->publicArea.nameAlg); + printf("objectAttributes = 0x%X\n", pub->publicArea.objectAttributes); + printf("authPolicy size = %d\n", pub->publicArea.authPolicy.size); + /* authPolicy is optional */ + if (pub->publicArea.authPolicy.size > 0 && + pub->publicArea.authPolicy.size < sizeof(pub->publicArea.authPolicy)) { + TPM2_PrintBin(pub->publicArea.authPolicy.buffer, + pub->publicArea.authPolicy.size); + } + else { + printf("authPolicy size is incorrect = %d\n", pub->publicArea.authPolicy.size); + } + /* parameters and unique field depend on algType */ + switch(pub->publicArea.type) { + case TPM_ALG_KEYEDHASH: + printf("KeyedHash scheme = 0x%2.2X\n", pub->publicArea.parameters.keyedHashDetail.scheme.scheme); + printf("KeyedHash details = 0x%2.2X\n", pub->publicArea.parameters.keyedHashDetail.scheme.details.hmac.hashAlg); + + printf("KeyedHash unique\n"); + TPM2_PrintBin(pub->publicArea.unique.keyedHash.buffer, pub->publicArea.unique.keyedHash.size); + break; + + case TPM_ALG_SYMCIPHER: + printf("symDetail algorithm = 0x%2.2X\n", pub->publicArea.parameters.symDetail.sym.algorithm); + printf("symDetail keyBits = 0x%2.2X\n", pub->publicArea.parameters.symDetail.sym.keyBits.sym); + printf("symDetail mode = 0x%2.2X\n", pub->publicArea.parameters.symDetail.sym.mode.sym); + + printf("symDetail unique\n"); + TPM2_PrintBin(pub->publicArea.unique.sym.buffer, pub->publicArea.unique.sym.size); + break; + + case TPM_ALG_RSA: + printf("rsaDetail algorithm = 0x%2.2X\n", pub->publicArea.parameters.rsaDetail.symmetric.algorithm); + printf("rsaDetail keyBits = 0x%2.2X\n", pub->publicArea.parameters.rsaDetail.symmetric.keyBits.sym); + printf("rsaDetail mode = 0x%2.2X\n", pub->publicArea.parameters.rsaDetail.symmetric.mode.sym); + printf("rsaDetail scheme = 0x%2.2X\n", pub->publicArea.parameters.rsaDetail.scheme.scheme); + printf("rsaDetail scheme details = 0x%2.2X\n", pub->publicArea.parameters.rsaDetail.scheme.details.anySig.hashAlg); + printf("rsaDetail keyBits = 0x%2.2X\n", pub->publicArea.parameters.rsaDetail.keyBits); + printf("rsaDetail exponent = 0x%X\n", pub->publicArea.parameters.rsaDetail.exponent); + + printf("RSA Detail unique\n"); + TPM2_PrintBin(pub->publicArea.unique.rsa.buffer, pub->publicArea.unique.rsa.size); + break; + + case TPM_ALG_ECC: + printf("eccDetail algorithm = 0x%2.2X\n", pub->publicArea.parameters.eccDetail.symmetric.algorithm); + printf("eccDetail keyBits = 0x%2.2X\n", pub->publicArea.parameters.eccDetail.symmetric.keyBits.sym); + printf("eccDetail mode = 0x%2.2X\n", pub->publicArea.parameters.eccDetail.symmetric.mode.sym); + printf("eccDetail scheme = 0x%2.2X\n", pub->publicArea.parameters.eccDetail.scheme.scheme); + printf("eccDetail scheme details = 0x%2.2X\n", pub->publicArea.parameters.eccDetail.scheme.details.any.hashAlg); + printf("eccDetail curveID = 0x%2.2X\n", pub->publicArea.parameters.eccDetail.curveID); + printf("eccDetail KDF scheme = 0x%X\n", pub->publicArea.parameters.eccDetail.kdf.scheme); + printf("eccDetail KDF details = 0x%X\n", pub->publicArea.parameters.eccDetail.kdf.details.any.hashAlg); + + printf("ECC Detail unique X\n"); + TPM2_PrintBin(pub->publicArea.unique.ecc.x.buffer, pub->publicArea.unique.ecc.x.size); + printf("ECC Detail unique Y\n"); + TPM2_PrintBin(pub->publicArea.unique.ecc.y.buffer, pub->publicArea.unique.ecc.y.size); + break; + + default: + /* derive does not seem to have specific fields in the parameters struct */ + printf("Derive unique label\n"); + TPM2_PrintBin(pub->publicArea.unique.derive.label.buffer, pub->publicArea.unique.derive.label.size); + printf("Derive unique context\n"); + TPM2_PrintBin(pub->publicArea.unique.derive.context.buffer, pub->publicArea.unique.derive.context.size); + break; + } + +} #endif /******************************************************************************/ diff --git a/src/tpm2_wrap.c b/src/tpm2_wrap.c index 384507a..50760f2 100644 --- a/src/tpm2_wrap.c +++ b/src/tpm2_wrap.c @@ -955,6 +955,7 @@ int wolfTPM2_CreateKey(WOLFTPM2_DEV* dev, WOLFTPM2_KEYBLOB* keyBlob, printf("TPM2_Create key: pub %d, priv %d\n", createOut.outPublic.size, createOut.outPrivate.size); TPM2_PrintBin(createOut.outPrivate.buffer, createOut.outPrivate.size); + TPM2_PrintPublicArea(&createOut.outPublic); #endif keyBlob->handle.auth = createIn.inSensitive.sensitive.userAuth; diff --git a/wolftpm/tpm2.h b/wolftpm/tpm2.h index b38a15a..4280823 100644 --- a/wolftpm/tpm2.h +++ b/wolftpm/tpm2.h @@ -2821,9 +2821,11 @@ WOLFTPM_API UINT16 TPM2_GetVendorID(void); #ifdef DEBUG_WOLFTPM WOLFTPM_API void TPM2_PrintBin(const byte* buffer, word32 length); WOLFTPM_API void TPM2_PrintAuth(const TPMS_AUTH_COMMAND* authCmd); +WOLFTPM_API void TPM2_PrintPublicArea(const TPM2B_PUBLIC* pub); #else #define TPM2_PrintBin(b, l) #define TPM2_PrintAuth(b, l) +#define TPM2_PrintPublicArea(b) #endif #ifdef __cplusplus