diff options
Diffstat (limited to 'src/crypt/cryptclassevp.cpp')
| -rw-r--r-- | src/crypt/cryptclassevp.cpp | 115 |
1 files changed, 115 insertions, 0 deletions
diff --git a/src/crypt/cryptclassevp.cpp b/src/crypt/cryptclassevp.cpp new file mode 100644 index 0000000..1ee09a0 --- /dev/null +++ b/src/crypt/cryptclassevp.cpp @@ -0,0 +1,115 @@ +#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; + + int ciphertext_len; + + /* 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; + + /* 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; + + /* Clean up */ + EVP_CIPHER_CTX_free(ctx); +} + +void CryptClassEvp::handleOpenSslError() +{ + throw std::runtime_error(ERR_reason_error_string(ERR_get_error())); +} |
