[isar-cip-core][PATCH 3/4] optee-ftpm: Update to TPM reference implementation V184
Jan Kiszka <[email protected]>
| Newsgroups | org.cip-project.lists.cip-dev |
|---|---|
| Message-ID | <369f5506ea516e931e020009a182e6edf4709224.1786712498.git.jan.kiszka@siemens.com> |
From: Jan Kiszka <[email protected]> This switches to the new home of the TPM reference implementation under the namespace for the TCG. Two patches against optee_ftpm are needed which are still under review upstream. The update will also allow us to apply CVE fixes against the TPM core. Signed-off-by: Jan Kiszka <[email protected]> --- ...PM-2.0-Reference-Implementation-v184.patch | 3885 +++++++++++++++++ ...002-Disable-command-TPM2_CertifyX509.patch | 29 + ....bb => optee-ftpm-qemu-arm64_4.10+V184.bb} | 0 ...fc7b8.bb => optee-ftpm-ti-k3_4.10+V184.bb} | 0 ...-ge9fc7b8.inc => optee-ftpm_4.10+V184.inc} | 10 +- 5 files changed, 3920 insertions(+), 4 deletions(-) create mode 100644 recipes-bsp/optee-ftpm/files/0001-Update-to-TPM-2.0-Reference-Implementation-v184.patch create mode 100644 recipes-bsp/optee-ftpm/files/0002-Disable-command-TPM2_CertifyX509.patch rename recipes-bsp/optee-ftpm/{optee-ftpm-qemu-arm64_4.10+v1.62r1-48-ge9fc7b8.bb => optee-ftpm-qemu-arm64_4.10+V184.bb} (100%) rename recipes-bsp/optee-ftpm/{optee-ftpm-ti-k3_4.10+v1.62r1-48-ge9fc7b8.bb => optee-ftpm-ti-k3_4.10+V184.bb} (100%) rename recipes-bsp/optee-ftpm/{optee-ftpm_4.10+v1.62r1-48-ge9fc7b8.inc => optee-ftpm_4.10+V184.inc} (55%) diff --git a/recipes-bsp/optee-ftpm/files/0001-Update-to-TPM-2.0-Reference-Implementation-v184.patch b/recipes-bsp/optee-ftpm/files/0001-Update-to-TPM-2.0-Reference-Implementation-v184.patch new file mode 100644 index 00000000..dced62b2 --- /dev/null +++ b/recipes-bsp/optee-ftpm/files/0001-Update-to-TPM-2.0-Reference-Implementation-v184.patch @@ -0,0 +1,3885 @@ +From fa667cf9e15d907030d11d8421ebbb44e18e605f Mon Sep 17 00:00:00 2001 +From: Jan Kiszka <[email protected]> +Date: Mon, 4 May 2026 11:50:32 +0200 +Subject: [PATCH 1/2] Update to TPM 2.0 Reference Implementation v184 + +The TPM 2.0 Reference Implementation has apparently moved to a new home at +https://github.com/TrustedComputingGroup/TPM +This commit contains changes to enable building optee_ftpm with the +TPM 2.0 Reference Implementation v184. This is the most recent version +tag at the time of writing. + +Co-authored-by: Sven Bauer <[email protected]> +Signed-off-by: Sven Bauer <[email protected]> +--- + README.md | 8 +- + include/TEE/{TpmToTEEMath.h => BnToTEEMath.h} | 29 +- + include/fTPM.h | 11 +- + include/user_ta_header_defines.h | 5 +- + platform/AdminPPI.c | 5 +- + platform/Cancel.c | 9 +- + platform/Clock.c | 38 +- + platform/EPS.c | 97 ---- + platform/Entropy.c | 9 +- + platform/ExtraData.c | 69 +++ + platform/Failure.c | 152 ++++++ + platform/Init.c | 53 ++ + platform/LocalityPlat.c | 9 +- + platform/NVMem.c | 78 ++- + platform/NvAdmin.c | 9 +- + platform/PPPlat.c | 9 +- + platform/PlatformACT.c | 7 +- + platform/PlatformData.c | 6 +- + platform/PlatformPcr.c | 194 +++++++ + platform/PowerPlat.c | 13 +- + platform/RunCommand.c | 21 +- + platform/SelfTest.c | 18 + + platform/Unique.c | 102 ---- + platform/VendorInfo.c | 220 ++++++++ + platform/include/Admin.h | 7 +- + platform/include/Platform.h | 14 +- + platform/include/PlatformData.h | 8 +- + platform/include/Platform_fp.h | 492 ------------------ + .../TpmConfiguration/TpmBuildSwitches.h | 275 ++++++++++ + .../TpmConfiguration/TpmProfile_CommandList.h | 213 ++++++++ + .../TpmConfiguration/TpmProfile_Common.h | 278 ++++++++++ + reference/include/VendorString.h | 93 ---- + sub.mk | 452 ++++++++-------- + tee/{TpmToTEEMath.c => BnToTEEMath.c} | 96 +++- + tee/{TpmToTEESupport.c => BnToTEESupport.c} | 4 +- + 35 files changed, 1969 insertions(+), 1134 deletions(-) + rename include/TEE/{TpmToTEEMath.h => BnToTEEMath.h} (79%) + delete mode 100644 platform/EPS.c + create mode 100644 platform/ExtraData.c + create mode 100644 platform/Failure.c + create mode 100644 platform/Init.c + create mode 100644 platform/PlatformPcr.c + create mode 100644 platform/SelfTest.c + delete mode 100644 platform/Unique.c + create mode 100644 platform/VendorInfo.c + delete mode 100644 platform/include/Platform_fp.h + create mode 100644 platform/include/TpmConfiguration/TpmBuildSwitches.h + create mode 100644 platform/include/TpmConfiguration/TpmProfile_CommandList.h + create mode 100644 platform/include/TpmConfiguration/TpmProfile_Common.h + delete mode 100644 reference/include/VendorString.h + rename tee/{TpmToTEEMath.c => BnToTEEMath.c} (86%) + rename tee/{TpmToTEESupport.c => BnToTEESupport.c} (67%) + +diff --git a/README.md b/README.md +index 43d1036..2b8d09b 100644 +--- a/README.md ++++ b/README.md +@@ -20,10 +20,10 @@ Applications](https://optee.readthedocs.io/en/latest/building/trusted_applicatio + section in the [OP-TEE + documentation](https://optee.readthedocs.io/en/latest/index.html) with the + addition of `CFG_MS_TPM_20_REF` which must hold the path to a checked out +-copy of the [MS TPM 2.0 Reference +-Implementation](https://github.com/microsoft/ms-tpm-20-ref). +-You need to checkout commit (98b60a44aba79b15fcce1c0d1e46cf5918400f6a) of [MS TPM 2.0 Reference +-Implementation](https://github.com/microsoft/ms-tpm-20-ref) ++copy of the [The Official TPM 2.0 Reference ++Implementation](https://github.com/TrustedComputingGroup/TPM). ++For the time being and until The Official TPM 2.0 Reference Implementation accepts a corresponding pull request ++the following fixed version is required: https://github.com/svenbauer-work/TPM/tree/a9665960ddfb92b8a140cd8d37d29342ddb05b3b + + ## Measured Boot support + The fTPM Trusted Application includes support for Measured Boot. This +diff --git a/include/TEE/TpmToTEEMath.h b/include/TEE/BnToTEEMath.h +similarity index 79% +rename from include/TEE/TpmToTEEMath.h +rename to include/TEE/BnToTEEMath.h +index b7fcf58..49dc696 100644 +--- a/include/TEE/TpmToTEEMath.h ++++ b/include/TEE/BnToTEEMath.h +@@ -51,22 +51,25 @@ + * are defined in TpmTypes.h + */ + +-#ifndef MATH_LIB_DEFINED +-#define MATH_LIB_DEFINED ++#ifndef BN_MATH_LIB_DEFINED ++#define BN_MATH_LIB_DEFINED + +-#define MATH_LIB_TEE ++#define BN_MATH_LIB_TEE + +-typedef ECC_CURVE_DATA bnCurve_t; ++/*#define CRYPT_INT_BUF(buftypename, bits) BN_STRUCT_DEF(buftypename, bits) ++#define CRYPT_POINT_BUF(buftypename, bits) BN_POINT_BUF(buftypename, bits) ++#define CRYPT_CURVE_BUF(buftypename, bits) TPMBN_ECC_CURVE_CONSTANTS*/ + +-typedef bnCurve_t* bigCurve; ++typedef struct crypto_impl_description ++{ ++} _CRYPTO_IMPL_DESCRIPTION; + +-#define SYMMETRIC_ALIGNMENT RADIX_BYTES ++typedef const TPMBN_ECC_CURVE_CONSTANTS* bigCurveData; + +-#define AccessCurveData(E) (E) ++TPM_INLINE const TPMBN_ECC_CURVE_CONSTANTS* AccessCurveConstants( ++ const bigCurveData* E) ++{ ++ return *E; ++} + +-#define CURVE_INITIALIZED(name, initializer) \ +- bnCurve_t* name = (ECC_CURVE_DATA*)GetCurveData(initializer) +- +-#define CURVE_FREE(E) +- +-#endif /*MATH_LIB_DEFINED*/ ++#endif /*BN_MATH_LIB_DEFINED*/ +diff --git a/include/fTPM.h b/include/fTPM.h +index ad74f5a..52fd33f 100644 +--- a/include/fTPM.h ++++ b/include/fTPM.h +@@ -1,6 +1,7 @@ + /* SPDX-License-Identifier: BSD-2-Clause */ + /* + * Copyright (c) 2024, Linaro Limited ++ * Copyright (c) 2026, Siemens AG + */ + + /* Microsoft Reference Implementation for TPM 2.0 +@@ -43,15 +44,9 @@ + #ifndef FTPM_H + #define FTPM_H + +-#include <TpmProfile.h> ++#include <TpmConfiguration/TpmProfile.h> + #include <ftpm_ta.h> + +-// +-// These must match values from reference/TPM/include/TpmProfile.h +-// +-#define MAX_COMMAND_SIZE 4096 +-#define MAX_RESPONSE_SIZE 4096 +- + // + // Macro for intentionally unreferenced parameters + // +@@ -85,11 +80,9 @@ extern void ExecuteCommand( + // + // External functions supporting TPM initialization + // +-extern int _plat__NVEnable(void *platParameter); + extern int TPM_Manufacture(bool firstTime); + extern bool _plat__NvNeedsManufacture(void); + extern void _TPM_Init(void); +-extern void _plat__NVDisable(void); + extern void _admin__SaveChipFlags(void); + + // +diff --git a/include/user_ta_header_defines.h b/include/user_ta_header_defines.h +index 3f5586e..2c26af9 100644 +--- a/include/user_ta_header_defines.h ++++ b/include/user_ta_header_defines.h +@@ -1,6 +1,7 @@ + /* SPDX-License-Identifier: BSD-2-Clause */ + /* + * Copyright (c) 2024, Linaro Limited ++ * Copyright (c) 2026, Siemens AG + */ + + /* Microsoft Reference Implementation for TPM 2.0 +@@ -55,8 +56,8 @@ + TA_FLAG_INSTANCE_KEEP_ALIVE | \ + TA_FLAG_INSTANCE_KEEP_CRASHED | \ + TA_FLAG_DEVICE_ENUM_TEE_STORAGE_PRIVATE) +-#define TA_STACK_SIZE (64 * 1024) +-#define TA_DATA_SIZE (32 * 1024) ++#define TA_STACK_SIZE (128 * 1024) ++#define TA_DATA_SIZE (64 * 1024) + + #define TA_VERSION "0.1" + #define TA_DESCRIPTION "fTPM TA" +diff --git a/platform/AdminPPI.c b/platform/AdminPPI.c +index 5dd0d98..3d09a9b 100644 +--- a/platform/AdminPPI.c ++++ b/platform/AdminPPI.c +@@ -1,6 +1,7 @@ + /* SPDX-License-Identifier: BSD-2-Clause */ + /* + * Copyright (c) 2024, Linaro Limited ++ * Copyright (c) 2026, Siemens AG + */ + /* Microsoft Reference Implementation for TPM 2.0 + * +@@ -240,7 +241,7 @@ _admin__PPIRequest( + { + TPM2_EmulatePPI_cmd_t cmd; + TPM2_EmulatePPI_res_t rsp; +- TPM2_EmulatePPI_res_t *rspPtr = &rsp; ++ UINT8 *rspPtr = (void *)&rsp; + UINT32 rspLen = sizeof(TPM2_EmulatePPI_res_t); + UINT8 *CmdBuffer; + +@@ -272,7 +273,7 @@ _admin__PPIRequest( + if (!_admin__PPICommand(sizeof(TPM2_EmulatePPI_cmd_t), + (UINT8 *)&cmd, + &rspLen, +- (UINT8**)&rspPtr)) { ++ &rspPtr)) { + return 0; + } + +diff --git a/platform/Cancel.c b/platform/Cancel.c +index 304a070..f6f2b82 100644 +--- a/platform/Cancel.c ++++ b/platform/Cancel.c +@@ -1,3 +1,7 @@ ++/* SPDX-License-Identifier: BSD-2-Clause */ ++/* ++ * Copyright (c) 2026, Siemens AG ++ */ + /* Microsoft Reference Implementation for TPM 2.0 + * + * The copyright in this software is being made available under the BSD License, +@@ -38,7 +42,8 @@ + // + //** Includes, Typedefs, Structures, and Defines + #include "PlatformData.h" +-#include "Platform_fp.h" ++#include "platform_interface/tpm_to_platform_interface.h" ++#include "prototypes/platform_public_interface.h" + + //** Functions + +@@ -77,4 +82,4 @@ _plat__ClearCancel( + { + s_isCanceled = FALSE; + return; +-} +\ No newline at end of file ++} +diff --git a/platform/Clock.c b/platform/Clock.c +index 5bfd5b7..3fe1b59 100644 +--- a/platform/Clock.c ++++ b/platform/Clock.c +@@ -1,3 +1,7 @@ ++/* SPDX-License-Identifier: BSD-2-Clause */ ++/* ++ * Copyright (c) 2026, Siemens AG ++ */ + /* Microsoft Reference Implementation for TPM 2.0 + * + * The copyright in this software is being made available under the BSD License, +@@ -42,8 +46,9 @@ + + //** Includes and Data Definitions + #include "PlatformData.h" +-#include "Platform_fp.h" +-#include "TpmFail_fp.h" ++#include "platform_interface/tpm_to_platform_interface.h" ++#include "prototypes/platform_public_interface.h" ++#include "tpm_public/prototypes/TpmFail_fp.h" + #include <assert.h> + #include <tee_internal_api.h> + +@@ -259,36 +264,31 @@ _plat__TimerWasStopped( + + //***_plat__ClockAdjustRate() + // Adjust the clock rate +-LIB_EXPORT void +-_plat__ClockAdjustRate( +- int adjust // IN: the adjust number. It could be positive +- // or negative +- ) ++LIB_EXPORT void _plat__ClockRateAdjust(_plat__ClockAdjustStep adjust) + { + // We expect the caller should only use a fixed set of constant values to + // adjust the rate + switch(adjust) + { +- case CLOCK_ADJUST_COARSE: ++ // slower increases the divisor ++ case PLAT_TPM_CLOCK_ADJUST_COARSE_SLOWER: + s_adjustRate += CLOCK_ADJUST_COARSE; + break; +- case -CLOCK_ADJUST_COARSE: +- s_adjustRate -= CLOCK_ADJUST_COARSE; +- break; +- case CLOCK_ADJUST_MEDIUM: ++ case PLAT_TPM_CLOCK_ADJUST_MEDIUM_SLOWER: + s_adjustRate += CLOCK_ADJUST_MEDIUM; + break; +- case -CLOCK_ADJUST_MEDIUM: +- s_adjustRate -= CLOCK_ADJUST_MEDIUM; +- break; +- case CLOCK_ADJUST_FINE: ++ case PLAT_TPM_CLOCK_ADJUST_FINE_SLOWER: + s_adjustRate += CLOCK_ADJUST_FINE; + break; +- case -CLOCK_ADJUST_FINE: ++ // faster decreases the divisor ++ case PLAT_TPM_CLOCK_ADJUST_FINE_FASTER: + s_adjustRate -= CLOCK_ADJUST_FINE; + break; +- default: +- // ignore any other values; ++ case PLAT_TPM_CLOCK_ADJUST_MEDIUM_FASTER: ++ s_adjustRate -= CLOCK_ADJUST_MEDIUM; ++ break; ++ case PLAT_TPM_CLOCK_ADJUST_COARSE_FASTER: ++ s_adjustRate -= CLOCK_ADJUST_COARSE; + break; + } + +diff --git a/platform/EPS.c b/platform/EPS.c +deleted file mode 100644 +index d3bc269..0000000 +--- a/platform/EPS.c ++++ /dev/null +@@ -1,97 +0,0 @@ +-/* SPDX-License-Identifier: BSD-2-Clause */ +-/* +- * Copyright (c) 2024, Linaro Limited +- */ +-/* Microsoft Reference Implementation for TPM 2.0 +- * +- * The copyright in this software is being made available under the BSD +- * License, included below. This software may be subject to other third +- * party and contributor rights, including patent rights, and no such +- * rights are granted under this license. +- * +- * Copyright (c) 2018-2023 Microsoft Corporation +- * +- * All rights reserved. +- * +- * BSD License +- * +- * Redistribution and use in source and binary forms, with or without +- * modification, are permitted provided that the following conditions are +- * met: +- * +- * Redistributions of source code must retain the above copyright notice, +- * this list of conditions and the following disclaimer. +- * +- * Redistributions in binary form must reproduce the above copyright +- * notice, this list of conditions and the following disclaimer in the +- * documentation and/or other materials provided with the distribution. +- * +- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS +- * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +- * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A +- * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +- * HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED +- * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +- * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF +- * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +- * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +- * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +- */ +- +-// +-// Platform Endorsement Primary Seed +-// +- +-#include "TpmError.h" +-#include "Admin.h" +- +-#include <string.h> +-#include <tee_internal_api.h> +-#include <tee_internal_api_extensions.h> +- +-#define TEE_EPS_SIZE (256/2) // From TPM2B_RSA_TEST_PRIME in Hierarchy.c +- +-void +-_plat__GetEPS(UINT16 Size, uint8_t *EndorsementSeed) +-{ +- TEE_Result Result = TEE_ERROR_ITEM_NOT_FOUND; +- uint8_t EPS[TEE_EPS_SIZE] = { 0 }; +- size_t EPSLen; +- +- IMSG("Size=%" PRIu16 "",Size); +- IMSG("EPS=%d",TEE_EPS_SIZE); +- +- pAssert(Size <= (TEE_EPS_SIZE)); +- +- Result = TEE_GetPropertyAsBinaryBlock(TEE_PROPSET_CURRENT_TA, +- "com.microsoft.ta.endorsementSeed", +- EPS, +- &EPSLen); +- +- if ((EPSLen < Size) || (Result != TEE_SUCCESS)) { +- // We failed to access the property. We can't continue without it +- // and we can't just fail to manufacture, so randomize EPS and +- // continue. If necessary, fTPM TA storage can be cleared, or the +- // TA updated, and we can trigger remanufacture and try again. +- _plat__GetEntropy(EndorsementSeed, TEE_EPS_SIZE); +- return; +- } +- +- memcpy(EndorsementSeed, EPS, Size); +- +-#ifdef fTPMDebug +- { +- uint32_t x; +- uint8_t *seed = EndorsementSeed; +- DMSG("TEE_GetProperty 0x%x, seedLen 0x%x\n", Result, Size); +- for (x = 0; x < Size; x = x + 8) { +- DMSG(" seed(%2.2d): %2.2x,%2.2x,%2.2x,%2.2x,%2.2x,%2.2x,%2.2x,%2.2x\n", x, +- seed[x + 0], seed[x + 1], seed[x + 2], seed[x + 3], +- seed[x + 4], seed[x + 5], seed[x + 6], seed[x + 7]); +- } +- } +-#endif +- +- return; +-} +diff --git a/platform/Entropy.c b/platform/Entropy.c +index 3ca2fed..ed2cd11 100644 +--- a/platform/Entropy.c ++++ b/platform/Entropy.c +@@ -1,3 +1,7 @@ ++/* SPDX-License-Identifier: BSD-2-Clause */ ++/* ++ * Copyright (c) 2026, Siemens AG ++ */ + /* Microsoft Reference Implementation for TPM 2.0 + * + * The copyright in this software is being made available under the BSD License, +@@ -38,7 +42,8 @@ + #include <stdlib.h> + #include <memory.h> + #include "PlatformData.h" +-#include "Platform_fp.h" ++#include "platform_interface/tpm_to_platform_interface.h" ++#include "prototypes/platform_public_interface.h" + #include <time.h> + + #include <tee_internal_api.h> +@@ -125,4 +130,4 @@ _plat__GetEntropy( + } + } + return ret; +-} +\ No newline at end of file ++} +diff --git a/platform/ExtraData.c b/platform/ExtraData.c +new file mode 100644 +index 0000000..0beca1e +--- /dev/null ++++ b/platform/ExtraData.c +@@ -0,0 +1,69 @@ ++/* SPDX-License-Identifier: BSD-2-Clause */ ++/* ++ * Copyright (c) 2026, Siemens AG ++ */ ++// Copied from the TCG reference implementation, see ++// https://github.com/TrustedComputingGroup/TPM/tree/main/TPMCmd/Platform/src/ExtraData.c, tag V184 ++/* ++ * TCG Reference Implementation for TPM 2.0 ++ * This code is informative. ++ * ++ * The copyright in this software is being made available under the BSD License, ++ * included below. ++ * ++ * Copyright 2010-2022 Microsoft Corporation ++ * Copyright 2022-2025 Trusted Computing Group and its contributors ++ * ++ * All rights reserved. ++ * ++ * BSD License ++ * ++ * Redistribution and use in source and binary forms, with or without ++ * modification, are permitted provided that the following conditions are met: ++ * ++ * Redistributions of source code must retain the above copyright notice, this ++ * list of conditions and the following disclaimer. ++ * ++ * Redistributions in binary form must reproduce the above copyright notice, this ++ * list of conditions and the following disclaimer in the documentation and/or ++ * other materials provided with the distribution. ++ * ++ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ""AS IS"" ++ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE ++ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE ++ * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE ++ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL ++ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR ++ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER ++ * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, ++ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE ++ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ++ */ ++//** Description ++// ++// This file contains routines that are called by the core library to allow the ++// platform to use the Core storage structures for small amounts of related data. ++// ++// In this implementation, the buffers are all just set to 0xFF ++ ++//** Includes and Data Definitions ++#include "Tpm.h" ++#include "prototypes/platform_public_interface.h" ++ ++//** _plat__GetPlatformManufactureData ++ ++// This function allows the platform to provide a small amount of data to be ++// stored as part of the TPM's PERSISTENT_DATA structure during manufacture. Of ++// course the platform can store data separately as well, but this allows a ++// simple platform implementation to store a few bytes of data without ++// implementing a multi-layer storage system. This function is called on ++// manufacture and CLEAR. The buffer will contain the last value provided ++// to the Core library. ++LIB_EXPORT void _plat__GetPlatformManufactureData(uint8_t* pPlatformPersistentData, ++ uint32_t bufferSize) ++{ ++ if(bufferSize != 0) ++ { ++ memset((void*)pPlatformPersistentData, 0xFF, bufferSize); ++ } ++} +diff --git a/platform/Failure.c b/platform/Failure.c +new file mode 100644 +index 0000000..9c54e4b +--- /dev/null ++++ b/platform/Failure.c +@@ -0,0 +1,152 @@ ++/* SPDX-License-Identifier: BSD-2-Clause */ ++/* ++ * Copyright (c) 2026, Siemens AG ++ */ ++// Copied from the TCG reference implementation, see ++// https://github.com/TrustedComputingGroup/TPM/tree/main/TPMCmd/Platform/src/Failure.c, tag V184 ++/* ++ * TCG Reference Implementation for TPM 2.0 ++ * This code is informative. ++ * ++ * The copyright in this software is being made available under the BSD License, ++ * included below. ++ * ++ * Copyright 2010-2022 Microsoft Corporation ++ * Copyright 2022-2025 Trusted Computing Group and its contributors ++ * ++ * All rights reserved. ++ * ++ * BSD License ++ * ++ * Redistribution and use in source and binary forms, with or without ++ * modification, are permitted provided that the following conditions are met: ++ * ++ * Redistributions of source code must retain the above copyright notice, this ++ * list of conditions and the following disclaimer. ++ * ++ * Redistributions in binary form must reproduce the above copyright notice, this ++ * list of conditions and the following disclaimer in the documentation and/or ++ * other materials provided with the distribution. ++ * ++ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ""AS IS"" ++ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE ++ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE ++ * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE ++ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL ++ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR ++ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER ++ * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, ++ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE ++ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ++ */ ++ ++//** Includes and locals ++#include "Platform.h" ++#include <assert.h> ++#include <setjmp.h> ++#include <stdio.h> ++ ++// Macro to suppress warning about intentionally unreferenced parameters. ++#ifndef UNREFERENCED_PARAMETER ++#define UNREFERENCED_PARAMETER(a) do { (void)(a); } while (0) ++#endif ++ ++#if LONGJMP_SUPPORTED ++// in RunCommand.c ++extern jmp_buf s_FailureModeJumpBuffer; ++#endif ++ ++#if ALLOW_FORCE_FAILURE_MODE ++static BOOL s_forceFailureMode; // flag to force failure mode during test ++BOOL _plat_internal_IsForceFailureMode() ++{ ++ return s_forceFailureMode; ++} ++LIB_EXPORT void _plat__SetForceFailureMode() ++{ ++ s_forceFailureMode = TRUE; ++} ++#endif ++ ++#if FAIL_TRACE ++// The name of the function that triggered failure mode. ++static const char* s_failFunctionName; ++// The line in the file at which the error was signaled. ++static uint32_t s_failLine; ++#endif // FAIL_TRACE ++ ++// A numeric indicator of the location that triggered failure mode. ++static uint64_t s_failureLocation; ++// the reason for the failure. ++static uint32_t s_failCode; ++static BOOL s_IsInFailureMode = FALSE; ++ ++void _plat_internal_resetFailureData(void) ++{ ++#if ALLOW_FORCE_FAILURE_MODE ++ s_forceFailureMode = FALSE; ++#endif ++ ++#if FAIL_TRACE ++ // The name of the function that triggered failure mode. ++ s_failFunctionName = NULL; ++ // The line in the file at which the error was signaled. ++ s_failLine = 0; ++#endif // FAIL_TRACE ++ ++ // A numeric indicator of the location that triggered failure mode. ++ s_failureLocation = 0; ++ // the reason for the failure. ++ s_failCode = 0; ++ s_IsInFailureMode = FALSE; ++} ++ ++// Indicates to the TPM Library that a failure has occurred. ++// This is REQURIED to return true after any call to _plat__Fail. ++// It MAY return true for any other reason the platform deems appropriate. ++LIB_EXPORT BOOL _plat__InFailureMode(void) ++{ ++ return s_IsInFailureMode; ++} ++ ++//***_plat__Fail() ++// This is the platform depended failure exit for the TPM. ++LIB_EXPORT NORETURN_IF_LONGJMP void _plat__Fail( ++#if FAIL_TRACE ++ const char* function, ++ int line, ++#endif ++ uint64_t locationCode, ++ int failureCode) ++{ ++#if FAIL_TRACE ++ UNREFERENCED_PARAMETER(function); ++ UNREFERENCED_PARAMETER(line); ++#endif ++ UNREFERENCED_PARAMETER(locationCode); ++ UNREFERENCED_PARAMETER(failureCode); ++ TEE_Panic(TEE_ERROR_BAD_STATE); ++ while (true); /* Not reached */ ++} ++ ++LIB_EXPORT UINT32 _plat__GetFailureCode(void) ++{ ++ return s_failCode; ++} ++ ++LIB_EXPORT uint64_t _plat__GetFailureLocation(void) ++{ ++ return s_failureLocation; ++} ++ ++#if FAIL_TRACE ++LIB_EXPORT const char* _plat__GetFailureFunctionName(void) ++{ ++ return s_failFunctionName; ++} ++ ++LIB_EXPORT uint32_t _plat__GetFailureLine(void) ++{ ++ return s_failLine; ++} ++#endif +diff --git a/platform/Init.c b/platform/Init.c +new file mode 100644 +index 0000000..5b33305 +--- /dev/null ++++ b/platform/Init.c +@@ -0,0 +1,53 @@ ++// Copied from the TCG reference implementation, see ++// https://github.com/TrustedComputingGroup/TPM/tree/main/TPMCmd/Platform/src/Init.c, tag V184 ++/* ++ * TCG Reference Implementation for TPM 2.0 ++ * This code is informative. ++ * ++ * The copyright in this software is being made available under the BSD License, ++ * included below. ++ * ++ * Copyright 2010-2022 Microsoft Corporation ++ * Copyright 2022-2025 Trusted Computing Group and its contributors ++ * ++ * All rights reserved. ++ * ++ * BSD License ++ * ++ * Redistribution and use in source and binary forms, with or without ++ * modification, are permitted provided that the following conditions are met: ++ * ++ * Redistributions of source code must retain the above copyright notice, this ++ * list of conditions and the following disclaimer. ++ * ++ * Redistributions in binary form must reproduce the above copyright notice, this ++ * list of conditions and the following disclaimer in the documentation and/or ++ * other materials provided with the distribution. ++ * ++ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ""AS IS"" ++ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE ++ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE ++ * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE ++ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL ++ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR ++ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER ++ * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, ++ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE ++ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ++ */ ++ ++ #include "Platform.h" ++ ++// Notification at very start of TPM_Init(); ++LIB_EXPORT void _plat__StartTpmInit(void) ++{ ++ // call platform reset functions, that have no TPM dependencies ++ // needs the failure change ++ _plat_internal_resetFailureData(); ++} ++ ++LIB_EXPORT void _plat__EndOkTpmInit(void) ++{ ++ // call platform reset functions that depend on previous TPM initialization ++ // (none in this implementation) ++} +diff --git a/platform/LocalityPlat.c b/platform/LocalityPlat.c +index 1d74c57..ba3b257 100644 +--- a/platform/LocalityPlat.c ++++ b/platform/LocalityPlat.c +@@ -1,3 +1,7 @@ ++/* SPDX-License-Identifier: BSD-2-Clause */ ++/* ++ * Copyright (c) 2026, Siemens AG ++ */ + /* Microsoft Reference Implementation for TPM 2.0 + * + * The copyright in this software is being made available under the BSD License, +@@ -35,7 +39,8 @@ + //** Includes + + #include "PlatformData.h" +-#include "Platform_fp.h" ++#include "platform_interface/tpm_to_platform_interface.h" ++#include "prototypes/platform_public_interface.h" + + //** Functions + +@@ -62,4 +67,4 @@ _plat__LocalitySet( + locality = 0; + s_locality = locality; + return; +-} +\ No newline at end of file ++} +diff --git a/platform/NVMem.c b/platform/NVMem.c +index d5fd224..b06a6db 100644 +--- a/platform/NVMem.c ++++ b/platform/NVMem.c +@@ -1,3 +1,7 @@ ++/* SPDX-License-Identifier: BSD-2-Clause */ ++/* ++ * Copyright (c) 2026, Siemens AG ++ */ + /* Microsoft Reference Implementation for TPM 2.0 + * + * The copyright in this software is being made available under the BSD License, +@@ -39,12 +43,12 @@ + // The implementation may become more sophisticated over time. + // + +-#include "TpmError.h" + #include "Admin.h" +-#include "VendorString.h" ++#include <assert.h> + #include "stdint.h" + #include "malloc.h" + #include "string.h" ++#include "prototypes/platform_public_interface.h" + + #include <tee_internal_api.h> + #include <tee_internal_api_extensions.h> +@@ -116,12 +120,6 @@ static BOOL s_NVChipFileNeedsManufacture = FALSE; + static BOOL s_NVInitialized = FALSE; + static UCHAR s_NV[NV_CHIP_MEMORY_SIZE]; + +-// +-// Firmware revision +-// +-static const UINT32 firmwareV1 = FIRMWARE_V1; +-static const UINT32 firmwareV2 = FIRMWARE_V2; +- + // + // Revision fro NVChip + // +@@ -241,7 +239,7 @@ _plat__NvInitFromStorage() + } + + // Storage objects are open and valid, next validate revision +- s_chipRevision = ((((UINT64)firmwareV2) << 32) | (firmwareV1)); ++ s_chipRevision = ((((UINT64)_plat__GetTpmFirmwareVersionLow()) << 32) | (_plat__GetTpmFirmwareVersionHigh())); + if ((s_chipRevision != *(UINT64*)&(s_NV[NV_CHIP_REVISION_OFFSET]))) { + + // Failure to validate revision, re-init. +@@ -251,7 +249,7 @@ _plat__NvInitFromStorage() + s_blockMap = NV_DIRTY_ALL; + + // Init with proper revision +- s_chipRevision = ((((UINT64)firmwareV2) << 32) | (firmwareV1)); ++ s_chipRevision = ((((UINT64)_plat__GetTpmFirmwareVersionLow()) << 32) | (_plat__GetTpmFirmwareVersionHigh())); + *(UINT64*)&(s_NV[NV_CHIP_REVISION_OFFSET]) = s_chipRevision; + + #ifdef fTPMDebug +@@ -380,16 +378,16 @@ _plat__NvNeedsManufacture() + // <0 if unrecoverable error + LIB_EXPORT int + _plat__NVEnable( +- void *platParameter // IN: platform specific parameters ++ void *platParameter, // IN: platform specific parameters ++ size_t paramSize + ) + { + UNREFERENCED_PARAMETER(platParameter); ++ UNREFERENCED_PARAMETER(paramSize); + DMSG("_plat__NVEnable()"); + + + UINT32 retVal = 0; +- UINT32 firmwareV1 = FIRMWARE_V1; +- UINT32 firmwareV2 = FIRMWARE_V2; + + // Don't re-open the backing store. + if (s_NVInitialized) { +@@ -400,7 +398,7 @@ _plat__NVEnable( + memset(s_NV, 0, NV_CHIP_MEMORY_SIZE); + + // Prepare for potential failure to retreieve NV from storage +- s_chipRevision = ((((UINT64)firmwareV2) << 32) | (firmwareV1)); ++ s_chipRevision = ((((UINT64)_plat__GetTpmFirmwareVersionLow()) << 32) | (_plat__GetTpmFirmwareVersionHigh())); + *(UINT64*)&(s_NV[NV_CHIP_REVISION_OFFSET]) = s_chipRevision; + + // Pick up our NV memory. +@@ -458,11 +456,15 @@ _plat__NVEnable( + // Disable NV memory + LIB_EXPORT void + _plat__NVDisable( +- void ++ void *platParameter, ++ size_t paramSize + ) + { + UINT32 i; + ++ UNREFERENCED_PARAMETER(platParameter); ++ UNREFERENCED_PARAMETER(paramSize); ++ + if (!s_NVInitialized) { + return; + } +@@ -491,7 +493,7 @@ _plat__NVDisable( + // 1 NV is not available due to write failure + // 2 NV is not available due to rate limit + LIB_EXPORT int +-_plat__IsNvAvailable( ++_plat__GetNvReadyState( + void + ) + { +@@ -503,7 +505,7 @@ _plat__IsNvAvailable( + + //***_plat__NvMemoryRead() + // Function: Read a chunk of NV memory +-LIB_EXPORT void ++LIB_EXPORT int + _plat__NvMemoryRead( + unsigned int startOffset, // IN: read start + unsigned int size, // IN: size of bytes to read +@@ -514,22 +516,30 @@ _plat__NvMemoryRead( + pAssert(s_NV != NULL); + + memcpy(data, &s_NV[startOffset], size); ++ return TRUE; + } + +-//*** _plat__NvIsDifferent() ++//*** _plat__NvGetChangedStatus() + // This function checks to see if the NV is different from the test value. This is + // so that NV will not be written if it has not changed. + // return value: int +-// TRUE(1) the NV location is different from the test value +-// FALSE(0) the NV location is the same as the test value +-LIB_EXPORT int +-_plat__NvIsDifferent( +- unsigned int startOffset, // IN: read start +- unsigned int size, // IN: size of bytes to read +- void *data // IN: data buffer ++// NV_HAS_CHANGED(1) the NV location is different from the test value ++// NV_IS_SAME(0) the NV location is the same as the test value ++// NV_INVALID_LOCATION(-1) the NV location is invalid; also triggers failure mode ++LIB_EXPORT int _plat__NvGetChangedStatus( ++ unsigned int startOffset, // IN: read start ++ unsigned int size, // IN: size of bytes to read ++ void* data // IN: data buffer + ) + { +- return (memcmp(&s_NV[startOffset], data, size) != 0); ++ assert(startOffset + size <= NV_MEMORY_SIZE); ++ if(startOffset + size <= NV_MEMORY_SIZE) ++ { ++ return (memcmp(&s_NV[startOffset], data, size) != 0); ++ } ++ // the NV location is invalid; the assert above should have triggered failure ++ // mode ++ return NV_INVALID_LOCATION; + } + + static +@@ -584,7 +594,7 @@ _plat__NvMemoryWrite( + //***_plat__NvMemoryClear() + // Function is used to set a range of NV memory bytes to an implementation-dependent + // value. The value represents the erase state of the memory. +-LIB_EXPORT void ++LIB_EXPORT int + _plat__NvMemoryClear( + unsigned int start, // IN: clear start + unsigned int size // IN: number of bytes to clear +@@ -594,13 +604,14 @@ _plat__NvMemoryClear( + + _plat__MarkDirtyBlocks(start, size); + memset(&s_NV[start], 0, size); ++ return TRUE; + } + + //***_plat__NvMemoryMove() + // Function: Move a chunk of NV memory from source to destination + // This function should ensure that if there overlap, the original data is + // copied before it is written +-LIB_EXPORT void ++LIB_EXPORT int + _plat__NvMemoryMove( + unsigned int sourceOffset, // IN: source offset + unsigned int destOffset, // IN: destination offset +@@ -615,6 +626,7 @@ _plat__NvMemoryMove( + _plat__MarkDirtyBlocks(destOffset, size); + + memmove(&s_NV[destOffset], &s_NV[sourceOffset], size); ++ return TRUE; + } + + //***_plat__NvCommit() +@@ -655,3 +667,13 @@ _plat__ClearNvAvail( + // The anti-set; not on this platform. + return; + } ++ ++//***_plat__TearDown ++// notify platform that TPM_TearDown was called so platform can cleanup or ++// zeroize anything in the Platform. This should zeroize NV as well. ++LIB_EXPORT void _plat__TearDown() ++{ ++#if FILE_BACKED_NV ++ // remove(s_NvFilePath); ++#endif ++} +diff --git a/platform/NvAdmin.c b/platform/NvAdmin.c +index 2576001..6499ebd 100644 +--- a/platform/NvAdmin.c ++++ b/platform/NvAdmin.c +@@ -1,3 +1,7 @@ ++/* SPDX-License-Identifier: BSD-2-Clause */ ++/* ++ * Copyright (c) 2026, Siemens AG ++ */ + /* Microsoft Reference Implementation for TPM 2.0 + * + * The copyright in this software is being made available under the BSD License, +@@ -34,9 +38,6 @@ + */ + + //**Includes +-// Force Global.h contents inclusion +-#define GLOBAL_C +- + #include "Admin.h" + + //**Types, Structures, and Defines +@@ -148,4 +149,4 @@ _admin__NvWriteState( + + _plat__NvMemoryWrite(s_stateAddr[type], s_stateSize[type], buffer); + return; +-} +\ No newline at end of file ++} +diff --git a/platform/PPPlat.c b/platform/PPPlat.c +index 8b837a1..ffa3e8b 100644 +--- a/platform/PPPlat.c ++++ b/platform/PPPlat.c +@@ -1,3 +1,7 @@ ++/* SPDX-License-Identifier: BSD-2-Clause */ ++/* ++ * Copyright (c) 2026, Siemens AG ++ */ + /* Microsoft Reference Implementation for TPM 2.0 + * + * The copyright in this software is being made available under the BSD License, +@@ -38,7 +42,8 @@ + + //** Includes + #include "PlatformData.h" +-#include "Platform_fp.h" ++#include "platform_interface/tpm_to_platform_interface.h" ++#include "prototypes/platform_public_interface.h" + + //** Functions + +@@ -77,4 +82,4 @@ _plat__Signal_PhysicalPresenceOff( + { + s_physicalPresence = FALSE; + return; +-} +\ No newline at end of file ++} +diff --git a/platform/PlatformACT.c b/platform/PlatformACT.c +index 9528b08..54f35fa 100644 +--- a/platform/PlatformACT.c ++++ b/platform/PlatformACT.c +@@ -1,3 +1,7 @@ ++/* SPDX-License-Identifier: BSD-2-Clause */ ++/* ++ * Copyright (c) 2026, Siemens AG ++ */ + /* Microsoft Reference Implementation for TPM 2.0 + * + * The copyright in this software is being made available under the BSD License, +@@ -33,7 +37,8 @@ + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + //** Includes +-#include "Platform.h" ++#include "Tpm.h" ++#include "PlatformACT.h" + + //** Global variables + #define DEFINE_ACT(N) ACT_DATA ACT_##N; +diff --git a/platform/PlatformData.c b/platform/PlatformData.c +index ce37940..2b5a165 100644 +--- a/platform/PlatformData.c ++++ b/platform/PlatformData.c +@@ -1,3 +1,7 @@ ++/* SPDX-License-Identifier: BSD-2-Clause */ ++/* ++ * Copyright (c) 2026, Siemens AG ++ */ + /* Microsoft Reference Implementation for TPM 2.0 + * + * The copyright in this software is being made available under the BSD License, +@@ -37,7 +41,7 @@ + // descriptions for these variables are in Global.h for this project. + + //** Includes +-#include "TpmProfile.h" ++#include "TpmConfiguration/TpmProfile.h" + #include "PlatformData.h" + + // From Cancel.c +diff --git a/platform/PlatformPcr.c b/platform/PlatformPcr.c +new file mode 100644 +index 0000000..473d568 +--- /dev/null ++++ b/platform/PlatformPcr.c +@@ -0,0 +1,194 @@ ++/* SPDX-License-Identifier: BSD-2-Clause */ ++/* ++ * Copyright (c) 2026, Siemens AG ++ */ ++// Copied from the TCG reference implementation, see ++// https://github.com/TrustedComputingGroup/TPM/tree/main/TPMCmd/Platform/src/PlatformPcr.c, tag V184 ++/* ++ * TCG Reference Implementation for TPM 2.0 ++ * This code is informative. ++ * ++ * The copyright in this software is being made available under the BSD License, ++ * included below. ++ * ++ * Copyright 2010-2022 Microsoft Corporation ++ * Copyright 2022-2025 Trusted Computing Group and its contributors ++ * ++ * All rights reserved. ++ * ++ * BSD License ++ * ++ * Redistribution and use in source and binary forms, with or without ++ * modification, are permitted provided that the following conditions are met: ++ * ++ * Redistributions of source code must retain the above copyright notice, this ++ * list of conditions and the following disclaimer. ++ * ++ * Redistributions in binary form must reproduce the above copyright notice, this ++ * list of conditions and the following disclaimer in the documentation and/or ++ * other materials provided with the distribution. ++ * ++ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ""AS IS"" ++ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE ++ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE ++ * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE ++ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL ++ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR ++ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER ++ * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, ++ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE ++ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ++ */ ++ ++// PCR platform interface functions ++#include "Tpm.h" ++#include <tpm_public/TpmAlgorithmDefines.h> ++ ++// use this as a convenient lookup for hash size for PCRs. ++UINT16 CryptHashGetDigestSize(TPM_ALG_ID hashAlg // IN: hash algorithm to look up ++); ++void MemorySet(void* dest, int value, size_t size); ++ ++// The initial value of PCR attributes. The value of these fields should be ++// consistent with PC Client specification. The bitfield meanings are defined by ++// the TPM Reference code. ++// In this implementation, we assume the total number of implemented PCR is 24. ++static const PCR_Attributes s_initAttributes[] = { ++ // ++ // PCR 0 - 15, static RTM ++ // PCR[0] ++ { ++ 1, // save state ++ 0, // in the "do not increment the PcrCounter" group? (0 = increment the PcrCounter) ++ 0, // supportsPolicyAuth group number? 0 = policyAuth not supported for this PCR. ++ 0, // supportsAuthValue group number? 0 = AuthValue not supported for this PCR. ++ 0, // 0 = reset localities (cannot reset) ++ 0x1F // 0x1F = extendlocalities [0,4] ++ }, ++ {1, 0, 0, 0, 0, 0x1F}, // PCR 1-3 ++ {1, 0, 0, 0, 0, 0x1F}, ++ {1, 0, 0, 0, 0, 0x1F}, ++ {1, 0, 0, 0, 0, 0x1F}, // PCR 4-6 ++ {1, 0, 0, 0, 0, 0x1F}, ++ {1, 0, 0, 0, 0, 0x1F}, ++ {1, 0, 0, 0, 0, 0x1F}, // PCR 7-9 ++ {1, 0, 0, 0, 0, 0x1F}, ++ {1, 0, 0, 0, 0, 0x1F}, ++ {1, 0, 0, 0, 0, 0x1F}, // PCR 10-12 ++ {1, 0, 0, 0, 0, 0x1F}, ++ {1, 0, 0, 0, 0, 0x1F}, ++ {1, 0, 0, 0, 0, 0x1F}, // PCR 13-15 ++ {1, 0, 0, 0, 0, 0x1F}, ++ {1, 0, 0, 0, 0, 0x1F}, ++ ++ // these PCRs are never saved ++ {0, 0, 0, 0, 0x0F, 0x1F}, // PCR 16, Debug, reset allowed, extend all ++ {0, 0, 0, 0, 0x10, 0x1C}, // PCR 17, Locality 4, extend loc 2+ ++ {0, 0, 0, 0, 0x10, 0x1C}, // PCR 18, Locality 3, extend loc 2+ ++ {0, 0, 0, 0, 0x10, 0x0C}, // PCR 19, Locality 2, extend loc 2, 3 ++ // these three support doNotIncrement, PolicyAuth, and AuthValue. ++ // this is consistent with the existing behavior of the TPM Reference code ++ // but differs from the behavior of the PC client spec. ++ {0, 1, 1, 1, 0x14, 0x0E}, // PCR 20, Locality 1, extend loc 1, 2, 3 ++ {0, 1, 1, 1, 0x14, 0x04}, // PCR 21, Dynamic OS, extend loc 2 ++ {0, 1, 1, 1, 0x14, 0x04}, // PCR 22, Dynamic OS, extend loc 2 ++ {0, 0, 0, 0, 0x0F, 0x1F}, // PCR 23, reset allowed, App specific, extend all ++}; ++ ++#ifndef ARRAYSIZE ++# define ARRAYSIZE(a) (sizeof(a) / sizeof(a[0])) ++#endif ++ ++MUST_BE(ARRAYSIZE(s_initAttributes) == IMPLEMENTATION_PCR); ++ ++#if ALG_SHA256 != YES && ALG_SHA384 != YES ++# error No default PCR banks defined ++#endif ++ ++static const TPM_ALG_ID DefaultActivePcrBanks[] = { ++#if ALG_SHA256 ++ TPM_ALG_SHA256 ++#endif ++#if ALG_SHA384 ++# if ALG_SHA256 ++ , ++# endif ++ TPM_ALG_SHA384 ++#endif ++}; ++ ++UINT32 _platPcr__NumberOfPcrs(void) ++{ ++ return ARRAYSIZE(s_initAttributes); ++} ++ ++// return the initialization attributes of a given PCR. ++// pcrNumber expected to be in [0, _platPcr__NumberOfPcrs) ++// returns the attributes for PCR[0] if the requested pcrNumber is out of range. ++PCR_Attributes _platPcr__GetPcrInitializationAttributes(UINT32 pcrNumber) ++{ ++ if(pcrNumber >= _platPcr__NumberOfPcrs()) ++ { ++ pcrNumber = 0; ++ } ++ return s_initAttributes[pcrNumber]; ++} ++ ++// should the given PCR algorithm default to active in a new TPM? ++BOOL _platPcr_IsPcrBankDefaultActive(TPM_ALG_ID pcrAlg) ++{ ++ // brute force search is fast enough for a small array. ++ for(unsigned int i = 0; i < ARRAYSIZE(DefaultActivePcrBanks); i++) ++ { ++ if(DefaultActivePcrBanks[i] == pcrAlg) ++ { ++ return TRUE; ++ } ++ } ++ return FALSE; ++} ++ ++// Fill a given buffer with the PCR initialization value for a particular PCR and hash ++// combination, and return its length. If the platform doesn't have a value, then ++// the result size is expected to be zero, and the rfunction will return TPM_RC_PCR. ++// If a valid is not available, then the core TPM library will ignore the value and ++// treat it as non-existant and provide a default. ++// If the buffer is not large enough for a pcr consistent with pcrAlg, then the ++// platform will return TPM_RC_FAILURE. ++TPM_RC _platPcr__GetInitialValueForPcr( ++ UINT32 pcrNumber, // IN: PCR to be initialized ++ TPM_ALG_ID pcrAlg, // IN: Algorithm of the PCR Bank being initialized ++ BYTE startupLocality, // IN: locality where startup is being called from ++ BYTE* pcrData, // OUT: buffer to put PCR initialization value into ++ uint16_t bufferSize, // IN: maximum size of value buffer can hold ++ uint16_t* pcrLength // OUT: size of initialization value returned in pcrBuffer ++) ++{ ++ // If the reset locality contains locality 4, then this ++ // indicates a DRTM PCR where the reset value is all ones, ++ // otherwise it is all zero. Don't check with equal because ++ // resetLocality is a bitfield of multiple values and does ++ // not support extended localities. ++ uint16_t pcrSize = CryptHashGetDigestSize(pcrAlg); ++ pAssert_RC(pcrNumber < _platPcr__NumberOfPcrs()); ++ pAssert_RC(bufferSize >= pcrSize) pAssert_RC(pcrLength != NULL); ++ ++ PCR_Attributes pcrAttributes = ++ _platPcr__GetPcrInitializationAttributes(pcrNumber); ++ BYTE defaultValue = 0; ++ // PCRs that can be cleared from locality 4 are DRTM and initialize to all 0xFF ++ if((pcrAttributes.resetLocality & 0x10) != 0) ++ { ++ defaultValue = 0xFF; ++ } ++ MemorySet(pcrData, defaultValue, pcrSize); ++ if(pcrNumber == HCRTM_PCR) ++ { ++ pcrData[pcrSize - 1] = startupLocality; ++ } ++ ++ // platform could provide a value here if the platform has initialization rules ++ // different from the original PC Client spec (the default used by the Core library). ++ *pcrLength = pcrSize; ++ return TPM_RC_SUCCESS; ++} +diff --git a/platform/PowerPlat.c b/platform/PowerPlat.c +index c562d44..27de17b 100644 +--- a/platform/PowerPlat.c ++++ b/platform/PowerPlat.c +@@ -1,3 +1,7 @@ ++/* SPDX-License-Identifier: BSD-2-Clause */ ++/* ++ * Copyright (c) 2026, Siemens AG ++ */ + /* Microsoft Reference Implementation for TPM 2.0 + * + * The copyright in this software is being made available under the BSD License, +@@ -35,8 +39,9 @@ + //** Includes and Function Prototypes + + #include "PlatformData.h" +-#include "Platform_fp.h" +-#include "_TPM_Init_fp.h" ++#include "platform_interface/tpm_to_platform_interface.h" ++#include "prototypes/platform_public_interface.h" ++#include "platform_interface/prototypes/_TPM_Init_fp.h" + + //** Functions + +@@ -107,7 +112,7 @@ _plat__Signal_PowerOff( + ) + { + // Prepare NV memory for power off +- _plat__NVDisable(); ++ _plat__NVDisable(NULL, 0); + + return; +-} +\ No newline at end of file ++} +diff --git a/platform/RunCommand.c b/platform/RunCommand.c +index 78c641a..100cf4c 100644 +--- a/platform/RunCommand.c ++++ b/platform/RunCommand.c +@@ -1,3 +1,7 @@ ++/* SPDX-License-Identifier: BSD-2-Clause */ ++/* ++ * Copyright (c) 2026, Siemens AG ++ */ + /* Microsoft Reference Implementation for TPM 2.0 + * + * The copyright in this software is being made available under the BSD License, +@@ -48,9 +52,10 @@ + + //** Includes and locals + #include "PlatformData.h" +-#include "Platform_fp.h" ++#include "platform_interface/tpm_to_platform_interface.h" ++#include "prototypes/platform_public_interface.h" + #include <setjmp.h> +-#include "ExecCommand_fp.h" ++#include "platform_interface/prototypes/ExecCommand_fp.h" + + #include <tee_internal_api.h> + #include <tee_internal_api_extensions.h> +@@ -77,15 +82,3 @@ _plat__RunCommand( + setjmp(s_jumpBuffer); + ExecuteCommand(requestSize, request, responseSize, response); + } +- +- +-//***_plat__Fail() +-// This is the platform depended failure exit for the TPM. +-LIB_EXPORT NORETURN void +-_plat__Fail( +- void +- ) +-{ +- TEE_Panic(TEE_ERROR_BAD_STATE); +- while (true); /* Not reached */ +-} +diff --git a/platform/SelfTest.c b/platform/SelfTest.c +new file mode 100644 +index 0000000..a39b69e +--- /dev/null ++++ b/platform/SelfTest.c +@@ -0,0 +1,18 @@ ++/* SPDX-License-Identifier: BSD-2-Clause */ ++/* ++ * Copyright (c) 2026, Siemens AG ++ */ ++#include "Platform.h" ++#include <tpm_public/TpmAlgorithmDefines.h> ++#include <tpm_public/TpmTypes.h> ++ ++LIB_EXPORT void _plat_GetEnabledSelfTest( ++ uint8_t fullTest, // IN: full test or not ++ uint8_t* pToTestVector, // INOUT: initialized byte array of tracked tests ++ size_t toTestVectorSize // IN: size of the byte array in bytes ++) ++{ ++ (void)fullTest; ++ (void)pToTestVector; ++ (void)toTestVectorSize; ++} +diff --git a/platform/Unique.c b/platform/Unique.c +deleted file mode 100644 +index 4702670..0000000 +--- a/platform/Unique.c ++++ /dev/null +@@ -1,102 +0,0 @@ +-/* Microsoft Reference Implementation for TPM 2.0 +- * +- * The copyright in this software is being made available under the BSD License, +- * included below. This software may be subject to other third party and +- * contributor rights, including patent rights, and no such rights are granted +- * under this license. +- * +- * Copyright (c) Microsoft Corporation +- * +- * All rights reserved. +- * +- * BSD License +- * +- * Redistribution and use in source and binary forms, with or without modification, +- * are permitted provided that the following conditions are met: +- * +- * Redistributions of source code must retain the above copyright notice, this list +- * of conditions and the following disclaimer. +- * +- * Redistributions in binary form must reproduce the above copyright notice, this +- * list of conditions and the following disclaimer in the documentation and/or +- * other materials provided with the distribution. +- * +- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ""AS IS"" +- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +- * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +- * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +- * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +- * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +- * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +- * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +- */ +-//** Introduction +-// In some implementations of the TPM, the hardware can provide a secret +-// value to the TPM. This secret value is statistically unique to the +-// instance of the TPM. Typical uses of this value are to provide +-// personalization to the random number generation and as a shared secret +-// between the TPM and the manufacturer. +- +-//** Includes +-#include "PlatformData.h" +-#include "Platform_fp.h" +- +-#include <tee_internal_api.h> +-#include <assert.h> +- +-//static TEE_UUID deviceUniqueValue = { 0 }; +-static char *deviceUniqueValue[sizeof(TEE_UUID)+1]; +-static bool initializedUniqueValue = false; +- +-//** _plat__GetUnique() +-// This function is used to access the platform-specific unique value. +-// This function places the unique value in the provided buffer ('b') +-// and returns the number of bytes transferred. The function will not +-// copy more data than 'bSize'. +-// NOTE: If a platform unique value has unequal distribution of uniqueness +-// and 'bSize' is smaller than the size of the unique value, the 'bSize' +-// portion with the most uniqueness should be returned. +-LIB_EXPORT uint32_t +-_plat__GetUnique( +- uint32_t which, // authorities (0) or details +- uint32_t bSize, // size of the buffer +- unsigned char *b // output buffer +- ) +-{ +- const char *from = (char *)&deviceUniqueValue; +- uint32_t uSize = sizeof(TEE_UUID) + 1; +- uint32_t retVal = 0; +- TEE_Result teeResult; +- +- // Check if we've initialized our unique platform value. +- if (!initializedUniqueValue) { +- teeResult = TEE_GetPropertyAsUUID(TEE_PROPSET_TEE_IMPLEMENTATION, +- "gpd.tee.deviceID", +- (TEE_UUID*)&deviceUniqueValue); +- assert(teeResult == TEE_SUCCESS); +- } +- deviceUniqueValue[uSize-1] = '\0'; +- +- if(which == 0) // the authorities value +- { +- for(retVal = 0; +- *from != 0 && retVal < bSize; +- retVal++) +- { +- *b++ = *from++; +- } +- } +- else +- { +- b = &b[((bSize < uSize) ? bSize : uSize) - 1]; +- for(retVal = 0; +- *from != 0 && retVal < bSize; +- retVal++) +- { +- *b-- = *from++; +- } +- } +- return retVal; +-} +\ No newline at end of file +diff --git a/platform/VendorInfo.c b/platform/VendorInfo.c +new file mode 100644 +index 0000000..63710f3 +--- /dev/null ++++ b/platform/VendorInfo.c +@@ -0,0 +1,220 @@ ++/* SPDX-License-Identifier: BSD-2-Clause */ ++/* ++ * Copyright (c) 2026, Siemens AG ++ */ ++// Copied from the TCG reference implementation, see ++// https://github.com/TrustedComputingGroup/TPM/tree/main/TPMCmd/Platform/src/VendorInfo.c, tag V184 ++/* ++ * TCG Reference Implementation for TPM 2.0 ++ * This code is informative. ++ * ++ * The copyright in this software is being made available under the BSD License, ++ * included below. ++ * ++ * Copyright 2010-2022 Microsoft Corporation ++ * Copyright 2022-2025 Trusted Computing Group and its contributors ++ * ++ * All rights reserved. ++ * ++ * BSD License ++ * ++ * Redistribution and use in source and binary forms, with or without ++ * modification, are permitted provided that the following conditions are met: ++ * ++ * Redistributions of source code must retain the above copyright notice, this ++ * list of conditions and the following disclaimer. ++ * ++ * Redistributions in binary form must reproduce the above copyright notice, this ++ * list of conditions and the following disclaimer in the documentation and/or ++ * other materials provided with the distribution. ++ * ++ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ""AS IS"" ++ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE ++ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE ++ * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE ++ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL ++ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR ++ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER ++ * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, ++ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE ++ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ++ */ ++ ++//** 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 "OPTE" ++#define VENDOR_STRING_1 "xCG " ++#define VENDOR_STRING_2 "fTPM" ++#define VENDOR_STRING_3 "\0\0\0\0" ++#define VENDOR_STRING_4 "\0\0\0\0" ++#define FIRMWARE_V1 (0x20260326) ++#define FIRMWARE_V2 (0x00130000) ++#define MAX_SVN 255 ++ ++#if (FW_LIMITED_SUPPORT || SIMULATION) ++static uint32_t currentHash = FIRMWARE_V2; ++#endif ++static uint16_t currentSvn = 10; ++ ++// Similar to the Core Library's ByteArrayToUint32, but usable in Platform code. ++static uint32_t StringToUint32(const 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(void) ++{ ++ 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(void) ++{ ++ return FIRMWARE_V1; ++} ++ ++// return the least-significant 32-bits of the TPM Firmware Version reported by ++// getCapability. ++LIB_EXPORT uint32_t _plat__GetTpmFirmwareVersionLow(void) ++{ ++ return FIRMWARE_V2; ++} ++ ++// 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. ++#if SIMULATION ++LIB_EXPORT void _plat__SetTpmFirmwareHash(uint32_t hash) ++{ ++ currentHash = hash; ++} ++#endif ++ ++// Called by the simulator to set the TPM Firmware SVN reported by ++// getCapability. ++#if SIMULATION ++LIB_EXPORT void _plat__SetTpmFirmwareSvn(uint16_t svn) ++{ ++ currentSvn = MIN(svn, MAX_SVN); ++} ++#endif ++ ++#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__GetVendorTpmType(void) ++{ ++ return 1; // just the value the reference code has returned in the past. ++} ++ ++LIB_EXPORT void _plat_GetSpecCapabilityValue(SPEC_CAPABILITY_VALUE* returnData) ++{ ++ // clang-format off ++ // this is on the title page of part1 of the TPM spec ++ returnData->tpmSpecLevel = 0; ++ // these come from part2 of the TPM spec ++ returnData->tpmSpecVersion = 184; ++ returnData->tpmSpecYear = 2025; ++ returnData->tpmSpecDayOfYear = 79; // March 20 ++ // these come from the PC Client Platform TPM Profile Specification ++ returnData->platformFamily = 1; ++ returnData->platfromLevel = 0; ++ // The platform spec version is recorded such that 0x00000101 means version 1.01 ++ // Note this differs from some TPM/TCG specifications, but matches the behavior of Windows. ++ // more recent TCG specs have discontinued using this field, but Windows displays it, so we ++ // retain it using the historical encoding. ++ returnData->platformRevision = 0x105; ++ returnData->platformYear = 0; ++ returnData->platformDayOfYear = 0; ++ // clang-format on ++ return; ++} +diff --git a/platform/include/Admin.h b/platform/include/Admin.h +index cb7e4d9..1a9a54a 100644 +--- a/platform/include/Admin.h ++++ b/platform/include/Admin.h +@@ -1,6 +1,7 @@ + /* SPDX-License-Identifier: BSD-2-Clause */ + /* + * Copyright (c) 2024, Linaro Limited ++ * Copyright (c) 2026, Siemens AG + */ + /* Microsoft Reference Implementation for TPM 2.0 + * +@@ -48,12 +49,10 @@ + #define _ADMIN_H + + //**Includes +-#include <stdint.h> ++#include "Tpm.h" + #include <trace.h> +-#include "swap.h" +-#include "TpmProfile.h" ++#include "TpmConfiguration/TpmProfile.h" + #include "TpmSal.h" +-#include "TpmError.h" + #include "GpMacros.h" + + // Parameter reference and types from ref impl headers +diff --git a/platform/include/Platform.h b/platform/include/Platform.h +index b95a193..a87aee7 100644 +--- a/platform/include/Platform.h ++++ b/platform/include/Platform.h +@@ -1,3 +1,7 @@ ++/* SPDX-License-Identifier: BSD-2-Clause */ ++/* ++ * Copyright (c) 2026, Siemens AG ++ */ + /* Microsoft Reference Implementation for TPM 2.0 + * + * The copyright in this software is being made available under the BSD License, +@@ -36,17 +40,21 @@ + #ifndef _PLATFORM_H_ + #define _PLATFORM_H_ + +-#include "TpmBuildSwitches.h" ++#include "TpmConfiguration/TpmBuildSwitches.h" + #include "BaseTypes.h" + #include "TPMB.h" + #include "MinMax.h" + +-#include "TpmProfile.h" ++#include "TpmConfiguration/TpmProfile.h" + + #include "PlatformACT.h" + #include "PlatformClock.h" + #include "PlatformData.h" +-#include "Platform_fp.h" ++#include "prototypes/platform_public_interface.h" ++// TODO_RENAME_INC_FOLDER:platform_interface refers to the TPM_CoreLib platform interface ++//#include <platform_interface/tpm_to_platform_interface.h> ++//#include <platform_interface/platform_to_tpm_interface.h> ++#include "PlatformInternal.h" + + + #endif // _PLATFORM_H_ +diff --git a/platform/include/PlatformData.h b/platform/include/PlatformData.h +index 0beb4c2..bc9c5aa 100644 +--- a/platform/include/PlatformData.h ++++ b/platform/include/PlatformData.h +@@ -1,3 +1,7 @@ ++/* SPDX-License-Identifier: BSD-2-Clause */ ++/* ++ * Copyright (c) 2026, Siemens AG ++ */ + /* Microsoft Reference Implementation for TPM 2.0 + * + * The copyright in this software is being made available under the BSD License, +@@ -38,8 +42,8 @@ + #ifndef _PLATFORM_DATA_H_ + #define _PLATFORM_DATA_H_ + +- +-#include "TpmProfile.h" ++#include "Tpm.h" ++#include "TpmConfiguration/TpmProfile.h" + + // From Cancel.c + // Cancel flag. It is initialized as FALSE, which indicate the command is not +diff --git a/platform/include/Platform_fp.h b/platform/include/Platform_fp.h +deleted file mode 100644 +index 74069e6..0000000 +--- a/platform/include/Platform_fp.h ++++ /dev/null +@@ -1,492 +0,0 @@ +-/* Microsoft Reference Implementation for TPM 2.0 +- * +- * The copyright in this software is being made available under the BSD License, +- * included below. This software may be subject to other third party and +- * contributor rights, including patent rights, and no such rights are granted +- * under this license. +- * +- * Copyright (c) Microsoft Corporation +- * +- * All rights reserved. +- * +- * BSD License +- * +- * Redistribution and use in source and binary forms, with or without modification, +- * are permitted provided that the following conditions are met: +- * +- * Redistributions of source code must retain the above copyright notice, this list +- * of conditions and the following disclaimer. +- * +- * Redistributions in binary form must reproduce the above copyright notice, this +- * list of conditions and the following disclaimer in the documentation and/or +- * other materials provided with the distribution. +- * +- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ""AS IS"" +- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +- * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +- * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +- * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +- * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +- * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +- * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +- */ +-/*(Auto-generated) +- * Created by TpmPrototypes; Version 3.0 July 18, 2017 +- * Date: Aug 7, 2018 Time: 03:39:35PM +- */ +- +-#ifndef _PLATFORM_FP_H_ +-#define _PLATFORM_FP_H_ +- +-//** From EPS.c +- +-LIB_EXPORT void +-_plat__GetEPS(UINT16 Size, uint8_t *EndorsementSeed); +- +-//** From Cancel.c +- +-//***_plat__IsCanceled() +-// Check if the cancel flag is set +-// return type: BOOL +-// TRUE(1) if cancel flag is set +-// FALSE(0) if cancel flag is not set +-LIB_EXPORT int +-_plat__IsCanceled( +- void +- ); +- +-// Set cancel flag. +-LIB_EXPORT void +-_plat__SetCancel( +- void +- ); +- +-//***_plat__ClearCancel() +-// Clear cancel flag +-LIB_EXPORT void +-_plat__ClearCancel( +- void +- ); +- +- +-//** From Clock.c +- +-//***_plat__TimerReset() +-// This function sets current system clock time as t0 for counting TPM time. +-// This function is called at a power on event to reset the clock. When the clock +-// is reset, the indication that the clock was stopped is also set. +-LIB_EXPORT void +-_plat__TimerReset( +- void +- ); +- +-//*** _plat__TimerRestart() +-// This function should be called in order to simulate the restart of the timer +-// should it be stopped while power is still applied. +-LIB_EXPORT void +-_plat__TimerRestart( +- void +- ); +- +-//*** _plat__RealTime() +-// This is another, probably futile, attempt to define a portable function +-// that will return a 64-bit clock value that has mSec resolution. +-uint64_t +-_plat__RealTime( +- void +-); +- +-//***_plat__TimerRead() +-// This function provides access to the tick timer of the platform. The TPM code +-// uses this value to drive the TPM Clock. +-// +-// The tick timer is supposed to run when power is applied to the device. This timer +-// should not be reset by time events including _TPM_Init. It should only be reset +-// when TPM power is re-applied. +-// +-// If the TPM is run in a protected environment, that environment may provide the +-// tick time to the TPM as long as the time provided by the environment is not +-// allowed to go backwards. If the time provided by the system can go backwards +-// during a power discontinuity, then the _plat__Signal_PowerOn should call +-// _plat__TimerReset(). +-LIB_EXPORT uint64_t +-_plat__TimerRead( +- void +- ); +- +-//*** _plat__TimerWasReset() +-// This function is used to interrogate the flag indicating if the tick timer has +-// been reset. +-// +-// If the resetFlag parameter is SET, then the flag will be CLEAR before the +-// function returns. +-LIB_EXPORT BOOL +-_plat__TimerWasReset( +- void +- ); +- +-//*** _plat__TimerWasStopped() +-// This function is used to interrogate the flag indicating if the tick timer has +-// been stopped. If so, this is typically a reason to roll the nonce. +-// +-// This function will CLEAR the s_timerStopped flag before returning. This provides +-// functionality that is similar to status register that is cleared when read. This +-// is the model used here because it is the one that has the most impact on the TPM +-// code as the flag can only be accessed by one entity in the TPM. Any other +-// implementation of the hardware can be made to look like a read-once register. +-LIB_EXPORT BOOL +-_plat__TimerWasStopped( +- void +- ); +- +-//***_plat__ClockAdjustRate() +-// Adjust the clock rate +-LIB_EXPORT void +-_plat__ClockAdjustRate( +- int adjust // IN: the adjust number. It could be positive +- // or negative +- ); +- +- +-//** From Entropy.c +- +-//** _plat__GetEntropy() +-// This function is used to get available hardware entropy. In a hardware +-// implementation of this function, there would be no call to the system +-// to get entropy. +-// return type: int32_t +-// < 0 hardware failure of the entropy generator, this is sticky +-// >= 0 the returned amount of entropy (bytes) +-// +-LIB_EXPORT int32_t +-_plat__GetEntropy( +- unsigned char *entropy, // output buffer +- uint32_t amount // amount requested +- ); +- +- +-//** From LocalityPlat.c +- +-//***_plat__LocalityGet() +-// Get the most recent command locality in locality value form. +-// This is an integer value for locality and not a locality structure +-// The locality can be 0-4 or 32-255. 5-31 is not allowed. +-LIB_EXPORT unsigned char +-_plat__LocalityGet( +- void +- ); +- +-//***_plat__LocalitySet() +-// Set the most recent command locality in locality value form +-LIB_EXPORT void +-_plat__LocalitySet( +- unsigned char locality +- ); +- +- +-//** From NVMem.c +- +-//*** _plat__NvErrors() +-// This function is used by the simulator to set the error flags in the NV +-// subsystem to simulate an error in the NV loading process +-LIB_EXPORT void +-_plat__NvErrors( +- int recoverable, +- int unrecoverable +- ); +- +-//***_plat__NVEnable() +-// Enable NV memory. +-// +-// This version just pulls in data from a file. In a real TPM, with NV on chip, +-// this function would verify the integrity of the saved context. If the NV +-// memory was not on chip but was in something like RPMB, the NV state would be +-// read in, decrypted and integrity checked. +-// +-// The recovery from an integrity failure depends on where the error occurred. It +-// it was in the state that is discarded by TPM Reset, then the error is +-// recoverable if the TPM is reset. Otherwise, the TPM must go into failure mode. +-// return type: int +-// 0 if success +-// > 0 if receive recoverable error +-// <0 if unrecoverable error +-LIB_EXPORT int +-_plat__NVEnable( +- void *platParameter // IN: platform specific parameters +- ); +- +-//***_plat__NVDisable() +-// Disable NV memory +-LIB_EXPORT void +-_plat__NVDisable( +- void +- ); +- +-//***_plat__IsNvAvailable() +-// Check if NV is available +-// return type: int +-// 0 NV is available +-// 1 NV is not available due to write failure +-// 2 NV is not available due to rate limit +-LIB_EXPORT int +-_plat__IsNvAvailable( +- void +- ); +- +-//***_plat__NvMemoryRead() +-// Function: Read a chunk of NV memory +-LIB_EXPORT void +-_plat__NvMemoryRead( +- unsigned int startOffset, // IN: read start +- unsigned int size, // IN: size of bytes to read +- void *data // OUT: data buffer +- ); +- +-//*** _plat__NvIsDifferent() +-// This function checks to see if the NV is different from the test value. This is +-// so that NV will not be written if it has not changed. +-// return value: int +-// TRUE(1) the NV location is different from the test value +-// FALSE(0) the NV location is the same as the test value +-LIB_EXPORT int +-_plat__NvIsDifferent( +- unsigned int startOffset, // IN: read start +- unsigned int size, // IN: size of bytes to read +- void *data // IN: data buffer +- ); +- +-//***_plat__NvMemoryWrite() +-// This function is used to update NV memory. The "write" is to a memory copy of +-// NV. At the end of the current command, any changes are written to +-// the actual NV memory. +-// NOTE: A useful optimization would be for this code to compare the current +-// contents of NV with the local copy and note the blocks that have changed. Then +-// only write those blocks when _plat__NvCommit() is called. +-LIB_EXPORT int +-_plat__NvMemoryWrite( +- unsigned int startOffset, // IN: write start +- unsigned int size, // IN: size of bytes to write +- void *data // OUT: data buffer +- ); +- +-//***_plat__NvMemoryClear() +-// Function is used to set a range of NV memory bytes to an implementation-dependent +-// value. The value represents the erase state of the memory. +-LIB_EXPORT void +-_plat__NvMemoryClear( +- unsigned int start, // IN: clear start +- unsigned int size // IN: number of bytes to clear +- ); +- +-//***_plat__NvMemoryMove() +-// Function: Move a chunk of NV memory from source to destination +-// This function should ensure that if there overlap, the original data is +-// copied before it is written +-LIB_EXPORT void +-_plat__NvMemoryMove( +- unsigned int sourceOffset, // IN: source offset +- unsigned int destOffset, // IN: destination offset +- unsigned int size // IN: size of data being moved +- ); +- +-//***_plat__NvCommit() +-// This function writes the local copy of NV to NV for permanent store. It will write +-// NV_MEMORY_SIZE bytes to NV. If a file is use, the entire file is written. +-// return type: int +-// 0 NV write success +-// non-0 NV write fail +-LIB_EXPORT int +-_plat__NvCommit( +- void +- ); +- +-//***_plat__SetNvAvail() +-// Set the current NV state to available. This function is for testing purpose +-// only. It is not part of the platform NV logic +-LIB_EXPORT void +-_plat__SetNvAvail( +- void +- ); +- +-//***_plat__ClearNvAvail() +-// Set the current NV state to unavailable. This function is for testing purpose +-// only. It is not part of the platform NV logic +-LIB_EXPORT void +-_plat__ClearNvAvail( +- void +- ); +- +- +-//** From PowerPlat.c +- +-//***_plat__Signal_PowerOn() +-// Signal platform power on +-LIB_EXPORT int +-_plat__Signal_PowerOn( +- void +- ); +- +-//*** _plat__WasPowerLost() +-// Test whether power was lost before a _TPM_Init. +-// +-// This function will clear the "hardware" indication of power loss before return. +-// This means that there can only be one spot in the TPM code where this value +-// gets read. This method is used here as it is the most difficult to manage in the +-// TPM code and, if the hardware actually works this way, it is hard to make it +-// look like anything else. So, the burden is placed on the TPM code rather than the +-// platform code +-// return type: int +-// TRUE(1) power was lost +-// FALSE(0) power was not lost +-LIB_EXPORT int +-_plat__WasPowerLost( +- void +- ); +- +-//*** _plat_Signal_Reset() +-// This a TPM reset without a power loss. +-LIB_EXPORT int +-_plat__Signal_Reset( +- void +- ); +- +-//***_plat__Signal_PowerOff() +-// Signal platform power off +-LIB_EXPORT void +-_plat__Signal_PowerOff( +- void +- ); +- +- +-//** From PPPlat.c +- +-//***_plat__PhysicalPresenceAsserted() +-// Check if physical presence is signaled +-// return type: int +-// TRUE(1) if physical presence is signaled +-// FALSE(0) if physical presence is not signaled +-LIB_EXPORT int +-_plat__PhysicalPresenceAsserted( +- void +- ); +- +-//***_plat__Signal_PhysicalPresenceOn() +-// Signal physical presence on +-LIB_EXPORT void +-_plat__Signal_PhysicalPresenceOn( +- void +- ); +- +-//***_plat__Signal_PhysicalPresenceOff() +-// Signal physical presence off +-LIB_EXPORT void +-_plat__Signal_PhysicalPresenceOff( +- void +- ); +- +- +-//*** _plat__ACT_UpdateCounter() +-// This function is used to write the newValue for the counter. If an update is +-// pending, then no update occurs and the function returns FALSE. If 'setSignaled' +-// is TRUE, then the ACT signaled state is SET and if 'newValue' is 0, nothing +-// is posted. +-LIB_EXPORT int +-_plat__ACT_UpdateCounter( +- uint32_t act, // IN: ACT to update +- uint32_t newValue // IN: the value to post +-); +- +-//*** _plat__ACT_SetSignaled() +-LIB_EXPORT void +-_plat__ACT_SetSignaled( +- uint32_t act, +- int on +-); +- +-//***_plat__ACT_Initialize() +-// This function initializes the ACT hardware and data structures +-LIB_EXPORT int +-_plat__ACT_Initialize( +- void +-); +- +-//***_plat__ACT_EnableTicks() +-// This enables and disables the processing of the once-per-second ticks. This should +-// be turned off ('enable' = FALSE) by _TPM_Init and turned on ('enable' = TRUE) by +-// TPM2_Startup() after all the initializations have completed. +-LIB_EXPORT void +-_plat__ACT_EnableTicks( +- int enable +-); +- +-//*** _plat__ACT_GetRemaining() +-// This function returns the remaining time. If an update is pending, 'newValue' is +-// returned. Otherwise, the current counter value is returned. Note that since the +-// timers keep running, the returned value can get stale immediately. The actual count +-// value will be no greater than the returned value. +-LIB_EXPORT uint32_t +-_plat__ACT_GetRemaining( +- uint32_t act //IN: the ACT selector +-); +- +-//*** _plat__ACT_GetSignaled() +-LIB_EXPORT int +-_plat__ACT_GetSignaled( +- uint32_t act //IN: number of ACT to check +-); +- +-//*** _plat__ACT_GetImplemented() +-// This function tests to see if an ACT is implemented. It is a belt and suspenders +-// function because the TPM should not be calling to manipulate an ACT that is not +-// implemented. However, this could help the simulator code which doesn't necessarily +-// know if an ACT is implemented or not. +-LIB_EXPORT int +-_plat__ACT_GetImplemented( +- uint32_t act +-); +- +-//** From RunCommand.c +- +-//***_plat__RunCommand() +-// This version of RunCommand will set up a jum_buf and call ExecuteCommand(). If +-// the command executes without failing, it will return and RunCommand will return. +-// If there is a failure in the command, then _plat__Fail() is called and it will +-// longjump back to RunCommand which will call ExecuteCommand again. However, this +-// time, the TPM will be in failure mode so ExecuteCommand will simply build +-// a failure response and return. +-LIB_EXPORT void +-_plat__RunCommand( +- uint32_t requestSize, // IN: command buffer size +- unsigned char *request, // IN: command buffer +- uint32_t *responseSize, // IN/OUT: response buffer size +- unsigned char **response // IN/OUT: response buffer +- ); +- +-//***_plat__Fail() +-// This is the platform depended failure exit for the TPM. +-LIB_EXPORT NORETURN void +-_plat__Fail( +- void +- ); +- +- +-//** From Unique.c +- +-//** _plat__GetUnique() +-// This function is used to access the platform-specific unique value. +-// This function places the unique value in the provided buffer ('b') +-// and returns the number of bytes transferred. The function will not +-// copy more data than 'bSize'. +-// NOTE: If a platform unique value has unequal distribution of uniqueness +-// and 'bSize' is smaller than the size of the unique value, the 'bSize' +-// portion with the most uniqueness should be returned. +-LIB_EXPORT uint32_t +-_plat__GetUnique( +- uint32_t which, // authorities (0) or details +- uint32_t bSize, // size of the buffer +- unsigned char *b // output buffer +- ); +- +-#endif // _PLATFORM_FP_H_ +diff --git a/platform/include/TpmConfiguration/TpmBuildSwitches.h b/platform/include/TpmConfiguration/TpmBuildSwitches.h +new file mode 100644 +index 0000000..ba7294c +--- /dev/null ++++ b/platform/include/TpmConfiguration/TpmBuildSwitches.h +@@ -0,0 +1,275 @@ ++/* SPDX-License-Identifier: BSD-2-Clause */ ++/* ++ * Copyright (c) 2026, Siemens AG ++ */ ++// Copied from the TCG reference implementation, see ++// https://github.com/TrustedComputingGroup/TPM/tree/main/TPMCmd/TpmConfiguration/TpmConfiguration/TpmBuildSwitches.h, tag V184 ++/* ++ * TCG Reference Implementation for TPM 2.0 ++ * This code is informative. ++ * ++ * The copyright in this software is being made available under the BSD License, ++ * included below. ++ * ++ * Copyright 2010-2022 Microsoft Corporation ++ * Copyright 2022-2025 Trusted Computing Group and its contributors ++ * ++ * All rights reserved. ++ * ++ * BSD License ++ * ++ * Redistribution and use in source and binary forms, with or without ++ * modification, are permitted provided that the following conditions are met: ++ * ++ * Redistributions of source code must retain the above copyright notice, this ++ * list of conditions and the following disclaimer. ++ * ++ * Redistributions in binary form must reproduce the above copyright notice, this ++ * list of conditions and the following disclaimer in the documentation and/or ++ * other materials provided with the distribution. ++ * ++ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ""AS IS"" ++ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE ++ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE ++ * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE ++ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL ++ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR ++ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER ++ * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, ++ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE ++ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ++ */ ++ ++// This file contains the build switches. This contains switches for multiple ++// versions of the crypto-library so some may not apply to your environment. ++// Each switch has an accompanying description below. ++// ++// clang-format off ++#ifndef _TPM_BUILD_SWITCHES_H_ ++#define _TPM_BUILD_SWITCHES_H_ ++ ++#if defined(YES) || defined(NO) ++# error YES and NO should be defined in TpmBuildSwitches.h ++#endif ++#if defined(SET) || defined(CLEAR) ++# error SET and CLEAR should be defined in TpmBuildSwitches.h ++#endif ++ ++#define YES 1 ++#define SET 1 ++#define NO 0 ++#define CLEAR 0 ++ ++// TRUE/FALSE may be coming from system headers, but if not, provide them. ++#ifndef TRUE ++# define TRUE 1 ++#endif ++#ifndef FALSE ++# define FALSE 0 ++#endif ++ ++// Need an unambiguous definition for DEBUG. Do not change this ++#ifndef DEBUG ++# ifdef NDEBUG ++# define DEBUG NO ++# else ++# define DEBUG YES ++# endif ++#elif(DEBUG != NO) && (DEBUG != YES) ++# error DEBUG should be 0 or 1 ++#endif ++ ++//////////////////////////////////////////////////////////////// ++// DEBUG OPTIONS ++//////////////////////////////////////////////////////////////// ++ ++// The SIMULATION switch allows certain other macros to be enabled. The things that ++// can be enabled in a simulation include key caching, reproducible "random" ++// sequences, instrumentation of the RSA key generation process, and certain other ++// debug code. SIMULATION Needs to be defined as either YES or NO. This grouping of ++// macros will make sure that it is set correctly. A simulated TPM would include a ++// Virtual TPM. The interfaces for a Virtual TPM should be modified from the standard ++// ones in the Simulator project. ++#define SIMULATION NO ++ ++// ENABLE_TPM_DEBUG_PRINT enables arbitrary string printing. ++// enables the TPM_DEBUG_PRINT macro to route debugging strings ++// to the _plat_debug_out function ++#define ENABLE_TPM_DEBUG_PRINT (YES * SIMULATION) ++ ++// ENABLE_TPM_DEBUG_TRACE enables code tracing macros - depends on TPM_DEBUG_PRINT ++#define ENABLE_TPM_DEBUG_TRACE (NO * ENABLE_TPM_DEBUG_PRINT) ++ ++// ENABLE_CRYPTO_DEBUG enables printing of actual crypto values. This is entirely insecure. ++#define ENABLE_CRYPTO_DEBUG (YES * ENABLE_TPM_DEBUG_PRINT) ++ ++// The CRYPTO_LIB_REPORTING switch allows the TPM to report its ++// crypto library implementation, e.g., at simulation startup. ++#define CRYPTO_LIB_REPORTING YES ++ ++// If doing debug, can set the DRBG to print out the intermediate test values. ++// Before enabling this, make sure that the dbgDumpMemBlock() function ++// has been added someplace (preferably, somewhere in CryptRand.c) ++#define DRBG_DEBUG_PRINT (NO * DEBUG) ++ ++// This define is used to control the debug for the CertifyX509 command. ++#define CERTIFYX509_DEBUG (NO * DEBUG) ++ ++// This provides fixed seeding of the RNG when doing debug on a simulator. This ++// should allow consistent results on test runs as long as the input parameters ++// to the functions remains the same. ++#define USE_DEBUG_RNG (NO * DEBUG) ++ ++//////////////////////////////////////////////////////////////// ++// RSA DEBUG OPTIONS ++//////////////////////////////////////////////////////////////// ++ ++// Enable the instrumentation of the sieve process. This is used to tune the sieve ++// variables. ++#define RSA_INSTRUMENT (NO * DEBUG) ++ ++// Enables use of the key cache. Default is YES ++#define USE_RSA_KEY_CACHE (NO * DEBUG) ++ ++// Enables use of a file to store the key cache values so that the TPM will start ++// faster during debug. Default for this is YES ++#define USE_KEY_CACHE_FILE (NO * DEBUG) ++ ++//////////////////////////////////////////////////////////////// ++// TEST OPTIONS ++//////////////////////////////////////////////////////////////// ++// The SIMULATION flag can enable test crypto behaviors and caching that ++// significantly change the behavior of the code. This flag controls only the ++// g_forceFailureMode flag in the TPM library while leaving the rest of the TPM ++// behavior alone. Useful for testing when the full set of options controlled by ++// SIMULATION may not be desired. ++#define ALLOW_FORCE_FAILURE_MODE NO ++ ++//////////////////////////////////////////////////////////////// ++// Internal checks ++//////////////////////////////////////////////////////////////// ++ ++// Define this to run the function that checks the compatibility between the ++// chosen big number math library and the TPM code. Not all ports use this. ++// This can be set to NO once https://github.com/microsoft/ms-tpm-20-ref/commit/fcccc82514609f8f61bca69646695303b0197b64 ++// has been applied to https://github.com/TrustedComputingGroup/TPM/blob/main/TPMCmd/tpm/cryptolibs/TpmBigNum/TpmBigNumThunks.c ++#define LIBRARY_COMPATIBILITY_CHECK YES ++ ++// In some cases, the relationship between two values may be dependent on things that ++// change based on various selections like the chosen cryptographic libraries. It is ++// possible that these selections will result in incompatible settings. These are often ++// detectable by the compiler but it is not always possible to do the check in the ++// preprocessor code. For example, when the check requires use of 'sizeof'() then the ++// preprocessor can't do the comparison. For these cases, we include a special macro ++// that, depending on the compiler will generate a warning to indicate if the check ++// always passes or always fails because it involves fixed constants. ++// ++// In modern compilers this is now commonly known as a static_assert, but the precise ++// implementation varies by compiler. CompilerDependencies.h defines MUST_BE as a macro ++// that abstracts out the differences, and COMPILER_CHECKS can remove the checks where ++// the current compiler doesn't support it. COMPILER_CHECKS should be enabled if the ++// compiler supports some form of static_assert. ++// See the CompilerDependencies_*.h files for specific implementations per compiler. ++#ifdef fTPMDebug ++#define COMPILER_CHECKS YES ++#else ++#define COMPILER_CHECKS NO ++#endif ++ ++// Some of the values (such as sizes) are the result of different options set in ++// TpmProfile.h. The combination might not be consistent. A function is defined ++// (TpmSizeChecks()) that is used to verify the sizes at run time. To enable the ++// function, define this parameter. ++#ifdef fTPMDebug ++#define RUNTIME_SIZE_CHECKS YES ++#else ++#define RUNTIME_SIZE_CHECKS NO ++#endif ++ ++//////////////////////////////////////////////////////////////// ++// Compliance options ++//////////////////////////////////////////////////////////////// ++ ++// Enable extra behaviors to meet FIPS compliance requirements ++#define FIPS_COMPLIANT YES ++ ++// Indicates if the implementation is to compute the sizes of the proof and primary ++// seed size values based on the implemented algorithms. ++#define USE_SPEC_COMPLIANT_PROOFS YES ++ ++// Set this to allow compile to continue even though the chosen proof values ++// do not match the compliant values. This is written so that someone would ++// have to proactively ignore errors. ++#define SKIP_PROOF_ERRORS NO ++ ++//////////////////////////////////////////////////////////////// ++// Implementation alternatives - don't change external behavior ++//////////////////////////////////////////////////////////////// ++// does the target system have longjmp support, AND we want to use it? ++#define LONGJMP_SUPPORTED NO ++ ++// Define TABLE_DRIVEN_DISPATCH to use tables rather than case statements ++// for command dispatch and handle unmarshaling ++#define TABLE_DRIVEN_DISPATCH YES ++ ++// This define is used to enable the new table-driven marshaling code. ++#define TABLE_DRIVEN_MARSHAL NO ++ ++// This switch allows use of #defines in place of pass-through marshaling or ++// unmarshaling code. A pass-through function just calls another function to do ++// the required function and does no parameter checking of its own. The ++// table-driven dispatcher calls directly to the lowest level ++// marshaling/unmarshaling code and by-passes any pass-through functions. ++#define USE_MARSHALING_DEFINES YES ++ ++// Switch added to support packed lists that leave out space associated with ++// unimplemented commands. Comment this out to use linear lists. ++// Note: if vendor specific commands are present, the associated list is always ++// in compressed form. ++#define COMPRESSED_LISTS YES ++ ++// This define is used to eliminate the use of bit-fields. It can be enabled for big- ++// or little-endian machines. For big-endian architectures that numbers bits in ++// registers from left to right (MSb0) this must be enabled. Little-endian machines ++// number from right to left with the least significant bit having assigned a bit ++// number of 0. These are LSb0 machines (they are also little-endian so they are also ++// least-significant byte 0 (LSB0) machines. Big-endian (MSB0) machines may number in ++// either direction (MSb0 or LSb0). For an MSB0+MSb0 machine this value is required to ++// be 'NO' ++#define USE_BIT_FIELD_STRUCTURES NO ++ ++// Enable the generation of RSA primes using a sieve. ++#define RSA_KEY_SIEVE YES ++ ++//////////////////////////////////////////////////////////////// ++// Implementation alternatives - changes external behavior ++//////////////////////////////////////////////////////////////// ++ ++// This switch enables the RNG state save and restore ++#define _DRBG_STATE_SAVE YES ++ ++// Definition to allow alternate behavior for non-orderly startup. If there is a ++// chance that the TPM could not update 'failedTries' ++#define USE_DA_USED YES ++ ++// This switch is used to enable the self-test capability in AlgorithmTests.c ++#define ENABLE_SELF_TESTS YES ++ ++// This switch indicates where clock epoch value should be stored. If this value ++// defined, then it is assumed that the timer will change at any time so the ++// nonce should be a random number kept in RAM. When it is not defined, then the ++// timer only stops during power outages. ++#define CLOCK_STOPS NO ++ ++// Indicate if the implementation is going to give lockout time credit for time up to ++// the last orderly shutdown. ++#define ACCUMULATE_SELF_HEAL_TIMER YES ++ ++// If an assertion event is not going to produce any trace information (function and ++// line number) then make FAIL_TRACE == NO ++#define FAIL_TRACE YES ++ ++// TODO_RENAME_INC_FOLDER: public refers to the TPM_CoreLib public headers ++#include <tpm_public/CompilerDependencies.h> ++ ++#endif // _TPM_BUILD_SWITCHES_H_ +diff --git a/platform/include/TpmConfiguration/TpmProfile_CommandList.h b/platform/include/TpmConfiguration/TpmProfile_CommandList.h +new file mode 100644 +index 0000000..7012351 +--- /dev/null ++++ b/platform/include/TpmConfiguration/TpmProfile_CommandList.h +@@ -0,0 +1,213 @@ ++/* SPDX-License-Identifier: BSD-2-Clause */ ++/* ++ * Copyright (c) 2026, Siemens AG ++ */ ++// Copied from the TCG reference implementation, see ++// https://github.com/TrustedComputingGroup/TPM/tree/main/TPMCmd/TpmConfiguration/TpmConfiguration/TpmBuildSwitches.h, tag V184 ++/* ++ * TCG Reference Implementation for TPM 2.0 ++ * This code is informative. ++ * ++ * The copyright in this software is being made available under the BSD License, ++ * included below. ++ * ++ * Copyright 2010-2022 Microsoft Corporation ++ * Copyright 2022-2025 Trusted Computing Group and its contributors ++ * ++ * All rights reserved. ++ * ++ * BSD License ++ * ++ * Redistribution and use in source and binary forms, with or without ++ * modification, are permitted provided that the following conditions are met: ++ * ++ * Redistributions of source code must retain the above copyright notice, this ++ * list of conditions and the following disclaimer. ++ * ++ * Redistributions in binary form must reproduce the above copyright notice, this ++ * list of conditions and the following disclaimer in the documentation and/or ++ * other materials provided with the distribution. ++ * ++ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ""AS IS"" ++ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE ++ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE ++ * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE ++ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL ++ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR ++ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER ++ * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, ++ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE ++ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ++ */ ++ ++// this file defines the desired command list that should be built into the ++// Tpm Core Lib. ++ ++#ifndef _TPM_PROFILE_COMMAND_LIST_H_ ++#define _TPM_PROFILE_COMMAND_LIST_H_ ++ ++#if(YES != 1 || NO != 0) ++# error YES and NO must be correctly set before including TpmProfile_CommandList.h ++#endif ++#if defined(CC_YES) || defined(CC_NO) ++# error CC_YES and CC_NO should be defined by the command line file, not before ++#endif ++ ++// Change these definitions to turn all commands ON or OFF. That is, to turn all ++// commands on, set CC_NO to YES. This is intended as a debug feature. ++#define CC_YES YES ++#define CC_NO NO ++ ++// do not format automatically - the comments confuse clang-format. ++// clang-format off ++ ++// Defines for Implemented Commands ++ ++// Commands that are defined in the spec, but not implemented for various ++// reasons: ++ ++// The TPM reference implementation does not implement attached-component ++// features, and the Compliance test suite has no test cases. ++#define CC_AC_GetCapability CC_NO ++#define CC_AC_Send CC_NO ++ ++// The TPM reference implementation does not implement firmware upgrade. ++#define CC_FieldUpgradeData CC_NO ++#define CC_FieldUpgradeStart CC_NO ++#define CC_FirmwareRead CC_NO ++ ++// A prototype of CertifyX509 is provided here for informative purposes only. ++// While all of the TPM reference implementation is provided "AS IS" without any ++// warranty, the current design and implementation of CertifyX509 are considered ++// to be especially unsuitable for product use. ++#define CC_CertifyX509 CC_YES ++ ++// Normal commands: ++ ++#define CC_ACT_SetTimeout (CC_YES && ACT_SUPPORT) ++#define CC_ActivateCredential CC_YES ++#define CC_Certify CC_YES ++#define CC_CertifyCreation CC_YES ++#define CC_ChangeEPS CC_YES ++#define CC_ChangePPS CC_YES ++#define CC_Clear CC_YES ++#define CC_ClearControl CC_YES ++#define CC_ClockRateAdjust CC_YES ++#define CC_ClockSet CC_YES ++#define CC_Commit (CC_YES && ALG_ECC) ++#define CC_ContextLoad CC_YES ++#define CC_ContextSave CC_YES ++#define CC_Create CC_YES ++#define CC_CreateLoaded CC_YES ++#define CC_CreatePrimary CC_YES ++#define CC_DictionaryAttackLockReset CC_YES ++#define CC_DictionaryAttackParameters CC_YES ++#define CC_Duplicate CC_YES ++#define CC_ECC_Decrypt (CC_YES && ALG_ECC) ++#define CC_ECC_Encrypt (CC_YES && ALG_ECC) ++#define CC_ECC_Parameters (CC_YES && ALG_ECC) ++#define CC_ECDH_KeyGen (CC_YES && ALG_ECC) ++#define CC_ECDH_ZGen (CC_YES && ALG_ECC) ++#define CC_EC_Ephemeral (CC_YES && ALG_ECC) ++#define CC_EncryptDecrypt CC_YES ++#define CC_EncryptDecrypt2 CC_YES ++#define CC_EventSequenceComplete CC_YES ++#define CC_EvictControl CC_YES ++#define CC_FlushContext CC_YES ++#define CC_GetCapability CC_YES ++#define CC_GetCommandAuditDigest CC_YES ++#define CC_GetRandom CC_YES ++#define CC_GetSessionAuditDigest CC_YES ++#define CC_GetTestResult CC_YES ++#define CC_GetTime CC_YES ++#define CC_HMAC (CC_YES && !ALG_CMAC) ++#define CC_HMAC_Start (CC_YES && !ALG_CMAC) ++#define CC_Hash CC_YES ++#define CC_HashSequenceStart CC_YES ++#define CC_HierarchyChangeAuth CC_YES ++#define CC_HierarchyControl CC_YES ++#define CC_Import CC_YES ++#define CC_IncrementalSelfTest CC_YES ++#define CC_Load CC_YES ++#define CC_LoadExternal CC_YES ++#define CC_MAC (CC_YES && ALG_CMAC) ++#define CC_MAC_Start (CC_YES && ALG_CMAC) ++#define CC_MakeCredential CC_YES ++#define CC_NV_Certify CC_YES ++#define CC_NV_ChangeAuth CC_YES ++#define CC_NV_DefineSpace CC_YES ++#define CC_NV_Extend CC_YES ++#define CC_NV_GlobalWriteLock CC_YES ++#define CC_NV_Increment CC_YES ++#define CC_NV_Read CC_YES ++#define CC_NV_ReadLock CC_YES ++#define CC_NV_ReadPublic CC_YES ++#define CC_NV_SetBits CC_YES ++#define CC_NV_UndefineSpace CC_YES ++#define CC_NV_UndefineSpaceSpecial CC_YES ++#define CC_NV_Write CC_YES ++#define CC_NV_WriteLock CC_YES ++#define CC_ObjectChangeAuth CC_YES ++#define CC_PCR_Allocate CC_YES ++#define CC_PCR_Event CC_YES ++#define CC_PCR_Extend CC_YES ++#define CC_PCR_Read CC_YES ++#define CC_PCR_Reset CC_YES ++#define CC_PCR_SetAuthPolicy CC_YES ++#define CC_PCR_SetAuthValue CC_YES ++#define CC_PP_Commands CC_YES ++#define CC_PolicyAuthValue CC_YES ++#define CC_PolicyAuthorize CC_YES ++#define CC_PolicyAuthorizeNV CC_YES ++#define CC_PolicyCapability CC_YES ++#define CC_PolicyCommandCode CC_YES ++#define CC_PolicyCounterTimer CC_YES ++#define CC_PolicyCpHash CC_YES ++#define CC_PolicyDuplicationSelect CC_YES ++#define CC_PolicyGetDigest CC_YES ++#define CC_PolicyLocality CC_YES ++#define CC_PolicyNV CC_YES ++#define CC_PolicyNameHash CC_YES ++#define CC_PolicyNvWritten CC_YES ++#define CC_PolicyOR CC_YES ++#define CC_PolicyPCR CC_YES ++#define CC_PolicyPassword CC_YES ++#define CC_PolicyParameters CC_YES ++#define CC_PolicyPhysicalPresence CC_YES ++#define CC_PolicyRestart CC_YES ++#define CC_PolicySecret CC_YES ++#define CC_PolicySigned CC_YES ++#define CC_PolicyTemplate CC_YES ++#define CC_PolicyTicket CC_YES ++#define CC_Policy_AC_SendSelect CC_YES ++#define CC_Quote CC_YES ++#define CC_RSA_Decrypt (CC_YES && ALG_RSA) ++#define CC_RSA_Encrypt (CC_YES && ALG_RSA) ++#define CC_ReadClock CC_YES ++#define CC_ReadPublic CC_YES ++#define CC_Rewrap CC_YES ++#define CC_SelfTest CC_YES ++#define CC_SequenceComplete CC_YES ++#define CC_SequenceUpdate CC_YES ++#define CC_SetAlgorithmSet CC_YES ++#define CC_SetCommandCodeAuditStatus CC_YES ++#define CC_SetPrimaryPolicy CC_YES ++#define CC_Shutdown CC_YES ++#define CC_Sign CC_YES ++#define CC_StartAuthSession CC_YES ++#define CC_Startup CC_YES ++#define CC_StirRandom CC_YES ++#define CC_TestParms CC_YES ++#define CC_Unseal CC_YES ++#define CC_Vendor_TCG_Test CC_YES ++#define CC_VerifySignature CC_YES ++#define CC_ZGen_2Phase (CC_YES && ALG_ECC) ++#define CC_NV_DefineSpace2 CC_YES ++#define CC_NV_ReadPublic2 CC_YES ++#define CC_SetCapability CC_NO ++#define CC_ReadOnlyControl CC_NO ++#define CC_PolicyTransportSPDM CC_NO ++ ++#define VENDOR_COMMAND_ARRAY_COUNT (CC_Vendor_TCG_Test) ++ ++#endif // _TPM_PROFILE_COMMAND_LIST_H_ +diff --git a/platform/include/TpmConfiguration/TpmProfile_Common.h b/platform/include/TpmConfiguration/TpmProfile_Common.h +new file mode 100644 +index 0000000..0ed6517 +--- /dev/null ++++ b/platform/include/TpmConfiguration/TpmProfile_Common.h +@@ -0,0 +1,278 @@ ++/* SPDX-License-Identifier: BSD-2-Clause */ ++/* ++ * Copyright (c) 2026, Siemens AG ++ */ ++// Copied from the TCG reference implementation, see ++// https://github.com/TrustedComputingGroup/TPM/tree/main/TPMCmd/TpmConfiguration/TpmConfiguration/TpmBuildSwitches.h, tag V184 ++/* ++ * TCG Reference Implementation for TPM 2.0 ++ * This code is informative. ++ * ++ * The copyright in this software is being made available under the BSD License, ++ * included below. ++ * ++ * Copyright 2010-2022 Microsoft Corporation ++ * Copyright 2022-2025 Trusted Computing Group and its contributors ++ * ++ * All rights reserved. ++ * ++ * BSD License ++ * ++ * Redistribution and use in source and binary forms, with or without ++ * modification, are permitted provided that the following conditions are met: ++ * ++ * Redistributions of source code must retain the above copyright notice, this ++ * list of conditions and the following disclaimer. ++ * ++ * Redistributions in binary form must reproduce the above copyright notice, this ++ * list of conditions and the following disclaimer in the documentation and/or ++ * other materials provided with the distribution. ++ * ++ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ""AS IS"" ++ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE ++ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE ++ * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE ++ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL ++ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR ++ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER ++ * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, ++ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE ++ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ++ */ ++ ++// clang-format off ++// clang-format off to preserve define alignment breaking sections. ++ ++// this file defines the common optional selections for the TPM library build ++// Requires basic YES/NO defines are already set (by TpmBuildSwitches.h) ++// Less frequently changed items are in other TpmProfile Headers. ++ ++#ifndef _TPM_PROFILE_COMMON_H_ ++#define _TPM_PROFILE_COMMON_H_ ++// YES & NO defined by TpmBuildSwitches.h ++#if (YES != 1 || NO != 0) ++# error YES or NO incorrectly set ++#endif ++#if defined(ALG_YES) || defined(ALG_NO) ++# error ALG_YES and ALG_NO should only be defined by the TpmProfile_Common.h file ++#endif ++ ++// Change these definitions to turn all algorithms ON or OFF. That is, to turn ++// all algorithms on, set ALG_NO to YES. This is intended as a debug feature. ++#define ALG_YES YES ++#define ALG_NO NO ++ ++// Defines according to the processor being built for. ++// Are building for a BIG_ENDIAN processor? ++#define BIG_ENDIAN_TPM NO ++#define LITTLE_ENDIAN_TPM !BIG_ENDIAN_TPM ++// Does the processor put the most-significant bit at bit position 0? ++#define MOST_SIGNIFICANT_BIT_0 NO ++#define LEAST_SIGNIFICANT_BIT_0 !MOST_SIGNIFICANT_BIT_0 ++// Does processor support Auto align? ++#define AUTO_ALIGN NO ++ ++//*********************************************** ++// Defines for Symmetric Algorithms ++//*********************************************** ++ ++#define ALG_AES ALG_YES ++ ++#define AES_128 (YES * ALG_AES) ++#define AES_192 (NO * ALG_AES) ++#define AES_256 (YES * ALG_AES) ++ ++#define ALG_SM4 ALG_YES ++ ++#define SM4_128 (NO * ALG_SM4) ++ ++#define ALG_CAMELLIA ALG_NO ++ ++#define CAMELLIA_128 (YES * ALG_CAMELLIA) ++#define CAMELLIA_192 (NO * ALG_CAMELLIA) ++#define CAMELLIA_256 (YES * ALG_CAMELLIA) ++ ++// must be yes if any above are yes. ++#define ALG_SYMCIPHER (ALG_AES || ALG_SM4 || ALG_CAMELLIA) ++#define ALG_CMAC (YES * ALG_SYMCIPHER) ++ ++// block cipher modes ++#define ALG_CTR ALG_YES ++#define ALG_OFB ALG_YES ++#define ALG_CBC ALG_YES ++#define ALG_CFB ALG_YES ++#define ALG_ECB ALG_YES ++ ++//*********************************************** ++// Defines for RSA Asymmetric Algorithms ++//*********************************************** ++#define ALG_RSA ALG_YES ++#define RSA_1024 (YES * ALG_RSA) ++#define RSA_2048 (YES * ALG_RSA) ++#define RSA_3072 (YES * ALG_RSA) ++#define RSA_4096 (YES * ALG_RSA) ++#define RSA_16384 (NO * ALG_RSA) ++ ++#define ALG_RSASSA (YES * ALG_RSA) ++#define ALG_RSAES (YES * ALG_RSA) ++#define ALG_RSAPSS (YES * ALG_RSA) ++#define ALG_OAEP (YES * ALG_RSA) ++ ++// RSA Implementation Styles ++// use Chinese Remainder Theorem (5 prime) format for private key ? ++#define CRT_FORMAT_RSA YES ++#define RSA_DEFAULT_PUBLIC_EXPONENT 0x00010001 ++ ++//*********************************************** ++// Defines for ECC Asymmetric Algorithms ++//*********************************************** ++#define ALG_ECC ALG_YES ++#define ALG_ECDH (YES * ALG_ECC) ++#define ALG_ECDSA (YES * ALG_ECC) ++#define ALG_ECDAA (YES * ALG_ECC) ++#define ALG_SM2 (YES * ALG_ECC) ++#define ALG_ECSCHNORR (YES * ALG_ECC) ++#define ALG_ECMQV (YES * ALG_ECC) ++#define ALG_KDF1_SP800_56A (YES * ALG_ECC) ++#define ALG_EDDSA (NO * ALG_ECC) ++#define ALG_EDDSA_PH (NO * ALG_ECC) ++ ++#define ECC_NIST_P192 (YES * ALG_ECC) ++#define ECC_NIST_P224 (YES * ALG_ECC) ++#define ECC_NIST_P256 (YES * ALG_ECC) ++#define ECC_NIST_P384 (YES * ALG_ECC) ++#define ECC_NIST_P521 (YES * ALG_ECC) ++#define ECC_BN_P256 (YES * ALG_ECC) ++#define ECC_BN_P638 (YES * ALG_ECC) ++#define ECC_SM2_P256 (YES * ALG_ECC) ++ ++#define ECC_BP_P256_R1 (NO * ALG_ECC) ++#define ECC_BP_P384_R1 (NO * ALG_ECC) ++#define ECC_BP_P512_R1 (NO * ALG_ECC) ++#define ECC_CURVE_25519 (NO * ALG_ECC) ++#define ECC_CURVE_448 (NO * ALG_ECC) ++ ++//*********************************************** ++// Defines for Hash/XOF Algorithms ++//*********************************************** ++#define ALG_MGF1 ALG_YES ++#define ALG_SHA1 ALG_YES ++#define ALG_SHA256 ALG_YES ++#define ALG_SHA256_192 ALG_NO ++#define ALG_SHA384 ALG_YES ++#define ALG_SHA512 ALG_NO ++ ++#define ALG_SHA3_256 ALG_NO ++#define ALG_SHA3_384 ALG_NO ++#define ALG_SHA3_512 ALG_NO ++ ++#define ALG_SM3_256 ALG_NO ++ ++#define ALG_SHAKE256_192 ALG_NO ++#define ALG_SHAKE256_256 ALG_NO ++#define ALG_SHAKE256_512 ALG_NO ++ ++//*********************************************** ++// Defines for Stateful Signature Algorithms ++//*********************************************** ++#define ALG_LMS ALG_NO ++#define ALG_XMSS ALG_NO ++ ++//*********************************************** ++// Defines for Keyed Hashes ++//*********************************************** ++#define ALG_KEYEDHASH ALG_YES ++#define ALG_HMAC ALG_YES ++ ++//*********************************************** ++// Defines for KDFs ++//*********************************************** ++#define ALG_KDF2 ALG_NO ++#define ALG_KDF1_SP800_108 ALG_YES ++ ++//*********************************************** ++// Defines for Obscuration/MISC/compatibility ++//*********************************************** ++#define ALG_XOR ALG_YES ++ ++//*********************************************** ++// Defines controlling ACT ++//*********************************************** ++#define ACT_SUPPORT YES ++#define RH_ACT_0 (YES * ACT_SUPPORT) ++#define RH_ACT_1 ( NO * ACT_SUPPORT) ++#define RH_ACT_2 ( NO * ACT_SUPPORT) ++#define RH_ACT_3 ( NO * ACT_SUPPORT) ++#define RH_ACT_4 ( NO * ACT_SUPPORT) ++#define RH_ACT_5 ( NO * ACT_SUPPORT) ++#define RH_ACT_6 ( NO * ACT_SUPPORT) ++#define RH_ACT_7 ( NO * ACT_SUPPORT) ++#define RH_ACT_8 ( NO * ACT_SUPPORT) ++#define RH_ACT_9 ( NO * ACT_SUPPORT) ++#define RH_ACT_A (YES * ACT_SUPPORT) ++#define RH_ACT_B ( NO * ACT_SUPPORT) ++#define RH_ACT_C ( NO * ACT_SUPPORT) ++#define RH_ACT_D ( NO * ACT_SUPPORT) ++#define RH_ACT_E ( NO * ACT_SUPPORT) ++#define RH_ACT_F ( NO * ACT_SUPPORT) ++ ++// number of vendor properties, must currently be 1. ++#define MAX_VENDOR_PROPERTY (1) ++ ++//*********************************************** ++// Enable VENDOR_PERMANENT_AUTH_HANDLE? ++//*********************************************** ++#define VENDOR_PERMANENT_AUTH_ENABLED NO ++// if YES, this must be valid per Part2 (TPM_RH_AUTH_00 - TPM_RH_AUTH_FF) ++// if NO, this must be #undef ++#undef VENDOR_PERMANENT_AUTH_HANDLE ++ ++//*********************************************** ++// Defines controlling optional implementation ++//*********************************************** ++#define FIELD_UPGRADE_IMPLEMENTED NO ++ ++//*********************************************** ++// Buffer Sizes based on implementation ++//*********************************************** ++// When using PC CRB, the page size for both commands and ++// control registers is 4k. The command buffer starts at ++// offset 0x80, so the net size available is: ++// #define MAX_COMMAND_SIZE (4096-0x80) ++// #define MAX_RESPONSE_SIZE (4096-0x80) ++#define MAX_COMMAND_SIZE (4096) ++#define MAX_RESPONSE_SIZE (4096) ++ ++//*********************************************** ++// Vendor Info ++//*********************************************** ++// max buffer for vendor commands ++// Max data buffer leaving space for TPM2B size prefix ++#define VENDOR_COMMAND_COUNT 0 ++#define MAX_VENDOR_BUFFER_SIZE (MAX_RESPONSE_SIZE-2) ++#define PRIVATE_VENDOR_SPECIFIC_BYTES RSA_PRIVATE_SIZE ++ ++//*********************************************** ++// Defines controlling Firmware- and SVN-limited objects ++//*********************************************** ++#define FW_LIMITED_SUPPORT NO ++#define SVN_LIMITED_SUPPORT NO ++ ++//*********************************************** ++// Defines controlling External NV ++//*********************************************** ++// This is a software reference implementation of the TPM: there is no ++// "external NV" as such. This #define configures the TPM to implement ++// "external NV" that is stored in the same place as "internal NV." ++// NOTE: enabling this doesn't necessarily mean that the expanded ++// (external-NV-specific) attributes are supported. ++#define EXTERNAL_NV YES ++ ++//*********************************************** ++// Defines controlling secure channel functionality ++//*********************************************** ++// This flag enables support for PolicyTransportSPDM. ++// See CC_PolicyTransportSPDM. ++#define SEC_CHANNEL_SUPPORT NO ++ ++#endif // _TPM_PROFILE_COMMON_H_ +diff --git a/reference/include/VendorString.h b/reference/include/VendorString.h +deleted file mode 100644 +index b2b798e..0000000 +--- a/reference/include/VendorString.h ++++ /dev/null +@@ -1,93 +0,0 @@ +-/* Microsoft Reference Implementation for TPM 2.0 +- * +- * The copyright in this software is being made available under the BSD License, +- * included below. This software may be subject to other third party and +- * contributor rights, including patent rights, and no such rights are granted +- * under this license. +- * +- * Copyright (c) Microsoft Corporation +- * +- * All rights reserved. +- * +- * BSD License +- * +- * Redistribution and use in source and binary forms, with or without modification, +- * are permitted provided that the following conditions are met: +- * +- * Redistributions of source code must retain the above copyright notice, this list +- * of conditions and the following disclaimer. +- * +- * Redistributions in binary form must reproduce the above copyright notice, this +- * list of conditions and the following disclaimer in the documentation and/or +- * other materials provided with the distribution. +- * +- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ""AS IS"" +- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +- * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +- * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +- * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +- * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +- * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +- * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +- */ +- +-#ifndef _VENDOR_STRING_H +-#define _VENDOR_STRING_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 "MSFT" +- +-// The following #if macro may be deleted after a proper MANUFACTURER is provided. +-#ifndef MANUFACTURER +-#error MANUFACTURER is not provided. \ +-Please modify include\VendorString.h to provide a specific \ +-manufacturer name. +-#endif +- +-// Define up to 4, 4-byte 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 +-// should be provided here. +-// The vendor strings 2-4 may also be defined as appropriately. +-#define VENDOR_STRING_1 "SSE " +-#define VENDOR_STRING_2 "fTPM" +-//#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 include\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. +- +-//Date of last update: (0xYYYMMDD) +-#define FIRMWARE_V1 (0x20180710) +-// the less significant 32-bits of a vendor-specific value +-// indicating the version of the firmware +- +-//Time of last update: (0x00HHMMSS) +-#define FIRMWARE_V2 (0x00105300) +- +-// 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 include\VendorString.h to provide a vendor-specific firmware \ +-version +-#endif +- +-#endif +diff --git a/sub.mk b/sub.mk +index 22bd860..2114f9f 100644 +--- a/sub.mk ++++ b/sub.mk +@@ -1,3 +1,9 @@ ++# SPDX-License-Identifier: BSD-2-Clause ++# ++# Copyright (c) 2024, Linaro Limited ++# Copyright (c) 2026, Siemens AG ++# ++ + CFG_FTPM_EMULATE_PPI ?= n + CFG_FTPM_TA_TEE_STORAGE_ID ?= TEE_STORAGE_PRIVATE + +@@ -9,32 +15,31 @@ CFG_FTPM_TA_TEE_STORAGE_ID ?= TEE_STORAGE_PRIVATE + # files here will make sure the correct files are used first. + # + +-cppflags-y += -include reference/include/VendorString.h +-cppflags-y += -include platform/include/Platform.h ++#cppflags-y += -include platform/include/Platform.h + +-cppflags-y += -DHASH_LIB=MBEDTLS -DSYM_LIB=TEE -DMATH_LIB=TEE +-cppflags-y += -DALG_CAMELLIA=ALG_NO -DALG_KDF2=ALG_NO +-cppflags-y += -DALG_SM3_256=NO -DALG_SM4=YES +-cppflags-y += -D_ARM_ -DFAIL_TRACE=NO +-cppflags-y += -DGCC -DSIMULATION=NO -DVTPM +-cppflags-y += -DRSA_INSTRUMENT=NO +-cppflags-y += -DCERTIFYX509_DEBUG=NO ++cppflags-y += -DHASH_LIB=MBEDTLS -DSYM_LIB=TEE -DMATH_LIB=TpmBigNum -DBN_MATH_LIB=TEE ++cppflags-y += -D_ARM_ ++cppflags-y += -DGCC -DVTPM + ifeq ($(CFG_TA_DEBUG),y) +-cppflags-y += -DCOMPILER_CHECKS=YES -DfTPMDebug -DRUNTIME_SIZE_CHECKS +-cppflags-y += -DLIBRARY_COMPATIBILITY_CHECK=NO ++cppflags-y += -DfTPMDebug + cppflags-y += -DTRACE_LEVEL=$(CFG_TEE_TA_LOG_LEVEL) +-else +-cppflags-y += -DCOMPILER_CHECKS=NO -DRUNTIME_SIZE_CHECKS=NO +-cppflags-y += -DLIBRARY_COMPATIBILITY_CHECK=NO + endif + ++# too many warnings with ms-tpm-20-ref ++cppflags-y += -Wno-strict-aliasing ++ + global-incdirs-y += include + global-incdirs-y += reference/include + global-incdirs-y += platform/include + + global-incdirs_ext-y += $(CFG_MS_TPM_20_REF)/TPMCmd/tpm/include +-global-incdirs_ext-y += $(CFG_MS_TPM_20_REF)/TPMCmd/tpm/include/prototypes ++global-incdirs_ext-y += $(CFG_MS_TPM_20_REF)/TPMCmd/tpm/include/tpm_public ++global-incdirs_ext-y += $(CFG_MS_TPM_20_REF)/TPMCmd/tpm/include/private ++global-incdirs_ext-y += $(CFG_MS_TPM_20_REF)/TPMCmd/tpm/include/private/prototypes ++global-incdirs_ext-y += $(CFG_MS_TPM_20_REF)/TPMCmd/tpm/cryptolibs/common/include + global-incdirs_ext-y += $(CFG_MS_TPM_20_REF)/TPMCmd/Platform/include ++global-incdirs_ext-y += $(CFG_MS_TPM_20_REF)/TPMCmd/TpmConfiguration ++global-incdirs_ext-y += $(CFG_MS_TPM_20_REF)/TPMCmd/tpm/cryptolibs/TpmBigNum/include/ + + cflags-y += -fno-strict-aliasing + cflags-y += -Wno-cast-align +@@ -65,8 +70,6 @@ cflags-fTPM.c-y += -Wno-unused-variable + cflags-fTPM.c-y += -Wno-incompatible-pointer-types + cflags-fTPM.c-y += -Wno-pointer-arith + cflags-fTPM.c-y += -Wno-format-truncation +-cflags-platform/EPS.c-y += -Wno-nested-externs +-cflags-platform/EPS.c-y += -Wno-implicit-function-declaration + cflags-platform/AdminPPI.c-y += -Wno-missing-declarations + cflags-platform/AdminPPI.c-y += -Wno-missing-prototypes + cflags-platform/AdminPPI.c-y += -Wno-unknown-pragmas +@@ -85,17 +88,21 @@ srcs-y += platform/AdminPPI.c + srcs-y += platform/Cancel.c + srcs-y += platform/Clock.c + srcs-y += platform/Entropy.c ++srcs-y += platform/ExtraData.c + srcs-y += platform/LocalityPlat.c + srcs-y += platform/NvAdmin.c + srcs-y += platform/NVMem.c + srcs-y += platform/PowerPlat.c + srcs-y += platform/PlatformData.c ++srcs-y += platform/PlatformPcr.c + srcs-y += platform/PPPlat.c + srcs-y += platform/RunCommand.c +-srcs-y += platform/Unique.c +-srcs-y += platform/EPS.c + srcs-y += platform/PlatformACT.c + srcs-y += platform/fTPM_helpers.c ++srcs-y += platform/VendorInfo.c ++srcs-y += platform/Failure.c ++srcs-y += platform/Init.c ++srcs-y += platform/SelfTest.c + + srcs-y += fTPM.c + +@@ -109,202 +116,215 @@ cppflags-y += -DMEASURED_BOOT + endif + + +-srcs-y += tee/TpmToTEEMath.c +-srcs-y += tee/TpmToTEESupport.c ++srcs-y += tee/BnToTEEMath.c ++srcs-y += tee/BnToTEESupport.c + srcs-y += tee/TpmToTEESym.c + +-srcs_ext_base-y := $(CFG_MS_TPM_20_REF)/TPMCmd/tpm/src/ +-srcs_ext-y += X509/X509_ECC.c +-srcs_ext-y += X509/X509_RSA.c +-srcs_ext-y += X509/TpmASN1.c +-srcs_ext-y += X509/X509_spt.c +-srcs_ext-y += command/Attestation/CertifyX509.c +-srcs_ext-y += command/Attestation/GetCommandAuditDigest.c +-srcs_ext-y += command/Attestation/GetSessionAuditDigest.c +-srcs_ext-y += command/Attestation/Attest_spt.c +-srcs_ext-y += command/Attestation/Quote.c +-srcs_ext-y += command/Attestation/Certify.c +-srcs_ext-y += command/Attestation/CertifyCreation.c +-srcs_ext-y += command/Attestation/GetTime.c +-srcs_ext-y += command/Random/GetRandom.c +-srcs_ext-y += command/Random/StirRandom.c +-srcs_ext-y += command/NVStorage/NV_WriteLock.c +-srcs_ext-y += command/NVStorage/NV_ReadPublic.c +-srcs_ext-y += command/NVStorage/NV_spt.c +-srcs_ext-y += command/NVStorage/NV_Increment.c +-srcs_ext-y += command/NVStorage/NV_ChangeAuth.c +-srcs_ext-y += command/NVStorage/NV_UndefineSpaceSpecial.c +-srcs_ext-y += command/NVStorage/NV_SetBits.c +-srcs_ext-y += command/NVStorage/NV_Write.c +-srcs_ext-y += command/NVStorage/NV_GlobalWriteLock.c +-srcs_ext-y += command/NVStorage/NV_Read.c +-srcs_ext-y += command/NVStorage/NV_Extend.c +-srcs_ext-y += command/NVStorage/NV_Certify.c +-srcs_ext-y += command/NVStorage/NV_ReadLock.c +-srcs_ext-y += command/NVStorage/NV_DefineSpace.c +-srcs_ext-y += command/NVStorage/NV_UndefineSpace.c +-srcs_ext-y += command/HashHMAC/HashSequenceStart.c +-srcs_ext-y += command/HashHMAC/SequenceUpdate.c +-srcs_ext-y += command/HashHMAC/MAC_Start.c +-srcs_ext-y += command/HashHMAC/EventSequenceComplete.c +-srcs_ext-y += command/HashHMAC/HMAC_Start.c +-srcs_ext-y += command/HashHMAC/SequenceComplete.c +-srcs_ext-y += command/Vendor/Vendor_TCG_Test.c +-srcs_ext-y += command/Ecdaa/Commit.c +-srcs_ext-y += command/Startup/Startup.c +-srcs_ext-y += command/Startup/Shutdown.c +-srcs_ext-y += command/FieldUpgrade/FieldUpgradeData.c +-srcs_ext-y += command/FieldUpgrade/FirmwareRead.c +-srcs_ext-y += command/FieldUpgrade/FieldUpgradeStart.c +-srcs_ext-y += command/Capability/TestParms.c +-srcs_ext-y += command/Capability/GetCapability.c +-srcs_ext-y += command/ClockTimer/ACT_spt.c +-srcs_ext-y += command/ClockTimer/ClockRateAdjust.c +-srcs_ext-y += command/ClockTimer/ACT_SetTimeout.c +-srcs_ext-y += command/ClockTimer/ClockSet.c +-srcs_ext-y += command/ClockTimer/ReadClock.c +-srcs_ext-y += command/Session/PolicyRestart.c +-srcs_ext-y += command/Session/StartAuthSession.c +-srcs_ext-y += command/EA/PolicyDuplicationSelect.c +-srcs_ext-y += command/EA/PolicyPCR.c +-srcs_ext-y += command/EA/PolicySecret.c +-srcs_ext-y += command/EA/PolicyTicket.c +-srcs_ext-y += command/EA/PolicyTemplate.c +-srcs_ext-y += command/EA/PolicyNV.c +-srcs_ext-y += command/EA/PolicyGetDigest.c +-srcs_ext-y += command/EA/PolicyCpHash.c +-srcs_ext-y += command/EA/PolicyOR.c +-srcs_ext-y += command/EA/Policy_spt.c +-srcs_ext-y += command/EA/PolicyLocality.c +-srcs_ext-y += command/EA/PolicyAuthorize.c +-srcs_ext-y += command/EA/PolicyAuthorizeNV.c +-srcs_ext-y += command/EA/PolicyPassword.c +-srcs_ext-y += command/EA/PolicyCounterTimer.c +-srcs_ext-y += command/EA/PolicyAuthValue.c +-srcs_ext-y += command/EA/PolicySigned.c +-srcs_ext-y += command/EA/PolicyNameHash.c +-srcs_ext-y += command/EA/PolicyNvWritten.c +-srcs_ext-y += command/EA/PolicyPhysicalPresence.c +-srcs_ext-y += command/EA/PolicyCommandCode.c +-srcs_ext-y += command/Hierarchy/ChangePPS.c +-srcs_ext-y += command/Hierarchy/HierarchyControl.c +-srcs_ext-y += command/Hierarchy/HierarchyChangeAuth.c +-srcs_ext-y += command/Hierarchy/ChangeEPS.c +-srcs_ext-y += command/Hierarchy/ClearControl.c +-srcs_ext-y += command/Hierarchy/Clear.c +-srcs_ext-y += command/Hierarchy/SetPrimaryPolicy.c +-srcs_ext-y += command/Hierarchy/CreatePrimary.c +-srcs_ext-y += command/CommandAudit/SetCommandCodeAuditStatus.c +-srcs_ext-y += command/Object/Object_spt.c +-srcs_ext-y += command/Object/ReadPublic.c +-srcs_ext-y += command/Object/Load.c +-srcs_ext-y += command/Object/LoadExternal.c +-srcs_ext-y += command/Object/MakeCredential.c +-srcs_ext-y += command/Object/Unseal.c +-srcs_ext-y += command/Object/CreateLoaded.c +-srcs_ext-y += command/Object/ObjectChangeAuth.c +-srcs_ext-y += command/Object/ActivateCredential.c +-srcs_ext-y += command/Object/Create.c +-srcs_ext-y += command/AttachedComponent/AC_GetCapability.c +-srcs_ext-y += command/AttachedComponent/AC_spt.c +-srcs_ext-y += command/AttachedComponent/AC_Send.c +-srcs_ext-y += command/AttachedComponent/Policy_AC_SendSelect.c +-srcs_ext-y += command/Signature/VerifySignature.c +-srcs_ext-y += command/Signature/Sign.c +-srcs_ext-y += command/Duplication/Import.c +-srcs_ext-y += command/Duplication/Rewrap.c +-srcs_ext-y += command/Duplication/Duplicate.c +-srcs_ext-y += command/Symmetric/EncryptDecrypt2.c +-srcs_ext-y += command/Symmetric/EncryptDecrypt_spt.c +-srcs_ext-y += command/Symmetric/HMAC.c +-srcs_ext-y += command/Symmetric/Hash.c +-srcs_ext-y += command/Symmetric/EncryptDecrypt.c +-srcs_ext-y += command/Symmetric/MAC.c +-srcs_ext-y += command/Context/ContextSave.c +-srcs_ext-y += command/Context/FlushContext.c +-srcs_ext-y += command/Context/Context_spt.c +-srcs_ext-y += command/Context/ContextLoad.c +-srcs_ext-y += command/Context/EvictControl.c +-srcs_ext-y += command/PCR/PCR_Reset.c +-srcs_ext-y += command/PCR/PCR_Allocate.c +-srcs_ext-y += command/PCR/PCR_Extend.c +-srcs_ext-y += command/PCR/PCR_SetAuthValue.c +-srcs_ext-y += command/PCR/PCR_Event.c +-srcs_ext-y += command/PCR/PCR_SetAuthPolicy.c +-srcs_ext-y += command/PCR/PCR_Read.c +-srcs_ext-y += command/DA/DictionaryAttackParameters.c +-srcs_ext-y += command/DA/DictionaryAttackLockReset.c +-srcs_ext-y += command/Misc/PP_Commands.c +-srcs_ext-y += command/Misc/SetAlgorithmSet.c +-srcs_ext-y += command/Testing/GetTestResult.c +-srcs_ext-y += command/Testing/SelfTest.c +-srcs_ext-y += command/Testing/IncrementalSelfTest.c +-srcs_ext-y += command/Asymmetric/ECC_Parameters.c +-srcs_ext-y += command/Asymmetric/RSA_Encrypt.c +-srcs_ext-y += command/Asymmetric/ECDH_ZGen.c +-srcs_ext-y += command/Asymmetric/ECDH_KeyGen.c +-srcs_ext-y += command/Asymmetric/ZGen_2Phase.c +-srcs_ext-y += command/Asymmetric/ECC_Decrypt.c +-srcs_ext-y += command/Asymmetric/RSA_Decrypt.c +-srcs_ext-y += command/Asymmetric/EC_Ephemeral.c +-srcs_ext-y += command/Asymmetric/ECC_Encrypt.c +-srcs_ext-y += subsystem/DA.c +-srcs_ext-y += subsystem/NvDynamic.c +-srcs_ext-y += subsystem/Object.c +-srcs_ext-y += subsystem/PP.c +-srcs_ext-y += subsystem/Session.c +-srcs_ext-y += subsystem/NvReserved.c +-srcs_ext-y += subsystem/Hierarchy.c +-srcs_ext-y += subsystem/Time.c +-srcs_ext-y += subsystem/PCR.c +-srcs_ext-y += subsystem/CommandAudit.c +-srcs_ext-y += events/_TPM_Hash_Start.c +-srcs_ext-y += events/_TPM_Init.c +-srcs_ext-y += events/_TPM_Hash_Data.c +-srcs_ext-y += events/_TPM_Hash_End.c +-srcs_ext-y += crypt/CryptSmac.c +-srcs_ext-y += crypt/CryptEccData.c +-srcs_ext-y += crypt/CryptCmac.c +-srcs_ext-y += crypt/BnMath.c +-srcs_ext-y += crypt/CryptEccSignature.c +-srcs_ext-y += crypt/AlgorithmTests.c +-srcs_ext-y += crypt/CryptSelfTest.c +-srcs_ext-y += crypt/Ticket.c +-srcs_ext-y += crypt/CryptDes.c +-srcs_ext-y += crypt/BnMemory.c +-srcs_ext-y += crypt/CryptPrimeSieve.c +-srcs_ext-y += crypt/CryptEccKeyExchange.c +-srcs_ext-y += crypt/BnConvert.c +-srcs_ext-y += crypt/CryptRand.c +-srcs_ext-y += crypt/CryptEccMain.c +-srcs_ext-y += crypt/CryptSym.c +-srcs_ext-y += crypt/RsaKeyCache.c +-srcs_ext-y += crypt/CryptUtil.c +-srcs_ext-y += crypt/CryptEccCrypt.c +-srcs_ext-y += crypt/CryptRsa.c +-srcs_ext-y += crypt/CryptPrime.c +-srcs_ext-y += crypt/PrimeData.c +-srcs_ext-y += crypt/CryptHash.c +-srcs_ext-y += support/Marshal.c +-srcs_ext-y += support/MathOnByteBuffers.c +-srcs_ext-y += support/TableDrivenMarshal.c +-srcs_ext-y += support/PropertyCap.c +-srcs_ext-y += support/Locality.c +-srcs_ext-y += support/TableMarshalData.c +-srcs_ext-y += support/Memory.c +-srcs_ext-y += support/Response.c +-srcs_ext-y += support/ResponseCodeProcessing.c +-srcs_ext-y += support/Global.c +-srcs_ext-y += support/Power.c +-srcs_ext-y += support/AlgorithmCap.c +-srcs_ext-y += support/CommandCodeAttributes.c +-srcs_ext-y += support/Entity.c +-srcs_ext-y += support/Handle.c +-srcs_ext-y += support/TpmFail.c +-srcs_ext-y += support/TpmSizeChecks.c +-srcs_ext-y += support/Manufacture.c +-srcs_ext-y += support/IoBuffers.c +-srcs_ext-y += support/Bits.c +-srcs_ext-y += main/SessionProcess.c +-srcs_ext-y += main/CommandDispatcher.c +-srcs_ext-y += main/ExecCommand.c ++srcs_ext_base-y := $(CFG_MS_TPM_20_REF)/TPMCmd/tpm/ ++srcs_ext-y += src/X509/X509_ECC.c ++srcs_ext-y += src/X509/X509_RSA.c ++srcs_ext-y += src/X509/TpmASN1.c ++srcs_ext-y += src/X509/X509_spt.c ++srcs_ext-y += src/command/Attestation/CertifyX509.c ++srcs_ext-y += src/command/Attestation/GetCommandAuditDigest.c ++srcs_ext-y += src/command/Attestation/GetSessionAuditDigest.c ++srcs_ext-y += src/command/Attestation/Attest_spt.c ++srcs_ext-y += src/command/Attestation/Quote.c ++srcs_ext-y += src/command/Attestation/Certify.c ++srcs_ext-y += src/command/Attestation/CertifyCreation.c ++srcs_ext-y += src/command/Attestation/GetTime.c ++srcs_ext-y += src/command/Random/GetRandom.c ++srcs_ext-y += src/command/Random/StirRandom.c ++srcs_ext-y += src/command/NVStorage/NV_WriteLock.c ++srcs_ext-y += src/command/NVStorage/NV_ReadPublic.c ++srcs_ext-y += src/command/NVStorage/NV_spt.c ++srcs_ext-y += src/command/NVStorage/NV_Increment.c ++srcs_ext-y += src/command/NVStorage/NV_ChangeAuth.c ++srcs_ext-y += src/command/NVStorage/NV_UndefineSpaceSpecial.c ++srcs_ext-y += src/command/NVStorage/NV_SetBits.c ++srcs_ext-y += src/command/NVStorage/NV_Write.c ++srcs_ext-y += src/command/NVStorage/NV_GlobalWriteLock.c ++srcs_ext-y += src/command/NVStorage/NV_Read.c ++srcs_ext-y += src/command/NVStorage/NV_Extend.c ++srcs_ext-y += src/command/NVStorage/NV_Certify.c ++srcs_ext-y += src/command/NVStorage/NV_ReadLock.c ++srcs_ext-y += src/command/NVStorage/NV_DefineSpace.c ++srcs_ext-y += src/command/NVStorage/NV_UndefineSpace.c ++srcs_ext-y += src/command/HashHMAC/HashSequenceStart.c ++srcs_ext-y += src/command/HashHMAC/SequenceUpdate.c ++srcs_ext-y += src/command/HashHMAC/MAC_Start.c ++srcs_ext-y += src/command/HashHMAC/EventSequenceComplete.c ++srcs_ext-y += src/command/HashHMAC/HMAC_Start.c ++srcs_ext-y += src/command/HashHMAC/SequenceComplete.c ++srcs_ext-y += src/command/Ecdaa/Commit.c ++srcs_ext-y += src/command/Startup/Startup.c ++srcs_ext-y += src/command/Startup/Shutdown.c ++srcs_ext-y += src/command/FieldUpgrade/FieldUpgradeData.c ++srcs_ext-y += src/command/FieldUpgrade/FirmwareRead.c ++srcs_ext-y += src/command/FieldUpgrade/FieldUpgradeStart.c ++srcs_ext-y += src/command/Capability/TestParms.c ++srcs_ext-y += src/command/Capability/GetCapability.c ++srcs_ext-y += src/command/ClockTimer/ACT_spt.c ++srcs_ext-y += src/command/ClockTimer/ClockRateAdjust.c ++srcs_ext-y += src/command/ClockTimer/ACT_SetTimeout.c ++srcs_ext-y += src/command/ClockTimer/ClockSet.c ++srcs_ext-y += src/command/ClockTimer/ReadClock.c ++srcs_ext-y += src/command/Session/PolicyRestart.c ++srcs_ext-y += src/command/Session/StartAuthSession.c ++srcs_ext-y += src/command/EA/PolicyDuplicationSelect.c ++srcs_ext-y += src/command/EA/PolicyPCR.c ++srcs_ext-y += src/command/EA/PolicySecret.c ++srcs_ext-y += src/command/EA/PolicyTicket.c ++srcs_ext-y += src/command/EA/PolicyTemplate.c ++srcs_ext-y += src/command/EA/PolicyNV.c ++srcs_ext-y += src/command/EA/PolicyGetDigest.c ++srcs_ext-y += src/command/EA/PolicyCpHash.c ++srcs_ext-y += src/command/EA/PolicyOR.c ++srcs_ext-y += src/command/EA/Policy_spt.c ++srcs_ext-y += src/command/EA/PolicyLocality.c ++srcs_ext-y += src/command/EA/PolicyAuthorize.c ++srcs_ext-y += src/command/EA/PolicyAuthorizeNV.c ++srcs_ext-y += src/command/EA/PolicyPassword.c ++srcs_ext-y += src/command/EA/PolicyCounterTimer.c ++srcs_ext-y += src/command/EA/PolicyAuthValue.c ++srcs_ext-y += src/command/EA/PolicySigned.c ++srcs_ext-y += src/command/EA/PolicyNameHash.c ++srcs_ext-y += src/command/EA/PolicyNvWritten.c ++srcs_ext-y += src/command/EA/PolicyPhysicalPresence.c ++srcs_ext-y += src/command/EA/PolicyCommandCode.c ++srcs_ext-y += src/command/Hierarchy/ChangePPS.c ++srcs_ext-y += src/command/Hierarchy/HierarchyControl.c ++srcs_ext-y += src/command/Hierarchy/HierarchyChangeAuth.c ++srcs_ext-y += src/command/Hierarchy/ChangeEPS.c ++srcs_ext-y += src/command/Hierarchy/ClearControl.c ++srcs_ext-y += src/command/Hierarchy/Clear.c ++srcs_ext-y += src/command/Hierarchy/SetPrimaryPolicy.c ++srcs_ext-y += src/command/Hierarchy/CreatePrimary.c ++srcs_ext-y += src/command/CommandAudit/SetCommandCodeAuditStatus.c ++srcs_ext-y += src/command/Object/Object_spt.c ++srcs_ext-y += src/command/Object/ReadPublic.c ++srcs_ext-y += src/command/Object/Load.c ++srcs_ext-y += src/command/Object/LoadExternal.c ++srcs_ext-y += src/command/Object/MakeCredential.c ++srcs_ext-y += src/command/Object/Unseal.c ++srcs_ext-y += src/command/Object/CreateLoaded.c ++srcs_ext-y += src/command/Object/ObjectChangeAuth.c ++srcs_ext-y += src/command/Object/ActivateCredential.c ++srcs_ext-y += src/command/Object/Create.c ++srcs_ext-y += src/command/AttachedComponent/AC_GetCapability.c ++srcs_ext-y += src/command/AttachedComponent/AC_spt.c ++srcs_ext-y += src/command/AttachedComponent/AC_Send.c ++srcs_ext-y += src/command/AttachedComponent/Policy_AC_SendSelect.c ++srcs_ext-y += src/command/Signature/VerifySignature.c ++srcs_ext-y += src/command/Signature/Sign.c ++srcs_ext-y += src/command/Duplication/Import.c ++srcs_ext-y += src/command/Duplication/Rewrap.c ++srcs_ext-y += src/command/Duplication/Duplicate.c ++srcs_ext-y += src/command/EA/PolicyCapability.c ++srcs_ext-y += src/command/EA/PolicyParameters.c ++srcs_ext-y += src/command/Symmetric/EncryptDecrypt2.c ++srcs_ext-y += src/command/Symmetric/EncryptDecrypt_spt.c ++srcs_ext-y += src/command/Symmetric/HMAC.c ++srcs_ext-y += src/command/Symmetric/Hash.c ++srcs_ext-y += src/command/Symmetric/EncryptDecrypt.c ++srcs_ext-y += src/command/Symmetric/MAC.c ++srcs_ext-y += src/command/Context/ContextSave.c ++srcs_ext-y += src/command/Context/FlushContext.c ++srcs_ext-y += src/command/Context/Context_spt.c ++srcs_ext-y += src/command/Context/ContextLoad.c ++srcs_ext-y += src/command/Context/EvictControl.c ++srcs_ext-y += src/command/PCR/PCR_Reset.c ++srcs_ext-y += src/command/PCR/PCR_Allocate.c ++srcs_ext-y += src/command/PCR/PCR_Extend.c ++srcs_ext-y += src/command/PCR/PCR_SetAuthValue.c ++srcs_ext-y += src/command/PCR/PCR_Event.c ++srcs_ext-y += src/command/PCR/PCR_SetAuthPolicy.c ++srcs_ext-y += src/command/PCR/PCR_Read.c ++srcs_ext-y += src/command/DA/DictionaryAttackParameters.c ++srcs_ext-y += src/command/DA/DictionaryAttackLockReset.c ++srcs_ext-y += src/command/Misc/PP_Commands.c ++srcs_ext-y += src/command/Misc/SetAlgorithmSet.c ++srcs_ext-y += src/command/NVStorage/NV_DefineSpace2.c ++srcs_ext-y += src/command/NVStorage/NV_ReadPublic2.c ++srcs_ext-y += src/command/Testing/GetTestResult.c ++srcs_ext-y += src/command/Testing/SelfTest.c ++srcs_ext-y += src/command/Testing/IncrementalSelfTest.c ++srcs_ext-y += src/command/Asymmetric/ECC_Parameters.c ++srcs_ext-y += src/command/Asymmetric/RSA_Encrypt.c ++srcs_ext-y += src/command/Asymmetric/ECDH_ZGen.c ++srcs_ext-y += src/command/Asymmetric/ECDH_KeyGen.c ++srcs_ext-y += src/command/Asymmetric/ZGen_2Phase.c ++srcs_ext-y += src/command/Asymmetric/ECC_Decrypt.c ++srcs_ext-y += src/command/Asymmetric/RSA_Decrypt.c ++srcs_ext-y += src/command/Asymmetric/EC_Ephemeral.c ++srcs_ext-y += src/command/Asymmetric/ECC_Encrypt.c ++srcs_ext-y += src/subsystem/DA.c ++srcs_ext-y += src/subsystem/NvDynamic.c ++srcs_ext-y += src/subsystem/Object.c ++srcs_ext-y += src/subsystem/PP.c ++srcs_ext-y += src/subsystem/Session.c ++srcs_ext-y += src/subsystem/NvReserved.c ++srcs_ext-y += src/subsystem/Hierarchy.c ++srcs_ext-y += src/subsystem/Time.c ++srcs_ext-y += src/subsystem/PCR.c ++srcs_ext-y += src/subsystem/CommandAudit.c ++srcs_ext-y += src/events/_TPM_Hash_Start.c ++srcs_ext-y += src/events/_TPM_Init.c ++srcs_ext-y += src/events/_TPM_Hash_Data.c ++srcs_ext-y += src/events/_TPM_Hash_End.c ++srcs_ext-y += src/crypt/CryptSmac.c ++srcs_ext-y += src/crypt/CryptEccData.c ++srcs_ext-y += src/crypt/CryptCmac.c ++srcs_ext-y += src/crypt/CryptEccSignature.c ++srcs_ext-y += src/crypt/AlgorithmTests.c ++srcs_ext-y += src/crypt/CryptSelfTest.c ++srcs_ext-y += src/crypt/Ticket.c ++srcs_ext-y += src/crypt/CryptPrimeSieve.c ++srcs_ext-y += src/crypt/CryptEccKeyExchange.c ++srcs_ext-y += src/crypt/CryptRand.c ++srcs_ext-y += src/crypt/CryptEccMain.c ++srcs_ext-y += src/crypt/CryptSym.c ++srcs_ext-y += src/crypt/RsaKeyCache.c ++srcs_ext-y += src/crypt/CryptUtil.c ++srcs_ext-y += src/crypt/CryptEccCrypt.c ++srcs_ext-y += src/crypt/CryptRsa.c ++srcs_ext-y += src/crypt/CryptPrime.c ++srcs_ext-y += src/crypt/PrimeData.c ++srcs_ext-y += src/crypt/CryptHash.c ++srcs_ext-y += src/crypt/ecc/TpmEcc_Signature_ECDAA.c ++srcs_ext-y += src/crypt/ecc/TpmEcc_Signature_ECDSA.c ++srcs_ext-y += src/crypt/ecc/TpmEcc_Signature_Schnorr.c ++srcs_ext-y += src/crypt/ecc/TpmEcc_Signature_SM2.c ++srcs_ext-y += src/crypt/ecc/TpmEcc_Signature_Util.c ++srcs_ext-y += src/crypt/ecc/TpmEcc_Util.c ++srcs_ext-y += src/crypt/math/TpmMath_Util.c ++srcs_ext-y += src/support/Marshal.c ++srcs_ext-y += src/support/MathOnByteBuffers.c ++srcs_ext-y += src/support/TableDrivenMarshal.c ++srcs_ext-y += src/support/PropertyCap.c ++srcs_ext-y += src/support/Locality.c ++srcs_ext-y += src/support/TableMarshalData.c ++srcs_ext-y += src/support/Memory.c ++srcs_ext-y += src/support/Response.c ++srcs_ext-y += src/support/ResponseCodeProcessing.c ++srcs_ext-y += src/support/Global.c ++srcs_ext-y += src/support/Power.c ++srcs_ext-y += src/support/AlgorithmCap.c ++srcs_ext-y += src/support/CommandCodeAttributes.c ++srcs_ext-y += src/support/Entity.c ++srcs_ext-y += src/support/Handle.c ++srcs_ext-y += src/support/TpmFail.c ++srcs_ext-y += src/support/TpmSizeChecks.c ++srcs_ext-y += src/support/Manufacture.c ++srcs_ext-y += src/support/IoBuffers.c ++srcs_ext-y += src/support/Bits.c ++srcs_ext-y += src/main/SessionProcess.c ++srcs_ext-y += src/main/CommandDispatcher.c ++srcs_ext-y += src/main/ExecCommand.c ++srcs_ext-y += cryptolibs/TpmBigNum/BnConvert.c ++srcs_ext-y += cryptolibs/TpmBigNum/BnEccConstants.c ++srcs_ext-y += cryptolibs/TpmBigNum/BnMath.c ++srcs_ext-y += cryptolibs/TpmBigNum/BnMemory.c ++srcs_ext-y += cryptolibs/TpmBigNum/TpmBigNumThunks.c ++srcs_ext-y += ../TpmConfiguration/TpmVendorCommandHandlers/Vendor_TCG_Test.c ++srcs_ext-y += ../Platform/src/NVVirtual.c +diff --git a/tee/TpmToTEEMath.c b/tee/BnToTEEMath.c +similarity index 86% +rename from tee/TpmToTEEMath.c +rename to tee/BnToTEEMath.c +index 7b662bf..c4106a8 100644 +--- a/tee/TpmToTEEMath.c ++++ b/tee/BnToTEEMath.c +@@ -6,12 +6,24 @@ + */ + + #include "Tpm.h" ++#include "BnConvert_fp.h" ++#include "BnSupport_Interface.h" + +-#ifdef MATH_LIB_TEE ++#ifdef BN_MATH_LIB_TEE + + #include <tee_internal_api.h> + + #include <stdio.h> ++ ++// This is a workaround for an incorrect definition of BN_WORD_INITIALIZED upstream in ++// https://github.com/TrustedComputingGroup/TPM/blob/main/TPMCmd/tpm/cryptolibs/TpmBigNum/include/BnValues.h ++// at tag V184. ++#undef BN_WORD_INITIALIZED ++#define BN_WORD_INITIALIZED(name, initial) \ ++ BN_STRUCT(name, RADIX_BITS) name##_; \ ++ bigNum name = BnInitializeWord( \ ++ (bigNum) & name##_, BN_STRUCT_ALLOCATION(RADIX_BITS), initial) ++ + static void __maybe_unused printf_bigint(const TEE_BigInt *bigint) + { + size_t buffer_len = 1024; +@@ -115,6 +127,36 @@ static size_t fmm_ctx_size_from_bn(bigConst bn) + return TEE_BigIntFMMContextSizeInU32(bn_size_in_bits(bn)); + } + ++ ++# if LIBRARY_COMPATIBILITY_CHECK ++//** MathLibraryCompatibililtyCheck() ++// This function is only used during development to make sure that the library ++// that is being referenced is using the same size of data structures as the TPM. ++BOOL BnMathLibraryCompatibilityCheck(void) ++{ ++ crypt_uword_t i; ++ BYTE test[] = {0x1F, 0x1E, 0x1D, 0x1C, 0x1B, 0x1A, 0x19, 0x18, 0x17, 0x16, 0x15, ++ 0x14, 0x13, 0x12, 0x11, 0x10, 0x0F, 0x0E, 0x0D, 0x0C, 0x0B, 0x0A, ++ 0x09, 0x08, 0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01, 0x00}; ++ BN_VAR(tpmTemp, sizeof(test) * 8); // allocate some space for a test value ++ // ++ // Convert the test data to a bigNum ++ BnFromBytes(tpmTemp, test, sizeof(test)); ++ // Convert the test data to a TEE_BigInt ++ TEE_BigInt teeTemp[bigint_len_from_bn(tpmTemp)]; ++ BIGINT_INIT_FROM_BN(teeTemp, tpmTemp); ++ // Make sure the values are consistent ++ size_t test_out_size = sizeof(test); ++ BYTE test_out[test_out_size]; ++ TEE_BigIntConvertToOctetString(test_out, &test_out_size, teeTemp); ++ for(i = 0; i < sizeof(test); i++) ++ GOTO_ERROR_UNLESS(test_out[i] == test[i]); ++ return 1; ++Error: ++ return 0; ++} ++# endif ++ + LIB_EXPORT BOOL BnDiv(bigNum quotient, bigNum remainder, bigConst dividend, + bigConst divisor) + { +@@ -606,11 +648,13 @@ static void jacobi_to_affine(TEE_BigInt *x3, TEE_BigInt *y3, + TEE_BigIntMulMod(y3, y1, pm2, p); + } + +-LIB_EXPORT BOOL BnEccModMult(bigPoint R, pointConst S, bigConst d, bigCurve E) ++LIB_EXPORT BOOL BnEccModMult(bigPoint R, pointConst S, bigConst d, ++ const bigCurveData *E) + { +- const size_t prime_len = bigint_len_from_bn(E->prime); +- TEE_BigInt tee_a[bigint_len_from_bn(E->a)]; +- BYTE buffer[bn_size_in_bytes(E->prime) + 1]; ++ const size_t prime_len = ++ bigint_len_from_bn(AccessCurveConstants(E)->prime); ++ TEE_BigInt tee_a[bigint_len_from_bn(AccessCurveConstants(E)->a)]; ++ BYTE buffer[bn_size_in_bytes(AccessCurveConstants(E)->prime) + 1]; + TEE_BigInt tee_p[prime_len]; + TEE_BigInt tee_x1[prime_len]; + TEE_BigInt tee_y1[prime_len]; +@@ -621,14 +665,14 @@ LIB_EXPORT BOOL BnEccModMult(bigPoint R, pointConst S, bigConst d, bigCurve E) + NUMBYTES size = 0; + + if (!S) +- S = CurveGetG(AccessCurveData(E)); ++ S = BnCurveGetG(AccessCurveConstants(E)); + + BIGINT_INIT(tee_x3); + BIGINT_INIT(tee_y3); + BIGINT_INIT(tee_z3); + +- if (!BIGINT_INIT_FROM_BN(tee_p, E->prime) || +- !BIGINT_INIT_FROM_BN(tee_a, E->a) || ++ if (!BIGINT_INIT_FROM_BN(tee_p, AccessCurveConstants(E)->prime) || ++ !BIGINT_INIT_FROM_BN(tee_a, AccessCurveConstants(E)->a) || + !BIGINT_INIT_FROM_BN(tee_x1, S->x) || + !BIGINT_INIT_FROM_BN(tee_y1, S->y) || + !BIGINT_INIT_FROM_BN(tee_z1, S->z)) +@@ -649,11 +693,11 @@ LIB_EXPORT BOOL BnEccModMult(bigPoint R, pointConst S, bigConst d, bigCurve E) + } + + LIB_EXPORT BOOL BnEccModMult2(bigPoint R, pointConst S, bigConst d, +- pointConst Q, bigConst u, bigCurve E) ++ pointConst Q, bigConst u, const bigCurveData *E) + { +- size_t prime_len = bigint_len_from_bn(E->prime); +- size_t a_len = bigint_len_from_bn(E->a); +- BYTE buffer[bn_size_in_bytes(E->prime) + 1]; ++ size_t prime_len = bigint_len_from_bn(AccessCurveConstants(E)->prime); ++ size_t a_len = bigint_len_from_bn(AccessCurveConstants(E)->a); ++ BYTE buffer[bn_size_in_bytes(AccessCurveConstants(E)->prime) + 1]; + TEE_BigInt tee_p[prime_len]; + TEE_BigInt tee_x1[prime_len]; + TEE_BigInt tee_y1[prime_len]; +@@ -671,8 +715,8 @@ LIB_EXPORT BOOL BnEccModMult2(bigPoint R, pointConst S, bigConst d, + BIGINT_INIT(tee_x3); + BIGINT_INIT(tee_y3); + BIGINT_INIT(tee_z3); +- if (!BIGINT_INIT_FROM_BN(tee_p, E->prime) || +- !BIGINT_INIT_FROM_BN(tee_a, E->a) || ++ if (!BIGINT_INIT_FROM_BN(tee_p, AccessCurveConstants(E)->prime) || ++ !BIGINT_INIT_FROM_BN(tee_a, AccessCurveConstants(E)->a) || + !BIGINT_INIT_FROM_BN(tee_x1, S->x) || + !BIGINT_INIT_FROM_BN(tee_y1, S->y) || + !BIGINT_INIT_FROM_BN(tee_z1, S->z) || +@@ -705,4 +749,28 @@ LIB_EXPORT BOOL BnEccModMult2(bigPoint R, pointConst S, bigConst d, + return FALSE; + return TRUE; + } ++ ++LIB_EXPORT BOOL BnEccAdd(bigPoint R, // OUT: computed point ++ pointConst S, // IN: point to multiply by 'd' ++ pointConst Q, // IN: second point ++ const bigCurveData* E // IN: curve ++) ++{ ++ BN_WORD_INITIALIZED(one, 1); ++ return BnEccModMult2(R, S, one, Q, one, E); ++} ++ ++LIB_EXPORT bigCurveData* BnCurveInitialize( ++ bigCurveData* E, // IN: curve structure to initialize ++ TPM_ECC_CURVE curveId // IN: curve identifier ++) ++{ ++ *E = BnGetCurveData(curveId); ++ return E; ++} ++ ++LIB_EXPORT void BnCurveFree(bigCurveData *E) ++{ ++ (void)E; ++} + #endif +diff --git a/tee/TpmToTEESupport.c b/tee/BnToTEESupport.c +similarity index 67% +rename from tee/TpmToTEESupport.c +rename to tee/BnToTEESupport.c +index 643494c..d2ddee2 100644 +--- a/tee/TpmToTEESupport.c ++++ b/tee/BnToTEESupport.c +@@ -6,9 +6,9 @@ + + #include "Tpm.h" + +-#if defined(HASH_LIB_TEE) || defined(MATH_LIB_TEE) || defined(SYM_LIB_TEE) ++#if defined(BN_MATH_LIB_TEE) + +-LIB_EXPORT int SupportLibInit(void) ++LIB_EXPORT int BnSupportLibInit(void) + { + return TRUE; + } +-- +2.47.3 + diff --git a/recipes-bsp/optee-ftpm/files/0002-Disable-command-TPM2_CertifyX509.patch b/recipes-bsp/optee-ftpm/files/0002-Disable-command-TPM2_CertifyX509.patch new file mode 100644 index 00000000..4ceab17d --- /dev/null +++ b/recipes-bsp/optee-ftpm/files/0002-Disable-command-TPM2_CertifyX509.patch @@ -0,0 +1,29 @@ +From 5f6f753d9f1428811420734d5f312249d0aa7ece Mon Sep 17 00:00:00 2001 +From: Sven Bauer <[email protected]> +Date: Wed, 3 Jun 2026 16:43:59 +0200 +Subject: [PATCH 2/2] Disable command TPM2_CertifyX509. + +Command TPM2_CertifyX509 has been declared "deprecated" in TPM spec v184. +Hence, the switch to enable it is now set to "CC_NO". + +Signed-off-by: Sven Bauer <[email protected]> +--- + platform/include/TpmConfiguration/TpmProfile_CommandList.h | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/platform/include/TpmConfiguration/TpmProfile_CommandList.h b/platform/include/TpmConfiguration/TpmProfile_CommandList.h +index 7012351..3bd9b2a 100644 +--- a/platform/include/TpmConfiguration/TpmProfile_CommandList.h ++++ b/platform/include/TpmConfiguration/TpmProfile_CommandList.h +@@ -80,7 +80,7 @@ + // While all of the TPM reference implementation is provided "AS IS" without any + // warranty, the current design and implementation of CertifyX509 are considered + // to be especially unsuitable for product use. +-#define CC_CertifyX509 CC_YES ++#define CC_CertifyX509 CC_NO + + // Normal commands: + +-- +2.47.3 + diff --git a/recipes-bsp/optee-ftpm/optee-ftpm-qemu-arm64_4.10+v1.62r1-48-ge9fc7b8.bb b/recipes-bsp/optee-ftpm/optee-ftpm-qemu-arm64_4.10+V184.bb similarity index 100% rename from recipes-bsp/optee-ftpm/optee-ftpm-qemu-arm64_4.10+v1.62r1-48-ge9fc7b8.bb rename to recipes-bsp/optee-ftpm/optee-ftpm-qemu-arm64_4.10+V184.bb diff --git a/recipes-bsp/optee-ftpm/optee-ftpm-ti-k3_4.10+v1.62r1-48-ge9fc7b8.bb b/recipes-bsp/optee-ftpm/optee-ftpm-ti-k3_4.10+V184.bb similarity index 100% rename from recipes-bsp/optee-ftpm/optee-ftpm-ti-k3_4.10+v1.62r1-48-ge9fc7b8.bb rename to recipes-bsp/optee-ftpm/optee-ftpm-ti-k3_4.10+V184.bb diff --git a/recipes-bsp/optee-ftpm/optee-ftpm_4.10+v1.62r1-48-ge9fc7b8.inc b/recipes-bsp/optee-ftpm/optee-ftpm_4.10+V184.inc similarity index 55% rename from recipes-bsp/optee-ftpm/optee-ftpm_4.10+v1.62r1-48-ge9fc7b8.inc rename to recipes-bsp/optee-ftpm/optee-ftpm_4.10+V184.inc index 232508f6..802ce54f 100644 --- a/recipes-bsp/optee-ftpm/optee-ftpm_4.10+v1.62r1-48-ge9fc7b8.inc +++ b/recipes-bsp/optee-ftpm/optee-ftpm_4.10+V184.inc @@ -15,13 +15,15 @@ MAINTAINER = "cip-dev <[email protected]>" SRC_URI += " \ https://github.com/OP-TEE/optee_ftpm/archive/${SRCREV}.tar.gz;downloadfilename=optee_ftpm-${SRCREV}.tar.gz \ - https://github.com/microsoft/ms-tpm-20-ref/archive/${SRCREV_ms-tpm}.tar.gz;name=ms-tpm;downloadfilename=ms-tpm-20-ref-${SRCREV_ms-tpm}.tar.gz \ + file://0001-Update-to-TPM-2.0-Reference-Implementation-v184.patch \ + file://0002-Disable-command-TPM2_CertifyX509.patch \ + https://github.com/TrustedComputingGroup/TPM/archive/${SRCREV_tpm}.tar.gz;name=tpm;downloadfilename=tpm-${SRCREV_tpm}.tar.gz \ " SRCREV = "a09269b15de635e1816fe832e26adfbfb44c5455" -SRCREV_ms-tpm = "e9fc7b89d865536c46deb63f9c7d0121a3ded49c" +SRCREV_tpm = "bc29a21d44b01396223c152a4834e52318591770" SRC_URI[sha256sum] = "1ad448048fa8e507459fb24cc1e7e1a42099303a272c8804f8d62894090d047b" -SRC_URI[ms-tpm.sha256sum] = "b77d092c0dde362adf6bc88a580ca7c8abe124d69bb734bf28f8904ae30494a4" +SRC_URI[tpm.sha256sum] = "e634a4a3834d069e327da44d151d77915d3bd6e2ee8763c35f291b450a863083" S = "${WORKDIR}/optee_ftpm-${SRCREV}" -MS_TPM_20_REF_DIR = "ms-tpm-20-ref-${SRCREV_ms-tpm}" +MS_TPM_20_REF_DIR = "TPM-${SRCREV_tpm}" -- 2.47.3