esys-nv-ram-ordinary-index.int.c 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375
  1. /* SPDX-License-Identifier: BSD-2-Clause */
  2. /*******************************************************************************
  3. * Copyright 2017-2018, Fraunhofer SIT sponsored by Infineon Technologies AG
  4. * All rights reserved.
  5. *******************************************************************************/
  6. #ifdef HAVE_CONFIG_H
  7. #include <config.h>
  8. #endif
  9. #include <stdlib.h>
  10. #include "tss2_esys.h"
  11. #include "esys_iutil.h"
  12. #include "test-esys.h"
  13. #define LOGMODULE test
  14. #include "util/log.h"
  15. #include "util/aux_util.h"
  16. /** This test is intended to test the ESYS commands nv define space, nv write,
  17. * nv read command, nv lock write and nv lock read, and nv undefine.
  18. *
  19. * The names stored in the ESYS resource are compared
  20. * with the names delivered from the TPM by the command ReadPublic.
  21. * only one of the tests NV_ReadLock and NV_WriteLock can be activated
  22. * by the defines TEST_READ_LOCK and TEST_WRITE_LOCK (-D option)
  23. *
  24. * Tested ESYS commands:
  25. * - Esys_FlushContext() (M)
  26. * - Esys_NV_DefineSpace() (M)
  27. * - Esys_NV_Read() (M)
  28. * - Esys_NV_ReadLock() (M)
  29. * - Esys_NV_ReadPublic() (M)
  30. * - Esys_NV_UndefineSpace() (M)
  31. * - Esys_NV_Write() (M)
  32. * - Esys_NV_WriteLock() (M)
  33. * - Esys_StartAuthSession() (M)
  34. *
  35. * Used compiler defines: TEST_READ_LOCK TEST_SESSION TEST_WRITE_LOCK
  36. *
  37. * @param[in,out] esys_context The ESYS_CONTEXT.
  38. * @retval EXIT_FAILURE
  39. * @retval EXIT_SUCCESS
  40. */
  41. int
  42. test_esys_nv_ram_ordinary_index(ESYS_CONTEXT * esys_context)
  43. {
  44. TSS2_RC r;
  45. ESYS_TR nvHandle = ESYS_TR_NONE;
  46. TPM2B_NV_PUBLIC *nvPublic = NULL;
  47. TPM2B_NAME *nvName = NULL;
  48. TPM2B_MAX_NV_BUFFER *nv_test_data2 = NULL;
  49. #ifdef TEST_SESSION
  50. ESYS_TR session = ESYS_TR_NONE;
  51. TPMT_SYM_DEF symmetric = {.algorithm = TPM2_ALG_AES,
  52. .keyBits = {.aes = 128},
  53. .mode = {.aes = TPM2_ALG_CFB}
  54. };
  55. TPMA_SESSION sessionAttributes;
  56. TPM2B_NONCE nonceCaller = {
  57. .size = 20,
  58. .buffer = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10,
  59. 11, 12, 13, 14, 15, 16, 17, 18, 19, 20}
  60. };
  61. memset(&sessionAttributes, 0, sizeof sessionAttributes);
  62. r = Esys_StartAuthSession(esys_context, ESYS_TR_NONE, ESYS_TR_NONE,
  63. ESYS_TR_NONE, ESYS_TR_NONE, ESYS_TR_NONE,
  64. &nonceCaller,
  65. TPM2_SE_HMAC, &symmetric, TPM2_ALG_SHA256,
  66. &session);
  67. goto_if_error(r, "Error: During initialization of session", error);
  68. #endif /* TEST_SESSION */
  69. TPM2B_AUTH auth = {.size = 20,
  70. .buffer={10, 11, 12, 13, 14, 15, 16, 17, 18, 19,
  71. 20, 21, 22, 23, 24, 25, 26, 27, 28, 29}};
  72. TPM2B_NV_PUBLIC publicInfo = {
  73. .size = 0,
  74. .nvPublic = {
  75. .nvIndex =TPM2_NV_INDEX_FIRST,
  76. .nameAlg = TPM2_ALG_SHA256,
  77. .attributes = (
  78. TPMA_NV_OWNERWRITE |
  79. TPMA_NV_AUTHWRITE |
  80. TPMA_NV_WRITE_STCLEAR |
  81. TPMA_NV_READ_STCLEAR |
  82. TPMA_NV_AUTHREAD |
  83. TPMA_NV_OWNERREAD
  84. ),
  85. .authPolicy = {
  86. .size = 0,
  87. .buffer = {},
  88. },
  89. .dataSize = 32,
  90. }
  91. };
  92. r = Esys_NV_DefineSpace(esys_context,
  93. ESYS_TR_RH_OWNER,
  94. #ifdef TEST_SESSION
  95. session,
  96. #else
  97. ESYS_TR_PASSWORD,
  98. #endif
  99. ESYS_TR_NONE,
  100. ESYS_TR_NONE,
  101. &auth,
  102. &publicInfo,
  103. &nvHandle);
  104. goto_if_error(r, "Error esys define nv space", error);
  105. UINT16 offset = 0;
  106. TPM2B_MAX_NV_BUFFER nv_test_data = { .size = 20,
  107. .buffer={0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0,
  108. 1, 2, 3, 4, 5, 6, 7, 8, 9}};
  109. r = Esys_NV_ReadPublic(esys_context,
  110. nvHandle,
  111. ESYS_TR_NONE,
  112. ESYS_TR_NONE,
  113. ESYS_TR_NONE,
  114. &nvPublic,
  115. &nvName);
  116. goto_if_error(r, "Error: nv read public", error);
  117. RSRC_NODE_T *nvHandleNode;
  118. r = esys_GetResourceObject(esys_context, nvHandle, &nvHandleNode);
  119. goto_if_error(r, "Error: nv get resource object", error);
  120. if (nvName->size != nvHandleNode->rsrc.name.size ||
  121. memcmp(&nvName->name, &nvHandleNode->rsrc.name.name, nvName->size) != 0) {
  122. LOG_ERROR("Error: define space name not equal");
  123. goto error;
  124. }
  125. r = Esys_NV_Write(esys_context,
  126. nvHandle,
  127. nvHandle,
  128. #ifdef TEST_SESSION
  129. session,
  130. #else
  131. ESYS_TR_PASSWORD,
  132. #endif
  133. ESYS_TR_NONE,
  134. ESYS_TR_NONE,
  135. &nv_test_data,
  136. offset);
  137. goto_if_error(r, "Error esys nv write", error);
  138. Esys_Free(nvPublic);
  139. Esys_Free(nvName);
  140. r = Esys_NV_ReadPublic(esys_context,
  141. nvHandle,
  142. ESYS_TR_NONE,
  143. ESYS_TR_NONE,
  144. ESYS_TR_NONE,
  145. &nvPublic,
  146. &nvName);
  147. goto_if_error(r, "Error: nv read public", error);
  148. r = esys_GetResourceObject(esys_context, nvHandle, &nvHandleNode);
  149. goto_if_error(r, "Error: nv get resource object", error);
  150. if (nvName->size != nvHandleNode->rsrc.name.size ||
  151. memcmp(&nvName->name, &nvHandleNode->rsrc.name.name, nvName->size) != 0) {
  152. LOG_ERROR("Error: nv write name not equal");
  153. goto error;
  154. }
  155. r = Esys_NV_Read(esys_context,
  156. nvHandle,
  157. nvHandle,
  158. #ifdef TEST_SESSION
  159. session,
  160. #else
  161. ESYS_TR_PASSWORD,
  162. #endif
  163. ESYS_TR_NONE,
  164. ESYS_TR_NONE,
  165. 20,
  166. 0,
  167. &nv_test_data2);
  168. goto_if_error(r, "Error esys nv read", error);
  169. Esys_Free(nvPublic);
  170. Esys_Free(nvName);
  171. Esys_Free(nv_test_data2);
  172. r = Esys_NV_ReadPublic(esys_context,
  173. nvHandle,
  174. ESYS_TR_NONE,
  175. ESYS_TR_NONE,
  176. ESYS_TR_NONE,
  177. &nvPublic,
  178. &nvName);
  179. goto_if_error(r, "Error: nv read public", error);
  180. r = esys_GetResourceObject(esys_context, nvHandle, &nvHandleNode);
  181. goto_if_error(r, "Error: nv get resource object", error);
  182. if (nvName->size != nvHandleNode->rsrc.name.size ||
  183. memcmp(&nvName->name, &nvHandleNode->rsrc.name.name, nvName->size) != 0) {
  184. LOG_ERROR("Error: nv read name not equal");
  185. goto error;
  186. }
  187. #ifdef TEST_READ_LOCK
  188. r = Esys_NV_ReadLock(esys_context,
  189. nvHandle,
  190. nvHandle,
  191. #ifdef TEST_SESSION
  192. session,
  193. #else
  194. ESYS_TR_PASSWORD,
  195. #endif
  196. ESYS_TR_NONE,
  197. ESYS_TR_NONE
  198. );
  199. goto_if_error(r, "Error: NV_ReadLock", error);
  200. Esys_Free(nvPublic);
  201. Esys_Free(nvName);
  202. r = Esys_NV_ReadPublic(esys_context,
  203. nvHandle,
  204. ESYS_TR_NONE,
  205. ESYS_TR_NONE,
  206. ESYS_TR_NONE,
  207. &nvPublic,
  208. &nvName);
  209. goto_if_error(r, "Error: nv read public", error);
  210. r = esys_GetResourceObject(esys_context, nvHandle, &nvHandleNode);
  211. goto_if_error(r, "Error: nv get resource object", error);
  212. if (nvName->size != nvHandleNode->rsrc.name.size ||
  213. memcmp(&nvName->name, &nvHandleNode->rsrc.name.name, nvName->size) != 0) {
  214. LOG_ERROR("Error: nv read name not equal");
  215. goto error;
  216. }
  217. r = Esys_NV_Read(esys_context,
  218. nvHandle,
  219. nvHandle,
  220. #ifdef TEST_SESSION
  221. session,
  222. #else
  223. ESYS_TR_PASSWORD,
  224. #endif
  225. ESYS_TR_NONE,
  226. ESYS_TR_NONE,
  227. 20,
  228. 0,
  229. &nv_test_data2);
  230. goto_error_if_not_failed(r, "Error esys nv write successful in write lock state", error);
  231. #else /* TEST_READ_LOCK */
  232. #ifdef TEST_WRITE_LOCK
  233. r = Esys_NV_WriteLock(esys_context,
  234. nvHandle,
  235. nvHandle,
  236. #ifdef TEST_SESSION
  237. session,
  238. #else
  239. ESYS_TR_PASSWORD,
  240. #endif
  241. ESYS_TR_NONE,
  242. ESYS_TR_NONE
  243. );
  244. goto_if_error(r, "Error: NV_WriteLock", error);
  245. Esys_Free(nvPublic);
  246. Esys_Free(nvName);
  247. r = Esys_NV_ReadPublic(esys_context,
  248. nvHandle,
  249. ESYS_TR_NONE,
  250. ESYS_TR_NONE,
  251. ESYS_TR_NONE,
  252. &nvPublic,
  253. &nvName);
  254. goto_if_error(r, "Error: NV_ReadPublic", error);
  255. r = esys_GetResourceObject(esys_context, nvHandle, &nvHandleNode);
  256. goto_if_error(r, "Error: nv get resource object", error);
  257. if (nvName->size != nvHandleNode->rsrc.name.size ||
  258. memcmp(&nvName->name, &nvHandleNode->rsrc.name.name, nvName->size) != 0) {
  259. LOG_ERROR("Error: nv read name not equal");
  260. goto error;
  261. }
  262. r = Esys_NV_Write(esys_context,
  263. nvHandle,
  264. nvHandle,
  265. #ifdef TEST_SESSION
  266. session,
  267. #else
  268. ESYS_TR_PASSWORD,
  269. #endif
  270. ESYS_TR_NONE,
  271. ESYS_TR_NONE,
  272. &nv_test_data,
  273. offset);
  274. goto_error_if_not_failed(r, "Error esys nv write successful in write lock state", error);
  275. #endif /* TEST_WRITE_LOCK */
  276. #endif /* TEST_READ_LOCK */
  277. r = Esys_NV_UndefineSpace(esys_context,
  278. ESYS_TR_RH_OWNER,
  279. nvHandle,
  280. #ifdef TEST_SESSION
  281. session,
  282. #else
  283. ESYS_TR_PASSWORD,
  284. #endif
  285. ESYS_TR_NONE,
  286. ESYS_TR_NONE
  287. );
  288. goto_if_error(r, "Error: NV_UndefineSpace", error);
  289. #ifdef TEST_SESSION
  290. r = Esys_FlushContext(esys_context, session);
  291. goto_if_error(r, "Error: FlushContext", error);
  292. #endif
  293. Esys_Free(nvPublic);
  294. Esys_Free(nvName);
  295. return EXIT_SUCCESS;
  296. error:
  297. if (nvHandle != ESYS_TR_NONE) {
  298. if (Esys_NV_UndefineSpace(esys_context,
  299. ESYS_TR_RH_OWNER,
  300. nvHandle,
  301. #ifdef TEST_SESSION
  302. session,
  303. #else
  304. ESYS_TR_PASSWORD,
  305. #endif
  306. ESYS_TR_NONE,
  307. ESYS_TR_NONE) != TSS2_RC_SUCCESS) {
  308. LOG_ERROR("Cleanup nvHandle failed.");
  309. }
  310. }
  311. #ifdef TEST_SESSION
  312. if (session != ESYS_TR_NONE) {
  313. if (Esys_FlushContext(esys_context, session) != TSS2_RC_SUCCESS) {
  314. LOG_ERROR("Cleanup session failed.");
  315. }
  316. }
  317. #endif
  318. Esys_Free(nvPublic);
  319. Esys_Free(nvName);
  320. Esys_Free(nv_test_data2);
  321. return EXIT_FAILURE;
  322. }
  323. int
  324. test_invoke_esys(ESYS_CONTEXT * esys_context) {
  325. return test_esys_nv_ram_ordinary_index(esys_context);
  326. }