test_cc_util.c 6.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233
  1. /* SPDX-License-Identifier: BSD-3-Clause */
  2. #include <stdarg.h>
  3. #include <stdbool.h>
  4. #include <stddef.h>
  5. #include <setjmp.h>
  6. #include <cmocka.h>
  7. #include "tpm2_cc_util.h"
  8. #include "tpm2_util.h"
  9. static void test_tpm2_cc_util_from_str_null_str_ptr(void **state) {
  10. UNUSED(state);
  11. TPM2_CC cc;
  12. bool result = tpm2_cc_util_from_str(NULL, &cc);
  13. assert_false(result);
  14. }
  15. static void test_tpm2_cc_util_from_str_null_cc_ptr(void **state) {
  16. UNUSED(state);
  17. bool result = tpm2_cc_util_from_str("duplicate", NULL);
  18. assert_false(result);
  19. }
  20. static void test_tpm2_cc_util_from_str_null_ptrs(void **state) {
  21. UNUSED(state);
  22. bool result = tpm2_cc_util_from_str(NULL, NULL);
  23. assert_false(result);
  24. }
  25. static void test_tpm2_cc_util_from_str_invalid_str(void **state) {
  26. UNUSED(state);
  27. TPM2_CC cc = 0;
  28. bool result = tpm2_cc_util_from_str("nofound", &cc);
  29. assert_false(result);
  30. assert_int_equal(cc, 0);
  31. }
  32. static void test_tpm2_cc_util_from_str_empty_str(void **state) {
  33. UNUSED(state);
  34. TPM2_CC cc = 0;
  35. bool result = tpm2_cc_util_from_str("", &cc);
  36. assert_false(result);
  37. assert_int_equal(cc, 0);
  38. }
  39. static void test_tpm2_cc_util_from_str_valid_hex_str(void **state) {
  40. UNUSED(state);
  41. TPM2_CC cc = 0;
  42. bool result = tpm2_cc_util_from_str("0x42", &cc);
  43. assert_true(result);
  44. assert_int_equal(cc, 0x42);
  45. }
  46. static void test_tpm2_cc_util_to_str_unknown(void **state) {
  47. UNUSED(state);
  48. const char *cc_name = tpm2_cc_util_to_str(TPM2_CC_LAST + 1);
  49. assert_null(cc_name);
  50. }
  51. typedef struct cc_map cc_map;
  52. struct cc_map {
  53. TPM2_CC cc;
  54. const char *str;
  55. };
  56. #define ADDCC(c) { .str = #c, .cc = c }
  57. static const cc_map _g_map[] = {
  58. ADDCC(TPM2_CC_NV_UndefineSpaceSpecial),
  59. ADDCC(TPM2_CC_EvictControl),
  60. ADDCC(TPM2_CC_HierarchyControl),
  61. ADDCC(TPM2_CC_NV_UndefineSpace),
  62. ADDCC(TPM2_CC_ChangeEPS),
  63. ADDCC(TPM2_CC_ChangePPS),
  64. ADDCC(TPM2_CC_Clear),
  65. ADDCC(TPM2_CC_ClearControl),
  66. ADDCC(TPM2_CC_ClockSet),
  67. ADDCC(TPM2_CC_HierarchyChangeAuth),
  68. ADDCC(TPM2_CC_NV_DefineSpace),
  69. ADDCC(TPM2_CC_PCR_Allocate),
  70. ADDCC(TPM2_CC_PCR_SetAuthPolicy),
  71. ADDCC(TPM2_CC_PP_Commands),
  72. ADDCC(TPM2_CC_SetPrimaryPolicy),
  73. ADDCC(TPM2_CC_FieldUpgradeStart),
  74. ADDCC(TPM2_CC_ClockRateAdjust),
  75. ADDCC(TPM2_CC_CreatePrimary),
  76. ADDCC(TPM2_CC_NV_GlobalWriteLock),
  77. ADDCC(TPM2_CC_GetCommandAuditDigest),
  78. ADDCC(TPM2_CC_NV_Increment),
  79. ADDCC(TPM2_CC_NV_SetBits),
  80. ADDCC(TPM2_CC_NV_Extend),
  81. ADDCC(TPM2_CC_NV_Write),
  82. ADDCC(TPM2_CC_NV_WriteLock),
  83. ADDCC(TPM2_CC_DictionaryAttackLockReset),
  84. ADDCC(TPM2_CC_DictionaryAttackParameters),
  85. ADDCC(TPM2_CC_NV_ChangeAuth),
  86. ADDCC(TPM2_CC_PCR_Event),
  87. ADDCC(TPM2_CC_PCR_Reset),
  88. ADDCC(TPM2_CC_SequenceComplete),
  89. ADDCC(TPM2_CC_SetAlgorithmSet),
  90. ADDCC(TPM2_CC_SetCommandCodeAuditStatus),
  91. ADDCC(TPM2_CC_FieldUpgradeData),
  92. ADDCC(TPM2_CC_IncrementalSelfTest),
  93. ADDCC(TPM2_CC_SelfTest),
  94. ADDCC(TPM2_CC_Startup),
  95. ADDCC(TPM2_CC_Shutdown),
  96. ADDCC(TPM2_CC_StirRandom),
  97. ADDCC(TPM2_CC_ActivateCredential),
  98. ADDCC(TPM2_CC_Certify),
  99. ADDCC(TPM2_CC_PolicyNV),
  100. ADDCC(TPM2_CC_CertifyCreation),
  101. ADDCC(TPM2_CC_Duplicate),
  102. ADDCC(TPM2_CC_GetTime),
  103. ADDCC(TPM2_CC_GetSessionAuditDigest),
  104. ADDCC(TPM2_CC_NV_Read),
  105. ADDCC(TPM2_CC_NV_ReadLock),
  106. ADDCC(TPM2_CC_ObjectChangeAuth),
  107. ADDCC(TPM2_CC_PolicySecret),
  108. ADDCC(TPM2_CC_Rewrap),
  109. ADDCC(TPM2_CC_Create),
  110. ADDCC(TPM2_CC_ECDH_ZGen),
  111. ADDCC(TPM2_CC_HMAC),
  112. ADDCC(TPM2_CC_Import),
  113. ADDCC(TPM2_CC_Load),
  114. ADDCC(TPM2_CC_Quote),
  115. ADDCC(TPM2_CC_RSA_Decrypt),
  116. ADDCC(TPM2_CC_HMAC_Start),
  117. ADDCC(TPM2_CC_SequenceUpdate),
  118. ADDCC(TPM2_CC_Sign),
  119. ADDCC(TPM2_CC_Unseal),
  120. ADDCC(TPM2_CC_PolicySigned),
  121. ADDCC(TPM2_CC_ContextLoad),
  122. ADDCC(TPM2_CC_ContextSave),
  123. ADDCC(TPM2_CC_ECDH_KeyGen),
  124. ADDCC(TPM2_CC_EncryptDecrypt),
  125. ADDCC(TPM2_CC_FlushContext),
  126. ADDCC(TPM2_CC_LoadExternal),
  127. ADDCC(TPM2_CC_MakeCredential),
  128. ADDCC(TPM2_CC_NV_ReadPublic),
  129. ADDCC(TPM2_CC_PolicyAuthorize),
  130. ADDCC(TPM2_CC_PolicyAuthValue),
  131. ADDCC(TPM2_CC_PolicyCommandCode),
  132. ADDCC(TPM2_CC_PolicyCounterTimer),
  133. ADDCC(TPM2_CC_PolicyCpHash),
  134. ADDCC(TPM2_CC_PolicyLocality),
  135. ADDCC(TPM2_CC_PolicyNameHash),
  136. ADDCC(TPM2_CC_PolicyOR),
  137. ADDCC(TPM2_CC_PolicyTicket),
  138. ADDCC(TPM2_CC_ReadPublic),
  139. ADDCC(TPM2_CC_RSA_Encrypt),
  140. ADDCC(TPM2_CC_StartAuthSession),
  141. ADDCC(TPM2_CC_VerifySignature),
  142. ADDCC(TPM2_CC_ECC_Parameters),
  143. ADDCC(TPM2_CC_FirmwareRead),
  144. ADDCC(TPM2_CC_GetCapability),
  145. ADDCC(TPM2_CC_GetRandom),
  146. ADDCC(TPM2_CC_GetTestResult),
  147. ADDCC(TPM2_CC_Hash),
  148. ADDCC(TPM2_CC_PCR_Read),
  149. ADDCC(TPM2_CC_PolicyPCR),
  150. ADDCC(TPM2_CC_PolicyRestart),
  151. ADDCC(TPM2_CC_ReadClock),
  152. ADDCC(TPM2_CC_PCR_Extend),
  153. ADDCC(TPM2_CC_PCR_SetAuthValue),
  154. ADDCC(TPM2_CC_NV_Certify),
  155. ADDCC(TPM2_CC_EventSequenceComplete),
  156. ADDCC(TPM2_CC_HashSequenceStart),
  157. ADDCC(TPM2_CC_PolicyPhysicalPresence),
  158. ADDCC(TPM2_CC_PolicyDuplicationSelect),
  159. ADDCC(TPM2_CC_PolicyGetDigest),
  160. ADDCC(TPM2_CC_TestParms),
  161. ADDCC(TPM2_CC_Commit),
  162. ADDCC(TPM2_CC_PolicyPassword),
  163. ADDCC(TPM2_CC_ZGen_2Phase),
  164. ADDCC(TPM2_CC_EC_Ephemeral),
  165. ADDCC(TPM2_CC_PolicyNvWritten),
  166. ADDCC(TPM2_CC_PolicyTemplate),
  167. ADDCC(TPM2_CC_CreateLoaded),
  168. ADDCC(TPM2_CC_PolicyAuthorizeNV),
  169. ADDCC(TPM2_CC_EncryptDecrypt2),
  170. ADDCC(TPM2_CC_AC_GetCapability),
  171. ADDCC(TPM2_CC_AC_Send),
  172. ADDCC(TPM2_CC_Policy_AC_SendSelect),
  173. ADDCC(TPM2_CC_Vendor_TCG_Test),
  174. };
  175. static void test_tpm2_cc_util_from_str_validate_map(void **state) {
  176. UNUSED(state);
  177. size_t i;
  178. for (i = 0; i < ARRAY_LEN(_g_map); i++) {
  179. const cc_map *m = &_g_map[i];
  180. TPM2_CC expected = m->cc;
  181. TPM2_CC got = 0;
  182. bool result = tpm2_cc_util_from_str(m->str, &got);
  183. assert_true(result);
  184. assert_int_equal(got, expected);
  185. const char *sgot = tpm2_cc_util_to_str(m->cc);
  186. assert_string_equal(sgot, m->str);
  187. }
  188. }
  189. /* link required symbol, but tpm2_tool.c declares it AND main, which
  190. * we have a main below for cmocka tests.
  191. */
  192. bool output_enabled = true;
  193. int main(int argc, char *argv[]) {
  194. UNUSED(argc);
  195. UNUSED(argv);
  196. const struct CMUnitTest tests[] = {
  197. cmocka_unit_test(test_tpm2_cc_util_from_str_null_str_ptr),
  198. cmocka_unit_test(test_tpm2_cc_util_from_str_null_cc_ptr),
  199. cmocka_unit_test(test_tpm2_cc_util_from_str_null_ptrs),
  200. cmocka_unit_test(test_tpm2_cc_util_from_str_invalid_str),
  201. cmocka_unit_test(test_tpm2_cc_util_from_str_empty_str),
  202. cmocka_unit_test(test_tpm2_cc_util_from_str_valid_hex_str),
  203. cmocka_unit_test(test_tpm2_cc_util_to_str_unknown),
  204. cmocka_unit_test(test_tpm2_cc_util_from_str_validate_map),
  205. };
  206. return cmocka_run_group_tests(tests, NULL, NULL);
  207. }