test: Add build system support and a main function for unit tests
[quassel.git] / src / core / cipher.cpp
index 15a986b..c5a40c2 100644 (file)
@@ -13,7 +13,7 @@
 */
 
 #include "cipher.h"
-#include "logger.h"
+#include "logmessage.h"
 
 Cipher::Cipher()
 {
@@ -30,9 +30,6 @@ Cipher::Cipher(QByteArray key, QString cipherType)
 }
 
 
-Cipher::~Cipher()
-{}
-
 bool Cipher::setKey(QByteArray key)
 {
     if (key.isEmpty()) {
@@ -56,7 +53,8 @@ bool Cipher::setKey(QByteArray key)
 //    if(Preferences::self()->encryptionType())
 //      m_cbc = true;
 //    else
-        m_cbc = false;
+//    default to CBC
+        m_cbc = true;
         m_key = key;
     }
     return true;
@@ -117,7 +115,6 @@ QByteArray Cipher::decrypt(QByteArray cipherText)
     // (if cbc and no error we parse cbc) || (if ecb and error we parse cbc)
     if ((m_cbc && !error) || (!m_cbc && error))
     {
-        cipherText = cipherText;
         temp = blowfishCBC(cipherText, false);
 
         if (temp == cipherText)
@@ -170,6 +167,13 @@ QByteArray Cipher::initKeyExchange()
 QByteArray Cipher::parseInitKeyX(QByteArray key)
 {
     QCA::Initializer init;
+    bool isCBC = false;
+
+    if (key.endsWith(" CBC"))
+    {
+        isCBC = true;
+        key.chop(4);
+    }
 
     if (key.length() != 181)
         return QByteArray();
@@ -198,6 +202,9 @@ QByteArray Cipher::parseInitKeyX(QByteArray key)
     //remove trailing = because mircryption and fish think it's a swell idea.
     while (sharedKey.endsWith('=')) sharedKey.chop(1);
 
+    if (isCBC)
+        sharedKey.prepend("cbc:");
+
     bool success = setKey(sharedKey);
 
     if (!success)
@@ -354,6 +361,10 @@ QByteArray Cipher::blowfishECB(QByteArray cipherText, bool direction)
     }
     else
     {
+        // ECB Blowfish encodes in blocks of 12 chars, so anything else is malformed input
+        if ((temp.length() % 12) != 0)
+            return cipherText;
+
         temp = b64ToByte(temp);
         while ((temp.length() % 8) != 0) temp.append('\0');
     }
@@ -366,8 +377,13 @@ QByteArray Cipher::blowfishECB(QByteArray cipherText, bool direction)
     if (!cipher.ok())
         return cipherText;
 
-    if (direction)
+    if (direction) {
+        // Sanity check
+        if ((temp2.length() % 8) != 0)
+            return cipherText;
+
         temp2 = byteToB64(temp2);
+    }
 
     return temp2;
 }
@@ -410,13 +426,13 @@ QByteArray Cipher::byteToB64(QByteArray text)
         right += v;
 
         for (int i = 0; i < 6; i++) {
-            encoded.append(base64.at(right & 0x3F).toAscii());
+            encoded.append(base64.at(right & 0x3F).toLatin1());
             right = right >> 6;
         }
 
-        //TODO make sure the .toascii doesn't break anything
+        //TODO make sure the .toLatin1 doesn't break anything
         for (int i = 0; i < 6; i++) {
-            encoded.append(base64.at(left & 0x3F).toAscii());
+            encoded.append(base64.at(left & 0x3F).toLatin1());
             left = left >> 6;
         }
     }
@@ -473,6 +489,5 @@ bool Cipher::neededFeaturesAvailable()
     if (QCA::isSupported("blowfish-ecb") && QCA::isSupported("blowfish-cbc") && QCA::isSupported("dh"))
         return true;
 
-    qWarning() << "QCA provider plugin not found. It is usually provided by the qca-ossl plugin.";
     return false;
 }