tpm2_cc_util.c 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180
  1. /* SPDX-License-Identifier: BSD-3-Clause */
  2. #include <string.h>
  3. #include "log.h"
  4. #include "tpm2_cc_util.h"
  5. typedef struct cc_map cc_map;
  6. struct cc_map {
  7. TPM2_CC cc;
  8. const char *str;
  9. };
  10. #define ADDCC(c) { .str = #c, .cc = c }
  11. static const cc_map _g_map[] = {
  12. ADDCC(TPM2_CC_NV_UndefineSpaceSpecial),
  13. ADDCC(TPM2_CC_EvictControl),
  14. ADDCC(TPM2_CC_HierarchyControl),
  15. ADDCC(TPM2_CC_NV_UndefineSpace),
  16. ADDCC(TPM2_CC_ChangeEPS),
  17. ADDCC(TPM2_CC_ChangePPS),
  18. ADDCC(TPM2_CC_Clear),
  19. ADDCC(TPM2_CC_ClearControl),
  20. ADDCC(TPM2_CC_ClockSet),
  21. ADDCC(TPM2_CC_HierarchyChangeAuth),
  22. ADDCC(TPM2_CC_NV_DefineSpace),
  23. ADDCC(TPM2_CC_PCR_Allocate),
  24. ADDCC(TPM2_CC_PCR_SetAuthPolicy),
  25. ADDCC(TPM2_CC_PP_Commands),
  26. ADDCC(TPM2_CC_SetPrimaryPolicy),
  27. ADDCC(TPM2_CC_FieldUpgradeStart),
  28. ADDCC(TPM2_CC_ClockRateAdjust),
  29. ADDCC(TPM2_CC_CreatePrimary),
  30. ADDCC(TPM2_CC_NV_GlobalWriteLock),
  31. ADDCC(TPM2_CC_GetCommandAuditDigest),
  32. ADDCC(TPM2_CC_NV_Increment),
  33. ADDCC(TPM2_CC_NV_SetBits),
  34. ADDCC(TPM2_CC_NV_Extend),
  35. ADDCC(TPM2_CC_NV_Write),
  36. ADDCC(TPM2_CC_NV_WriteLock),
  37. ADDCC(TPM2_CC_DictionaryAttackLockReset),
  38. ADDCC(TPM2_CC_DictionaryAttackParameters),
  39. ADDCC(TPM2_CC_NV_ChangeAuth),
  40. ADDCC(TPM2_CC_PCR_Event),
  41. ADDCC(TPM2_CC_PCR_Reset),
  42. ADDCC(TPM2_CC_SequenceComplete),
  43. ADDCC(TPM2_CC_SetAlgorithmSet),
  44. ADDCC(TPM2_CC_SetCommandCodeAuditStatus),
  45. ADDCC(TPM2_CC_FieldUpgradeData),
  46. ADDCC(TPM2_CC_IncrementalSelfTest),
  47. ADDCC(TPM2_CC_SelfTest),
  48. ADDCC(TPM2_CC_Startup),
  49. ADDCC(TPM2_CC_Shutdown),
  50. ADDCC(TPM2_CC_StirRandom),
  51. ADDCC(TPM2_CC_ActivateCredential),
  52. ADDCC(TPM2_CC_Certify),
  53. ADDCC(TPM2_CC_PolicyNV),
  54. ADDCC(TPM2_CC_CertifyCreation),
  55. ADDCC(TPM2_CC_Duplicate),
  56. ADDCC(TPM2_CC_GetTime),
  57. ADDCC(TPM2_CC_GetSessionAuditDigest),
  58. ADDCC(TPM2_CC_NV_Read),
  59. ADDCC(TPM2_CC_NV_ReadLock),
  60. ADDCC(TPM2_CC_ObjectChangeAuth),
  61. ADDCC(TPM2_CC_PolicySecret),
  62. ADDCC(TPM2_CC_Rewrap),
  63. ADDCC(TPM2_CC_Create),
  64. ADDCC(TPM2_CC_ECDH_ZGen),
  65. ADDCC(TPM2_CC_HMAC),
  66. ADDCC(TPM2_CC_Import),
  67. ADDCC(TPM2_CC_Load),
  68. ADDCC(TPM2_CC_Quote),
  69. ADDCC(TPM2_CC_RSA_Decrypt),
  70. ADDCC(TPM2_CC_HMAC_Start),
  71. ADDCC(TPM2_CC_SequenceUpdate),
  72. ADDCC(TPM2_CC_Sign),
  73. ADDCC(TPM2_CC_Unseal),
  74. ADDCC(TPM2_CC_PolicySigned),
  75. ADDCC(TPM2_CC_ContextLoad),
  76. ADDCC(TPM2_CC_ContextSave),
  77. ADDCC(TPM2_CC_ECDH_KeyGen),
  78. ADDCC(TPM2_CC_EncryptDecrypt),
  79. ADDCC(TPM2_CC_FlushContext),
  80. ADDCC(TPM2_CC_LoadExternal),
  81. ADDCC(TPM2_CC_MakeCredential),
  82. ADDCC(TPM2_CC_NV_ReadPublic),
  83. ADDCC(TPM2_CC_PolicyAuthorize),
  84. ADDCC(TPM2_CC_PolicyAuthValue),
  85. ADDCC(TPM2_CC_PolicyCommandCode),
  86. ADDCC(TPM2_CC_PolicyCounterTimer),
  87. ADDCC(TPM2_CC_PolicyCpHash),
  88. ADDCC(TPM2_CC_PolicyLocality),
  89. ADDCC(TPM2_CC_PolicyNameHash),
  90. ADDCC(TPM2_CC_PolicyOR),
  91. ADDCC(TPM2_CC_PolicyTicket),
  92. ADDCC(TPM2_CC_ReadPublic),
  93. ADDCC(TPM2_CC_RSA_Encrypt),
  94. ADDCC(TPM2_CC_StartAuthSession),
  95. ADDCC(TPM2_CC_VerifySignature),
  96. ADDCC(TPM2_CC_ECC_Parameters),
  97. ADDCC(TPM2_CC_FirmwareRead),
  98. ADDCC(TPM2_CC_GetCapability),
  99. ADDCC(TPM2_CC_GetRandom),
  100. ADDCC(TPM2_CC_GetTestResult),
  101. ADDCC(TPM2_CC_Hash),
  102. ADDCC(TPM2_CC_PCR_Read),
  103. ADDCC(TPM2_CC_PolicyPCR),
  104. ADDCC(TPM2_CC_PolicyRestart),
  105. ADDCC(TPM2_CC_ReadClock),
  106. ADDCC(TPM2_CC_PCR_Extend),
  107. ADDCC(TPM2_CC_PCR_SetAuthValue),
  108. ADDCC(TPM2_CC_NV_Certify),
  109. ADDCC(TPM2_CC_EventSequenceComplete),
  110. ADDCC(TPM2_CC_HashSequenceStart),
  111. ADDCC(TPM2_CC_PolicyPhysicalPresence),
  112. ADDCC(TPM2_CC_PolicyDuplicationSelect),
  113. ADDCC(TPM2_CC_PolicyGetDigest),
  114. ADDCC(TPM2_CC_TestParms),
  115. ADDCC(TPM2_CC_Commit),
  116. ADDCC(TPM2_CC_PolicyPassword),
  117. ADDCC(TPM2_CC_ZGen_2Phase),
  118. ADDCC(TPM2_CC_EC_Ephemeral),
  119. ADDCC(TPM2_CC_PolicyNvWritten),
  120. ADDCC(TPM2_CC_PolicyTemplate),
  121. ADDCC(TPM2_CC_CreateLoaded),
  122. ADDCC(TPM2_CC_PolicyAuthorizeNV),
  123. ADDCC(TPM2_CC_EncryptDecrypt2),
  124. ADDCC(TPM2_CC_AC_GetCapability),
  125. ADDCC(TPM2_CC_AC_Send),
  126. ADDCC(TPM2_CC_Policy_AC_SendSelect),
  127. ADDCC(TPM2_CC_Vendor_TCG_Test),
  128. };
  129. bool tpm2_cc_util_from_str(const char *str, TPM2_CC *cc) {
  130. if (!str || !cc) {
  131. return false;
  132. }
  133. bool result = tpm2_util_string_to_uint32(str, cc);
  134. if (result) {
  135. return true;
  136. }
  137. size_t i;
  138. for (i = 0; i < ARRAY_LEN(_g_map); i++) {
  139. const cc_map *m = &_g_map[i];
  140. if (!strcmp(str, m->str)) {
  141. *cc = m->cc;
  142. return true;
  143. }
  144. }
  145. LOG_ERR("Could not convert command-code to number, got: \"%s\"", str);
  146. return false;
  147. }
  148. const char *tpm2_cc_util_to_str(TPM2_CC cc) {
  149. size_t i;
  150. for (i = 0; i < ARRAY_LEN(_g_map); i++) {
  151. const cc_map *m = &_g_map[i];
  152. if (m->cc == cc) {
  153. return m->str;
  154. }
  155. }
  156. /* we intentionally don't decode hex here so we don't have to keep
  157. * an internal buffer state that could be clobbered. Thus keeping it
  158. * reentrant and thread safe even though the tools never need thread
  159. * safety.
  160. *
  161. * DO NOT LOG ERROR as tpm2_getcap can have unknown commands and knows
  162. * how to deal with NULL returns.
  163. */
  164. return NULL;
  165. }