[tpm2] Ecrypting and decrypting a file using a TPM2

dawn.howe at alten.com Wed, 15 Jun 2022 00:06:01 +0000
Newsgroups dev.linux.lists.tpm2
Message-ID <[email protected]>
I am writing a c++ application on ubuntu 22.04 server that needs to encrypt and decrypt files and am using the FAPI api. The files need to be secured until the application uses them at a later time, so I am receiving plain files and encrypting them using Fapi_Encrypt(). 

I tried following the pattern in the integration tests found in the tpm2-tools. (tpm2-tools/test/integration/fapi/fapi-encrypt-decrypt.sh)

It basically does the following:
Fapi_Initialize(&global_fapi_context, NULL);
Fapi_Provision (global_fapi_context, NULL, NULL, NULL);

const char * key_type = "noDa, decrypt, system";
char * auth_value = NULL; // no password
char * policy_path = NULL;
Fapi_CreateKey (global_fapi_context, key_path, key_type, policy_path, auth_value);

Fapi_Encrypt (global_fapi_context, key_path, (const uint8_t*)data, size, &cipherText, &cipherTextSize);

The files (data buffer) I need to encrypt are about 3k bytes big. 

The encryption fails because the file is too big. The error comes from 
.../tpm2-tss/src/tss2-fapi/api/Fapi_Encrypt.c line 309:

if (encKeyObject->misc.key.public.publicArea.type == TPM2_ALG_RSA) {
                TPM2B_DATA null_data = { .size = 0, .buffer = {} };
                TPM2B_PUBLIC_KEY_RSA *rsa_message = (TPM2B_PUBLIC_KEY_RSA *)&context->aux_data;
                size_t key_size =
                    encKeyObject->misc.key.public.publicArea.parameters.rsaDetail.keyBits / 8;
                if (context->cmd.Data_EncryptDecrypt.in_dataSize > key_size) {
                    goto_error_reset_state(r, TSS2_FAPI_RC_BAD_VALUE,
                                           "Size to big for RSA encryption.", error_cleanup);


Is my strategy completely wrong? What's the proper way to do this?  Is my strategy ok, but need to generate a different type of key?

I'm new to this technology and am curious how it ought to be done.