X-Git-Url: https://git.quassel-irc.org/?p=quassel.git;a=blobdiff_plain;f=src%2Fcore%2Fcipher.cpp;h=c5a40c21439e0b08363adc85b73207fdd88b4890;hp=15a986b25e2bd7f502a8f303af58a86d1330ab36;hb=8f2ee00f4edef1693628d3af0bdee84d725eb754;hpb=bae8c28f27159ec803daff083da125b313c128d1 diff --git a/src/core/cipher.cpp b/src/core/cipher.cpp index 15a986b2..c5a40c21 100644 --- a/src/core/cipher.cpp +++ b/src/core/cipher.cpp @@ -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; }