tctildr-tcti.c 10.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324
  1. /*
  2. * SPDX-License-Identifier: BSD-2-Clause
  3. * Copyright 2018-2019, Intel Corporation
  4. */
  5. #include <inttypes.h>
  6. #include <limits.h>
  7. #include <stdarg.h>
  8. #include <stdbool.h>
  9. #include <stdlib.h>
  10. #include <stdio.h>
  11. #include <string.h>
  12. #include <setjmp.h>
  13. #include <cmocka.h>
  14. #include "tss2_tcti.h"
  15. #include "tss2_tctildr.h"
  16. #include "tss2-tcti/tctildr.h"
  17. #include "tss2-tcti/tcti-common.h"
  18. #include "util/aux_util.h"
  19. #define TEST_MAGIC 0x1234321
  20. #define TEST_VERSION 2
  21. TSS2_RC
  22. __wrap_tctildr_get_info (const char *name,
  23. const TSS2_TCTI_INFO **info,
  24. void **data)
  25. {
  26. TSS2_RC rc = mock_type (TSS2_RC);
  27. if (rc == TSS2_RC_SUCCESS) {
  28. *info = mock_type (TSS2_TCTI_INFO*);
  29. *data = mock_type (void*);
  30. }
  31. return rc;
  32. }
  33. TSS2_RC
  34. __wrap_tctildr_get_tcti (const char *name,
  35. const char* conf,
  36. TSS2_TCTI_CONTEXT **tcti,
  37. void **data)
  38. {
  39. TSS2_RC rc = mock_type (TSS2_RC);
  40. if (rc == TSS2_RC_SUCCESS) {
  41. *tcti= mock_type (TSS2_TCTI_CONTEXT*);
  42. *data = mock_type (void*);
  43. }
  44. return rc;
  45. }
  46. void __wrap_tctildr_finalize_data (void **data) {}
  47. static TSS2_RC
  48. tctildr_mock_transmit (TSS2_TCTI_CONTEXT *context,
  49. size_t size,
  50. uint8_t const *command)
  51. {
  52. return mock_type (TSS2_RC);
  53. }
  54. TSS2_RC
  55. tctildr_mock_receive (TSS2_TCTI_CONTEXT *context,
  56. size_t *size,
  57. uint8_t *response,
  58. int32_t timeout)
  59. {
  60. return mock_type (TSS2_RC);
  61. }
  62. TSS2_RC
  63. tctildr_mock_cancel (TSS2_TCTI_CONTEXT *context)
  64. {
  65. return mock_type (TSS2_RC);
  66. }
  67. TSS2_RC
  68. tctildr_mock_get_poll_handles (TSS2_TCTI_CONTEXT *context,
  69. TSS2_TCTI_POLL_HANDLE *handles,
  70. size_t *num_handles)
  71. {
  72. return mock_type (TSS2_RC);
  73. }
  74. TSS2_RC
  75. tctildr_mock_set_locality (TSS2_TCTI_CONTEXT *context,
  76. uint8_t locality)
  77. {
  78. return mock_type (TSS2_RC);
  79. }
  80. TSS2_RC
  81. tctildr_mock_make_sticky (TSS2_TCTI_CONTEXT *context,
  82. TPM2_HANDLE *handle,
  83. uint8_t sticky)
  84. {
  85. return mock_type (TSS2_RC);
  86. }
  87. #define TSS2_TCTI_MOCK_CONTEXT TSS2_TCTI_CONTEXT_COMMON_V2
  88. #define TEST_TCTI_HANDLE (TSS2_TCTI_LIBRARY_HANDLE)0x9827635
  89. static int
  90. tctildr_setup (void **state)
  91. {
  92. TSS2_TCTILDR_CONTEXT *ldr_ctx;
  93. TSS2_TCTI_MOCK_CONTEXT *tmp;
  94. ldr_ctx = calloc (1, sizeof (TSS2_TCTILDR_CONTEXT));
  95. TSS2_TCTI_MAGIC (ldr_ctx) = TCTILDR_MAGIC;
  96. TSS2_TCTI_VERSION (ldr_ctx) = TCTI_VERSION;
  97. TSS2_TCTI_TRANSMIT (ldr_ctx) = tctildr_transmit;
  98. TSS2_TCTI_RECEIVE (ldr_ctx) = tctildr_receive;
  99. TSS2_TCTI_CANCEL (ldr_ctx) = tctildr_cancel;
  100. TSS2_TCTI_GET_POLL_HANDLES (ldr_ctx) = tctildr_get_poll_handles;
  101. TSS2_TCTI_SET_LOCALITY (ldr_ctx) = tctildr_set_locality;
  102. TSS2_TCTI_MAKE_STICKY (ldr_ctx) = tctildr_make_sticky;
  103. ldr_ctx->library_handle = TEST_TCTI_HANDLE;
  104. tmp = calloc (1, sizeof (TSS2_TCTI_MOCK_CONTEXT));
  105. ldr_ctx->tcti = (TSS2_TCTI_CONTEXT*)tmp;
  106. TSS2_TCTI_MAGIC (ldr_ctx->tcti) = TEST_MAGIC;
  107. TSS2_TCTI_VERSION (ldr_ctx->tcti) = TEST_VERSION;
  108. TSS2_TCTI_TRANSMIT (ldr_ctx->tcti) = tctildr_mock_transmit;
  109. TSS2_TCTI_RECEIVE (ldr_ctx->tcti) = tctildr_mock_receive;
  110. TSS2_TCTI_CANCEL (ldr_ctx->tcti) = tctildr_mock_cancel;
  111. TSS2_TCTI_GET_POLL_HANDLES (ldr_ctx->tcti) = tctildr_mock_get_poll_handles;
  112. TSS2_TCTI_SET_LOCALITY (ldr_ctx->tcti) = tctildr_mock_set_locality;
  113. TSS2_TCTI_MAKE_STICKY (ldr_ctx->tcti) = tctildr_mock_make_sticky;
  114. *state = ldr_ctx;
  115. return 0;
  116. }
  117. static int
  118. tctildr_teardown (void **state)
  119. {
  120. TSS2_TCTI_CONTEXT *context = (TSS2_TCTI_CONTEXT*)*state;
  121. tctildr_finalize (context);
  122. free (context);
  123. return 0;
  124. }
  125. static void
  126. tctildr_transmit_test (void **state)
  127. {
  128. TSS2_RC rc;
  129. TSS2_TCTI_CONTEXT *context = (TSS2_TCTI_CONTEXT*)*state;
  130. uint8_t buffer [64] = { 0 };
  131. size_t size = sizeof (buffer);
  132. will_return (tctildr_mock_transmit, TSS2_RC_SUCCESS);
  133. rc = Tss2_Tcti_Transmit (context, size, buffer);
  134. assert_int_equal (rc, TSS2_RC_SUCCESS);
  135. }
  136. static void
  137. tctildr_transmit_null_test (void **state)
  138. {
  139. TSS2_RC rc;
  140. uint8_t buffer [64] = { 0 };
  141. size_t size = sizeof (buffer);
  142. rc = tctildr_transmit (NULL, size, buffer);
  143. assert_int_equal (rc, TSS2_TCTI_RC_BAD_REFERENCE);
  144. }
  145. static void
  146. tctildr_receive_test (void **state)
  147. {
  148. TSS2_RC rc;
  149. TSS2_TCTI_CONTEXT *context = (TSS2_TCTI_CONTEXT*)*state;
  150. uint8_t buffer [64] = { 0 };
  151. size_t size = sizeof (buffer);
  152. int32_t timeout = TSS2_TCTI_TIMEOUT_BLOCK;
  153. will_return (tctildr_mock_receive, TSS2_RC_SUCCESS);
  154. rc = Tss2_Tcti_Receive (context, &size, buffer, timeout);
  155. assert_int_equal (rc, TSS2_RC_SUCCESS);
  156. }
  157. static void
  158. tctildr_receive_null_test (void **state)
  159. {
  160. TSS2_RC rc;
  161. uint8_t buffer [64] = { 0 };
  162. size_t size = sizeof (buffer);
  163. int32_t timeout = TSS2_TCTI_TIMEOUT_BLOCK;
  164. rc = tctildr_receive (NULL, &size, buffer, timeout);
  165. assert_int_equal (rc, TSS2_TCTI_RC_BAD_REFERENCE);
  166. }
  167. static void
  168. tctildr_cancel_test (void **state)
  169. {
  170. TSS2_RC rc;
  171. TSS2_TCTI_CONTEXT *context = (TSS2_TCTI_CONTEXT*)*state;
  172. will_return (tctildr_mock_cancel, TSS2_RC_SUCCESS);
  173. rc = Tss2_Tcti_Cancel (context);
  174. assert_int_equal (rc, TSS2_RC_SUCCESS);
  175. }
  176. static void
  177. tctildr_cancel_null_test (void **state)
  178. {
  179. TSS2_RC rc;
  180. UNUSED (state);
  181. rc = tctildr_cancel (NULL);
  182. assert_int_equal (rc, TSS2_TCTI_RC_BAD_REFERENCE);
  183. }
  184. #define TEST_NUM_HANDLES 3
  185. static void
  186. tctildr_get_poll_handles_test (void **state)
  187. {
  188. TSS2_RC rc;
  189. TSS2_TCTI_CONTEXT *context = (TSS2_TCTI_CONTEXT*)*state;
  190. TSS2_TCTI_POLL_HANDLE handles [TEST_NUM_HANDLES] = { 0 };
  191. size_t num_handles = sizeof (handles);
  192. will_return (tctildr_mock_get_poll_handles, TSS2_RC_SUCCESS);
  193. rc = Tss2_Tcti_GetPollHandles (context, handles, &num_handles);
  194. assert_int_equal (rc, TSS2_RC_SUCCESS);
  195. }
  196. static void
  197. tctildr_get_poll_handles_null_test (void **state)
  198. {
  199. TSS2_RC rc;
  200. TSS2_TCTI_POLL_HANDLE handles [TEST_NUM_HANDLES] = { 0 };
  201. size_t num_handles = sizeof (handles);
  202. rc = tctildr_get_poll_handles (NULL, handles, &num_handles);
  203. assert_int_equal (rc, TSS2_TCTI_RC_BAD_REFERENCE);
  204. }
  205. static void
  206. tctildr_set_locality_test (void **state)
  207. {
  208. TSS2_RC rc;
  209. TSS2_TCTI_CONTEXT *context = (TSS2_TCTI_CONTEXT*)*state;
  210. will_return (tctildr_mock_set_locality, TSS2_RC_SUCCESS);
  211. rc = Tss2_Tcti_SetLocality (context, 1);
  212. assert_int_equal (rc, TSS2_RC_SUCCESS);
  213. }
  214. static void
  215. tctildr_set_locality_null_test (void **state)
  216. {
  217. TSS2_RC rc;
  218. UNUSED (state);
  219. rc = tctildr_set_locality (NULL, 1);
  220. assert_int_equal (rc, TSS2_TCTI_RC_BAD_REFERENCE);
  221. }
  222. #define TEST_HANDLE 0x1
  223. static void
  224. tctildr_make_sticky_test (void **state)
  225. {
  226. TSS2_RC rc;
  227. TSS2_TCTI_CONTEXT *context = (TSS2_TCTI_CONTEXT*)*state;
  228. TPM2_HANDLE handle = TEST_HANDLE;
  229. will_return (tctildr_mock_make_sticky, TSS2_RC_SUCCESS);
  230. rc = Tss2_Tcti_MakeSticky (context, &handle, TPM2_YES);
  231. assert_int_equal (rc, TSS2_RC_SUCCESS);
  232. }
  233. static void
  234. tctildr_make_sticky_null_test (void **state)
  235. {
  236. TSS2_RC rc;
  237. TPM2_HANDLE handle = TEST_HANDLE;
  238. UNUSED (state);
  239. rc = tctildr_make_sticky (NULL, &handle, TPM2_YES);
  240. assert_int_equal (rc, TSS2_TCTI_RC_BAD_REFERENCE);
  241. }
  242. /*
  243. * This test covers the 'sanity test' path in the tctildr finalize
  244. * function. There's not really a way to check whether or not this test
  245. * passes / does what's intended beyond checking the report from the code
  246. * coverage tool.
  247. */
  248. static void
  249. tctildr_finalize_null_ctx_test (void **state)
  250. {
  251. TSS2_TCTI_CONTEXT *context = NULL;
  252. tctildr_finalize (context);
  253. assert_true (true);
  254. }
  255. int
  256. main (int argc, char* arvg[])
  257. {
  258. const struct CMUnitTest tests[] = {
  259. cmocka_unit_test_setup_teardown (tctildr_transmit_test,
  260. tctildr_setup,
  261. tctildr_teardown),
  262. cmocka_unit_test_setup_teardown (tctildr_transmit_null_test,
  263. tctildr_setup,
  264. tctildr_teardown),
  265. cmocka_unit_test_setup_teardown (tctildr_receive_test,
  266. tctildr_setup,
  267. tctildr_teardown),
  268. cmocka_unit_test_setup_teardown (tctildr_receive_null_test,
  269. tctildr_setup,
  270. tctildr_teardown),
  271. cmocka_unit_test_setup_teardown (tctildr_cancel_test,
  272. tctildr_setup,
  273. tctildr_teardown),
  274. cmocka_unit_test_setup_teardown (tctildr_cancel_null_test,
  275. tctildr_setup,
  276. tctildr_teardown),
  277. cmocka_unit_test_setup_teardown (tctildr_get_poll_handles_test,
  278. tctildr_setup,
  279. tctildr_teardown),
  280. cmocka_unit_test_setup_teardown (tctildr_get_poll_handles_null_test,
  281. tctildr_setup,
  282. tctildr_teardown),
  283. cmocka_unit_test_setup_teardown (tctildr_set_locality_test,
  284. tctildr_setup,
  285. tctildr_teardown),
  286. cmocka_unit_test_setup_teardown (tctildr_set_locality_null_test,
  287. tctildr_setup,
  288. tctildr_teardown),
  289. cmocka_unit_test_setup_teardown (tctildr_make_sticky_test,
  290. tctildr_setup,
  291. tctildr_teardown),
  292. cmocka_unit_test_setup_teardown (tctildr_make_sticky_null_test,
  293. tctildr_setup,
  294. tctildr_teardown),
  295. cmocka_unit_test (tctildr_finalize_null_ctx_test),
  296. };
  297. return cmocka_run_group_tests (tests, NULL, NULL);
  298. }