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