xref: /aosp_15_r20/external/tpm2-tss/test/integration/sapi-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 <inttypes.h>
12*758e9fbaSOystein Eftevaag #include <stdlib.h>
13*758e9fbaSOystein Eftevaag #include <string.h>
14*758e9fbaSOystein Eftevaag 
15*758e9fbaSOystein Eftevaag #define LOGMODULE test
16*758e9fbaSOystein Eftevaag #include "util/log.h"
17*758e9fbaSOystein Eftevaag #include "sapi-util.h"
18*758e9fbaSOystein Eftevaag #include "test-esapi.h"
19*758e9fbaSOystein Eftevaag #include "test.h"
20*758e9fbaSOystein Eftevaag 
21*758e9fbaSOystein Eftevaag #define ENC_STR "test-data-test-data-test-data"
22*758e9fbaSOystein Eftevaag 
23*758e9fbaSOystein Eftevaag /*
24*758e9fbaSOystein Eftevaag  * This test is intended to exercise the EncryptDecrypt2 command. We start by
25*758e9fbaSOystein Eftevaag  * creating a primary key, then a 128 bit AES key in CFB mode under it. We
26*758e9fbaSOystein Eftevaag  * then encrypt a well known string with this key, and then decrypt that same
27*758e9fbaSOystein Eftevaag  * string. The test is successful if the original string and the decrypted
28*758e9fbaSOystein Eftevaag  * string are the same.
29*758e9fbaSOystein Eftevaag  */
30*758e9fbaSOystein Eftevaag int
test_invoke(TSS2_SYS_CONTEXT * sapi_context)31*758e9fbaSOystein Eftevaag test_invoke (TSS2_SYS_CONTEXT *sapi_context)
32*758e9fbaSOystein Eftevaag {
33*758e9fbaSOystein Eftevaag     TSS2_RC rc;
34*758e9fbaSOystein Eftevaag     TPM2_HANDLE handle_parent, handle;
35*758e9fbaSOystein Eftevaag     TPM2B_MAX_BUFFER data_in = { 0 };
36*758e9fbaSOystein Eftevaag     TPM2B_MAX_BUFFER data_encrypt = TPM2B_MAX_BUFFER_INIT;
37*758e9fbaSOystein Eftevaag     TPM2B_MAX_BUFFER data_decrypt = TPM2B_MAX_BUFFER_INIT;
38*758e9fbaSOystein Eftevaag 
39*758e9fbaSOystein Eftevaag     data_in.size = strlen (ENC_STR);
40*758e9fbaSOystein Eftevaag     strcpy ((char*)data_in.buffer, ENC_STR);
41*758e9fbaSOystein Eftevaag 
42*758e9fbaSOystein Eftevaag     rc = create_primary_rsa_2048_aes_128_cfb (sapi_context, &handle_parent);
43*758e9fbaSOystein Eftevaag     if (rc != TSS2_RC_SUCCESS) {
44*758e9fbaSOystein Eftevaag         LOG_ERROR("Failed to create primary RSA 2048 key: 0x%" PRIx32 "",
45*758e9fbaSOystein Eftevaag                     rc);
46*758e9fbaSOystein Eftevaag         exit(1);
47*758e9fbaSOystein Eftevaag     }
48*758e9fbaSOystein Eftevaag 
49*758e9fbaSOystein Eftevaag     rc = create_aes_128_cfb (sapi_context, handle_parent, &handle);
50*758e9fbaSOystein Eftevaag     if (rc != TSS2_RC_SUCCESS) {
51*758e9fbaSOystein Eftevaag         LOG_ERROR("Failed to create child AES 128 key: 0x%" PRIx32 "", rc);
52*758e9fbaSOystein Eftevaag         exit(1);
53*758e9fbaSOystein Eftevaag     }
54*758e9fbaSOystein Eftevaag 
55*758e9fbaSOystein Eftevaag     LOG_INFO("Encrypting data: \"%s\" with key handle: 0x%08" PRIx32,
56*758e9fbaSOystein Eftevaag                data_in.buffer, handle);
57*758e9fbaSOystein Eftevaag     rc = tpm_encrypt_cfb (sapi_context, handle, &data_in, &data_encrypt);
58*758e9fbaSOystein Eftevaag 
59*758e9fbaSOystein Eftevaag     if (rc == TPM2_RC_COMMAND_CODE) {
60*758e9fbaSOystein Eftevaag         LOG_WARNING("Encrypt/Decrypt 2 not supported by TPM");
61*758e9fbaSOystein Eftevaag         rc = Tss2_Sys_FlushContext(sapi_context, handle_parent);
62*758e9fbaSOystein Eftevaag         if (rc != TSS2_RC_SUCCESS) {
63*758e9fbaSOystein Eftevaag             LOG_ERROR("Tss2_Sys_FlushContext failed with 0x%"PRIx32, rc);
64*758e9fbaSOystein Eftevaag             return 99; /* fatal error */
65*758e9fbaSOystein Eftevaag         }
66*758e9fbaSOystein Eftevaag         rc = Tss2_Sys_FlushContext(sapi_context, handle);
67*758e9fbaSOystein Eftevaag         if (rc != TSS2_RC_SUCCESS) {
68*758e9fbaSOystein Eftevaag             LOG_ERROR("Tss2_Sys_FlushContext failed with 0x%"PRIx32, rc);
69*758e9fbaSOystein Eftevaag             return 99; /* fatal error */
70*758e9fbaSOystein Eftevaag         }
71*758e9fbaSOystein Eftevaag         return EXIT_SKIP;
72*758e9fbaSOystein Eftevaag     }
73*758e9fbaSOystein Eftevaag 
74*758e9fbaSOystein Eftevaag     if (rc != TSS2_RC_SUCCESS) {
75*758e9fbaSOystein Eftevaag         LOG_ERROR("Failed to encrypt buffer: 0x%" PRIx32 "", rc);
76*758e9fbaSOystein Eftevaag         exit(1);
77*758e9fbaSOystein Eftevaag     }
78*758e9fbaSOystein Eftevaag 
79*758e9fbaSOystein Eftevaag     rc = tpm_decrypt_cfb (sapi_context, handle, &data_encrypt, &data_decrypt);
80*758e9fbaSOystein Eftevaag     if (rc != TSS2_RC_SUCCESS) {
81*758e9fbaSOystein Eftevaag         LOG_ERROR("Failed to encrypt buffer: 0x%" PRIx32 "", rc);
82*758e9fbaSOystein Eftevaag         exit(1);
83*758e9fbaSOystein Eftevaag     }
84*758e9fbaSOystein Eftevaag     LOG_INFO("Decrypted data: \"%s\" with key handle: 0x%08" PRIx32,
85*758e9fbaSOystein Eftevaag                data_decrypt.buffer, handle);
86*758e9fbaSOystein Eftevaag     if (strcmp ((char*)data_in.buffer, (char*)data_decrypt.buffer)) {
87*758e9fbaSOystein Eftevaag         LOG_ERROR("Decrypt succeeded but decrypted data != to input data");
88*758e9fbaSOystein Eftevaag         exit(1);
89*758e9fbaSOystein Eftevaag     }
90*758e9fbaSOystein Eftevaag 
91*758e9fbaSOystein Eftevaag     rc = Tss2_Sys_FlushContext(sapi_context, handle_parent);
92*758e9fbaSOystein Eftevaag     if (rc != TSS2_RC_SUCCESS) {
93*758e9fbaSOystein Eftevaag         LOG_ERROR("Tss2_Sys_FlushContext failed with 0x%"PRIx32, rc);
94*758e9fbaSOystein Eftevaag         return 99; /* fatal error */
95*758e9fbaSOystein Eftevaag     }
96*758e9fbaSOystein Eftevaag     rc = Tss2_Sys_FlushContext(sapi_context, handle);
97*758e9fbaSOystein Eftevaag     if (rc != TSS2_RC_SUCCESS) {
98*758e9fbaSOystein Eftevaag         LOG_ERROR("Tss2_Sys_FlushContext failed with 0x%"PRIx32, rc);
99*758e9fbaSOystein Eftevaag         return 99; /* fatal error */
100*758e9fbaSOystein Eftevaag     }
101*758e9fbaSOystein Eftevaag 
102*758e9fbaSOystein Eftevaag     return 0;
103*758e9fbaSOystein Eftevaag }
104