mirror of
https://github.com/keepassxreboot/keepassxc.git
synced 2025-10-21 18:06:13 -04:00
Merge branch 'release/2.2.2' into develop
This commit is contained in:
commit
b510243dd8
15 changed files with 498 additions and 153 deletions
|
@ -23,88 +23,136 @@ QTEST_GUILESS_MAIN(TestBase32)
|
|||
|
||||
void TestBase32::testDecode()
|
||||
{
|
||||
// 3 quantums, all upper case + padding
|
||||
// 3 quanta, all upper case + padding
|
||||
QByteArray encodedData = "JBSWY3DPEB3W64TMMQXC4LQ=";
|
||||
auto data = Base32::decode(encodedData);
|
||||
QCOMPARE(QString::fromLatin1(data.valueOr("ERROR")), QString("Hello world..."));
|
||||
QVariant data = Base32::decode(encodedData);
|
||||
QString expectedData = "Hello world...";
|
||||
QVERIFY(!data.isNull());
|
||||
QCOMPARE(data.toString(), expectedData);
|
||||
QVERIFY(data.value<QByteArray>().size() == expectedData.size());
|
||||
|
||||
// 4 quantums, all upper case
|
||||
// 4 quanta, all upper case
|
||||
encodedData = "GEZDGNBVGY3TQOJQGEZDGNBVGY3TQOJQ";
|
||||
data = Base32::decode(encodedData);
|
||||
QCOMPARE(QString::fromLatin1(data.valueOr("ERROR")), QString("12345678901234567890"));
|
||||
expectedData = "12345678901234567890";
|
||||
QVERIFY(!data.isNull());
|
||||
QCOMPARE(data.toString(), expectedData);
|
||||
QVERIFY(data.value<QByteArray>().size() == expectedData.size());
|
||||
|
||||
// 4 quantums, all lower case
|
||||
// 4 quanta, all lower case
|
||||
encodedData = "gezdgnbvgy3tqojqgezdgnbvgy3tqojq";
|
||||
data = Base32::decode(encodedData);
|
||||
QCOMPARE(QString::fromLatin1(data.valueOr("ERROR")), QString("12345678901234567890"));
|
||||
expectedData = "12345678901234567890";
|
||||
QVERIFY(!data.isNull());
|
||||
QCOMPARE(data.toString(), expectedData);
|
||||
QVERIFY(data.value<QByteArray>().size() == expectedData.size());
|
||||
|
||||
// 4 quantums, mixed upper and lower case
|
||||
// 4 quanta, mixed upper and lower case
|
||||
encodedData = "Gezdgnbvgy3tQojqgezdGnbvgy3tQojQ";
|
||||
data = Base32::decode(encodedData);
|
||||
QCOMPARE(QString::fromLatin1(data.valueOr("ERROR")), QString("12345678901234567890"));
|
||||
expectedData = "12345678901234567890";
|
||||
QVERIFY(!data.isNull());
|
||||
QCOMPARE(data.toString(), expectedData);
|
||||
QVERIFY(data.value<QByteArray>().size() == expectedData.size());
|
||||
|
||||
// 1 pad characters
|
||||
encodedData = "ORSXG5A=";
|
||||
data = Base32::decode(encodedData);
|
||||
QCOMPARE(QString::fromLatin1(data.valueOr("ERROR")), QString("test"));
|
||||
expectedData = "test";
|
||||
QVERIFY(!data.isNull());
|
||||
QCOMPARE(data.toString(), expectedData);
|
||||
QVERIFY(data.value<QByteArray>().size() == expectedData.size());
|
||||
|
||||
// 3 pad characters
|
||||
encodedData = "L5PV6===";
|
||||
data = Base32::decode(encodedData);
|
||||
QCOMPARE(QString::fromLatin1(data.valueOr("ERROR")), QString("___"));
|
||||
expectedData = "___";
|
||||
QVERIFY(!data.isNull());
|
||||
QCOMPARE(data.toString(), expectedData);
|
||||
QVERIFY(data.value<QByteArray>().size() == expectedData.size());
|
||||
|
||||
// 4 pad characters
|
||||
encodedData = "MZXW6IDCMFZA====";
|
||||
data = Base32::decode(encodedData);
|
||||
QCOMPARE(QString::fromLatin1(data.valueOr("ERROR")), QString("foo bar"));
|
||||
expectedData = "foo bar";
|
||||
QVERIFY(!data.isNull());
|
||||
QCOMPARE(data.toString(), expectedData);
|
||||
QVERIFY(data.value<QByteArray>().size() == expectedData.size());
|
||||
|
||||
// six pad characters
|
||||
encodedData = "MZXW6YTBOI======";
|
||||
data = Base32::decode(encodedData);
|
||||
QCOMPARE(QString::fromLatin1(data.valueOr("ERROR")), QString("foobar"));
|
||||
expectedData = "foobar";
|
||||
QVERIFY(!data.isNull());
|
||||
QCOMPARE(data.toString(), expectedData);
|
||||
QVERIFY(data.value<QByteArray>().size() == expectedData.size());
|
||||
|
||||
encodedData = "IA======";
|
||||
data = Base32::decode(encodedData);
|
||||
QCOMPARE(QString::fromLatin1(data.valueOr("ERROR")), QString("@"));
|
||||
expectedData = "@";
|
||||
QVERIFY(!data.isNull());
|
||||
QCOMPARE(data.toString(), expectedData);
|
||||
QVERIFY(data.value<QByteArray>().size() == expectedData.size());
|
||||
|
||||
// error: illegal character
|
||||
encodedData = "1MZXW6YTBOI=====";
|
||||
data = Base32::decode(encodedData);
|
||||
QCOMPARE(QString::fromLatin1(data.valueOr("ERROR")), QString("ERROR"));
|
||||
QVERIFY(data.isNull());
|
||||
|
||||
// error: missing pad character
|
||||
encodedData = "MZXW6YTBOI=====";
|
||||
data = Base32::decode(encodedData);
|
||||
QCOMPARE(QString::fromLatin1(data.valueOr("ERROR")), QString("ERROR"));
|
||||
QVERIFY(data.isNull());
|
||||
|
||||
// RFC 4648 test vectors
|
||||
encodedData = "";
|
||||
data = Base32::decode(encodedData);
|
||||
QCOMPARE(QString::fromLatin1(data.valueOr("ERROR")), QString(""));
|
||||
expectedData = "";
|
||||
QVERIFY(!data.isNull());
|
||||
QCOMPARE(data.toString(), expectedData);
|
||||
QVERIFY(data.value<QByteArray>().size() == expectedData.size());
|
||||
|
||||
encodedData = "MY======";
|
||||
data = Base32::decode(encodedData);
|
||||
QCOMPARE(QString::fromLatin1(data.valueOr("ERROR")), QString("f"));
|
||||
expectedData = "f";
|
||||
QVERIFY(!data.isNull());
|
||||
QCOMPARE(data.toString(), expectedData);
|
||||
QVERIFY(data.value<QByteArray>().size() == expectedData.size());
|
||||
|
||||
encodedData = "MZXQ====";
|
||||
data = Base32::decode(encodedData);
|
||||
QCOMPARE(QString::fromLatin1(data.valueOr("ERROR")), QString("fo"));
|
||||
expectedData = "fo";
|
||||
QVERIFY(!data.isNull());
|
||||
QCOMPARE(data.toString(), expectedData);
|
||||
QVERIFY(data.value<QByteArray>().size() == expectedData.size());
|
||||
|
||||
encodedData = "MZXW6===";
|
||||
data = Base32::decode(encodedData);
|
||||
QCOMPARE(QString::fromLatin1(data.valueOr("ERROR")), QString("foo"));
|
||||
QVERIFY(!data.isNull());
|
||||
expectedData = "foo";
|
||||
QCOMPARE(data.toString(), expectedData);
|
||||
QVERIFY(data.value<QByteArray>().size() == expectedData.size());
|
||||
|
||||
encodedData = "MZXW6YQ=";
|
||||
data = Base32::decode(encodedData);
|
||||
QCOMPARE(QString::fromLatin1(data.valueOr("ERROR")), QString("foob"));
|
||||
expectedData = "foob";
|
||||
QVERIFY(!data.isNull());
|
||||
QCOMPARE(data.toString(), expectedData);
|
||||
QVERIFY(data.value<QByteArray>().size() == expectedData.size());
|
||||
|
||||
encodedData = "MZXW6YTB";
|
||||
expectedData = "fooba";
|
||||
data = Base32::decode(encodedData);
|
||||
QCOMPARE(QString::fromLatin1(data.valueOr("ERROR")), QString("fooba"));
|
||||
QVERIFY(!data.isNull());
|
||||
QCOMPARE(data.toString(), expectedData);
|
||||
QVERIFY(data.value<QByteArray>().size() == expectedData.size());
|
||||
|
||||
encodedData = "MZXW6YTBOI======";
|
||||
data = Base32::decode(encodedData);
|
||||
QCOMPARE(QString::fromLatin1(data.valueOr("ERROR")), QString("foobar"));
|
||||
expectedData = "foobar";
|
||||
QVERIFY(!data.isNull());
|
||||
QCOMPARE(data.toString(), expectedData);
|
||||
QVERIFY(data.value<QByteArray>().size() == expectedData.size());
|
||||
}
|
||||
|
||||
void TestBase32::testEncode()
|
||||
|
@ -115,7 +163,7 @@ void TestBase32::testEncode()
|
|||
|
||||
data = "12345678901234567890";
|
||||
encodedData = Base32::encode(data);
|
||||
QCOMPARE(encodedData, QByteArray("GEZDGNBVGY3TQOJQGEZDGNBVGY3TQOJQ"));
|
||||
QCOMPARE(encodedData, QByteArray("GEZDGNBVGY3TQOJQGEZDGNBVGY3TQOJQ"));
|
||||
|
||||
data = "012345678901234567890";
|
||||
encodedData = Base32::encode(data);
|
||||
|
@ -123,46 +171,160 @@ void TestBase32::testEncode()
|
|||
|
||||
data = "test";
|
||||
encodedData = Base32::encode(data);
|
||||
QCOMPARE(encodedData, QByteArray("ORSXG5A="));
|
||||
QCOMPARE(encodedData, QByteArray("ORSXG5A="));
|
||||
|
||||
data = "___";
|
||||
encodedData = Base32::encode(data);
|
||||
QCOMPARE(encodedData, QByteArray("L5PV6==="));
|
||||
QCOMPARE(encodedData, QByteArray("L5PV6==="));
|
||||
|
||||
data = "foo bar";
|
||||
encodedData = Base32::encode(data);
|
||||
QCOMPARE(encodedData, QByteArray("MZXW6IDCMFZA===="));
|
||||
QCOMPARE(encodedData, QByteArray("MZXW6IDCMFZA===="));
|
||||
|
||||
data = "@";
|
||||
encodedData = Base32::encode(data);
|
||||
QCOMPARE(encodedData, QByteArray("IA======"));
|
||||
QCOMPARE(encodedData, QByteArray("IA======"));
|
||||
|
||||
// RFC 4648 test vectors
|
||||
data = "";
|
||||
encodedData = Base32::encode(data);
|
||||
QCOMPARE(encodedData, QByteArray(""));
|
||||
QCOMPARE(encodedData, QByteArray(""));
|
||||
|
||||
data = "f";
|
||||
encodedData = Base32::encode(data);
|
||||
QCOMPARE(encodedData, QByteArray("MY======"));
|
||||
QCOMPARE(encodedData, QByteArray("MY======"));
|
||||
|
||||
data = "fo";
|
||||
encodedData = Base32::encode(data);
|
||||
QCOMPARE(encodedData, QByteArray("MZXQ===="));
|
||||
QCOMPARE(encodedData, QByteArray("MZXQ===="));
|
||||
|
||||
data = "foo";
|
||||
encodedData = Base32::encode(data);
|
||||
QCOMPARE(encodedData, QByteArray("MZXW6==="));
|
||||
|
||||
|
||||
data = "foob";
|
||||
encodedData = Base32::encode(data);
|
||||
QCOMPARE(encodedData, QByteArray("MZXW6YQ="));
|
||||
QCOMPARE(encodedData, QByteArray("MZXW6YQ="));
|
||||
|
||||
data = "fooba";
|
||||
encodedData = Base32::encode(data);
|
||||
QCOMPARE(encodedData, QByteArray("MZXW6YTB"));
|
||||
QCOMPARE(encodedData, QByteArray("MZXW6YTB"));
|
||||
|
||||
data = "foobar";
|
||||
encodedData = Base32::encode(data);
|
||||
QCOMPARE(encodedData, QByteArray("MZXW6YTBOI======"));
|
||||
QCOMPARE(encodedData, QByteArray("MZXW6YTBOI======"));
|
||||
}
|
||||
|
||||
void TestBase32::testAddPadding()
|
||||
{
|
||||
// Empty. Invalid, returns input.
|
||||
QByteArray data = "";
|
||||
QByteArray paddedData = Base32::addPadding(data);
|
||||
QCOMPARE(paddedData, data);
|
||||
|
||||
// One byte of encoded data. Invalid, returns input.
|
||||
data = "B";
|
||||
paddedData = Base32::addPadding(data);
|
||||
QCOMPARE(paddedData, data);
|
||||
|
||||
// Two bytes of encoded data.
|
||||
data = "BB";
|
||||
paddedData = Base32::addPadding(data);
|
||||
QCOMPARE(paddedData, QByteArray("BB======"));
|
||||
|
||||
// Three bytes of encoded data. Invalid, returns input.
|
||||
data = "BBB";
|
||||
paddedData = Base32::addPadding(data);
|
||||
QCOMPARE(paddedData, data);
|
||||
|
||||
// Four bytes of encoded data.
|
||||
data = "BBBB";
|
||||
paddedData = Base32::addPadding(data);
|
||||
QCOMPARE(paddedData, QByteArray("BBBB===="));
|
||||
|
||||
// Five bytes of encoded data.
|
||||
data = "BBBBB";
|
||||
paddedData = Base32::addPadding(data);
|
||||
QCOMPARE(paddedData, QByteArray("BBBBB==="));
|
||||
|
||||
// Six bytes of encoded data. Invalid, returns input.
|
||||
data = "BBBBBB";
|
||||
paddedData = Base32::addPadding(data);
|
||||
QCOMPARE(paddedData, data);
|
||||
|
||||
// Seven bytes of encoded data.
|
||||
data = "BBBBBBB";
|
||||
paddedData = Base32::addPadding(data);
|
||||
QCOMPARE(paddedData, QByteArray("BBBBBBB="));
|
||||
|
||||
// Eight bytes of encoded data. Valid, but returns same as input.
|
||||
data = "BBBBBBBB";
|
||||
paddedData = Base32::addPadding(data);
|
||||
QCOMPARE(paddedData, data);
|
||||
|
||||
// More than eight bytes (8+5).
|
||||
data = "AAAAAAAABBBBB";
|
||||
paddedData = Base32::addPadding(data);
|
||||
QCOMPARE(paddedData, QByteArray("AAAAAAAABBBBB==="));
|
||||
}
|
||||
|
||||
void TestBase32::testRemovePadding()
|
||||
{
|
||||
QByteArray data = "";
|
||||
QByteArray unpaddedData = Base32::removePadding(data);
|
||||
QCOMPARE(unpaddedData, data);
|
||||
|
||||
data = "AAAAAAAABB======";
|
||||
unpaddedData = Base32::removePadding(data);
|
||||
QCOMPARE(unpaddedData, QByteArray("AAAAAAAABB"));
|
||||
|
||||
data = "BBBB====";
|
||||
unpaddedData = Base32::removePadding(data);
|
||||
QCOMPARE(unpaddedData, QByteArray("BBBB"));
|
||||
|
||||
data = "AAAAAAAABBBBB===";
|
||||
unpaddedData = Base32::removePadding(data);
|
||||
QCOMPARE(unpaddedData, QByteArray("AAAAAAAABBBBB"));
|
||||
|
||||
data = "BBBBBBB=";
|
||||
unpaddedData = Base32::removePadding(data);
|
||||
QCOMPARE(unpaddedData, QByteArray("BBBBBBB"));
|
||||
|
||||
// Invalid: 7 bytes of data. Returns same as input.
|
||||
data = "IIIIIII";
|
||||
unpaddedData = Base32::removePadding(data);
|
||||
QCOMPARE(unpaddedData, data);
|
||||
|
||||
// Invalid: more padding than necessary. Returns same as input.
|
||||
data = "AAAAAAAABBBB=====";
|
||||
unpaddedData = Base32::removePadding(data);
|
||||
QCOMPARE(unpaddedData, data);
|
||||
}
|
||||
|
||||
void TestBase32::testSanitizeInput()
|
||||
{
|
||||
// sanitize input (white space + missing padding)
|
||||
QByteArray encodedData = "JBSW Y3DP EB3W 64TM MQXC 4LQA";
|
||||
auto data = Base32::decode(Base32::sanitizeInput(encodedData));
|
||||
QVERIFY(!data.isNull());
|
||||
QCOMPARE(data.toString(), QString("Hello world..."));
|
||||
|
||||
// sanitize input (typo + missing padding)
|
||||
encodedData = "J8SWY3DPE83W64TMMQXC4LQA";
|
||||
data = Base32::decode(Base32::sanitizeInput(encodedData));
|
||||
QVERIFY(!data.isNull());
|
||||
QCOMPARE(data.toString(), QString("Hello world..."));
|
||||
|
||||
// sanitize input (other illegal characters)
|
||||
encodedData = "J8SWY3D[PE83W64TMMQ]XC!4LQA";
|
||||
data = Base32::decode(Base32::sanitizeInput(encodedData));
|
||||
QVERIFY(!data.isNull());
|
||||
QCOMPARE(data.toString(), QString("Hello world..."));
|
||||
|
||||
// sanitize input (NUL character)
|
||||
encodedData = "J8SWY3DPE83W64TMMQXC4LQA";
|
||||
encodedData.insert(3, '\0');
|
||||
data = Base32::decode(Base32::sanitizeInput(encodedData));
|
||||
QVERIFY(!data.isNull());
|
||||
QCOMPARE(data.toString(), QString("Hello world..."));
|
||||
}
|
||||
|
|
|
@ -29,6 +29,9 @@ class TestBase32 : public QObject
|
|||
private slots:
|
||||
void testEncode();
|
||||
void testDecode();
|
||||
void testAddPadding();
|
||||
void testRemovePadding();
|
||||
void testSanitizeInput();
|
||||
};
|
||||
|
||||
#endif // KEEPASSX_TESTBASE32_H
|
||||
|
|
|
@ -18,11 +18,11 @@
|
|||
|
||||
#include "TestTotp.h"
|
||||
|
||||
#include <QTest>
|
||||
#include <QTime>
|
||||
#include <QDateTime>
|
||||
#include <QtEndian>
|
||||
#include <QTest>
|
||||
#include <QTextCodec>
|
||||
#include <QTime>
|
||||
#include <QtEndian>
|
||||
|
||||
#include "crypto/Crypto.h"
|
||||
#include "totp/totp.h"
|
||||
|
@ -34,12 +34,13 @@ void TestTotp::initTestCase()
|
|||
QVERIFY(Crypto::init());
|
||||
}
|
||||
|
||||
|
||||
void TestTotp::testParseSecret()
|
||||
{
|
||||
quint8 digits = 0;
|
||||
quint8 step = 0;
|
||||
QString secret = "otpauth://totp/ACME%20Co:john@example.com?secret=HXDMVJECJJWSRB3HWIZR4IFUGFTMXBOZ&issuer=ACME%20Co&algorithm=SHA1&digits=6&period=30";
|
||||
QString secret = "otpauth://totp/"
|
||||
"ACME%20Co:john@example.com?secret=HXDMVJECJJWSRB3HWIZR4IFUGFTMXBOZ&issuer=ACME%20Co&algorithm="
|
||||
"SHA1&digits=6&period=30";
|
||||
QCOMPARE(QTotp::parseOtpString(secret, digits, step), QString("HXDMVJECJJWSRB3HWIZR4IFUGFTMXBOZ"));
|
||||
QCOMPARE(digits, quint8(6));
|
||||
QCOMPARE(step, quint8(30));
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue