in cvm-securekey-release-app/AttestationUtil.cpp [917:968]
int rsa_decrypt(EVP_PKEY *pkey, const PBYTE msg, size_t msglen, PBYTE *dec, size_t *declen)
{
TRACE_OUT("Entering rsa_decrypt()");
int ret = -1;
EVP_PKEY_CTX *ctx = NULL;
size_t outlen;
// Create the context for the encryption operation
ctx = EVP_PKEY_CTX_new(pkey, NULL);
if (!ctx)
handleErrors();
// Initialize the encryption operation
if (EVP_PKEY_decrypt_init(ctx) <= 0)
handleErrors();
#if defined(OPENSSL_VERSION_MAJOR) && OPENSSL_VERSION_MAJOR >= 3
// TODO: investiagate why setting padding and md algorithms causing SIGSEGV in OSSL 3.x
#else
// Set the RSA padding mode to PKCS #1 OAEP
if (EVP_PKEY_CTX_set_rsa_padding(ctx, RSA_PKCS1_OAEP_PADDING) <= 0)
handleErrors();
// Set RSA signature scheme to SHA256
if (EVP_PKEY_CTX_set_rsa_oaep_md(ctx, EVP_sha256()) <= 0) // TODO: can be a parameter
handleErrors();
#endif
// Determine the buffer length for the encrypted data
if (EVP_PKEY_decrypt(ctx, NULL, &outlen, msg, msglen) <= 0)
handleErrors();
// Allocate memory for the encrypted data
*dec = (PBYTE)OPENSSL_malloc(outlen);
if (!*dec)
handleErrors();
// Perform the encryption operation
if (EVP_PKEY_decrypt(ctx, *dec, &outlen, msg, msglen) <= 0)
handleErrors();
// Set the encrypted data length
*declen = outlen;
// Clean up and return success
ret = 0;
EVP_PKEY_CTX_free(ctx);
TRACE_OUT("Exiting rsa_decrypt()");
return ret;
}