esys-policy-nv-changeauth.int.c 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293
  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. #define LOGMODULE test
  13. #include "util/log.h"
  14. #include "util/aux_util.h"
  15. /** This test is intended to test the ESYS commands PolicyAuthValue,
  16. * PolicyCommandCode, Esys_PolicyGetDigest, and NV_ChangeAuth.
  17. *
  18. * First in a trial session the policy value to ensure that the auth value
  19. * is included in the policy session used for NV_ChangeAuth is
  20. * computed.
  21. * A NV ram space with this policy is defined afterwards.
  22. * With a real policy session the auth value of this NV ram space
  23. * will be changed.
  24. *
  25. * Tested ESYS commands:
  26. * - Esys_FlushContext() (M)
  27. * - Esys_NV_ChangeAuth() (M)
  28. * - Esys_NV_DefineSpace() (M)
  29. * - Esys_NV_UndefineSpace() (M)
  30. * - Esys_PolicyAuthValue() (M)
  31. * - Esys_PolicyCommandCode() (M)
  32. * - Esys_PolicyGetDigest() (M)
  33. * - Esys_StartAuthSession() (M)
  34. *
  35. * @param[in,out] esys_context The ESYS_CONTEXT.
  36. * @retval EXIT_FAILURE
  37. * @retval EXIT_SUCCESS
  38. */
  39. int
  40. test_esys_policy_nv_changeauth(ESYS_CONTEXT * esys_context)
  41. {
  42. TSS2_RC r;
  43. ESYS_TR nvHandle = ESYS_TR_NONE;
  44. ESYS_TR policySession = ESYS_TR_NONE;
  45. TPM2B_DIGEST *policyDigestTrial = NULL;
  46. /*
  47. * Firth the policy value for changing the auth value of an NV index has to be
  48. * determined with a policy trial session.
  49. */
  50. ESYS_TR sessionTrial = ESYS_TR_NONE;
  51. TPMT_SYM_DEF symmetricTrial = {.algorithm = TPM2_ALG_AES,
  52. .keyBits = {.aes = 128},
  53. .mode = {.aes = TPM2_ALG_CFB}
  54. };
  55. TPM2B_NONCE nonceCallerTrial = {
  56. .size = 20,
  57. .buffer = {11, 12, 13, 14, 15, 16, 17, 18, 19, 11,
  58. 21, 22, 23, 24, 25, 26, 27, 28, 29, 30}
  59. };
  60. r = Esys_StartAuthSession(esys_context, ESYS_TR_NONE, ESYS_TR_NONE,
  61. ESYS_TR_NONE, ESYS_TR_NONE, ESYS_TR_NONE,
  62. &nonceCallerTrial,
  63. TPM2_SE_TRIAL, &symmetricTrial, TPM2_ALG_SHA256,
  64. &sessionTrial);
  65. goto_if_error(r, "Error: During initialization of policy trial session", error);
  66. r = Esys_PolicyAuthValue(esys_context,
  67. sessionTrial,
  68. ESYS_TR_NONE,
  69. ESYS_TR_NONE,
  70. ESYS_TR_NONE
  71. );
  72. goto_if_error(r, "Error: PolicyAuthValue", error);
  73. r = Esys_PolicyCommandCode(esys_context,
  74. sessionTrial,
  75. ESYS_TR_NONE,
  76. ESYS_TR_NONE,
  77. ESYS_TR_NONE,
  78. TPM2_CC_NV_ChangeAuth
  79. );
  80. goto_if_error(r, "Error: PolicyCommandCode", error);
  81. r = Esys_PolicyGetDigest(esys_context,
  82. sessionTrial,
  83. ESYS_TR_NONE,
  84. ESYS_TR_NONE,
  85. ESYS_TR_NONE,
  86. &policyDigestTrial
  87. );
  88. goto_if_error(r, "Error: PolicyGetDigest", error);
  89. r = Esys_FlushContext(esys_context, sessionTrial);
  90. goto_if_error(r, "Flushing context", error);
  91. TPM2B_AUTH auth = {.size = 20,
  92. .buffer={10, 11, 12, 13, 14, 15, 16, 17, 18, 19,
  93. 20, 21, 22, 23, 24, 25, 26, 27, 28, 29}};
  94. TPM2B_NV_PUBLIC publicInfo = {
  95. .size = 0,
  96. .nvPublic = {
  97. .nvIndex =TPM2_NV_INDEX_FIRST,
  98. .nameAlg = TPM2_ALG_SHA256,
  99. .attributes = (
  100. TPMA_NV_OWNERWRITE |
  101. TPMA_NV_AUTHWRITE |
  102. TPMA_NV_WRITE_STCLEAR |
  103. TPMA_NV_READ_STCLEAR |
  104. TPMA_NV_AUTHREAD |
  105. TPMA_NV_OWNERREAD
  106. ),
  107. .authPolicy = *policyDigestTrial,
  108. .dataSize = 32,
  109. }
  110. };
  111. r = Esys_NV_DefineSpace(esys_context,
  112. ESYS_TR_RH_OWNER,
  113. ESYS_TR_PASSWORD,
  114. ESYS_TR_NONE,
  115. ESYS_TR_NONE,
  116. &auth,
  117. &publicInfo,
  118. &nvHandle);
  119. goto_if_error(r, "Error esys define nv space", error);
  120. TPM2B_AUTH newAuth = {.size = 20,
  121. .buffer={30, 31, 32, 33, 34, 35, 36, 37, 38, 39,
  122. 40, 41, 42, 43, 44, 45, 46, 47, 48, 49}};
  123. TPMT_SYM_DEF policySymmetric = {.algorithm = TPM2_ALG_AES,
  124. .keyBits = {.aes = 128},
  125. .mode = {.aes = TPM2_ALG_CFB}
  126. };
  127. TPM2B_NONCE policyNonceCaller = {
  128. .size = 20,
  129. .buffer = {11, 12, 13, 14, 15, 16, 17, 18, 19, 11,
  130. 21, 22, 23, 24, 25, 26, 27, 28, 29, 30}
  131. };
  132. r = Esys_StartAuthSession(esys_context, ESYS_TR_NONE, ESYS_TR_NONE,
  133. ESYS_TR_NONE, ESYS_TR_NONE, ESYS_TR_NONE,
  134. &policyNonceCaller,
  135. TPM2_SE_POLICY, &policySymmetric, TPM2_ALG_SHA256,
  136. &policySession);
  137. goto_if_error(r, "Error: During initialization of policy trial session", error);
  138. r = Esys_PolicyAuthValue(esys_context,
  139. policySession,
  140. ESYS_TR_NONE,
  141. ESYS_TR_NONE,
  142. ESYS_TR_NONE
  143. );
  144. goto_if_error(r, "Error: PolicyAuthValue", error);
  145. r = Esys_PolicyCommandCode(esys_context,
  146. policySession,
  147. ESYS_TR_NONE,
  148. ESYS_TR_NONE,
  149. ESYS_TR_NONE,
  150. TPM2_CC_NV_ChangeAuth
  151. );
  152. goto_if_error(r, "Error: PolicyCommandCode", error);
  153. r = Esys_NV_ChangeAuth(esys_context,
  154. nvHandle,
  155. policySession,
  156. ESYS_TR_NONE,
  157. ESYS_TR_NONE,
  158. &newAuth
  159. );
  160. goto_if_error(r, "Error: NV_ChangeAuth", error);
  161. r = Esys_NV_UndefineSpace(esys_context,
  162. ESYS_TR_RH_OWNER,
  163. nvHandle,
  164. ESYS_TR_PASSWORD,
  165. ESYS_TR_NONE,
  166. ESYS_TR_NONE
  167. );
  168. goto_if_error(r, "Error: NV_UndefineSpace", error);
  169. r = Esys_FlushContext(esys_context, policySession);
  170. goto_if_error(r, "Flushing context", error);
  171. /* Check DefineSpace with auth equal NULL */
  172. r = Esys_NV_DefineSpace(esys_context,
  173. ESYS_TR_RH_OWNER,
  174. ESYS_TR_PASSWORD,
  175. ESYS_TR_NONE,
  176. ESYS_TR_NONE,
  177. NULL,
  178. &publicInfo,
  179. &nvHandle);
  180. goto_if_error(r, "Error esys define nv space", error);
  181. r = Esys_StartAuthSession(esys_context, ESYS_TR_NONE, ESYS_TR_NONE,
  182. ESYS_TR_NONE, ESYS_TR_NONE, ESYS_TR_NONE,
  183. &policyNonceCaller,
  184. TPM2_SE_POLICY, &policySymmetric, TPM2_ALG_SHA256,
  185. &policySession);
  186. goto_if_error(r, "Error: During initialization of policy trial session", error);
  187. r = Esys_PolicyAuthValue(esys_context,
  188. policySession,
  189. ESYS_TR_NONE,
  190. ESYS_TR_NONE,
  191. ESYS_TR_NONE
  192. );
  193. goto_if_error(r, "Error: PolicyAuthValue", error);
  194. r = Esys_PolicyCommandCode(esys_context,
  195. policySession,
  196. ESYS_TR_NONE,
  197. ESYS_TR_NONE,
  198. ESYS_TR_NONE,
  199. TPM2_CC_NV_ChangeAuth
  200. );
  201. goto_if_error(r, "Error: PolicyCommandCode", error);
  202. r = Esys_NV_ChangeAuth(esys_context,
  203. nvHandle,
  204. policySession,
  205. ESYS_TR_NONE,
  206. ESYS_TR_NONE,
  207. NULL
  208. );
  209. goto_if_error(r, "Error: NV_ChangeAuth", error);
  210. r = Esys_NV_UndefineSpace(esys_context,
  211. ESYS_TR_RH_OWNER,
  212. nvHandle,
  213. ESYS_TR_PASSWORD,
  214. ESYS_TR_NONE,
  215. ESYS_TR_NONE
  216. );
  217. goto_if_error(r, "Error: NV_UndefineSpace", error);
  218. r = Esys_FlushContext(esys_context, policySession);
  219. goto_if_error(r, "Flushing context", error);
  220. Esys_Free(policyDigestTrial);
  221. return EXIT_SUCCESS;
  222. error:
  223. if (sessionTrial != ESYS_TR_NONE) {
  224. if (Esys_FlushContext(esys_context, sessionTrial) != TSS2_RC_SUCCESS) {
  225. LOG_ERROR("Cleanup policySession failed.");
  226. }
  227. }
  228. if (policySession != ESYS_TR_NONE) {
  229. if (Esys_FlushContext(esys_context, policySession) != TSS2_RC_SUCCESS) {
  230. LOG_ERROR("Cleanup policySession failed.");
  231. }
  232. }
  233. if (nvHandle != ESYS_TR_NONE) {
  234. if (Esys_NV_UndefineSpace(esys_context,
  235. ESYS_TR_RH_OWNER,
  236. nvHandle,
  237. ESYS_TR_PASSWORD,
  238. ESYS_TR_NONE,
  239. ESYS_TR_NONE) != TSS2_RC_SUCCESS) {
  240. LOG_ERROR("Cleanup nvHandle failed.");
  241. }
  242. }
  243. Esys_Free(policyDigestTrial);
  244. return EXIT_FAILURE;
  245. }
  246. int
  247. test_invoke_esys(ESYS_CONTEXT * esys_context) {
  248. return test_esys_policy_nv_changeauth(esys_context);
  249. }