sys-asymmetric-encrypt-decrypt.int.c 6.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166
  1. /* SPDX-License-Identifier: BSD-2-Clause */
  2. /***********************************************************************
  3. * Copyright (c) 2017-2018, Intel Corporation
  4. *
  5. * All rights reserved.
  6. ***********************************************************************/
  7. #ifdef HAVE_CONFIG_H
  8. #include <config.h>
  9. #endif
  10. #include <stdio.h>
  11. #include <stdlib.h>
  12. #include <string.h>
  13. #include <inttypes.h>
  14. #include "tss2_tcti.h"
  15. #include "tss2_sys.h"
  16. #define LOGMODULE test
  17. #include "util/log.h"
  18. #include "test.h"
  19. #include "sys-util.h"
  20. /**
  21. * This program contains integration test for asymmetric encrypt and
  22. * decrypt use case that has SYSs Tss2_Sys_CreatePrimary,
  23. * Tss2_Sys_Create, Tss2_Sys_Load, Tss2_Sys_RSA_Encrypt and
  24. * Tss2_Sys_RSA_Decrypt. First, the program creates the object and load
  25. * it in TPM. Then, it performs encryption based on the loaded
  26. * object. The object will be verified if it is encrypted.
  27. * If the verification is passed, it performs decryption and the
  28. * program will check if the decrypted value is the same as
  29. * the value before encryption.
  30. */
  31. int
  32. test_invoke (TSS2_SYS_CONTEXT *sys_context)
  33. {
  34. TSS2_RC rc;
  35. TPM2B_SENSITIVE_CREATE in_sensitive;
  36. TPM2B_PUBLIC in_public = {0};
  37. TPM2B_DATA outside_info = {0,};
  38. TPML_PCR_SELECTION creation_pcr;
  39. TPM2B_NAME name = {sizeof(TPM2B_NAME)-2,};
  40. TPM2B_PRIVATE out_private = {sizeof(TPM2B_PRIVATE)-2,};
  41. TPM2B_PUBLIC out_public = {0,};
  42. TPM2B_CREATION_DATA creation_data = {0,};
  43. TPM2B_DIGEST creation_hash = {sizeof(TPM2B_DIGEST)-2,};
  44. TPMT_TK_CREATION creation_ticket = {0,};
  45. TPM2_HANDLE loaded_sym_handle;
  46. TPM2_HANDLE sym_handle;
  47. const char message[] = "my message";
  48. TPMT_RSA_DECRYPT in_scheme;
  49. TPM2B_PUBLIC_KEY_RSA input_message = {sizeof(TPM2B_PUBLIC_KEY_RSA)-2,};
  50. TPM2B_PUBLIC_KEY_RSA output_message = {sizeof(TPM2B_PUBLIC_KEY_RSA)-2,};
  51. TPM2B_PUBLIC_KEY_RSA output_data = {sizeof(TPM2B_PUBLIC_KEY_RSA)-2,};
  52. TSS2L_SYS_AUTH_RESPONSE sessions_data_out;
  53. TSS2L_SYS_AUTH_COMMAND sessions_data = {
  54. .count = 1,
  55. .auths = {{.sessionHandle = TPM2_RH_PW,
  56. .nonce={.size=0},
  57. .hmac={.size=0}}}};
  58. in_sensitive.size = 0;
  59. in_sensitive.sensitive.userAuth.size = 0;
  60. in_sensitive.sensitive.data.size = 0;
  61. in_public.publicArea.type = TPM2_ALG_RSA;
  62. in_public.publicArea.nameAlg = TPM2_ALG_SHA256;
  63. *(UINT32 *)&(in_public.publicArea.objectAttributes) = 0;
  64. in_public.publicArea.objectAttributes |= TPMA_OBJECT_RESTRICTED;
  65. in_public.publicArea.objectAttributes |= TPMA_OBJECT_USERWITHAUTH;
  66. in_public.publicArea.objectAttributes |= TPMA_OBJECT_DECRYPT;
  67. in_public.publicArea.objectAttributes |= TPMA_OBJECT_FIXEDTPM;
  68. in_public.publicArea.objectAttributes |= TPMA_OBJECT_FIXEDPARENT;
  69. in_public.publicArea.objectAttributes |= TPMA_OBJECT_SENSITIVEDATAORIGIN;
  70. in_public.publicArea.authPolicy.size = 0;
  71. in_public.publicArea.parameters.rsaDetail.symmetric.algorithm = TPM2_ALG_AES;
  72. in_public.publicArea.parameters.rsaDetail.symmetric.keyBits.aes = 128;
  73. in_public.publicArea.parameters.rsaDetail.symmetric.mode.aes = TPM2_ALG_CFB;
  74. in_public.publicArea.parameters.rsaDetail.scheme.scheme = TPM2_ALG_NULL;
  75. in_public.publicArea.parameters.rsaDetail.keyBits = 2048;
  76. in_public.publicArea.parameters.rsaDetail.exponent = 0;
  77. in_public.publicArea.unique.rsa.size = 0;
  78. outside_info.size = 0;
  79. creation_pcr.count = 0;
  80. out_public.size = 0;
  81. creation_data.size = 0;
  82. LOG_INFO("Asymmetric Encryption and Decryption Tests started.");
  83. rc = Tss2_Sys_CreatePrimary(sys_context, TPM2_RH_OWNER, &sessions_data, &in_sensitive, &in_public, &outside_info, &creation_pcr, &sym_handle, &out_public, &creation_data, &creation_hash, &creation_ticket, &name, &sessions_data_out);
  84. if (rc != TPM2_RC_SUCCESS) {
  85. LOG_ERROR("CreatePrimary FAILED! Response Code : 0x%x", rc);
  86. exit(1);
  87. }
  88. LOG_INFO("New key successfully created. Handle: 0x%8.8x", sym_handle);
  89. in_public.publicArea.type = TPM2_ALG_RSA;
  90. in_public.publicArea.parameters.rsaDetail.symmetric.algorithm = TPM2_ALG_NULL;
  91. in_public.publicArea.parameters.rsaDetail.scheme.scheme = TPM2_ALG_NULL;
  92. in_public.publicArea.parameters.rsaDetail.keyBits = 2048;
  93. in_public.publicArea.parameters.rsaDetail.exponent = 0;
  94. in_public.publicArea.unique.rsa.size = 0;
  95. /* First clear attributes bit field. */
  96. *(UINT32 *)&(in_public.publicArea.objectAttributes) = 0;
  97. in_public.publicArea.objectAttributes &= ~TPMA_OBJECT_RESTRICTED;
  98. in_public.publicArea.objectAttributes |= TPMA_OBJECT_USERWITHAUTH;
  99. in_public.publicArea.objectAttributes |= TPMA_OBJECT_DECRYPT;
  100. in_public.publicArea.objectAttributes |= TPMA_OBJECT_SIGN_ENCRYPT;
  101. in_public.publicArea.objectAttributes |= TPMA_OBJECT_FIXEDTPM;
  102. in_public.publicArea.objectAttributes |= TPMA_OBJECT_FIXEDPARENT;
  103. in_public.publicArea.objectAttributes |= TPMA_OBJECT_SENSITIVEDATAORIGIN;
  104. outside_info.size = 0;
  105. out_public.size = 0;
  106. creation_data.size = 0;
  107. sessions_data.auths[0].hmac.size = 0;
  108. rc = TSS2_RETRY_EXP (Tss2_Sys_Create(sys_context, sym_handle, &sessions_data, &in_sensitive, &in_public, &outside_info, &creation_pcr, &out_private, &out_public, &creation_data, &creation_hash, &creation_ticket, &sessions_data_out));
  109. if (rc != TPM2_RC_SUCCESS) {
  110. LOG_ERROR("Create FAILED! Response Code : 0x%x", rc);
  111. exit(1);
  112. }
  113. rc = Tss2_Sys_Load(sys_context, sym_handle, &sessions_data, &out_private, &out_public, &loaded_sym_handle, &name, &sessions_data_out);
  114. if (rc != TPM2_RC_SUCCESS) {
  115. LOG_ERROR("Load FAILED! Response Code : 0x%x", rc);
  116. exit(1);
  117. }
  118. LOG_INFO( "Loaded key handle: %8.8x", loaded_sym_handle );
  119. input_message.size = strlen(message);
  120. memcpy(input_message.buffer, message, input_message.size);
  121. in_scheme.scheme = TPM2_ALG_RSAES;
  122. outside_info.size = 0;
  123. rc = Tss2_Sys_RSA_Encrypt(sys_context, loaded_sym_handle, 0, &input_message, &in_scheme, &outside_info, &output_data, 0);
  124. if(rc != TPM2_RC_SUCCESS) {
  125. LOG_ERROR("RSA_Encrypt FAILED! Response Code : 0x%x", rc);
  126. exit(1);
  127. }
  128. LOG_INFO("Encrypt successful.");
  129. rc = Tss2_Sys_RSA_Decrypt(sys_context, loaded_sym_handle, &sessions_data, &output_data, &in_scheme, &outside_info, &output_message, &sessions_data_out);
  130. if(rc != TPM2_RC_SUCCESS) {
  131. LOG_ERROR("RSA_Decrypt FAILED! Response Code : 0x%x", rc);
  132. exit(1);
  133. }
  134. LOG_INFO("Decrypt successful.");
  135. LOG_INFO("Asymmetric Encryption and Decryption Test Passed!");
  136. rc = Tss2_Sys_FlushContext(sys_context, sym_handle);
  137. if (rc != TSS2_RC_SUCCESS) {
  138. LOG_ERROR("Tss2_Sys_FlushContext failed with 0x%"PRIx32, rc);
  139. return 99; /* fatal error */
  140. }
  141. rc = Tss2_Sys_FlushContext(sys_context, loaded_sym_handle);
  142. if (rc != TSS2_RC_SUCCESS) {
  143. LOG_ERROR("Tss2_Sys_FlushContext failed with 0x%"PRIx32, rc);
  144. return 99; /* fatal error */
  145. }
  146. return 0;
  147. }