File indexing completed on 2024-04-28 03:58:47

0001 /*
0002     This file is part of the KDE libraries
0003     SPDX-FileCopyrightText: 2016 Michael Pyne <mpyne@kde.org>
0004 
0005     SPDX-License-Identifier: LGPL-2.0-only
0006 */
0007 
0008 #include "backend/blowfish.h"
0009 
0010 #include <QByteArray>
0011 #include <QObject>
0012 #include <QTest>
0013 
0014 #include <stdint.h>
0015 
0016 class TestBlowfish : public QObject
0017 {
0018     Q_OBJECT
0019 private Q_SLOTS:
0020     void testBlowfishCipher();
0021 };
0022 
0023 // Source for test vectors: https://www.schneier.com/code/vectors.txt
0024 static const char *const keys[] = {
0025     "0000000000000000", "FFFFFFFFFFFFFFFF", "3000000000000000", "1111111111111111", "0123456789ABCDEF", "1111111111111111", "0000000000000000",
0026     "FEDCBA9876543210", "7CA110454A1A6E57", "0131D9619DC1376E", "07A1133E4A0B2686", "3849674C2602319E", "04B915BA43FEB5B6", "0113B970FD34F2CE",
0027     "0170F175468FB5E6", "43297FAD38E373FE", "07A7137045DA2A16", "04689104C2FD3B2F", "37D06BB516CB7546", "1F08260D1AC2465E", "584023641ABA6176",
0028     "025816164629B007", "49793EBC79B3258F", "4FB05E1515AB73A7", "49E95D6D4CA229BF", "018310DC409B26D6", "1C587F1C13924FEF", "0101010101010101",
0029     "1F1F1F1F0E0E0E0E", "E0FEE0FEF1FEF1FE", "0000000000000000", "FFFFFFFFFFFFFFFF", "0123456789ABCDEF", "FEDCBA9876543210",
0030 };
0031 
0032 static const char *const cleartexts[] = {
0033     "0000000000000000", "FFFFFFFFFFFFFFFF", "1000000000000001", "1111111111111111", "1111111111111111", "0123456789ABCDEF", "0000000000000000",
0034     "0123456789ABCDEF", "01A1D6D039776742", "5CD54CA83DEF57DA", "0248D43806F67172", "51454B582DDF440A", "42FD443059577FA2", "059B5E0851CF143A",
0035     "0756D8E0774761D2", "762514B829BF486A", "3BDD119049372802", "26955F6835AF609A", "164D5E404F275232", "6B056E18759F5CCA", "004BD6EF09176062",
0036     "480D39006EE762F2", "437540C8698F3CFA", "072D43A077075292", "02FE55778117F12A", "1D9D5C5018F728C2", "305532286D6F295A", "0123456789ABCDEF",
0037     "0123456789ABCDEF", "0123456789ABCDEF", "FFFFFFFFFFFFFFFF", "0000000000000000", "0000000000000000", "FFFFFFFFFFFFFFFF",
0038 };
0039 
0040 static const char *const ciphertexts[] = {
0041     "4EF997456198DD78", "51866FD5B85ECB8A", "7D856F9A613063F2", "2466DD878B963C9D", "61F9C3802281B096", "7D0CC630AFDA1EC7", "4EF997456198DD78",
0042     "0ACEAB0FC6A0A28D", "59C68245EB05282B", "B1B8CC0B250F09A0", "1730E5778BEA1DA4", "A25E7856CF2651EB", "353882B109CE8F1A", "48F4D0884C379918",
0043     "432193B78951FC98", "13F04154D69D1AE5", "2EEDDA93FFD39C79", "D887E0393C2DA6E3", "5F99D04F5B163969", "4A057A3B24D3977B", "452031C1E4FADA8E",
0044     "7555AE39F59B87BD", "53C55F9CB49FC019", "7A8E7BFA937E89A3", "CF9C5D7A4986ADB5", "D1ABB290658BC778", "55CB3774D13EF201", "FA34EC4847B268B2",
0045     "A790795108EA3CAE", "C39E072D9FAC631D", "014933E0CDAFF6E4", "F21E9A77B71C49BC", "245946885754369A", "6B5C5A9C5D9E0A5A",
0046 };
0047 
0048 static QByteArray readBinaryData(const char *const src)
0049 {
0050     return QByteArray::fromHex(QByteArray(src));
0051 }
0052 
0053 #define ARRAY_SIZE(arr) (sizeof(arr) / sizeof(arr[0]))
0054 
0055 void TestBlowfish::testBlowfishCipher()
0056 {
0057     BlowFish bf;
0058     QByteArray result;
0059 
0060     result.reserve(qstrlen(ciphertexts[0]) / 2);
0061 
0062     for (std::size_t i = 0; i < ARRAY_SIZE(keys); i++) {
0063         QByteArray key = readBinaryData(keys[i]);
0064         QByteArray cleartext = readBinaryData(cleartexts[i]);
0065         QByteArray ciphertext = readBinaryData(ciphertexts[i]);
0066 
0067         bf.setKey(key.data(), 8 * key.size());
0068         QVERIFY(bf.readyToGo());
0069 
0070         // Verify encrypted cleartext == ciphertext
0071         QByteArray temp = cleartext;
0072         QCOMPARE(bf.encrypt(temp.data(), temp.size()), temp.size());
0073         QVERIFY(temp == ciphertext);
0074 
0075         bf.setKey(key.data(), 8 * key.size());
0076         QVERIFY(bf.readyToGo());
0077 
0078         // Verify decryption of ciphertext w/ same key yield cleartext
0079         temp = ciphertext;
0080         QCOMPARE(bf.decrypt(temp.data(), temp.size()), temp.size());
0081         QVERIFY(temp == cleartext);
0082     }
0083 }
0084 
0085 QTEST_APPLESS_MAIN(TestBlowfish)
0086 
0087 #include "blowfishtest.moc"