Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/keepassxreboot/keepassxc.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAdolfo E. GarcĂ­a <adolfo.garcia.cr@gmail.com>2017-10-15 07:54:20 +0300
committerJanek Bevendorff <janek@jbev.net>2017-10-21 14:15:02 +0300
commit19eb6a8a60afed2da5733a2eef47de80009f824f (patch)
tree0bb442d17d4554fb78e40c2597ced785d5d37a15 /tests/TestBase32.cpp
parent85f652290b48a2178fef65678889313d838c0f22 (diff)
Add new Base32 implementation
Diffstat (limited to 'tests/TestBase32.cpp')
-rw-r--r--tests/TestBase32.cpp278
1 files changed, 278 insertions, 0 deletions
diff --git a/tests/TestBase32.cpp b/tests/TestBase32.cpp
new file mode 100644
index 000000000..3d829d96b
--- /dev/null
+++ b/tests/TestBase32.cpp
@@ -0,0 +1,278 @@
+/*
+ * Copyright (C) 2017 KeePassXC Team <team@keepassxc.org>
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 2 or (at your option)
+ * version 3 of the License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include "TestBase32.h"
+#include "core/Base32.h"
+#include <QTest>
+
+QTEST_GUILESS_MAIN(TestBase32)
+
+void TestBase32::testDecode()
+{
+ // 3 quanta, all upper case + padding
+ QByteArray encodedData = "JBSWY3DPEB3W64TMMQXC4LQ=";
+ auto data = Base32::decode(encodedData);
+ QCOMPARE(QString::fromLatin1(data.valueOr("ERROR")), QString("Hello world..."));
+
+ // 4 quanta, all upper case
+ encodedData = "GEZDGNBVGY3TQOJQGEZDGNBVGY3TQOJQ";
+ data = Base32::decode(encodedData);
+ QCOMPARE(QString::fromLatin1(data.valueOr("ERROR")), QString("12345678901234567890"));
+
+ // 4 quanta, all lower case
+ encodedData = "gezdgnbvgy3tqojqgezdgnbvgy3tqojq";
+ data = Base32::decode(encodedData);
+ QCOMPARE(QString::fromLatin1(data.valueOr("ERROR")), QString("12345678901234567890"));
+
+ // 4 quanta, mixed upper and lower case
+ encodedData = "Gezdgnbvgy3tQojqgezdGnbvgy3tQojQ";
+ data = Base32::decode(encodedData);
+ QCOMPARE(QString::fromLatin1(data.valueOr("ERROR")), QString("12345678901234567890"));
+
+ // 1 pad characters
+ encodedData = "ORSXG5A=";
+ data = Base32::decode(encodedData);
+ QCOMPARE(QString::fromLatin1(data.valueOr("ERROR")), QString("test"));
+
+ // 3 pad characters
+ encodedData = "L5PV6===";
+ data = Base32::decode(encodedData);
+ QCOMPARE(QString::fromLatin1(data.valueOr("ERROR")), QString("___"));
+
+ // 4 pad characters
+ encodedData = "MZXW6IDCMFZA====";
+ data = Base32::decode(encodedData);
+ QCOMPARE(QString::fromLatin1(data.valueOr("ERROR")), QString("foo bar"));
+
+ // six pad characters
+ encodedData = "MZXW6YTBOI======";
+ data = Base32::decode(encodedData);
+ QCOMPARE(QString::fromLatin1(data.valueOr("ERROR")), QString("foobar"));
+
+ encodedData = "IA======";
+ data = Base32::decode(encodedData);
+ QCOMPARE(QString::fromLatin1(data.valueOr("ERROR")), QString("@"));
+
+ // error: illegal character
+ encodedData = "1MZXW6YTBOI=====";
+ data = Base32::decode(encodedData);
+ QCOMPARE(QString::fromLatin1(data.valueOr("ERROR")), QString("ERROR"));
+
+ // error: missing pad character
+ encodedData = "MZXW6YTBOI=====";
+ data = Base32::decode(encodedData);
+ QCOMPARE(QString::fromLatin1(data.valueOr("ERROR")), QString("ERROR"));
+
+ // RFC 4648 test vectors
+ encodedData = "";
+ data = Base32::decode(encodedData);
+ QCOMPARE(QString::fromLatin1(data.valueOr("ERROR")), QString(""));
+
+ encodedData = "MY======";
+ data = Base32::decode(encodedData);
+ QCOMPARE(QString::fromLatin1(data.valueOr("ERROR")), QString("f"));
+
+ encodedData = "MZXQ====";
+ data = Base32::decode(encodedData);
+ QCOMPARE(QString::fromLatin1(data.valueOr("ERROR")), QString("fo"));
+
+ encodedData = "MZXW6===";
+ data = Base32::decode(encodedData);
+ QCOMPARE(QString::fromLatin1(data.valueOr("ERROR")), QString("foo"));
+
+ encodedData = "MZXW6YQ=";
+ data = Base32::decode(encodedData);
+ QCOMPARE(QString::fromLatin1(data.valueOr("ERROR")), QString("foob"));
+
+ encodedData = "MZXW6YTB";
+ data = Base32::decode(encodedData);
+ QCOMPARE(QString::fromLatin1(data.valueOr("ERROR")), QString("fooba"));
+
+ encodedData = "MZXW6YTBOI======";
+ data = Base32::decode(encodedData);
+ QCOMPARE(QString::fromLatin1(data.valueOr("ERROR")), QString("foobar"));
+}
+
+void TestBase32::testEncode()
+{
+ QByteArray data = "Hello world...";
+ QByteArray encodedData = Base32::encode(data);
+ QCOMPARE(encodedData, QByteArray("JBSWY3DPEB3W64TMMQXC4LQ="));
+
+ data = "12345678901234567890";
+ encodedData = Base32::encode(data);
+ QCOMPARE(encodedData, QByteArray("GEZDGNBVGY3TQOJQGEZDGNBVGY3TQOJQ"));
+
+ data = "012345678901234567890";
+ encodedData = Base32::encode(data);
+ QCOMPARE(encodedData, QByteArray("GAYTEMZUGU3DOOBZGAYTEMZUGU3DOOBZGA======"));
+
+ data = "test";
+ encodedData = Base32::encode(data);
+ QCOMPARE(encodedData, QByteArray("ORSXG5A="));
+
+ data = "___";
+ encodedData = Base32::encode(data);
+ QCOMPARE(encodedData, QByteArray("L5PV6==="));
+
+ data = "foo bar";
+ encodedData = Base32::encode(data);
+ QCOMPARE(encodedData, QByteArray("MZXW6IDCMFZA===="));
+
+ data = "@";
+ encodedData = Base32::encode(data);
+ QCOMPARE(encodedData, QByteArray("IA======"));
+
+ // RFC 4648 test vectors
+ data = "";
+ encodedData = Base32::encode(data);
+ QCOMPARE(encodedData, QByteArray(""));
+
+ data = "f";
+ encodedData = Base32::encode(data);
+ QCOMPARE(encodedData, QByteArray("MY======"));
+
+ data = "fo";
+ encodedData = Base32::encode(data);
+ QCOMPARE(encodedData, QByteArray("MZXQ===="));
+
+ data = "foo";
+ encodedData = Base32::encode(data);
+ QCOMPARE(encodedData, QByteArray("MZXW6==="));
+
+ data = "foob";
+ encodedData = Base32::encode(data);
+ QCOMPARE(encodedData, QByteArray("MZXW6YQ="));
+
+ data = "fooba";
+ encodedData = Base32::encode(data);
+ QCOMPARE(encodedData, QByteArray("MZXW6YTB"));
+
+ data = "foobar";
+ encodedData = Base32::encode(data);
+ 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));
+ QCOMPARE(QString::fromLatin1(data.valueOr("ERRROR")), QString("Hello world..."));
+
+ // sanitize input (typo + missing padding)
+ encodedData = "J8SWY3DPE83W64TMMQXC4LQA";
+ data = Base32::decode(Base32::sanitizeInput(encodedData));
+ QCOMPARE(QString::fromLatin1(data.valueOr("ERRROR")), QString("Hello world..."));
+
+ // sanitize input (other illegal characters)
+ encodedData = "J8SWY3D[PE83W64TMMQ]XC!4LQA";
+ data = Base32::decode(Base32::sanitizeInput(encodedData));
+ QCOMPARE(QString::fromLatin1(data.valueOr("ERRROR")), QString("Hello world..."));
+
+ // sanitize input (NUL character)
+ encodedData = "J8SWY3DPE83W64TMMQXC4LQA";
+ encodedData.insert(3, '\0');
+ data = Base32::decode(Base32::sanitizeInput(encodedData));
+ QCOMPARE(QString::fromLatin1(data.valueOr("ERRROR")), QString("Hello world..."));
+}