diff options
Diffstat (limited to 'tests/nvram_offsets.c')
-rw-r--r-- | tests/nvram_offsets.c | 91 |
1 files changed, 91 insertions, 0 deletions
diff --git a/tests/nvram_offsets.c b/tests/nvram_offsets.c new file mode 100644 index 0000000..d3b70bb --- /dev/null +++ b/tests/nvram_offsets.c @@ -0,0 +1,91 @@ +#include <assert.h> +#include <stdlib.h> + +#include "Tpm.h" + +/* from Global.h */ +extern BYTE s_indexOrderlyRam[RAM_INDEX_SPACE]; + +int main(void) +{ + PERSISTENT_DATA pd; + + /* Check size of ppList that expands with new commands */ +#define PD_PP_LIST_EXP_SIZE 14 + if (sizeof(pd.ppList) != PD_PP_LIST_EXP_SIZE) { + fprintf(stderr, + "sizeof(PERSISTENT_DATA.ppList) does not have expected size " + "of %u bytes but %zu bytes\n", + PD_PP_LIST_EXP_SIZE, sizeof(pd.ppList)); + return EXIT_FAILURE; + } + + /* Check size of auditCommands that expands with new commands */ +#define PD_AUDIT_COMMANDS_EXP_SIZE 14 + if (sizeof(pd.auditCommands) != PD_AUDIT_COMMANDS_EXP_SIZE) { + fprintf(stderr, + "sizeof(PERSISTENT_DATA.auditCommands) does not have expected size " + "of %u bytes but %zu bytes\n", + PD_AUDIT_COMMANDS_EXP_SIZE, sizeof(pd.auditCommands)); + return EXIT_FAILURE; + } + + /* ensure that the NVRAM offset of NV_USER_DYNAMIC is at the expected + location so that there's enough memory for re-constructing NVRAM + indices etc. into the NVRAM */ +#define NV_INDEX_RAM_DATA_EXP_OFFSET 5120 + if (NV_INDEX_RAM_DATA != NV_INDEX_RAM_DATA_EXP_OFFSET) { + /* If this ever changes due to growth of the preceding data + * structure, we need to adjust the total NVRAM memory size + * for the architecture where this changed (or have all + * architectures use the same offset. + */ + fprintf(stderr, + "NV_INDEX_RAM_DATA not at expected offset %u but at %u\n", + NV_INDEX_RAM_DATA_EXP_OFFSET, (unsigned int)NV_INDEX_RAM_DATA); + return EXIT_FAILURE; + } + +#define NV_USER_DYNAMIC_EXP_OFFSET (5120 + 512) + if (NV_USER_DYNAMIC != NV_USER_DYNAMIC_EXP_OFFSET) { + fprintf(stderr, + "NV_USER_DYNAMIC not at expected offset %u but at %u\n", + NV_USER_DYNAMIC_EXP_OFFSET, (unsigned int)NV_USER_DYNAMIC); + return EXIT_FAILURE; + } + + /* + * OBJECTs are directly written into NVRAM. We have to make sure that the + * size of the OBJECT is the same on all architectures so that a full + * NVRAM fits on all architectures + */ +#if RSA_4096 +# error Unsupported RSA key size +#elif RSA_3072 +# define OBJECT_EXP_SIZE 2600 +#elif RSA_2048 +# define OBJECT_EXP_SIZE 1896 +#endif + if (sizeof(OBJECT) != OBJECT_EXP_SIZE) { + fprintf(stderr, "sizeof(OBJECT) does not have expected size of %u bytes" + "but %zu bytes\n", OBJECT_EXP_SIZE, sizeof(OBJECT)); + fprintf(stderr, "sizeof(TPMT_PUBLIC) is now %zu bytes;" + "was 356/484 bytes for 2048/3072 bit RSA keys\n", sizeof(TPMT_PUBLIC)); + fprintf(stderr, "sizeof(TPMT_SENSITIVE) is now %zu bytes;" + "was 776/1096 bytes for 2048/3072 bit RSA keys\n", sizeof(TPMT_SENSITIVE)); + fprintf(stderr, "sizeof(privateExponent_t) is now %zu bytes;" + "was 608/864 bytes for 2048/3072 bit RSA keys\n", sizeof(privateExponent_t)); + return EXIT_FAILURE; + } + + /* Same for NV_INDEX */ +#define NV_INDEX_EXP_SIZE 148 + if (sizeof(NV_INDEX) != NV_INDEX_EXP_SIZE) { + fprintf(stderr, + "sizeof(NV_INDEX) does not have expected size of %u bytes" + "but %zu bytes\n", NV_INDEX_EXP_SIZE, sizeof(NV_INDEX)); + return EXIT_FAILURE; + } + + return EXIT_SUCCESS; +} |