diff options
Diffstat (limited to 'src/tpm2/Manufacture.c')
-rw-r--r-- | src/tpm2/Manufacture.c | 206 |
1 files changed, 206 insertions, 0 deletions
diff --git a/src/tpm2/Manufacture.c b/src/tpm2/Manufacture.c new file mode 100644 index 0000000..032bc76 --- /dev/null +++ b/src/tpm2/Manufacture.c @@ -0,0 +1,206 @@ +/********************************************************************************/ +/* */ +/* Performs the manufacturing of the TPM */ +/* Written by Ken Goldman */ +/* IBM Thomas J. Watson Research Center */ +/* $Id: Manufacture.c 1519 2019-11-15 20:43:51Z kgoldman $ */ +/* */ +/* Licenses and Notices */ +/* */ +/* 1. Copyright Licenses: */ +/* */ +/* - Trusted Computing Group (TCG) grants to the user of the source code in */ +/* this specification (the "Source Code") a worldwide, irrevocable, */ +/* nonexclusive, royalty free, copyright license to reproduce, create */ +/* derivative works, distribute, display and perform the Source Code and */ +/* derivative works thereof, and to grant others the rights granted herein. */ +/* */ +/* - The TCG grants to the user of the other parts of the specification */ +/* (other than the Source Code) the rights to reproduce, distribute, */ +/* display, and perform the specification solely for the purpose of */ +/* developing products based on such documents. */ +/* */ +/* 2. Source Code Distribution Conditions: */ +/* */ +/* - Redistributions of Source Code must retain the above copyright licenses, */ +/* this list of conditions and the following disclaimers. */ +/* */ +/* - Redistributions in binary form must reproduce the above copyright */ +/* licenses, this list of conditions and the following disclaimers in the */ +/* documentation and/or other materials provided with the distribution. */ +/* */ +/* 3. Disclaimers: */ +/* */ +/* - THE COPYRIGHT LICENSES SET FORTH ABOVE DO NOT REPRESENT ANY FORM OF */ +/* LICENSE OR WAIVER, EXPRESS OR IMPLIED, BY ESTOPPEL OR OTHERWISE, WITH */ +/* RESPECT TO PATENT RIGHTS HELD BY TCG MEMBERS (OR OTHER THIRD PARTIES) */ +/* THAT MAY BE NECESSARY TO IMPLEMENT THIS SPECIFICATION OR OTHERWISE. */ +/* Contact TCG Administration (admin@trustedcomputinggroup.org) for */ +/* information on specification licensing rights available through TCG */ +/* membership agreements. */ +/* */ +/* - THIS SPECIFICATION IS PROVIDED "AS IS" WITH NO EXPRESS OR IMPLIED */ +/* WARRANTIES WHATSOEVER, INCLUDING ANY WARRANTY OF MERCHANTABILITY OR */ +/* FITNESS FOR A PARTICULAR PURPOSE, ACCURACY, COMPLETENESS, OR */ +/* NONINFRINGEMENT OF INTELLECTUAL PROPERTY RIGHTS, OR ANY WARRANTY */ +/* OTHERWISE ARISING OUT OF ANY PROPOSAL, SPECIFICATION OR SAMPLE. */ +/* */ +/* - Without limitation, TCG and its members and licensors disclaim all */ +/* liability, including liability for infringement of any proprietary */ +/* rights, relating to use of information in this specification and to the */ +/* implementation of this specification, and TCG disclaims all liability for */ +/* cost of procurement of substitute goods or services, lost profits, loss */ +/* of use, loss of data or any incidental, consequential, direct, indirect, */ +/* or special damages, whether under contract, tort, warranty or otherwise, */ +/* arising in any way out of use or reliance upon this specification or any */ +/* information herein. */ +/* */ +/* (c) Copyright IBM Corp. and others, 2016 - 2019 */ +/* */ +/********************************************************************************/ + +/* 9.9 Manufacture.c */ +/* 9.9.1 Description */ +/* This file contains the function that performs the manufacturing of the TPM in a simulated + environment. These functions should not be used outside of a manufacturing or simulation + environment. */ +/* 9.9.2 Includes and Data Definitions */ +#define MANUFACTURE_C +#include "Tpm.h" +#include "TpmSizeChecks_fp.h" +#define TPM_HAVE_TPM2_DECLARATIONS +#include "tpm_library_intern.h" // libtpms added +/* 9.9.3 Functions */ +/* 9.9.3.1 TPM_Manufacture() */ +/* This function initializes the TPM values in preparation for the TPMs first use. This function + will fail if previously called. The TPM can be re-manufactured by calling TPM_Teardown() first + and then calling this function again. */ +/* Return Values Meaning */ +/* -1 failure */ +/* 0 success */ +/* 1 manufacturing process previously performed */ +LIB_EXPORT int +TPM_Manufacture( + int firstTime // IN: indicates if this is the first call from + // main() + ) +{ + TPM_SU orderlyShutdown; + + // Initialize the context slot mask for UINT16 + s_ContextSlotMask = 0xffff; // libtpms added +#if RUNTIME_SIZE_CHECKS + // Call the function to verify the sizes of values that result from different + // compile options. + if(!TpmSizeChecks()) + return -1; +#endif +#if LIBRARY_COMPATIBILITY_CHECK + // Make sure that the attached library performs as expected. + if(!MathLibraryCompatibilityCheck()) + return -1; +#endif + // If TPM has been manufactured, return indication. + if(!firstTime && g_manufactured) + return 1; + // Do power on initializations of the cryptographic libraries. + CryptInit(); + s_DAPendingOnNV = FALSE; + // initialize NV + NvManufacture(); + // Clear the magic value in the DRBG state + go.drbgState.magic = 0; + if (CryptStartup(SU_RESET) == FALSE) { // libtpms added begin + TPMLIB_LogTPM2Error( + "CryptStartup failed:\n" + "IsEntropyBad : %d\n" + "IsTestStateSet(TESTING) : %d\n" + "IsTestStateSet(TESTED) : %d\n" + "IsTestStateSet(ENTROPY) : %d\n" + "IsDrbgTested : %d\n", + IsEntropyBad(), + IsTestStateSet(TESTING), + IsTestStateSet(TESTED), + IsTestStateSet(ENTROPY), + IsDrbgTested()); + return -1; + } // libtpms added end + // default configuration for PCR + PCRSimStart(); + // initialize pre-installed hierarchy data + // This should happen after NV is initialized because hierarchy data is + // stored in NV. + HierarchyPreInstall_Init(); + // initialize dictionary attack parameters + DAPreInstall_Init(); + // initialize PP list + PhysicalPresencePreInstall_Init(); + // initialize command audit list + CommandAuditPreInstall_Init(); + // first start up is required to be Startup(CLEAR) + orderlyShutdown = TPM_SU_CLEAR; + NV_WRITE_PERSISTENT(orderlyState, orderlyShutdown); + // initialize the firmware version + gp.firmwareV1 = FIRMWARE_V1; +#ifdef FIRMWARE_V2 + gp.firmwareV2 = FIRMWARE_V2; +#else + gp.firmwareV2 = 0; +#endif + NV_SYNC_PERSISTENT(firmwareV1); + NV_SYNC_PERSISTENT(firmwareV2); + // initialize the total reset counter to 0 + gp.totalResetCount = 0; + NV_SYNC_PERSISTENT(totalResetCount); + // initialize the clock stuff + go.clock = 0; + go.clockSafe = YES; + NvWrite(NV_ORDERLY_DATA, sizeof(ORDERLY_DATA), &go); + // Commit NV writes. Manufacture process is an artificial process existing + // only in simulator environment and it is not defined in the specification + // that what should be the expected behavior if the NV write fails at this + // point. Therefore, it is assumed the NV write here is always success and + // no return code of this function is checked. + NvCommit(); + g_manufactured = TRUE; + return 0; +} +/* 9.9.3.2 TPM_TearDown() */ +/* This function prepares the TPM for re-manufacture. It should not be implemented in anything other + than a simulated TPM. */ +/* In this implementation, all that is needs is to stop the cryptographic units and set a flag to + indicate that the TPM can be re-manufactured. This should be all that is necessary to start the + manufacturing process again. */ +/* Return Values Meaning */ +/* 0 success */ +/* 1 TPM not previously manufactured */ +LIB_EXPORT int +TPM_TearDown( + void + ) +{ + g_manufactured = FALSE; + return 0; +} +#if 0 /* libtpms added */ +/* 9.9.3.3 TpmEndSimulation() */ +/* This function is called at the end of the simulation run. It is used to provoke printing of any + statistics that might be needed. */ +LIB_EXPORT void +TpmEndSimulation( + void + ) +{ +#if SIMULATION + HashLibSimulationEnd(); + SymLibSimulationEnd(); + MathLibSimulationEnd(); +#if ALG_RSA + RsaSimulationEnd(); +#endif +#if ALG_ECC + EccSimulationEnd(); +#endif +#endif // SIMULATION +} +#endif /* libtpms added */ |