From 8f5835824c4be7e72195d6c3fce18d85c079c31e Mon Sep 17 00:00:00 2001 From: Stefan Suhren Date: Tue, 19 May 2015 13:13:20 +0200 Subject: First try of using the EVP null chipher from OpenSSL --- src/crypt/cryptclassnullcipher.cpp | 67 +++++++++++++++++++++++++++++++++++++- src/crypt/cryptclassnullcipher.h | 15 ++++++++- 2 files changed, 80 insertions(+), 2 deletions(-) diff --git a/src/crypt/cryptclassnullcipher.cpp b/src/crypt/cryptclassnullcipher.cpp index b4ed284..c30b2e2 100644 --- a/src/crypt/cryptclassnullcipher.cpp +++ b/src/crypt/cryptclassnullcipher.cpp @@ -3,15 +3,80 @@ CryptClassNullCipher::CryptClassNullCipher() : CryptClassBase() { + ERR_load_crypto_strings(); + OpenSSL_add_all_algorithms(); +} +CryptClassNullCipher::~CryptClassNullCipher() +{ + EVP_cleanup(); + ERR_free_strings(); } void CryptClassNullCipher::encrypt() { - m_cryptText = m_clearText; + // int encrypt(unsigned char *plaintext, int plaintext_len, unsigned char *key, + // unsigned char *iv, unsigned char *ciphertext) + + m_cryptText = QByteArray(m_clearText.size() + 50, 0); + + EVP_CIPHER_CTX *ctx; + + int len; + + int ciphertext_len; + + /* Create and initialise the context */ + if (!(ctx = EVP_CIPHER_CTX_new())) + { + qDebug() << "EVP_CIPHER_CTX_new"; + handleErrors(); + } + + /* Initialise the encryption operation. IMPORTANT - ensure you use a key + * and IV size appropriate for your cipher + * In this example we are using 256 bit AES (i.e. a 256 bit key). The + * IV size for *most* modes is the same as the block size. For AES this + * is 128 bits */ + if (1 != EVP_EncryptInit_ex(ctx, EVP_enc_null(), NULL, NULL, NULL)) + { + qDebug() << "EVP_EncryptInit_ex"; + handleErrors(); + } + + /* 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())) + { + qDebug() << "EVP_EncryptUpdate"; + handleErrors(); + } + + 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)) + { + qDebug() << "EVP_EncryptFinal_ex"; + handleErrors(); + } + + ciphertext_len += len; + + /* Clean up */ + EVP_CIPHER_CTX_free(ctx); } void CryptClassNullCipher::decrypt() { m_clearText = m_cryptText; } + +void CryptClassNullCipher::handleErrors() +{ + qDebug() << ERR_get_error(); + abort(); +} diff --git a/src/crypt/cryptclassnullcipher.h b/src/crypt/cryptclassnullcipher.h index 6b3c284..ae05ef6 100644 --- a/src/crypt/cryptclassnullcipher.h +++ b/src/crypt/cryptclassnullcipher.h @@ -3,7 +3,11 @@ #include "cryptclassbase.h" +#include + #include +#include +#include /** @@ -23,10 +27,16 @@ public: //Methods /** * \brief Class Constructor. * - * Class Constructor. Does nothing. + * Class Constructor. Initializes openssl. */ CryptClassNullCipher(); + /** + * \brief Class Destructor. + * + * Class Destructor. Deinitializes openssl. + */ + ~CryptClassNullCipher(); /** * \brief Overloaded Method to encrypt present unencrypted data using the current key. @@ -44,6 +54,9 @@ public: //Methods * Data is copied from m_cryptText to m_clearText. */ virtual void decrypt(); + +private: + void handleErrors(); }; #endif // CRYPTCLASSNULLCIPHER_H -- cgit v1.2.3-70-g09d2