diff --git a/src/core/Tools.cpp b/src/core/Tools.cpp index 8034417f..8ed08336 100644 --- a/src/core/Tools.cpp +++ b/src/core/Tools.cpp @@ -160,6 +160,16 @@ bool isHex(const QByteArray& ba) return true; } +bool isBase64(const QByteArray& ba) +{ + QRegExp regexp("^(?:[a-z0-9+/]{4})*(?:[a-z0-9+/]{3}=|[a-z0-9+/]{2}==)?$", + Qt::CaseInsensitive, QRegExp::RegExp2); + + QString base64 = QString::fromLatin1(ba.constData(), ba.size()); + + return regexp.exactMatch(base64); +} + void sleep(int ms) { Q_ASSERT(ms >= 0); diff --git a/src/core/Tools.h b/src/core/Tools.h index 8058f251..3854507b 100644 --- a/src/core/Tools.h +++ b/src/core/Tools.h @@ -35,6 +35,7 @@ bool readAllFromDevice(QIODevice* device, QByteArray& data); QDateTime currentDateTimeUtc(); QString imageReaderFilter(); bool isHex(const QByteArray& ba); +bool isBase64(const QByteArray& ba); void sleep(int ms); void wait(int ms); QString platform(); diff --git a/src/keys/FileKey.cpp b/src/keys/FileKey.cpp index f03a6953..d399f545 100644 --- a/src/keys/FileKey.cpp +++ b/src/keys/FileKey.cpp @@ -211,7 +211,10 @@ QByteArray FileKey::loadXmlKey(QXmlStreamReader& xmlReader) while (!xmlReader.error() && xmlReader.readNextStartElement()) { if (xmlReader.name() == "Data") { // TODO: do we need to enforce a specific data.size()? - data = QByteArray::fromBase64(xmlReader.readElementText().toLatin1()); + QByteArray rawData = xmlReader.readElementText().toLatin1(); + if (Tools::isBase64(rawData)) { + data = QByteArray::fromBase64(rawData); + } } } diff --git a/tests/TestKeys.cpp b/tests/TestKeys.cpp index 770af52d..b6617754 100644 --- a/tests/TestKeys.cpp +++ b/tests/TestKeys.cpp @@ -113,6 +113,7 @@ void TestKeys::testFileKey_data() { QTest::addColumn("type"); QTest::newRow("Xml") << QString("Xml"); + QTest::newRow("XmlBrokenBase64") << QString("XmlBrokenBase64"); QTest::newRow("Binary") << QString("Binary"); QTest::newRow("Hex") << QString("Hex"); QTest::newRow("Hashed") << QString("Hashed"); diff --git a/tests/data/FileKeyXmlBrokenBase64.kdbx b/tests/data/FileKeyXmlBrokenBase64.kdbx new file mode 100644 index 00000000..7c3ee30f Binary files /dev/null and b/tests/data/FileKeyXmlBrokenBase64.kdbx differ diff --git a/tests/data/FileKeyXmlBrokenBase64.key b/tests/data/FileKeyXmlBrokenBase64.key new file mode 100644 index 00000000..530ecec2 --- /dev/null +++ b/tests/data/FileKeyXmlBrokenBase64.key @@ -0,0 +1,9 @@ + + + + 1.00 + + + yy + +