From 6dcb416ddf5c05bb62b507370643985a51b9df1f Mon Sep 17 00:00:00 2001 From: Stefan Berger Date: Tue, 12 Dec 2023 21:14:45 -0500 Subject: [PATCH] rev180: Add VendorInfo.c and use its functions Signed-off-by: Stefan Berger --- src/Makefile.am | 2 +- src/tpm2/GpMacros.h | 1 - src/tpm2/Manufacture.c | 9 +- src/tpm2/PropertyCap.c | 26 +--- src/tpm2/TpmFail.c | 44 +----- src/tpm2/VendorInfo.c | 214 +++++++++++++++++++++++++++ src/tpm2/VendorString.h | 108 -------------- src/tpm2/tpm_to_platform_interface.h | 12 +- src/tpm_tpm2_interface.c | 4 +- 9 files changed, 243 insertions(+), 177 deletions(-) create mode 100644 src/tpm2/VendorInfo.c delete mode 100644 src/tpm2/VendorString.h diff --git a/src/Makefile.am b/src/Makefile.am index 3f51fff1..995ddd2f 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -274,6 +274,7 @@ libtpms_tpm2_la_SOURCES = \ tpm2/TpmFail.c \ tpm2/Unique.c \ tpm2/Unmarshal.c \ + tpm2/VendorInfo.c \ tpm2/Vendor_TCG_Test.c \ tpm2/X509_ECC.c \ tpm2/X509_RSA.c \ @@ -522,7 +523,6 @@ noinst_HEADERS += \ tpm2/Unmarshal_fp.h \ tpm2/Unseal_fp.h \ tpm2/VendorInfo.h \ - tpm2/VendorString.h \ tpm2/Vendor_TCG_Test_fp.h \ tpm2/VerifySignature_fp.h \ tpm2/X509.h \ diff --git a/src/tpm2/GpMacros.h b/src/tpm2/GpMacros.h index fbb69e50..4b60e1c1 100644 --- a/src/tpm2/GpMacros.h +++ b/src/tpm2/GpMacros.h @@ -70,7 +70,6 @@ #include "endian_swap.h" #include "VendorInfo.h" -#include "VendorString.h" // libtpms: temporary //** For Self-test // These macros are used in CryptUtil to invoke the incremental self test. diff --git a/src/tpm2/Manufacture.c b/src/tpm2/Manufacture.c index db506677..ce5494c1 100644 --- a/src/tpm2/Manufacture.c +++ b/src/tpm2/Manufacture.c @@ -145,12 +145,9 @@ TPM_Manufacture( orderlyShutdown = TPM_SU_CLEAR; NV_WRITE_PERSISTENT(orderlyState, orderlyShutdown); // initialize the firmware version - gp.firmwareV1 = FIRMWARE_V1; -#ifdef FIRMWARE_V2 - gp.firmwareV2 = FIRMWARE_V2; -#else - gp.firmwareV2 = 0; -#endif + gp.firmwareV1 = _plat__GetTpmFirmwareVersionHigh(); + gp.firmwareV2 = _plat__GetTpmFirmwareVersionLow(); + NV_SYNC_PERSISTENT(firmwareV1); NV_SYNC_PERSISTENT(firmwareV2); diff --git a/src/tpm2/PropertyCap.c b/src/tpm2/PropertyCap.c index 301789fa..507d96d2 100644 --- a/src/tpm2/PropertyCap.c +++ b/src/tpm2/PropertyCap.c @@ -105,40 +105,26 @@ TPMPropertyIsDefined( *value = TPM_SPEC_YEAR; break; case TPM_PT_MANUFACTURER: + *value = _plat__GetManufacturerCapabilityCode(); // vendor ID unique to each TPM manufacturer - *value = BYTE_ARRAY_TO_UINT32(MANUFACTURER); break; case TPM_PT_VENDOR_STRING_1: // first four characters of the vendor ID string - *value = BYTE_ARRAY_TO_UINT32(VENDOR_STRING_1); + *value = _plat__GetVendorCapabilityCode(1); break; case TPM_PT_VENDOR_STRING_2: - // second four characters of the vendor ID string -#ifdef VENDOR_STRING_2 - *value = BYTE_ARRAY_TO_UINT32(VENDOR_STRING_2); -#else - *value = 0; -#endif + *value = _plat__GetVendorCapabilityCode(2); break; case TPM_PT_VENDOR_STRING_3: // third four characters of the vendor ID string -#ifdef VENDOR_STRING_3 - *value = BYTE_ARRAY_TO_UINT32(VENDOR_STRING_3); -#else - *value = 0; -#endif + *value = _plat__GetVendorCapabilityCode(3); break; case TPM_PT_VENDOR_STRING_4: // fourth four characters of the vendor ID string -#ifdef VENDOR_STRING_4 - *value = BYTE_ARRAY_TO_UINT32(VENDOR_STRING_4); -#else - *value = 0; -#endif + *value = _plat__GetVendorCapabilityCode(4); break; case TPM_PT_VENDOR_TPM_TYPE: - // vendor-defined value indicating the TPM model - *value = 1; + *value = _plat__GetTpmType(); break; case TPM_PT_FIRMWARE_VERSION_1: // more significant 32-bits of a vendor-specific value diff --git a/src/tpm2/TpmFail.c b/src/tpm2/TpmFail.c index 8a55b8b1..3da73e93 100644 --- a/src/tpm2/TpmFail.c +++ b/src/tpm2/TpmFail.c @@ -421,73 +421,45 @@ void TpmFailureMode(uint32_t inRequestSize, // IN: command buffer size { case TPM_PT_MANUFACTURER: // the vendor ID unique to each TPM manufacturer -#ifdef MANUFACTURER - pt = *(UINT32*)MANUFACTURER; -#else - pt = 0; -#endif + pt = _plat__GetManufacturerCapabilityCode(); break; case TPM_PT_VENDOR_STRING_1: // the first four characters of the vendor ID string -#ifdef VENDOR_STRING_1 - pt = *(UINT32*)VENDOR_STRING_1; -#else - pt = 0; -#endif + pt = _plat__GetVendorCapabilityCode(1); break; case TPM_PT_VENDOR_STRING_2: // the second four characters of the vendor ID string -#ifdef VENDOR_STRING_2 - pt = *(UINT32*)VENDOR_STRING_2; -#else - pt = 0; -#endif + pt = _plat__GetVendorCapabilityCode(2); break; case TPM_PT_VENDOR_STRING_3: // the third four characters of the vendor ID string -#ifdef VENDOR_STRING_3 - pt = *(UINT32*)VENDOR_STRING_3; -#else - pt = 0; -#endif + pt = _plat__GetVendorCapabilityCode(3); break; case TPM_PT_VENDOR_STRING_4: // the fourth four characters of the vendor ID string -#ifdef VENDOR_STRING_4 - pt = *(UINT32*)VENDOR_STRING_4; -#else - pt = 0; -#endif + pt = _plat__GetVendorCapabilityCode(4); break; case TPM_PT_VENDOR_TPM_TYPE: // vendor-defined value indicating the TPM model // We just make up a number here - pt = 1; + pt = _plat__GetTpmType(); break; case TPM_PT_FIRMWARE_VERSION_1: // the more significant 32-bits of a vendor-specific value // indicating the version of the firmware -#ifdef FIRMWARE_V1 - pt = FIRMWARE_V1; -#else - pt = 0; -#endif + pt = _plat__GetTpmFirmwareVersionHigh(); break; default: // TPM_PT_FIRMWARE_VERSION_2: // the less significant 32-bits of a vendor-specific value // indicating the version of the firmware -#ifdef FIRMWARE_V2 - pt = FIRMWARE_V2; -#else - pt = 0; -#endif + pt = _plat__GetTpmFirmwareVersionLow(); break; } marshalSize += MarshalUint32(pt, &buffer); diff --git a/src/tpm2/VendorInfo.c b/src/tpm2/VendorInfo.c new file mode 100644 index 00000000..dca7e1e7 --- /dev/null +++ b/src/tpm2/VendorInfo.c @@ -0,0 +1,214 @@ +/********************************************************************************/ +/* */ +/* */ +/* Written by Ken Goldman */ +/* IBM Thomas J. Watson Research Center */ +/* */ +/* Licenses and Notices */ +/* */ +/* 1. Copyright Licenses: */ +/* */ +/* - Trusted Computing Group (TCG) grants to the user of the source code in */ +/* this specification (the "Source Code") a worldwide, irrevocable, */ +/* nonexclusive, royalty free, copyright license to reproduce, create */ +/* derivative works, distribute, display and perform the Source Code and */ +/* derivative works thereof, and to grant others the rights granted herein. */ +/* */ +/* - The TCG grants to the user of the other parts of the specification */ +/* (other than the Source Code) the rights to reproduce, distribute, */ +/* display, and perform the specification solely for the purpose of */ +/* developing products based on such documents. */ +/* */ +/* 2. Source Code Distribution Conditions: */ +/* */ +/* - Redistributions of Source Code must retain the above copyright licenses, */ +/* this list of conditions and the following disclaimers. */ +/* */ +/* - Redistributions in binary form must reproduce the above copyright */ +/* licenses, this list of conditions and the following disclaimers in the */ +/* documentation and/or other materials provided with the distribution. */ +/* */ +/* 3. Disclaimers: */ +/* */ +/* - THE COPYRIGHT LICENSES SET FORTH ABOVE DO NOT REPRESENT ANY FORM OF */ +/* LICENSE OR WAIVER, EXPRESS OR IMPLIED, BY ESTOPPEL OR OTHERWISE, WITH */ +/* RESPECT TO PATENT RIGHTS HELD BY TCG MEMBERS (OR OTHER THIRD PARTIES) */ +/* THAT MAY BE NECESSARY TO IMPLEMENT THIS SPECIFICATION OR OTHERWISE. */ +/* Contact TCG Administration (admin@trustedcomputinggroup.org) for */ +/* information on specification licensing rights available through TCG */ +/* membership agreements. */ +/* */ +/* - THIS SPECIFICATION IS PROVIDED "AS IS" WITH NO EXPRESS OR IMPLIED */ +/* WARRANTIES WHATSOEVER, INCLUDING ANY WARRANTY OF MERCHANTABILITY OR */ +/* FITNESS FOR A PARTICULAR PURPOSE, ACCURACY, COMPLETENESS, OR */ +/* NONINFRINGEMENT OF INTELLECTUAL PROPERTY RIGHTS, OR ANY WARRANTY */ +/* OTHERWISE ARISING OUT OF ANY PROPOSAL, SPECIFICATION OR SAMPLE. */ +/* */ +/* - Without limitation, TCG and its members and licensors disclaim all */ +/* liability, including liability for infringement of any proprietary */ +/* rights, relating to use of information in this specification and to the */ +/* implementation of this specification, and TCG disclaims all liability for */ +/* cost of procurement of substitute goods or services, lost profits, loss */ +/* of use, loss of data or any incidental, consequential, direct, indirect, */ +/* or special damages, whether under contract, tort, warranty or otherwise, */ +/* arising in any way out of use or reliance upon this specification or any */ +/* information herein. */ +/* */ +/* (c) Copyright IBM Corp. and others, 2023 */ +/* */ +/********************************************************************************/ + +//** Introduction +// Provide vendor-specific version and identifiers to core TPM library for +// return in capabilities. These may not be compile time constants and therefore +// are provided by platform callbacks. These platform functions are expected to +// always be available, even in failure mode. +// +//** Includes +#include "Platform.h" + +// In this sample platform, these are compile time constants, but are not required to be. +#define MANUFACTURER "IBM " +#define VENDOR_STRING_1 "SW " +#define VENDOR_STRING_2 " TPM" +#define VENDOR_STRING_3 "\0\0\0\0" +#define VENDOR_STRING_4 "\0\0\0\0" +#define FIRMWARE_V1 (0x20191023) +#define FIRMWARE_V2 (0x00163636) +#define MAX_SVN 255 + +#if 0 // libtpms: added +static uint32_t currentHash = FIRMWARE_V2; +static uint16_t currentSvn = 10; +#endif // libtpms: added + +// Similar to the Core Library's ByteArrayToUint32, but usable in Platform code. +static uint32_t StringToUint32(char s[4]) +{ + uint8_t* b = (uint8_t*)s; // Avoid promotion to a signed integer type + return (((uint32_t)b[0] << 8 | b[1]) << 8 | b[2]) << 8 | b[3]; +} + +// return the 4 character Manufacturer Capability code. This +// should come from the platform library since that is provided by the manufacturer +LIB_EXPORT uint32_t _plat__GetManufacturerCapabilityCode() +{ + return StringToUint32(MANUFACTURER); +} + +// return the 4 character VendorStrings for Capabilities. +// Index is ONE-BASED, and may be in the range [1,4] inclusive. +// Any other index returns all zeros. The return value will be interpreted +// as an array of 4 ASCII characters (with no null terminator) +LIB_EXPORT uint32_t _plat__GetVendorCapabilityCode(int index) +{ + switch(index) + { + case 1: + return StringToUint32(VENDOR_STRING_1); + case 2: + return StringToUint32(VENDOR_STRING_2); + case 3: + return StringToUint32(VENDOR_STRING_3); + case 4: + return StringToUint32(VENDOR_STRING_4); + } + return 0; +} + +// return the most-significant 32-bits of the TPM Firmware Version reported by +// getCapability. +LIB_EXPORT uint32_t _plat__GetTpmFirmwareVersionHigh() +{ + return FIRMWARE_V1; +} + +// return the least-significant 32-bits of the TPM Firmware Version reported by +// getCapability. +LIB_EXPORT uint32_t _plat__GetTpmFirmwareVersionLow() +{ + return FIRMWARE_V2; +} + +#if 0 // libtpms: added +// return the TPM Firmware SVN reported by getCapability. +LIB_EXPORT uint16_t _plat__GetTpmFirmwareSvn(void) +{ + return currentSvn; +} + +// return the TPM Firmware maximum SVN reported by getCapability. +LIB_EXPORT uint16_t _plat__GetTpmFirmwareMaxSvn(void) +{ + return MAX_SVN; +} + +// Called by the simulator to set the TPM Firmware SVN reported by +// getCapability. +LIB_EXPORT void _plat__SetTpmFirmwareHash(uint32_t hash) +{ + currentHash = hash; +} + +// Called by the simulator to set the TPM Firmware SVN reported by +// getCapability. +LIB_EXPORT void _plat__SetTpmFirmwareSvn(uint16_t svn) +{ + currentSvn = MIN(svn, MAX_SVN); +} +#endif // libtpms: added + +#if SVN_LIMITED_SUPPORT +// Dummy implmenentation for obtaining a Firmware SVN Secret bound +// to the given SVN. +LIB_EXPORT int _plat__GetTpmFirmwareSvnSecret(uint16_t svn, + uint16_t secret_buf_size, + uint8_t* secret_buf, + uint16_t* secret_size) +{ + int i; + + if(svn > currentSvn) + { + return -1; + } + + // INSECURE dummy implementation: repeat the SVN into the secret buffer. + for(i = 0; i < secret_buf_size; ++i) + { + secret_buf[i] = ((uint8_t*)&svn)[i % sizeof(svn)]; + } + + *secret_size = secret_buf_size; + + return 0; +} +#endif // SVN_LIMITED_SUPPORT + +#if FW_LIMITED_SUPPORT +// Dummy implmenentation for obtaining a Firmware Secret bound +// to the current firmware image. +LIB_EXPORT int _plat__GetTpmFirmwareSecret + (uint16_t secret_buf_size, uint8_t* secret_buf, uint16_t* secret_size) +{ + int i; + + // INSECURE dummy implementation: repeat the firmware hash into the + // secret buffer. + for(i = 0; i < secret_buf_size; ++i) + { + secret_buf[i] = ((uint8_t*)¤tHash)[i % sizeof(currentHash)]; + } + + *secret_size = secret_buf_size; + + return 0; +} +#endif // FW_LIMITED_SUPPORT + + // return the TPM Type returned by TPM_PT_VENDOR_TPM_TYPE +LIB_EXPORT uint32_t _plat__GetTpmType() +{ + return 1; // just the value the reference code has returned in the past. +} + diff --git a/src/tpm2/VendorString.h b/src/tpm2/VendorString.h deleted file mode 100644 index e33800df..00000000 --- a/src/tpm2/VendorString.h +++ /dev/null @@ -1,108 +0,0 @@ -/********************************************************************************/ -/* */ -/* Vendor String */ -/* Written by Ken Goldman */ -/* IBM Thomas J. Watson Research Center */ -/* $Id: VendorString.h 1519 2019-11-15 20:43:51Z kgoldman $ */ -/* */ -/* Licenses and Notices */ -/* */ -/* 1. Copyright Licenses: */ -/* */ -/* - Trusted Computing Group (TCG) grants to the user of the source code in */ -/* this specification (the "Source Code") a worldwide, irrevocable, */ -/* nonexclusive, royalty free, copyright license to reproduce, create */ -/* derivative works, distribute, display and perform the Source Code and */ -/* derivative works thereof, and to grant others the rights granted herein. */ -/* */ -/* - The TCG grants to the user of the other parts of the specification */ -/* (other than the Source Code) the rights to reproduce, distribute, */ -/* display, and perform the specification solely for the purpose of */ -/* developing products based on such documents. */ -/* */ -/* 2. Source Code Distribution Conditions: */ -/* */ -/* - Redistributions of Source Code must retain the above copyright licenses, */ -/* this list of conditions and the following disclaimers. */ -/* */ -/* - Redistributions in binary form must reproduce the above copyright */ -/* licenses, this list of conditions and the following disclaimers in the */ -/* documentation and/or other materials provided with the distribution. */ -/* */ -/* 3. Disclaimers: */ -/* */ -/* - THE COPYRIGHT LICENSES SET FORTH ABOVE DO NOT REPRESENT ANY FORM OF */ -/* LICENSE OR WAIVER, EXPRESS OR IMPLIED, BY ESTOPPEL OR OTHERWISE, WITH */ -/* RESPECT TO PATENT RIGHTS HELD BY TCG MEMBERS (OR OTHER THIRD PARTIES) */ -/* THAT MAY BE NECESSARY TO IMPLEMENT THIS SPECIFICATION OR OTHERWISE. */ -/* Contact TCG Administration (admin@trustedcomputinggroup.org) for */ -/* information on specification licensing rights available through TCG */ -/* membership agreements. */ -/* */ -/* - THIS SPECIFICATION IS PROVIDED "AS IS" WITH NO EXPRESS OR IMPLIED */ -/* WARRANTIES WHATSOEVER, INCLUDING ANY WARRANTY OF MERCHANTABILITY OR */ -/* FITNESS FOR A PARTICULAR PURPOSE, ACCURACY, COMPLETENESS, OR */ -/* NONINFRINGEMENT OF INTELLECTUAL PROPERTY RIGHTS, OR ANY WARRANTY */ -/* OTHERWISE ARISING OUT OF ANY PROPOSAL, SPECIFICATION OR SAMPLE. */ -/* */ -/* - Without limitation, TCG and its members and licensors disclaim all */ -/* liability, including liability for infringement of any proprietary */ -/* rights, relating to use of information in this specification and to the */ -/* implementation of this specification, and TCG disclaims all liability for */ -/* cost of procurement of substitute goods or services, lost profits, loss */ -/* of use, loss of data or any incidental, consequential, direct, indirect, */ -/* or special damages, whether under contract, tort, warranty or otherwise, */ -/* arising in any way out of use or reliance upon this specification or any */ -/* information herein. */ -/* */ -/* (c) Copyright IBM Corp. and others, 2016 - 2019 */ -/* */ -/********************************************************************************/ - -#ifndef VENDORSTRING_H -#define VENDORSTRING_H - -/* Define up to 4-byte values for MANUFACTURER. This value defines the response for - TPM_PT_MANUFACTURER in TPM2_GetCapability(). The following line should be un-commented and a - vendor specific string should be provided here. */ -#define MANUFACTURER "IBM" - -/* The following #if macro may be deleted after a proper MANUFACTURER is provided. */ -#ifndef MANUFACTURER -#error MANUFACTURER is not provided. \ - Please modify VendorString.h to provide a specific \ - manufacturer name. -#endif - -/* Define up to 4, 4-byte, vendor-specific values. The values must each be 4 bytes long and the - last value used may contain trailing zeros. These values define the response for - TPM_PT_VENDOR_STRING_(1-4) in TPM2_GetCapability(). The following line should be un-commented - and a vendor specific string. The vendor strings 2-4 may also be defined as appropriate. */ - -#define VENDOR_STRING_1 "SW " -#define VENDOR_STRING_2 " TPM" -//#define VENDOR_STRING_3 -//#define VENDOR_STRING_4 - -/* The following #if macro may be deleted after a proper VENDOR_STRING_1 is provided. */ -#ifndef VENDOR_STRING_1 -#error VENDOR_STRING_1 is not provided. \ - Please modify VendorString.h to provide a vendor specific string. -#endif - -/* the more significant 32-bits of a vendor-specific value indicating the version of the firmware - The following line should be un-commented and a vendor specific firmware V1 should be provided - here. The FIRMWARE_V2 may also be defined as appropriate. */ -#define FIRMWARE_V1 (0x20191023) - -// the less significant 32-bits of a vendor-specific value indicating the version of the firmware -#define FIRMWARE_V2 (0x00163636) - -// The following #if macro may be deleted after a proper FIRMWARE_V1 is provided. -#ifndef FIRMWARE_V1 -#error FIRMWARE_V1 is not provided. \ - Please modify VendorString.h to provide a vendor specific firmware \ - version -#endif - -#endif diff --git a/src/tpm2/tpm_to_platform_interface.h b/src/tpm2/tpm_to_platform_interface.h index 58a69f86..3606a632 100644 --- a/src/tpm2/tpm_to_platform_interface.h +++ b/src/tpm2/tpm_to_platform_interface.h @@ -399,10 +399,11 @@ LIB_EXPORT uint32_t _plat__GetUnique(uint32_t which, // to the Core library. LIB_EXPORT void _plat__GetPlatformManufactureData(uint8_t* pPlatformPersistentData, uint32_t bufferSize); +#endif // libtpms: added // return the 4 character Manufacturer Capability code. This // should come from the platform library since that is provided by the manufacturer -LIB_EXPORT uint32_t _plat__GetManufacturerCapabilityCode(); +LIB_EXPORT uint32_t _plat__GetManufacturerCapabilityCode(void); // return the 4 character VendorStrings for Capabilities. // Index is ONE-BASED, and may be in the range [1,4] inclusive. @@ -412,12 +413,13 @@ LIB_EXPORT uint32_t _plat__GetVendorCapabilityCode(int index); // return the most-significant 32-bits of the TPM Firmware Version reported by // getCapability. -LIB_EXPORT uint32_t _plat__GetTpmFirmwareVersionHigh(); +LIB_EXPORT uint32_t _plat__GetTpmFirmwareVersionHigh(void); // return the least-significant 32-bits of the TPM Firmware Version reported by // getCapability. -LIB_EXPORT uint32_t _plat__GetTpmFirmwareVersionLow(); +LIB_EXPORT uint32_t _plat__GetTpmFirmwareVersionLow(void); +#if 0 // libtpms: added // return the TPM Firmware's current SVN. LIB_EXPORT uint16_t _plat__GetTpmFirmwareSvn(void); @@ -452,11 +454,13 @@ LIB_EXPORT int _plat__GetTpmFirmwareSecret( uint16_t* secret_size // OUT: secret buffer ); #endif // FW_LIMITED_SUPPORT +#endif // libtpms: added // return the TPM Type returned by TPM_PT_VENDOR_TPM_TYPE -LIB_EXPORT uint32_t _plat__GetTpmType(); +LIB_EXPORT uint32_t _plat__GetTpmType(void); // platform PCR initialization functions +#if 0 // libtpms: added #include "platform_pcr_fp.h" #endif // libtpms: added diff --git a/src/tpm_tpm2_interface.c b/src/tpm_tpm2_interface.c index 59da435d..4570d786 100644 --- a/src/tpm_tpm2_interface.c +++ b/src/tpm_tpm2_interface.c @@ -396,9 +396,11 @@ static char *TPM2_GetInfo(enum TPMLIB_InfoFlags flags) } if ((flags & TPMLIB_INFO_TPMATTRIBUTES)) { + uint32_t firmware_v1 = _plat__GetTpmFirmwareVersionHigh(); + fmt = buffer; buffer = NULL; - if (asprintf(&tpmattrs, tpmattrs_temp, FIRMWARE_V1) < 0) + if (asprintf(&tpmattrs, tpmattrs_temp, firmware_v1) < 0) goto error; if (asprintf(&buffer, fmt, printed ? "," : "", tpmattrs, "%s%s%s") < 0)