test_tss2_rc.c 7.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319
  1. /* SPDX-License-Identifier: BSD-2-Clause */
  2. #include <stdarg.h>
  3. #include <stdbool.h>
  4. #include <stddef.h>
  5. #include <stdio.h>
  6. #include <stdlib.h>
  7. #include <string.h>
  8. #include <setjmp.h>
  9. #include <cmocka.h>
  10. #include "tss2_rc.h"
  11. #include "util/aux_util.h"
  12. #define ARRAY_LEN(x) (sizeof(x)/sizeof(x[0]))
  13. #define TPM2_ERROR_TSS2_RC_LAYER_COUNT (TSS2_RC_LAYER_MASK >> TSS2_RC_LAYER_SHIFT)
  14. #define assert_string_prefix(str, prefix) \
  15. assert_memory_equal(str, prefix, strlen(prefix))
  16. static void
  17. test_layers(void **state)
  18. {
  19. UNUSED(state);
  20. static const char *known_layers[TPM2_ERROR_TSS2_RC_LAYER_COUNT] = {
  21. "tpm:",
  22. NULL,
  23. NULL,
  24. NULL,
  25. NULL,
  26. NULL,
  27. "fapi:",
  28. "esapi:",
  29. "sys:",
  30. "mu:",
  31. "tcti:",
  32. "rmt",
  33. "rm",
  34. "drvr",
  35. };
  36. UINT8 layer;
  37. for (layer = 0; layer < TPM2_ERROR_TSS2_RC_LAYER_COUNT; layer++) {
  38. TSS2_RC rc = TSS2_RC_LAYER(layer);
  39. const char *got = Tss2_RC_Decode(rc);
  40. char buf[256];
  41. snprintf(buf, sizeof(buf), "%u:", layer);
  42. const char *expected = known_layers[layer] ? known_layers[layer] : buf;
  43. assert_string_prefix(got, expected);
  44. }
  45. }
  46. static void
  47. test_tpm_format_0_version2_0_error(void **state)
  48. {
  49. (void) state;
  50. const char *m = Tss2_RC_Decode(TPM2_RC_SEQUENCE);
  51. assert_string_equal(m, "tpm:error(2.0): improper use of a sequence"
  52. " handle");
  53. }
  54. static void test_tpm_format_0_version2_0_warn(void **state)
  55. {
  56. (void) state;
  57. const char *m = Tss2_RC_Decode(TPM2_RC_REFERENCE_H0);
  58. assert_string_equal(m,
  59. "tpm:warn(2.0): the 1st handle in the handle area references a"
  60. " transient object or session that is not loaded");
  61. }
  62. static void
  63. test_tpm2_format_0_unknown(void **state)
  64. {
  65. (void) state;
  66. const char *m = Tss2_RC_Decode(TPM2_RC_NOT_USED + 0x80);
  67. assert_string_equal(m, "tpm:parameter(1):unknown error num: 0x3F");
  68. }
  69. static void
  70. test_tpm_format_1_unk_handle(void **state)
  71. {
  72. (void) state;
  73. const char *m = Tss2_RC_Decode(TPM2_RC_HASH);
  74. assert_string_equal(m,
  75. "tpm:handle(unk):hash algorithm not supported or not appropriate");
  76. }
  77. static void
  78. test_tpm_format_1_unk_parameter(void **state)
  79. {
  80. (void) state;
  81. const char *m = Tss2_RC_Decode(TPM2_RC_HASH + TPM2_RC_P);
  82. assert_string_equal(m,
  83. "tpm:parameter(unk):hash algorithm not supported or not appropriate");
  84. }
  85. static void
  86. test_tpm_format_1_unk_session(void **state)
  87. {
  88. (void) state;
  89. const char *m = Tss2_RC_Decode(TPM2_RC_HASH + TPM2_RC_S);
  90. assert_string_equal(m,
  91. "tpm:session(unk):hash algorithm not supported or not appropriate");
  92. }
  93. static void
  94. test_tpm_format_1_5_handle(void **state)
  95. {
  96. (void) state;
  97. const char *m = Tss2_RC_Decode(TPM2_RC_HASH + TPM2_RC_5);
  98. assert_string_equal(m,
  99. "tpm:handle(5):hash algorithm not supported or not appropriate");
  100. }
  101. static void
  102. test_tpm2_format_1_unknown(void **state)
  103. {
  104. (void) state;
  105. const char *m = Tss2_RC_Decode(TPM2_RC_NOT_USED + 0x80);
  106. assert_string_equal(m, "tpm:parameter(1):unknown error num: 0x3F");
  107. }
  108. static void
  109. test_tpm2_format_1_success(void **state)
  110. {
  111. (void) state;
  112. const char *m = Tss2_RC_Decode(TPM2_RC_SUCCESS);
  113. assert_string_equal(m, "tpm:success");
  114. }
  115. static const char *
  116. custom_err_handler(TSS2_RC rc)
  117. {
  118. static const char *err_map[] = { "error 1", "error 2", "error 3" };
  119. if (rc - 1u >= ARRAY_LEN(err_map)) {
  120. return NULL;
  121. }
  122. return err_map[rc - 1];
  123. }
  124. static void
  125. test_custom_handler(void **state)
  126. {
  127. (void) state;
  128. /*
  129. * Test registering a custom handler
  130. */
  131. TSS2_RC_HANDLER old = Tss2_RC_SetHandler(1, "cstm", custom_err_handler);
  132. assert_null(old);
  133. /*
  134. * Test getting error strings
  135. */
  136. unsigned i;
  137. for (i = 1; i < 4; i++) {
  138. // Make a layer 1 error with an error number of i.
  139. TSS2_RC rc = TSS2_RC_LAYER(1) | i;
  140. char buf[256];
  141. snprintf(buf, sizeof(buf), "cstm:error %u", i);
  142. const char *e = Tss2_RC_Decode(rc);
  143. assert_string_equal(e, buf);
  144. }
  145. TSS2_RC rc = TSS2_RC_LAYER(1) | 42;
  146. /*
  147. * Test an unknown error
  148. */
  149. const char *e = Tss2_RC_Decode(rc);
  150. assert_string_equal(e, "cstm:0x2A");
  151. /*
  152. * Test clearing a handler
  153. */
  154. old = Tss2_RC_SetHandler(1, "cstm", NULL);
  155. assert_ptr_equal(old, custom_err_handler);
  156. /*
  157. * Test an unknown layer
  158. */
  159. e = Tss2_RC_Decode(rc);
  160. assert_string_equal(e, "1:0x2A");
  161. }
  162. static void
  163. test_zero_length_name(void **state)
  164. {
  165. (void) state;
  166. TSS2_RC_HANDLER old = Tss2_RC_SetHandler(TSS2_TPM_RC_LAYER, "",
  167. custom_err_handler);
  168. assert_non_null(old);
  169. old = Tss2_RC_SetHandler(TSS2_TPM_RC_LAYER, "",
  170. custom_err_handler);
  171. assert_ptr_equal(old, custom_err_handler);
  172. }
  173. static void
  174. test_over_length_name(void **state)
  175. {
  176. (void) state;
  177. TSS2_RC_HANDLER old = Tss2_RC_SetHandler(1, "way to long of name", custom_err_handler);
  178. assert_null(old);
  179. old = Tss2_RC_SetHandler(1, "way to long of name", custom_err_handler);
  180. assert_ptr_equal(old, custom_err_handler);
  181. }
  182. static void
  183. test_null_name(void **state)
  184. {
  185. (void) state;
  186. TSS2_RC_HANDLER old = Tss2_RC_SetHandler(1,
  187. NULL, custom_err_handler);
  188. assert_ptr_equal(old, custom_err_handler);
  189. old = Tss2_RC_SetHandler(1,
  190. NULL, custom_err_handler);
  191. assert_ptr_equal(old, custom_err_handler);
  192. }
  193. static void
  194. test_sys(void **state)
  195. {
  196. (void) state;
  197. const char *e = Tss2_RC_Decode(TSS2_SYS_RC_ABI_MISMATCH);
  198. assert_string_equal(e,
  199. "sys:Passed in ABI version doesn't match called module's ABI version");
  200. }
  201. static void
  202. test_esys(void **state)
  203. {
  204. (void) state;
  205. const char *e = Tss2_RC_Decode(TSS2_ESYS_RC_BAD_VALUE);
  206. assert_string_equal(e,
  207. "esapi:A parameter has a bad value");
  208. }
  209. static void
  210. test_mu(void **state)
  211. {
  212. (void) state;
  213. const char *e = Tss2_RC_Decode(TSS2_MU_RC_BAD_REFERENCE);
  214. assert_string_equal(e,
  215. "mu:A pointer is NULL that isn't allowed to be NULL.");
  216. }
  217. static void
  218. test_tcti(void **state)
  219. {
  220. (void) state;
  221. const char *e = Tss2_RC_Decode(TSS2_TCTI_RC_NO_CONNECTION);
  222. assert_string_equal(e, "tcti:Fails to connect to next lower layer");
  223. }
  224. /* link required symbol, but tpm2_tool.c declares it AND main, which
  225. * we have a main below for cmocka tests.
  226. */
  227. bool output_enabled = true;
  228. int
  229. main(int argc, char* argv[])
  230. {
  231. (void) argc;
  232. (void) argv;
  233. const struct CMUnitTest tests[] = {
  234. /* Layer tests */
  235. cmocka_unit_test(test_layers),
  236. cmocka_unit_test(test_tpm_format_0_version2_0_error),
  237. cmocka_unit_test(test_tpm_format_0_version2_0_warn),
  238. cmocka_unit_test(test_tpm2_format_0_unknown),
  239. cmocka_unit_test(test_tpm_format_1_unk_handle),
  240. cmocka_unit_test(test_tpm_format_1_unk_parameter),
  241. cmocka_unit_test(test_tpm_format_1_unk_session),
  242. cmocka_unit_test(test_tpm_format_1_5_handle),
  243. cmocka_unit_test(test_tpm2_format_1_unknown),
  244. cmocka_unit_test(test_tpm2_format_1_success),
  245. cmocka_unit_test(test_custom_handler),
  246. cmocka_unit_test(test_zero_length_name),
  247. cmocka_unit_test(test_over_length_name),
  248. cmocka_unit_test(test_null_name),
  249. cmocka_unit_test(test_sys),
  250. cmocka_unit_test(test_esys),
  251. cmocka_unit_test(test_mu),
  252. cmocka_unit_test(test_tcti),
  253. };
  254. return cmocka_run_group_tests(tests, NULL, NULL);
  255. }