void TPM_Init(TPM_Type *base, const tpm_config_t *config) { assert(config); /* Enable the module clock */ CLOCK_EnableClock(s_tpmClocks[TPM_GetInstance(base)]); #if defined(FSL_FEATURE_TPM_HAS_GLOBAL) && FSL_FEATURE_TPM_HAS_GLOBAL /* TPM reset is available on certain SoC's */ TPM_Reset(base); #endif /* Set the clock prescale factor */ base->SC = TPM_SC_PS(config->prescale); /* Setup the counter operation */ base->CONF = TPM_CONF_DOZEEN(config->enableDoze) | TPM_CONF_GTBEEN(config->useGlobalTimeBase) | TPM_CONF_CROT(config->enableReloadOnTrigger) | TPM_CONF_CSOT(config->enableStartOnTrigger) | TPM_CONF_CSOO(config->enableStopOnOverflow) | #if defined(FSL_FEATURE_TPM_HAS_PAUSE_COUNTER_ON_TRIGGER) && FSL_FEATURE_TPM_HAS_PAUSE_COUNTER_ON_TRIGGER TPM_CONF_CPOT(config->enablePauseOnTrigger) | #endif #if defined(FSL_FEATURE_TPM_HAS_EXTERNAL_TRIGGER_SELECTION) && FSL_FEATURE_TPM_HAS_EXTERNAL_TRIGGER_SELECTION TPM_CONF_TRGSRC(config->triggerSource) | #endif TPM_CONF_TRGSEL(config->triggerSelect); if (config->enableDebugMode) { base->CONF |= TPM_CONF_DBGMODE_MASK; } else { base->CONF &= ~TPM_CONF_DBGMODE_MASK; } }
int main(int argc, char *argv[]) { int ret; int i; /* argc iterator */ TPM_setlog(0); /* turn off verbose output */ for (i=1 ; i<argc ; i++) { if (!strcmp(argv[i], "-h")) { printUsage(); } else if (!strcmp(argv[i], "-v")) { TPM_setlog(1); } else { printf("\n%s is not a valid option\n", argv[i]); printUsage(); } } ret = TPM_Reset(); exit(ret); }
static int check_tpm(void) { unsigned char keybuf[TPM_MAX_KEY_SIZE]; unsigned char pcrvalue[TPM_AUTH_SIZE]; unsigned char srkauth[TPM_AUTH_SIZE]; uint32_t ret, srk_handle; unsigned int keylen; keydata k, key; int tpmfp; /* check /dev/tpm0 */ if ((tpmfp = open("/dev/tpm0", O_RDWR)) < 0) { printf("Unable to open /dev/tpm0\n"); exit(-1); } close(tpmfp); /* try a TPM_Reset (should work even if TPM disabled) */ if((ret=TPM_Reset())){ printf("TPM_Reset failed, error %s\n", TPM_GetErrMsg(ret)); exit(-2); } /* check if TPM enabled with TPM_PcrRead */ if((ret=TPM_PcrRead(0L,pcrvalue))){ printf("TPM_PcrRead failed, error %s\n", TPM_GetErrMsg(ret)); exit(-3); } /* check if TPM already has default IBM CSS owner */ srk_handle=TPM_SRK_HANDLE; TSS_sha1((unsigned char *)SRKPASS,8,srkauth); k.keyflags = 0; k.authdatausage = 0; /* key requires no password */ k.privkeylen = 0; /* no private key specified here */ k.pub.algorithm = 0x00000099; /* BOGUS ALG */ k.keyusage = 0x0014; /* key Usage - 0x0014 = bind */ k.pub.encscheme = 0x0003; /* encryption scheme 3 RSA */ k.pub.sigscheme = 0x0001; /* signature scheme none */ k.pub.keybitlen = 2048; /* RSA modulus size 2048 bits */ k.pub.numprimes = 2; /* required */ k.pub.expsize = 0; /* RSA exponent - default 0x010001 */ k.pub.keylength = 0; /* key not specified here */ k.pub.pcrinfolen = 0; /* no PCR's used at this time */ ret=TPM_CreateWrapKey(srk_handle,srkauth, NULL,NULL, &k,&key,keybuf,&keylen); if(ret==TPM_AUTHFAIL){ printf("TPM already has unknown owner\n"), exit(-4); } if(ret==TPM_BAD_KEY_PROPS){ printf("TPM is already IBM CSS managed\n"); return(0); } if(ret==TPM_NOSRK){ printf("TPM is already owned\n"); return(1); } printf("Unexpected return code %d\n",ret); exit(-5); }