esys-pcr-basic.int.c 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181
  1. /* SPDX-License-Identifier: BSD-2-Clause */
  2. /*******************************************************************************
  3. * Copyright 2017-2018, Fraunhofer SIT sponsored by Infineon Technologies AG
  4. * All rights reserved.
  5. *******************************************************************************/
  6. #ifdef HAVE_CONFIG_H
  7. #include <config.h>
  8. #endif
  9. #include <stdlib.h>
  10. #include "tss2_esys.h"
  11. #include "esys_iutil.h"
  12. #include "test-esys.h"
  13. #define LOGMODULE test
  14. #include "util/log.h"
  15. #include "util/aux_util.h"
  16. /** Test the basic commands for PCR processing.
  17. *
  18. *\b Note: platform authorization needed.
  19. *
  20. * Tested ESYS commands:
  21. * - Esys_PCR_Allocate() (M)
  22. * - Esys_PCR_Event() (M)
  23. * - Esys_PCR_Extend() (M)
  24. * - Esys_PCR_Read() (M)
  25. * - Esys_PCR_Reset() (M)
  26. *
  27. * @param[in,out] esys_context The ESYS_CONTEXT.
  28. * @retval EXIT_FAILURE
  29. * @retval EXIT_SKIP
  30. * @retval EXIT_SUCCESS
  31. */
  32. int
  33. test_esys_pcr_basic(ESYS_CONTEXT * esys_context)
  34. {
  35. TSS2_RC r;
  36. int failure_return = EXIT_FAILURE;
  37. TPMS_CAPABILITY_DATA *savedPCRs = NULL;
  38. TPML_PCR_SELECTION *pcrSelectionOut = NULL;
  39. TPML_DIGEST *pcrValues = NULL;
  40. TPML_DIGEST_VALUES *digestsEvent = NULL;
  41. ESYS_TR pcrHandle_handle = 16;
  42. TPML_DIGEST_VALUES digests
  43. = {
  44. .count = 1,
  45. .digests = {
  46. {
  47. .hashAlg = TPM2_ALG_SHA256,
  48. .digest = {
  49. .sha1 = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10,
  50. 11, 12, 13, 14, 15, 16, 17, 18, 19}
  51. }
  52. },
  53. }};
  54. r = Esys_PCR_Extend(
  55. esys_context,
  56. pcrHandle_handle,
  57. ESYS_TR_PASSWORD,
  58. ESYS_TR_NONE,
  59. ESYS_TR_NONE,
  60. &digests
  61. );
  62. goto_if_error(r, "Error: PCR_Extend", error);
  63. TPML_PCR_SELECTION pcrSelectionIn = {
  64. .count = 1,
  65. .pcrSelections = {
  66. { .hash = TPM2_ALG_SHA256,
  67. .sizeofSelect = 3,
  68. .pcrSelect = { 01, 00, 03}
  69. },
  70. }
  71. };
  72. UINT32 pcrUpdateCounter;
  73. r = Esys_PCR_Read(
  74. esys_context,
  75. ESYS_TR_NONE,
  76. ESYS_TR_NONE,
  77. ESYS_TR_NONE,
  78. &pcrSelectionIn,
  79. &pcrUpdateCounter,
  80. &pcrSelectionOut,
  81. &pcrValues);
  82. goto_if_error(r, "Error: PCR_Read", error);
  83. r = Esys_PCR_Reset(
  84. esys_context,
  85. pcrHandle_handle,
  86. ESYS_TR_PASSWORD,
  87. ESYS_TR_NONE,
  88. ESYS_TR_NONE);
  89. goto_if_error(r, "Error: PCR_Reset", error);
  90. TPM2B_EVENT eventData = { .size = 20,
  91. .buffer={0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0,
  92. 1, 2, 3, 4, 5, 6, 7, 8, 9}};
  93. r = Esys_PCR_Event(
  94. esys_context,
  95. pcrHandle_handle,
  96. ESYS_TR_PASSWORD,
  97. ESYS_TR_NONE,
  98. ESYS_TR_NONE,
  99. &eventData,
  100. &digestsEvent);
  101. goto_if_error(r, "Error: PCR_Reset", error);
  102. TPMI_YES_NO allocationSuccess;
  103. UINT32 maxPCR;
  104. UINT32 sizeNeeded;
  105. UINT32 sizeAvailable;
  106. r = Esys_GetCapability(esys_context,
  107. ESYS_TR_NONE, ESYS_TR_NONE, ESYS_TR_NONE,
  108. TPM2_CAP_PCRS, 0, 10, NULL, &savedPCRs);
  109. goto_if_error(r, "Error: GetCapabilities", error);
  110. r = Esys_PCR_Allocate(
  111. esys_context,
  112. ESYS_TR_RH_PLATFORM,
  113. ESYS_TR_PASSWORD,
  114. ESYS_TR_NONE,
  115. ESYS_TR_NONE,
  116. &pcrSelectionIn,
  117. &allocationSuccess,
  118. &maxPCR,
  119. &sizeNeeded,
  120. &sizeAvailable);
  121. if (number_rc(r) == TPM2_RC_BAD_AUTH) {
  122. /* Platform authorization not possible test will be skipped */
  123. LOG_WARNING("Platform authorization not possible.");
  124. failure_return = EXIT_SKIP;
  125. }
  126. goto_if_error(r, "Error: PCR_Allocate", error);
  127. r = Esys_PCR_Allocate(
  128. esys_context,
  129. ESYS_TR_RH_PLATFORM,
  130. ESYS_TR_PASSWORD,
  131. ESYS_TR_NONE,
  132. ESYS_TR_NONE,
  133. &savedPCRs->data.assignedPCR,
  134. &allocationSuccess,
  135. &maxPCR,
  136. &sizeNeeded,
  137. &sizeAvailable);
  138. goto_if_error(r, "Error: PCR_Allocate", error);
  139. Esys_Free(savedPCRs);
  140. Esys_Free(pcrSelectionOut);
  141. Esys_Free(pcrValues);
  142. Esys_Free(digestsEvent);
  143. return EXIT_SUCCESS;
  144. error:
  145. Esys_Free(savedPCRs);
  146. Esys_Free(pcrSelectionOut);
  147. Esys_Free(pcrValues);
  148. Esys_Free(digestsEvent);
  149. return failure_return;
  150. }
  151. int
  152. test_invoke_esys(ESYS_CONTEXT * esys_context) {
  153. return test_esys_pcr_basic(esys_context);
  154. }