#include "cryptclassevp.h" CryptClassEvp::CryptClassEvp() : CryptClassBase() { ERR_load_crypto_strings(); OpenSSL_add_all_algorithms(); } CryptClassEvp::~CryptClassEvp() { EVP_cleanup(); ERR_free_strings(); } void CryptClassEvp::encrypt() { m_cryptText = QByteArray(m_clearText.size(), 0); EVP_CIPHER_CTX *ctx; int len = 0; int ciphertext_len = 0; /* Create and initialise the context */ if (!(ctx = EVP_CIPHER_CTX_new())) { handleOpenSslError(); } /* Initialise the encryption operation. IMPORTANT - ensure you use a key * and IV size appropriate for your cipher */ if (1 != EVP_EncryptInit_ex(ctx, algorithm(), NULL, (unsigned char *) getKey().data(), (unsigned char *) getIV().data())) { handleOpenSslError(); } /* Provide the message to be encrypted, and obtain the encrypted output. * EVP_EncryptUpdate can be called multiple times if necessary */ if (1 != EVP_EncryptUpdate(ctx, (unsigned char *) m_cryptText.data(), &len, (unsigned char *) m_clearText.data(), m_clearText.length())) { handleOpenSslError(); } ciphertext_len = len; /* Finalise the encryption. Further ciphertext bytes may be written at * this stage. */ if (1 != EVP_EncryptFinal_ex(ctx, (unsigned char *)(m_cryptText.data() + len), &len)) { handleOpenSslError(); } ciphertext_len += len; m_cryptText.resize(ciphertext_len); /* Clean up */ EVP_CIPHER_CTX_free(ctx); } void CryptClassEvp::decrypt() { m_clearText = QByteArray(m_cryptText.size(), 0); EVP_CIPHER_CTX *ctx; int len; int plaintext_len; /* Create and initialise the context */ if (!(ctx = EVP_CIPHER_CTX_new())) { handleOpenSslError(); } /* Initialise the decryption operation. IMPORTANT - ensure you use a key * and IV size appropriate for your cipher */ if (1 != EVP_DecryptInit_ex(ctx, algorithm(), NULL, (unsigned char *) getKey().data(), (unsigned char *) getIV().data())) { handleOpenSslError(); } /* Provide the message to be decrypted, and obtain the plaintext output. * EVP_DecryptUpdate can be called multiple times if necessary */ if (1 != EVP_DecryptUpdate(ctx, (unsigned char*) m_clearText.data(), &len, (unsigned char*) m_cryptText.data(), m_cryptText.length())) { handleOpenSslError(); } plaintext_len = len; /* Finalise the decryption. Further plaintext bytes may be written at * this stage. */ if (1 != EVP_DecryptFinal_ex(ctx, (unsigned char*) m_cryptText.data() + len, &len)) { handleOpenSslError(); } plaintext_len += len; m_clearText.resize(plaintext_len); /* Clean up */ EVP_CIPHER_CTX_free(ctx); } void CryptClassEvp::handleOpenSslError() { throw std::runtime_error(ERR_reason_error_string(ERR_get_error())); }