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