int main(int argc, char** argv) { uint32_t perm; uint32_t result; uint32_t x; TlclLibInit(); TPM_CHECK(TlclStartupIfNeeded()); TPM_CHECK(TlclSelfTestFull()); TPM_CHECK(TlclAssertPhysicalPresence()); TPM_CHECK(TlclForceClear()); TPM_CHECK(TlclSetEnable()); TPM_CHECK(TlclSetDeactivated(0)); result = TlclRead(INDEX0, (uint8_t*) &x, sizeof(x)); if (result == TPM_E_BADINDEX) { perm = TPM_NV_PER_PPWRITE | TPM_NV_PER_GLOBALLOCK; TPM_CHECK(TlclDefineSpace(INDEX0, perm, sizeof(uint32_t))); } result = TlclRead(INDEX1, (uint8_t*) &x, sizeof(x)); if (result == TPM_E_BADINDEX) { perm = TPM_NV_PER_PPWRITE; TPM_CHECK(TlclDefineSpace(INDEX1, perm, sizeof(uint32_t))); } printf("TEST SUCCEEDED\n"); exit(0); }
int main(int argc, char** argv) { uint32_t x; uint8_t in[20], out[20]; int time_limit_exceeded = 0; int errors = 0; TlclLibInit(); TTPM_CHECK(0, 50); TTPM_CHECK(TlclStartupIfNeeded(), 50); TTPM_CHECK(TlclContinueSelfTest(), 100); TTPM_CHECK(TlclSelfTestFull(), 1000); TTPM_CHECK(TlclAssertPhysicalPresence(), 100); TTPM_CHECK(TlclWrite(INDEX0, (uint8_t*) &x, sizeof(x)), 100); TTPM_CHECK(TlclRead(INDEX0, (uint8_t*) &x, sizeof(x)), 100); TTPM_CHECK(TlclExtend(0, in, out), 200); TTPM_CHECK(TlclSetGlobalLock(), 50); TTPM_CHECK(TlclLockPhysicalPresence(), 100); if (time_limit_exceeded || errors > 0) { printf("TEST FAILED\n"); exit(1); } else { printf("TEST SUCCEEDED\n"); return 0; } }
/** * NV spaces test * * TODO: check params/data read/written. */ static void ReadWriteTest(void) { uint8_t buf[32]; ResetMocks(); TEST_EQ(TlclDefineSpace(1, 2, 3), 0, "DefineSpace"); TEST_EQ(calls[0].req_cmd, TPM_ORD_NV_DefineSpace, " cmd"); ResetMocks(); TEST_EQ(TlclSetNvLocked(), 0, "SetNvLocked"); TEST_EQ(calls[0].req_cmd, TPM_ORD_NV_DefineSpace, " cmd"); ResetMocks(); TEST_EQ(TlclWrite(1, buf, 3), 0, "Write"); TEST_EQ(calls[0].req_cmd, TPM_ORD_NV_WriteValue, " cmd"); ResetMocks(); TEST_EQ(TlclRead(1, buf, 3), 0, "Read"); TEST_EQ(calls[0].req_cmd, TPM_ORD_NV_ReadValue, " cmd"); ResetMocks(); TEST_EQ(TlclWriteLock(1), 0, "WriteLock"); TEST_EQ(calls[0].req_cmd, TPM_ORD_NV_WriteValue, " cmd"); ResetMocks(); TEST_EQ(TlclReadLock(1), 0, "ReadLock"); TEST_EQ(calls[0].req_cmd, TPM_ORD_NV_ReadValue, " cmd"); ResetMocks(); TEST_EQ(TlclSetGlobalLock(), 0, "SetGlobalLock"); TEST_EQ(calls[0].req_cmd, TPM_ORD_NV_WriteValue, " cmd"); }
/* Adjusts value of KERNEL_VERSIONS_BACKUP space. */ static uint32_t RollbackTest_AdjustKernelBackup(void) { /* Same as backup */ uint32_t kv, kvbackup; RETURN_ON_FAILURE(TlclRead(KERNEL_VERSIONS_NV_INDEX, (uint8_t*) &kv, sizeof(kv))); RETURN_ON_FAILURE(TlclRead(KERNEL_VERSIONS_BACKUP_NV_INDEX, (uint8_t*) &kvbackup, sizeof(kvbackup))); if (RBTS.KERNEL_VERSIONS_same_as_backup && kv != kvbackup) { kvbackup = kv; RETURN_ON_FAILURE(SafeWrite(KERNEL_VERSIONS_BACKUP_NV_INDEX, (uint8_t*) &kvbackup, sizeof(kvbackup))); } if (!RBTS.KERNEL_VERSIONS_same_as_backup && kv == kvbackup) { kvbackup = kv + 1; RETURN_ON_FAILURE(SafeWrite(KERNEL_VERSIONS_BACKUP_NV_INDEX, (uint8_t*) &kvbackup, sizeof(kvbackup))); } return TPM_SUCCESS; }
/* Sets or clears KERNEL_MUST_USE_BACKUP. */ static uint32_t RollbackTest_AdjustMustUseBackup(void) { uint32_t must_use_backup; RETURN_ON_FAILURE(TlclRead(KERNEL_MUST_USE_BACKUP_NV_INDEX, (uint8_t*) &must_use_backup, sizeof(must_use_backup))); if (RBTS.KERNEL_MUST_USE_BACKUP != must_use_backup) { RETURN_ON_FAILURE(SafeWrite(KERNEL_MUST_USE_BACKUP_NV_INDEX, (uint8_t*) &must_use_backup, sizeof(must_use_backup))); } return TPM_SUCCESS; }
/* Adjust the value in the developer mode transition space. */ static uint32_t RollbackTest_AdjustDeveloperMode(void) { uint32_t dev; /* Developer mode transitions */ RETURN_ON_FAILURE(TlclRead(DEVELOPER_MODE_NV_INDEX, (uint8_t*) &dev, sizeof(dev))); if (RBTS.developer != dev) { dev = RBTS.developer; RETURN_ON_FAILURE(SafeWrite(DEVELOPER_MODE_NV_INDEX, (uint8_t*) &dev, sizeof(dev))); } return TPM_SUCCESS; }
/* Adjusts KERNEL_VERSIONS space. */ static uint32_t RollbackTest_AdjustKernelVersions(int* wrong_value) { uint8_t kdata[KERNEL_SPACE_SIZE]; int exists; uint32_t result; result = TlclRead(KERNEL_VERSIONS_NV_INDEX, kdata, sizeof(kdata)); if (result != TPM_SUCCESS && result != TPM_E_BADINDEX) { return result; } *wrong_value = Memcmp(kdata + sizeof(uint32_t), KERNEL_SPACE_UID, KERNEL_SPACE_UID_SIZE); /* for later use */ exists = result == TPM_SUCCESS; if (RBTS.KERNEL_VERSIONS_exists && !exists) { RETURN_ON_FAILURE(SafeDefineSpace(KERNEL_VERSIONS_NV_INDEX, TPM_NV_PER_PPWRITE, KERNEL_SPACE_SIZE)); } if (!RBTS.KERNEL_VERSIONS_exists && exists) { RETURN_ON_FAILURE(RollbackTest_RemoveSpace(KERNEL_VERSIONS_NV_INDEX)); } return TPM_SUCCESS; }