esys-get-random.int.c 7.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219
  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. /** Test the ESYS function Esys_GetRandom.
  16. *
  17. * Tested ESYS commands:
  18. * - Esys_GetRandom() (M)
  19. * - Esys_StartAuthSession() (M)
  20. *
  21. * @param[in,out] esys_context The ESYS_CONTEXT.
  22. * @retval EXIT_FAILURE
  23. * @retval EXIT_SUCCESS
  24. */
  25. int
  26. test_esys_get_random(ESYS_CONTEXT * esys_context)
  27. {
  28. TSS2_RC r;
  29. TPM2B_DIGEST *randomBytes;
  30. r = Esys_GetRandom(esys_context, ESYS_TR_NONE, ESYS_TR_NONE, ESYS_TR_NONE,
  31. 48, &randomBytes);
  32. if (r != TPM2_RC_SUCCESS) {
  33. LOG_ERROR("GetRandom FAILED! Response Code : 0x%x", r);
  34. goto error;
  35. }
  36. LOGBLOB_DEBUG(&randomBytes->buffer[0], randomBytes->size,
  37. "Randoms (count=%i):", randomBytes->size);
  38. Esys_Free(randomBytes);
  39. LOG_INFO("GetRandom Test Passed!");
  40. ESYS_TR session = ESYS_TR_NONE;
  41. const TPMT_SYM_DEF symmetric = {
  42. .algorithm = TPM2_ALG_AES,
  43. .keyBits = {.aes = 128},
  44. .mode = {.aes = TPM2_ALG_CFB}
  45. };
  46. r = Esys_StartAuthSession(esys_context, ESYS_TR_NONE, ESYS_TR_NONE,
  47. ESYS_TR_NONE, ESYS_TR_NONE, ESYS_TR_NONE,
  48. NULL,
  49. TPM2_SE_HMAC, &symmetric, TPM2_ALG_SHA256,
  50. &session);
  51. if (r != TPM2_RC_SUCCESS) {
  52. LOG_ERROR("Esys_StartAuthSession FAILED! Response Code : 0x%x", r);
  53. goto error;
  54. }
  55. r = Esys_TRSess_SetAttributes(esys_context, session, TPMA_SESSION_AUDIT,
  56. TPMA_SESSION_CONTINUESESSION | TPMA_SESSION_AUDIT);
  57. if (r != TPM2_RC_SUCCESS) {
  58. LOG_ERROR("SetAttributes on session FAILED! Response Code : 0x%x", r);
  59. goto error_cleansession;
  60. }
  61. r = Esys_GetRandom(esys_context, session, ESYS_TR_NONE, ESYS_TR_NONE, 48,
  62. &randomBytes);
  63. if (r != TPM2_RC_SUCCESS) {
  64. LOG_ERROR("GetRandom with session FAILED! Response Code : 0x%x", r);
  65. goto error_cleansession;
  66. }
  67. LOGBLOB_DEBUG(&randomBytes->buffer[0], randomBytes->size,
  68. "Randoms (count=%i):", randomBytes->size);
  69. free(randomBytes);
  70. r = Esys_StartAuthSession(esys_context, ESYS_TR_NONE, ESYS_TR_NONE,
  71. ESYS_TR_NONE, ESYS_TR_NONE, ESYS_TR_NONE,
  72. NULL,
  73. TPM2_SE_HMAC, &symmetric, TPM2_ALG_SHA256,
  74. &session);
  75. if (r != TPM2_RC_SUCCESS) {
  76. LOG_ERROR("Esys_StartAuthSession FAILED! Response Code : 0x%x", r);
  77. goto error;
  78. }
  79. r = Esys_TRSess_SetAttributes(esys_context, session, TPMA_SESSION_AUDIT,
  80. TPMA_SESSION_CONTINUESESSION | TPMA_SESSION_AUDIT);
  81. if (r != TPM2_RC_SUCCESS) {
  82. LOG_ERROR("SetAttributes on session FAILED! Response Code : 0x%x", r);
  83. goto error_cleansession;
  84. }
  85. r = Esys_GetRandom(esys_context, session, ESYS_TR_NONE, ESYS_TR_NONE, 48,
  86. &randomBytes);
  87. if (r != TPM2_RC_SUCCESS) {
  88. LOG_ERROR("GetRandom with session FAILED! Response Code : 0x%x", r);
  89. goto error_cleansession;
  90. }
  91. LOGBLOB_DEBUG(&randomBytes->buffer[0], randomBytes->size,
  92. "Randoms (count=%i):", randomBytes->size);
  93. free(randomBytes);
  94. r = Esys_StartAuthSession(esys_context, ESYS_TR_NONE, ESYS_TR_NONE,
  95. ESYS_TR_NONE, ESYS_TR_NONE, ESYS_TR_NONE,
  96. NULL,
  97. TPM2_SE_HMAC, &symmetric, TPM2_ALG_SHA256,
  98. &session);
  99. if (r != TPM2_RC_SUCCESS) {
  100. LOG_ERROR("Esys_StartAuthSession FAILED! Response Code : 0x%x", r);
  101. goto error;
  102. }
  103. r = Esys_TRSess_SetAttributes(esys_context, session, TPMA_SESSION_AUDIT,
  104. TPMA_SESSION_CONTINUESESSION | TPMA_SESSION_AUDIT);
  105. if (r != TPM2_RC_SUCCESS) {
  106. LOG_ERROR("SetAttributes on session FAILED! Response Code : 0x%x", r);
  107. goto error_cleansession;
  108. }
  109. r = Esys_GetRandom(esys_context, session, ESYS_TR_NONE, ESYS_TR_NONE, 48,
  110. &randomBytes);
  111. if (r != TPM2_RC_SUCCESS) {
  112. LOG_ERROR("GetRandom with session FAILED! Response Code : 0x%x", r);
  113. goto error_cleansession;
  114. }
  115. LOGBLOB_DEBUG(&randomBytes->buffer[0], randomBytes->size,
  116. "Randoms (count=%i):", randomBytes->size);
  117. free(randomBytes);
  118. r = Esys_StartAuthSession(esys_context, ESYS_TR_NONE, ESYS_TR_NONE,
  119. ESYS_TR_NONE, ESYS_TR_NONE, ESYS_TR_NONE,
  120. NULL,
  121. TPM2_SE_HMAC, &symmetric, TPM2_ALG_SHA256,
  122. &session);
  123. if (r != TPM2_RC_SUCCESS) {
  124. LOG_ERROR("Esys_StartAuthSession FAILED! Response Code : 0x%x", r);
  125. goto error;
  126. }
  127. r = Esys_TRSess_SetAttributes(esys_context, session, TPMA_SESSION_AUDIT,
  128. TPMA_SESSION_CONTINUESESSION | TPMA_SESSION_AUDIT);
  129. if (r != TPM2_RC_SUCCESS) {
  130. LOG_ERROR("SetAttributes on session FAILED! Response Code : 0x%x", r);
  131. goto error_cleansession;
  132. }
  133. r = Esys_GetRandom(esys_context, session, ESYS_TR_NONE, ESYS_TR_NONE, 48,
  134. &randomBytes);
  135. if (r != TPM2_RC_SUCCESS) {
  136. LOG_ERROR("GetRandom with session FAILED! Response Code : 0x%x", r);
  137. goto error_cleansession;
  138. }
  139. LOGBLOB_DEBUG(&randomBytes->buffer[0], randomBytes->size,
  140. "Randoms (count=%i):", randomBytes->size);
  141. free(randomBytes);
  142. r = Esys_StartAuthSession(esys_context, ESYS_TR_NONE, ESYS_TR_NONE,
  143. ESYS_TR_NONE, ESYS_TR_NONE, ESYS_TR_NONE,
  144. NULL,
  145. TPM2_SE_HMAC, &symmetric, TPM2_ALG_SHA256,
  146. &session);
  147. if (r != TPM2_RC_SUCCESS) {
  148. LOG_ERROR("Esys_StartAuthSession FAILED! Response Code : 0x%x", r);
  149. goto error;
  150. }
  151. r = Esys_TRSess_SetAttributes(esys_context, session, TPMA_SESSION_AUDIT,
  152. TPMA_SESSION_CONTINUESESSION | TPMA_SESSION_AUDIT);
  153. if (r != TPM2_RC_SUCCESS) {
  154. LOG_ERROR("SetAttributes on session FAILED! Response Code : 0x%x", r);
  155. goto error_cleansession;
  156. }
  157. r = Esys_GetRandom(esys_context, session, ESYS_TR_NONE, ESYS_TR_NONE, 48,
  158. &randomBytes);
  159. if (r != TPM2_RC_SUCCESS) {
  160. LOG_ERROR("GetRandom with session FAILED! Response Code : 0x%x", r);
  161. goto error_cleansession;
  162. }
  163. LOGBLOB_DEBUG(&randomBytes->buffer[0], randomBytes->size,
  164. "Randoms (count=%i):", randomBytes->size);
  165. free(randomBytes);
  166. LOG_INFO("GetRandom with session Test Passed!");
  167. //r = Esys_FlushContext(esys_context, session);
  168. if (r != TPM2_RC_SUCCESS) {
  169. LOG_ERROR("FlushContext with session FAILED! Response Code : 0x%x", r);
  170. goto error_cleansession;
  171. }
  172. return EXIT_SUCCESS;
  173. error_cleansession:
  174. r = Esys_FlushContext(esys_context, session);
  175. if (r != TPM2_RC_SUCCESS) {
  176. LOG_ERROR("FlushContext FAILED! Response Code : 0x%x", r);
  177. }
  178. error:
  179. return EXIT_FAILURE;
  180. }
  181. int
  182. test_invoke_esys(ESYS_CONTEXT * esys_context) {
  183. return test_esys_get_random(esys_context);
  184. }