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); }
static uint32_t SafeDefineSpace(uint32_t index, uint32_t perm, uint32_t size) { uint32_t result = TlclDefineSpace(index, perm, size); if (result == TPM_E_MAXNVWRITES) { RETURN_ON_FAILURE(TPMClearAndReenable()); result = TlclDefineSpace(index, perm, size); tpm_was_just_cleared = 0; } return result; }
/** * 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"); }