From 4c450fe7a4beaaf69461b53fe2bf1b5dcc7639b7 Mon Sep 17 00:00:00 2001 From: Stefan Berger Date: Thu, 22 Feb 2018 14:02:25 -0500 Subject: [PATCH] tpm2: Add test harness for marshalling and reconstructing NVChip --- src/tpm2/NVDynamic.c | 122 +++++++++++++++++++++++++++++++++++++++++++ src/tpm2/NVMem.c | 9 ++++ src/tpm2/Test.h | 8 +++ 3 files changed, 139 insertions(+) create mode 100644 src/tpm2/Test.h diff --git a/src/tpm2/NVDynamic.c b/src/tpm2/NVDynamic.c index cfd5a1a..c0c69ad 100644 --- a/src/tpm2/NVDynamic.c +++ b/src/tpm2/NVDynamic.c @@ -1641,3 +1641,125 @@ NvGetMaxCount( NvRead(&maxCount, iter + sizeof(UINT32), sizeof(maxCount)); return maxCount; } + +/* + * Test harness for marshalling and unmarshalling and reconstructing the NVChip + */ +#include "Test.h" +#include +int memchk(const uint8_t *s1, const uint8_t *s2, size_t len) +{ + unsigned i; + int rc = 0; + + for (i = 0; i < len; i++) { + uint8_t c1 = s1[i], c2 = s2[i]; + if (c1 != c2) { + printf("diff at %d: x%02x vs x%02x\n", i, c1, c2); + rc = 1; + } + } + return rc; +} + +void Test_NvChip_UnMarshal(void) +{ + BYTE buffer[NV_MEMORY_SIZE]; + BYTE *buffer_p = &buffer[0]; + INT32 size = sizeof(buffer); + TPM_RC rc = TPM_RC_SUCCESS; + unsigned char bak_NV[NV_MEMORY_SIZE]; + size_t used; + NV_REF nvend = NvGetEnd(); + NV_RAM_REF nvramend = NvRamGetEnd(); + + /* make back of NVChip */ + memcpy(bak_NV, s_NV, sizeof(bak_NV)); + + /* marshal */ + printf("Marshalling...\n"); + PERSISTENT_ALL_Marshal(&buffer_p, &size); + used = sizeof(buffer) - size; + printf("size used by marshalling: %zu\n", used); + + /* clean the NVChip */ + memset(s_NV, 0x0, sizeof(s_NV)); + + /* unmarshal */ + buffer_p = &buffer[0]; + size = sizeof(buffer); + printf("Unmarshalling...\n"); + rc = PERSISTENT_ALL_Unmarshal(&buffer_p, &size); + + printf("size used by unmarshalling: %zd\n", sizeof(buffer) - size); + if (rc != TPM_RC_SUCCESS) { + sleep(10); + printf("%s: Unmarshalling failed\n", __func__); + } + if (used != sizeof(buffer) - size) { + sleep(10); + printf("marshalling and unmarshalling consumed different number of bytes\n"); + return; + } + if (nvend != NvGetEnd()) { + printf("NvGetEnd() returned %d but now %d\n", nvend, NvGetEnd()); + sleep(10); + } + if (nvramend != NvRamGetEnd()) { + printf("NvGetEnd() returned %p but now %p\n", nvramend, NvRamGetEnd()); + sleep(10); + } + + if (memchk(&bak_NV[NV_PERSISTENT_DATA], + &s_NV[NV_PERSISTENT_DATA], sizeof(PERSISTENT_DATA))) { + printf("PERSISTENT DATA IS DIFFERENT\n"); + } + if (memchk(&bak_NV[NV_ORDERLY_DATA], + &s_NV[NV_ORDERLY_DATA], sizeof(ORDERLY_DATA))) { + printf("ORDERLY DATA IS DIFFERENT\n"); + } + if (memchk(&bak_NV[NV_STATE_RESET_DATA], + &s_NV[NV_STATE_RESET_DATA], sizeof(STATE_RESET_DATA))) { + printf("STATE RESET DATA IS DIFFERENT\n"); + } + if (memchk(&bak_NV[NV_STATE_CLEAR_DATA], + &s_NV[NV_STATE_CLEAR_DATA], sizeof(STATE_CLEAR_DATA))) { + printf("STATE CLEAR DATA IS DIFFERENT\n"); + } + if (memchk(&bak_NV[NV_INDEX_RAM_DATA], + &s_NV[NV_INDEX_RAM_DATA], NvRamGetEnd() - &s_indexOrderlyRam[0])) { + printf("NV INDEX ORDERLY RAM DATA IS DIFFERENT (size=%ld)\n", + NvRamGetEnd() - &s_indexOrderlyRam[0]); + } + if (memchk(&bak_NV[NV_USER_DYNAMIC], + &s_NV[NV_USER_DYNAMIC], + NvGetEnd() - NV_USER_DYNAMIC)) { + printf("NV USER RAM DATA IS DIFFERENT (size=%ld)\n", + NvGetEnd() - NV_USER_DYNAMIC); + } + + /* restore original NVChip */ + //memcpy(s_NV, bak_NV, sizeof(bak_NV)); + printf("VolatileState testing...\n"); + buffer_p = &buffer[0]; + size = sizeof(buffer); + VolatileState_Marshal(&buffer_p, &size); + + used = sizeof(buffer) - size; + printf("size used by VS marshalling: %zu\n", used); + + buffer_p = &buffer[0]; + size = sizeof(buffer); + rc = VolatileState_Unmarshal(&buffer_p, &size); + + printf("size used by unmarshalling: %zd\n", sizeof(buffer) - size); + if (rc != TPM_RC_SUCCESS) { + printf("%s: Unmarshalling failed\n", __func__); + sleep(10); + } + if (used != sizeof(buffer) - size) { + printf("marshalling and unmarshalling consumed different number of bytes\n"); + sleep(10); + return; + } +} diff --git a/src/tpm2/NVMem.c b/src/tpm2/NVMem.c index 5236697..f3097b0 100644 --- a/src/tpm2/NVMem.c +++ b/src/tpm2/NVMem.c @@ -334,6 +334,12 @@ _plat__NvMemoryMove( assert(destOffset + size <= NV_MEMORY_SIZE); // Move data in RAM memmove(&s_NV[destOffset], &s_NV[sourceOffset], size); +#if 1 + if (destOffset > sourceOffset) + memset(&s_NV[sourceOffset], 0, destOffset-sourceOffset); + else + memset(&s_NV[destOffset+size], 0, sourceOffset-destOffset); +#endif return; } /* C.6.3.10. _plat__NvCommit() */ @@ -349,6 +355,9 @@ _plat__NvCommit( #ifdef TPM_LIBTPMS_CALLBACKS struct libtpms_callbacks *cbs = TPMLIB_GetCallbacks(); +#include "Test.h" + Test_NvChip_UnMarshal(); + if (cbs->tpm_nvram_storedata) { uint32_t tpm_number = 0; const char *name = TPM_PERMANENT_ALL_NAME; diff --git a/src/tpm2/Test.h b/src/tpm2/Test.h new file mode 100644 index 0000000..0b657fc --- /dev/null +++ b/src/tpm2/Test.h @@ -0,0 +1,8 @@ +#ifndef TEST_FP_H +#define TEST_FP_H + +void +Test_NvChip_UnMarshal( + void + ); +#endif -- 2.39.5