From 06f0b03f018fde16b67418311ef6577d188bd977 Mon Sep 17 00:00:00 2001 From: Ivailo Monev Date: Sun, 13 Mar 2022 23:58:48 +0200 Subject: [PATCH] QCryptographicHash test to verify incremental and static hashing produce the same result Signed-off-by: Ivailo Monev --- .../tst_qcryptographichash.cpp | 83 ++++++++++++++++--- 1 file changed, 71 insertions(+), 12 deletions(-) diff --git a/tests/auto/qcryptographichash/tst_qcryptographichash.cpp b/tests/auto/qcryptographichash/tst_qcryptographichash.cpp index 33b60aae9..54dcb2f47 100644 --- a/tests/auto/qcryptographichash/tst_qcryptographichash.cpp +++ b/tests/auto/qcryptographichash/tst_qcryptographichash.cpp @@ -23,6 +23,8 @@ #include #include +Q_DECLARE_METATYPE(QCryptographicHash::Algorithm) + class tst_QCryptographicHash : public QObject { Q_OBJECT @@ -31,6 +33,8 @@ private slots: void repeated_result(); void intermediary_result_data(); void intermediary_result(); + void static_vs_incremental_result_data(); + void static_vs_incremental_result(); }; void tst_QCryptographicHash::repeated_result_data() @@ -40,9 +44,9 @@ void tst_QCryptographicHash::repeated_result_data() void tst_QCryptographicHash::repeated_result() { - QFETCH(int, algo); - QCryptographicHash::Algorithm _algo = QCryptographicHash::Algorithm(algo); - QCryptographicHash hash(_algo); + QFETCH(QCryptographicHash::Algorithm, algo); + + QCryptographicHash hash(algo); QFETCH(QByteArray, first); hash.addData(first); @@ -61,31 +65,31 @@ void tst_QCryptographicHash::repeated_result() void tst_QCryptographicHash::intermediary_result_data() { - QTest::addColumn("algo"); + QTest::addColumn("algo"); QTest::addColumn("first"); QTest::addColumn("second"); QTest::addColumn("hash_first"); QTest::addColumn("hash_firstsecond"); - QTest::newRow("md5") << int(QCryptographicHash::Md5) + QTest::newRow("md5") << QCryptographicHash::Md5 << QByteArray("abc") << QByteArray("abc") << QByteArray::fromHex("900150983CD24FB0D6963F7D28E17F72") << QByteArray::fromHex("440AC85892CA43AD26D44C7AD9D47D3E"); - QTest::newRow("sha1") << int(QCryptographicHash::Sha1) + QTest::newRow("sha1") << QCryptographicHash::Sha1 << QByteArray("abc") << QByteArray("abc") << QByteArray::fromHex("A9993E364706816ABA3E25717850C26C9CD0D89D") << QByteArray::fromHex("F8C1D87006FBF7E5CC4B026C3138BC046883DC71"); - QTest::newRow("sha256") << int(QCryptographicHash::Sha256) + QTest::newRow("sha256") << QCryptographicHash::Sha256 << QByteArray("abc") << QByteArray("abc") << QByteArray::fromHex("BA7816BF8F01CFEA414140DE5DAE2223B00361A396177A9CB410FF61F20015AD") << QByteArray::fromHex("BBB59DA3AF939F7AF5F360F2CEB80A496E3BAE1CD87DDE426DB0AE40677E1C2C"); - QTest::newRow("sha512") << int(QCryptographicHash::Sha512) + QTest::newRow("sha512") << QCryptographicHash::Sha512 << QByteArray("abc") << QByteArray("abc") << QByteArray::fromHex("DDAF35A193617ABACC417349AE20413112E6FA4E89A97EA20A9EEEE64B55D39A2192992A274FC1A836BA3C23A3FEEBBD454D4423643CE80E2A9AC94FA54CA49F") << QByteArray::fromHex("F3C41E7B63EE869596FC28BAD64120612C520F65928AB4D126C72C6998B551B8FF1CEDDFED4373E6717554DC89D1EEE6F0AB22FD3675E561ABA9AE26A3EEC53B"); - QTest::newRow("KAT") << int(QCryptographicHash::KAT) + QTest::newRow("KAT") << QCryptographicHash::KAT << QByteArray("abc") << QByteArray("abc") << QByteArray::fromHex("06b05ab6733a618578af5f94892f3950a96faf705af16834e6c632b61e964e1f") << QByteArray::fromHex("3b3faa148c5f05f1b441a07dd428557bb9fe94d346d39b20369242a646a19333"); @@ -93,9 +97,9 @@ void tst_QCryptographicHash::intermediary_result_data() void tst_QCryptographicHash::intermediary_result() { - QFETCH(int, algo); - QCryptographicHash::Algorithm _algo = QCryptographicHash::Algorithm(algo); - QCryptographicHash hash(_algo); + QFETCH(QCryptographicHash::Algorithm, algo); + + QCryptographicHash hash(algo); QFETCH(QByteArray, first); hash.addData(first); @@ -117,6 +121,61 @@ void tst_QCryptographicHash::intermediary_result() hash.reset(); } +void tst_QCryptographicHash::static_vs_incremental_result_data() +{ + QTest::addColumn("algo"); + QTest::addColumn("first"); + QTest::addColumn("second"); + QTest::addColumn("third"); + + QTest::newRow("123 (Md5)") << QCryptographicHash::Md5 << QByteArray("1") << QByteArray("2") << QByteArray("3"); + QTest::newRow("1bar3 (Md5)") << QCryptographicHash::Md5 << QByteArray("1") << QByteArray("bar") << QByteArray("3"); + QTest::newRow("12baz (Md5)") << QCryptographicHash::Md5 << QByteArray("1") << QByteArray("2") << QByteArray("baz"); + QTest::newRow("foobarbaz (Md5)") << QCryptographicHash::Md5 << QByteArray("foo") << QByteArray("bar") << QByteArray("baz"); + + QTest::newRow("123 (Sha1)") << QCryptographicHash::Sha1 << QByteArray("1") << QByteArray("2") << QByteArray("3"); + QTest::newRow("1bar3 (Sha1)") << QCryptographicHash::Sha1 << QByteArray("1") << QByteArray("bar") << QByteArray("3"); + QTest::newRow("12baz (Sha1)") << QCryptographicHash::Sha1 << QByteArray("1") << QByteArray("2") << QByteArray("baz"); + QTest::newRow("foobarbaz (Sha1)") << QCryptographicHash::Sha1 << QByteArray("foo") << QByteArray("bar") << QByteArray("baz"); + + QTest::newRow("123 (Sha256)") << QCryptographicHash::Sha256 << QByteArray("1") << QByteArray("2") << QByteArray("3"); + QTest::newRow("1bar3 (Sha256)") << QCryptographicHash::Sha256 << QByteArray("1") << QByteArray("bar") << QByteArray("3"); + QTest::newRow("12baz (Sha256)") << QCryptographicHash::Sha256 << QByteArray("1") << QByteArray("2") << QByteArray("baz"); + QTest::newRow("foobarbaz (Sha256)") << QCryptographicHash::Sha256 << QByteArray("foo") << QByteArray("bar") << QByteArray("baz"); + + QTest::newRow("123 (Sha512)") << QCryptographicHash::Sha512 << QByteArray("1") << QByteArray("2") << QByteArray("3"); + QTest::newRow("1bar3 (Sha512)") << QCryptographicHash::Sha512 << QByteArray("1") << QByteArray("bar") << QByteArray("3"); + QTest::newRow("12baz (Sha512)") << QCryptographicHash::Sha512 << QByteArray("1") << QByteArray("2") << QByteArray("baz"); + QTest::newRow("foobarbaz (Sha512)") << QCryptographicHash::Sha512 << QByteArray("foo") << QByteArray("bar") << QByteArray("baz"); + + QTest::newRow("123 (KAT)") << QCryptographicHash::KAT << QByteArray("1") << QByteArray("2") << QByteArray("3"); + QTest::newRow("1bar3 (KAT)") << QCryptographicHash::KAT << QByteArray("1") << QByteArray("bar") << QByteArray("3"); + QTest::newRow("12baz (KAT)") << QCryptographicHash::KAT << QByteArray("1") << QByteArray("2") << QByteArray("baz"); + QTest::newRow("foobarbaz (KAT)") << QCryptographicHash::KAT << QByteArray("foo") << QByteArray("bar") << QByteArray("baz"); +} + +void tst_QCryptographicHash::static_vs_incremental_result() +{ + QFETCH(QCryptographicHash::Algorithm, algo); + QFETCH(QByteArray, first); + QFETCH(QByteArray, second); + QFETCH(QByteArray, third); + + QCryptographicHash incrementalhash(algo); + incrementalhash.addData(first); + incrementalhash.addData(second); + incrementalhash.addData(third); + const QByteArray incrementalresult = incrementalhash.result(); + + const QByteArray staticresult = QCryptographicHash::hash(first + second + third, algo); + + // qDebug() << incrementalresult.toHex() << staticresult.toHex(); + if (algo == QCryptographicHash::KAT) { + QEXPECT_FAIL("", "This is expected behaviour currently", Continue); + } + QCOMPARE(incrementalresult, staticresult); +} + QTEST_MAIN(tst_QCryptographicHash) #include "moc_tst_qcryptographichash.cpp"