sys-execute.c 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168
  1. /* SPDX-License-Identifier: BSD-2-Clause */
  2. /*******************************************************************************
  3. * Copyright 2019, Intel Corporation
  4. *
  5. * All rights reserved.
  6. ******************************************************************************/
  7. #ifdef HAVE_CONFIG_H
  8. #include <config.h>
  9. #endif
  10. #include <stdarg.h>
  11. #include <inttypes.h>
  12. #include <string.h>
  13. #include <stdlib.h>
  14. #include <setjmp.h>
  15. #include <cmocka.h>
  16. #include "tss2_sys.h"
  17. #include "sysapi_util.h"
  18. #include "tss2-tcti/tcti-common.h"
  19. #define LOGMODULE test
  20. #include "util/log.h"
  21. /**
  22. * Test calls Tss2_Sys_Execute() many times after receiving TPM2_RC_RETRY
  23. */
  24. const uint8_t ok_response[] = {
  25. 0x80, 0x01, /* TPM_ST_NO_SESSION */
  26. 0x00, 0x00, 0x00, 0x2C, /* Response Size 10 + 2 + 32 */
  27. 0x00, 0x00, 0x00, 0x00, /* TPM_RC_SUCCESS */
  28. 0x00, 0x20, /* size of buffer */
  29. 0xde, 0xad, 0xbe, 0xef,
  30. 0xde, 0xad, 0xbe, 0xef,
  31. 0xde, 0xad, 0xbe, 0xef,
  32. 0xde, 0xad, 0xbe, 0xef,
  33. 0xde, 0xad, 0xbe, 0xef,
  34. 0xde, 0xad, 0xbe, 0xef,
  35. 0xde, 0xad, 0xbe, 0xef,
  36. 0xde, 0xad, 0xbe, 0xef,
  37. };
  38. const uint8_t retry_response[] = {
  39. 0x80, 0x01, /* TPM_ST_NO_SESSION */
  40. 0x00, 0x00, 0x00, 0x0A, /* Response Size 10 */
  41. 0x00, 0x00, 0x09, 0x22 /* TPM2_RC_RETRY */
  42. };
  43. static TSS2_RC
  44. tcti_transmit(
  45. TSS2_TCTI_CONTEXT *tctiContext,
  46. size_t size,
  47. uint8_t const *command)
  48. {
  49. TSS2_RC r = 0;
  50. tpm_header_t hdr;
  51. LOG_DEBUG ("%s: transmiting %zu bytes", __func__, size);
  52. r = header_unmarshal (command, &hdr);
  53. if (r)
  54. return r;
  55. LOG_DEBUG ("%s request_hdr.tag = %x", __func__, hdr.tag);
  56. LOG_DEBUG ("%s request_hdr.size = %x", __func__, hdr.size);
  57. LOG_DEBUG ("%s request_hdr.code = %x", __func__, hdr.code);
  58. if (hdr.tag != TPM2_ST_NO_SESSIONS || hdr.size != 0xC || hdr.code != 0x17B)
  59. return TSS2_TCTI_RC_BAD_VALUE;
  60. return r;
  61. }
  62. #define NUM_OF_RETRIES 4
  63. static TSS2_RC
  64. tcti_receive(
  65. TSS2_TCTI_CONTEXT *tctiContext,
  66. size_t *size,
  67. uint8_t *response,
  68. int32_t timeout)
  69. {
  70. static int i;
  71. LOG_DEBUG ("%s: receiving response, size %zu, buff %p",
  72. __func__, sizeof(ok_response), response);
  73. if (response == NULL) {
  74. *size = sizeof(ok_response);
  75. return TPM2_RC_SUCCESS;
  76. }
  77. if (i++ < NUM_OF_RETRIES) {
  78. LOG_DEBUG ("%s: return RC_RETRY", __func__);
  79. memcpy(response, retry_response, sizeof(retry_response));
  80. *size = sizeof(retry_response);
  81. return TPM2_RC_SUCCESS;
  82. }
  83. memcpy(response, ok_response, sizeof(ok_response));
  84. *size = sizeof(ok_response);
  85. return TPM2_RC_SUCCESS;
  86. }
  87. static TSS2_ABI_VERSION ver = TSS2_ABI_VERSION_CURRENT;
  88. static TSS2_TCTI_CONTEXT_COMMON_V1 _tcti_v1_ctx;
  89. static int
  90. setup(void **state)
  91. {
  92. TSS2_SYS_CONTEXT *sys_ctx;
  93. TSS2_TCTI_CONTEXT *tcti_ctx = (TSS2_TCTI_CONTEXT *) &_tcti_v1_ctx;
  94. UINT32 size_ctx;
  95. TSS2_RC r;
  96. size_ctx = Tss2_Sys_GetContextSize(0);
  97. sys_ctx = calloc (1, size_ctx);
  98. assert_non_null (sys_ctx);
  99. _tcti_v1_ctx.version = 1;
  100. _tcti_v1_ctx.transmit = tcti_transmit;
  101. _tcti_v1_ctx.receive = tcti_receive;
  102. r = Tss2_Sys_Initialize(sys_ctx, size_ctx, tcti_ctx, &ver);
  103. assert_int_equal (r, TSS2_RC_SUCCESS);
  104. *state = sys_ctx;
  105. return 0;
  106. }
  107. static int
  108. teardown(void **state)
  109. {
  110. TSS2_SYS_CONTEXT *sys_ctx = (TSS2_SYS_CONTEXT *)*state;
  111. if (sys_ctx)
  112. free (sys_ctx);
  113. return 0;
  114. }
  115. static void
  116. test_resubmit(void **state)
  117. {
  118. TSS2_RC r = 0;
  119. TSS2_SYS_CONTEXT *sys_ctx = (TSS2_SYS_CONTEXT *)*state;
  120. int ctr = 0;
  121. r = Tss2_Sys_GetRandom_Prepare(sys_ctx, 32);
  122. assert_int_equal(r, TSS2_RC_SUCCESS);
  123. do {
  124. r = Tss2_Sys_Execute(sys_ctx);
  125. } while (r == TPM2_RC_RETRY && ctr++ < 10);
  126. assert_int_equal(r, TSS2_RC_SUCCESS);
  127. assert_int_equal(ctr, NUM_OF_RETRIES);
  128. return;
  129. }
  130. int
  131. main(int argc, char *argv[])
  132. {
  133. const struct CMUnitTest tests[] = {
  134. cmocka_unit_test_setup_teardown(test_resubmit, setup, teardown),
  135. };
  136. return cmocka_run_group_tests(tests, NULL, NULL);
  137. }