From d508c2dd6887bc1e59ecb7c18e41d60d9ec221d1 Mon Sep 17 00:00:00 2001 From: Felix Geyer Date: Mon, 13 Sep 2010 23:25:48 +0200 Subject: [PATCH] Open a kdbx file in main() and add more SymmetricCipher tests. --- src/main.cpp | 18 ++++++++++-- tests/NewDatabase.kdbx | Bin 0 -> 8350 bytes tests/TestSymmetricCipher.cpp | 52 +++++++++++++++++++++++++++++++--- 3 files changed, 64 insertions(+), 6 deletions(-) create mode 100644 tests/NewDatabase.kdbx diff --git a/src/main.cpp b/src/main.cpp index 6bd3a7739..9a8d161f5 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -19,8 +19,12 @@ #include #include "core/Database.h" +#include "crypto/Crypto.h" +#include "format/KeePass2Reader.h" #include "format/KeePass2XmlReader.h" #include "gui/DatabaseWidget.h" +#include "keys/CompositeKey.h" +#include "keys/PasswordKey.h" #include "../tests/config-keepassx-tests.h" @@ -28,8 +32,18 @@ int main(int argc, char **argv) { QApplication app(argc, argv); - KeePass2XmlReader* reader = new KeePass2XmlReader(); - Database* db = reader->readDatabase(QString(KEEPASSX_TEST_DIR).append("/NewDatabase.xml")); + Crypto::init(); + + CompositeKey key; + PasswordKey password; + password.setPassword("a"); + key.addKey(password); + + KeePass2Reader* xreader = new KeePass2Reader(); + Database* db = xreader->readDatabase(QString(KEEPASSX_TEST_DIR).append("/NewDatabase.kdbx"), key); + + //KeePass2XmlReader* reader = new KeePass2XmlReader(); + //Database* db = reader->readDatabase(QString(KEEPASSX_TEST_DIR).append("/NewDatabase.xml")); DatabaseWidget dbWidget(db); dbWidget.show(); diff --git a/tests/NewDatabase.kdbx b/tests/NewDatabase.kdbx new file mode 100644 index 0000000000000000000000000000000000000000..4e77724c7e8cfdf22bcd951ccfcaa4ae7f49d460 GIT binary patch literal 8350 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 H_$CGbEb8x@ literal 0 HcmV?d00001 diff --git a/tests/TestSymmetricCipher.cpp b/tests/TestSymmetricCipher.cpp index ed45c9dbb..17feef1ba 100644 --- a/tests/TestSymmetricCipher.cpp +++ b/tests/TestSymmetricCipher.cpp @@ -15,10 +15,12 @@ * along with this program. If not, see . */ +#include #include #include "crypto/Crypto.h" #include "crypto/SymmetricCipher.h" +#include "streams/SymmetricCipherStream.h" class TestSymmetricCipher : public QObject { @@ -27,6 +29,7 @@ class TestSymmetricCipher : public QObject private Q_SLOTS: void initTestCase(); void testAes256CbcEncryption(); + void testAes256CbcDecryption(); }; void TestSymmetricCipher::initTestCase() @@ -40,11 +43,52 @@ void TestSymmetricCipher::testAes256CbcEncryption() QByteArray key = QByteArray::fromHex("603deb1015ca71be2b73aef0857d77811f352c073b6108d72d9810a30914dff4"); QByteArray iv = QByteArray::fromHex("000102030405060708090a0b0c0d0e0f"); - QByteArray plain = QByteArray::fromHex("6bc1bee22e409f96e93d7e117393172a"); + QByteArray plainText = QByteArray::fromHex("6bc1bee22e409f96e93d7e117393172a"); + plainText.append(QByteArray::fromHex("ae2d8a571e03ac9c9eb76fac45af8e51")); + QByteArray cipherText = QByteArray::fromHex("f58c4c04d6e5f1ba779eabfb5f7bfbd6"); + cipherText.append(QByteArray::fromHex("9cfc4e967edb808d679f777bc6702c7d")); - SymmetricCipher encrypt(SymmetricCipher::Aes256, SymmetricCipher::Cbc, SymmetricCipher::Encrypt, key, iv); - QCOMPARE(QString(encrypt.process(plain).toHex()), - QString("f58c4c04d6e5f1ba779eabfb5f7bfbd6")); + SymmetricCipher cipher(SymmetricCipher::Aes256, SymmetricCipher::Cbc, SymmetricCipher::Encrypt, key, iv); + QCOMPARE(cipher.blockSize(), 16); + + QCOMPARE(QString(cipher.process(plainText).toHex()), + QString(cipherText.toHex())); +} + +void TestSymmetricCipher::testAes256CbcDecryption() +{ + QByteArray key = QByteArray::fromHex("603deb1015ca71be2b73aef0857d77811f352c073b6108d72d9810a30914dff4"); + QByteArray iv = QByteArray::fromHex("000102030405060708090a0b0c0d0e0f"); + QByteArray cipherText = QByteArray::fromHex("f58c4c04d6e5f1ba779eabfb5f7bfbd6"); + cipherText.append(QByteArray::fromHex("9cfc4e967edb808d679f777bc6702c7d")); + QByteArray plainText = QByteArray::fromHex("6bc1bee22e409f96e93d7e117393172a"); + plainText.append(QByteArray::fromHex("ae2d8a571e03ac9c9eb76fac45af8e51")); + + SymmetricCipher cipher(SymmetricCipher::Aes256, SymmetricCipher::Cbc, SymmetricCipher::Decrypt, key, iv); + QCOMPARE(cipher.blockSize(), 16); + + QCOMPARE(QString(cipher.process(cipherText).toHex()), + QString(plainText.toHex())); + + QBuffer buffer(&cipherText); + SymmetricCipherStream stream(&buffer, SymmetricCipher::Aes256, SymmetricCipher::Cbc, SymmetricCipher::Decrypt, key, iv); + buffer.open(QIODevice::ReadOnly); + stream.open(QIODevice::ReadOnly); + + QCOMPARE(QString(stream.read(10).toHex()), + QString(plainText.left(10).toHex())); + buffer.reset(); + stream.reset(); + QCOMPARE(QString(stream.read(20).toHex()), + QString(plainText.left(20).toHex())); + buffer.reset(); + stream.reset(); + QCOMPARE(QString(stream.read(16).toHex()), + QString(plainText.left(16).toHex())); + buffer.reset(); + stream.reset(); + QCOMPARE(QString(stream.read(100).toHex()), + QString(plainText.toHex())); } QTEST_MAIN(TestSymmetricCipher);