test_tpm2_errata.c 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176
  1. /* SPDX-License-Identifier: BSD-3-Clause */
  2. #include <stdarg.h>
  3. #include <stdbool.h>
  4. #include <stdlib.h>
  5. #include <setjmp.h>
  6. #include <cmocka.h>
  7. #include "tpm2_errata.h"
  8. #include "tpm2_util.h"
  9. static inline void setcaps(UINT32 level, UINT32 rev, UINT32 day, UINT32 year,
  10. TSS2_RC rc) {
  11. will_return(__wrap_Esys_GetCapability, level);
  12. will_return(__wrap_Esys_GetCapability, rev);
  13. will_return(__wrap_Esys_GetCapability, day);
  14. will_return(__wrap_Esys_GetCapability, year);
  15. will_return(__wrap_Esys_GetCapability, rc);
  16. }
  17. TSS2_RC __wrap_Esys_GetCapability(ESYS_CONTEXT *context, ESYS_TR session1,
  18. ESYS_TR session2, ESYS_TR session3, TPM2_CAP capability,
  19. UINT32 property, UINT32 propertyCount, TPMI_YES_NO *moreData,
  20. TPMS_CAPABILITY_DATA **capabilityData) {
  21. UNUSED(context);
  22. UNUSED(session1);
  23. UNUSED(session2);
  24. UNUSED(session3);
  25. UNUSED(property);
  26. UNUSED(propertyCount);
  27. /* Ensure moreData is TPM2_NO, otherwise tpm2_capability_get() will make
  28. * multiple calls to Esys_CapabilityGet()
  29. */
  30. *moreData = TPM2_NO;
  31. *capabilityData = calloc(1, sizeof(**capabilityData));
  32. (*capabilityData)->capability = capability;
  33. TPML_TAGGED_TPM_PROPERTY *properties =
  34. &(*capabilityData)->data.tpmProperties;
  35. properties->count = 4;
  36. properties->tpmProperty[0].property = TPM2_PT_LEVEL;
  37. properties->tpmProperty[0].value = (UINT32) mock();
  38. properties->tpmProperty[1].property = TPM2_PT_REVISION;
  39. properties->tpmProperty[1].value = (UINT32) mock();
  40. properties->tpmProperty[2].property = TPM2_PT_DAY_OF_YEAR;
  41. properties->tpmProperty[2].value = (UINT32) mock();
  42. properties->tpmProperty[3].property = TPM2_PT_YEAR;
  43. properties->tpmProperty[3].value = (UINT32) mock();
  44. TSS2_RC rc = (int) mock(); /* dequeue second value */
  45. if (rc != TSS2_RC_SUCCESS)
  46. free(*capabilityData);
  47. return rc;
  48. }
  49. #define TPM2B_PUBLIC_INIT(value) { \
  50. .publicArea = { \
  51. .objectAttributes = value \
  52. } \
  53. }
  54. static void test_tpm2_errata_no_init_and_apply(void **state) {
  55. UNUSED(state);
  56. TPM2B_PUBLIC in_public = TPM2B_PUBLIC_INIT(TPMA_OBJECT_SIGN_ENCRYPT);
  57. tpm2_errata_fixup(SPEC_116_ERRATA_2_7,
  58. &in_public.publicArea.objectAttributes);
  59. assert_int_equal(
  60. in_public.publicArea.objectAttributes & TPMA_OBJECT_SIGN_ENCRYPT,
  61. TPMA_OBJECT_SIGN_ENCRYPT);
  62. }
  63. static void test_tpm2_errata_bad_init_and_apply(void **state) {
  64. UNUSED(state);
  65. setcaps(00, 116, 303, 2014, TPM2_RC_FAILURE);
  66. tpm2_errata_init((ESYS_CONTEXT *) 0xDEADBEEF);
  67. TPM2B_PUBLIC in_public = TPM2B_PUBLIC_INIT(TPMA_OBJECT_SIGN_ENCRYPT);
  68. tpm2_errata_fixup(SPEC_116_ERRATA_2_7,
  69. &in_public.publicArea.objectAttributes);
  70. assert_int_equal(
  71. in_public.publicArea.objectAttributes & TPMA_OBJECT_SIGN_ENCRYPT,
  72. TPMA_OBJECT_SIGN_ENCRYPT);
  73. }
  74. static void test_tpm2_errata_init_good_and_apply(void **state) {
  75. UNUSED(state);
  76. setcaps(00, 116, 303, 2014, TPM2_RC_SUCCESS);
  77. tpm2_errata_init((ESYS_CONTEXT *) 0xDEADBEEF);
  78. TPM2B_PUBLIC in_public = TPM2B_PUBLIC_INIT(TPMA_OBJECT_SIGN_ENCRYPT);
  79. tpm2_errata_fixup(SPEC_116_ERRATA_2_7,
  80. &in_public.publicArea.objectAttributes);
  81. assert_int_equal(
  82. in_public.publicArea.objectAttributes & TPMA_OBJECT_SIGN_ENCRYPT,
  83. 0);
  84. }
  85. static void test_tpm2_errata_init_good_and_no_match(void **state) {
  86. UNUSED(state);
  87. setcaps(00, 116, 4, 2015, TPM2_RC_SUCCESS);
  88. //Tss2_Sys_GetCapability
  89. tpm2_errata_init((ESYS_CONTEXT *) 0xDEADBEEF);
  90. TPM2B_PUBLIC in_public = TPM2B_PUBLIC_INIT(TPMA_OBJECT_SIGN_ENCRYPT);
  91. tpm2_errata_fixup(SPEC_116_ERRATA_2_7,
  92. &in_public.publicArea.objectAttributes);
  93. assert_int_equal(
  94. in_public.publicArea.objectAttributes & TPMA_OBJECT_SIGN_ENCRYPT,
  95. TPMA_OBJECT_SIGN_ENCRYPT);
  96. }
  97. static void test_tpm2_errata_init_no_match_and_apply(void **state) {
  98. UNUSED(state);
  99. /* This will never match */
  100. setcaps(00, 00, 00, 00, TPM2_RC_SUCCESS);
  101. //Tss2_Sys_GetCapability
  102. tpm2_errata_init((ESYS_CONTEXT *) 0xDEADBEEF);
  103. TPM2B_PUBLIC in_public = TPM2B_PUBLIC_INIT(TPMA_OBJECT_SIGN_ENCRYPT);
  104. tpm2_errata_fixup(SPEC_116_ERRATA_2_7,
  105. &in_public.publicArea.objectAttributes);
  106. assert_int_equal(
  107. in_public.publicArea.objectAttributes & TPMA_OBJECT_SIGN_ENCRYPT,
  108. TPMA_OBJECT_SIGN_ENCRYPT);
  109. }
  110. /* link required symbol, but tpm2_tool.c declares it AND main, which
  111. * we have a main below for cmocka tests.
  112. */
  113. bool output_enabled = true;
  114. int main(int argc, char *argv[]) {
  115. UNUSED(argc);
  116. UNUSED(argv);
  117. const struct CMUnitTest tests[] = {
  118. /*
  119. * no_init/bad_init routines must go first as there is no way to
  120. * de-initialize. However, re-initialization will query the capabilities
  121. * and can be changed or cause a no-match situation. This is a bit of
  122. * whitebox knowledge in the ordering of these tests.
  123. */
  124. cmocka_unit_test(test_tpm2_errata_no_init_and_apply),
  125. cmocka_unit_test(test_tpm2_errata_bad_init_and_apply),
  126. cmocka_unit_test(test_tpm2_errata_init_good_and_apply),
  127. cmocka_unit_test(test_tpm2_errata_init_good_and_no_match),
  128. cmocka_unit_test(test_tpm2_errata_init_no_match_and_apply),
  129. };
  130. return cmocka_run_group_tests(tests, NULL, NULL);
  131. }