Description of the situation by steps:
- I start encryption/decryption sessions
- I create primary RSA key
- I make key object persistent
- I try to encrypt data, using persistent key handle
Sample of my code below:
ByteVec dataToEncrypt = TPM_HASH::FromHashOfString(TPM_ALG_ID::SHA1, "secret");
cout << "Data to encrypt: " << dataToEncrypt << endl;
// 1) Starting decryption / encryption sessions
AUTH_SESSION sess = tpm.StartAuthSession(TPM_SE::HMAC, TPM_ALG_ID::SHA256,
TPMA_SESSION::continueSession | TPMA_SESSION::decrypt,
TPMT_SYM_DEF(TPM_ALG_ID::AES, 128, TPM_ALG_ID::CFB));
AUTH_SESSION encSess = tpm.StartAuthSession(TPM_SE::HMAC, TPM_ALG_ID::SHA1,
TPMA_SESSION::continueSession | TPMA_SESSION::encrypt,
TPMT_SYM_DEF(TPM_ALG_ID::AES, 128, TPM_ALG_ID::CFB));
// 2) Creating primary RSA key
TPMT_PUBLIC primTempl(TPM_ALG_ID::SHA1,
TPMA_OBJECT::decrypt | TPMA_OBJECT::userWithAuth | TPMA_OBJECT::sensitiveDataOrigin,
null, // No policy
TPMS_RSA_PARMS(null, TPMS_SCHEME_OAEP(TPM_ALG_ID::SHA1), 2048, 65537),
TPM2B_PUBLIC_KEY_RSA());
auto storagePrimary = tpm[sess].CreatePrimary(TPM_RH::OWNER, null, primTempl, null, null);
// 3) Making this key object persistent
TPM_HANDLE& keyHandle = storagePrimary.handle;
TPM_HANDLE persistentHandle = TPM_HANDLE::Persistent(1000);
ByteVec name = { 1, 2, 3, 4 };
persistentHandle.SetName(name);
tpm._AllowErrors().EvictControl(TPM_RH::OWNER, persistentHandle, persistentHandle);
tpm.EvictControl(TPM_RH::OWNER, storagePrimary.handle, persistentHandle);
tpm.FlushContext(storagePrimary.handle);
// 4) Trying to encrypt data with persistent RSA key
auto enc = tpm[sess].RSA_Encrypt(persistentHandle, dataToEncrypt, TPMS_NULL_ASYM_SCHEME(), null);
cout << "RSA-encrypted data: " << enc << endl;
This row leads to error TPM_RC::BAD_AUTH. What am I doing wrong?
auto enc = tpm[sess].RSA_Encrypt(persistentHandle, dataToEncrypt, TPMS_NULL_ASYM_SCHEME(), null);
When I perform encryption with not persistent key handle, using encryption session, everything works fine.
auto enc = tpm[sess].RSA_Encrypt(keyHandle, dataToEncrypt, TPMS_NULL_ASYM_SCHEME(), null);