summaryrefslogtreecommitdiffstats
path: root/src/crypt/cryptaes.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/crypt/cryptaes.cpp')
-rw-r--r--src/crypt/cryptaes.cpp111
1 files changed, 111 insertions, 0 deletions
diff --git a/src/crypt/cryptaes.cpp b/src/crypt/cryptaes.cpp
new file mode 100644
index 0000000..b74ae03
--- /dev/null
+++ b/src/crypt/cryptaes.cpp
@@ -0,0 +1,111 @@
+#include "cryptaes.h"
+
+CryptAes::CryptAes()
+ : CryptClassEvp()
+{
+ m_iv = QByteArray(16, 0);
+}
+
+const EVP_CIPHER *CryptAes::algorithm()
+{
+ switch (m_keyLength)
+ {
+ case 128:
+
+ return EVP_aes_128_cbc();
+ break;
+
+ case 192:
+
+ return EVP_aes_192_cbc();
+ break;
+
+ case 256:
+
+ return EVP_aes_256_cbc();
+ break;
+ }
+
+ return EVP_enc_null();
+}
+
+
+void CryptAes::encrypt()
+{
+ EVP_MD_CTX *ctx;
+
+ /* Create and initialise the context */
+ if (!(ctx = EVP_MD_CTX_create()))
+ {
+ handleOpenSslError();
+ }
+
+ /* Initialise the encryption operation. IMPORTANT - ensure you use a key
+ * and IV size appropriate for your cipher */
+ if (1 != EVP_DigestInit_ex(ctx, EVP_sha256(), NULL))
+ {
+ handleOpenSslError();
+ }
+
+ /* Provide the message to be encrypted, and obtain the encrypted output.
+ * EVP_EncryptUpdate can be called multiple times if necessary
+ */
+ if (1 != EVP_DigestUpdate(ctx, m_key.data(), m_key.size()))
+ {
+ handleOpenSslError();
+ }
+
+ m_key = QByteArray(256, 0);
+
+ /* Finalise the encryption. Further ciphertext bytes may be written at
+ * this stage.
+ */
+ if (1 != EVP_DigestFinal_ex(ctx, (unsigned char *) m_key.data(), NULL))
+ {
+ handleOpenSslError();
+ }
+
+ EVP_MD_CTX_destroy(ctx);
+
+ CryptClassEvp::encrypt();
+}
+
+void CryptAes::decrypt()
+{
+ EVP_MD_CTX *ctx;
+
+ /* Create and initialise the context */
+ if (!(ctx = EVP_MD_CTX_create()))
+ {
+ handleOpenSslError();
+ }
+
+ /* Initialise the encryption operation. IMPORTANT - ensure you use a key
+ * and IV size appropriate for your cipher */
+ if (1 != EVP_DigestInit_ex(ctx, EVP_sha256(), NULL))
+ {
+ handleOpenSslError();
+ }
+
+ /* Provide the message to be encrypted, and obtain the encrypted output.
+ * EVP_EncryptUpdate can be called multiple times if necessary
+ */
+ if (1 != EVP_DigestUpdate(ctx, m_key.data(), m_key.size()))
+ {
+ handleOpenSslError();
+ }
+
+ m_key = QByteArray(256, 0);
+
+ /* Finalise the encryption. Further ciphertext bytes may be written at
+ * this stage.
+ */
+ if (1 != EVP_DigestFinal_ex(ctx, (unsigned char *) m_key.data(), NULL))
+ {
+ handleOpenSslError();
+ }
+
+ EVP_MD_CTX_destroy(ctx);
+
+ CryptClassEvp::decrypt();
+}