tss2-dlopen-mu.c 9.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299
  1. /* SPDX-License-Identifier: BSD-2-Clause */
  2. /*******************************************************************************
  3. * Copyright 2021, Fraunhofer SIT
  4. * All rights reserved.
  5. *******************************************************************************/
  6. /**
  7. * The purpose of this file is to copy it into your project and
  8. * include it during compilation if you don't want to link against
  9. * libtss2-mu at compile time.
  10. * It will attempt to load libtss2-mu.so during runtime.
  11. * It will either work similarly to directly linking to libtss2-mu.so
  12. * at compile-time or return a NOT_IMPLEMENTED error.
  13. *
  14. * For new versions of this file, please check:
  15. * http://github.com/tpm2-software/tpm2-tss/tss2-dlopen
  16. */
  17. #include <dlfcn.h>
  18. #include <stdio.h>
  19. #include <tss2/tss2_mu.h>
  20. #define str(s) xstr(s)
  21. #define xstr(s) #s
  22. #ifdef ENABLE_WARN
  23. #define WARN(str, ...) do { fprintf(stderr, "WARNING: " str "\n", ## __VA_ARGS__); } while (0)
  24. #else /* ENABLE_WARN */
  25. #define WARN(...) do { } while (0)
  26. #endif /* ENABLE_WARN */
  27. #define LIB "libtss2-mu.so.0"
  28. static void *dlhandle = NULL;
  29. static TSS2_RC
  30. init_dlhandle(void)
  31. {
  32. if (dlhandle)
  33. return TSS2_RC_SUCCESS;
  34. dlhandle = dlopen(LIB, RTLD_NOW | RTLD_LOCAL);
  35. if (!dlhandle) {
  36. WARN("Library " LIB " not found: %s.", dlerror());
  37. return TSS2_BASE_RC_NOT_IMPLEMENTED;
  38. }
  39. return TSS2_RC_SUCCESS;
  40. }
  41. #define MAKE_MU_BASE(typ) \
  42. TSS2_RC Tss2_MU_ ## typ ## _Marshal ( \
  43. typ src, \
  44. uint8_t buffer[], \
  45. size_t buffer_size, \
  46. size_t *offset) \
  47. { \
  48. if (init_dlhandle() != TSS2_RC_SUCCESS) \
  49. return TSS2_BASE_RC_NOT_IMPLEMENTED; \
  50. static TSS2_RC (*sym) (typ, uint8_t [], size_t, size_t *) = NULL; \
  51. if (!sym) \
  52. sym = dlsym(dlhandle, str(Tss2_MU_ ## typ ## _Marshal)); \
  53. if (!sym) { \
  54. WARN("Function " str(Tss2_MU_ ## typ ## _Marshal) " not found."); \
  55. return TSS2_BASE_RC_NOT_IMPLEMENTED; \
  56. } \
  57. return sym(src, buffer, buffer_size, offset); \
  58. } \
  59. TSS2_RC Tss2_MU_ ## typ ## _Unmarshal ( \
  60. uint8_t const buffer[], \
  61. size_t buffer_size, \
  62. size_t *offset, \
  63. typ *dest) \
  64. { \
  65. if (init_dlhandle() != TSS2_RC_SUCCESS) \
  66. return TSS2_BASE_RC_NOT_IMPLEMENTED; \
  67. static TSS2_RC (*sym) (const uint8_t [], size_t, size_t *, typ *) = NULL; \
  68. if (!sym) \
  69. sym = dlsym(dlhandle, str(Tss2_MU_ ## typ ## _Unmarshal)); \
  70. if (!sym) { \
  71. WARN("Function " str(Tss2_MU_ ## typ ## _Unmarshal) " not found."); \
  72. return TSS2_BASE_RC_NOT_IMPLEMENTED; \
  73. } \
  74. return sym(buffer, buffer_size, offset, dest); \
  75. }
  76. #define MAKE_MU_STRUCT(typ) \
  77. TSS2_RC Tss2_MU_ ## typ ## _Marshal ( \
  78. typ const *src, \
  79. uint8_t buffer[], \
  80. size_t buffer_size, \
  81. size_t *offset) \
  82. { \
  83. if (init_dlhandle() != TSS2_RC_SUCCESS) \
  84. return TSS2_BASE_RC_NOT_IMPLEMENTED; \
  85. static TSS2_RC (*sym) (const typ *, uint8_t [], size_t, size_t *) = NULL; \
  86. if (!sym) \
  87. sym = dlsym(dlhandle, str(Tss2_MU_ ## typ ## _Marshal)); \
  88. if (!sym) { \
  89. WARN("Function " str(Tss2_MU_ ## typ ## _Marshal) " not found."); \
  90. return TSS2_BASE_RC_NOT_IMPLEMENTED; \
  91. } \
  92. return sym(src, buffer, buffer_size, offset); \
  93. } \
  94. TSS2_RC Tss2_MU_ ## typ ## _Unmarshal ( \
  95. uint8_t const buffer[], \
  96. size_t buffer_size, \
  97. size_t *offset, \
  98. typ *dest) \
  99. { \
  100. if (init_dlhandle() != TSS2_RC_SUCCESS) \
  101. return TSS2_BASE_RC_NOT_IMPLEMENTED; \
  102. static TSS2_RC (*sym) (const uint8_t [], size_t, size_t *, typ *) = NULL; \
  103. if (!sym) \
  104. sym = dlsym(dlhandle, str(Tss2_MU_ ## typ ## _Unmarshal)); \
  105. if (!sym) { \
  106. WARN("Function " str(Tss2_MU_ ## typ ## _Unmarshal) " not found."); \
  107. return TSS2_BASE_RC_NOT_IMPLEMENTED; \
  108. } \
  109. return sym(buffer, buffer_size, offset, dest); \
  110. }
  111. #define MAKE_MU_UNION(typ) \
  112. TSS2_RC Tss2_MU_ ## typ ## _Marshal ( \
  113. typ const *src, \
  114. uint32_t selector_value, \
  115. uint8_t buffer[], \
  116. size_t buffer_size, \
  117. size_t *offset) \
  118. { \
  119. if (init_dlhandle() != TSS2_RC_SUCCESS) \
  120. return TSS2_BASE_RC_NOT_IMPLEMENTED; \
  121. static TSS2_RC (*sym) (const typ *, uint32_t, uint8_t [], size_t, size_t *) = NULL; \
  122. if (!sym) \
  123. sym = dlsym(dlhandle, str(Tss2_MU_ ## typ ## _Marshal)); \
  124. if (!sym) { \
  125. WARN("Function " str(Tss2_MU_ ## typ ## _Marshal) " not found."); \
  126. return TSS2_BASE_RC_NOT_IMPLEMENTED; \
  127. } \
  128. return sym(src, selector_value, buffer, buffer_size, offset); \
  129. } \
  130. TSS2_RC Tss2_MU_ ## typ ## _Unmarshal ( \
  131. uint8_t const buffer[], \
  132. size_t buffer_size, \
  133. size_t *offset, \
  134. uint32_t selector_value, \
  135. typ *dest) \
  136. { \
  137. if (init_dlhandle() != TSS2_RC_SUCCESS) \
  138. return TSS2_BASE_RC_NOT_IMPLEMENTED; \
  139. static TSS2_RC (*sym) (const uint8_t [], size_t, size_t *, uint32_t, typ *) = NULL; \
  140. if (!sym) \
  141. sym = dlsym(dlhandle, str(Tss2_MU_ ## typ ## _Unmarshal)); \
  142. if (!sym) { \
  143. WARN("Function " str(Tss2_MU_ ## typ ## _Unmarshal) " not found."); \
  144. return TSS2_BASE_RC_NOT_IMPLEMENTED; \
  145. } \
  146. return sym(buffer, buffer_size, offset, selector_value, dest); \
  147. }
  148. MAKE_MU_BASE(INT8);
  149. MAKE_MU_BASE(INT16);
  150. MAKE_MU_BASE(INT32);
  151. MAKE_MU_BASE(INT64);
  152. MAKE_MU_BASE(UINT8);
  153. MAKE_MU_BASE(UINT16);
  154. MAKE_MU_BASE(UINT32);
  155. MAKE_MU_BASE(UINT64);
  156. MAKE_MU_BASE(TPM2_CC);
  157. MAKE_MU_BASE(TPM2_ST);
  158. MAKE_MU_BASE(TPMA_ALGORITHM);
  159. MAKE_MU_BASE(TPMA_CC);
  160. MAKE_MU_BASE(TPMA_LOCALITY);
  161. MAKE_MU_BASE(TPMA_NV);
  162. MAKE_MU_BASE(TPMA_OBJECT);
  163. MAKE_MU_BASE(TPMA_PERMANENT);
  164. MAKE_MU_BASE(TPMA_SESSION);
  165. MAKE_MU_BASE(TPMA_STARTUP_CLEAR);
  166. MAKE_MU_STRUCT(TPM2B_DIGEST);
  167. MAKE_MU_STRUCT(TPM2B_ATTEST);
  168. MAKE_MU_STRUCT(TPM2B_NAME);
  169. MAKE_MU_STRUCT(TPM2B_MAX_NV_BUFFER);
  170. MAKE_MU_STRUCT(TPM2B_SENSITIVE_DATA);
  171. MAKE_MU_STRUCT(TPM2B_ECC_PARAMETER);
  172. MAKE_MU_STRUCT(TPM2B_PUBLIC_KEY_RSA);
  173. MAKE_MU_STRUCT(TPM2B_PRIVATE_KEY_RSA);
  174. MAKE_MU_STRUCT(TPM2B_PRIVATE);
  175. MAKE_MU_STRUCT(TPM2B_CONTEXT_SENSITIVE);
  176. MAKE_MU_STRUCT(TPM2B_CONTEXT_DATA);
  177. MAKE_MU_STRUCT(TPM2B_DATA);
  178. MAKE_MU_STRUCT(TPM2B_SYM_KEY);
  179. MAKE_MU_STRUCT(TPM2B_ECC_POINT);
  180. MAKE_MU_STRUCT(TPM2B_NV_PUBLIC);
  181. MAKE_MU_STRUCT(TPM2B_SENSITIVE);
  182. MAKE_MU_STRUCT(TPM2B_SENSITIVE_CREATE);
  183. MAKE_MU_STRUCT(TPM2B_CREATION_DATA);
  184. MAKE_MU_STRUCT(TPM2B_PUBLIC);
  185. MAKE_MU_STRUCT(TPM2B_ENCRYPTED_SECRET);
  186. MAKE_MU_STRUCT(TPM2B_ID_OBJECT);
  187. MAKE_MU_STRUCT(TPM2B_IV);
  188. MAKE_MU_STRUCT(TPM2B_AUTH);
  189. MAKE_MU_STRUCT(TPM2B_EVENT);
  190. MAKE_MU_STRUCT(TPM2B_MAX_BUFFER);
  191. MAKE_MU_STRUCT(TPM2B_NONCE);
  192. MAKE_MU_STRUCT(TPM2B_OPERAND);
  193. MAKE_MU_STRUCT(TPM2B_TIMEOUT);
  194. MAKE_MU_STRUCT(TPM2B_TEMPLATE);
  195. MAKE_MU_STRUCT(TPMS_CONTEXT);
  196. MAKE_MU_STRUCT(TPMS_TIME_INFO);
  197. MAKE_MU_STRUCT(TPMS_ECC_POINT);
  198. MAKE_MU_STRUCT(TPMS_NV_PUBLIC);
  199. MAKE_MU_STRUCT(TPMS_ALG_PROPERTY);
  200. MAKE_MU_STRUCT(TPMS_ALGORITHM_DESCRIPTION);
  201. MAKE_MU_STRUCT(TPMS_TAGGED_PROPERTY);
  202. MAKE_MU_STRUCT(TPMS_TAGGED_POLICY);
  203. MAKE_MU_STRUCT(TPMS_CLOCK_INFO);
  204. MAKE_MU_STRUCT(TPMS_TIME_ATTEST_INFO);
  205. MAKE_MU_STRUCT(TPMS_CERTIFY_INFO);
  206. MAKE_MU_STRUCT(TPMS_COMMAND_AUDIT_INFO);
  207. MAKE_MU_STRUCT(TPMS_SESSION_AUDIT_INFO);
  208. MAKE_MU_STRUCT(TPMS_CREATION_INFO);
  209. MAKE_MU_STRUCT(TPMS_NV_CERTIFY_INFO);
  210. MAKE_MU_STRUCT(TPMS_AUTH_COMMAND);
  211. MAKE_MU_STRUCT(TPMS_AUTH_RESPONSE);
  212. MAKE_MU_STRUCT(TPMS_SENSITIVE_CREATE);
  213. MAKE_MU_STRUCT(TPMS_SCHEME_HASH);
  214. MAKE_MU_STRUCT(TPMS_SCHEME_ECDAA);
  215. MAKE_MU_STRUCT(TPMS_SCHEME_XOR);
  216. MAKE_MU_STRUCT(TPMS_SIGNATURE_RSA);
  217. MAKE_MU_STRUCT(TPMS_SIGNATURE_ECC);
  218. MAKE_MU_STRUCT(TPMS_NV_PIN_COUNTER_PARAMETERS);
  219. MAKE_MU_STRUCT(TPMS_CONTEXT_DATA);
  220. MAKE_MU_STRUCT(TPMS_PCR_SELECT);
  221. MAKE_MU_STRUCT(TPMS_PCR_SELECTION);
  222. MAKE_MU_STRUCT(TPMS_TAGGED_PCR_SELECT);
  223. MAKE_MU_STRUCT(TPMS_QUOTE_INFO);
  224. MAKE_MU_STRUCT(TPMS_CREATION_DATA);
  225. MAKE_MU_STRUCT(TPMS_ECC_PARMS);
  226. MAKE_MU_STRUCT(TPMS_ATTEST);
  227. MAKE_MU_STRUCT(TPMS_ALGORITHM_DETAIL_ECC);
  228. MAKE_MU_STRUCT(TPMS_CAPABILITY_DATA);
  229. MAKE_MU_STRUCT(TPMS_KEYEDHASH_PARMS);
  230. MAKE_MU_STRUCT(TPMS_RSA_PARMS);
  231. MAKE_MU_STRUCT(TPMS_SYMCIPHER_PARMS);
  232. MAKE_MU_STRUCT(TPMS_AC_OUTPUT);
  233. MAKE_MU_STRUCT(TPMS_ID_OBJECT);
  234. MAKE_MU_STRUCT(TPMS_ACT_DATA);
  235. MAKE_MU_STRUCT(TPMS_NV_DIGEST_CERTIFY_INFO);
  236. MAKE_MU_STRUCT(TPML_CC);
  237. MAKE_MU_STRUCT(TPML_CCA);
  238. MAKE_MU_STRUCT(TPML_ALG);
  239. MAKE_MU_STRUCT(TPML_HANDLE);
  240. MAKE_MU_STRUCT(TPML_DIGEST);
  241. MAKE_MU_STRUCT(TPML_DIGEST_VALUES);
  242. MAKE_MU_STRUCT(TPML_PCR_SELECTION);
  243. MAKE_MU_STRUCT(TPML_ALG_PROPERTY);
  244. MAKE_MU_STRUCT(TPML_ECC_CURVE);
  245. MAKE_MU_STRUCT(TPML_TAGGED_PCR_PROPERTY);
  246. MAKE_MU_STRUCT(TPML_TAGGED_TPM_PROPERTY);
  247. MAKE_MU_STRUCT(TPML_INTEL_PTT_PROPERTY);
  248. MAKE_MU_STRUCT(TPML_AC_CAPABILITIES);
  249. MAKE_MU_STRUCT(TPML_TAGGED_POLICY);
  250. MAKE_MU_STRUCT(TPML_ACT_DATA);
  251. MAKE_MU_UNION(TPMU_HA);
  252. MAKE_MU_UNION(TPMU_CAPABILITIES);
  253. MAKE_MU_UNION(TPMU_ATTEST);
  254. MAKE_MU_UNION(TPMU_SYM_KEY_BITS);
  255. MAKE_MU_UNION(TPMU_SYM_MODE);
  256. MAKE_MU_UNION(TPMU_SIG_SCHEME);
  257. MAKE_MU_UNION(TPMU_KDF_SCHEME);
  258. MAKE_MU_UNION(TPMU_ASYM_SCHEME);
  259. MAKE_MU_UNION(TPMU_SCHEME_KEYEDHASH);
  260. MAKE_MU_UNION(TPMU_SIGNATURE);
  261. MAKE_MU_UNION(TPMU_SENSITIVE_COMPOSITE);
  262. MAKE_MU_UNION(TPMU_ENCRYPTED_SECRET);
  263. MAKE_MU_UNION(TPMU_PUBLIC_PARMS);
  264. MAKE_MU_UNION(TPMU_PUBLIC_ID);
  265. MAKE_MU_UNION(TPMU_NAME);
  266. MAKE_MU_STRUCT(TPMT_HA);
  267. MAKE_MU_STRUCT(TPMT_SYM_DEF);
  268. MAKE_MU_STRUCT(TPMT_SYM_DEF_OBJECT);
  269. MAKE_MU_STRUCT(TPMT_KEYEDHASH_SCHEME);
  270. MAKE_MU_STRUCT(TPMT_SIG_SCHEME);
  271. MAKE_MU_STRUCT(TPMT_KDF_SCHEME);
  272. MAKE_MU_STRUCT(TPMT_ASYM_SCHEME);
  273. MAKE_MU_STRUCT(TPMT_RSA_SCHEME);
  274. MAKE_MU_STRUCT(TPMT_RSA_DECRYPT);
  275. MAKE_MU_STRUCT(TPMT_ECC_SCHEME);
  276. MAKE_MU_STRUCT(TPMT_SIGNATURE);
  277. MAKE_MU_STRUCT(TPMT_SENSITIVE);
  278. MAKE_MU_STRUCT(TPMT_PUBLIC);
  279. MAKE_MU_STRUCT(TPMT_PUBLIC_PARMS);
  280. MAKE_MU_STRUCT(TPMT_TK_CREATION);
  281. MAKE_MU_STRUCT(TPMT_TK_VERIFIED);
  282. MAKE_MU_STRUCT(TPMT_TK_AUTH);
  283. MAKE_MU_STRUCT(TPMT_TK_HASHCHECK);
  284. MAKE_MU_BASE(TPM2_HANDLE);
  285. MAKE_MU_BASE(TPMI_ALG_HASH);
  286. MAKE_MU_BASE(BYTE);
  287. MAKE_MU_BASE(TPM2_SE);
  288. MAKE_MU_BASE(TPM2_NT);
  289. MAKE_MU_STRUCT(TPMS_EMPTY);