test_tpm2_session.c 7.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294
  1. /* SPDX-License-Identifier: BSD-3-Clause */
  2. #include <stdbool.h>
  3. #include <stdio.h>
  4. #include <stdlib.h>
  5. #include <string.h>
  6. #include <unistd.h>
  7. #include <setjmp.h>
  8. #include <cmocka.h>
  9. #include <tss2/tss2_mu.h>
  10. #include "test_session_common.h"
  11. #include "tpm2_session.h"
  12. ESYS_TR _save_handle;
  13. static void test_tpm2_create_dummy_context(TPMS_CONTEXT *context) {
  14. context->hierarchy = TPM2_RH_ENDORSEMENT;
  15. context->savedHandle = 2147483648;
  16. context->sequence = 10;
  17. context->contextBlob.size = 200;
  18. memset(context->contextBlob.buffer, '\0', context->contextBlob.size);
  19. }
  20. tool_rc __wrap_tpm2_context_save(ESYS_CONTEXT *esysContext, ESYS_TR saveHandle,
  21. TPMS_CONTEXT **context) {
  22. UNUSED(esysContext);
  23. // context should be non-null or bool files_save_tpm_context_to_file()
  24. // segfaults
  25. TPMS_CONTEXT *dummy_context = calloc(1, sizeof(TPMS_CONTEXT));
  26. test_tpm2_create_dummy_context(dummy_context);
  27. *context = dummy_context;
  28. _save_handle = saveHandle;
  29. return tool_rc_success;
  30. }
  31. TSS2_RC __wrap_Esys_ContextLoad(ESYS_CONTEXT *esysContext,
  32. const TPMS_CONTEXT *context, ESYS_TR *loadedHandle) {
  33. UNUSED(esysContext);
  34. UNUSED(context);
  35. *loadedHandle = _save_handle;
  36. return TPM2_RC_SUCCESS;
  37. }
  38. static TSS2_RC policy_restart_return() {
  39. return (TSS2_RC) mock();
  40. }
  41. TSS2_RC __wrap_Esys_PolicyRestart(ESYS_CONTEXT *esysContext,
  42. ESYS_TR sessionHandle, ESYS_TR shandle1, ESYS_TR shandle2,
  43. ESYS_TR shandle3) {
  44. UNUSED(esysContext);
  45. UNUSED(sessionHandle);
  46. UNUSED(shandle1);
  47. UNUSED(shandle2);
  48. UNUSED(shandle3);
  49. return policy_restart_return();
  50. }
  51. static ESYS_CONTEXT *CONTEXT = ((ESYS_CONTEXT *) 0xDEADBEEF);
  52. TSS2_RC __wrap_Esys_TR_GetName(ESYS_CONTEXT *esysContext, ESYS_TR handle,
  53. TPM2B_NAME **name) {
  54. UNUSED(esysContext);
  55. UNUSED(handle);
  56. *name = malloc(sizeof(TPM2B_NAME));
  57. size_t offset = 0;
  58. TSS2_RC rc = Tss2_MU_TPM2_HANDLE_Marshal(SESSION_HANDLE, &(*name)->name[0],
  59. sizeof(TPM2_HANDLE), &offset);
  60. (*name)->size = offset;
  61. return rc;
  62. }
  63. TSS2_RC __wrap_tpm2_flush_context(ESYS_CONTEXT *esysContext,
  64. ESYS_TR flushHandle) {
  65. UNUSED(esysContext);
  66. UNUSED(flushHandle);
  67. return TSS2_RC_SUCCESS;
  68. }
  69. static void test_tpm2_session_defaults_good(void **state) {
  70. UNUSED(state);
  71. set_expected_defaults(TPM2_SE_POLICY, SESSION_HANDLE, TPM2_RC_SUCCESS);
  72. tpm2_session_data *d = tpm2_session_data_new(TPM2_SE_POLICY);
  73. assert_non_null(d);
  74. tpm2_session *s = NULL;
  75. tool_rc rc = tpm2_session_open(CONTEXT, d, &s);
  76. assert_int_equal(rc, tool_rc_success);
  77. assert_non_null(s);
  78. ESYS_TR handle = tpm2_session_get_handle(s);
  79. assert_int_equal(handle, SESSION_HANDLE);
  80. TPMI_ALG_HASH auth_hash = tpm2_session_get_authhash(s);
  81. assert_int_equal(auth_hash, TPM2_ALG_SHA256);
  82. tpm2_session_close(&s);
  83. assert_null(s);
  84. }
  85. static void test_tpm2_session_setters_good(void **state) {
  86. UNUSED(state);
  87. tpm2_session_data *d = tpm2_session_data_new(TPM2_SE_TRIAL);
  88. assert_non_null(d);
  89. tpm2_session_set_authhash(d, TPM2_ALG_SHA512);
  90. TPMT_SYM_DEF symmetric = {
  91. .algorithm = TPM2_ALG_AES,
  92. .keyBits = {
  93. .aes = 256
  94. },
  95. .mode = {
  96. .aes = 42
  97. },
  98. };
  99. tpm2_session_set_symmetric(d, &symmetric);
  100. tpm2_session_set_bind(d, 42);
  101. TPM2B_NONCE nonce = {
  102. .size = 5,
  103. .buffer = {
  104. 'n', 'o', 'n', 'c', 'e'
  105. }
  106. };
  107. tpm2_session_set_nonce_caller(d, &nonce);
  108. tpm2_session_set_key(d, 0x1234);
  109. set_expected(0x1234, 42, TPM2_SE_TRIAL, &symmetric, TPM2_ALG_SHA512, &nonce,
  110. SESSION_HANDLE, TPM2_RC_SUCCESS);
  111. tpm2_session *s = NULL;
  112. tool_rc rc = tpm2_session_open(CONTEXT, d, &s);
  113. assert_int_equal(rc, tool_rc_success);
  114. assert_non_null(s);
  115. TPMI_SH_AUTH_SESSION handle = tpm2_session_get_handle(s);
  116. assert_int_equal(handle, SESSION_HANDLE);
  117. TPMI_ALG_HASH auth_hash = tpm2_session_get_authhash(s);
  118. assert_int_equal(auth_hash, TPM2_ALG_SHA512);
  119. tpm2_session_close(&s);
  120. assert_null(s);
  121. }
  122. static void test_tpm2_session_defaults_bad(void **state) {
  123. UNUSED(state);
  124. set_expected_defaults(TPM2_SE_POLICY, SESSION_HANDLE, TPM2_RC_FAILURE);
  125. tpm2_session_data *d = tpm2_session_data_new(TPM2_SE_POLICY);
  126. assert_non_null(d);
  127. tpm2_session *s = NULL;
  128. tool_rc rc = tpm2_session_open(CONTEXT, d, &s);
  129. assert_int_equal(rc, tool_rc_general_error);
  130. assert_null(s);
  131. }
  132. static int test_session_setup(void **state) {
  133. int rc = (*state = tmpnam(NULL)) == NULL;
  134. return rc;
  135. }
  136. static int test_session_teardown(void **state) {
  137. int rc = unlink((char *) *state);
  138. return rc;
  139. }
  140. static void test_tpm2_session_save(void **state) {
  141. set_expected_defaults(TPM2_SE_POLICY, SESSION_HANDLE, TPM2_RC_SUCCESS);
  142. tpm2_session_data *d = tpm2_session_data_new(TPM2_SE_POLICY);
  143. assert_non_null(d);
  144. tpm2_session_set_path(d, (char *) *state);
  145. tpm2_session *s = NULL;
  146. tool_rc rc = tpm2_session_open(CONTEXT, d, &s); //OPEN
  147. assert_int_equal(rc, tool_rc_success);
  148. assert_non_null(s);
  149. rc = tpm2_session_close(&s); //CLOSE
  150. assert_int_equal(rc, tool_rc_success);
  151. assert_null(s);
  152. rc = tpm2_session_restore(NULL, (char *) *state, false, &s); //RESTORE
  153. assert_int_equal(rc, tool_rc_success);
  154. assert_non_null(s);
  155. tpm2_session_close(&s); //CLOSE
  156. assert_null(s);
  157. }
  158. static void test_tpm2_session_restart(void **state) {
  159. UNUSED(state);
  160. set_expected_defaults(TPM2_SE_POLICY, SESSION_HANDLE, TPM2_RC_SUCCESS);
  161. tpm2_session_data *d = tpm2_session_data_new(TPM2_SE_POLICY);
  162. assert_non_null(d);
  163. tpm2_session *s = NULL;
  164. tool_rc rc = tpm2_session_open(CONTEXT, d, &s);
  165. assert_int_equal(rc, tool_rc_success);
  166. assert_non_null(s);
  167. will_return(policy_restart_return, TPM2_RC_SUCCESS);
  168. rc = tpm2_session_restart(CONTEXT, s);
  169. assert_int_equal(rc, tool_rc_success);
  170. will_return(policy_restart_return, TPM2_RC_HANDLE);
  171. rc = tpm2_session_restart(CONTEXT, s);
  172. assert_int_equal(rc, tool_rc_general_error);
  173. tpm2_session_close(&s);
  174. assert_null(s);
  175. }
  176. static void test_tpm2_session_is_trial_test(void **state) {
  177. UNUSED(state);
  178. set_expected_defaults(TPM2_SE_TRIAL, SESSION_HANDLE, TPM2_RC_SUCCESS);
  179. tpm2_session_data *d = tpm2_session_data_new(TPM2_SE_TRIAL);
  180. assert_non_null(d);
  181. tpm2_session *s = NULL;
  182. tool_rc rc = tpm2_session_open(CONTEXT, d, &s);
  183. assert_int_equal(rc, tool_rc_success);
  184. assert_non_null(s);
  185. TPM2_SE type = tpm2_session_get_type(s);
  186. assert_int_equal(type, TPM2_SE_TRIAL);
  187. bool is_trial = tpm2_session_is_trial(s);
  188. assert_true(is_trial);
  189. tpm2_session_close(&s);
  190. }
  191. /* link required symbol, but tpm2_tool.c declares it AND main, which
  192. * we have a main below for cmocka tests.
  193. */
  194. bool output_enabled = true;
  195. int main(int argc, char *argv[]) {
  196. UNUSED(argc);
  197. UNUSED(argv);
  198. const struct CMUnitTest tests[] = {
  199. /*
  200. * no_init/bad_init routines must go first as there is no way to
  201. * de-initialize. However, re-initialization will query the capabilities
  202. * and can be changed or cause a no-match situation. This is a bit of
  203. * whitebox knowledge in the ordering of these tests.
  204. */
  205. cmocka_unit_test(test_tpm2_session_defaults_good),
  206. cmocka_unit_test(test_tpm2_session_setters_good),
  207. cmocka_unit_test(test_tpm2_session_defaults_bad),
  208. cmocka_unit_test_setup_teardown(test_tpm2_session_save,
  209. test_session_setup, test_session_teardown),
  210. cmocka_unit_test(test_tpm2_session_restart),
  211. cmocka_unit_test(test_tpm2_session_is_trial_test)
  212. };
  213. return cmocka_run_group_tests(tests, NULL, NULL);
  214. }