sys-nv-readwrite.int.c 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193
  1. /*
  2. * SPDX-License-Identifier: BSD-2-Clause
  3. * Copyright (c) 2019, Intel Corporation
  4. */
  5. #ifdef HAVE_CONFIG_H
  6. #include <config.h>
  7. #endif
  8. #include <inttypes.h>
  9. #include <stdio.h>
  10. #include <stdlib.h>
  11. #include <string.h>
  12. #include "tss2_sys.h"
  13. #include "context-util.h"
  14. #include "sys-util.h"
  15. #include "session-util.h"
  16. #include "util/aux_util.h"
  17. #define LOGMODULE test
  18. #include "util/log.h"
  19. #define NV_PS_INDEX_SIZE 34
  20. #define INDEX_LCP_OWN 0x01400001
  21. #define INDEX_LCP_SUP 0x01800001
  22. #define TPM2B_SIZE_MAX(type) (sizeof (type) - 2)
  23. const TSS2L_SYS_AUTH_COMMAND auth_cmd_null_pwd = {
  24. .count = 1,
  25. .auths = {
  26. {
  27. .sessionHandle = TPM2_RH_PW,
  28. },
  29. },
  30. };
  31. static TSS2_RC
  32. create_policy_session (
  33. TSS2_SYS_CONTEXT *sys_ctx,
  34. TPMI_SH_AUTH_SESSION *handle)
  35. {
  36. TSS2_RC rc;
  37. TPM2B_ENCRYPTED_SECRET salt = { 0 };
  38. TPM2B_NONCE nonce = {
  39. .size = GetDigestSize (TPM2_ALG_SHA1),
  40. };
  41. TPM2B_NONCE nonce_tpm = { 0, };
  42. TPMT_SYM_DEF symmetric = {
  43. .algorithm = TPM2_ALG_NULL,
  44. };
  45. rc = Tss2_Sys_StartAuthSession (sys_ctx,
  46. TPM2_RH_NULL,
  47. TPM2_RH_NULL,
  48. 0,
  49. &nonce,
  50. &salt,
  51. TPM2_SE_POLICY,
  52. &symmetric,
  53. TPM2_ALG_SHA1,
  54. handle,
  55. &nonce_tpm,
  56. 0);
  57. return_if_error (rc, "Tss2_Sys_StartAuthSession");
  58. return TSS2_RC_SUCCESS;
  59. }
  60. static TSS2_RC
  61. setup_nv (TSS2_SYS_CONTEXT *sys_ctx,
  62. TPMI_RH_NV_INDEX index)
  63. {
  64. TSS2_RC rc;
  65. TPMI_SH_AUTH_SESSION auth_handle;
  66. TPM2B_DIGEST policy_hash = {
  67. .size = TPM2B_SIZE_MAX (policy_hash),
  68. };
  69. TPM2B_AUTH nv_auth = { 0, };
  70. TSS2L_SYS_AUTH_RESPONSE auth_rsp;
  71. TPM2B_NV_PUBLIC public_info = {
  72. .nvPublic = {
  73. .nameAlg = TPM2_ALG_SHA1,
  74. .attributes = TPMA_NV_AUTHREAD | TPMA_NV_AUTHWRITE |
  75. TPMA_NV_PLATFORMCREATE | TPMA_NV_WRITEDEFINE | TPMA_NV_ORDERLY,
  76. .dataSize = NV_PS_INDEX_SIZE,
  77. .nvIndex = index,
  78. },
  79. };
  80. rc = create_policy_session (sys_ctx, &auth_handle);
  81. return_if_error (rc, "create_policy_session");
  82. rc = Tss2_Sys_PolicyGetDigest (sys_ctx, auth_handle, 0, &policy_hash, 0);
  83. return_if_error (rc, "Tss2_Sys_PolicyGetDigest");
  84. LOGBLOB_INFO (policy_hash.buffer, policy_hash.size, "policy_hash");
  85. rc = Tss2_Sys_NV_DefineSpace (sys_ctx,
  86. TPM2_RH_PLATFORM,
  87. &auth_cmd_null_pwd,
  88. &nv_auth,
  89. &public_info,
  90. &auth_rsp);
  91. return_if_error (rc, "Tss2_Sys_NV_DefineSpace");
  92. rc = Tss2_Sys_FlushContext (sys_ctx, auth_handle);
  93. return_if_error (rc, "Tss2_Sys_FlushContext");
  94. return TSS2_RC_SUCCESS;
  95. }
  96. static TSS2_RC
  97. nv_write_read_test (TSS2_SYS_CONTEXT *sys_ctx,
  98. TPMI_RH_NV_INDEX index)
  99. {
  100. TSS2_RC rc;
  101. TPM2B_MAX_NV_BUFFER write_data = {
  102. .size = 4,
  103. .buffer = { 0xde, 0xad, 0xbe, 0xef },
  104. };
  105. TPM2B_MAX_NV_BUFFER nv_buf = { 0, };
  106. TSS2L_SYS_AUTH_RESPONSE auth_resp = { 0, };
  107. rc = TSS2_RETRY_EXP (Tss2_Sys_NV_Write (sys_ctx,
  108. index,
  109. index,
  110. &auth_cmd_null_pwd,
  111. &write_data,
  112. 0,
  113. &auth_resp));
  114. return_if_error (rc, "Tss2_Sys_NV_Write");
  115. rc = Tss2_Sys_NV_Read (sys_ctx,
  116. index,
  117. index,
  118. &auth_cmd_null_pwd,
  119. 4,
  120. 0,
  121. &nv_buf,
  122. &auth_resp);
  123. return_if_error (rc, "Tss2_Sys_NV_Read");
  124. if (memcmp (nv_buf.buffer, write_data.buffer, write_data.size) != 0) {
  125. LOG_ERROR ("%s: data read from NV is different from data written",
  126. __func__);
  127. LOGBLOB_DEBUG (write_data.buffer, write_data.size, "write_data");
  128. LOGBLOB_DEBUG (nv_buf.buffer, nv_buf.size, "nv_buf");
  129. return 1;
  130. }
  131. return TSS2_RC_SUCCESS;
  132. }
  133. static TSS2_RC
  134. teardown_nv (TSS2_SYS_CONTEXT *sys_ctx,
  135. TPMI_RH_NV_INDEX index)
  136. {
  137. TSS2_RC rc;
  138. TSS2L_SYS_AUTH_RESPONSE auth_resp = { 0, };
  139. rc = Tss2_Sys_NV_UndefineSpace (sys_ctx,
  140. TPM2_RH_PLATFORM,
  141. index,
  142. &auth_cmd_null_pwd,
  143. &auth_resp);
  144. return_if_error (rc, "Tss2_Sys_NV_UndefineSpace");
  145. return TSS2_RC_SUCCESS;
  146. }
  147. int
  148. test_invoke (TSS2_SYS_CONTEXT *sys_ctx)
  149. {
  150. TSS2_RC rc, rc_teardown;
  151. rc = setup_nv (sys_ctx, INDEX_LCP_OWN);
  152. return_if_error (rc, "setup_nv for INDEX_LCP_OWN");
  153. rc = nv_write_read_test (sys_ctx, INDEX_LCP_OWN);
  154. LOG_ERROR ("nv_write_read_test for INDEX_LCP_OWN");
  155. rc_teardown = teardown_nv (sys_ctx, INDEX_LCP_OWN);
  156. return_if_error (rc, "INDEX_LCP_OWN test");
  157. return_if_error (rc_teardown, "teardown_nv for INDEX_LCP_OWN");
  158. rc = setup_nv (sys_ctx, INDEX_LCP_SUP);
  159. return_if_error (rc, "setup_nv for INDEX_LCP_SUP");
  160. rc = nv_write_read_test (sys_ctx, INDEX_LCP_SUP);
  161. LOG_ERROR ("nv_write_read_test for INDEX_LCP_SUP");
  162. rc_teardown = teardown_nv (sys_ctx, INDEX_LCP_SUP);
  163. return_if_error (rc, "INDEX_LCP_SUP test");
  164. return_if_error (rc_teardown, "teardown_nv for INDEX_LCP_SUP");
  165. return 0;
  166. }